mtmsdk 0.0.52 → 0.0.53
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/dist/gomtmapi/@tanstack/react-query.gen.d.ts +21 -173
- package/dist/gomtmapi/@tanstack/react-query.gen.d.ts.map +1 -1
- package/dist/gomtmapi/@tanstack/react-query.gen.js +39 -179
- package/dist/gomtmapi/@tanstack/react-query.gen.js.map +1 -1
- package/dist/gomtmapi/index.d.ts +2 -2
- package/dist/gomtmapi/index.d.ts.map +1 -1
- package/dist/gomtmapi/index.js +1 -1
- package/dist/gomtmapi/index.js.map +1 -1
- package/dist/gomtmapi/schemas.gen.d.ts +67 -81
- package/dist/gomtmapi/schemas.gen.d.ts.map +1 -1
- package/dist/gomtmapi/schemas.gen.js +68 -82
- package/dist/gomtmapi/schemas.gen.js.map +1 -1
- package/dist/gomtmapi/sdk.gen.d.ts +15 -95
- package/dist/gomtmapi/sdk.gen.d.ts.map +1 -1
- package/dist/gomtmapi/sdk.gen.js +22 -102
- package/dist/gomtmapi/sdk.gen.js.map +1 -1
- package/dist/gomtmapi/types.gen.d.ts +66 -209
- package/dist/gomtmapi/types.gen.d.ts.map +1 -1
- package/dist/gomtmapi/zod.gen.d.ts +48 -121
- package/dist/gomtmapi/zod.gen.d.ts.map +1 -1
- package/dist/gomtmapi/zod.gen.js +36 -99
- package/dist/gomtmapi/zod.gen.js.map +1 -1
- package/dist/sbmng/@tanstack/react-query.gen.d.ts +146 -146
- package/dist/sbmng/@tanstack/react-query.gen.js +6 -6
- package/dist/sbmng/schemas.gen.d.ts +4 -4
- package/dist/sbmng/schemas.gen.js +4 -4
- package/dist/sbmng/schemas.gen.js.map +1 -1
- package/dist/sbmng/sdk.gen.d.ts +6 -6
- package/dist/sbmng/sdk.gen.js +6 -6
- package/dist/supabase/auth-provider.d.ts +8 -1
- package/dist/supabase/auth-provider.d.ts.map +1 -1
- package/dist/supabase/context.d.ts +3844 -1
- package/dist/supabase/context.d.ts.map +1 -1
- package/dist/supabase/cursor-pagination.d.ts +4 -4
- package/dist/supabase/cursor-pagination.js +4 -4
- package/dist/supabase/schema/index.d.ts +1 -11
- package/dist/supabase/schema/index.d.ts.map +1 -1
- package/dist/supabase/schema/index.js +1 -19
- package/dist/supabase/schema/index.js.map +1 -1
- package/dist/supabase/schema/system-config.d.ts +12 -0
- package/dist/supabase/schema/system-config.d.ts.map +1 -0
- package/dist/supabase/schema/system-config.js +22 -0
- package/dist/supabase/schema/system-config.js.map +1 -0
- package/dist/supabase/supabase-client.d.ts +1 -471
- package/dist/supabase/supabase-client.d.ts.map +1 -1
- package/dist/supabase/supabase.d.ts +44 -984
- package/dist/supabase/supabase.d.ts.map +1 -1
- package/dist/supabase/use-sb-query/use-rpc-mutation.d.ts +8 -8
- package/dist/supabase/use-sb-query/use-rpc-mutation.js +8 -8
- package/dist/types/contracts.d.ts +63 -0
- package/dist/types/contracts.d.ts.map +1 -0
- package/dist/types/contracts.js +17 -0
- package/dist/types/contracts.js.map +1 -0
- package/dist/types/database.schemas.d.ts +27 -626
- package/dist/types/database.schemas.d.ts.map +1 -1
- package/dist/types/database.schemas.js +0 -432
- package/dist/types/database.schemas.js.map +1 -1
- package/dist/types/database.types.d.ts +1 -476
- package/dist/types/database.types.d.ts.map +1 -1
- package/dist/types/database.types.js +0 -10
- package/dist/types/database.types.js.map +1 -1
- package/dist/types/index.d.ts +9 -25
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +3 -5
- package/dist/types/index.js.map +1 -1
- package/package.json +101 -105
- package/dist/cloud-account/platform-configs.d.ts +0 -64
- package/dist/cloud-account/platform-configs.d.ts.map +0 -1
- package/dist/cloud-account/platform-configs.js +0 -44
- package/dist/cloud-account/platform-configs.js.map +0 -1
- package/dist/lib/aisdk/types.d.ts +0 -3
- package/dist/lib/aisdk/types.d.ts.map +0 -1
- package/dist/lib/aisdk/types.js +0 -5
- package/dist/lib/aisdk/types.js.map +0 -1
- package/dist/lib/logger/index.d.ts +0 -22
- package/dist/lib/logger/index.d.ts.map +0 -1
- package/dist/lib/logger/index.js +0 -7
- package/dist/lib/logger/index.js.map +0 -1
- package/dist/lib/schema.d.ts +0 -43
- package/dist/lib/schema.d.ts.map +0 -1
- package/dist/lib/schema.js +0 -28
- package/dist/lib/schema.js.map +0 -1
- package/dist/mtgate_api/client/client.gen.d.ts +0 -3
- package/dist/mtgate_api/client/client.gen.d.ts.map +0 -1
- package/dist/mtgate_api/client/client.gen.js +0 -236
- package/dist/mtgate_api/client/client.gen.js.map +0 -1
- package/dist/mtgate_api/client/index.d.ts +0 -9
- package/dist/mtgate_api/client/index.d.ts.map +0 -1
- package/dist/mtgate_api/client/index.js +0 -7
- package/dist/mtgate_api/client/index.js.map +0 -1
- package/dist/mtgate_api/client/types.gen.d.ts +0 -118
- package/dist/mtgate_api/client/types.gen.d.ts.map +0 -1
- package/dist/mtgate_api/client/types.gen.js +0 -3
- package/dist/mtgate_api/client/types.gen.js.map +0 -1
- package/dist/mtgate_api/client/utils.gen.d.ts +0 -34
- package/dist/mtgate_api/client/utils.gen.d.ts.map +0 -1
- package/dist/mtgate_api/client/utils.gen.js +0 -232
- package/dist/mtgate_api/client/utils.gen.js.map +0 -1
- package/dist/mtgate_api/client.gen.d.ts +0 -13
- package/dist/mtgate_api/client.gen.d.ts.map +0 -1
- package/dist/mtgate_api/client.gen.js +0 -4
- package/dist/mtgate_api/client.gen.js.map +0 -1
- package/dist/mtgate_api/core/auth.gen.d.ts +0 -19
- package/dist/mtgate_api/core/auth.gen.d.ts.map +0 -1
- package/dist/mtgate_api/core/auth.gen.js +0 -15
- package/dist/mtgate_api/core/auth.gen.js.map +0 -1
- package/dist/mtgate_api/core/bodySerializer.gen.d.ts +0 -26
- package/dist/mtgate_api/core/bodySerializer.gen.d.ts.map +0 -1
- package/dist/mtgate_api/core/bodySerializer.gen.js +0 -58
- package/dist/mtgate_api/core/bodySerializer.gen.js.map +0 -1
- package/dist/mtgate_api/core/params.gen.d.ts +0 -44
- package/dist/mtgate_api/core/params.gen.d.ts.map +0 -1
- package/dist/mtgate_api/core/params.gen.js +0 -101
- package/dist/mtgate_api/core/params.gen.js.map +0 -1
- package/dist/mtgate_api/core/pathSerializer.gen.d.ts +0 -34
- package/dist/mtgate_api/core/pathSerializer.gen.d.ts.map +0 -1
- package/dist/mtgate_api/core/pathSerializer.gen.js +0 -115
- package/dist/mtgate_api/core/pathSerializer.gen.js.map +0 -1
- package/dist/mtgate_api/core/queryKeySerializer.gen.d.ts +0 -19
- package/dist/mtgate_api/core/queryKeySerializer.gen.d.ts.map +0 -1
- package/dist/mtgate_api/core/queryKeySerializer.gen.js +0 -100
- package/dist/mtgate_api/core/queryKeySerializer.gen.js.map +0 -1
- package/dist/mtgate_api/core/serverSentEvents.gen.d.ts +0 -72
- package/dist/mtgate_api/core/serverSentEvents.gen.d.ts.map +0 -1
- package/dist/mtgate_api/core/serverSentEvents.gen.js +0 -138
- package/dist/mtgate_api/core/serverSentEvents.gen.js.map +0 -1
- package/dist/mtgate_api/core/types.gen.d.ts +0 -79
- package/dist/mtgate_api/core/types.gen.d.ts.map +0 -1
- package/dist/mtgate_api/core/types.gen.js +0 -3
- package/dist/mtgate_api/core/types.gen.js.map +0 -1
- package/dist/mtgate_api/core/utils.gen.d.ts +0 -20
- package/dist/mtgate_api/core/utils.gen.d.ts.map +0 -1
- package/dist/mtgate_api/core/utils.gen.js +0 -88
- package/dist/mtgate_api/core/utils.gen.js.map +0 -1
- package/dist/mtgate_api/index.d.ts +0 -3
- package/dist/mtgate_api/index.d.ts.map +0 -1
- package/dist/mtgate_api/index.js +0 -3
- package/dist/mtgate_api/index.js.map +0 -1
- package/dist/mtgate_api/sdk.gen.d.ts +0 -15
- package/dist/mtgate_api/sdk.gen.d.ts.map +0 -1
- package/dist/mtgate_api/sdk.gen.js +0 -3
- package/dist/mtgate_api/sdk.gen.js.map +0 -1
- package/dist/mtgate_api/types.gen.d.ts +0 -4
- package/dist/mtgate_api/types.gen.d.ts.map +0 -1
- package/dist/mtgate_api/types.gen.js +0 -3
- package/dist/mtgate_api/types.gen.js.map +0 -1
- package/dist/openclaw/client-info.d.ts +0 -38
- package/dist/openclaw/client-info.d.ts.map +0 -1
- package/dist/openclaw/client-info.js +0 -38
- package/dist/openclaw/client-info.js.map +0 -1
- package/dist/openclaw/device-auth-utils.d.ts +0 -12
- package/dist/openclaw/device-auth-utils.d.ts.map +0 -1
- package/dist/openclaw/device-auth-utils.js +0 -16
- package/dist/openclaw/device-auth-utils.js.map +0 -1
- package/dist/openclaw/device-auth.d.ts +0 -21
- package/dist/openclaw/device-auth.d.ts.map +0 -1
- package/dist/openclaw/device-auth.js +0 -87
- package/dist/openclaw/device-auth.js.map +0 -1
- package/dist/openclaw/device-identity.d.ts +0 -8
- package/dist/openclaw/device-identity.d.ts.map +0 -1
- package/dist/openclaw/device-identity.js +0 -87
- package/dist/openclaw/device-identity.js.map +0 -1
- package/dist/openclaw/gateway.d.ts +0 -100
- package/dist/openclaw/gateway.d.ts.map +0 -1
- package/dist/openclaw/gateway.js +0 -302
- package/dist/openclaw/gateway.js.map +0 -1
- package/dist/openclaw/types.d.ts +0 -473
- package/dist/openclaw/types.d.ts.map +0 -1
- package/dist/openclaw/types.js +0 -2
- package/dist/openclaw/types.js.map +0 -1
- package/src/cloud-account/platform-configs.ts +0 -73
- package/src/gomtmapi/@tanstack/react-query.gen.ts +0 -537
- package/src/gomtmapi/client/client.gen.ts +0 -311
- package/src/gomtmapi/client/index.ts +0 -25
- package/src/gomtmapi/client/types.gen.ts +0 -241
- package/src/gomtmapi/client/utils.gen.ts +0 -332
- package/src/gomtmapi/client.gen.ts +0 -16
- package/src/gomtmapi/core/auth.gen.ts +0 -42
- package/src/gomtmapi/core/bodySerializer.gen.ts +0 -100
- package/src/gomtmapi/core/params.gen.ts +0 -176
- package/src/gomtmapi/core/pathSerializer.gen.ts +0 -181
- package/src/gomtmapi/core/queryKeySerializer.gen.ts +0 -136
- package/src/gomtmapi/core/serverSentEvents.gen.ts +0 -266
- package/src/gomtmapi/core/types.gen.ts +0 -118
- package/src/gomtmapi/core/utils.gen.ts +0 -143
- package/src/gomtmapi/index.ts +0 -4
- package/src/gomtmapi/schemas.gen.ts +0 -532
- package/src/gomtmapi/sdk.gen.ts +0 -371
- package/src/gomtmapi/types.gen.ts +0 -854
- package/src/gomtmapi/zod.gen.ts +0 -448
- package/src/index.ts +0 -4
- package/src/lib/aisdk/types.ts +0 -8
- package/src/lib/logger/index.ts +0 -8
- package/src/lib/schema.ts +0 -37
- package/src/mtgate_api/client/client.gen.ts +0 -311
- package/src/mtgate_api/client/index.ts +0 -25
- package/src/mtgate_api/client/types.gen.ts +0 -241
- package/src/mtgate_api/client/utils.gen.ts +0 -332
- package/src/mtgate_api/client.gen.ts +0 -16
- package/src/mtgate_api/core/auth.gen.ts +0 -42
- package/src/mtgate_api/core/bodySerializer.gen.ts +0 -100
- package/src/mtgate_api/core/params.gen.ts +0 -176
- package/src/mtgate_api/core/pathSerializer.gen.ts +0 -181
- package/src/mtgate_api/core/queryKeySerializer.gen.ts +0 -136
- package/src/mtgate_api/core/serverSentEvents.gen.ts +0 -266
- package/src/mtgate_api/core/types.gen.ts +0 -118
- package/src/mtgate_api/core/utils.gen.ts +0 -143
- package/src/mtgate_api/index.ts +0 -4
- package/src/mtgate_api/sdk.gen.ts +0 -17
- package/src/mtgate_api/types.gen.ts +0 -5
- package/src/openclaw/client-info.ts +0 -54
- package/src/openclaw/device-auth-utils.ts +0 -26
- package/src/openclaw/device-auth.ts +0 -99
- package/src/openclaw/device-identity.ts +0 -108
- package/src/openclaw/gateway.ts +0 -392
- package/src/openclaw/types.ts +0 -518
- package/src/sbmng/@tanstack/react-query.gen.ts +0 -2967
- package/src/sbmng/client/client.gen.ts +0 -311
- package/src/sbmng/client/index.ts +0 -25
- package/src/sbmng/client/types.gen.ts +0 -241
- package/src/sbmng/client/utils.gen.ts +0 -332
- package/src/sbmng/client.gen.ts +0 -16
- package/src/sbmng/core/auth.gen.ts +0 -42
- package/src/sbmng/core/bodySerializer.gen.ts +0 -100
- package/src/sbmng/core/params.gen.ts +0 -176
- package/src/sbmng/core/pathSerializer.gen.ts +0 -181
- package/src/sbmng/core/queryKeySerializer.gen.ts +0 -136
- package/src/sbmng/core/serverSentEvents.gen.ts +0 -266
- package/src/sbmng/core/types.gen.ts +0 -118
- package/src/sbmng/core/utils.gen.ts +0 -143
- package/src/sbmng/index.ts +0 -4
- package/src/sbmng/schemas.gen.ts +0 -9671
- package/src/sbmng/sdk.gen.ts +0 -1755
- package/src/sbmng/types.gen.ts +0 -7886
- package/src/supabase/auth-provider.tsx +0 -67
- package/src/supabase/context.tsx +0 -51
- package/src/supabase/cursor-pagination.ts +0 -155
- package/src/supabase/schema/browser.ts +0 -45
- package/src/supabase/schema/index.ts +0 -25
- package/src/supabase/supabase-client.ts +0 -30
- package/src/supabase/supabase.ts +0 -67
- package/src/supabase/use-sb-query/build-query-opts.ts +0 -68
- package/src/supabase/use-sb-query/key.ts +0 -57
- package/src/supabase/use-sb-query/use-query.ts +0 -352
- package/src/supabase/use-sb-query/use-rpc-mutation.ts +0 -83
- package/src/supabase/use-sb-query/use-rpc-query.ts +0 -267
- package/src/supabase/utils.ts +0 -75
- package/src/types/database.schemas.ts +0 -4359
- package/src/types/database.types.ts +0 -4182
- package/src/types/index.ts +0 -85
|
@@ -1,267 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 简化版的 Supabase RPC 查询 Hook
|
|
3
|
-
* 自动处理 Supabase Client 的获取,无需手动调用 useSupabaseBrowser()
|
|
4
|
-
*
|
|
5
|
-
* 使用示例:
|
|
6
|
-
* ```tsx
|
|
7
|
-
* // 方式1: 自动推断类型
|
|
8
|
-
* const query1 = useRpcQuery("dash_navitems_list", { p_location: "sidebar_admin" });
|
|
9
|
-
*
|
|
10
|
-
* // 方式2: 使用 Zod Schema 进行类型验证和推断 (推荐)
|
|
11
|
-
* const navItemSchema = z.object({ label: z.string(), url: z.string().optional() });
|
|
12
|
-
* const query2 = useRpcQuery("dash_navitems_list", { p_location: "sidebar_admin" }, {
|
|
13
|
-
* schema: z.object({ rows: z.array(navItemSchema) })
|
|
14
|
-
* });
|
|
15
|
-
* // data 的类型为 { rows: { label: string; url?: string }[] } | undefined
|
|
16
|
-
*
|
|
17
|
-
* // 方式3: 显式泛型指定返回类型
|
|
18
|
-
* type NavItem = { label: string; url?: string };
|
|
19
|
-
* const query3 = useRpcQuery<NavItem[]>("dash_navitems_list", { p_location: "sidebar_admin" });
|
|
20
|
-
* ```
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
import { useMemo } from "react";
|
|
24
|
-
import type { PostgrestError } from "@supabase/postgrest-js";
|
|
25
|
-
import type { z } from "zod";
|
|
26
|
-
import type { SBFunctions } from "../../types";
|
|
27
|
-
import { useSupabaseBrowser } from "../context";
|
|
28
|
-
import {
|
|
29
|
-
KEY_PREFIX,
|
|
30
|
-
type UseQueryAnyReturn,
|
|
31
|
-
useSbQuery,
|
|
32
|
-
useSbSuspenseQuery,
|
|
33
|
-
} from "./use-query";
|
|
34
|
-
|
|
35
|
-
/** 从 SBFunctions 中提取 RPC 函数名的类型 */
|
|
36
|
-
export type RPCFunctionName = keyof SBFunctions;
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* 获取 RPC 查询的通用 Query Key 前缀 (用于 invalidation)
|
|
40
|
-
* 对应 supabase-cache-helpers 生成的 key 结构: ['postgrest', 'null'|'page', schema, table|rpc, ...]
|
|
41
|
-
*
|
|
42
|
-
* @param functionName RPC 函数名
|
|
43
|
-
* @returns Standard Query Key Prefix e.g. ["postgrest", "null", "public", "function_name"]
|
|
44
|
-
*/
|
|
45
|
-
export function getRpcQueryKey(functionName: string): string[] {
|
|
46
|
-
// 默认 schema 为 public, infinite prefix 默认为 "null" (即使是 infinite query, invalidate prefix 通常也能匹配?)
|
|
47
|
-
// 注意: explicit invalidation 最好匹配 prefix.
|
|
48
|
-
// supabase-cache-helpers 的 getSbTableKey 返回的是 4 个元素
|
|
49
|
-
// 注: 对于 RPC,表名解析为 rpc/名称
|
|
50
|
-
return [KEY_PREFIX, "null", "public", `rpc/${functionName}`];
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/** 提取指定 RPC 函数的参数类型 */
|
|
54
|
-
export type RPCFunctionArgs<T extends RPCFunctionName> = SBFunctions[T]["Args"] extends never
|
|
55
|
-
? Record<string, never>
|
|
56
|
-
: SBFunctions[T]["Args"];
|
|
57
|
-
|
|
58
|
-
/** 提取指定 RPC 函数的返回类型 */
|
|
59
|
-
export type RPCFunctionReturns<T extends RPCFunctionName> = SBFunctions[T]["Returns"];
|
|
60
|
-
|
|
61
|
-
type RpcExtraQueryOptions<TSchema extends z.ZodTypeAny | undefined = undefined> = {
|
|
62
|
-
/**
|
|
63
|
-
* 可选的 Zod Schema 用于验证和推断返回类型
|
|
64
|
-
* 当传入时,将自动验证数据并从 schema 推断类型
|
|
65
|
-
*
|
|
66
|
-
* @example
|
|
67
|
-
* ```tsx
|
|
68
|
-
* const navItemSchema = z.object({ label: z.string(), url: z.string().optional() });
|
|
69
|
-
* const resultSchema = z.object({ rows: z.array(navItemSchema), meta: z.any() });
|
|
70
|
-
*
|
|
71
|
-
* const { data } = useRpcQuery("dash_navitems_list", { p_location: "sidebar_admin" }, {
|
|
72
|
-
* schema: resultSchema
|
|
73
|
-
* });
|
|
74
|
-
* // data 类型自动推断为 { rows: { label: string; url?: string }[]; meta: any } | undefined
|
|
75
|
-
* ```
|
|
76
|
-
*/
|
|
77
|
-
schema?: TSchema;
|
|
78
|
-
queryKeySuffix?: readonly unknown[];
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
type RpcQueryOptions<TSchema extends z.ZodTypeAny | undefined = undefined> = RpcExtraQueryOptions<TSchema> &
|
|
82
|
-
Record<string, unknown>;
|
|
83
|
-
|
|
84
|
-
type RpcSuspenseQueryOptions<TSchema extends z.ZodTypeAny | undefined = undefined> = RpcExtraQueryOptions<TSchema> &
|
|
85
|
-
Record<string, unknown>;
|
|
86
|
-
|
|
87
|
-
type UseRpcSchemaQueryReturn<TData> = Omit<UseQueryAnyReturn<unknown>, "data" | "error"> & {
|
|
88
|
-
data: TData | undefined;
|
|
89
|
-
error: PostgrestError | RpcSchemaValidationError | null;
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
class RpcSchemaValidationError extends Error {
|
|
93
|
-
readonly functionName: RPCFunctionName;
|
|
94
|
-
readonly originalError: Error;
|
|
95
|
-
|
|
96
|
-
constructor(functionName: RPCFunctionName, error: Error) {
|
|
97
|
-
super(`[${String(functionName)}] RPC 响应不符合 schema: ${error.message}`);
|
|
98
|
-
this.name = "RpcSchemaValidationError";
|
|
99
|
-
this.functionName = functionName;
|
|
100
|
-
this.originalError = error;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
function validateRpcData<TSchema extends z.ZodTypeAny>(
|
|
105
|
-
hookName: "useRpcQuery" | "useRpcSuspenseQuery",
|
|
106
|
-
functionName: RPCFunctionName,
|
|
107
|
-
schema: TSchema,
|
|
108
|
-
data: unknown,
|
|
109
|
-
): { success: true; data: z.infer<TSchema> } | { success: false; error: RpcSchemaValidationError } {
|
|
110
|
-
const result = schema.safeParse(data);
|
|
111
|
-
if (result.success) {
|
|
112
|
-
return {
|
|
113
|
-
success: true,
|
|
114
|
-
data: result.data,
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
console.error(`[${hookName}] Schema validation failed for ${String(functionName)}:`, result.error);
|
|
119
|
-
return {
|
|
120
|
-
success: false,
|
|
121
|
-
error: new RpcSchemaValidationError(functionName, result.error),
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* 基于 RPC 函数名和参数进行查询的 Hook (普通模式)
|
|
127
|
-
*
|
|
128
|
-
* @template TData 返回数据类型(显式指定或从数据库函数推断)
|
|
129
|
-
* @param functionName RPC 函数名
|
|
130
|
-
* @param args RPC 函数参数
|
|
131
|
-
* @param options 配置选项,包含 React Query 配置和可选的 schema
|
|
132
|
-
* @returns 查询结果
|
|
133
|
-
*
|
|
134
|
-
* @example
|
|
135
|
-
* ```tsx
|
|
136
|
-
* // 示例1: 基础使用(自动推断)
|
|
137
|
-
* const { data } = useRpcQuery("sys_config_get", { p_key: "github_app" });
|
|
138
|
-
*
|
|
139
|
-
* // 示例2: 使用 Zod Schema(推荐)
|
|
140
|
-
* const navItemSchema = z.object({ label: z.string(), url: z.string().optional() });
|
|
141
|
-
* const { data } = useRpcQuery("dash_navitems_list", { p_location: "sidebar_admin" }, {
|
|
142
|
-
* schema: z.object({ rows: z.array(navItemSchema), meta: z.any() })
|
|
143
|
-
* });
|
|
144
|
-
*
|
|
145
|
-
* // 示例3: 显式泛型
|
|
146
|
-
* type NavItem = { label: string; url?: string };
|
|
147
|
-
* const { data } = useRpcQuery<NavItem[]>("dash_navitems_list", { p_location: "sidebar_admin" });
|
|
148
|
-
* ```
|
|
149
|
-
*/
|
|
150
|
-
// Overload 1: Schema provided -> Infer TData from Schema
|
|
151
|
-
export function useRpcQuery<TFunc extends RPCFunctionName, TSchema extends z.ZodTypeAny>(
|
|
152
|
-
functionName: TFunc,
|
|
153
|
-
args: RPCFunctionArgs<TFunc> | undefined,
|
|
154
|
-
options: RpcQueryOptions<TSchema> & { schema: TSchema },
|
|
155
|
-
): UseRpcSchemaQueryReturn<z.infer<TSchema>>;
|
|
156
|
-
|
|
157
|
-
// Overload 2: No schema provided -> Infer TData from Generic (defaulting to RPC return)
|
|
158
|
-
export function useRpcQuery<TFunc extends RPCFunctionName, TData = RPCFunctionReturns<TFunc>>(
|
|
159
|
-
functionName: TFunc,
|
|
160
|
-
args?: RPCFunctionArgs<TFunc>,
|
|
161
|
-
options?: RpcQueryOptions<undefined> & { schema?: undefined },
|
|
162
|
-
): UseQueryAnyReturn<TData>;
|
|
163
|
-
|
|
164
|
-
export function useRpcQuery<TFunc extends RPCFunctionName, TData = RPCFunctionReturns<TFunc>>(
|
|
165
|
-
functionName: TFunc,
|
|
166
|
-
args?: RPCFunctionArgs<TFunc>,
|
|
167
|
-
options?: RpcQueryOptions,
|
|
168
|
-
): UseQueryAnyReturn<TData> {
|
|
169
|
-
const sb = useSupabaseBrowser();
|
|
170
|
-
const query = sb.rpc(functionName, args as never);
|
|
171
|
-
|
|
172
|
-
const { schema, ...reactQueryConfig } = options || {};
|
|
173
|
-
|
|
174
|
-
// biome-ignore lint/suspicious/noExplicitAny: 绕过 Supabase 内部类型系统
|
|
175
|
-
const baseResult = useSbQuery(query as any, reactQueryConfig as any);
|
|
176
|
-
|
|
177
|
-
// 如果提供了 schema,对数据进行验证和转换
|
|
178
|
-
const transformedResult = useMemo(() => {
|
|
179
|
-
if (!schema || baseResult.error || baseResult.data === undefined) {
|
|
180
|
-
return baseResult;
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
const validationResult = validateRpcData("useRpcQuery", functionName, schema, baseResult.data);
|
|
184
|
-
if (validationResult.success) {
|
|
185
|
-
return {
|
|
186
|
-
...baseResult,
|
|
187
|
-
data: validationResult.data as TData,
|
|
188
|
-
};
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
return {
|
|
192
|
-
...baseResult,
|
|
193
|
-
data: undefined,
|
|
194
|
-
error: validationResult.error,
|
|
195
|
-
isError: true,
|
|
196
|
-
isSuccess: false,
|
|
197
|
-
status: "error",
|
|
198
|
-
} as unknown as UseQueryAnyReturn<TData>;
|
|
199
|
-
}, [schema, baseResult, functionName]);
|
|
200
|
-
|
|
201
|
-
return transformedResult as UseQueryAnyReturn<TData>;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
/**
|
|
205
|
-
* 基于 RPC 函数名和参数进行查询的 Hook (Suspense 模式)
|
|
206
|
-
*
|
|
207
|
-
* @template TData 返回数据类型(通过 schema 或泛型指定)
|
|
208
|
-
* @param functionName RPC 函数名
|
|
209
|
-
* @param args RPC 函数参数
|
|
210
|
-
* @param options 配置选项
|
|
211
|
-
* @returns Suspense 查询结果
|
|
212
|
-
*
|
|
213
|
-
* @example
|
|
214
|
-
* ```tsx
|
|
215
|
-
* const navItemSchema = z.object({ label: z.string(), url: z.string().optional() });
|
|
216
|
-
* const { data } = useRpcSuspenseQuery("dash_navitems_list", { p_location: "sidebar_admin" }, {
|
|
217
|
-
* schema: z.object({ rows: z.array(navItemSchema) })
|
|
218
|
-
* });
|
|
219
|
-
* // data 类型: { rows: { label: string; url?: string }[] }
|
|
220
|
-
* ```
|
|
221
|
-
*/
|
|
222
|
-
// Overload 1: Schema provided
|
|
223
|
-
export function useRpcSuspenseQuery<TFunc extends RPCFunctionName, TSchema extends z.ZodTypeAny>(
|
|
224
|
-
functionName: TFunc,
|
|
225
|
-
args: RPCFunctionArgs<TFunc> | undefined,
|
|
226
|
-
options: RpcSuspenseQueryOptions<TSchema> & { schema: TSchema },
|
|
227
|
-
): { data: z.infer<TSchema>; [key: string]: unknown };
|
|
228
|
-
|
|
229
|
-
// Overload 2: No schema
|
|
230
|
-
export function useRpcSuspenseQuery<TFunc extends RPCFunctionName, TData = RPCFunctionReturns<TFunc>>(
|
|
231
|
-
functionName: TFunc,
|
|
232
|
-
args?: RPCFunctionArgs<TFunc>,
|
|
233
|
-
options?: RpcSuspenseQueryOptions<undefined> & { schema?: undefined },
|
|
234
|
-
): { data: TData; [key: string]: unknown };
|
|
235
|
-
|
|
236
|
-
export function useRpcSuspenseQuery<TFunc extends RPCFunctionName, TData = RPCFunctionReturns<TFunc>>(
|
|
237
|
-
functionName: TFunc,
|
|
238
|
-
args?: RPCFunctionArgs<TFunc>,
|
|
239
|
-
options?: RpcSuspenseQueryOptions,
|
|
240
|
-
): { data: TData; [key: string]: unknown } {
|
|
241
|
-
const sb = useSupabaseBrowser();
|
|
242
|
-
const query = sb.rpc(functionName, args as never);
|
|
243
|
-
|
|
244
|
-
const { schema, ...reactQueryConfig } = options || {};
|
|
245
|
-
|
|
246
|
-
// biome-ignore lint/suspicious/noExplicitAny: 绕过 Supabase 内部类型系统
|
|
247
|
-
const baseResult = useSbSuspenseQuery(query as any, reactQueryConfig as any);
|
|
248
|
-
|
|
249
|
-
// 如果提供了 schema,对数据进行验证和转换
|
|
250
|
-
const transformedData = useMemo(() => {
|
|
251
|
-
if (!schema) {
|
|
252
|
-
return baseResult.data as TData;
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
const validationResult = validateRpcData("useRpcSuspenseQuery", functionName, schema, baseResult.data);
|
|
256
|
-
if (!validationResult.success) {
|
|
257
|
-
throw validationResult.error;
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
return validationResult.data as TData;
|
|
261
|
-
}, [schema, baseResult.data, functionName]);
|
|
262
|
-
|
|
263
|
-
return {
|
|
264
|
-
...baseResult,
|
|
265
|
-
data: transformedData,
|
|
266
|
-
} as { data: TData; [key: string]: unknown };
|
|
267
|
-
}
|
package/src/supabase/utils.ts
DELETED
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
// --- 类型工具定义开始 ---
|
|
2
|
-
|
|
3
|
-
import type { SBFunctions, TypedSupabaseClient } from "../types";
|
|
4
|
-
|
|
5
|
-
export type SnakeCase<S extends string> = S extends `${infer T}${infer U}`
|
|
6
|
-
? `${T extends Uncapitalize<T> ? T : `_${Lowercase<T>}`}${SnakeCase<U>}`
|
|
7
|
-
: S;
|
|
8
|
-
|
|
9
|
-
export type DbFunctionParams<T> = {
|
|
10
|
-
// 遍历 Key -> 转换为 snake_case -> 添加 p_ 前缀
|
|
11
|
-
[K in keyof T as `p_${SnakeCase<string & K>}`]: T[K];
|
|
12
|
-
};
|
|
13
|
-
const toSnakeCase = (str: string) => {
|
|
14
|
-
return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
|
|
15
|
-
};
|
|
16
|
-
/**
|
|
17
|
-
* 实用工具, 将参数的名称,添加"p_"前缀,并且以"snake_case"的方式转换参数名称.
|
|
18
|
-
* 原因是 postgresql 函数,都约定了这样的参数形式.
|
|
19
|
-
*
|
|
20
|
-
* Input: { chatId: string } -> Output Type: { p_chat_id: string }
|
|
21
|
-
* Input: { chat_id: string } -> Output Type: { p_chat_id: string }
|
|
22
|
-
*/
|
|
23
|
-
export const convertToDbFunctionParams = <InputT extends Record<string, any>>(
|
|
24
|
-
input: InputT,
|
|
25
|
-
): DbFunctionParams<InputT> => {
|
|
26
|
-
const result: Record<string, any> = {};
|
|
27
|
-
|
|
28
|
-
// biome-ignore lint/complexity/noForEach: .
|
|
29
|
-
Object.entries(input).forEach(([key, value]) => {
|
|
30
|
-
const snakeKey = toSnakeCase(key);
|
|
31
|
-
const newKey = `p_${snakeKey}`;
|
|
32
|
-
result[newKey] = value;
|
|
33
|
-
});
|
|
34
|
-
return result as DbFunctionParams<InputT>;
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
export const sbRpc = async <
|
|
38
|
-
TRpcName extends keyof SBFunctions,
|
|
39
|
-
TInput extends Record<string, any>,
|
|
40
|
-
>(
|
|
41
|
-
sb: TypedSupabaseClient,
|
|
42
|
-
rpcName: TRpcName,
|
|
43
|
-
|
|
44
|
-
// 3. 【核心黑魔法】在参数位置进行校验
|
|
45
|
-
// 我们允许传入 input: TInput
|
|
46
|
-
// 但是,我们附加了一个“条件类型”检查:
|
|
47
|
-
// 如果 "转换后的类型" (DbFunctionParams<TInput>) 不能赋值给 "数据库要求的类型" (SBFunctions[TRpcName]["Args"])
|
|
48
|
-
// 那么,我们将 input 的类型强制判定为 never (导致报错) 或者给出一个具体的错误提示类型。
|
|
49
|
-
input: TInput &
|
|
50
|
-
(DbFunctionParams<TInput> extends SBFunctions[TRpcName]["Args"]
|
|
51
|
-
? unknown // 如果匹配,啥也不做,类型检查通过
|
|
52
|
-
: // 如果不匹配,返回数据库需要的类型,这样 IDE 会提示缺少什么属性
|
|
53
|
-
SBFunctions[TRpcName]["Args"]),
|
|
54
|
-
// 或者更高级一点,返回一个去除 p_ 前缀的提示类型(取决于你的偏好)
|
|
55
|
-
) => {
|
|
56
|
-
return await sb.rpc(rpcName as any, convertToDbFunctionParams(input) as any);
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* 仅作为类型测试,用于确认 sbRpc 的正确实现.
|
|
62
|
-
* @param sb
|
|
63
|
-
* @returns
|
|
64
|
-
*/
|
|
65
|
-
export const sbRpcTesting = async (sb: TypedSupabaseClient) => {
|
|
66
|
-
//用例1: 正确的参数
|
|
67
|
-
await sbRpc(sb, "chat_message_list", { chat_id: "123" });
|
|
68
|
-
await sbRpc(sb, "chat_message_list", { p_chat_id: "123" });
|
|
69
|
-
await sbRpc(sb, "chat_message_list", { chatId: "123" });
|
|
70
|
-
// await sbRpc(sb, "chat_message_list", { ChatId: "123" });
|
|
71
|
-
|
|
72
|
-
//用例2: 以下应当出现类型错误
|
|
73
|
-
//不正确的参数名称
|
|
74
|
-
//await sbRpc(sb, "chat_message_list", { chat_id_xxxx: "123" });
|
|
75
|
-
};
|