@powersync/tanstack-react-query 0.1.6 → 0.1.8
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/lib/hooks/useQuery.js +1 -0
- package/lib/hooks/useQuery.js.map +1 -0
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -0
- package/package.json +7 -6
- package/src/hooks/useQuery.ts +158 -0
- package/src/index.ts +1 -0
package/lib/hooks/useQuery.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useQuery.js","sourceRoot":"","sources":["../../src/hooks/useQuery.ts"],"names":[],"mappings":"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"}
|
package/lib/index.js
CHANGED
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@powersync/tanstack-react-query",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.8",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"registry": "https://registry.npmjs.org/",
|
|
6
6
|
"access": "public"
|
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
"types": "./lib/index.d.ts",
|
|
11
11
|
"type": "module",
|
|
12
12
|
"files": [
|
|
13
|
-
"lib"
|
|
13
|
+
"lib",
|
|
14
|
+
"src"
|
|
14
15
|
],
|
|
15
16
|
"repository": {
|
|
16
17
|
"type": "git",
|
|
@@ -23,13 +24,13 @@
|
|
|
23
24
|
},
|
|
24
25
|
"homepage": "https://docs.powersync.com",
|
|
25
26
|
"peerDependencies": {
|
|
26
|
-
"@powersync/common": "^1.
|
|
27
|
+
"@powersync/common": "^1.41.1",
|
|
27
28
|
"react": "*"
|
|
28
29
|
},
|
|
29
30
|
"dependencies": {
|
|
30
31
|
"@tanstack/react-query": "^5.70.0",
|
|
31
|
-
"@powersync/common": "1.
|
|
32
|
-
"@powersync/react": "1.8.
|
|
32
|
+
"@powersync/common": "1.41.1",
|
|
33
|
+
"@powersync/react": "1.8.2"
|
|
33
34
|
},
|
|
34
35
|
"devDependencies": {
|
|
35
36
|
"@testing-library/react": "^15.0.2",
|
|
@@ -39,7 +40,7 @@
|
|
|
39
40
|
},
|
|
40
41
|
"scripts": {
|
|
41
42
|
"build": "tsc -b",
|
|
42
|
-
"build:prod": "tsc -b
|
|
43
|
+
"build:prod": "tsc -b",
|
|
43
44
|
"clean": "rm -rf lib tsconfig.tsbuildinfo",
|
|
44
45
|
"test": "vitest",
|
|
45
46
|
"watch": "tsc -b -w",
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { parseQuery, type CompilableQuery } from '@powersync/common';
|
|
2
|
+
import { usePowerSync } from '@powersync/react';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
|
|
5
|
+
import * as Tanstack from '@tanstack/react-query';
|
|
6
|
+
|
|
7
|
+
export type PowerSyncQueryOptions<T> = {
|
|
8
|
+
query?: string | CompilableQuery<T>;
|
|
9
|
+
parameters?: any[];
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export type UseBaseQueryOptions<TQueryOptions> = TQueryOptions & PowerSyncQueryOptions<any>;
|
|
13
|
+
|
|
14
|
+
export function useQuery<TData = unknown, TError = Tanstack.DefaultError>(
|
|
15
|
+
options: UseBaseQueryOptions<Tanstack.UseQueryOptions<TData, TError>> & { query?: undefined },
|
|
16
|
+
queryClient?: Tanstack.QueryClient
|
|
17
|
+
): Tanstack.UseQueryResult<TData, TError>;
|
|
18
|
+
|
|
19
|
+
// Overload when 'query' is present
|
|
20
|
+
export function useQuery<TData = unknown, TError = Tanstack.DefaultError>(
|
|
21
|
+
options: UseBaseQueryOptions<Tanstack.UseQueryOptions<TData[], TError>> & { query: string | CompilableQuery<TData> },
|
|
22
|
+
queryClient?: Tanstack.QueryClient
|
|
23
|
+
): Tanstack.UseQueryResult<TData[], TError>;
|
|
24
|
+
|
|
25
|
+
export function useQuery<TData = unknown, TError = Tanstack.DefaultError>(
|
|
26
|
+
options: UseBaseQueryOptions<Tanstack.UseQueryOptions<TData, TError>>,
|
|
27
|
+
queryClient: Tanstack.QueryClient = Tanstack.useQueryClient()
|
|
28
|
+
) {
|
|
29
|
+
return useQueryCore(options, queryClient, Tanstack.useQuery);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function useSuspenseQuery<TData = unknown, TError = Tanstack.DefaultError>(
|
|
33
|
+
options: UseBaseQueryOptions<Tanstack.UseSuspenseQueryOptions<TData, TError>> & { query?: undefined },
|
|
34
|
+
queryClient?: Tanstack.QueryClient
|
|
35
|
+
): Tanstack.UseSuspenseQueryResult<TData, TError>;
|
|
36
|
+
|
|
37
|
+
// Overload when 'query' is present
|
|
38
|
+
export function useSuspenseQuery<TData = unknown, TError = Tanstack.DefaultError>(
|
|
39
|
+
options: UseBaseQueryOptions<Tanstack.UseSuspenseQueryOptions<TData[], TError>> & {
|
|
40
|
+
query: string | CompilableQuery<TData>;
|
|
41
|
+
},
|
|
42
|
+
queryClient?: Tanstack.QueryClient
|
|
43
|
+
): Tanstack.UseSuspenseQueryResult<TData[], TError>;
|
|
44
|
+
|
|
45
|
+
export function useSuspenseQuery<TData = unknown, TError = Tanstack.DefaultError>(
|
|
46
|
+
options: UseBaseQueryOptions<Tanstack.UseSuspenseQueryOptions<TData, TError>>,
|
|
47
|
+
queryClient: Tanstack.QueryClient = Tanstack.useQueryClient()
|
|
48
|
+
) {
|
|
49
|
+
return useQueryCore(options, queryClient, Tanstack.useSuspenseQuery);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function useQueryCore<
|
|
53
|
+
TData,
|
|
54
|
+
TError,
|
|
55
|
+
TQueryOptions extends Tanstack.UseQueryOptions<TData, TError> | Tanstack.UseSuspenseQueryOptions<TData, TError>,
|
|
56
|
+
TQueryResult extends Tanstack.UseQueryResult<TData, TError> | Tanstack.UseSuspenseQueryResult<TData, TError>
|
|
57
|
+
>(
|
|
58
|
+
options: UseBaseQueryOptions<TQueryOptions>,
|
|
59
|
+
queryClient: Tanstack.QueryClient,
|
|
60
|
+
useQueryFn: (options: TQueryOptions, queryClient?: Tanstack.QueryClient) => TQueryResult
|
|
61
|
+
): TQueryResult {
|
|
62
|
+
const powerSync = usePowerSync();
|
|
63
|
+
|
|
64
|
+
if (!powerSync) {
|
|
65
|
+
throw new Error('PowerSync is not available');
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
let error: Error | undefined = undefined;
|
|
69
|
+
|
|
70
|
+
const [tables, setTables] = React.useState<string[]>([]);
|
|
71
|
+
const { query, parameters = [], ...resolvedOptions } = options;
|
|
72
|
+
|
|
73
|
+
let sqlStatement = '';
|
|
74
|
+
let queryParameters = [];
|
|
75
|
+
|
|
76
|
+
if (query) {
|
|
77
|
+
try {
|
|
78
|
+
const parsedQuery = parseQuery(query, parameters);
|
|
79
|
+
|
|
80
|
+
sqlStatement = parsedQuery.sqlStatement;
|
|
81
|
+
queryParameters = parsedQuery.parameters;
|
|
82
|
+
} catch (e) {
|
|
83
|
+
error = e;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const stringifiedParams = JSON.stringify(queryParameters);
|
|
88
|
+
const stringifiedKey = JSON.stringify(options.queryKey);
|
|
89
|
+
|
|
90
|
+
const fetchTables = async () => {
|
|
91
|
+
try {
|
|
92
|
+
const tables = await powerSync.resolveTables(sqlStatement, queryParameters);
|
|
93
|
+
setTables(tables);
|
|
94
|
+
} catch (e) {
|
|
95
|
+
error = e;
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
React.useEffect(() => {
|
|
100
|
+
if (error || !query) return () => {};
|
|
101
|
+
|
|
102
|
+
(async () => {
|
|
103
|
+
await fetchTables();
|
|
104
|
+
})();
|
|
105
|
+
|
|
106
|
+
const l = powerSync.registerListener({
|
|
107
|
+
schemaChanged: async () => {
|
|
108
|
+
await fetchTables();
|
|
109
|
+
queryClient.invalidateQueries({ queryKey: options.queryKey });
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
return () => l?.();
|
|
114
|
+
}, [powerSync, sqlStatement, stringifiedParams]);
|
|
115
|
+
|
|
116
|
+
const queryFn = React.useCallback(async () => {
|
|
117
|
+
if (error) {
|
|
118
|
+
return Promise.reject(error);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
try {
|
|
122
|
+
return typeof query == 'string' ? powerSync.getAll<TData>(sqlStatement, queryParameters) : query.execute();
|
|
123
|
+
} catch (e) {
|
|
124
|
+
return Promise.reject(e);
|
|
125
|
+
}
|
|
126
|
+
}, [powerSync, query, parameters, stringifiedKey]);
|
|
127
|
+
|
|
128
|
+
React.useEffect(() => {
|
|
129
|
+
if (error || !query) return () => {};
|
|
130
|
+
|
|
131
|
+
const abort = new AbortController();
|
|
132
|
+
powerSync.onChangeWithCallback(
|
|
133
|
+
{
|
|
134
|
+
onChange: () => {
|
|
135
|
+
queryClient.invalidateQueries({
|
|
136
|
+
queryKey: options.queryKey
|
|
137
|
+
});
|
|
138
|
+
},
|
|
139
|
+
onError: (e) => {
|
|
140
|
+
error = e;
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
tables,
|
|
145
|
+
signal: abort.signal
|
|
146
|
+
}
|
|
147
|
+
);
|
|
148
|
+
return () => abort.abort();
|
|
149
|
+
}, [powerSync, queryClient, stringifiedKey, tables]);
|
|
150
|
+
|
|
151
|
+
return useQueryFn(
|
|
152
|
+
{
|
|
153
|
+
...(resolvedOptions as TQueryOptions),
|
|
154
|
+
queryFn: query ? queryFn : resolvedOptions.queryFn
|
|
155
|
+
} as TQueryOptions,
|
|
156
|
+
queryClient
|
|
157
|
+
);
|
|
158
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { useQuery, useSuspenseQuery } from './hooks/useQuery.js';
|