target-supabase-sdk 0.1.0

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 (138) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +70 -0
  3. package/dist/auth/auth.api.d.ts +28 -0
  4. package/dist/auth/auth.api.d.ts.map +1 -0
  5. package/dist/auth/auth.api.js +50 -0
  6. package/dist/auth/auth.api.js.map +1 -0
  7. package/dist/core.api.d.ts +68 -0
  8. package/dist/core.api.d.ts.map +1 -0
  9. package/dist/core.api.js +226 -0
  10. package/dist/core.api.js.map +1 -0
  11. package/dist/core.interface.d.ts +36 -0
  12. package/dist/core.interface.d.ts.map +1 -0
  13. package/dist/core.interface.js +46 -0
  14. package/dist/core.interface.js.map +1 -0
  15. package/dist/core.utils.d.ts +19 -0
  16. package/dist/core.utils.d.ts.map +1 -0
  17. package/dist/core.utils.js +86 -0
  18. package/dist/core.utils.js.map +1 -0
  19. package/dist/feed/feed.interface.d.ts +27 -0
  20. package/dist/feed/feed.interface.d.ts.map +1 -0
  21. package/dist/feed/feed.interface.js +17 -0
  22. package/dist/feed/feed.interface.js.map +1 -0
  23. package/dist/file/file-manager.d.ts +24 -0
  24. package/dist/file/file-manager.d.ts.map +1 -0
  25. package/dist/file/file-manager.js +109 -0
  26. package/dist/file/file-manager.js.map +1 -0
  27. package/dist/file/file.api.d.ts +15 -0
  28. package/dist/file/file.api.d.ts.map +1 -0
  29. package/dist/file/file.api.js +30 -0
  30. package/dist/file/file.api.js.map +1 -0
  31. package/dist/file/file.interface.d.ts +25 -0
  32. package/dist/file/file.interface.d.ts.map +1 -0
  33. package/dist/file/file.interface.js +9 -0
  34. package/dist/file/file.interface.js.map +1 -0
  35. package/dist/file-list/file-list.api.d.ts +15 -0
  36. package/dist/file-list/file-list.api.d.ts.map +1 -0
  37. package/dist/file-list/file-list.api.js +54 -0
  38. package/dist/file-list/file-list.api.js.map +1 -0
  39. package/dist/file-list/file-list.interface.d.ts +22 -0
  40. package/dist/file-list/file-list.interface.d.ts.map +1 -0
  41. package/dist/file-list/file-list.interface.js +5 -0
  42. package/dist/file-list/file-list.interface.js.map +1 -0
  43. package/dist/idea/idea.interface.d.ts +25 -0
  44. package/dist/idea/idea.interface.d.ts.map +1 -0
  45. package/dist/idea/idea.interface.js +15 -0
  46. package/dist/idea/idea.interface.js.map +1 -0
  47. package/dist/index.d.ts +33 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +28 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/link/link.interface.d.ts +18 -0
  52. package/dist/link/link.interface.d.ts.map +1 -0
  53. package/dist/link/link.interface.js +6 -0
  54. package/dist/link/link.interface.js.map +1 -0
  55. package/dist/parcel/parcel-manager.d.ts +39 -0
  56. package/dist/parcel/parcel-manager.d.ts.map +1 -0
  57. package/dist/parcel/parcel-manager.js +156 -0
  58. package/dist/parcel/parcel-manager.js.map +1 -0
  59. package/dist/parcel/parcel.interface.d.ts +34 -0
  60. package/dist/parcel/parcel.interface.d.ts.map +1 -0
  61. package/dist/parcel/parcel.interface.js +11 -0
  62. package/dist/parcel/parcel.interface.js.map +1 -0
  63. package/dist/question-list/question-list.api.d.ts +13 -0
  64. package/dist/question-list/question-list.api.d.ts.map +1 -0
  65. package/dist/question-list/question-list.api.js +35 -0
  66. package/dist/question-list/question-list.api.js.map +1 -0
  67. package/dist/question-list/question-list.interface.d.ts +18 -0
  68. package/dist/question-list/question-list.interface.d.ts.map +1 -0
  69. package/dist/question-list/question-list.interface.js +5 -0
  70. package/dist/question-list/question-list.interface.js.map +1 -0
  71. package/dist/review/review.api.d.ts +14 -0
  72. package/dist/review/review.api.d.ts.map +1 -0
  73. package/dist/review/review.api.js +133 -0
  74. package/dist/review/review.api.js.map +1 -0
  75. package/dist/review/review.interface.d.ts +24 -0
  76. package/dist/review/review.interface.d.ts.map +1 -0
  77. package/dist/review/review.interface.js +10 -0
  78. package/dist/review/review.interface.js.map +1 -0
  79. package/dist/review-v2/apis/post-review-setting.api.d.ts +12 -0
  80. package/dist/review-v2/apis/post-review-setting.api.d.ts.map +1 -0
  81. package/dist/review-v2/apis/post-review-setting.api.js +27 -0
  82. package/dist/review-v2/apis/post-review-setting.api.js.map +1 -0
  83. package/dist/review-v2/apis/post-review.api.d.ts +13 -0
  84. package/dist/review-v2/apis/post-review.api.d.ts.map +1 -0
  85. package/dist/review-v2/apis/post-review.api.js +46 -0
  86. package/dist/review-v2/apis/post-review.api.js.map +1 -0
  87. package/dist/review-v2/review-setting.interface.d.ts +23 -0
  88. package/dist/review-v2/review-setting.interface.d.ts.map +1 -0
  89. package/dist/review-v2/review-setting.interface.js +5 -0
  90. package/dist/review-v2/review-setting.interface.js.map +1 -0
  91. package/dist/review-v2/review.interface.d.ts +20 -0
  92. package/dist/review-v2/review.interface.d.ts.map +1 -0
  93. package/dist/review-v2/review.interface.js +5 -0
  94. package/dist/review-v2/review.interface.js.map +1 -0
  95. package/dist/service/api.interface.d.ts +35 -0
  96. package/dist/service/api.interface.d.ts.map +1 -0
  97. package/dist/service/api.interface.js +12 -0
  98. package/dist/service/api.interface.js.map +1 -0
  99. package/dist/service/base.interface.d.ts +83 -0
  100. package/dist/service/base.interface.d.ts.map +1 -0
  101. package/dist/service/base.interface.js +7 -0
  102. package/dist/service/base.interface.js.map +1 -0
  103. package/dist/service/service.interface.d.ts +24 -0
  104. package/dist/service/service.interface.d.ts.map +1 -0
  105. package/dist/service/service.interface.js +11 -0
  106. package/dist/service/service.interface.js.map +1 -0
  107. package/dist/supabase.d.ts +32 -0
  108. package/dist/supabase.d.ts.map +1 -0
  109. package/dist/supabase.js +100 -0
  110. package/dist/supabase.js.map +1 -0
  111. package/package.json +45 -0
  112. package/src/auth/auth.api.ts +85 -0
  113. package/src/core.api.ts +338 -0
  114. package/src/core.interface.ts +74 -0
  115. package/src/core.utils.ts +98 -0
  116. package/src/feed/feed.interface.ts +33 -0
  117. package/src/file/file-manager.ts +145 -0
  118. package/src/file/file.api.ts +43 -0
  119. package/src/file/file.interface.ts +30 -0
  120. package/src/file-list/file-list.api.ts +64 -0
  121. package/src/file-list/file-list.interface.ts +24 -0
  122. package/src/idea/idea.interface.ts +28 -0
  123. package/src/index.ts +50 -0
  124. package/src/link/link.interface.ts +21 -0
  125. package/src/parcel/parcel-manager.ts +209 -0
  126. package/src/parcel/parcel.interface.ts +40 -0
  127. package/src/question-list/question-list.api.ts +42 -0
  128. package/src/question-list/question-list.interface.ts +21 -0
  129. package/src/review/review.api.ts +145 -0
  130. package/src/review/review.interface.ts +26 -0
  131. package/src/review-v2/apis/post-review-setting.api.ts +35 -0
  132. package/src/review-v2/apis/post-review.api.ts +59 -0
  133. package/src/review-v2/review-setting.interface.ts +26 -0
  134. package/src/review-v2/review.interface.ts +23 -0
  135. package/src/service/api.interface.ts +47 -0
  136. package/src/service/base.interface.ts +97 -0
  137. package/src/service/service.interface.ts +27 -0
  138. package/src/supabase.ts +143 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 target-supabase-sdk contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,70 @@
1
+ # target-supabase-sdk
2
+
3
+ Supabase client initializer and data access APIs for Target-based backends.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ pnpm add target-supabase-sdk
9
+ ```
10
+
11
+ This package declares `@supabase/supabase-js`, `@supabase/postgrest-js`, and `lodash-es` as **peer dependencies** — your app must have them available at runtime, but they are not bundled into the SDK itself. This avoids duplicate Supabase client instances and lets you control dependency versions.
12
+
13
+ **pnpm 8+** and **npm 7+** usually auto-install missing peer dependencies, so the command above is often enough.
14
+
15
+ If you see peer dependency warnings or `Cannot find module` errors at runtime, install them explicitly:
16
+
17
+ ```bash
18
+ pnpm add target-supabase-sdk @supabase/supabase-js @supabase/postgrest-js lodash-es
19
+ ```
20
+
21
+ > `@supabase/postgrest-js` is also pulled in transitively by `@supabase/supabase-js`; it is listed here because the SDK uses its types directly (e.g. `PostgrestFilterBuilder`).
22
+
23
+ ## Environment Variables
24
+
25
+ Copy `.env.example` to `.env.local` and fill in your Supabase project values:
26
+
27
+ ```bash
28
+ cp .env.example .env.local
29
+ ```
30
+
31
+ | Variable | Required | Description |
32
+ |----------|----------|-------------|
33
+ | `VITE_SUPABASE_URL` | Yes | Main Supabase project URL |
34
+ | `VITE_SUPABASE_ANON_KEY` | Yes | Main project anon (public) key |
35
+ | `VITE_SUPABASE_NEED_AUTH_URL` | No | Separate auth project URL |
36
+ | `VITE_SUPABASE_NEED_AUTH_ANON_KEY` | No | Separate auth project anon key |
37
+
38
+ ### Security
39
+
40
+ - `VITE_*` variables are embedded in the client bundle at build time. Only use the **anon (public) key** — it is designed to be public when protected by Row Level Security (RLS).
41
+ - **Never** put the `service_role` key in a `VITE_*` variable or any frontend code. Use it only in trusted server-side environments.
42
+ - Do not commit `.env` or `.env.local`. They are gitignored; only `.env.example` (placeholders) should be tracked.
43
+ - Auth APIs return session tokens. Store them securely and never log them.
44
+
45
+ ## Usage
46
+
47
+ ```typescript
48
+ import { supabase, getTarget, loginUser } from "target-supabase-sdk";
49
+
50
+ await supabase.initialize({
51
+ supabaseUrl: import.meta.env.VITE_SUPABASE_URL,
52
+ supabaseAnonKey: import.meta.env.VITE_SUPABASE_ANON_KEY,
53
+ supabaseNeedAuthUrl: import.meta.env.VITE_SUPABASE_NEED_AUTH_URL,
54
+ supabaseNeedAuthAnonKey: import.meta.env.VITE_SUPABASE_NEED_AUTH_ANON_KEY,
55
+ });
56
+
57
+ const target = await getTarget({ id: "..." });
58
+ ```
59
+
60
+ ## Development
61
+
62
+ ```bash
63
+ pnpm install
64
+ pnpm build
65
+ pnpm dev
66
+ ```
67
+
68
+ ## License
69
+
70
+ MIT
@@ -0,0 +1,28 @@
1
+ export interface LoginPayload {
2
+ email: string;
3
+ password: string;
4
+ }
5
+ export interface RegisterPayload {
6
+ email: string;
7
+ password: string;
8
+ confirmPassword?: string;
9
+ }
10
+ export interface User {
11
+ id: string;
12
+ email: string;
13
+ created_at: string;
14
+ last_sign_in_at?: string;
15
+ }
16
+ export declare const registerUser: ({ email, password }: RegisterPayload) => Promise<import("..").SupabaseResponse<{
17
+ user: import("@supabase/supabase-js").AuthUser | null;
18
+ session: import("@supabase/supabase-js").AuthSession | null;
19
+ }>>;
20
+ export declare const loginUser: ({ email, password }: LoginPayload) => Promise<import("..").SupabaseResponse<{
21
+ user: import("@supabase/supabase-js").AuthUser;
22
+ session: import("@supabase/supabase-js").AuthSession;
23
+ weakPassword?: import("@supabase/supabase-js").WeakPassword;
24
+ }>>;
25
+ export declare const logoutUser: () => Promise<import("..").SupabaseResponse<unknown>>;
26
+ export declare const getCurrentUser: () => Promise<import("..").SupabaseResponse<User | null>>;
27
+ export declare const resetPassword: (email: string) => Promise<import("..").SupabaseResponse<unknown>>;
28
+ //# sourceMappingURL=auth.api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.api.d.ts","sourceRoot":"","sources":["../../src/auth/auth.api.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAGD,eAAO,MAAM,YAAY,wBAA+B,eAAe;;;GAWtE,CAAC;AAGF,eAAO,MAAM,SAAS,wBAA+B,YAAY;;;;GAWhE,CAAC;AAGF,eAAO,MAAM,UAAU,uDAQtB,CAAC;AAGF,eAAO,MAAM,cAAc,2DAW1B,CAAC;AAGF,eAAO,MAAM,aAAa,UAAiB,MAAM,oDAQhD,CAAC"}
@@ -0,0 +1,50 @@
1
+ import { supabase } from "..";
2
+ import { createResponse } from "../core.interface";
3
+ import { handleSupabaseError } from "../core.utils";
4
+ // 用户注册
5
+ export const registerUser = async ({ email, password }) => {
6
+ const { data, error } = await supabase.authClient.auth.signUp({
7
+ email,
8
+ password,
9
+ });
10
+ if (error) {
11
+ handleSupabaseError("registerUser", error, "Registration failed. Please try again.");
12
+ }
13
+ return createResponse.success(data);
14
+ };
15
+ // 用户登录
16
+ export const loginUser = async ({ email, password }) => {
17
+ const { data, error } = await supabase.authClient.auth.signInWithPassword({
18
+ email,
19
+ password,
20
+ });
21
+ if (error) {
22
+ handleSupabaseError("loginUser", error, "Login failed. Please check your credentials.");
23
+ }
24
+ return createResponse.success(data);
25
+ };
26
+ // 用户登出
27
+ export const logoutUser = async () => {
28
+ const { error } = await supabase.authClient.auth.signOut();
29
+ if (error) {
30
+ handleSupabaseError("logoutUser", error, "Logout failed.");
31
+ }
32
+ return createResponse.success();
33
+ };
34
+ // 获取当前用户
35
+ export const getCurrentUser = async () => {
36
+ const { data: { user }, error, } = await supabase.authClient.auth.getUser();
37
+ if (error) {
38
+ handleSupabaseError("getCurrentUser", error, "Failed to get current user.");
39
+ }
40
+ return createResponse.success(user);
41
+ };
42
+ // 重置密码
43
+ export const resetPassword = async (email) => {
44
+ const { error } = await supabase.authClient.auth.resetPasswordForEmail(email);
45
+ if (error) {
46
+ handleSupabaseError("resetPassword", error, "Password reset request failed.");
47
+ }
48
+ return createResponse.success();
49
+ };
50
+ //# sourceMappingURL=auth.api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.api.js","sourceRoot":"","sources":["../../src/auth/auth.api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAoBpD,OAAO;AACP,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAmB,EAAE,EAAE;IACzE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,UAAW,CAAC,IAAI,CAAC,MAAM,CAAC;QAC7D,KAAK;QACL,QAAQ;KACT,CAAC,CAAC;IAEH,IAAI,KAAK,EAAE,CAAC;QACV,mBAAmB,CAAC,cAAc,EAAE,KAAK,EAAE,wCAAwC,CAAC,CAAC;IACvF,CAAC;IAED,OAAO,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC,CAAC;AAEF,OAAO;AACP,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAgB,EAAE,EAAE;IACnE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,UAAW,CAAC,IAAI,CAAC,kBAAkB,CAAC;QACzE,KAAK;QACL,QAAQ;KACT,CAAC,CAAC;IAEH,IAAI,KAAK,EAAE,CAAC;QACV,mBAAmB,CAAC,WAAW,EAAE,KAAK,EAAE,8CAA8C,CAAC,CAAC;IAC1F,CAAC;IAED,OAAO,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC,CAAC;AAEF,OAAO;AACP,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;IACnC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,UAAW,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IAE5D,IAAI,KAAK,EAAE,CAAC;QACV,mBAAmB,CAAC,YAAY,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,cAAc,CAAC,OAAO,EAAE,CAAC;AAClC,CAAC,CAAC;AAEF,SAAS;AACT,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,IAAI,EAAE;IACvC,MAAM,EACJ,IAAI,EAAE,EAAE,IAAI,EAAE,EACd,KAAK,GACN,GAAG,MAAM,QAAQ,CAAC,UAAW,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IAE9C,IAAI,KAAK,EAAE,CAAC;QACV,mBAAmB,CAAC,gBAAgB,EAAE,KAAK,EAAE,6BAA6B,CAAC,CAAC;IAC9E,CAAC;IAED,OAAO,cAAc,CAAC,OAAO,CAAc,IAAmB,CAAC,CAAC;AAClE,CAAC,CAAC;AAEF,OAAO;AACP,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,KAAa,EAAE,EAAE;IACnD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,UAAW,CAAC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAE/E,IAAI,KAAK,EAAE,CAAC;QACV,mBAAmB,CAAC,eAAe,EAAE,KAAK,EAAE,gCAAgC,CAAC,CAAC;IAChF,CAAC;IAED,OAAO,cAAc,CAAC,OAAO,EAAE,CAAC;AAClC,CAAC,CAAC"}
@@ -0,0 +1,68 @@
1
+ import { Target } from "./core.interface";
2
+ import { BaseValidator } from "./core.utils";
3
+ import { PostgrestFilterBuilder } from "@supabase/postgrest-js";
4
+ export interface QueryFilter {
5
+ field: string;
6
+ operator: "eq";
7
+ value: unknown;
8
+ }
9
+ export interface QueryOrderBy {
10
+ field: string;
11
+ ascending: boolean;
12
+ }
13
+ export interface BaseQueryParams {
14
+ filterList?: QueryFilter[];
15
+ orderBy?: QueryOrderBy;
16
+ }
17
+ export declare const getTarget: ({ id, filterList }: {
18
+ id: string;
19
+ filterList?: QueryFilter[];
20
+ }) => Promise<import("./core.interface").SupabaseResponse<Target>>;
21
+ export declare const getPossibleTarget: ({ filterList }: {
22
+ filterList: QueryFilter[];
23
+ }) => Promise<import("./core.interface").SupabaseResponse<Target | null>>;
24
+ export interface GetTargetListParams extends BaseQueryParams {
25
+ pageNum: number;
26
+ pageSize: number;
27
+ category: Target["category"];
28
+ }
29
+ export declare const getTargetList: ({ pageNum, pageSize, category, filterList, orderBy, filterBuilder, }: GetTargetListParams & {
30
+ filterBuilder?: PostgrestFilterBuilder<any, any, any[], "target", unknown>;
31
+ }) => Promise<import("./core.interface").SupabaseResponse<Target[]>>;
32
+ export interface GetTargetTotalCountParams extends BaseQueryParams {
33
+ category: Target["category"];
34
+ filterBuilder?: PostgrestFilterBuilder<any, any, any[], "target", unknown>;
35
+ }
36
+ export declare const getTargetTotalCount: ({ category, filterList, filterBuilder, }: GetTargetTotalCountParams) => Promise<import("./core.interface").SupabaseResponse<number>>;
37
+ export declare const deleteTarget: ({ id, filterList }: {
38
+ id: string;
39
+ filterList?: QueryFilter[];
40
+ }) => Promise<import("./core.interface").SupabaseResponse<unknown>>;
41
+ export interface PostTargetPayload {
42
+ name: Target["name"];
43
+ category: Target["category"];
44
+ value: Target["value"];
45
+ tagList: Target["tagList"];
46
+ extra?: Target["extra"];
47
+ details?: Target["details"];
48
+ }
49
+ export declare const postTarget: (payload: PostTargetPayload) => Promise<import("./core.interface").SupabaseResponse<Target>>;
50
+ export interface PatchTargetPayload extends PostTargetPayload {
51
+ id: string;
52
+ }
53
+ export declare const patchTarget: ({ id, ...restPayload }: PatchTargetPayload) => Promise<import("./core.interface").SupabaseResponse<Target>>;
54
+ export declare const updateTargetDetails: <T, D>({ id, updateFn, beforeUpdateValidator, updateExtraFn, }: {
55
+ id: string;
56
+ updateFn: (existing: D) => D;
57
+ beforeUpdateValidator?: (existing: D) => true | string;
58
+ updateExtraFn?: (existing: D) => string;
59
+ }) => Promise<T>;
60
+ export declare const createTarget: <T extends Target, P extends object>({ payload, validator, createFn, checkRedundancyFilterList, upsert, }: {
61
+ payload: P;
62
+ validator?: new () => BaseValidator<P>;
63
+ createFn: (validPayload: P) => Omit<T, "id" | "created_at">;
64
+ checkRedundancyFilterList?: QueryFilter[];
65
+ upsert?: boolean;
66
+ }) => Promise<import("./core.interface").SupabaseResponse<T>>;
67
+ export declare function validateWith<P extends object, V extends BaseValidator<P>>(ValidatorClass: new () => V): <R>(fn: (validPayload: P) => R) => (payload: P) => R;
68
+ //# sourceMappingURL=core.api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.api.d.ts","sourceRoot":"","sources":["../src/core.api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,226 @@
1
+ import { pick } from "lodash-es";
2
+ import { createResponse } from "./core.interface";
3
+ import { supabase } from ".";
4
+ import { BaseValidator, handleSupabaseError } from "./core.utils";
5
+ export const getTarget = async ({ id, filterList }) => {
6
+ const query = filterList != null && filterList.length > 0
7
+ ? filterList.reduce((query, filter) => {
8
+ switch (filter.operator) {
9
+ case "eq":
10
+ return query.eq(filter.field, filter.value);
11
+ default:
12
+ return query;
13
+ }
14
+ }, supabase.client.from("target").select().eq("id", id))
15
+ : supabase.client.from("target").select().eq("id", id);
16
+ const { data, error } = await query.single();
17
+ if (error) {
18
+ handleSupabaseError("getTarget", error, "Failed to fetch target.");
19
+ }
20
+ return createResponse.success(data);
21
+ };
22
+ export const getPossibleTarget = async ({ filterList }) => {
23
+ const query = filterList.reduce((query, filter) => {
24
+ switch (filter.operator) {
25
+ case "eq":
26
+ return query.eq(filter.field, filter.value);
27
+ default:
28
+ return query;
29
+ }
30
+ }, supabase.client.from("target").select());
31
+ const { data, error } = await query.maybeSingle();
32
+ if (error) {
33
+ handleSupabaseError("getPossibleTarget", error, "Failed to fetch target.");
34
+ }
35
+ return createResponse.success(data);
36
+ };
37
+ export const getTargetList = async ({ pageNum, pageSize, category, filterList = [], orderBy = { field: "created_at", ascending: false }, filterBuilder, }) => {
38
+ const query = filterBuilder ??
39
+ filterList.reduce((query, filter) => {
40
+ switch (filter.operator) {
41
+ case "eq":
42
+ return query.eq(filter.field, filter.value);
43
+ default:
44
+ return query;
45
+ }
46
+ }, supabase.client.from("target").select("*").eq("category", category));
47
+ const { data, error } = await query
48
+ .order(orderBy.field, { ascending: orderBy.ascending })
49
+ .range(pageNum * pageSize, (pageNum + 1) * pageSize - 1);
50
+ if (error) {
51
+ handleSupabaseError("getTargetList", error, "Failed to fetch target list.");
52
+ }
53
+ return createResponse.success(data);
54
+ };
55
+ export const getTargetTotalCount = async ({ category, filterList = [], filterBuilder, }) => {
56
+ const query = filterBuilder ??
57
+ filterList.reduce((query, filter) => {
58
+ switch (filter.operator) {
59
+ case "eq":
60
+ return query.eq(filter.field, filter.value);
61
+ default:
62
+ return query;
63
+ }
64
+ }, supabase.client
65
+ .from("target")
66
+ .select("id", { count: "exact", head: true }) // head: true means no row payload
67
+ .eq("category", category));
68
+ const { count, error } = await query;
69
+ if (error) {
70
+ handleSupabaseError("getTargetTotalCount", error, "Failed to fetch target count.");
71
+ }
72
+ return createResponse.success(count ?? 0);
73
+ };
74
+ export const deleteTarget = async ({ id, filterList }) => {
75
+ // Check whether the target exists given filterList
76
+ if (filterList != null && filterList.length > 0) {
77
+ const query = filterList.reduce((query, filter) => {
78
+ switch (filter.operator) {
79
+ case "eq":
80
+ return query.eq(filter.field, filter.value);
81
+ default:
82
+ return query;
83
+ }
84
+ }, supabase.client.from("target").select().eq("id", id));
85
+ const { data: existingTarget, error: existingError } = await query.single();
86
+ if (existingError || existingTarget == null) {
87
+ const msg = `[deleteTarget] Cannot find the target ${id}`;
88
+ console.error(msg, { filterList }, existingError);
89
+ throw new Error(msg);
90
+ }
91
+ }
92
+ const { error } = await supabase.client.from("target").delete().eq("id", id);
93
+ if (error) {
94
+ handleSupabaseError("deleteTarget", error, `Failed to delete target ${id}.`);
95
+ }
96
+ return createResponse.success();
97
+ };
98
+ class PostTargetPayloadValidator extends BaseValidator {
99
+ requiredFields = ["category", "name", "value", "tagList"];
100
+ optionalFields = ["extra", "details"];
101
+ constructor() {
102
+ super();
103
+ // Add custom
104
+ this.addValidator((val) => {
105
+ return true;
106
+ });
107
+ }
108
+ }
109
+ export const postTarget = async (payload) => {
110
+ const validPayload = new PostTargetPayloadValidator().validate(payload);
111
+ const { data, error } = await supabase.client
112
+ .from("target")
113
+ .insert([{ ...validPayload }])
114
+ .select()
115
+ .single();
116
+ if (error) {
117
+ handleSupabaseError("postTarget", error, "Failed to create target.");
118
+ }
119
+ return createResponse.success(data);
120
+ };
121
+ export const patchTarget = async ({ id, ...restPayload }) => {
122
+ const { data: currentData, error: fetchError } = await supabase.client.from("target").select().eq("id", id).single();
123
+ if (!currentData) {
124
+ throw new Error("Target NOT exists");
125
+ }
126
+ if (fetchError)
127
+ handleSupabaseError("patchTarget", fetchError, "Failed to fetch target.");
128
+ const updatedTarget = new PostTargetPayloadValidator().validate(restPayload);
129
+ const { data, error } = await supabase.client
130
+ .from("target")
131
+ .update({
132
+ ...updatedTarget,
133
+ })
134
+ .eq("id", id)
135
+ .select()
136
+ .single();
137
+ if (error) {
138
+ handleSupabaseError("patchTarget", error, "Failed to update target.");
139
+ }
140
+ return createResponse.success(data);
141
+ };
142
+ export const updateTargetDetails = async ({ id, updateFn, beforeUpdateValidator = () => true, updateExtraFn, }) => {
143
+ const { data: currentData, error: fetchError } = await supabase.client
144
+ .from("target")
145
+ .select("details")
146
+ .eq("id", id)
147
+ .single();
148
+ if (!currentData) {
149
+ const msg = "[updateTargetDetails] Target NOT exists: " + id;
150
+ console.error(msg);
151
+ throw new Error(msg);
152
+ }
153
+ const currentDetails = currentData.details;
154
+ // Check before update
155
+ const validatorResult = beforeUpdateValidator(currentDetails);
156
+ if (validatorResult !== true) {
157
+ throw new Error("[updateTargetDetails] validation failed. " + validatorResult);
158
+ }
159
+ const updatedDetails = updateFn(currentDetails);
160
+ const updated = updateExtraFn == null
161
+ ? {
162
+ details: updatedDetails,
163
+ }
164
+ : {
165
+ details: updatedDetails,
166
+ extra: updateExtraFn(currentDetails),
167
+ };
168
+ const { data, error } = await supabase.client.from("target").update(updated).eq("id", id).select().single();
169
+ if (error)
170
+ handleSupabaseError("updateTargetDetails", error, "Failed to update target details.");
171
+ return data;
172
+ };
173
+ export const createTarget = async ({ payload, validator, createFn, checkRedundancyFilterList, upsert = false, }) => {
174
+ // (Optional)Step 1: validate payload
175
+ const validPayload = validator != null ? new validator().validate(payload) : payload;
176
+ // (Optional)Step 2: check redundancy
177
+ if (checkRedundancyFilterList != null && checkRedundancyFilterList.length > 0) {
178
+ const query = checkRedundancyFilterList.reduce((query, filter) => {
179
+ switch (filter.operator) {
180
+ case "eq":
181
+ return query.eq(filter.field, filter.value);
182
+ default:
183
+ return query;
184
+ }
185
+ }, supabase.client.from("target").select("id"));
186
+ const { data: existingTarget, error: existingError } = await query.maybeSingle();
187
+ if (existingError) {
188
+ handleSupabaseError("createTarget", existingError, "Failed to check target existence.");
189
+ }
190
+ if (existingTarget) {
191
+ if (upsert) {
192
+ const newTarget = createFn(validPayload);
193
+ const updated = pick(newTarget, ["category", "name", "value", "tagList", "extra", "details"]);
194
+ const { data, error } = await supabase.client
195
+ .from("target")
196
+ .update(updated)
197
+ .eq("id", existingTarget.id)
198
+ .select()
199
+ .single();
200
+ if (error) {
201
+ handleSupabaseError("createTarget", error, "Failed to update existing target.");
202
+ }
203
+ return createResponse.success(data);
204
+ }
205
+ const msg = "[createTarget] Target already exists";
206
+ console.error(msg, checkRedundancyFilterList);
207
+ throw new Error(msg);
208
+ }
209
+ }
210
+ // Step 3: create target
211
+ const newTarget = createFn(validPayload);
212
+ const { data, error } = await supabase.client.from("target").insert([newTarget]).select().single();
213
+ if (error) {
214
+ handleSupabaseError("createTarget", error, "Failed to create target.");
215
+ }
216
+ return createResponse.success(data);
217
+ };
218
+ export function validateWith(ValidatorClass) {
219
+ return (fn) => {
220
+ return (payload) => {
221
+ const validPayload = new ValidatorClass().validate(payload);
222
+ return fn(validPayload);
223
+ };
224
+ };
225
+ }
226
+ //# sourceMappingURL=core.api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.api.js","sourceRoot":"","sources":["../src/core.api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { PostgrestError } from "@supabase/supabase-js";
2
+ export interface Target {
3
+ id: string;
4
+ category: string;
5
+ name: string;
6
+ value: string;
7
+ tagList: string[];
8
+ extra?: string;
9
+ details?: unknown;
10
+ created_at: string;
11
+ }
12
+ export declare enum StatusCode {
13
+ SUCCESS = 200,
14
+ ERROR = 400
15
+ }
16
+ export interface SupabaseResponse<T = unknown> {
17
+ status_code: StatusCode;
18
+ success: boolean;
19
+ message?: string;
20
+ data?: T;
21
+ error?: {
22
+ message: string;
23
+ code?: string;
24
+ };
25
+ }
26
+ export declare const createResponse: {
27
+ success<T>(data?: T, message?: string): SupabaseResponse<T>;
28
+ error(message: string | {
29
+ key: string;
30
+ error: PostgrestError;
31
+ } | {
32
+ key: string;
33
+ error: string;
34
+ }, statusCode?: StatusCode, code?: string): SupabaseResponse;
35
+ };
36
+ //# sourceMappingURL=core.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.interface.d.ts","sourceRoot":"","sources":["../src/core.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,oBAAY,UAAU;IACpB,OAAO,MAAM;IACb,KAAK,MAAM;CACZ;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,OAAO;IAC3C,WAAW,EAAE,UAAU,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED,eAAO,MAAM,cAAc;YACjB,CAAC,SAAS,CAAC,YAAY,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC;mBAUhD,MAAM,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,cAAc,CAAA;KAAE,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,eAC5E,UAAU,SAChB,MAAM,GACZ,gBAAgB;CA8BpB,CAAC"}
@@ -0,0 +1,46 @@
1
+ export var StatusCode;
2
+ (function (StatusCode) {
3
+ StatusCode[StatusCode["SUCCESS"] = 200] = "SUCCESS";
4
+ StatusCode[StatusCode["ERROR"] = 400] = "ERROR";
5
+ })(StatusCode || (StatusCode = {}));
6
+ export const createResponse = {
7
+ success(data, message) {
8
+ return {
9
+ status_code: StatusCode.SUCCESS,
10
+ success: true,
11
+ message,
12
+ data,
13
+ };
14
+ },
15
+ error(message, statusCode, code) {
16
+ if (typeof message === "string") {
17
+ return {
18
+ status_code: statusCode ?? StatusCode.ERROR,
19
+ success: false,
20
+ error: {
21
+ message,
22
+ code,
23
+ },
24
+ };
25
+ }
26
+ if (typeof message?.error === "string") {
27
+ return {
28
+ status_code: statusCode ?? StatusCode.ERROR,
29
+ success: false,
30
+ error: {
31
+ message: `Error from ${message.key}: ${message.error}`,
32
+ code,
33
+ },
34
+ };
35
+ }
36
+ return {
37
+ status_code: statusCode ?? StatusCode.ERROR,
38
+ success: false,
39
+ error: {
40
+ message: `Error from ${message.key}: ${message?.error?.message}`,
41
+ code,
42
+ },
43
+ };
44
+ },
45
+ };
46
+ //# sourceMappingURL=core.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.interface.js","sourceRoot":"","sources":["../src/core.interface.ts"],"names":[],"mappings":"AAaA,MAAM,CAAN,IAAY,UAGX;AAHD,WAAY,UAAU;IACpB,mDAAa,CAAA;IACb,+CAAW,CAAA;AACb,CAAC,EAHW,UAAU,KAAV,UAAU,QAGrB;AAaD,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,OAAO,CAAI,IAAQ,EAAE,OAAgB;QACnC,OAAO;YACL,WAAW,EAAE,UAAU,CAAC,OAAO;YAC/B,OAAO,EAAE,IAAI;YACb,OAAO;YACP,IAAI;SACL,CAAC;IACJ,CAAC;IAED,KAAK,CACH,OAAyF,EACzF,UAAuB,EACvB,IAAa;QAEb,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO;gBACL,WAAW,EAAE,UAAU,IAAI,UAAU,CAAC,KAAK;gBAC3C,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE;oBACL,OAAO;oBACP,IAAI;iBACL;aACF,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,OAAO,EAAE,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvC,OAAO;gBACL,WAAW,EAAE,UAAU,IAAI,UAAU,CAAC,KAAK;gBAC3C,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE;oBACL,OAAO,EAAE,cAAc,OAAO,CAAC,GAAG,KAAK,OAAO,CAAC,KAAK,EAAE;oBACtD,IAAI;iBACL;aACF,CAAC;QACJ,CAAC;QACD,OAAO;YACL,WAAW,EAAE,UAAU,IAAI,UAAU,CAAC,KAAK;YAC3C,OAAO,EAAE,KAAK;YACd,KAAK,EAAE;gBACL,OAAO,EAAE,cAAc,OAAO,CAAC,GAAG,KAAK,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;gBAChE,IAAI;aACL;SACF,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,19 @@
1
+ /** True when running in a development build (Vite or Node). Defaults to false for safety. */
2
+ export declare function isDevEnvironment(): boolean;
3
+ export declare function logDev(...args: unknown[]): void;
4
+ export declare function logDevGroup(label: string, fn: () => void): void;
5
+ /** Log internal details, then throw a sanitized error safe to expose to callers. */
6
+ export declare function handleSupabaseError(context: string, error: unknown, publicMessage?: string): never;
7
+ /** Raw payload -> Available data */
8
+ export declare abstract class BaseValidator<T extends object> {
9
+ protected requiredFields: (keyof T)[];
10
+ protected optionalFields: (keyof T)[];
11
+ protected ignoredFields: (keyof T)[];
12
+ protected customValidators: ((val: T) => true | string)[];
13
+ /** @deprecated -> addCustomValidator */
14
+ addValidator(validator: (val: T) => true | string): this;
15
+ addCustomValidator(validator: (val: T) => true | string): this;
16
+ protected validateField(field: keyof T, value: unknown): boolean;
17
+ validate: (val: T) => T;
18
+ }
19
+ //# sourceMappingURL=core.utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.utils.d.ts","sourceRoot":"","sources":["../src/core.utils.ts"],"names":[],"mappings":"AAEA,6FAA6F;AAC7F,wBAAgB,gBAAgB,IAAI,OAAO,CAU1C;AAED,wBAAgB,MAAM,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAI/C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,CAQ/D;AAED,oFAAoF;AACpF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,KAAK,CAGlG;AAED,oCAAoC;AACpC,8BAAsB,aAAa,CAAC,CAAC,SAAS,MAAM;IAClD,SAAS,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAM;IAC3C,SAAS,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAM;IAC3C,SAAS,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAM;IAC1C,SAAS,CAAC,gBAAgB,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,GAAG,MAAM,CAAC,EAAE,CAAM;IAE/D,wCAAwC;IACxC,YAAY,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,GAAG,MAAM;IAKjD,kBAAkB,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,GAAG,MAAM;IAKvD,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO;IAKhE,QAAQ,QAAS,CAAC,KAAG,CAAC,CAoCpB;CACH"}