target-supabase-sdk 0.3.1 → 0.3.3

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 (61) hide show
  1. package/README.md +2 -2
  2. package/dist/browser.js +2 -3
  3. package/dist/browser.js.map +1 -1
  4. package/dist/chunks/{config-aBbuDpyt.js → config-BfWyCqKZ.js} +22 -42
  5. package/dist/chunks/config-BfWyCqKZ.js.map +1 -0
  6. package/dist/chunks/{enable-BTFwzWHc.js → enable-BPzz7a9r.js} +36 -3
  7. package/dist/chunks/enable-BPzz7a9r.js.map +1 -0
  8. package/dist/chunks/{task-queue-D8CraGI8.js → task-queue-C1eVq9St.js} +18 -20
  9. package/dist/chunks/{task-queue-D8CraGI8.js.map → task-queue-C1eVq9St.js.map} +1 -1
  10. package/dist/config/config.api.d.ts.map +1 -1
  11. package/dist/core.api.d.ts +15 -5
  12. package/dist/core.api.d.ts.map +1 -1
  13. package/dist/core.interface.d.ts +5 -0
  14. package/dist/core.interface.d.ts.map +1 -1
  15. package/dist/core.schema.d.ts +7 -0
  16. package/dist/core.schema.d.ts.map +1 -1
  17. package/dist/node.d.ts +0 -3
  18. package/dist/node.d.ts.map +1 -1
  19. package/dist/node.js +12 -186
  20. package/dist/node.js.map +1 -1
  21. package/dist/parcel/parcel.api.d.ts.map +1 -1
  22. package/dist/preload.js +2 -3
  23. package/dist/preload.js.map +1 -1
  24. package/dist/service/service.api.d.ts.map +1 -1
  25. package/dist/shared/log/index.d.ts +1 -1
  26. package/dist/shared/log/index.d.ts.map +1 -1
  27. package/dist/shared/log/spool/batch-timestamp.d.ts +3 -0
  28. package/dist/shared/log/spool/batch-timestamp.d.ts.map +1 -0
  29. package/dist/shared/log/spool/file.d.ts +1 -1
  30. package/dist/shared/log/spool/file.d.ts.map +1 -1
  31. package/dist/task/task.api.d.ts +1 -1
  32. package/dist/task/task.api.d.ts.map +1 -1
  33. package/dist/task/task.interface.d.ts +2 -1
  34. package/dist/task/task.interface.d.ts.map +1 -1
  35. package/dist/trigger/trigger-node.d.ts +1 -1
  36. package/dist/trigger/trigger.interface.d.ts +0 -42
  37. package/dist/trigger/trigger.interface.d.ts.map +1 -1
  38. package/package.json +1 -2
  39. package/src/core.api.ts +32 -12
  40. package/src/core.interface.ts +5 -0
  41. package/src/core.schema.ts +2 -0
  42. package/src/node.ts +0 -3
  43. package/src/shared/log/README.md +4 -1
  44. package/src/shared/log/index.ts +1 -1
  45. package/src/shared/log/spool/batch-timestamp.ts +14 -0
  46. package/src/shared/log/spool/file.ts +5 -14
  47. package/src/task/task-node.ts +1 -1
  48. package/src/task/task-post.api.ts +1 -1
  49. package/src/task/task-queue.ts +2 -2
  50. package/src/task/task.api.ts +15 -13
  51. package/src/task/task.interface.ts +2 -1
  52. package/src/trigger/trigger-node.ts +1 -1
  53. package/src/trigger/trigger.interface.ts +0 -52
  54. package/dist/chunks/config-aBbuDpyt.js.map +0 -1
  55. package/dist/chunks/enable-BTFwzWHc.js.map +0 -1
  56. package/dist/trigger/trigger.api.d.ts +0 -145
  57. package/dist/trigger/trigger.api.d.ts.map +0 -1
  58. package/dist/trigger/trigger.utils.d.ts +0 -6
  59. package/dist/trigger/trigger.utils.d.ts.map +0 -1
  60. package/src/trigger/trigger.api.ts +0 -171
  61. package/src/trigger/trigger.utils.ts +0 -56
@@ -1,145 +0,0 @@
1
- import { z } from "zod";
2
- import { type SupabaseResponse } from "../core.interface";
3
- import { TaskStatus } from "../task/task.interface";
4
- import { type Trigger, TriggerStatus } from "./trigger.interface";
5
- export declare const postTriggerSchema: z.ZodObject<{
6
- name: z.ZodString;
7
- value: z.ZodString;
8
- status: z.ZodDefault<z.ZodOptional<z.ZodNativeEnum<typeof TriggerStatus>>>;
9
- schedule: z.ZodObject<{
10
- kind: z.ZodLiteral<"daily">;
11
- hour: z.ZodNumber;
12
- minute: z.ZodNumber;
13
- }, "strip", z.ZodTypeAny, {
14
- kind: "daily";
15
- hour: number;
16
- minute: number;
17
- }, {
18
- kind: "daily";
19
- hour: number;
20
- minute: number;
21
- }>;
22
- action: z.ZodObject<{
23
- kind: z.ZodLiteral<"post_task">;
24
- taskTypeKey: z.ZodString;
25
- taskParams: z.ZodUnknown;
26
- taskName: z.ZodOptional<z.ZodString>;
27
- taskStatus: z.ZodOptional<z.ZodEnum<[TaskStatus.OPEN, TaskStatus.TODO]>>;
28
- }, "strip", z.ZodTypeAny, {
29
- kind: "post_task";
30
- taskTypeKey: string;
31
- taskStatus?: TaskStatus.OPEN | TaskStatus.TODO | undefined;
32
- taskParams?: unknown;
33
- taskName?: string | undefined;
34
- }, {
35
- kind: "post_task";
36
- taskTypeKey: string;
37
- taskStatus?: TaskStatus.OPEN | TaskStatus.TODO | undefined;
38
- taskParams?: unknown;
39
- taskName?: string | undefined;
40
- }>;
41
- tagList: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
42
- traceId: z.ZodOptional<z.ZodString>;
43
- }, "strip", z.ZodTypeAny, {
44
- status: TriggerStatus;
45
- value: string;
46
- name: string;
47
- tagList: string[];
48
- action: {
49
- kind: "post_task";
50
- taskTypeKey: string;
51
- taskStatus?: TaskStatus.OPEN | TaskStatus.TODO | undefined;
52
- taskParams?: unknown;
53
- taskName?: string | undefined;
54
- };
55
- schedule: {
56
- kind: "daily";
57
- hour: number;
58
- minute: number;
59
- };
60
- traceId?: string | undefined;
61
- }, {
62
- value: string;
63
- name: string;
64
- action: {
65
- kind: "post_task";
66
- taskTypeKey: string;
67
- taskStatus?: TaskStatus.OPEN | TaskStatus.TODO | undefined;
68
- taskParams?: unknown;
69
- taskName?: string | undefined;
70
- };
71
- schedule: {
72
- kind: "daily";
73
- hour: number;
74
- minute: number;
75
- };
76
- status?: TriggerStatus | undefined;
77
- tagList?: string[] | undefined;
78
- traceId?: string | undefined;
79
- }>;
80
- export type PostTriggerPayload = z.infer<typeof postTriggerSchema>;
81
- export declare const scanEnabledTriggersSchema: z.ZodObject<{
82
- traceId: z.ZodOptional<z.ZodString>;
83
- }, "strip", z.ZodTypeAny, {
84
- traceId?: string | undefined;
85
- }, {
86
- traceId?: string | undefined;
87
- }>;
88
- export type ScanEnabledTriggersPayload = z.infer<typeof scanEnabledTriggersSchema>;
89
- export declare const patchTriggerFiredSchema: z.ZodObject<{
90
- triggerId: z.ZodString;
91
- fireKey: z.ZodString;
92
- expectedLastFireKey: z.ZodOptional<z.ZodNullable<z.ZodString>>;
93
- traceId: z.ZodOptional<z.ZodString>;
94
- }, "strip", z.ZodTypeAny, {
95
- triggerId: string;
96
- fireKey: string;
97
- traceId?: string | undefined;
98
- expectedLastFireKey?: string | null | undefined;
99
- }, {
100
- triggerId: string;
101
- fireKey: string;
102
- traceId?: string | undefined;
103
- expectedLastFireKey?: string | null | undefined;
104
- }>;
105
- export type PatchTriggerFiredPayload = z.infer<typeof patchTriggerFiredSchema>;
106
- /**
107
- * List all ENABLED triggers. Due-check is in-memory on the caller:
108
- * filter with `isTriggerDue`, then `patchTriggerFired` with `buildFireKey`
109
- * (both from `trigger.utils`, exported on `/node`).
110
- * Do not call this from TriggerNode (local interval runners only).
111
- */
112
- export declare const scanEnabledTriggers: (payload: {
113
- traceId?: string | undefined;
114
- }) => SupabaseResponse<Trigger[]> | Promise<SupabaseResponse<Trigger[]>>;
115
- /** Create a trigger row (scheduler / admin). */
116
- export declare const postTrigger: (payload: {
117
- status: TriggerStatus;
118
- value: string;
119
- name: string;
120
- tagList: string[];
121
- action: {
122
- kind: "post_task";
123
- taskTypeKey: string;
124
- taskStatus?: TaskStatus.OPEN | TaskStatus.TODO | undefined;
125
- taskParams?: unknown;
126
- taskName?: string | undefined;
127
- };
128
- schedule: {
129
- kind: "daily";
130
- hour: number;
131
- minute: number;
132
- };
133
- traceId?: string | undefined;
134
- }) => SupabaseResponse<Trigger> | Promise<SupabaseResponse<Trigger>>;
135
- /**
136
- * Mark trigger as fired for `fireKey`.
137
- * When `expectedLastFireKey` is set, uses optimistic lock on that field.
138
- */
139
- export declare const patchTriggerFired: (payload: {
140
- triggerId: string;
141
- fireKey: string;
142
- traceId?: string | undefined;
143
- expectedLastFireKey?: string | null | undefined;
144
- }) => SupabaseResponse<unknown> | Promise<SupabaseResponse<unknown>>;
145
- //# sourceMappingURL=trigger.api.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"trigger.api.d.ts","sourceRoot":"","sources":["../../src/trigger/trigger.api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE5E,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAEH,KAAK,OAAO,EAGZ,aAAa,EAChB,MAAM,qBAAqB,CAAC;AAoB7B,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQ5B,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEnE,eAAO,MAAM,yBAAyB;;;;;;EAEpC,CAAC;AAEH,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAEnF,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;EAKlC,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAM/E;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB;;wEAwB9B,CAAC;AAEH,gDAAgD;AAChD,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;oEAgCtB,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;;;;oEAqC5B,CAAC"}
@@ -1,6 +0,0 @@
1
- import type { Trigger, TriggerDailySchedule } from "./trigger.interface";
2
- export declare function buildDailyFireKey(_schedule: TriggerDailySchedule, now: Date): string;
3
- export declare function isDailyScheduleDue(schedule: TriggerDailySchedule, now: Date, lastFireKey: string | null | undefined): boolean;
4
- export declare function isTriggerDue(trigger: Trigger, now?: Date): boolean;
5
- export declare function buildFireKey(trigger: Trigger, now?: Date): string;
6
- //# sourceMappingURL=trigger.utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"trigger.utils.d.ts","sourceRoot":"","sources":["../../src/trigger/trigger.utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAoBzE,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,oBAAoB,EAAE,GAAG,EAAE,IAAI,GAAG,MAAM,CAMpF;AAED,wBAAgB,kBAAkB,CAC9B,QAAQ,EAAE,oBAAoB,EAC9B,GAAG,EAAE,IAAI,EACT,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACvC,OAAO,CAOT;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,GAAE,IAAiB,GAAG,OAAO,CAM9E;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,GAAE,IAAiB,GAAG,MAAM,CAM7E"}
@@ -1,171 +0,0 @@
1
- import { z } from "zod";
2
- import { createTarget, scanTargetList, updateTargetDetails, validateWithSchema } from "../core.api";
3
- import { generateResponse, type SupabaseResponse } from "../core.interface";
4
- import { createLogger } from "../shared/log";
5
- import { TaskStatus } from "../task/task.interface";
6
- import {
7
- CategoryTrigger,
8
- type Trigger,
9
- type TriggerAction,
10
- type TriggerSchedule,
11
- TriggerStatus,
12
- } from "./trigger.interface";
13
-
14
- const TRIGGER_STATUS_FIELD = "details->>status" as const;
15
-
16
- const traceIdSchema = z.string().trim().min(1).optional();
17
-
18
- const dailyScheduleSchema = z.object({
19
- kind: z.literal("daily"),
20
- hour: z.number().int().min(0).max(23),
21
- minute: z.number().int().min(0).max(59),
22
- });
23
-
24
- const postTaskActionSchema = z.object({
25
- kind: z.literal("post_task"),
26
- taskTypeKey: z.string().trim().min(1),
27
- taskParams: z.unknown(),
28
- taskName: z.string().trim().min(1).optional(),
29
- taskStatus: z.enum([TaskStatus.OPEN, TaskStatus.TODO]).optional(),
30
- });
31
-
32
- export const postTriggerSchema = z.object({
33
- name: z.string().trim().min(1),
34
- value: z.string().trim().min(1),
35
- status: z.nativeEnum(TriggerStatus).optional().default(TriggerStatus.ENABLED),
36
- schedule: dailyScheduleSchema,
37
- action: postTaskActionSchema,
38
- tagList: z.array(z.string()).optional().default([]),
39
- traceId: traceIdSchema,
40
- });
41
-
42
- export type PostTriggerPayload = z.infer<typeof postTriggerSchema>;
43
-
44
- export const scanEnabledTriggersSchema = z.object({
45
- traceId: traceIdSchema,
46
- });
47
-
48
- export type ScanEnabledTriggersPayload = z.infer<typeof scanEnabledTriggersSchema>;
49
-
50
- export const patchTriggerFiredSchema = z.object({
51
- triggerId: z.string().trim().min(1),
52
- fireKey: z.string().trim().min(1),
53
- expectedLastFireKey: z.string().nullable().optional(),
54
- traceId: traceIdSchema,
55
- });
56
-
57
- export type PatchTriggerFiredPayload = z.infer<typeof patchTriggerFiredSchema>;
58
-
59
- function enabledTriggerFilter() {
60
- return [{ field: TRIGGER_STATUS_FIELD, operator: "eq" as const, value: TriggerStatus.ENABLED }];
61
- }
62
-
63
- /**
64
- * List all ENABLED triggers. Due-check is in-memory on the caller:
65
- * filter with `isTriggerDue`, then `patchTriggerFired` with `buildFireKey`
66
- * (both from `trigger.utils`, exported on `/node`).
67
- * Do not call this from TriggerNode (local interval runners only).
68
- */
69
- export const scanEnabledTriggers = validateWithSchema(
70
- scanEnabledTriggersSchema,
71
- "scanEnabledTriggersSchema",
72
- )(async ({ traceId }) => {
73
- const logger = createLogger({ module: "scanEnabledTriggers", traceId });
74
-
75
- try {
76
- const { data: triggerList } = await scanTargetList<Trigger>({
77
- category: CategoryTrigger.TRIGGER,
78
- filterList: enabledTriggerFilter(),
79
- orderBy: { field: "created_at", ascending: true },
80
- });
81
-
82
- const rows = triggerList ?? [];
83
- logger.debug("已掃描 ENABLED Trigger", {
84
- topic: "trigger",
85
- data: { count: rows.length },
86
- });
87
-
88
- return generateResponse.success(rows);
89
- } catch (error) {
90
- const message = error instanceof Error ? error.message : String(error);
91
- return generateResponse.error(message) as SupabaseResponse<Trigger[]>;
92
- }
93
- });
94
-
95
- /** Create a trigger row (scheduler / admin). */
96
- export const postTrigger = validateWithSchema(
97
- postTriggerSchema,
98
- "postTriggerSchema",
99
- )(async ({ name, value, status, schedule, action, tagList, traceId }) => {
100
- const logger = createLogger({ module: "postTrigger", traceId });
101
-
102
- const details = {
103
- manifestVersion: 0,
104
- status,
105
- schedule: schedule as TriggerSchedule,
106
- action: action as TriggerAction,
107
- lastFiredAt: null,
108
- lastFireKey: null,
109
- };
110
-
111
- const result = await createTarget<Trigger, PostTriggerPayload>({
112
- payload: { name, value, status, schedule, action, tagList, traceId },
113
- createFn: () => ({
114
- name,
115
- value,
116
- category: CategoryTrigger.TRIGGER,
117
- tagList,
118
- details,
119
- }),
120
- });
121
-
122
- logger.info("Trigger 已創建", {
123
- topic: "trigger",
124
- data: { triggerId: result.data?.id, triggerKey: value, status },
125
- });
126
-
127
- return result;
128
- });
129
-
130
- /**
131
- * Mark trigger as fired for `fireKey`.
132
- * When `expectedLastFireKey` is set, uses optimistic lock on that field.
133
- */
134
- export const patchTriggerFired = validateWithSchema(
135
- patchTriggerFiredSchema,
136
- "patchTriggerFiredSchema",
137
- )(async ({ triggerId, fireKey, expectedLastFireKey, traceId }) => {
138
- const logger = createLogger({ module: "patchTriggerFired", traceId });
139
- const now = Date.now();
140
-
141
- try {
142
- const optimisticLockFilterList =
143
- expectedLastFireKey != null && expectedLastFireKey !== ""
144
- ? [{ field: "details->>lastFireKey" as const, operator: "eq" as const, value: expectedLastFireKey }]
145
- : [];
146
-
147
- const data = await updateTargetDetails<Trigger, Trigger["details"]>({
148
- id: triggerId,
149
- optimisticLockFilterList,
150
- updateFn: (current) => ({
151
- ...current,
152
- lastFireKey: fireKey,
153
- lastFiredAt: now,
154
- }),
155
- });
156
-
157
- logger.success("Trigger 觸發記錄已更新", {
158
- topic: "trigger",
159
- data: { triggerId, fireKey },
160
- });
161
-
162
- return generateResponse.success(data);
163
- } catch (error) {
164
- const message = error instanceof Error ? error.message : String(error);
165
- logger.warn("Trigger 觸發記錄更新失敗", {
166
- topic: "trigger",
167
- data: { triggerId, fireKey, error: message },
168
- });
169
- return generateResponse.error(message);
170
- }
171
- });
@@ -1,56 +0,0 @@
1
- import type { Trigger, TriggerDailySchedule } from "./trigger.interface";
2
-
3
- interface UtcDateParts {
4
- year: number;
5
- month: number;
6
- day: number;
7
- hour: number;
8
- minute: number;
9
- }
10
-
11
- function parseUtcDateParts(now: Date): UtcDateParts {
12
- return {
13
- year: now.getUTCFullYear(),
14
- month: now.getUTCMonth() + 1,
15
- day: now.getUTCDate(),
16
- hour: now.getUTCHours(),
17
- minute: now.getUTCMinutes(),
18
- };
19
- }
20
-
21
- export function buildDailyFireKey(_schedule: TriggerDailySchedule, now: Date): string {
22
- const { year, month, day } = parseUtcDateParts(now);
23
- const yyyy = String(year).padStart(4, "0");
24
- const mm = String(month).padStart(2, "0");
25
- const dd = String(day).padStart(2, "0");
26
- return `daily:${yyyy}-${mm}-${dd}`;
27
- }
28
-
29
- export function isDailyScheduleDue(
30
- schedule: TriggerDailySchedule,
31
- now: Date,
32
- lastFireKey: string | null | undefined,
33
- ): boolean {
34
- const parts = parseUtcDateParts(now);
35
- if (parts.hour !== schedule.hour || parts.minute !== schedule.minute) {
36
- return false;
37
- }
38
- const fireKey = buildDailyFireKey(schedule, now);
39
- return lastFireKey !== fireKey;
40
- }
41
-
42
- export function isTriggerDue(trigger: Trigger, now: Date = new Date()): boolean {
43
- const { schedule, lastFireKey } = trigger.details;
44
- if (schedule.kind !== "daily") {
45
- throw new Error(`Unsupported trigger schedule kind: ${String((schedule as { kind?: string }).kind)}`);
46
- }
47
- return isDailyScheduleDue(schedule, now, lastFireKey);
48
- }
49
-
50
- export function buildFireKey(trigger: Trigger, now: Date = new Date()): string {
51
- const { schedule } = trigger.details;
52
- if (schedule.kind !== "daily") {
53
- throw new Error(`Unsupported trigger schedule kind: ${String((schedule as { kind?: string }).kind)}`);
54
- }
55
- return buildDailyFireKey(schedule, now);
56
- }