@dumbql/vue 0.0.2-rc.3 → 0.0.3

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 CHANGED
@@ -1,21 +1,22 @@
1
1
  <p align="center">
2
- <img src="../../../public/logos/logo.png" alt="DumbQL" width="160"/>
2
+ <img src="https://raw.githubusercontent.com/DumbGQL/dumbql/main/projects/dumbql/vue/assets/logo.svg" alt="DumbQL Vue" width="160"/>
3
3
  </p>
4
4
 
5
5
  <h1 align="center">@dumbql/vue</h1>
6
6
 
7
- <p align="center"><b>Vue composables for @dumbql/client — useQuery, useMutation, useSubscription.</b></p>
7
+ <p align="center"><b>Vue composables for @dumbql/client — useQuery, useMutation, useSubscription, useLiveQuery.</b></p>
8
8
 
9
9
  ---
10
10
 
11
11
  ## Features
12
12
 
13
13
  - **`createDumbqlPlugin(client)`** — Vue plugin to provide DumbqlClient
14
- - **`useQuery(document, variables?, options?)`** — reactive query composable
15
- - **`useMutation(document)`** — mutation composable
16
- - **`useSubscription(document, variables?, options?)`** — subscription composable
14
+ - **`useQuery(document, options?)`** — reactive query composable with refetch, fetchMore, pollInterval
15
+ - **`useMutation(document, options?)`** — mutation composable with update callback
16
+ - **`useSubscription(document, options?)`** — subscription composable with onNext/onError
17
+ - **`useLiveQuery(document, options?)`** — real-time query (HTTP fetch + WebSocket subscription)
17
18
  - **`useClient()`** — access DumbqlClient from anywhere
18
- - **Reactive refs** — `data`, `loading`, `error` are Vue refs
19
+ - **Reactive refs** — `data`, `loading`, `error`, `errorCode` are Vue refs
19
20
  - **SSR support** — works with Vue's `onServerPrefetch`
20
21
 
21
22
  ## Install
@@ -34,7 +35,6 @@ import { createClient } from '@dumbql/client';
34
35
  const client = createClient({ endpoint: '/graphql' });
35
36
  const plugin = createDumbqlPlugin(client);
36
37
 
37
- // In your component:
38
38
  const GET_TODOS = gql`query Todos { todos { id title } }`;
39
39
  const { data, loading, error, refetch } = useQuery(GET_TODOS);
40
40
  </script>
@@ -48,15 +48,95 @@ const { data, loading, error, refetch } = useQuery(GET_TODOS);
48
48
  </template>
49
49
  ```
50
50
 
51
+ ## Composable API
52
+
53
+ ### useQuery
54
+
55
+ ```ts
56
+ const { data, loading, error, errorCode, networkStatus, called, refetch, fetchMore } = useQuery(
57
+ document,
58
+ {
59
+ variables,
60
+ pollInterval, // auto-polling in ms
61
+ skip, // skip initial fetch
62
+ onCompleted, // (data) => void
63
+ onError, // (error, errorCode?) => void
64
+ },
65
+ );
66
+ ```
67
+
68
+ All result fields are Vue `Ref`s except `refetch` and `fetchMore`.
69
+
70
+ | Field | Type | Description |
71
+ |-------|------|-------------|
72
+ | `data` | `Ref<TData \| null>` | Response data |
73
+ | `loading` | `Ref<boolean>` | True during initial fetch or refetch |
74
+ | `error` | `Ref<string \| null>` | Error message |
75
+ | `errorCode` | `Ref<ErrorCode \| undefined>` | Typed error code |
76
+ | `networkStatus` | `Ref<NetworkStatus>` | `'loading' \| 'ready' \| 'error' \| 'refetching' \| 'poll'` |
77
+ | `called` | `Ref<boolean>` | True after first execution |
78
+ | `refetch` | `(vars?) => Promise<GraphQLResult<T>>` | Re-fetch with optional new variables |
79
+ | `fetchMore` | `(merge, vars?) => Promise<GraphQLResult<T>>` | Fetch more data and merge |
80
+
81
+ ### useMutation
82
+
83
+ ```ts
84
+ const { data, loading, error, errorCode, called, mutate } = useMutation(
85
+ document,
86
+ {
87
+ variables,
88
+ onCompleted, // (data) => void
89
+ onError, // (error, errorCode?) => void
90
+ update, // (cache, result) => void — update cache after success
91
+ },
92
+ );
93
+
94
+ mutate(variables);
95
+ ```
96
+
97
+ ### useSubscription
98
+
99
+ ```ts
100
+ const { data, loading, error, errorCode } = useSubscription(
101
+ document,
102
+ {
103
+ variables,
104
+ wsEndpoint, // default: derived from client endpoint
105
+ shouldSubscribe, // default: true
106
+ onNext, // (data) => void
107
+ onError, // (error, errorCode?) => void
108
+ onComplete, // () => void
109
+ },
110
+ );
111
+ ```
112
+
113
+ ### useLiveQuery
114
+
115
+ Real-time query that executes an initial HTTP fetch then subscribes to WebSocket updates.
116
+
117
+ ```ts
118
+ const { data, loading, error, errorCode } = useLiveQuery(
119
+ document,
120
+ {
121
+ variables,
122
+ wsEndpoint, // default: derived from client endpoint
123
+ shouldSubscribe, // default: true
124
+ onCompleted, // (data) => void
125
+ onError, // (error, errorCode?) => void
126
+ },
127
+ );
128
+ ```
129
+
51
130
  ## API Overview
52
131
 
53
132
  | Export | Description |
54
133
  |--------|-------------|
55
134
  | `createDumbqlPlugin(client)` | Vue plugin — installs the client globally |
56
135
  | `useClient()` | Access `DumbqlClient` from composition API |
57
- | `useQuery(doc, vars?, opts?)` | Reactive query `{ data, loading, error, refetch }` |
58
- | `useMutation(doc)` | Mutation `{ data, loading, error, mutate }` |
59
- | `useSubscription(doc, vars?, opts?)` | Subscription `{ data, loading, error }` |
136
+ | `useQuery(doc, opts?)` | Reactive query with refetch, fetchMore, pollInterval |
137
+ | `useMutation(doc, opts?)` | Mutation with update callback |
138
+ | `useSubscription(doc, opts?)` | Subscription with onNext/onError |
139
+ | `useLiveQuery(doc, opts?)` | Real-time query (fetch + WS) |
60
140
 
61
141
  ## Dependencies
62
142
 
@@ -0,0 +1,17 @@
1
+ import { type Ref } from 'vue';
2
+ import type { DocumentNode, TypedDocumentNode, ErrorCode } from '@dumbql/client';
3
+ export interface UseLiveQueryOptions<TData> {
4
+ variables?: Record<string, unknown>;
5
+ wsEndpoint?: string;
6
+ shouldSubscribe?: boolean;
7
+ onCompleted?: (data: TData) => void;
8
+ onError?: (error: string, errorCode?: ErrorCode) => void;
9
+ }
10
+ export interface UseLiveQueryResult<TData> {
11
+ data: Ref<TData | null>;
12
+ loading: Ref<boolean>;
13
+ error: Ref<string | null>;
14
+ errorCode: Ref<ErrorCode | undefined>;
15
+ }
16
+ export declare function useLiveQuery<TData, TVariables extends Record<string, unknown> = Record<string, unknown>>(document: DocumentNode | TypedDocumentNode<TData, TVariables>, options?: UseLiveQueryOptions<TData>): UseLiveQueryResult<TData>;
17
+ //# sourceMappingURL=use-live-query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-live-query.d.ts","sourceRoot":"","sources":["../../../../projects/dumbql/vue/src/lib/use-live-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAIjF,MAAM,WAAW,mBAAmB,CAAC,KAAK;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,SAAS,KAAK,IAAI,CAAC;CAC1D;AAED,MAAM,WAAW,kBAAkB,CAAC,KAAK;IACvC,IAAI,EAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IACxB,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACtB,KAAK,EAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1B,SAAS,EAAE,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;CACvC;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtG,QAAQ,EAAE,YAAY,GAAG,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,EAC7D,OAAO,CAAC,EAAE,mBAAmB,CAAC,KAAK,CAAC,GACnC,kBAAkB,CAAC,KAAK,CAAC,CA8G3B"}
@@ -0,0 +1,98 @@
1
+ import { ref, onMounted, onUnmounted } from 'vue';
2
+ import { print } from '@dumbql/client';
3
+ import { useClient } from './plugin';
4
+ export function useLiveQuery(document, options) {
5
+ const client = useClient();
6
+ const variables = options?.variables;
7
+ const data = ref(null);
8
+ const loading = ref(true);
9
+ const error = ref(null);
10
+ const errorCode = ref(undefined);
11
+ const wsEndpoint = options?.wsEndpoint ?? client.endpoint.replace(/^http/, 'ws');
12
+ const shouldSubscribe = options?.shouldSubscribe ?? true;
13
+ const onCompleted = options?.onCompleted;
14
+ const onError = options?.onError;
15
+ let ws = null;
16
+ let cancelled = false;
17
+ onMounted(async () => {
18
+ loading.value = true;
19
+ const result = await client.query(document, variables);
20
+ if (cancelled)
21
+ return;
22
+ loading.value = false;
23
+ if (result.status === 'success') {
24
+ data.value = result.data;
25
+ error.value = null;
26
+ errorCode.value = undefined;
27
+ onCompleted?.(result.data);
28
+ }
29
+ else {
30
+ error.value = result.error;
31
+ errorCode.value = result.errorCode;
32
+ onError?.(result.error, result.errorCode);
33
+ return;
34
+ }
35
+ if (!shouldSubscribe)
36
+ return;
37
+ const queryStr = print(document);
38
+ ws = new WebSocket(wsEndpoint, 'graphql-transport-ws');
39
+ ws.onopen = () => {
40
+ ws.send(JSON.stringify({ type: 'connection_init' }));
41
+ };
42
+ ws.onmessage = (event) => {
43
+ if (cancelled)
44
+ return;
45
+ try {
46
+ const msg = JSON.parse(event.data);
47
+ switch (msg.type) {
48
+ case 'connection_ack': {
49
+ ws.send(JSON.stringify({
50
+ type: 'subscribe',
51
+ id: 'live1',
52
+ payload: { query: queryStr, variables: variables ?? {} },
53
+ }));
54
+ break;
55
+ }
56
+ case 'next': {
57
+ const payload = msg.payload;
58
+ if (payload?.errors && payload.errors.length > 0) {
59
+ error.value = payload.errors[0].message;
60
+ errorCode.value = 'GRAPHQL_ERROR';
61
+ onError?.(payload.errors[0].message, 'GRAPHQL_ERROR');
62
+ }
63
+ else if (payload?.data !== undefined) {
64
+ data.value = payload.data;
65
+ onCompleted?.(payload.data);
66
+ }
67
+ break;
68
+ }
69
+ case 'error': {
70
+ error.value = 'Live query subscription error';
71
+ errorCode.value = 'GRAPHQL_ERROR';
72
+ onError?.('Live query subscription error', 'GRAPHQL_ERROR');
73
+ break;
74
+ }
75
+ }
76
+ }
77
+ catch {
78
+ // ignore malformed messages
79
+ }
80
+ };
81
+ ws.onerror = () => {
82
+ if (cancelled)
83
+ return;
84
+ error.value = 'WebSocket connection error';
85
+ errorCode.value = 'NETWORK_ERROR';
86
+ onError?.('WebSocket connection error', 'NETWORK_ERROR');
87
+ };
88
+ });
89
+ onUnmounted(() => {
90
+ cancelled = true;
91
+ if (ws) {
92
+ ws.close(1000, 'unsubscribe');
93
+ ws = null;
94
+ }
95
+ });
96
+ return { data, loading, error, errorCode };
97
+ }
98
+ //# sourceMappingURL=use-live-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-live-query.js","sourceRoot":"","sources":["../../../../projects/dumbql/vue/src/lib/use-live-query.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,20 @@
1
1
  import { type Ref } from 'vue';
2
- import type { DocumentNode, TypedDocumentNode, GraphQLResult } from '@dumbql/client';
2
+ import type { DocumentNode, TypedDocumentNode, GraphQLResult, ErrorCode } from '@dumbql/client';
3
+ import type { CacheStore } from '@dumbql/cache';
4
+ export interface UseMutationOptions<TData, TVariables> {
5
+ variables?: TVariables;
6
+ onCompleted?: (data: TData) => void;
7
+ onError?: (error: string, errorCode?: ErrorCode) => void;
8
+ update?: (cache: CacheStore, result: GraphQLResult<TData>) => void;
9
+ }
3
10
  export type UseMutationFn<TData, TVariables> = (variables?: TVariables) => Promise<GraphQLResult<TData>>;
4
11
  export interface UseMutationResult<TData, TVariables> {
5
12
  data: Ref<TData | null>;
6
13
  loading: Ref<boolean>;
7
14
  error: Ref<string | null>;
15
+ errorCode: Ref<ErrorCode | undefined>;
16
+ called: Ref<boolean>;
8
17
  mutate: UseMutationFn<TData, TVariables>;
9
18
  }
10
- export declare function useMutation<TData, TVariables extends Record<string, unknown> = Record<string, unknown>>(document: DocumentNode | TypedDocumentNode<TData, TVariables>): UseMutationResult<TData, TVariables>;
19
+ export declare function useMutation<TData, TVariables extends Record<string, unknown> = Record<string, unknown>>(document: DocumentNode | TypedDocumentNode<TData, TVariables>, options?: UseMutationOptions<TData, TVariables>): UseMutationResult<TData, TVariables>;
11
20
  //# sourceMappingURL=use-mutation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-mutation.d.ts","sourceRoot":"","sources":["../../../../projects/dumbql/vue/src/lib/use-mutation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGrF,MAAM,MAAM,aAAa,CAAC,KAAK,EAAE,UAAU,IAAI,CAC7C,SAAS,CAAC,EAAE,UAAU,KACnB,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AAEnC,MAAM,WAAW,iBAAiB,CAAC,KAAK,EAAE,UAAU;IAClD,IAAI,EAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IACxB,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACtB,KAAK,EAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1B,MAAM,EAAE,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;CAC1C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrG,QAAQ,EAAE,YAAY,GAAG,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,GAC5D,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,CAsBtC"}
1
+ {"version":3,"file":"use-mutation.d.ts","sourceRoot":"","sources":["../../../../projects/dumbql/vue/src/lib/use-mutation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD,MAAM,WAAW,kBAAkB,CAAC,KAAK,EAAE,UAAU;IACnD,SAAS,CAAC,EAAE,UAAU,CAAC;IACvB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,SAAS,KAAK,IAAI,CAAC;IACzD,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;CACpE;AAED,MAAM,MAAM,aAAa,CAAC,KAAK,EAAE,UAAU,IAAI,CAC7C,SAAS,CAAC,EAAE,UAAU,KACnB,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AAEnC,MAAM,WAAW,iBAAiB,CAAC,KAAK,EAAE,UAAU;IAClD,IAAI,EAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IACxB,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACtB,KAAK,EAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1B,SAAS,EAAE,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IACtC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACrB,MAAM,EAAE,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;CAC1C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrG,QAAQ,EAAE,YAAY,GAAG,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,EAC7D,OAAO,CAAC,EAAE,kBAAkB,CAAC,KAAK,EAAE,UAAU,CAAC,GAC9C,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,CAqCtC"}
@@ -1,24 +1,37 @@
1
1
  import { ref } from 'vue';
2
2
  import { useClient } from './plugin';
3
- export function useMutation(document) {
3
+ export function useMutation(document, options) {
4
4
  const client = useClient();
5
5
  const data = ref(null);
6
6
  const loading = ref(false);
7
7
  const error = ref(null);
8
+ const errorCode = ref(undefined);
9
+ const called = ref(false);
8
10
  const mutate = async (variables) => {
9
11
  loading.value = true;
12
+ called.value = true;
10
13
  error.value = null;
14
+ errorCode.value = undefined;
11
15
  data.value = null;
12
- const result = await client.mutate(document, variables);
16
+ const result = await client.mutate(document, variables ?? options?.variables);
13
17
  if (result.status === 'success') {
14
18
  data.value = result.data;
19
+ options?.onCompleted?.(result.data);
20
+ if (options?.update) {
21
+ const cache = client.getCacheService();
22
+ if (cache) {
23
+ options.update(cache, result);
24
+ }
25
+ }
15
26
  }
16
27
  else {
17
28
  error.value = result.error;
29
+ errorCode.value = result.errorCode;
30
+ options?.onError?.(result.error, result.errorCode);
18
31
  }
19
32
  loading.value = false;
20
33
  return result;
21
34
  };
22
- return { data, loading, error, mutate };
35
+ return { data, loading, error, errorCode, called, mutate };
23
36
  }
24
37
  //# sourceMappingURL=use-mutation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-mutation.js","sourceRoot":"","sources":["../../../../projects/dumbql/vue/src/lib/use-mutation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAY,MAAM,KAAK,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAarC,MAAM,UAAU,WAAW,CACzB,QAA6D;IAE7D,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,GAAG,CAAe,IAAI,CAAsB,CAAC;IAC1D,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3B,MAAM,KAAK,GAAG,GAAG,CAAgB,IAAI,CAAC,CAAC;IAEvC,MAAM,MAAM,GAAqC,KAAK,EAAE,SAAsB,EAAE,EAAE;QAChF,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;QACrB,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAElB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAoB,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC3E,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC7B,CAAC;QACD,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;QACtB,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC1C,CAAC"}
1
+ {"version":3,"file":"use-mutation.js","sourceRoot":"","sources":["../../../../projects/dumbql/vue/src/lib/use-mutation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAY,MAAM,KAAK,CAAC;AAGpC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAsBrC,MAAM,UAAU,WAAW,CACzB,QAA6D,EAC7D,OAA+C;IAE/C,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,GAAG,CAAe,IAAI,CAAsB,CAAC;IAC1D,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3B,MAAM,KAAK,GAAG,GAAG,CAAgB,IAAI,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,GAAG,CAAwB,SAAS,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IAE1B,MAAM,MAAM,GAAqC,KAAK,EAAE,SAAsB,EAAE,EAAE;QAChF,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;QACrB,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;QACnB,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAElB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAoB,QAAQ,EAAE,SAAS,IAAK,OAAO,EAAE,SAAoC,CAAC,CAAC;QAE7H,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;YACzB,OAAO,EAAE,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;gBACpB,MAAM,KAAK,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;gBACvC,IAAI,KAAK,EAAE,CAAC;oBACV,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YAC3B,SAAS,CAAC,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC;YACnC,OAAO,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACrD,CAAC;QAED,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;QACtB,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC7D,CAAC"}
@@ -1,10 +1,22 @@
1
1
  import { type Ref } from 'vue';
2
- import type { DocumentNode, TypedDocumentNode, GraphQLResult } from '@dumbql/client';
2
+ import type { DocumentNode, TypedDocumentNode, GraphQLResult, ErrorCode } from '@dumbql/client';
3
+ export interface UseQueryOptions<TData, TVariables> {
4
+ variables?: TVariables;
5
+ pollInterval?: number;
6
+ skip?: boolean;
7
+ onCompleted?: (data: TData) => void;
8
+ onError?: (error: string, errorCode?: ErrorCode) => void;
9
+ }
10
+ export type NetworkStatus = 'loading' | 'ready' | 'error' | 'refetching' | 'poll';
3
11
  export interface UseQueryResult<TData, TVariables extends Record<string, unknown>> {
4
12
  data: Ref<TData | null>;
5
13
  loading: Ref<boolean>;
6
14
  error: Ref<string | null>;
15
+ errorCode: Ref<ErrorCode | undefined>;
16
+ networkStatus: Ref<NetworkStatus>;
17
+ called: Ref<boolean>;
7
18
  refetch: (vars?: TVariables) => Promise<GraphQLResult<TData>>;
19
+ fetchMore: (merge: (prev: TData, next: TData) => TData, vars?: TVariables) => Promise<GraphQLResult<TData>>;
8
20
  }
9
- export declare function useQuery<TData, TVariables extends Record<string, unknown> = Record<string, unknown>>(document: DocumentNode | TypedDocumentNode<TData, TVariables>, variables?: TVariables): UseQueryResult<TData, TVariables>;
21
+ export declare function useQuery<TData, TVariables extends Record<string, unknown> = Record<string, unknown>>(document: DocumentNode | TypedDocumentNode<TData, TVariables>, options?: UseQueryOptions<TData, TVariables>): UseQueryResult<TData, TVariables>;
10
22
  //# sourceMappingURL=use-query.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-query.d.ts","sourceRoot":"","sources":["../../../../projects/dumbql/vue/src/lib/use-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGrF,MAAM,WAAW,cAAc,CAAC,KAAK,EAAE,UAAU,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC/E,IAAI,EAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IACxB,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACtB,KAAK,EAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1B,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,UAAU,KAAK,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;CAC/D;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClG,QAAQ,EAAE,YAAY,GAAG,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,EAC7D,SAAS,CAAC,EAAE,UAAU,GACrB,cAAc,CAAC,KAAK,EAAE,UAAU,CAAC,CA8CnC"}
1
+ {"version":3,"file":"use-query.d.ts","sourceRoot":"","sources":["../../../../projects/dumbql/vue/src/lib/use-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhG,MAAM,WAAW,eAAe,CAAC,KAAK,EAAE,UAAU;IAChD,SAAS,CAAC,EAAE,UAAU,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,SAAS,KAAK,IAAI,CAAC;CAC1D;AAED,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,YAAY,GAAG,MAAM,CAAC;AAElF,MAAM,WAAW,cAAc,CAAC,KAAK,EAAE,UAAU,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC/E,IAAI,EAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IACxB,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACtB,KAAK,EAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1B,SAAS,EAAE,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IACtC,aAAa,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;IAClC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACrB,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,UAAU,KAAK,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9D,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,KAAK,KAAK,EAAE,IAAI,CAAC,EAAE,UAAU,KAAK,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;CAC7G;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClG,QAAQ,EAAE,YAAY,GAAG,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,EAC7D,OAAO,CAAC,EAAE,eAAe,CAAC,KAAK,EAAE,UAAU,CAAC,GAC3C,cAAc,CAAC,KAAK,EAAE,UAAU,CAAC,CAmHnC"}
package/lib/use-query.js CHANGED
@@ -1,46 +1,112 @@
1
- import { ref, onMounted, onUnmounted } from 'vue';
1
+ import { ref, onMounted, onUnmounted, watch } from 'vue';
2
2
  import { useClient } from './plugin';
3
- export function useQuery(document, variables) {
3
+ export function useQuery(document, options) {
4
4
  const client = useClient();
5
+ const variables = options?.variables;
6
+ const pollInterval = options?.pollInterval;
7
+ const skip = options?.skip ?? false;
8
+ const onCompleted = options?.onCompleted;
9
+ const onError = options?.onError;
5
10
  const data = ref(null);
6
- const loading = ref(true);
11
+ const loading = ref(!skip);
7
12
  const error = ref(null);
13
+ const errorCode = ref(undefined);
14
+ const networkStatus = ref(skip ? 'ready' : 'loading');
15
+ const called = ref(false);
8
16
  let cancelled = false;
17
+ let pollTimer = null;
9
18
  let lastVars = variables;
10
- const execute = async (vars) => {
19
+ const execute = async (vars, status) => {
20
+ if (skip)
21
+ return;
22
+ cancelled = false;
11
23
  loading.value = true;
12
- error.value = null;
13
- data.value = null;
24
+ networkStatus.value = status ?? 'loading';
25
+ called.value = true;
14
26
  lastVars = vars;
15
- const result = await client.query(document, vars);
27
+ const result = await client.query(document, vars ?? variables);
16
28
  if (cancelled)
17
29
  return;
30
+ loading.value = false;
18
31
  if (result.status === 'success') {
19
32
  data.value = result.data;
33
+ error.value = null;
34
+ errorCode.value = undefined;
35
+ networkStatus.value = 'ready';
36
+ onCompleted?.(result.data);
20
37
  }
21
38
  else {
22
39
  error.value = result.error;
40
+ errorCode.value = result.errorCode;
41
+ networkStatus.value = 'error';
42
+ onError?.(result.error, result.errorCode);
23
43
  }
24
- loading.value = false;
25
44
  };
26
45
  onMounted(() => {
27
- execute(variables);
46
+ if (!skip) {
47
+ execute(variables);
48
+ }
49
+ if (pollInterval && pollInterval > 0 && !skip) {
50
+ pollTimer = setInterval(async () => {
51
+ networkStatus.value = 'poll';
52
+ const result = await client.query(document, variables);
53
+ loading.value = false;
54
+ if (result.status === 'success') {
55
+ data.value = result.data;
56
+ error.value = null;
57
+ errorCode.value = undefined;
58
+ networkStatus.value = 'ready';
59
+ onCompleted?.(result.data);
60
+ }
61
+ else {
62
+ error.value = result.error;
63
+ errorCode.value = result.errorCode;
64
+ networkStatus.value = 'error';
65
+ onError?.(result.error, result.errorCode);
66
+ }
67
+ }, pollInterval);
68
+ }
69
+ });
70
+ watch(() => JSON.stringify(variables ?? {}), () => {
71
+ if (!skip) {
72
+ execute(variables);
73
+ }
28
74
  });
29
75
  const refetch = async (vars) => {
76
+ networkStatus.value = 'refetching';
30
77
  const result = await client.refetch(document, (vars ?? lastVars));
78
+ loading.value = false;
31
79
  if (result.status === 'success') {
32
80
  data.value = result.data;
33
81
  error.value = null;
82
+ errorCode.value = undefined;
83
+ networkStatus.value = 'ready';
84
+ onCompleted?.(result.data);
34
85
  }
35
86
  else {
36
- data.value = null;
37
87
  error.value = result.error;
88
+ errorCode.value = result.errorCode;
89
+ networkStatus.value = 'error';
90
+ onError?.(result.error, result.errorCode);
91
+ }
92
+ return result;
93
+ };
94
+ const fetchMore = async (merge, vars) => {
95
+ networkStatus.value = 'refetching';
96
+ const result = await client.query(document, vars ?? lastVars);
97
+ if (result.status === 'success' && data.value) {
98
+ data.value = merge(data.value, result.data);
38
99
  }
100
+ networkStatus.value = 'ready';
39
101
  return result;
40
102
  };
41
103
  onUnmounted(() => {
42
104
  cancelled = true;
105
+ if (pollTimer) {
106
+ clearInterval(pollTimer);
107
+ pollTimer = null;
108
+ }
43
109
  });
44
- return { data, loading, error, refetch };
110
+ return { data, loading, error, errorCode, networkStatus, called, refetch, fetchMore };
45
111
  }
46
112
  //# sourceMappingURL=use-query.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-query.js","sourceRoot":"","sources":["../../../../projects/dumbql/vue/src/lib/use-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,WAAW,EAAY,MAAM,KAAK,CAAC;AAE5D,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AASrC,MAAM,UAAU,QAAQ,CACtB,QAA6D,EAC7D,SAAsB;IAEtB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,GAAG,CAAe,IAAI,CAAsB,CAAC;IAC1D,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,KAAK,GAAG,GAAG,CAAgB,IAAI,CAAC,CAAC;IAEvC,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,QAAQ,GAAG,SAAS,CAAC;IAEzB,MAAM,OAAO,GAAG,KAAK,EAAE,IAAiB,EAAE,EAAE;QAC1C,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;QACrB,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,QAAQ,GAAG,IAAI,CAAC;QAEhB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAoB,QAAQ,EAAE,IAAI,CAAC,CAAC;QACrE,IAAI,SAAS;YAAE,OAAO;QACtB,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC7B,CAAC;QACD,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;IACxB,CAAC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,SAAS,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,KAAK,EAAE,IAAiB,EAAE,EAAE;QAC1C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAoB,QAAQ,EAAE,CAAC,IAAI,IAAI,QAAQ,CAAe,CAAC,CAAC;QACnG,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;YACzB,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC7B,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF,WAAW,CAAC,GAAG,EAAE;QACf,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC3C,CAAC"}
1
+ {"version":3,"file":"use-query.js","sourceRoot":"","sources":["../../../../projects/dumbql/vue/src/lib/use-query.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,18 @@
1
1
  import { type Ref } from 'vue';
2
- import type { DocumentNode, TypedDocumentNode } from '@dumbql/client';
2
+ import type { DocumentNode, TypedDocumentNode, ErrorCode } from '@dumbql/client';
3
+ export interface UseSubscriptionOptions<TData> {
4
+ variables?: Record<string, unknown>;
5
+ wsEndpoint?: string;
6
+ shouldSubscribe?: boolean;
7
+ onNext?: (data: TData) => void;
8
+ onError?: (error: string, errorCode?: ErrorCode) => void;
9
+ onComplete?: () => void;
10
+ }
3
11
  export interface UseSubscriptionResult<TData> {
4
12
  data: Ref<TData | null>;
5
13
  loading: Ref<boolean>;
6
14
  error: Ref<string | null>;
15
+ errorCode: Ref<ErrorCode | undefined>;
7
16
  }
8
- export declare function useSubscription<TData, TVariables extends Record<string, unknown> = Record<string, unknown>>(document: DocumentNode | TypedDocumentNode<TData, TVariables>, variables?: TVariables, options?: {
9
- wsEndpoint?: string;
10
- shouldSubscribe?: boolean;
11
- }): UseSubscriptionResult<TData>;
17
+ export declare function useSubscription<TData, TVariables extends Record<string, unknown> = Record<string, unknown>>(document: DocumentNode | TypedDocumentNode<TData, TVariables>, options?: UseSubscriptionOptions<TData>): UseSubscriptionResult<TData>;
12
18
  //# sourceMappingURL=use-subscription.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-subscription.d.ts","sourceRoot":"","sources":["../../../../projects/dumbql/vue/src/lib/use-subscription.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAItE,MAAM,WAAW,qBAAqB,CAAC,KAAK;IAC1C,IAAI,EAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IACxB,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACtB,KAAK,EAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC3B;AAQD,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACzG,QAAQ,EAAE,YAAY,GAAG,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,EAC7D,SAAS,CAAC,EAAE,UAAU,EACtB,OAAO,CAAC,EAAE;IACR,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,GACA,qBAAqB,CAAC,KAAK,CAAC,CA2E9B"}
1
+ {"version":3,"file":"use-subscription.d.ts","sourceRoot":"","sources":["../../../../projects/dumbql/vue/src/lib/use-subscription.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAIjF,MAAM,WAAW,sBAAsB,CAAC,KAAK;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,SAAS,KAAK,IAAI,CAAC;IACzD,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB,CAAC,KAAK;IAC1C,IAAI,EAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IACxB,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACtB,KAAK,EAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1B,SAAS,EAAE,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;CACvC;AAQD,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACzG,QAAQ,EAAE,YAAY,GAAG,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,EAC7D,OAAO,CAAC,EAAE,sBAAsB,CAAC,KAAK,CAAC,GACtC,qBAAqB,CAAC,KAAK,CAAC,CA4F9B"}
@@ -1,14 +1,19 @@
1
1
  import { ref, onMounted, onUnmounted } from 'vue';
2
2
  import { print } from '@dumbql/client';
3
3
  import { useClient } from './plugin';
4
- export function useSubscription(document, variables, options) {
4
+ export function useSubscription(document, options) {
5
5
  const client = useClient();
6
+ const variables = options?.variables;
6
7
  const data = ref(null);
7
8
  const loading = ref(true);
8
9
  const error = ref(null);
10
+ const errorCode = ref(undefined);
9
11
  const wsEndpoint = options?.wsEndpoint ??
10
12
  client.endpoint.replace(/^http/, 'ws');
11
13
  const shouldSubscribe = options?.shouldSubscribe ?? true;
14
+ const onNext = options?.onNext;
15
+ const onError = options?.onError;
16
+ const onComplete = options?.onComplete;
12
17
  let ws = null;
13
18
  onMounted(() => {
14
19
  if (!shouldSubscribe)
@@ -16,6 +21,7 @@ export function useSubscription(document, variables, options) {
16
21
  loading.value = true;
17
22
  data.value = null;
18
23
  error.value = null;
24
+ errorCode.value = undefined;
19
25
  const queryStr = print(document);
20
26
  ws = new WebSocket(wsEndpoint);
21
27
  ws.onopen = () => {
@@ -34,19 +40,27 @@ export function useSubscription(document, variables, options) {
34
40
  const msg = JSON.parse(event.data);
35
41
  if (msg.type === 'next' && msg.payload) {
36
42
  if (msg.payload.errors) {
37
- error.value = msg.payload.errors[0].message;
43
+ const errMsg = msg.payload.errors[0].message;
44
+ error.value = errMsg;
45
+ errorCode.value = 'GRAPHQL_ERROR';
46
+ onError?.(errMsg, 'GRAPHQL_ERROR');
38
47
  }
39
48
  else if (msg.payload.data) {
40
49
  data.value = msg.payload.data;
50
+ onNext?.(msg.payload.data);
41
51
  }
42
52
  loading.value = false;
43
53
  }
44
54
  else if (msg.type === 'error') {
45
- error.value = msg.payload?.errors?.[0]?.message ?? 'Subscription error';
55
+ const errMsg = msg.payload?.errors?.[0]?.message ?? 'Subscription error';
56
+ error.value = errMsg;
57
+ errorCode.value = 'GRAPHQL_ERROR';
46
58
  loading.value = false;
59
+ onError?.(errMsg, 'GRAPHQL_ERROR');
47
60
  }
48
61
  else if (msg.type === 'complete') {
49
62
  loading.value = false;
63
+ onComplete?.();
50
64
  }
51
65
  }
52
66
  catch {
@@ -54,8 +68,11 @@ export function useSubscription(document, variables, options) {
54
68
  }
55
69
  };
56
70
  ws.onerror = () => {
57
- error.value = 'WebSocket connection error';
71
+ const errMsg = 'WebSocket connection error';
72
+ error.value = errMsg;
73
+ errorCode.value = 'NETWORK_ERROR';
58
74
  loading.value = false;
75
+ onError?.(errMsg, 'NETWORK_ERROR');
59
76
  };
60
77
  ws.onclose = () => {
61
78
  loading.value = false;
@@ -67,6 +84,6 @@ export function useSubscription(document, variables, options) {
67
84
  ws = null;
68
85
  }
69
86
  });
70
- return { data, loading, error };
87
+ return { data, loading, error, errorCode };
71
88
  }
72
89
  //# sourceMappingURL=use-subscription.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-subscription.js","sourceRoot":"","sources":["../../../../projects/dumbql/vue/src/lib/use-subscription.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"use-subscription.js","sourceRoot":"","sources":["../../../../projects/dumbql/vue/src/lib/use-subscription.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type Ref } from 'vue';
2
+ import type { DocumentNode, TypedDocumentNode } from '@dumbql/client';
3
+ export interface UseSuspenseQueryResult<TData> {
4
+ data: Ref<TData | null>;
5
+ error: Ref<string | null>;
6
+ loading: Ref<boolean>;
7
+ promise: Promise<TData | undefined>;
8
+ }
9
+ export declare function useSuspenseQuery<TData, TVariables extends Record<string, unknown> = Record<string, unknown>>(document: DocumentNode | TypedDocumentNode<TData, TVariables>, variables?: TVariables): UseSuspenseQueryResult<TData>;
10
+ export declare function useBackgroundQuery<TData, TVariables extends Record<string, unknown> = Record<string, unknown>>(document: DocumentNode | TypedDocumentNode<TData, TVariables>, variables?: TVariables): Promise<TData>;
11
+ //# sourceMappingURL=use-suspense-query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-suspense-query.d.ts","sourceRoot":"","sources":["../../../../projects/dumbql/vue/src/lib/use-suspense-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAiB,MAAM,gBAAgB,CAAC;AAGrF,MAAM,WAAW,sBAAsB,CAAC,KAAK;IAC3C,IAAI,EAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IACxB,KAAK,EAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1B,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;CACrC;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1G,QAAQ,EAAE,YAAY,GAAG,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,EAC7D,SAAS,CAAC,EAAE,UAAU,GACrB,sBAAsB,CAAC,KAAK,CAAC,CAiB/B;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5G,QAAQ,EAAE,YAAY,GAAG,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,EAC7D,SAAS,CAAC,EAAE,UAAU,GACrB,OAAO,CAAC,KAAK,CAAC,CAQhB"}
@@ -0,0 +1,28 @@
1
+ import { ref } from 'vue';
2
+ import { useClient } from './plugin';
3
+ export function useSuspenseQuery(document, variables) {
4
+ const client = useClient();
5
+ const data = ref(null);
6
+ const error = ref(null);
7
+ const loading = ref(true);
8
+ const promise = client.query(document, variables).then((result) => {
9
+ loading.value = false;
10
+ if (result.status === 'error') {
11
+ error.value = result.error;
12
+ return undefined;
13
+ }
14
+ data.value = result.data;
15
+ return result.data;
16
+ });
17
+ return { data, error, loading, promise };
18
+ }
19
+ export function useBackgroundQuery(document, variables) {
20
+ const client = useClient();
21
+ return client.query(document, variables).then((result) => {
22
+ if (result.status === 'error') {
23
+ throw result;
24
+ }
25
+ return result.data;
26
+ });
27
+ }
28
+ //# sourceMappingURL=use-suspense-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-suspense-query.js","sourceRoot":"","sources":["../../../../projects/dumbql/vue/src/lib/use-suspense-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAY,MAAM,KAAK,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AASrC,MAAM,UAAU,gBAAgB,CAC9B,QAA6D,EAC7D,SAAsB;IAEtB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,GAAG,CAAe,IAAI,CAAsB,CAAC;IAC1D,MAAM,KAAK,GAAG,GAAG,CAAgB,IAAI,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;IAE1B,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAoB,QAAQ,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;QACnF,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;QACtB,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC9B,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YAC3B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;QACzB,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,QAA6D,EAC7D,SAAsB;IAEtB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,OAAO,MAAM,CAAC,KAAK,CAAoB,QAAQ,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;QAC1E,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC9B,MAAM,MAAM,CAAC;QACf,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dumbql/vue",
3
- "version": "0.0.2-rc.3",
3
+ "version": "0.0.3",
4
4
  "description": "Vue composables for @dumbql/client — useQuery, useMutation, useSubscription",
5
5
  "keywords": [
6
6
  "vue",
@@ -25,7 +25,7 @@
25
25
  "sideEffects": false,
26
26
  "peerDependencies": {
27
27
  "vue": "^3.0.0",
28
- "@dumbql/client": "^0.0.1",
28
+ "@dumbql/client": "^0.0.3",
29
29
  "graphql": "^17.0.0"
30
30
  }
31
31
  }
package/public-api.d.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  export { createDumbqlPlugin, useClient, DUMBQL_CLIENT_KEY } from './lib/plugin';
2
- export { useQuery, type UseQueryResult } from './lib/use-query';
3
- export { useMutation, type UseMutationResult, type UseMutationFn } from './lib/use-mutation';
4
- export { useSubscription, type UseSubscriptionResult } from './lib/use-subscription';
2
+ export { useQuery, type UseQueryOptions, type UseQueryResult, type NetworkStatus } from './lib/use-query';
3
+ export { useMutation, type UseMutationOptions, type UseMutationResult, type UseMutationFn } from './lib/use-mutation';
4
+ export { useSubscription, type UseSubscriptionOptions, type UseSubscriptionResult } from './lib/use-subscription';
5
+ export { useLiveQuery, type UseLiveQueryOptions, type UseLiveQueryResult } from './lib/use-live-query';
6
+ export { useSuspenseQuery, useBackgroundQuery, type UseSuspenseQueryResult } from './lib/use-suspense-query';
5
7
  export { gql, isSuccess, isError, unwrap, unwrapOrThrow } from '@dumbql/client';
6
8
  //# sourceMappingURL=public-api.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"public-api.d.ts","sourceRoot":"","sources":["../../../projects/dumbql/vue/src/public-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,KAAK,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC7F,OAAO,EAAE,eAAe,EAAE,KAAK,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACrF,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"public-api.d.ts","sourceRoot":"","sources":["../../../projects/dumbql/vue/src/public-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC1G,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACtH,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,KAAK,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAClH,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACvG,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,KAAK,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAC7G,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
package/public-api.js CHANGED
@@ -2,5 +2,7 @@ export { createDumbqlPlugin, useClient, DUMBQL_CLIENT_KEY } from './lib/plugin';
2
2
  export { useQuery } from './lib/use-query';
3
3
  export { useMutation } from './lib/use-mutation';
4
4
  export { useSubscription } from './lib/use-subscription';
5
+ export { useLiveQuery } from './lib/use-live-query';
6
+ export { useSuspenseQuery, useBackgroundQuery } from './lib/use-suspense-query';
5
7
  export { gql, isSuccess, isError, unwrap, unwrapOrThrow } from '@dumbql/client';
6
8
  //# sourceMappingURL=public-api.js.map
package/public-api.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"public-api.js","sourceRoot":"","sources":["../../../projects/dumbql/vue/src/public-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAuB,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,WAAW,EAA8C,MAAM,oBAAoB,CAAC;AAC7F,OAAO,EAAE,eAAe,EAA8B,MAAM,wBAAwB,CAAC;AACrF,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"public-api.js","sourceRoot":"","sources":["../../../projects/dumbql/vue/src/public-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAiE,MAAM,iBAAiB,CAAC;AAC1G,OAAO,EAAE,WAAW,EAAuE,MAAM,oBAAoB,CAAC;AACtH,OAAO,EAAE,eAAe,EAA2D,MAAM,wBAAwB,CAAC;AAClH,OAAO,EAAE,YAAY,EAAqD,MAAM,sBAAsB,CAAC;AACvG,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAA+B,MAAM,0BAA0B,CAAC;AAC7G,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}