@zmdb/svelte 1.0.0-beta.1

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/README.md ADDED
@@ -0,0 +1,82 @@
1
+ # @zmdb/svelte
2
+
3
+ `@zmdb/svelte` binds an application-generated zmdb client to Svelte's typed component context and projects query and mutation state through native stores. Queries start on their first subscription,
4
+ abort after the final unsubscribe, restart on a later subscription, and suppress completions from superseded inputs.
5
+
6
+ ## Install
7
+
8
+ ```bash
9
+ yarn add @zmdb/svelte@1.0.0-beta.1 svelte@^5.57.0
10
+ ```
11
+
12
+ > **Prerelease** (`1.0.0-beta.1`). Requires **Node.js 26+**, Svelte 5, and ESM. Svelte is a required peer and is never bundled into the adapter.
13
+
14
+ ## Typed context
15
+
16
+ Create one binding namespace for the generated client type:
17
+
18
+ ```ts
19
+ // src/lib/zmdb.ts
20
+ import { createZmdbSvelte } from '@zmdb/svelte';
21
+
22
+ import type { ApiClient } from './generated/api.js';
23
+
24
+ export const zmdb = createZmdbSvelte<ApiClient>();
25
+ ```
26
+
27
+ Set the request- or tree-local client during provider component initialisation:
28
+
29
+ ```svelte
30
+ <script lang="ts">
31
+ import { zmdb } from '$lib/zmdb.js';
32
+ import type { ApiClient } from '$lib/generated/api.js';
33
+
34
+ let { client, children }: { client: ApiClient; children: import('svelte').Snippet } = $props();
35
+ zmdb.setClient(client);
36
+ </script>
37
+
38
+ {@render children()}
39
+ ```
40
+
41
+ Descendants retain every generated operation without a cast:
42
+
43
+ ```svelte
44
+ <script lang="ts">
45
+ import { writable } from 'svelte/store';
46
+
47
+ import { zmdb } from '$lib/zmdb.js';
48
+
49
+ let { id }: { id: string } = $props();
50
+ const input = writable({ id });
51
+ const widget = zmdb.query(input, (client, value, signal) => client.getWidget(value, { signal }));
52
+ const rename = zmdb.mutation((client, value: { id: string; name: string }, signal) =>
53
+ client.renameWidget(value, { signal }),
54
+ );
55
+ </script>
56
+
57
+ {#if $widget.loading}
58
+ <p>Loading…</p>
59
+ {:else if $widget.error}
60
+ <p>Could not load the widget.</p>
61
+ {:else if $widget.data}
62
+ <h1>{$widget.data.name}</h1>
63
+ {/if}
64
+
65
+ <button onclick={() => rename.mutate({ id, name: 'Renamed' })} disabled={$rename.pending}>Rename</button>
66
+ ```
67
+
68
+ An input store change clears data for the old identity, aborts that request, and starts the new one while subscribed. A generated-client error is placed in store state by identity; it is not wrapped
69
+ or translated.
70
+
71
+ ## Direct store ownership
72
+
73
+ `createQueryStore(client, input, load)` and `createMutationStore(client, run)` expose the same stores without component context. Query stores remain lazy. The last subscriber cancels active work; call
74
+ `destroy()` as well when a non-component owner has a shorter lifetime than its subscriptions.
75
+
76
+ ## Documentation
77
+
78
+ Full project documentation is at **https://ambasta.github.io/zmdb/**.
79
+
80
+ ## License
81
+
82
+ GNU General Public License v3.0 or later (GPL-3.0-or-later) — see [LICENSE](./LICENSE).
@@ -0,0 +1,3 @@
1
+ import type { ZmdbSvelteBindings } from './types.js';
2
+ export declare function createZmdbSvelte<Client>(): ZmdbSvelteBindings<Client>;
3
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAKV,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAEpB,wBAAgB,gBAAgB,CAAC,MAAM,KAAK,kBAAkB,CAAC,MAAM,CAAC,CAqBrE"}
@@ -0,0 +1,22 @@
1
+ import { createContext, onDestroy } from 'svelte';
2
+ import { createMutationStore } from './mutation.js';
3
+ import { createQueryStore } from './query.js';
4
+ export function createZmdbSvelte() {
5
+ const [getClient, setClient, hasClient] = createContext();
6
+ return Object.freeze({
7
+ getClient,
8
+ setClient,
9
+ hasClient,
10
+ query(input, load) {
11
+ const store = createQueryStore(getClient(), input, load);
12
+ onDestroy(store.destroy);
13
+ return store;
14
+ },
15
+ mutation(run) {
16
+ const store = createMutationStore(getClient(), run);
17
+ onDestroy(store.destroy);
18
+ return store;
19
+ },
20
+ });
21
+ }
22
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAGlD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAS9C,MAAM,UAAU,gBAAgB;IAC9B,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,GAAG,aAAa,EAAU,CAAC;IAElE,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,SAAS;QACT,SAAS;QACT,SAAS;QACT,KAAK,CACH,KAA8B,EAC9B,IAAwC;YAExC,MAAM,KAAK,GAAG,gBAAgB,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YACzD,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACzB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,QAAQ,CAAgB,GAA0C;YAChE,MAAM,KAAK,GAAG,mBAAmB,CAAC,SAAS,EAAE,EAAE,GAAG,CAAC,CAAC;YACpD,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACzB,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { ClientError } from '@zmdb/client';
2
+ export declare class SvelteAdapterError extends ClientError {
3
+ constructor(message: string);
4
+ }
5
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,qBAAa,kBAAmB,SAAQ,WAAW;IACjD,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF"}
package/dist/errors.js ADDED
@@ -0,0 +1,8 @@
1
+ import { ClientError } from '@zmdb/client';
2
+ export class SvelteAdapterError extends ClientError {
3
+ constructor(message) {
4
+ super(message);
5
+ this.name = 'SvelteAdapterError';
6
+ }
7
+ }
8
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,OAAO,kBAAmB,SAAQ,WAAW;IACjD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ export { createZmdbSvelte } from './context.js';
2
+ export { SvelteAdapterError } from './errors.js';
3
+ export { createMutationStore } from './mutation.js';
4
+ export { createQueryStore } from './query.js';
5
+ export type { MutationRunner, MutationSnapshot, QueryLoader, QuerySnapshot, SvelteMutationStore, SvelteQueryStore, ZmdbSvelteBindings, } from './types.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export { createZmdbSvelte } from './context.js';
2
+ export { SvelteAdapterError } from './errors.js';
3
+ export { createMutationStore } from './mutation.js';
4
+ export { createQueryStore } from './query.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function lifecycleAbort(message: string): Error;
2
+ export declare function isAbort(error: unknown, signal: AbortSignal): boolean;
3
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAAA,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAIrD;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAEpE"}
@@ -0,0 +1,9 @@
1
+ export function lifecycleAbort(message) {
2
+ const reason = new Error(message);
3
+ reason.name = 'AbortError';
4
+ return reason;
5
+ }
6
+ export function isAbort(error, signal) {
7
+ return signal.aborted && Object.is(error, signal.reason);
8
+ }
9
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAc,EAAE,MAAmB;IACzD,OAAO,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { MutationRunner, SvelteMutationStore } from './types.js';
2
+ export declare function createMutationStore<Client, Input, Output>(client: Client, run: MutationRunner<Client, Input, Output>): SvelteMutationStore<Input, Output>;
3
+ //# sourceMappingURL=mutation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation.d.ts","sourceRoot":"","sources":["../src/mutation.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAoB,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAOxF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EACvD,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,GACzC,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,CA6EpC"}
@@ -0,0 +1,81 @@
1
+ import { writable } from 'svelte/store';
2
+ import { SvelteAdapterError } from './errors.js';
3
+ import { isAbort, lifecycleAbort } from './lifecycle.js';
4
+ export function createMutationStore(client, run) {
5
+ let snapshot = Object.freeze({ error: undefined, pending: false });
6
+ const state = writable(snapshot);
7
+ const requests = new Map();
8
+ let subscribers = 0;
9
+ let destroyed = false;
10
+ let epoch = 0;
11
+ let sequence = 0;
12
+ let latestSequence = 0;
13
+ const publish = (next) => {
14
+ snapshot = Object.freeze(next);
15
+ state.set(snapshot);
16
+ };
17
+ const pendingInCurrentEpoch = () => [...requests.values()].some(request => request.epoch === epoch);
18
+ const cancelActive = (reason) => {
19
+ epoch += 1;
20
+ const abortReason = lifecycleAbort(reason);
21
+ for (const request of requests.values()) {
22
+ if (!request.controller.signal.aborted)
23
+ request.controller.abort(abortReason);
24
+ }
25
+ if (snapshot.pending)
26
+ publish({ error: snapshot.error, pending: false });
27
+ };
28
+ const store = {
29
+ subscribe(runSubscriber, invalidate) {
30
+ subscribers += 1;
31
+ const unsubscribe = state.subscribe(runSubscriber, invalidate);
32
+ let subscribed = true;
33
+ return () => {
34
+ if (!subscribed)
35
+ return;
36
+ subscribed = false;
37
+ unsubscribe();
38
+ subscribers -= 1;
39
+ if (subscribers === 0 && requests.size > 0) {
40
+ cancelActive('@zmdb/svelte mutation cancelled after its final subscriber left');
41
+ }
42
+ };
43
+ },
44
+ async mutate(input) {
45
+ if (destroyed)
46
+ throw new SvelteAdapterError('@zmdb/svelte mutation store is destroyed');
47
+ const selectedEpoch = epoch;
48
+ const selectedSequence = ++sequence;
49
+ latestSequence = selectedSequence;
50
+ const controller = new AbortController();
51
+ requests.set(selectedSequence, { controller, epoch: selectedEpoch });
52
+ publish({ error: undefined, pending: true });
53
+ try {
54
+ return await run(client, input, controller.signal);
55
+ }
56
+ catch (error) {
57
+ if (!destroyed &&
58
+ selectedEpoch === epoch &&
59
+ selectedSequence === latestSequence &&
60
+ !isAbort(error, controller.signal)) {
61
+ publish({ error, pending: pendingInCurrentEpoch() });
62
+ }
63
+ throw error;
64
+ }
65
+ finally {
66
+ requests.delete(selectedSequence);
67
+ if (!destroyed && selectedEpoch === epoch) {
68
+ publish({ error: snapshot.error, pending: pendingInCurrentEpoch() });
69
+ }
70
+ }
71
+ },
72
+ destroy() {
73
+ if (destroyed)
74
+ return;
75
+ destroyed = true;
76
+ cancelActive('@zmdb/svelte mutation cancelled because its owner was destroyed');
77
+ },
78
+ };
79
+ return Object.freeze(store);
80
+ }
81
+ //# sourceMappingURL=mutation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation.js","sourceRoot":"","sources":["../src/mutation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Readable } from 'svelte/store';
2
+ import type { QueryLoader, SvelteQueryStore } from './types.js';
3
+ export declare function createQueryStore<Client, Input, Output>(client: Client, input: Input | Readable<Input>, load: QueryLoader<Client, Input, Output>): SvelteQueryStore<Output>;
4
+ //# sourceMappingURL=query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAgB,MAAM,cAAc,CAAC;AAI3D,OAAO,KAAK,EAAE,WAAW,EAAiB,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAgB/E,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EACpD,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,EAC9B,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,GACvC,gBAAgB,CAAC,MAAM,CAAC,CA+H1B"}
package/dist/query.js ADDED
@@ -0,0 +1,134 @@
1
+ import { writable } from 'svelte/store';
2
+ import { SvelteAdapterError } from './errors.js';
3
+ import { isAbort, lifecycleAbort } from './lifecycle.js';
4
+ function property(value, name) {
5
+ return (typeof value === 'object' && value !== null) || typeof value === 'function'
6
+ ? Reflect.get(value, name)
7
+ : undefined;
8
+ }
9
+ function isReadable(value) {
10
+ return typeof property(value, 'subscribe') === 'function';
11
+ }
12
+ export function createQueryStore(client, input, load) {
13
+ let snapshot = Object.freeze({
14
+ data: undefined,
15
+ error: undefined,
16
+ loading: false,
17
+ });
18
+ const state = writable(snapshot);
19
+ let subscribers = 0;
20
+ let active = false;
21
+ let destroyed = false;
22
+ let generation = 0;
23
+ let request;
24
+ let inputUnsubscribe;
25
+ let currentInput;
26
+ const publish = (next) => {
27
+ snapshot = Object.freeze(next);
28
+ state.set(snapshot);
29
+ };
30
+ const abortSelected = (reason) => {
31
+ const selected = request;
32
+ request = undefined;
33
+ if (selected !== undefined && !selected.controller.signal.aborted)
34
+ selected.controller.abort(reason);
35
+ };
36
+ const launch = async (selectedInput, clearData, reason) => {
37
+ if (destroyed)
38
+ throw new SvelteAdapterError('@zmdb/svelte query store is destroyed');
39
+ if (!active)
40
+ throw new SvelteAdapterError('@zmdb/svelte query store is inactive; subscribe before refreshing');
41
+ abortSelected(lifecycleAbort(reason));
42
+ const selectedGeneration = ++generation;
43
+ const controller = new AbortController();
44
+ request = { controller };
45
+ publish({
46
+ data: clearData ? undefined : snapshot.data,
47
+ error: undefined,
48
+ loading: true,
49
+ });
50
+ try {
51
+ const data = await load(client, selectedInput, controller.signal);
52
+ if (!active || destroyed || selectedGeneration !== generation)
53
+ return;
54
+ request = undefined;
55
+ publish({ data, error: undefined, loading: false });
56
+ }
57
+ catch (error) {
58
+ if (active && !destroyed && selectedGeneration === generation) {
59
+ request = undefined;
60
+ if (!isAbort(error, controller.signal)) {
61
+ publish({ data: snapshot.data, error, loading: false });
62
+ }
63
+ }
64
+ throw error;
65
+ }
66
+ };
67
+ const startForInput = (selectedInput) => {
68
+ const changed = currentInput !== undefined && !Object.is(currentInput.value, selectedInput);
69
+ currentInput = { value: selectedInput };
70
+ void launch(selectedInput, changed, changed
71
+ ? '@zmdb/svelte query superseded by an input-store change'
72
+ : '@zmdb/svelte query restarted for a new subscription').catch(() => undefined);
73
+ };
74
+ const activate = () => {
75
+ if (active || destroyed)
76
+ return;
77
+ active = true;
78
+ if (isReadable(input)) {
79
+ inputUnsubscribe = input.subscribe(startForInput);
80
+ }
81
+ else {
82
+ startForInput(input);
83
+ }
84
+ };
85
+ const deactivate = (reason) => {
86
+ if (!active)
87
+ return;
88
+ active = false;
89
+ generation += 1;
90
+ inputUnsubscribe?.();
91
+ inputUnsubscribe = undefined;
92
+ abortSelected(lifecycleAbort(reason));
93
+ if (snapshot.loading)
94
+ publish({ data: snapshot.data, error: snapshot.error, loading: false });
95
+ };
96
+ const store = {
97
+ subscribe(run, invalidate) {
98
+ if (subscribers === 0)
99
+ activate();
100
+ subscribers += 1;
101
+ const unsubscribe = state.subscribe(run, invalidate);
102
+ let subscribed = true;
103
+ return () => {
104
+ if (!subscribed)
105
+ return;
106
+ subscribed = false;
107
+ unsubscribe();
108
+ subscribers -= 1;
109
+ if (subscribers === 0) {
110
+ deactivate('@zmdb/svelte query cancelled after its final subscriber left');
111
+ }
112
+ };
113
+ },
114
+ refresh() {
115
+ if (!active) {
116
+ return Promise.reject(new SvelteAdapterError(destroyed
117
+ ? '@zmdb/svelte query store is destroyed'
118
+ : '@zmdb/svelte query store is inactive; subscribe before refreshing'));
119
+ }
120
+ if (currentInput === undefined) {
121
+ return Promise.reject(new SvelteAdapterError('@zmdb/svelte query store has no current input'));
122
+ }
123
+ return launch(currentInput.value, false, '@zmdb/svelte query superseded by refresh');
124
+ },
125
+ destroy() {
126
+ if (destroyed)
127
+ return;
128
+ destroyed = true;
129
+ deactivate('@zmdb/svelte query cancelled because its owner was destroyed');
130
+ },
131
+ };
132
+ return Object.freeze(store);
133
+ }
134
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { Readable } from 'svelte/store';
2
+ export type QueryLoader<Client, Input, Output> = (client: Client, input: Input, signal: AbortSignal) => PromiseLike<Output>;
3
+ export type MutationRunner<Client, Input, Output> = (client: Client, input: Input, signal: AbortSignal) => PromiseLike<Output>;
4
+ export interface QuerySnapshot<Output> {
5
+ readonly data: Output | undefined;
6
+ readonly error: unknown;
7
+ readonly loading: boolean;
8
+ }
9
+ export interface MutationSnapshot {
10
+ readonly error: unknown;
11
+ readonly pending: boolean;
12
+ }
13
+ export interface SvelteQueryStore<Output> extends Readable<QuerySnapshot<Output>> {
14
+ refresh(): Promise<void>;
15
+ destroy(): void;
16
+ }
17
+ export interface SvelteMutationStore<Input, Output> extends Readable<MutationSnapshot> {
18
+ mutate(input: Input): Promise<Output>;
19
+ destroy(): void;
20
+ }
21
+ export interface ZmdbSvelteBindings<Client> {
22
+ getClient(): Client;
23
+ setClient(client: Client): Client;
24
+ hasClient(): boolean;
25
+ query<Input, Output>(input: Input | Readable<Input>, load: QueryLoader<Client, Input, Output>): SvelteQueryStore<Output>;
26
+ mutation<Input, Output>(run: MutationRunner<Client, Input, Output>): SvelteMutationStore<Input, Output>;
27
+ }
28
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,MAAM,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,IAAI,CAC/C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,WAAW,KAChB,WAAW,CAAC,MAAM,CAAC,CAAC;AAEzB,MAAM,MAAM,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,IAAI,CAClD,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,WAAW,KAChB,WAAW,CAAC,MAAM,CAAC,CAAC;AAEzB,MAAM,WAAW,aAAa,CAAC,MAAM;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB,CAAC,MAAM,CAAE,SAAQ,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC/E,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAE,SAAQ,QAAQ,CAAC,gBAAgB,CAAC;IACpF,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB,CAAC,MAAM;IACxC,SAAS,IAAI,MAAM,CAAC;IACpB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IAClC,SAAS,IAAI,OAAO,CAAC;IACrB,KAAK,CAAC,KAAK,EAAE,MAAM,EACjB,KAAK,EAAE,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,EAC9B,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,GACvC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;CACzG"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@zmdb/svelte",
3
+ "version": "1.0.0-beta.1",
4
+ "description": "Typed Svelte context, lazy query stores, mutation stores, and lifecycle cancellation for generated zmdb clients.",
5
+ "keywords": [
6
+ "client",
7
+ "stores",
8
+ "svelte",
9
+ "typescript",
10
+ "zmdb"
11
+ ],
12
+ "homepage": "https://github.com/ambasta/zmdb#readme",
13
+ "bugs": {
14
+ "url": "https://github.com/ambasta/zmdb/issues"
15
+ },
16
+ "license": "GPL-3.0-or-later",
17
+ "author": "zmdb contributors",
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git+https://github.com/ambasta/zmdb.git",
21
+ "directory": "packages/svelte"
22
+ },
23
+ "type": "module",
24
+ "sideEffects": false,
25
+ "exports": {
26
+ ".": {
27
+ "types": "./dist/index.d.ts",
28
+ "import": "./dist/index.js"
29
+ }
30
+ },
31
+ "publishConfig": {
32
+ "access": "public",
33
+ "tag": "beta"
34
+ },
35
+ "scripts": {
36
+ "build": "node ../../scripts/build-package.mjs",
37
+ "test": "vitest run"
38
+ },
39
+ "dependencies": {
40
+ "@zmdb/client": "1.0.0-beta.1"
41
+ },
42
+ "peerDependencies": {
43
+ "svelte": ">=5.57.0 <6.0.0"
44
+ },
45
+ "engines": {
46
+ "node": ">=26"
47
+ },
48
+ "main": "./dist/index.js",
49
+ "types": "./dist/index.d.ts"
50
+ }
package/src/context.ts ADDED
@@ -0,0 +1,35 @@
1
+ import { createContext, onDestroy } from 'svelte';
2
+ import type { Readable } from 'svelte/store';
3
+
4
+ import { createMutationStore } from './mutation.js';
5
+ import { createQueryStore } from './query.js';
6
+ import type {
7
+ MutationRunner,
8
+ QueryLoader,
9
+ SvelteMutationStore,
10
+ SvelteQueryStore,
11
+ ZmdbSvelteBindings,
12
+ } from './types.js';
13
+
14
+ export function createZmdbSvelte<Client>(): ZmdbSvelteBindings<Client> {
15
+ const [getClient, setClient, hasClient] = createContext<Client>();
16
+
17
+ return Object.freeze({
18
+ getClient,
19
+ setClient,
20
+ hasClient,
21
+ query<Input, Output>(
22
+ input: Input | Readable<Input>,
23
+ load: QueryLoader<Client, Input, Output>,
24
+ ): SvelteQueryStore<Output> {
25
+ const store = createQueryStore(getClient(), input, load);
26
+ onDestroy(store.destroy);
27
+ return store;
28
+ },
29
+ mutation<Input, Output>(run: MutationRunner<Client, Input, Output>): SvelteMutationStore<Input, Output> {
30
+ const store = createMutationStore(getClient(), run);
31
+ onDestroy(store.destroy);
32
+ return store;
33
+ },
34
+ });
35
+ }
package/src/errors.ts ADDED
@@ -0,0 +1,8 @@
1
+ import { ClientError } from '@zmdb/client';
2
+
3
+ export class SvelteAdapterError extends ClientError {
4
+ constructor(message: string) {
5
+ super(message);
6
+ this.name = 'SvelteAdapterError';
7
+ }
8
+ }
package/src/index.ts ADDED
@@ -0,0 +1,13 @@
1
+ export { createZmdbSvelte } from './context.js';
2
+ export { SvelteAdapterError } from './errors.js';
3
+ export { createMutationStore } from './mutation.js';
4
+ export { createQueryStore } from './query.js';
5
+ export type {
6
+ MutationRunner,
7
+ MutationSnapshot,
8
+ QueryLoader,
9
+ QuerySnapshot,
10
+ SvelteMutationStore,
11
+ SvelteQueryStore,
12
+ ZmdbSvelteBindings,
13
+ } from './types.js';
@@ -0,0 +1,9 @@
1
+ export function lifecycleAbort(message: string): Error {
2
+ const reason = new Error(message);
3
+ reason.name = 'AbortError';
4
+ return reason;
5
+ }
6
+
7
+ export function isAbort(error: unknown, signal: AbortSignal): boolean {
8
+ return signal.aborted && Object.is(error, signal.reason);
9
+ }