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.
Files changed (250) hide show
  1. package/dist/gomtmapi/@tanstack/react-query.gen.d.ts +21 -173
  2. package/dist/gomtmapi/@tanstack/react-query.gen.d.ts.map +1 -1
  3. package/dist/gomtmapi/@tanstack/react-query.gen.js +39 -179
  4. package/dist/gomtmapi/@tanstack/react-query.gen.js.map +1 -1
  5. package/dist/gomtmapi/index.d.ts +2 -2
  6. package/dist/gomtmapi/index.d.ts.map +1 -1
  7. package/dist/gomtmapi/index.js +1 -1
  8. package/dist/gomtmapi/index.js.map +1 -1
  9. package/dist/gomtmapi/schemas.gen.d.ts +67 -81
  10. package/dist/gomtmapi/schemas.gen.d.ts.map +1 -1
  11. package/dist/gomtmapi/schemas.gen.js +68 -82
  12. package/dist/gomtmapi/schemas.gen.js.map +1 -1
  13. package/dist/gomtmapi/sdk.gen.d.ts +15 -95
  14. package/dist/gomtmapi/sdk.gen.d.ts.map +1 -1
  15. package/dist/gomtmapi/sdk.gen.js +22 -102
  16. package/dist/gomtmapi/sdk.gen.js.map +1 -1
  17. package/dist/gomtmapi/types.gen.d.ts +66 -209
  18. package/dist/gomtmapi/types.gen.d.ts.map +1 -1
  19. package/dist/gomtmapi/zod.gen.d.ts +48 -121
  20. package/dist/gomtmapi/zod.gen.d.ts.map +1 -1
  21. package/dist/gomtmapi/zod.gen.js +36 -99
  22. package/dist/gomtmapi/zod.gen.js.map +1 -1
  23. package/dist/sbmng/@tanstack/react-query.gen.d.ts +146 -146
  24. package/dist/sbmng/@tanstack/react-query.gen.js +6 -6
  25. package/dist/sbmng/schemas.gen.d.ts +4 -4
  26. package/dist/sbmng/schemas.gen.js +4 -4
  27. package/dist/sbmng/schemas.gen.js.map +1 -1
  28. package/dist/sbmng/sdk.gen.d.ts +6 -6
  29. package/dist/sbmng/sdk.gen.js +6 -6
  30. package/dist/supabase/auth-provider.d.ts +8 -1
  31. package/dist/supabase/auth-provider.d.ts.map +1 -1
  32. package/dist/supabase/context.d.ts +3844 -1
  33. package/dist/supabase/context.d.ts.map +1 -1
  34. package/dist/supabase/cursor-pagination.d.ts +4 -4
  35. package/dist/supabase/cursor-pagination.js +4 -4
  36. package/dist/supabase/schema/index.d.ts +1 -11
  37. package/dist/supabase/schema/index.d.ts.map +1 -1
  38. package/dist/supabase/schema/index.js +1 -19
  39. package/dist/supabase/schema/index.js.map +1 -1
  40. package/dist/supabase/schema/system-config.d.ts +12 -0
  41. package/dist/supabase/schema/system-config.d.ts.map +1 -0
  42. package/dist/supabase/schema/system-config.js +22 -0
  43. package/dist/supabase/schema/system-config.js.map +1 -0
  44. package/dist/supabase/supabase-client.d.ts +1 -471
  45. package/dist/supabase/supabase-client.d.ts.map +1 -1
  46. package/dist/supabase/supabase.d.ts +44 -984
  47. package/dist/supabase/supabase.d.ts.map +1 -1
  48. package/dist/supabase/use-sb-query/use-rpc-mutation.d.ts +8 -8
  49. package/dist/supabase/use-sb-query/use-rpc-mutation.js +8 -8
  50. package/dist/types/contracts.d.ts +63 -0
  51. package/dist/types/contracts.d.ts.map +1 -0
  52. package/dist/types/contracts.js +17 -0
  53. package/dist/types/contracts.js.map +1 -0
  54. package/dist/types/database.schemas.d.ts +27 -626
  55. package/dist/types/database.schemas.d.ts.map +1 -1
  56. package/dist/types/database.schemas.js +0 -432
  57. package/dist/types/database.schemas.js.map +1 -1
  58. package/dist/types/database.types.d.ts +1 -476
  59. package/dist/types/database.types.d.ts.map +1 -1
  60. package/dist/types/database.types.js +0 -10
  61. package/dist/types/database.types.js.map +1 -1
  62. package/dist/types/index.d.ts +9 -25
  63. package/dist/types/index.d.ts.map +1 -1
  64. package/dist/types/index.js +3 -5
  65. package/dist/types/index.js.map +1 -1
  66. package/package.json +101 -105
  67. package/dist/cloud-account/platform-configs.d.ts +0 -64
  68. package/dist/cloud-account/platform-configs.d.ts.map +0 -1
  69. package/dist/cloud-account/platform-configs.js +0 -44
  70. package/dist/cloud-account/platform-configs.js.map +0 -1
  71. package/dist/lib/aisdk/types.d.ts +0 -3
  72. package/dist/lib/aisdk/types.d.ts.map +0 -1
  73. package/dist/lib/aisdk/types.js +0 -5
  74. package/dist/lib/aisdk/types.js.map +0 -1
  75. package/dist/lib/logger/index.d.ts +0 -22
  76. package/dist/lib/logger/index.d.ts.map +0 -1
  77. package/dist/lib/logger/index.js +0 -7
  78. package/dist/lib/logger/index.js.map +0 -1
  79. package/dist/lib/schema.d.ts +0 -43
  80. package/dist/lib/schema.d.ts.map +0 -1
  81. package/dist/lib/schema.js +0 -28
  82. package/dist/lib/schema.js.map +0 -1
  83. package/dist/mtgate_api/client/client.gen.d.ts +0 -3
  84. package/dist/mtgate_api/client/client.gen.d.ts.map +0 -1
  85. package/dist/mtgate_api/client/client.gen.js +0 -236
  86. package/dist/mtgate_api/client/client.gen.js.map +0 -1
  87. package/dist/mtgate_api/client/index.d.ts +0 -9
  88. package/dist/mtgate_api/client/index.d.ts.map +0 -1
  89. package/dist/mtgate_api/client/index.js +0 -7
  90. package/dist/mtgate_api/client/index.js.map +0 -1
  91. package/dist/mtgate_api/client/types.gen.d.ts +0 -118
  92. package/dist/mtgate_api/client/types.gen.d.ts.map +0 -1
  93. package/dist/mtgate_api/client/types.gen.js +0 -3
  94. package/dist/mtgate_api/client/types.gen.js.map +0 -1
  95. package/dist/mtgate_api/client/utils.gen.d.ts +0 -34
  96. package/dist/mtgate_api/client/utils.gen.d.ts.map +0 -1
  97. package/dist/mtgate_api/client/utils.gen.js +0 -232
  98. package/dist/mtgate_api/client/utils.gen.js.map +0 -1
  99. package/dist/mtgate_api/client.gen.d.ts +0 -13
  100. package/dist/mtgate_api/client.gen.d.ts.map +0 -1
  101. package/dist/mtgate_api/client.gen.js +0 -4
  102. package/dist/mtgate_api/client.gen.js.map +0 -1
  103. package/dist/mtgate_api/core/auth.gen.d.ts +0 -19
  104. package/dist/mtgate_api/core/auth.gen.d.ts.map +0 -1
  105. package/dist/mtgate_api/core/auth.gen.js +0 -15
  106. package/dist/mtgate_api/core/auth.gen.js.map +0 -1
  107. package/dist/mtgate_api/core/bodySerializer.gen.d.ts +0 -26
  108. package/dist/mtgate_api/core/bodySerializer.gen.d.ts.map +0 -1
  109. package/dist/mtgate_api/core/bodySerializer.gen.js +0 -58
  110. package/dist/mtgate_api/core/bodySerializer.gen.js.map +0 -1
  111. package/dist/mtgate_api/core/params.gen.d.ts +0 -44
  112. package/dist/mtgate_api/core/params.gen.d.ts.map +0 -1
  113. package/dist/mtgate_api/core/params.gen.js +0 -101
  114. package/dist/mtgate_api/core/params.gen.js.map +0 -1
  115. package/dist/mtgate_api/core/pathSerializer.gen.d.ts +0 -34
  116. package/dist/mtgate_api/core/pathSerializer.gen.d.ts.map +0 -1
  117. package/dist/mtgate_api/core/pathSerializer.gen.js +0 -115
  118. package/dist/mtgate_api/core/pathSerializer.gen.js.map +0 -1
  119. package/dist/mtgate_api/core/queryKeySerializer.gen.d.ts +0 -19
  120. package/dist/mtgate_api/core/queryKeySerializer.gen.d.ts.map +0 -1
  121. package/dist/mtgate_api/core/queryKeySerializer.gen.js +0 -100
  122. package/dist/mtgate_api/core/queryKeySerializer.gen.js.map +0 -1
  123. package/dist/mtgate_api/core/serverSentEvents.gen.d.ts +0 -72
  124. package/dist/mtgate_api/core/serverSentEvents.gen.d.ts.map +0 -1
  125. package/dist/mtgate_api/core/serverSentEvents.gen.js +0 -138
  126. package/dist/mtgate_api/core/serverSentEvents.gen.js.map +0 -1
  127. package/dist/mtgate_api/core/types.gen.d.ts +0 -79
  128. package/dist/mtgate_api/core/types.gen.d.ts.map +0 -1
  129. package/dist/mtgate_api/core/types.gen.js +0 -3
  130. package/dist/mtgate_api/core/types.gen.js.map +0 -1
  131. package/dist/mtgate_api/core/utils.gen.d.ts +0 -20
  132. package/dist/mtgate_api/core/utils.gen.d.ts.map +0 -1
  133. package/dist/mtgate_api/core/utils.gen.js +0 -88
  134. package/dist/mtgate_api/core/utils.gen.js.map +0 -1
  135. package/dist/mtgate_api/index.d.ts +0 -3
  136. package/dist/mtgate_api/index.d.ts.map +0 -1
  137. package/dist/mtgate_api/index.js +0 -3
  138. package/dist/mtgate_api/index.js.map +0 -1
  139. package/dist/mtgate_api/sdk.gen.d.ts +0 -15
  140. package/dist/mtgate_api/sdk.gen.d.ts.map +0 -1
  141. package/dist/mtgate_api/sdk.gen.js +0 -3
  142. package/dist/mtgate_api/sdk.gen.js.map +0 -1
  143. package/dist/mtgate_api/types.gen.d.ts +0 -4
  144. package/dist/mtgate_api/types.gen.d.ts.map +0 -1
  145. package/dist/mtgate_api/types.gen.js +0 -3
  146. package/dist/mtgate_api/types.gen.js.map +0 -1
  147. package/dist/openclaw/client-info.d.ts +0 -38
  148. package/dist/openclaw/client-info.d.ts.map +0 -1
  149. package/dist/openclaw/client-info.js +0 -38
  150. package/dist/openclaw/client-info.js.map +0 -1
  151. package/dist/openclaw/device-auth-utils.d.ts +0 -12
  152. package/dist/openclaw/device-auth-utils.d.ts.map +0 -1
  153. package/dist/openclaw/device-auth-utils.js +0 -16
  154. package/dist/openclaw/device-auth-utils.js.map +0 -1
  155. package/dist/openclaw/device-auth.d.ts +0 -21
  156. package/dist/openclaw/device-auth.d.ts.map +0 -1
  157. package/dist/openclaw/device-auth.js +0 -87
  158. package/dist/openclaw/device-auth.js.map +0 -1
  159. package/dist/openclaw/device-identity.d.ts +0 -8
  160. package/dist/openclaw/device-identity.d.ts.map +0 -1
  161. package/dist/openclaw/device-identity.js +0 -87
  162. package/dist/openclaw/device-identity.js.map +0 -1
  163. package/dist/openclaw/gateway.d.ts +0 -100
  164. package/dist/openclaw/gateway.d.ts.map +0 -1
  165. package/dist/openclaw/gateway.js +0 -302
  166. package/dist/openclaw/gateway.js.map +0 -1
  167. package/dist/openclaw/types.d.ts +0 -473
  168. package/dist/openclaw/types.d.ts.map +0 -1
  169. package/dist/openclaw/types.js +0 -2
  170. package/dist/openclaw/types.js.map +0 -1
  171. package/src/cloud-account/platform-configs.ts +0 -73
  172. package/src/gomtmapi/@tanstack/react-query.gen.ts +0 -537
  173. package/src/gomtmapi/client/client.gen.ts +0 -311
  174. package/src/gomtmapi/client/index.ts +0 -25
  175. package/src/gomtmapi/client/types.gen.ts +0 -241
  176. package/src/gomtmapi/client/utils.gen.ts +0 -332
  177. package/src/gomtmapi/client.gen.ts +0 -16
  178. package/src/gomtmapi/core/auth.gen.ts +0 -42
  179. package/src/gomtmapi/core/bodySerializer.gen.ts +0 -100
  180. package/src/gomtmapi/core/params.gen.ts +0 -176
  181. package/src/gomtmapi/core/pathSerializer.gen.ts +0 -181
  182. package/src/gomtmapi/core/queryKeySerializer.gen.ts +0 -136
  183. package/src/gomtmapi/core/serverSentEvents.gen.ts +0 -266
  184. package/src/gomtmapi/core/types.gen.ts +0 -118
  185. package/src/gomtmapi/core/utils.gen.ts +0 -143
  186. package/src/gomtmapi/index.ts +0 -4
  187. package/src/gomtmapi/schemas.gen.ts +0 -532
  188. package/src/gomtmapi/sdk.gen.ts +0 -371
  189. package/src/gomtmapi/types.gen.ts +0 -854
  190. package/src/gomtmapi/zod.gen.ts +0 -448
  191. package/src/index.ts +0 -4
  192. package/src/lib/aisdk/types.ts +0 -8
  193. package/src/lib/logger/index.ts +0 -8
  194. package/src/lib/schema.ts +0 -37
  195. package/src/mtgate_api/client/client.gen.ts +0 -311
  196. package/src/mtgate_api/client/index.ts +0 -25
  197. package/src/mtgate_api/client/types.gen.ts +0 -241
  198. package/src/mtgate_api/client/utils.gen.ts +0 -332
  199. package/src/mtgate_api/client.gen.ts +0 -16
  200. package/src/mtgate_api/core/auth.gen.ts +0 -42
  201. package/src/mtgate_api/core/bodySerializer.gen.ts +0 -100
  202. package/src/mtgate_api/core/params.gen.ts +0 -176
  203. package/src/mtgate_api/core/pathSerializer.gen.ts +0 -181
  204. package/src/mtgate_api/core/queryKeySerializer.gen.ts +0 -136
  205. package/src/mtgate_api/core/serverSentEvents.gen.ts +0 -266
  206. package/src/mtgate_api/core/types.gen.ts +0 -118
  207. package/src/mtgate_api/core/utils.gen.ts +0 -143
  208. package/src/mtgate_api/index.ts +0 -4
  209. package/src/mtgate_api/sdk.gen.ts +0 -17
  210. package/src/mtgate_api/types.gen.ts +0 -5
  211. package/src/openclaw/client-info.ts +0 -54
  212. package/src/openclaw/device-auth-utils.ts +0 -26
  213. package/src/openclaw/device-auth.ts +0 -99
  214. package/src/openclaw/device-identity.ts +0 -108
  215. package/src/openclaw/gateway.ts +0 -392
  216. package/src/openclaw/types.ts +0 -518
  217. package/src/sbmng/@tanstack/react-query.gen.ts +0 -2967
  218. package/src/sbmng/client/client.gen.ts +0 -311
  219. package/src/sbmng/client/index.ts +0 -25
  220. package/src/sbmng/client/types.gen.ts +0 -241
  221. package/src/sbmng/client/utils.gen.ts +0 -332
  222. package/src/sbmng/client.gen.ts +0 -16
  223. package/src/sbmng/core/auth.gen.ts +0 -42
  224. package/src/sbmng/core/bodySerializer.gen.ts +0 -100
  225. package/src/sbmng/core/params.gen.ts +0 -176
  226. package/src/sbmng/core/pathSerializer.gen.ts +0 -181
  227. package/src/sbmng/core/queryKeySerializer.gen.ts +0 -136
  228. package/src/sbmng/core/serverSentEvents.gen.ts +0 -266
  229. package/src/sbmng/core/types.gen.ts +0 -118
  230. package/src/sbmng/core/utils.gen.ts +0 -143
  231. package/src/sbmng/index.ts +0 -4
  232. package/src/sbmng/schemas.gen.ts +0 -9671
  233. package/src/sbmng/sdk.gen.ts +0 -1755
  234. package/src/sbmng/types.gen.ts +0 -7886
  235. package/src/supabase/auth-provider.tsx +0 -67
  236. package/src/supabase/context.tsx +0 -51
  237. package/src/supabase/cursor-pagination.ts +0 -155
  238. package/src/supabase/schema/browser.ts +0 -45
  239. package/src/supabase/schema/index.ts +0 -25
  240. package/src/supabase/supabase-client.ts +0 -30
  241. package/src/supabase/supabase.ts +0 -67
  242. package/src/supabase/use-sb-query/build-query-opts.ts +0 -68
  243. package/src/supabase/use-sb-query/key.ts +0 -57
  244. package/src/supabase/use-sb-query/use-query.ts +0 -352
  245. package/src/supabase/use-sb-query/use-rpc-mutation.ts +0 -83
  246. package/src/supabase/use-sb-query/use-rpc-query.ts +0 -267
  247. package/src/supabase/utils.ts +0 -75
  248. package/src/types/database.schemas.ts +0 -4359
  249. package/src/types/database.types.ts +0 -4182
  250. 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
- }
@@ -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
- };