@supatype/vue 0.1.0-alpha.9
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/.turbo/turbo-build.log +4 -0
- package/.turbo/turbo-typecheck.log +4 -0
- package/dist/context.d.ts +27 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +36 -0
- package/dist/context.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/useAuth.d.ts +45 -0
- package/dist/useAuth.d.ts.map +1 -0
- package/dist/useAuth.js +75 -0
- package/dist/useAuth.js.map +1 -0
- package/dist/useFunction.d.ts +29 -0
- package/dist/useFunction.d.ts.map +1 -0
- package/dist/useFunction.js +38 -0
- package/dist/useFunction.js.map +1 -0
- package/dist/useMutation.d.ts +32 -0
- package/dist/useMutation.d.ts.map +1 -0
- package/dist/useMutation.js +69 -0
- package/dist/useMutation.js.map +1 -0
- package/dist/useQuery.d.ts +36 -0
- package/dist/useQuery.d.ts.map +1 -0
- package/dist/useQuery.js +75 -0
- package/dist/useQuery.js.map +1 -0
- package/dist/useSubscription.d.ts +29 -0
- package/dist/useSubscription.d.ts.map +1 -0
- package/dist/useSubscription.js +74 -0
- package/dist/useSubscription.js.map +1 -0
- package/package.json +28 -0
- package/src/context.ts +40 -0
- package/src/index.ts +18 -0
- package/src/useAuth.ts +96 -0
- package/src/useFunction.ts +54 -0
- package/src/useMutation.ts +94 -0
- package/src/useQuery.ts +106 -0
- package/src/useSubscription.ts +104 -0
- package/tsconfig.json +13 -0
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Supatype Vue plugin and injection key.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { createApp } from 'vue'
|
|
7
|
+
* import { createClient } from '@supatype/client'
|
|
8
|
+
* import { supatypePlugin } from '@supatype/vue'
|
|
9
|
+
*
|
|
10
|
+
* const supatype = createClient({ url: '...', anonKey: '...' })
|
|
11
|
+
* const app = createApp(App)
|
|
12
|
+
* app.use(supatypePlugin, supatype)
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
import { type InjectionKey, type Plugin } from "vue";
|
|
16
|
+
import type { SupatypeClient, AnyDatabase } from "@supatype/client";
|
|
17
|
+
export declare const SUPATYPE_KEY: InjectionKey<SupatypeClient>;
|
|
18
|
+
/**
|
|
19
|
+
* Vue plugin that provides the Supatype client to all components.
|
|
20
|
+
*/
|
|
21
|
+
export declare const supatypePlugin: Plugin;
|
|
22
|
+
/**
|
|
23
|
+
* Get the Supatype client from the injection context.
|
|
24
|
+
* Must be called inside setup() of a component that has the supatypePlugin installed.
|
|
25
|
+
*/
|
|
26
|
+
export declare function useSupatype<TDatabase extends AnyDatabase = AnyDatabase>(): SupatypeClient<TDatabase>;
|
|
27
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAU,KAAK,YAAY,EAAE,KAAK,MAAM,EAAE,MAAM,KAAK,CAAA;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAEnE,eAAO,MAAM,YAAY,EAAE,YAAY,CAAC,cAAc,CAAsB,CAAA;AAE5E;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,MAI5B,CAAA;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,SAAS,SAAS,WAAW,GAAG,WAAW,KAAK,cAAc,CAAC,SAAS,CAAC,CAMpG"}
|
package/dist/context.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Supatype Vue plugin and injection key.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { createApp } from 'vue'
|
|
7
|
+
* import { createClient } from '@supatype/client'
|
|
8
|
+
* import { supatypePlugin } from '@supatype/vue'
|
|
9
|
+
*
|
|
10
|
+
* const supatype = createClient({ url: '...', anonKey: '...' })
|
|
11
|
+
* const app = createApp(App)
|
|
12
|
+
* app.use(supatypePlugin, supatype)
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
import { inject } from "vue";
|
|
16
|
+
export const SUPATYPE_KEY = Symbol("supatype");
|
|
17
|
+
/**
|
|
18
|
+
* Vue plugin that provides the Supatype client to all components.
|
|
19
|
+
*/
|
|
20
|
+
export const supatypePlugin = {
|
|
21
|
+
install(app, client) {
|
|
22
|
+
app.provide(SUPATYPE_KEY, client);
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Get the Supatype client from the injection context.
|
|
27
|
+
* Must be called inside setup() of a component that has the supatypePlugin installed.
|
|
28
|
+
*/
|
|
29
|
+
export function useSupatype() {
|
|
30
|
+
const client = inject(SUPATYPE_KEY);
|
|
31
|
+
if (!client) {
|
|
32
|
+
throw new Error("useSupatype() requires the supatypePlugin to be installed on the Vue app.");
|
|
33
|
+
}
|
|
34
|
+
return client;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,MAAM,EAAkC,MAAM,KAAK,CAAA;AAG5D,MAAM,CAAC,MAAM,YAAY,GAAiC,MAAM,CAAC,UAAU,CAAC,CAAA;AAE5E;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAW;IACpC,OAAO,CAAC,GAAG,EAAE,MAAsB;QACjC,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAAA;IACnC,CAAC;CACF,CAAA;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW;IACzB,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,CAAA;IACnC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAA;IAC9F,CAAC;IACD,OAAO,MAAmC,CAAA;AAC5C,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { supatypePlugin, useSupatype, SUPATYPE_KEY } from "./context.js";
|
|
2
|
+
export { useQuery } from "./useQuery.js";
|
|
3
|
+
export type { UseQueryOptions, UseQueryReturn } from "./useQuery.js";
|
|
4
|
+
export { useMutation } from "./useMutation.js";
|
|
5
|
+
export type { UseMutationReturn, MutationOperation, MutationOptions } from "./useMutation.js";
|
|
6
|
+
export { useAuth } from "./useAuth.js";
|
|
7
|
+
export type { UseAuthReturn } from "./useAuth.js";
|
|
8
|
+
export { useSubscription } from "./useSubscription.js";
|
|
9
|
+
export type { UseSubscriptionOptions, UseSubscriptionReturn, SubscriptionEvent } from "./useSubscription.js";
|
|
10
|
+
export { useFunction } from "./useFunction.js";
|
|
11
|
+
export type { UseFunctionReturn } from "./useFunction.js";
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAExE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAE7F,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAEjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,YAAY,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAE5G,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// @supatype/vue — Vue composables for Supatype
|
|
2
|
+
export { supatypePlugin, useSupatype, SUPATYPE_KEY } from "./context.js";
|
|
3
|
+
export { useQuery } from "./useQuery.js";
|
|
4
|
+
export { useMutation } from "./useMutation.js";
|
|
5
|
+
export { useAuth } from "./useAuth.js";
|
|
6
|
+
export { useSubscription } from "./useSubscription.js";
|
|
7
|
+
export { useFunction } from "./useFunction.js";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAE/C,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAExE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAGxC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAG9C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAGtC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAGtD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type Ref } from "vue";
|
|
2
|
+
import type { AnyDatabase, SupatypeError, User, Session } from "@supatype/client";
|
|
3
|
+
export interface UseAuthReturn {
|
|
4
|
+
user: Ref<User | null>;
|
|
5
|
+
session: Ref<Session | null>;
|
|
6
|
+
loading: Ref<boolean>;
|
|
7
|
+
signIn: (email: string, password: string) => Promise<{
|
|
8
|
+
error: SupatypeError | null;
|
|
9
|
+
}>;
|
|
10
|
+
signUp: (email: string, password: string) => Promise<{
|
|
11
|
+
error: SupatypeError | null;
|
|
12
|
+
}>;
|
|
13
|
+
signOut: () => Promise<{
|
|
14
|
+
error: SupatypeError | null;
|
|
15
|
+
}>;
|
|
16
|
+
signInWithOAuth: (provider: string) => Promise<{
|
|
17
|
+
error: SupatypeError | null;
|
|
18
|
+
}>;
|
|
19
|
+
resetPassword: (email: string) => Promise<{
|
|
20
|
+
error: SupatypeError | null;
|
|
21
|
+
}>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Authentication composable for Supatype.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```vue
|
|
28
|
+
* <script setup>
|
|
29
|
+
* import { useAuth } from '@supatype/vue'
|
|
30
|
+
*
|
|
31
|
+
* const { user, loading, signIn, signOut } = useAuth()
|
|
32
|
+
* </script>
|
|
33
|
+
*
|
|
34
|
+
* <template>
|
|
35
|
+
* <div v-if="loading">Loading...</div>
|
|
36
|
+
* <div v-else-if="user">
|
|
37
|
+
* <p>Signed in as {{ user.email }}</p>
|
|
38
|
+
* <button @click="signOut">Sign out</button>
|
|
39
|
+
* </div>
|
|
40
|
+
* <form v-else @submit.prevent="signIn(email, password)">...</form>
|
|
41
|
+
* </template>
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare function useAuth<TDatabase extends AnyDatabase = AnyDatabase>(): UseAuthReturn;
|
|
45
|
+
//# sourceMappingURL=useAuth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../src/useAuth.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,GAAG,EAAE,MAAM,KAAK,CAAA;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAmB,MAAM,kBAAkB,CAAA;AAGlG,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAA;IACtB,OAAO,EAAE,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,CAAA;IAC5B,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;IACrB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,KAAK,EAAE,aAAa,GAAG,IAAI,CAAA;KAAE,CAAC,CAAA;IACrF,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,KAAK,EAAE,aAAa,GAAG,IAAI,CAAA;KAAE,CAAC,CAAA;IACrF,OAAO,EAAE,MAAM,OAAO,CAAC;QAAE,KAAK,EAAE,aAAa,GAAG,IAAI,CAAA;KAAE,CAAC,CAAA;IACvD,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,KAAK,EAAE,aAAa,GAAG,IAAI,CAAA;KAAE,CAAC,CAAA;IAC/E,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,KAAK,EAAE,aAAa,GAAG,IAAI,CAAA;KAAE,CAAC,CAAA;CAC3E;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,OAAO,CAAC,SAAS,SAAS,WAAW,GAAG,WAAW,KAAK,aAAa,CA2DpF"}
|
package/dist/useAuth.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { ref, onMounted, onUnmounted } from "vue";
|
|
2
|
+
import { useSupatype } from "./context.js";
|
|
3
|
+
/**
|
|
4
|
+
* Authentication composable for Supatype.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```vue
|
|
8
|
+
* <script setup>
|
|
9
|
+
* import { useAuth } from '@supatype/vue'
|
|
10
|
+
*
|
|
11
|
+
* const { user, loading, signIn, signOut } = useAuth()
|
|
12
|
+
* </script>
|
|
13
|
+
*
|
|
14
|
+
* <template>
|
|
15
|
+
* <div v-if="loading">Loading...</div>
|
|
16
|
+
* <div v-else-if="user">
|
|
17
|
+
* <p>Signed in as {{ user.email }}</p>
|
|
18
|
+
* <button @click="signOut">Sign out</button>
|
|
19
|
+
* </div>
|
|
20
|
+
* <form v-else @submit.prevent="signIn(email, password)">...</form>
|
|
21
|
+
* </template>
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export function useAuth() {
|
|
25
|
+
const client = useSupatype();
|
|
26
|
+
const user = ref(null);
|
|
27
|
+
const session = ref(null);
|
|
28
|
+
const loading = ref(true);
|
|
29
|
+
let unsubscribe = null;
|
|
30
|
+
onMounted(async () => {
|
|
31
|
+
// Get initial session
|
|
32
|
+
try {
|
|
33
|
+
const { data } = await client.auth.getSession();
|
|
34
|
+
if (data.session) {
|
|
35
|
+
session.value = data.session;
|
|
36
|
+
user.value = data.session.user;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// Ignore — user is not authenticated
|
|
41
|
+
}
|
|
42
|
+
loading.value = false;
|
|
43
|
+
// Subscribe to auth changes
|
|
44
|
+
const { data: { subscription } } = client.auth.onAuthStateChange((event, newSession) => {
|
|
45
|
+
session.value = newSession;
|
|
46
|
+
user.value = newSession?.user ?? null;
|
|
47
|
+
});
|
|
48
|
+
unsubscribe = () => subscription.unsubscribe();
|
|
49
|
+
});
|
|
50
|
+
onUnmounted(() => {
|
|
51
|
+
unsubscribe?.();
|
|
52
|
+
});
|
|
53
|
+
const signIn = async (email, password) => {
|
|
54
|
+
const { error } = await client.auth.signInWithPassword({ email, password });
|
|
55
|
+
return { error };
|
|
56
|
+
};
|
|
57
|
+
const signUp = async (email, password) => {
|
|
58
|
+
const { error } = await client.auth.signUp({ email, password });
|
|
59
|
+
return { error };
|
|
60
|
+
};
|
|
61
|
+
const signOut = async () => {
|
|
62
|
+
const { error } = await client.auth.signOut();
|
|
63
|
+
return { error };
|
|
64
|
+
};
|
|
65
|
+
const signInWithOAuth = async (provider) => {
|
|
66
|
+
const { error } = await client.auth.signInWithOAuth({ provider });
|
|
67
|
+
return { error };
|
|
68
|
+
};
|
|
69
|
+
const resetPassword = async (email) => {
|
|
70
|
+
const { error } = await client.auth.resetPasswordForEmail(email);
|
|
71
|
+
return { error };
|
|
72
|
+
};
|
|
73
|
+
return { user, session, loading, signIn, signUp, signOut, signInWithOAuth, resetPassword };
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=useAuth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAuth.js","sourceRoot":"","sources":["../src/useAuth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type Ref } from "vue";
|
|
2
|
+
import type { AnyDatabase, SupatypeError } from "@supatype/client";
|
|
3
|
+
export interface UseFunctionReturn<TResponse> {
|
|
4
|
+
invoke: (body?: unknown) => Promise<{
|
|
5
|
+
data: TResponse | null;
|
|
6
|
+
error: SupatypeError | null;
|
|
7
|
+
}>;
|
|
8
|
+
data: Ref<TResponse | null>;
|
|
9
|
+
error: Ref<SupatypeError | null>;
|
|
10
|
+
loading: Ref<boolean>;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Edge function invocation composable.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```vue
|
|
17
|
+
* <script setup>
|
|
18
|
+
* import { useFunction } from '@supatype/vue'
|
|
19
|
+
*
|
|
20
|
+
* const { invoke, data, loading } = useFunction<{ orderId: string }>('process-order')
|
|
21
|
+
*
|
|
22
|
+
* async function handleSubmit() {
|
|
23
|
+
* await invoke({ items: cart.value, address: address.value })
|
|
24
|
+
* }
|
|
25
|
+
* </script>
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare function useFunction<TResponse = unknown, TDatabase extends AnyDatabase = AnyDatabase>(functionName: string): UseFunctionReturn<TResponse>;
|
|
29
|
+
//# sourceMappingURL=useFunction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFunction.d.ts","sourceRoot":"","sources":["../src/useFunction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,GAAG,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAGlE,MAAM,WAAW,iBAAiB,CAAC,SAAS;IAC1C,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAA;KAAE,CAAC,CAAA;IAC5F,IAAI,EAAE,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CAAA;IAC3B,KAAK,EAAE,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC,CAAA;IAChC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;CACtB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CACzB,SAAS,GAAG,OAAO,EACnB,SAAS,SAAS,WAAW,GAAG,WAAW,EAE3C,YAAY,EAAE,MAAM,GACnB,iBAAiB,CAAC,SAAS,CAAC,CAqB9B"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { ref } from "vue";
|
|
2
|
+
import { useSupatype } from "./context.js";
|
|
3
|
+
/**
|
|
4
|
+
* Edge function invocation composable.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```vue
|
|
8
|
+
* <script setup>
|
|
9
|
+
* import { useFunction } from '@supatype/vue'
|
|
10
|
+
*
|
|
11
|
+
* const { invoke, data, loading } = useFunction<{ orderId: string }>('process-order')
|
|
12
|
+
*
|
|
13
|
+
* async function handleSubmit() {
|
|
14
|
+
* await invoke({ items: cart.value, address: address.value })
|
|
15
|
+
* }
|
|
16
|
+
* </script>
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export function useFunction(functionName) {
|
|
20
|
+
const client = useSupatype();
|
|
21
|
+
const data = ref(null);
|
|
22
|
+
const error = ref(null);
|
|
23
|
+
const loading = ref(false);
|
|
24
|
+
const invoke = async (body) => {
|
|
25
|
+
loading.value = true;
|
|
26
|
+
error.value = null;
|
|
27
|
+
const result = await client.functions.invoke(functionName, {
|
|
28
|
+
...(body !== undefined ? { body } : {}),
|
|
29
|
+
});
|
|
30
|
+
loading.value = false;
|
|
31
|
+
data.value = result.data;
|
|
32
|
+
if (result.error)
|
|
33
|
+
error.value = result.error;
|
|
34
|
+
return result;
|
|
35
|
+
};
|
|
36
|
+
return { invoke, data, error, loading };
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=useFunction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFunction.js","sourceRoot":"","sources":["../src/useFunction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAY,MAAM,KAAK,CAAA;AAEnC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAS1C;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,WAAW,CAIzB,YAAoB;IAEpB,MAAM,MAAM,GAAG,WAAW,EAAa,CAAA;IACvC,MAAM,IAAI,GAAG,GAAG,CAAmB,IAAI,CAA0B,CAAA;IACjE,MAAM,KAAK,GAAG,GAAG,CAAuB,IAAI,CAAC,CAAA;IAC7C,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAA;IAE1B,MAAM,MAAM,GAAG,KAAK,EAAE,IAAc,EAAE,EAAE;QACtC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAA;QACpB,KAAK,CAAC,KAAK,GAAG,IAAI,CAAA;QAElB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,EAAE;YACzD,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxC,CAAC,CAAA;QAEF,OAAO,CAAC,KAAK,GAAG,KAAK,CAAA;QACrB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAwB,CAAA;QAC5C,IAAI,MAAM,CAAC,KAAK;YAAE,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;QAC5C,OAAO,MAAiE,CAAA;IAC1E,CAAC,CAAA;IAED,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAA;AACzC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type Ref } from "vue";
|
|
2
|
+
import type { AnyDatabase, SupatypeError } from "@supatype/client";
|
|
3
|
+
export type MutationOperation = "insert" | "update" | "delete" | "upsert";
|
|
4
|
+
export interface MutationOptions {
|
|
5
|
+
filter?: Record<string, unknown> | undefined;
|
|
6
|
+
}
|
|
7
|
+
export interface UseMutationReturn<TRow> {
|
|
8
|
+
mutate: (data?: Record<string, unknown> | Record<string, unknown>[] | undefined, options?: MutationOptions | undefined) => Promise<{
|
|
9
|
+
data: TRow[] | null;
|
|
10
|
+
error: SupatypeError | null;
|
|
11
|
+
}>;
|
|
12
|
+
loading: Ref<boolean>;
|
|
13
|
+
error: Ref<SupatypeError | null>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Mutation composable for insert, update, delete, and upsert operations.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```vue
|
|
20
|
+
* <script setup>
|
|
21
|
+
* import { useMutation } from '@supatype/vue'
|
|
22
|
+
*
|
|
23
|
+
* const { mutate: createPost, loading } = useMutation('posts', 'insert')
|
|
24
|
+
*
|
|
25
|
+
* async function handleSubmit() {
|
|
26
|
+
* const { data, error } = await createPost({ title: 'Hello', status: 'draft' })
|
|
27
|
+
* }
|
|
28
|
+
* </script>
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare function useMutation<TDatabase extends AnyDatabase = AnyDatabase, TTable extends keyof TDatabase["public"]["Tables"] & string = keyof TDatabase["public"]["Tables"] & string, TRow = TDatabase["public"]["Tables"][TTable]["Row"]>(table: TTable, operation: MutationOperation): UseMutationReturn<TRow>;
|
|
32
|
+
//# sourceMappingURL=useMutation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMutation.d.ts","sourceRoot":"","sources":["../src/useMutation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,GAAG,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAGlE,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAEzE,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAA;CAC7C;AAED,MAAM,WAAW,iBAAiB,CAAC,IAAI;IACrC,MAAM,EAAE,CACN,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,SAAS,EACtE,OAAO,CAAC,EAAE,eAAe,GAAG,SAAS,KAClC,OAAO,CAAC;QAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAA;KAAE,CAAC,CAAA;IAClE,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;IACrB,KAAK,EAAE,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC,CAAA;CACjC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CACzB,SAAS,SAAS,WAAW,GAAG,WAAW,EAC3C,MAAM,SAAS,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,MAAM,EAC1G,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,EAEnD,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,iBAAiB,GAC3B,iBAAiB,CAAC,IAAI,CAAC,CAmDzB"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { ref } from "vue";
|
|
2
|
+
import { useSupatype } from "./context.js";
|
|
3
|
+
/**
|
|
4
|
+
* Mutation composable for insert, update, delete, and upsert operations.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```vue
|
|
8
|
+
* <script setup>
|
|
9
|
+
* import { useMutation } from '@supatype/vue'
|
|
10
|
+
*
|
|
11
|
+
* const { mutate: createPost, loading } = useMutation('posts', 'insert')
|
|
12
|
+
*
|
|
13
|
+
* async function handleSubmit() {
|
|
14
|
+
* const { data, error } = await createPost({ title: 'Hello', status: 'draft' })
|
|
15
|
+
* }
|
|
16
|
+
* </script>
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export function useMutation(table, operation) {
|
|
20
|
+
const client = useSupatype();
|
|
21
|
+
const loading = ref(false);
|
|
22
|
+
const error = ref(null);
|
|
23
|
+
const mutate = async (data, options) => {
|
|
24
|
+
loading.value = true;
|
|
25
|
+
error.value = null;
|
|
26
|
+
try {
|
|
27
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
28
|
+
const tableClient = client.from(table);
|
|
29
|
+
let result;
|
|
30
|
+
if (operation === "insert") {
|
|
31
|
+
result = await tableClient.insert(data);
|
|
32
|
+
}
|
|
33
|
+
else if (operation === "upsert") {
|
|
34
|
+
result = await tableClient.upsert(data);
|
|
35
|
+
}
|
|
36
|
+
else if (operation === "update") {
|
|
37
|
+
let q = tableClient.update(data);
|
|
38
|
+
if (options?.filter) {
|
|
39
|
+
for (const [col, val] of Object.entries(options.filter)) {
|
|
40
|
+
q = q.eq(col, val);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
result = await q;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
let q = tableClient.delete();
|
|
47
|
+
if (options?.filter) {
|
|
48
|
+
for (const [col, val] of Object.entries(options.filter)) {
|
|
49
|
+
q = q.eq(col, val);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
result = await q;
|
|
53
|
+
}
|
|
54
|
+
if (result.error)
|
|
55
|
+
error.value = result.error;
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
catch (e) {
|
|
59
|
+
const err = { message: e instanceof Error ? e.message : "Unknown error" };
|
|
60
|
+
error.value = err;
|
|
61
|
+
return { data: null, error: err };
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
loading.value = false;
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
return { mutate, loading, error };
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=useMutation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMutation.js","sourceRoot":"","sources":["../src/useMutation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAY,MAAM,KAAK,CAAA;AAEnC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAiB1C;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,WAAW,CAKzB,KAAa,EACb,SAA4B;IAE5B,MAAM,MAAM,GAAG,WAAW,EAAa,CAAA;IACvC,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAA;IAC1B,MAAM,KAAK,GAAG,GAAG,CAAuB,IAAI,CAAC,CAAA;IAE7C,MAAM,MAAM,GAAG,KAAK,EAClB,IAAsE,EACtE,OAAqC,EACrC,EAAE;QACF,OAAO,CAAC,KAAK,GAAG,IAAI,CAAA;QACpB,KAAK,CAAC,KAAK,GAAG,IAAI,CAAA;QAElB,IAAI,CAAC;YACH,8DAA8D;YAC9D,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAQ,CAAA;YAC7C,IAAI,MAA4D,CAAA;YAEhE,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;gBAC3B,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YACzC,CAAC;iBAAM,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;gBAClC,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YACzC,CAAC;iBAAM,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;gBAClC,IAAI,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;gBAChC,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;oBACpB,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;wBACxD,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;oBACpB,CAAC;gBACH,CAAC;gBACD,MAAM,GAAG,MAAM,CAAC,CAAA;YAClB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAA;gBAC5B,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;oBACpB,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;wBACxD,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;oBACpB,CAAC;gBACH,CAAC;gBACD,MAAM,GAAG,MAAM,CAAC,CAAA;YAClB,CAAC;YAED,IAAI,MAAM,CAAC,KAAK;gBAAE,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;YAC5C,OAAO,MAAM,CAAA;QACf,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,GAAG,GAAG,EAAE,OAAO,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAA;YACzE,KAAK,CAAC,KAAK,GAAG,GAAG,CAAA;YACjB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAA;QACnC,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,KAAK,GAAG,KAAK,CAAA;QACvB,CAAC;IACH,CAAC,CAAA;IAED,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;AACnC,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type Ref } from "vue";
|
|
2
|
+
import type { AnyDatabase, SupatypeError } from "@supatype/client";
|
|
3
|
+
export interface UseQueryOptions {
|
|
4
|
+
columns?: string | undefined;
|
|
5
|
+
filter?: Record<string, unknown> | undefined;
|
|
6
|
+
order?: {
|
|
7
|
+
column: string;
|
|
8
|
+
ascending?: boolean;
|
|
9
|
+
} | undefined;
|
|
10
|
+
limit?: number | undefined;
|
|
11
|
+
offset?: number | undefined;
|
|
12
|
+
enabled?: Ref<boolean> | boolean | undefined;
|
|
13
|
+
}
|
|
14
|
+
export interface UseQueryReturn<TRow> {
|
|
15
|
+
data: Ref<TRow[] | null>;
|
|
16
|
+
error: Ref<SupatypeError | null>;
|
|
17
|
+
loading: Ref<boolean>;
|
|
18
|
+
refetch: () => Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Reactive data fetching composable for Supatype tables.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```vue
|
|
25
|
+
* <script setup>
|
|
26
|
+
* import { useQuery } from '@supatype/vue'
|
|
27
|
+
*
|
|
28
|
+
* const { data: posts, loading, error, refetch } = useQuery('posts', {
|
|
29
|
+
* order: { column: 'created_at', ascending: false },
|
|
30
|
+
* limit: 10,
|
|
31
|
+
* })
|
|
32
|
+
* </script>
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare function useQuery<TDatabase extends AnyDatabase = AnyDatabase, TTable extends keyof TDatabase["public"]["Tables"] & string = keyof TDatabase["public"]["Tables"] & string, TRow = TDatabase["public"]["Tables"][TTable]["Row"]>(table: TTable, options?: UseQueryOptions | undefined): UseQueryReturn<TRow>;
|
|
36
|
+
//# sourceMappingURL=useQuery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useQuery.d.ts","sourceRoot":"","sources":["../src/useQuery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,GAAG,EAAE,MAAM,KAAK,CAAA;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAGlE,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAA;IAC5C,KAAK,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS,CAAA;IAC3D,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B,OAAO,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,OAAO,GAAG,SAAS,CAAA;CAC7C;AAED,MAAM,WAAW,cAAc,CAAC,IAAI;IAClC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAA;IACxB,KAAK,EAAE,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC,CAAA;IAChC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;IACrB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC7B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,QAAQ,CACtB,SAAS,SAAS,WAAW,GAAG,WAAW,EAC3C,MAAM,SAAS,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,MAAM,EAC1G,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,EAEnD,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,eAAe,GAAG,SAAS,GACpC,cAAc,CAAC,IAAI,CAAC,CA+DtB"}
|
package/dist/useQuery.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { ref, onMounted, watch } from "vue";
|
|
2
|
+
import { useSupatype } from "./context.js";
|
|
3
|
+
/**
|
|
4
|
+
* Reactive data fetching composable for Supatype tables.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```vue
|
|
8
|
+
* <script setup>
|
|
9
|
+
* import { useQuery } from '@supatype/vue'
|
|
10
|
+
*
|
|
11
|
+
* const { data: posts, loading, error, refetch } = useQuery('posts', {
|
|
12
|
+
* order: { column: 'created_at', ascending: false },
|
|
13
|
+
* limit: 10,
|
|
14
|
+
* })
|
|
15
|
+
* </script>
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export function useQuery(table, options) {
|
|
19
|
+
const client = useSupatype();
|
|
20
|
+
const data = ref(null);
|
|
21
|
+
const error = ref(null);
|
|
22
|
+
const loading = ref(false);
|
|
23
|
+
const fetchData = async () => {
|
|
24
|
+
// Check enabled
|
|
25
|
+
const enabled = options?.enabled;
|
|
26
|
+
if (enabled !== undefined) {
|
|
27
|
+
const isEnabled = typeof enabled === "boolean" ? enabled : enabled.value;
|
|
28
|
+
if (!isEnabled)
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
loading.value = true;
|
|
32
|
+
error.value = null;
|
|
33
|
+
try {
|
|
34
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
35
|
+
let query = client.from(table).select(options?.columns);
|
|
36
|
+
if (options?.filter) {
|
|
37
|
+
for (const [col, val] of Object.entries(options.filter)) {
|
|
38
|
+
query = query.eq(col, val);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (options?.order) {
|
|
42
|
+
query = query.order(options.order.column, {
|
|
43
|
+
ascending: options.order.ascending ?? true,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
if (options?.limit !== undefined) {
|
|
47
|
+
query = query.limit(options.limit);
|
|
48
|
+
}
|
|
49
|
+
if (options?.offset !== undefined) {
|
|
50
|
+
query = query.range(options.offset, options.offset + (options.limit ?? 100) - 1);
|
|
51
|
+
}
|
|
52
|
+
const result = await query;
|
|
53
|
+
data.value = result.data;
|
|
54
|
+
if (result.error) {
|
|
55
|
+
error.value = result.error;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (e) {
|
|
59
|
+
error.value = { message: e instanceof Error ? e.message : "Unknown error" };
|
|
60
|
+
}
|
|
61
|
+
finally {
|
|
62
|
+
loading.value = false;
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
onMounted(fetchData);
|
|
66
|
+
// Re-fetch when enabled changes
|
|
67
|
+
if (options?.enabled && typeof options.enabled !== "boolean") {
|
|
68
|
+
watch(options.enabled, (newVal) => {
|
|
69
|
+
if (newVal)
|
|
70
|
+
fetchData();
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
return { data, error, loading, refetch: fetchData };
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=useQuery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useQuery.js","sourceRoot":"","sources":["../src/useQuery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type Ref } from "vue";
|
|
2
|
+
import type { AnyDatabase, SupatypeError, RealtimeEvent } from "@supatype/client";
|
|
3
|
+
export type SubscriptionEvent = RealtimeEvent;
|
|
4
|
+
export interface UseSubscriptionOptions {
|
|
5
|
+
event?: SubscriptionEvent | undefined;
|
|
6
|
+
filter?: string | undefined;
|
|
7
|
+
}
|
|
8
|
+
export interface UseSubscriptionReturn<TRow> {
|
|
9
|
+
data: Ref<TRow[] | null>;
|
|
10
|
+
error: Ref<SupatypeError | null>;
|
|
11
|
+
status: Ref<"connecting" | "connected" | "disconnected" | "error">;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Real-time subscription composable.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```vue
|
|
18
|
+
* <script setup>
|
|
19
|
+
* import { useSubscription } from '@supatype/vue'
|
|
20
|
+
*
|
|
21
|
+
* const { data: messages, status } = useSubscription('messages', {
|
|
22
|
+
* event: '*',
|
|
23
|
+
* filter: 'room_id=eq.123',
|
|
24
|
+
* })
|
|
25
|
+
* </script>
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare function useSubscription<TDatabase extends AnyDatabase = AnyDatabase, TTable extends keyof TDatabase["public"]["Tables"] & string = keyof TDatabase["public"]["Tables"] & string, TRow = TDatabase["public"]["Tables"][TTable]["Row"]>(table: TTable, options?: UseSubscriptionOptions | undefined): UseSubscriptionReturn<TRow>;
|
|
29
|
+
//# sourceMappingURL=useSubscription.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSubscription.d.ts","sourceRoot":"","sources":["../src/useSubscription.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,GAAG,EAAE,MAAM,KAAK,CAAA;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAmB,aAAa,EAAiB,MAAM,kBAAkB,CAAA;AAGjH,MAAM,MAAM,iBAAiB,GAAG,aAAa,CAAA;AAE7C,MAAM,WAAW,sBAAsB;IACrC,KAAK,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAA;IACrC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC5B;AAED,MAAM,WAAW,qBAAqB,CAAC,IAAI;IACzC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAA;IACxB,KAAK,EAAE,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC,CAAA;IAChC,MAAM,EAAE,GAAG,CAAC,YAAY,GAAG,WAAW,GAAG,cAAc,GAAG,OAAO,CAAC,CAAA;CACnE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAC7B,SAAS,SAAS,WAAW,GAAG,WAAW,EAC3C,MAAM,SAAS,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,MAAM,EAC1G,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,EAEnD,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,sBAAsB,GAAG,SAAS,GAC3C,qBAAqB,CAAC,IAAI,CAAC,CAgE7B"}
|