@powersync/tanstack-react-query 0.1.7 → 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.
@@ -88,3 +88,4 @@ function useQueryCore(options, queryClient, useQueryFn) {
88
88
  queryFn: query ? queryFn : resolvedOptions.queryFn
89
89
  }, queryClient);
90
90
  }
91
+ //# sourceMappingURL=useQuery.js.map
@@ -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
@@ -1 +1,2 @@
1
1
  export { useQuery, useSuspenseQuery } from './hooks/useQuery.js';
2
+ //# sourceMappingURL=index.js.map
@@ -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.7",
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.41.0",
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.41.0",
32
- "@powersync/react": "1.8.1"
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 --sourceMap false",
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';