target-supabase-sdk 0.1.9 → 0.2.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 (135) hide show
  1. package/README.md +66 -0
  2. package/dist/browser.d.ts +52 -0
  3. package/dist/browser.d.ts.map +1 -0
  4. package/dist/browser.js +45 -0
  5. package/dist/browser.js.map +1 -0
  6. package/dist/command/command.api.js +5 -5
  7. package/dist/command/command.api.js.map +1 -1
  8. package/dist/index.d.ts +2 -48
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +2 -41
  11. package/dist/index.js.map +1 -1
  12. package/dist/link/link.interface.d.ts +1 -1
  13. package/dist/link/link.interface.d.ts.map +1 -1
  14. package/dist/node/node-log-scope.d.ts +11 -0
  15. package/dist/node/node-log-scope.d.ts.map +1 -0
  16. package/dist/node/node-log-scope.js +7 -0
  17. package/dist/node/node-log-scope.js.map +1 -0
  18. package/dist/node/node-runtime.base.d.ts +42 -0
  19. package/dist/node/node-runtime.base.d.ts.map +1 -0
  20. package/dist/node/node-runtime.base.js +397 -0
  21. package/dist/node/node-runtime.base.js.map +1 -0
  22. package/dist/node/node.api.d.ts +3 -3
  23. package/dist/node/node.api.js +3 -3
  24. package/dist/node/node.api.js.map +1 -1
  25. package/dist/node/task-node.d.ts +20 -0
  26. package/dist/node/task-node.d.ts.map +1 -0
  27. package/dist/node/task-node.js +245 -0
  28. package/dist/node/task-node.js.map +1 -0
  29. package/dist/node/trigger-node.d.ts +18 -0
  30. package/dist/node/trigger-node.d.ts.map +1 -0
  31. package/dist/node/trigger-node.js +150 -0
  32. package/dist/node/trigger-node.js.map +1 -0
  33. package/dist/node.d.ts +22 -0
  34. package/dist/node.d.ts.map +1 -0
  35. package/dist/node.js +19 -0
  36. package/dist/node.js.map +1 -0
  37. package/dist/repo/repo-manager.d.ts +14 -3
  38. package/dist/repo/repo-manager.d.ts.map +1 -1
  39. package/dist/repo/repo-manager.js +27 -17
  40. package/dist/repo/repo-manager.js.map +1 -1
  41. package/dist/repo/repo.script-loader.d.ts +3 -3
  42. package/dist/repo/repo.script-loader.d.ts.map +1 -1
  43. package/dist/repo/repo.script-loader.js +10 -10
  44. package/dist/repo/repo.script-loader.js.map +1 -1
  45. package/dist/shared/log/create-api-logger.d.ts +10 -6
  46. package/dist/shared/log/create-api-logger.d.ts.map +1 -1
  47. package/dist/shared/log/create-api-logger.js +10 -6
  48. package/dist/shared/log/create-api-logger.js.map +1 -1
  49. package/dist/shared/log/index.d.ts +10 -0
  50. package/dist/shared/log/index.d.ts.map +1 -0
  51. package/dist/shared/log/index.js +10 -0
  52. package/dist/shared/log/index.js.map +1 -0
  53. package/dist/shared/log/log-manager.d.ts +25 -46
  54. package/dist/shared/log/log-manager.d.ts.map +1 -1
  55. package/dist/shared/log/log-manager.js +59 -40
  56. package/dist/shared/log/log-manager.js.map +1 -1
  57. package/dist/shared/log/log-scope.d.ts +49 -0
  58. package/dist/shared/log/log-scope.d.ts.map +1 -0
  59. package/dist/shared/log/log-scope.js +70 -0
  60. package/dist/shared/log/log-scope.js.map +1 -0
  61. package/dist/task/index.d.ts +15 -0
  62. package/dist/task/index.d.ts.map +1 -0
  63. package/dist/task/index.js +14 -0
  64. package/dist/task/index.js.map +1 -0
  65. package/dist/task/local-task-registry.d.ts +10 -0
  66. package/dist/task/local-task-registry.d.ts.map +1 -1
  67. package/dist/task/local-task-registry.js +83 -22
  68. package/dist/task/local-task-registry.js.map +1 -1
  69. package/dist/task/task-manager.d.ts +18 -6
  70. package/dist/task/task-manager.d.ts.map +1 -1
  71. package/dist/task/task-manager.js +46 -67
  72. package/dist/task/task-manager.js.map +1 -1
  73. package/dist/task/task-post.api.d.ts +49 -0
  74. package/dist/task/task-post.api.d.ts.map +1 -0
  75. package/dist/task/task-post.api.js +91 -0
  76. package/dist/task/task-post.api.js.map +1 -0
  77. package/dist/task/task-repo-context.d.ts +2 -0
  78. package/dist/task/task-repo-context.d.ts.map +1 -1
  79. package/dist/task/task-repo-context.js.map +1 -1
  80. package/dist/task/task-repo-validation.d.ts +46 -0
  81. package/dist/task/task-repo-validation.d.ts.map +1 -0
  82. package/dist/task/task-repo-validation.js +96 -0
  83. package/dist/task/task-repo-validation.js.map +1 -0
  84. package/dist/task/task.api.d.ts +11 -53
  85. package/dist/task/task.api.d.ts.map +1 -1
  86. package/dist/task/task.api.js +13 -61
  87. package/dist/task/task.api.js.map +1 -1
  88. package/dist/task/task.interface.d.ts +2 -0
  89. package/dist/task/task.interface.d.ts.map +1 -1
  90. package/dist/task/task.interface.js.map +1 -1
  91. package/dist/trigger/trigger.api.d.ts +140 -0
  92. package/dist/trigger/trigger.api.d.ts.map +1 -0
  93. package/dist/trigger/trigger.api.js +125 -0
  94. package/dist/trigger/trigger.api.js.map +1 -0
  95. package/dist/trigger/trigger.interface.d.ts +43 -0
  96. package/dist/trigger/trigger.interface.d.ts.map +1 -0
  97. package/dist/trigger/trigger.interface.js +11 -0
  98. package/dist/trigger/trigger.interface.js.map +1 -0
  99. package/dist/trigger/trigger.utils.d.ts +6 -0
  100. package/dist/trigger/trigger.utils.d.ts.map +1 -0
  101. package/dist/trigger/trigger.utils.js +39 -0
  102. package/dist/trigger/trigger.utils.js.map +1 -0
  103. package/package.json +21 -6
  104. package/src/browser.ts +100 -0
  105. package/src/command/command.api.ts +5 -5
  106. package/src/index.ts +2 -79
  107. package/src/link/link.interface.ts +1 -1
  108. package/src/node/node-log-scope.ts +15 -0
  109. package/src/node/node-runtime.base.ts +450 -0
  110. package/src/node/node.api.ts +3 -3
  111. package/src/node/task-node.ts +284 -0
  112. package/src/node/trigger-node.ts +180 -0
  113. package/src/node.ts +62 -0
  114. package/src/repo/repo-manager.ts +49 -21
  115. package/src/repo/repo.script-loader.ts +13 -13
  116. package/src/shared/log/create-api-logger.ts +23 -12
  117. package/src/shared/log/index.ts +23 -0
  118. package/src/shared/log/log-manager.ts +85 -90
  119. package/src/shared/log/log-scope.ts +123 -0
  120. package/src/task/index.ts +48 -0
  121. package/src/task/local-task-registry.ts +110 -23
  122. package/src/task/task-manager.ts +73 -84
  123. package/src/task/task-post.api.ts +116 -0
  124. package/src/task/task-repo-context.ts +2 -0
  125. package/src/task/task-repo-validation.ts +171 -0
  126. package/src/task/task.api.ts +13 -73
  127. package/src/task/task.interface.ts +2 -0
  128. package/src/trigger/trigger.api.ts +166 -0
  129. package/src/trigger/trigger.interface.ts +50 -0
  130. package/src/trigger/trigger.utils.ts +56 -0
  131. package/dist/node/node-manager.d.ts +0 -48
  132. package/dist/node/node-manager.d.ts.map +0 -1
  133. package/dist/node/node-manager.js +0 -619
  134. package/dist/node/node-manager.js.map +0 -1
  135. package/src/node/node-manager.ts +0 -673
@@ -0,0 +1,125 @@
1
+ import { createTarget, scanTargetList, updateTargetDetails, validateWithSchema } from "../core.api";
2
+ import { generateResponse } from "../core.interface";
3
+ import { TaskStatus } from "../task/task.interface";
4
+ import { createApiLogger } from "../shared/log";
5
+ import { z } from "zod";
6
+ import { CategoryTrigger, TriggerStatus, } from "./trigger.interface";
7
+ const TRIGGER_STATUS_FIELD = "details->>status";
8
+ const traceIdSchema = z.string().trim().min(1).optional();
9
+ const dailyScheduleSchema = z.object({
10
+ kind: z.literal("daily"),
11
+ hour: z.number().int().min(0).max(23),
12
+ minute: z.number().int().min(0).max(59),
13
+ });
14
+ const postTaskActionSchema = z.object({
15
+ kind: z.literal("post_task"),
16
+ taskTypeKey: z.string().trim().min(1),
17
+ taskParams: z.unknown(),
18
+ taskName: z.string().trim().min(1).optional(),
19
+ taskStatus: z.enum([TaskStatus.OPEN, TaskStatus.TODO]).optional(),
20
+ });
21
+ export const postTriggerSchema = z.object({
22
+ name: z.string().trim().min(1),
23
+ value: z.string().trim().min(1),
24
+ status: z.nativeEnum(TriggerStatus).optional().default(TriggerStatus.ENABLED),
25
+ schedule: dailyScheduleSchema,
26
+ action: postTaskActionSchema,
27
+ tagList: z.array(z.string()).optional().default([]),
28
+ traceId: traceIdSchema,
29
+ });
30
+ export const scanEnabledTriggersSchema = z.object({
31
+ traceId: traceIdSchema,
32
+ });
33
+ export const patchTriggerFiredSchema = z.object({
34
+ triggerId: z.string().trim().min(1),
35
+ fireKey: z.string().trim().min(1),
36
+ expectedLastFireKey: z.string().nullable().optional(),
37
+ traceId: traceIdSchema,
38
+ });
39
+ function enabledTriggerFilter() {
40
+ return [{ field: TRIGGER_STATUS_FIELD, operator: "eq", value: TriggerStatus.ENABLED }];
41
+ }
42
+ /** List all ENABLED triggers (Phase 1: in-memory due check). */
43
+ export const scanEnabledTriggers = validateWithSchema(scanEnabledTriggersSchema, "scanEnabledTriggersSchema")(async ({ traceId }) => {
44
+ const logger = createApiLogger("scanEnabledTriggers", { traceId });
45
+ try {
46
+ const { data: triggerList } = await scanTargetList({
47
+ category: CategoryTrigger.TRIGGER,
48
+ filterList: enabledTriggerFilter(),
49
+ orderBy: { field: "created_at", ascending: true },
50
+ });
51
+ const rows = triggerList ?? [];
52
+ logger.info("已掃描 ENABLED Trigger", {
53
+ topic: "trigger",
54
+ data: { count: rows.length },
55
+ });
56
+ return generateResponse.success(rows);
57
+ }
58
+ catch (error) {
59
+ const message = error instanceof Error ? error.message : String(error);
60
+ return generateResponse.error(message);
61
+ }
62
+ });
63
+ /** Create a trigger row (scheduler / admin). */
64
+ export const postTrigger = validateWithSchema(postTriggerSchema, "postTriggerSchema")(async ({ name, value, status, schedule, action, tagList, traceId }) => {
65
+ const logger = createApiLogger("postTrigger", { traceId });
66
+ const details = {
67
+ manifestVersion: 0,
68
+ status,
69
+ schedule: schedule,
70
+ action: action,
71
+ lastFiredAt: null,
72
+ lastFireKey: null,
73
+ };
74
+ const result = await createTarget({
75
+ payload: { name, value, status, schedule, action, tagList, traceId },
76
+ createFn: () => ({
77
+ name,
78
+ value,
79
+ category: CategoryTrigger.TRIGGER,
80
+ tagList,
81
+ details,
82
+ }),
83
+ });
84
+ logger.info("Trigger 已創建", {
85
+ topic: "trigger",
86
+ data: { triggerId: result.data?.id, triggerKey: value, status },
87
+ });
88
+ return result;
89
+ });
90
+ /**
91
+ * Mark trigger as fired for `fireKey`.
92
+ * When `expectedLastFireKey` is set, uses optimistic lock on that field.
93
+ */
94
+ export const patchTriggerFired = validateWithSchema(patchTriggerFiredSchema, "patchTriggerFiredSchema")(async ({ triggerId, fireKey, expectedLastFireKey, traceId }) => {
95
+ const logger = createApiLogger("patchTriggerFired", { traceId });
96
+ const now = Date.now();
97
+ try {
98
+ const optimisticLockFilterList = expectedLastFireKey != null && expectedLastFireKey !== ""
99
+ ? [{ field: "details->>lastFireKey", operator: "eq", value: expectedLastFireKey }]
100
+ : [];
101
+ const data = await updateTargetDetails({
102
+ id: triggerId,
103
+ optimisticLockFilterList,
104
+ updateFn: (current) => ({
105
+ ...current,
106
+ lastFireKey: fireKey,
107
+ lastFiredAt: now,
108
+ }),
109
+ });
110
+ logger.success("Trigger 觸發記錄已更新", {
111
+ topic: "trigger",
112
+ data: { triggerId, fireKey },
113
+ });
114
+ return generateResponse.success(data);
115
+ }
116
+ catch (error) {
117
+ const message = error instanceof Error ? error.message : String(error);
118
+ logger.warn("Trigger 觸發記錄更新失敗", {
119
+ topic: "trigger",
120
+ data: { triggerId, fireKey, error: message },
121
+ });
122
+ return generateResponse.error(message);
123
+ }
124
+ });
125
+ //# sourceMappingURL=trigger.api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trigger.api.js","sourceRoot":"","sources":["../../src/trigger/trigger.api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { Target } from "../core.interface";
2
+ import { TaskStatus } from "../task/task.interface";
3
+ export declare enum CategoryTrigger {
4
+ TRIGGER = "trigger"
5
+ }
6
+ export declare enum TriggerStatus {
7
+ ENABLED = "ENABLED",
8
+ DISABLED = "DISABLED",
9
+ PAUSED = "PAUSED"
10
+ }
11
+ /** Phase 1: daily fire at `hour`:`minute` UTC. */
12
+ export interface TriggerDailySchedule {
13
+ kind: "daily";
14
+ hour: number;
15
+ minute: number;
16
+ }
17
+ export type TriggerSchedule = TriggerDailySchedule;
18
+ export interface TriggerPostTaskAction {
19
+ kind: "post_task";
20
+ taskTypeKey: string;
21
+ taskParams: unknown;
22
+ taskName?: string;
23
+ taskStatus?: TaskStatus.OPEN | TaskStatus.TODO;
24
+ }
25
+ export type TriggerAction = TriggerPostTaskAction;
26
+ export interface Trigger extends Target {
27
+ /** Human readable */
28
+ name: string;
29
+ /** Unique trigger key */
30
+ value: string;
31
+ details: TriggerDetails;
32
+ category: CategoryTrigger;
33
+ }
34
+ export interface TriggerDetails {
35
+ manifestVersion: number;
36
+ status: TriggerStatus;
37
+ schedule: TriggerSchedule;
38
+ action: TriggerAction;
39
+ lastFiredAt?: number | null;
40
+ /** Idempotency key for the last successful fire, e.g. `daily:2026-06-18` (UTC date). */
41
+ lastFireKey?: string | null;
42
+ }
43
+ //# sourceMappingURL=trigger.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trigger.interface.d.ts","sourceRoot":"","sources":["../../src/trigger/trigger.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,oBAAY,eAAe;IACvB,OAAO,YAAY;CACtB;AAED,oBAAY,aAAa;IACrB,OAAO,YAAY;IACnB,QAAQ,aAAa;IACrB,MAAM,WAAW;CACpB;AAED,kDAAkD;AAClD,MAAM,WAAW,oBAAoB;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,eAAe,GAAG,oBAAoB,CAAC;AAEnD,MAAM,WAAW,qBAAqB;IAClC,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,UAAU,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;CAClD;AAED,MAAM,MAAM,aAAa,GAAG,qBAAqB,CAAC;AAElD,MAAM,WAAW,OAAQ,SAAQ,MAAM;IACnC,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,cAAc,CAAC;IACxB,QAAQ,EAAE,eAAe,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,aAAa,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,wFAAwF;IACxF,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B"}
@@ -0,0 +1,11 @@
1
+ export var CategoryTrigger;
2
+ (function (CategoryTrigger) {
3
+ CategoryTrigger["TRIGGER"] = "trigger";
4
+ })(CategoryTrigger || (CategoryTrigger = {}));
5
+ export var TriggerStatus;
6
+ (function (TriggerStatus) {
7
+ TriggerStatus["ENABLED"] = "ENABLED";
8
+ TriggerStatus["DISABLED"] = "DISABLED";
9
+ TriggerStatus["PAUSED"] = "PAUSED";
10
+ })(TriggerStatus || (TriggerStatus = {}));
11
+ //# sourceMappingURL=trigger.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trigger.interface.js","sourceRoot":"","sources":["../../src/trigger/trigger.interface.ts"],"names":[],"mappings":"AAGA,MAAM,CAAN,IAAY,eAEX;AAFD,WAAY,eAAe;IACvB,sCAAmB,CAAA;AACvB,CAAC,EAFW,eAAe,KAAf,eAAe,QAE1B;AAED,MAAM,CAAN,IAAY,aAIX;AAJD,WAAY,aAAa;IACrB,oCAAmB,CAAA;IACnB,sCAAqB,CAAA;IACrB,kCAAiB,CAAA;AACrB,CAAC,EAJW,aAAa,KAAb,aAAa,QAIxB"}
@@ -0,0 +1,6 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,39 @@
1
+ function parseUtcDateParts(now) {
2
+ return {
3
+ year: now.getUTCFullYear(),
4
+ month: now.getUTCMonth() + 1,
5
+ day: now.getUTCDate(),
6
+ hour: now.getUTCHours(),
7
+ minute: now.getUTCMinutes(),
8
+ };
9
+ }
10
+ export function buildDailyFireKey(_schedule, now) {
11
+ const { year, month, day } = parseUtcDateParts(now);
12
+ const yyyy = String(year).padStart(4, "0");
13
+ const mm = String(month).padStart(2, "0");
14
+ const dd = String(day).padStart(2, "0");
15
+ return `daily:${yyyy}-${mm}-${dd}`;
16
+ }
17
+ export function isDailyScheduleDue(schedule, now, lastFireKey) {
18
+ const parts = parseUtcDateParts(now);
19
+ if (parts.hour !== schedule.hour || parts.minute !== schedule.minute) {
20
+ return false;
21
+ }
22
+ const fireKey = buildDailyFireKey(schedule, now);
23
+ return lastFireKey !== fireKey;
24
+ }
25
+ export function isTriggerDue(trigger, now = new Date()) {
26
+ const { schedule, lastFireKey } = trigger.details;
27
+ if (schedule.kind !== "daily") {
28
+ throw new Error(`Unsupported trigger schedule kind: ${String(schedule.kind)}`);
29
+ }
30
+ return isDailyScheduleDue(schedule, now, lastFireKey);
31
+ }
32
+ export function buildFireKey(trigger, now = new Date()) {
33
+ const { schedule } = trigger.details;
34
+ if (schedule.kind !== "daily") {
35
+ throw new Error(`Unsupported trigger schedule kind: ${String(schedule.kind)}`);
36
+ }
37
+ return buildDailyFireKey(schedule, now);
38
+ }
39
+ //# sourceMappingURL=trigger.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trigger.utils.js","sourceRoot":"","sources":["../../src/trigger/trigger.utils.ts"],"names":[],"mappings":"AAUA,SAAS,iBAAiB,CAAC,GAAS;IAChC,OAAO;QACH,IAAI,EAAE,GAAG,CAAC,cAAc,EAAE;QAC1B,KAAK,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC;QAC5B,GAAG,EAAE,GAAG,CAAC,UAAU,EAAE;QACrB,IAAI,EAAE,GAAG,CAAC,WAAW,EAAE;QACvB,MAAM,EAAE,GAAG,CAAC,aAAa,EAAE;KAC9B,CAAC;AACN,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAA+B,EAAE,GAAS;IACxE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3C,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1C,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACxC,OAAO,SAAS,IAAI,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAC9B,QAA8B,EAC9B,GAAS,EACT,WAAsC;IAEtC,MAAM,KAAK,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;QACnE,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACjD,OAAO,WAAW,KAAK,OAAO,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAgB,EAAE,MAAY,IAAI,IAAI,EAAE;IACjE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAClD,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,sCAAsC,MAAM,CAAE,QAA8B,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1G,CAAC;IACD,OAAO,kBAAkB,CAAC,QAAQ,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAgB,EAAE,MAAY,IAAI,IAAI,EAAE;IACjE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IACrC,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,sCAAsC,MAAM,CAAE,QAA8B,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1G,CAAC;IACD,OAAO,iBAAiB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAC5C,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "target-supabase-sdk",
3
- "version": "0.1.9",
3
+ "version": "0.2.0",
4
4
  "description": "Supabase client initializer and data access APIs",
5
5
  "license": "MIT",
6
6
  "author": "KyLoc20",
@@ -18,12 +18,22 @@
18
18
  "node": ">=18"
19
19
  },
20
20
  "packageManager": "pnpm@9.15.0",
21
- "types": "./dist/index.d.ts",
21
+ "types": "./dist/browser.d.ts",
22
22
  "exports": {
23
23
  ".": {
24
- "types": "./dist/index.d.ts",
25
- "import": "./dist/index.js",
26
- "default": "./dist/index.js"
24
+ "types": "./dist/browser.d.ts",
25
+ "import": "./dist/browser.js",
26
+ "default": "./dist/browser.js"
27
+ },
28
+ "./browser": {
29
+ "types": "./dist/browser.d.ts",
30
+ "import": "./dist/browser.js",
31
+ "default": "./dist/browser.js"
32
+ },
33
+ "./node": {
34
+ "types": "./dist/node.d.ts",
35
+ "import": "./dist/node.js",
36
+ "default": "./dist/node.js"
27
37
  }
28
38
  },
29
39
  "files": [
@@ -32,12 +42,15 @@
32
42
  ],
33
43
  "scripts": {
34
44
  "clean": "node --input-type=module -e \"import fs from 'node:fs'; fs.rmSync('dist', { recursive: true, force: true })\"",
35
- "build": "pnpm clean && tsc -p tsconfig.build.json",
45
+ "build": "pnpm clean && tsc -p tsconfig.build.json && node scripts/verify-browser-entry.mjs",
36
46
  "typecheck": "tsc -p tsconfig.json --noEmit",
37
47
  "typecheck:scripts": "tsc -p tsconfig.scripts.json",
38
48
  "worker": "tsx scripts/run-node-worker.ts",
49
+ "worker:trigger": "tsx scripts/run-trigger-node.ts",
50
+ "chrome-sidecar": "tsx scripts/chrome-sidecar-hub.ts",
39
51
  "post-task": "tsx scripts/post-task.ts",
40
52
  "post-command": "tsx scripts/post-command.ts",
53
+ "post-trigger": "tsx scripts/post-trigger.ts",
41
54
  "dev": "tsc -p tsconfig.build.json --watch",
42
55
  "pack:check": "npm pack --dry-run",
43
56
  "prepack": "pnpm build"
@@ -52,10 +65,12 @@
52
65
  "@supabase/postgrest-js": "1.19.4",
53
66
  "@supabase/supabase-js": "2.50.3",
54
67
  "@types/lodash-es": "^4.17.12",
68
+ "@types/ws": "^8.18.1",
55
69
  "@types/wicg-file-system-access": "^2023.10.7",
56
70
  "lodash-es": "^4.17.21",
57
71
  "typescript": "~5.7.2",
58
72
  "tsx": "^4.19.4",
73
+ "ws": "^8.18.0",
59
74
  "zod": "^3.24.0"
60
75
  },
61
76
  "publishConfig": {
package/src/browser.ts ADDED
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Browser-safe public API — no Node.js built-ins (node:fs, node:crypto, …).
3
+ * Default package entry (`target-supabase-sdk`).
4
+ *
5
+ * For TaskManager, RepoManager, TaskNode, use `target-supabase-sdk/node`.
6
+ */
7
+
8
+ export { SupabaseInitializer } from "./supabase";
9
+ export type { SupabaseInitializerParams } from "./supabase";
10
+ export type { SupabaseClient } from "@supabase/supabase-js";
11
+
12
+ import { SupabaseInitializer } from "./supabase";
13
+
14
+ export const supabase = SupabaseInitializer.getInstance();
15
+
16
+ export * from "./core.api";
17
+ export * from "./core.interface";
18
+ export * from "./core.utils";
19
+
20
+ export * from "./auth/auth.api";
21
+
22
+ export * from "./feed/feed.interface";
23
+ export * from "./idea/idea.interface";
24
+
25
+ export { CategoryParcel } from "./parcel/parcel.interface";
26
+ export type {
27
+ Parcel,
28
+ ParcelDetails,
29
+ Chunk,
30
+ LifecycleStatus as ParcelLifecycleStatus,
31
+ Lifecycle as ParcelLifecycle,
32
+ } from "./parcel/parcel.interface";
33
+ export { ParcelManager } from "./parcel/parcel-manager";
34
+ export type { StorageAdapter, ParcelTargetBase } from "./parcel/parcel-manager";
35
+
36
+ export * from "./file/file.interface";
37
+ export * from "./file/file.api";
38
+ export * from "./file/file-manager";
39
+
40
+ export * from "./file-list/file-list.interface";
41
+ export * from "./file-list/file-list.api";
42
+
43
+ export * from "./question-list/question-list.interface";
44
+ export * from "./question-list/question-list.api";
45
+
46
+ export * from "./review/review.interface";
47
+ export * from "./review/review.api";
48
+
49
+ export type {
50
+ ReviewV2,
51
+ ReviewV2Details,
52
+ ReviewResult,
53
+ } from "./review-v2/review.interface";
54
+ export * from "./review-v2/review-setting.interface";
55
+ export {
56
+ postReview as postReviewV2,
57
+ PostReviewValidator as PostReviewV2Validator,
58
+ } from "./review-v2/apis/post-review.api";
59
+ export type { PostReviewPayload as PostReviewV2Payload } from "./review-v2/apis/post-review.api";
60
+ export * from "./review-v2/apis/post-review-setting.api";
61
+
62
+ export * from "./service/base.interface";
63
+ export * from "./service/service.interface";
64
+ export * from "./service/api.interface";
65
+
66
+ export * from "./link/link.interface";
67
+ export * from "./link/link.api";
68
+
69
+ export * from "./list/list.interface";
70
+ export * from "./list/list.api";
71
+
72
+ export * from "./word/word.interface";
73
+
74
+ // task — api + validation only (TaskManager is Node-only → node entry)
75
+ export {
76
+ CategoryTask,
77
+ ResultCode,
78
+ TaskStatus,
79
+ TaskStatusAction,
80
+ } from "./task/task.interface";
81
+ export type { Task, TaskDetails, TaskFlow } from "./task/task.interface";
82
+ export {
83
+ patchChangeTaskStatus,
84
+ patchChangeTaskStatusSchema,
85
+ patchClaimTask,
86
+ patchClaimTaskSchema,
87
+ patchTaskProgress,
88
+ patchTaskProgressSchema,
89
+ } from "./task/task.api";
90
+ export type {
91
+ PatchChangeTaskStatusPayload,
92
+ PatchClaimTaskPayload,
93
+ PatchTaskProgressPayload,
94
+ } from "./task/task.api";
95
+
96
+ export * from "./node/node.interface";
97
+ export * from "./node/node.api";
98
+
99
+ export * from "./repo/repo.interface";
100
+ export * from "./repo/repo.api";
@@ -5,7 +5,7 @@ import {
5
5
  validateWithSchema,
6
6
  } from "../core.api";
7
7
  import { generateResponse } from "../core.interface";
8
- import { createApiLogger } from "../shared/log/log-manager";
8
+ import { createApiLogger } from "../shared/log";
9
9
  import { z } from "zod";
10
10
  import { CategoryCommand, Command, CommandType } from "./command.interface";
11
11
 
@@ -43,7 +43,7 @@ export const postCommand = validateWithSchema(
43
43
  postCommandSchema,
44
44
  "postCommandSchema"
45
45
  )(async ({ nodeId, command, traceId }) => {
46
- const logger = createApiLogger("postCommand", { traceId, nodeId });
46
+ const logger = createApiLogger("postCommand", { traceId, labels: { nodeId } });
47
47
 
48
48
  const result = await createTarget<Command, PostCommandPayload>({
49
49
  payload: { nodeId, command, traceId },
@@ -57,7 +57,7 @@ export const postCommand = validateWithSchema(
57
57
 
58
58
  logger.info("Command已入隊", {
59
59
  topic: "command",
60
- context: { nodeId, command },
60
+ data: { nodeId, command },
61
61
  });
62
62
 
63
63
  return result;
@@ -70,7 +70,7 @@ export const getPollCommandList = validateWithSchema(
70
70
  getPollCommandListSchema,
71
71
  "getPollCommandListSchema"
72
72
  )(async ({ nodeId, size, traceId }) => {
73
- const logger = createApiLogger("getPollCommandList", { traceId, nodeId });
73
+ const logger = createApiLogger("getPollCommandList", { traceId, labels: { nodeId } });
74
74
 
75
75
  const { data: dequeuedList = [] } = await pollTargetList<Command>({
76
76
  category: CategoryCommand.COMMAND,
@@ -81,7 +81,7 @@ export const getPollCommandList = validateWithSchema(
81
81
 
82
82
  logger.info("Command", {
83
83
  topic: "command",
84
- context: { nodeId, dequeued: dequeuedList.length },
84
+ data: { nodeId, dequeued: dequeuedList.length },
85
85
  });
86
86
 
87
87
  return generateResponse.success(dequeuedList);
package/src/index.ts CHANGED
@@ -1,79 +1,2 @@
1
- export { SupabaseInitializer } from "./supabase";
2
- export type { SupabaseInitializerParams } from "./supabase";
3
- export type { SupabaseClient } from "@supabase/supabase-js";
4
-
5
- import { SupabaseInitializer } from "./supabase";
6
-
7
- export const supabase = SupabaseInitializer.getInstance();
8
-
9
- export * from "./core.api";
10
- export * from "./core.interface";
11
- export * from "./core.utils";
12
-
13
- export * from "./auth/auth.api";
14
-
15
- export * from "./feed/feed.interface";
16
- export * from "./idea/idea.interface";
17
- export * from "./link/link.interface";
18
-
19
- export { CategoryParcel } from "./parcel/parcel.interface";
20
- export type {
21
- Parcel,
22
- ParcelDetails,
23
- Chunk,
24
- LifecycleStatus as ParcelLifecycleStatus,
25
- Lifecycle as ParcelLifecycle,
26
- } from "./parcel/parcel.interface";
27
- export { ParcelManager } from "./parcel/parcel-manager";
28
- export type { StorageAdapter, ParcelTargetBase } from "./parcel/parcel-manager";
29
-
30
- export * from "./file/file.interface";
31
- export * from "./file/file.api";
32
- export * from "./file/file-manager";
33
-
34
- export * from "./file-list/file-list.interface";
35
- export * from "./file-list/file-list.api";
36
-
37
- export * from "./question-list/question-list.interface";
38
- export * from "./question-list/question-list.api";
39
-
40
- export * from "./review/review.interface";
41
- export * from "./review/review.api";
42
-
43
- export type { ReviewV2, ReviewV2Details, ReviewResult } from "./review-v2/review.interface";
44
- export * from "./review-v2/review-setting.interface";
45
- export { postReview as postReviewV2, PostReviewValidator as PostReviewV2Validator } from "./review-v2/apis/post-review.api";
46
- export type { PostReviewPayload as PostReviewV2Payload } from "./review-v2/apis/post-review.api";
47
- export * from "./review-v2/apis/post-review-setting.api";
48
-
49
- export * from "./service/base.interface";
50
- export * from "./service/service.interface";
51
- export * from "./service/api.interface";
52
-
53
-
54
- export * from "./link/link.interface";
55
- export * from "./link/link.api";
56
-
57
- export * from "./list/list.interface";
58
- export * from "./list/list.api";
59
-
60
- export * from "./word/word.interface";
61
-
62
- export * from "./task/task.interface";
63
- export * from "./task/task.api";
64
- export { TaskManager } from "./task/task-manager";
65
- export type {
66
- RegisterTasksOptions,
67
- RegisterTasksResult,
68
- PrepareTaskResponse,
69
- PrepareTaskParams,
70
- PrepareTaskFailureReason,
71
- } from "./task/task-manager";
72
-
73
- export * from "./node/node.interface";
74
- export * from "./node/node.api";
75
- export { NodeManager } from "./node/node-manager";
76
-
77
- export * from "./repo/repo.interface";
78
- export * from "./repo/repo.api";
79
- export { RepoManager } from "./repo/repo-manager";
1
+ /** @deprecated Use explicit entry — re-exports browser-safe API only. */
2
+ export * from "./browser";
@@ -6,7 +6,7 @@ export enum CategoryLink {
6
6
  }
7
7
 
8
8
  export interface Link extends Target {
9
- /** 鏈接名稱 */
9
+ /** Should be unique */
10
10
  name: string;
11
11
  /** URL */
12
12
  value: string;
@@ -0,0 +1,15 @@
1
+ import { createRootScope, type LogScope } from "../shared/log";
2
+
3
+ /** Input for {@link scopeForNodeLoop}. */
4
+ export type ScopeForNodeLoopInput = {
5
+ module: string;
6
+ traceId: string;
7
+ nodeId: string;
8
+ traceParentId?: string | null;
9
+ };
10
+
11
+ /** Log scope for one node main-loop iteration (trace + nodeId label). */
12
+ export function scopeForNodeLoop(input: ScopeForNodeLoopInput): LogScope {
13
+ const { module, traceId, nodeId, traceParentId = null } = input;
14
+ return createRootScope({ module, traceId, labels: { nodeId }, traceParentId });
15
+ }