target-supabase-sdk 0.1.9 → 0.2.1

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 (464) hide show
  1. package/README.md +184 -1
  2. package/dist/browser.d.ts +60 -0
  3. package/dist/browser.d.ts.map +1 -0
  4. package/dist/browser.js +6 -0
  5. package/dist/browser.js.map +1 -0
  6. package/dist/chunks/create-logger-DyH3mZ8p.js +1028 -0
  7. package/dist/chunks/create-logger-DyH3mZ8p.js.map +1 -0
  8. package/dist/chunks/enable-log-persist-C_bSw6Kx.js +1362 -0
  9. package/dist/chunks/enable-log-persist-C_bSw6Kx.js.map +1 -0
  10. package/dist/chunks/word.interface-DLgRobKV.js +1973 -0
  11. package/dist/chunks/word.interface-DLgRobKV.js.map +1 -0
  12. package/dist/command/command.api.d.ts +1 -1
  13. package/dist/command/command.api.d.ts.map +1 -1
  14. package/dist/command/command.interface.d.ts +1 -1
  15. package/dist/command/command.interface.d.ts.map +1 -1
  16. package/dist/core.api.d.ts +10 -6
  17. package/dist/core.api.d.ts.map +1 -1
  18. package/dist/core.interface.d.ts +3 -2
  19. package/dist/core.interface.d.ts.map +1 -1
  20. package/dist/core.utils.d.ts +1 -1
  21. package/dist/core.utils.d.ts.map +1 -1
  22. package/dist/idea/idea.interface.d.ts +1 -1
  23. package/dist/idea/idea.interface.d.ts.map +1 -1
  24. package/dist/index.d.ts +2 -48
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/link/link.api.d.ts +1 -1
  27. package/dist/link/link.api.d.ts.map +1 -1
  28. package/dist/link/link.interface.d.ts +3 -3
  29. package/dist/link/link.interface.d.ts.map +1 -1
  30. package/dist/list/list.api.d.ts +3 -1
  31. package/dist/list/list.api.d.ts.map +1 -1
  32. package/dist/list/list.interface.d.ts +2 -2
  33. package/dist/list/list.interface.d.ts.map +1 -1
  34. package/dist/node/env/env-parsers.d.ts +19 -0
  35. package/dist/node/env/env-parsers.d.ts.map +1 -0
  36. package/dist/node/env/index.d.ts +11 -0
  37. package/dist/node/env/index.d.ts.map +1 -0
  38. package/dist/node/env/init-supabase-from-env.d.ts +17 -0
  39. package/dist/node/env/init-supabase-from-env.d.ts.map +1 -0
  40. package/dist/node/env/load-env.d.ts +20 -0
  41. package/dist/node/env/load-env.d.ts.map +1 -0
  42. package/dist/node/env/project-root.d.ts +11 -0
  43. package/dist/node/env/project-root.d.ts.map +1 -0
  44. package/dist/node/env/public-base-url.d.ts +10 -0
  45. package/dist/node/env/public-base-url.d.ts.map +1 -0
  46. package/dist/node/env/require-env.d.ts +3 -0
  47. package/dist/node/env/require-env.d.ts.map +1 -0
  48. package/dist/node/fs/json-state-store.d.ts +19 -0
  49. package/dist/node/fs/json-state-store.d.ts.map +1 -0
  50. package/dist/node/fs/read-source-file.d.ts +19 -0
  51. package/dist/node/fs/read-source-file.d.ts.map +1 -0
  52. package/dist/node/node-liveness.d.ts +30 -0
  53. package/dist/node/node-liveness.d.ts.map +1 -0
  54. package/dist/node/node-runtime.base.d.ts +60 -0
  55. package/dist/node/node-runtime.base.d.ts.map +1 -0
  56. package/dist/node/node.api.d.ts +4 -4
  57. package/dist/node/node.api.d.ts.map +1 -1
  58. package/dist/node/node.interface.d.ts +1 -6
  59. package/dist/node/node.interface.d.ts.map +1 -1
  60. package/dist/node/preload/run-service-preload.d.ts +14 -0
  61. package/dist/node/preload/run-service-preload.d.ts.map +1 -0
  62. package/dist/node/preload/service-preload.interface.d.ts +15 -0
  63. package/dist/node/preload/service-preload.interface.d.ts.map +1 -0
  64. package/dist/node/process/index.d.ts +5 -0
  65. package/dist/node/process/index.d.ts.map +1 -0
  66. package/dist/node/process/managed-child-processes.d.ts +37 -0
  67. package/dist/node/process/managed-child-processes.d.ts.map +1 -0
  68. package/dist/node/process/process-spawn.d.ts +27 -0
  69. package/dist/node/process/process-spawn.d.ts.map +1 -0
  70. package/dist/node/readiness/index.d.ts +9 -0
  71. package/dist/node/readiness/index.d.ts.map +1 -0
  72. package/dist/node/readiness/poll-until.d.ts +11 -0
  73. package/dist/node/readiness/poll-until.d.ts.map +1 -0
  74. package/dist/node/readiness/readiness-checks.d.ts +22 -0
  75. package/dist/node/readiness/readiness-checks.d.ts.map +1 -0
  76. package/dist/node/readiness/readiness.types.d.ts +12 -0
  77. package/dist/node/readiness/readiness.types.d.ts.map +1 -0
  78. package/dist/node/readiness/run-readiness-checks.d.ts +4 -0
  79. package/dist/node/readiness/run-readiness-checks.d.ts.map +1 -0
  80. package/dist/node/readiness/service-ready-gate.d.ts +26 -0
  81. package/dist/node/readiness/service-ready-gate.d.ts.map +1 -0
  82. package/dist/node.d.ts +36 -0
  83. package/dist/node.d.ts.map +1 -0
  84. package/dist/node.js +2483 -0
  85. package/dist/node.js.map +1 -0
  86. package/dist/parcel/chunk-fetch-registry.d.ts +14 -0
  87. package/dist/parcel/chunk-fetch-registry.d.ts.map +1 -0
  88. package/dist/parcel/chunk-url.utils.d.ts +9 -0
  89. package/dist/parcel/chunk-url.utils.d.ts.map +1 -0
  90. package/dist/parcel/parcel-manager.d.ts +44 -20
  91. package/dist/parcel/parcel-manager.d.ts.map +1 -1
  92. package/dist/parcel/parcel.api.d.ts +306 -0
  93. package/dist/parcel/parcel.api.d.ts.map +1 -0
  94. package/dist/parcel/parcel.interface.d.ts +26 -5
  95. package/dist/parcel/parcel.interface.d.ts.map +1 -1
  96. package/dist/parcel/parcel.service.d.ts +38 -0
  97. package/dist/parcel/parcel.service.d.ts.map +1 -0
  98. package/dist/parcel/storage-provider-registry.d.ts +17 -0
  99. package/dist/parcel/storage-provider-registry.d.ts.map +1 -0
  100. package/dist/parcel/storage-provider.types.d.ts +31 -0
  101. package/dist/parcel/storage-provider.types.d.ts.map +1 -0
  102. package/dist/preload.d.ts +7 -0
  103. package/dist/preload.d.ts.map +1 -0
  104. package/dist/preload.js +47 -0
  105. package/dist/preload.js.map +1 -0
  106. package/dist/repo/repo-context.utils.d.ts.map +1 -1
  107. package/dist/repo/repo-manager.d.ts +14 -3
  108. package/dist/repo/repo-manager.d.ts.map +1 -1
  109. package/dist/repo/repo.api.d.ts +1 -1
  110. package/dist/repo/repo.api.d.ts.map +1 -1
  111. package/dist/repo/repo.interface.d.ts +1 -1
  112. package/dist/repo/repo.interface.d.ts.map +1 -1
  113. package/dist/repo/repo.script-loader.d.ts +5 -5
  114. package/dist/repo/repo.script-loader.d.ts.map +1 -1
  115. package/dist/service/base.interface.d.ts +54 -57
  116. package/dist/service/base.interface.d.ts.map +1 -1
  117. package/dist/service/index.d.ts +21 -0
  118. package/dist/service/index.d.ts.map +1 -0
  119. package/dist/service/service.api.d.ts +503 -0
  120. package/dist/service/service.api.d.ts.map +1 -0
  121. package/dist/service/service.interface.d.ts +36 -9
  122. package/dist/service/service.interface.d.ts.map +1 -1
  123. package/dist/shared/http/fetch-retry.d.ts +21 -0
  124. package/dist/shared/http/fetch-retry.d.ts.map +1 -0
  125. package/dist/shared/log/create-logger.d.ts +27 -0
  126. package/dist/shared/log/create-logger.d.ts.map +1 -0
  127. package/dist/shared/log/enable-log-persist.d.ts +28 -0
  128. package/dist/shared/log/enable-log-persist.d.ts.map +1 -0
  129. package/dist/shared/log/index.d.ts +10 -0
  130. package/dist/shared/log/index.d.ts.map +1 -0
  131. package/dist/shared/log/log-manager.d.ts +37 -60
  132. package/dist/shared/log/log-manager.d.ts.map +1 -1
  133. package/dist/shared/log/log-persist-batch-id.d.ts +13 -0
  134. package/dist/shared/log/log-persist-batch-id.d.ts.map +1 -0
  135. package/dist/shared/log/log-persist-flush.d.ts +8 -0
  136. package/dist/shared/log/log-persist-flush.d.ts.map +1 -0
  137. package/dist/shared/log/log-persist-hook.d.ts +6 -0
  138. package/dist/shared/log/log-persist-hook.d.ts.map +1 -0
  139. package/dist/shared/log/log-persist-logger.d.ts +15 -0
  140. package/dist/shared/log/log-persist-logger.d.ts.map +1 -0
  141. package/dist/shared/log/log-persist-registry.d.ts +17 -0
  142. package/dist/shared/log/log-persist-registry.d.ts.map +1 -0
  143. package/dist/shared/log/log-persist.config.d.ts +10 -0
  144. package/dist/shared/log/log-persist.config.d.ts.map +1 -0
  145. package/dist/shared/log/log-persist.d.ts +55 -0
  146. package/dist/shared/log/log-persist.d.ts.map +1 -0
  147. package/dist/shared/log/log-persist.interface.d.ts +116 -0
  148. package/dist/shared/log/log-persist.interface.d.ts.map +1 -0
  149. package/dist/shared/log/log-scope.d.ts +56 -0
  150. package/dist/shared/log/log-scope.d.ts.map +1 -0
  151. package/dist/shared/utils/fetch-url.d.ts +3 -0
  152. package/dist/shared/utils/fetch-url.d.ts.map +1 -0
  153. package/dist/shared/utils/network-error.d.ts +14 -0
  154. package/dist/shared/utils/network-error.d.ts.map +1 -0
  155. package/dist/shared/utils/safe-file-name.d.ts +14 -0
  156. package/dist/shared/utils/safe-file-name.d.ts.map +1 -0
  157. package/dist/shared/utils/sha256.d.ts +3 -0
  158. package/dist/shared/utils/sha256.d.ts.map +1 -0
  159. package/dist/supabase.d.ts +7 -2
  160. package/dist/supabase.d.ts.map +1 -1
  161. package/dist/task/index.d.ts +16 -0
  162. package/dist/task/index.d.ts.map +1 -0
  163. package/dist/task/local-task-registry.d.ts +11 -1
  164. package/dist/task/local-task-registry.d.ts.map +1 -1
  165. package/dist/task/task-manager.d.ts +21 -11
  166. package/dist/task/task-manager.d.ts.map +1 -1
  167. package/dist/task/task-node.d.ts +19 -0
  168. package/dist/task/task-node.d.ts.map +1 -0
  169. package/dist/task/task-post-validated.api.d.ts +19 -0
  170. package/dist/task/task-post-validated.api.d.ts.map +1 -0
  171. package/dist/task/task-post.api.d.ts +54 -0
  172. package/dist/task/task-post.api.d.ts.map +1 -0
  173. package/dist/task/task-queue.d.ts +7 -0
  174. package/dist/task/task-queue.d.ts.map +1 -0
  175. package/dist/task/task-repo-context.d.ts +2 -0
  176. package/dist/task/task-repo-context.d.ts.map +1 -1
  177. package/dist/task/task-repo-validation.d.ts +46 -0
  178. package/dist/task/task-repo-validation.d.ts.map +1 -0
  179. package/dist/task/task.api.d.ts +5 -47
  180. package/dist/task/task.api.d.ts.map +1 -1
  181. package/dist/task/task.constant.d.ts +4 -0
  182. package/dist/task/task.constant.d.ts.map +1 -0
  183. package/dist/task/task.interface.d.ts +3 -1
  184. package/dist/task/task.interface.d.ts.map +1 -1
  185. package/dist/trigger/trigger-manager.d.ts +25 -0
  186. package/dist/trigger/trigger-manager.d.ts.map +1 -0
  187. package/dist/trigger/trigger-node.d.ts +23 -0
  188. package/dist/trigger/trigger-node.d.ts.map +1 -0
  189. package/dist/trigger/trigger.api.d.ts +140 -0
  190. package/dist/trigger/trigger.api.d.ts.map +1 -0
  191. package/dist/trigger/trigger.constant.d.ts +8 -0
  192. package/dist/trigger/trigger.constant.d.ts.map +1 -0
  193. package/dist/trigger/trigger.interface.d.ts +87 -0
  194. package/dist/trigger/trigger.interface.d.ts.map +1 -0
  195. package/dist/trigger/trigger.utils.d.ts +6 -0
  196. package/dist/trigger/trigger.utils.d.ts.map +1 -0
  197. package/dist/word/word.api.d.ts +1 -1
  198. package/dist/word/word.api.d.ts.map +1 -1
  199. package/dist/word/word.interface.d.ts +2 -2
  200. package/dist/word/word.interface.d.ts.map +1 -1
  201. package/package.json +91 -61
  202. package/src/browser.ts +165 -0
  203. package/src/command/command.api.ts +20 -18
  204. package/src/command/command.interface.ts +2 -3
  205. package/src/core.api.ts +466 -477
  206. package/src/core.interface.ts +63 -62
  207. package/src/core.utils.ts +64 -64
  208. package/src/idea/idea.interface.ts +3 -3
  209. package/src/index.ts +2 -79
  210. package/src/link/link.api.ts +28 -30
  211. package/src/link/link.interface.ts +4 -5
  212. package/src/list/list.api.ts +50 -29
  213. package/src/list/list.interface.ts +3 -4
  214. package/src/node/env/env-parsers.ts +77 -0
  215. package/src/node/env/index.ts +10 -0
  216. package/src/node/env/init-supabase-from-env.ts +38 -0
  217. package/src/node/env/load-env.ts +67 -0
  218. package/src/node/env/project-root.ts +34 -0
  219. package/src/node/env/public-base-url.ts +18 -0
  220. package/src/node/env/require-env.ts +15 -0
  221. package/src/node/fs/json-state-store.ts +97 -0
  222. package/src/node/fs/read-source-file.ts +75 -0
  223. package/src/node/node-liveness.ts +80 -0
  224. package/src/node/node-runtime.base.ts +481 -0
  225. package/src/node/node.api.ts +12 -11
  226. package/src/node/node.interface.ts +1 -8
  227. package/src/node/node.utils.ts +1 -1
  228. package/src/node/preload/run-service-preload.ts +48 -0
  229. package/src/node/preload/service-preload.interface.ts +14 -0
  230. package/src/node/process/index.ts +8 -0
  231. package/src/node/process/managed-child-processes.ts +121 -0
  232. package/src/node/process/process-spawn.ts +61 -0
  233. package/src/node/readiness/index.ts +20 -0
  234. package/src/node/readiness/poll-until.ts +27 -0
  235. package/src/node/readiness/readiness-checks.ts +79 -0
  236. package/src/node/readiness/readiness.types.ts +13 -0
  237. package/src/node/readiness/run-readiness-checks.ts +20 -0
  238. package/src/node/readiness/service-ready-gate.ts +65 -0
  239. package/src/node.ts +153 -0
  240. package/src/parcel/chunk-fetch-registry.ts +96 -0
  241. package/src/parcel/chunk-url.utils.ts +30 -0
  242. package/src/parcel/parcel-manager.ts +431 -173
  243. package/src/parcel/parcel.api.ts +103 -0
  244. package/src/parcel/parcel.interface.ts +44 -23
  245. package/src/parcel/parcel.service.ts +79 -0
  246. package/src/parcel/storage-provider-registry.ts +49 -0
  247. package/src/parcel/storage-provider.types.ts +45 -0
  248. package/src/preload.ts +7 -0
  249. package/src/repo/repo-context.utils.ts +3 -4
  250. package/src/repo/repo-manager.ts +54 -39
  251. package/src/repo/repo.api.ts +5 -5
  252. package/src/repo/repo.interface.ts +1 -2
  253. package/src/repo/repo.script-loader.ts +16 -20
  254. package/src/service/base.interface.ts +81 -90
  255. package/src/service/index.ts +173 -0
  256. package/src/service/service.api.ts +294 -0
  257. package/src/service/service.interface.ts +49 -17
  258. package/src/shared/http/fetch-retry.ts +145 -0
  259. package/src/shared/log/create-logger.ts +51 -0
  260. package/src/shared/log/enable-log-persist.ts +225 -0
  261. package/src/shared/log/index.ts +31 -0
  262. package/src/shared/log/log-manager.ts +112 -121
  263. package/src/shared/log/log-persist-batch-id.ts +43 -0
  264. package/src/shared/log/log-persist-flush.ts +128 -0
  265. package/src/shared/log/log-persist-hook.ts +13 -0
  266. package/src/shared/log/log-persist-logger.ts +33 -0
  267. package/src/shared/log/log-persist-registry.ts +109 -0
  268. package/src/shared/log/log-persist.config.ts +97 -0
  269. package/src/shared/log/log-persist.interface.ts +132 -0
  270. package/src/shared/log/log-persist.ts +704 -0
  271. package/src/shared/log/log-scope.ts +123 -0
  272. package/src/shared/utils/config-path.utils.ts +1 -1
  273. package/src/shared/utils/fetch-url.ts +13 -0
  274. package/src/shared/utils/network-error.ts +152 -0
  275. package/src/shared/utils/safe-file-name.ts +37 -0
  276. package/src/shared/utils/sha256.ts +15 -0
  277. package/src/supabase.ts +125 -119
  278. package/src/task/index.ts +45 -0
  279. package/src/task/local-task-registry.ts +115 -36
  280. package/src/task/task-manager.ts +101 -113
  281. package/src/task/task-node.ts +302 -0
  282. package/src/task/task-post-validated.api.ts +47 -0
  283. package/src/task/task-post.api.ts +99 -0
  284. package/src/task/task-queue.ts +18 -0
  285. package/src/task/task-repo-context.ts +4 -1
  286. package/src/task/task-repo-validation.ts +169 -0
  287. package/src/task/task.api.ts +68 -92
  288. package/src/task/task.constant.ts +4 -0
  289. package/src/task/task.interface.ts +6 -7
  290. package/src/trigger/trigger-manager.ts +287 -0
  291. package/src/trigger/trigger-node.ts +80 -0
  292. package/src/trigger/trigger.api.ts +166 -0
  293. package/src/trigger/trigger.constant.ts +10 -0
  294. package/src/trigger/trigger.interface.ts +100 -0
  295. package/src/trigger/trigger.utils.ts +56 -0
  296. package/src/word/word.api.ts +28 -30
  297. package/src/word/word.interface.ts +3 -4
  298. package/dist/auth/auth.api.d.ts +0 -28
  299. package/dist/auth/auth.api.d.ts.map +0 -1
  300. package/dist/auth/auth.api.js +0 -51
  301. package/dist/auth/auth.api.js.map +0 -1
  302. package/dist/command/command.api.js +0 -58
  303. package/dist/command/command.api.js.map +0 -1
  304. package/dist/command/command.interface.js +0 -9
  305. package/dist/command/command.interface.js.map +0 -1
  306. package/dist/core.api.js +0 -412
  307. package/dist/core.api.js.map +0 -1
  308. package/dist/core.interface.js +0 -46
  309. package/dist/core.interface.js.map +0 -1
  310. package/dist/core.utils.js +0 -81
  311. package/dist/core.utils.js.map +0 -1
  312. package/dist/feed/feed.interface.d.ts +0 -27
  313. package/dist/feed/feed.interface.d.ts.map +0 -1
  314. package/dist/feed/feed.interface.js +0 -17
  315. package/dist/feed/feed.interface.js.map +0 -1
  316. package/dist/file/file-manager.d.ts +0 -24
  317. package/dist/file/file-manager.d.ts.map +0 -1
  318. package/dist/file/file-manager.js +0 -109
  319. package/dist/file/file-manager.js.map +0 -1
  320. package/dist/file/file.api.d.ts +0 -15
  321. package/dist/file/file.api.d.ts.map +0 -1
  322. package/dist/file/file.api.js +0 -30
  323. package/dist/file/file.api.js.map +0 -1
  324. package/dist/file/file.interface.d.ts +0 -25
  325. package/dist/file/file.interface.d.ts.map +0 -1
  326. package/dist/file/file.interface.js +0 -9
  327. package/dist/file/file.interface.js.map +0 -1
  328. package/dist/file-list/file-list.api.d.ts +0 -15
  329. package/dist/file-list/file-list.api.d.ts.map +0 -1
  330. package/dist/file-list/file-list.api.js +0 -54
  331. package/dist/file-list/file-list.api.js.map +0 -1
  332. package/dist/file-list/file-list.interface.d.ts +0 -22
  333. package/dist/file-list/file-list.interface.d.ts.map +0 -1
  334. package/dist/file-list/file-list.interface.js +0 -5
  335. package/dist/file-list/file-list.interface.js.map +0 -1
  336. package/dist/idea/idea.interface.js +0 -15
  337. package/dist/idea/idea.interface.js.map +0 -1
  338. package/dist/index.js +0 -42
  339. package/dist/index.js.map +0 -1
  340. package/dist/link/link.api.js +0 -30
  341. package/dist/link/link.api.js.map +0 -1
  342. package/dist/link/link.interface.js +0 -7
  343. package/dist/link/link.interface.js.map +0 -1
  344. package/dist/list/list.api.js +0 -30
  345. package/dist/list/list.api.js.map +0 -1
  346. package/dist/list/list.interface.js +0 -6
  347. package/dist/list/list.interface.js.map +0 -1
  348. package/dist/node/node-manager.d.ts +0 -48
  349. package/dist/node/node-manager.d.ts.map +0 -1
  350. package/dist/node/node-manager.js +0 -619
  351. package/dist/node/node-manager.js.map +0 -1
  352. package/dist/node/node-task.preset.d.ts +0 -1
  353. package/dist/node/node-task.preset.d.ts.map +0 -1
  354. package/dist/node/node-task.preset.js +0 -14
  355. package/dist/node/node-task.preset.js.map +0 -1
  356. package/dist/node/node.api.js +0 -100
  357. package/dist/node/node.api.js.map +0 -1
  358. package/dist/node/node.interface.js +0 -19
  359. package/dist/node/node.interface.js.map +0 -1
  360. package/dist/node/node.utils.js +0 -36
  361. package/dist/node/node.utils.js.map +0 -1
  362. package/dist/parcel/parcel-manager.js +0 -156
  363. package/dist/parcel/parcel-manager.js.map +0 -1
  364. package/dist/parcel/parcel.interface.js +0 -11
  365. package/dist/parcel/parcel.interface.js.map +0 -1
  366. package/dist/question-list/question-list.api.d.ts +0 -13
  367. package/dist/question-list/question-list.api.d.ts.map +0 -1
  368. package/dist/question-list/question-list.api.js +0 -35
  369. package/dist/question-list/question-list.api.js.map +0 -1
  370. package/dist/question-list/question-list.interface.d.ts +0 -18
  371. package/dist/question-list/question-list.interface.d.ts.map +0 -1
  372. package/dist/question-list/question-list.interface.js +0 -5
  373. package/dist/question-list/question-list.interface.js.map +0 -1
  374. package/dist/repo/repo-context.utils.js +0 -81
  375. package/dist/repo/repo-context.utils.js.map +0 -1
  376. package/dist/repo/repo-manager.js +0 -156
  377. package/dist/repo/repo-manager.js.map +0 -1
  378. package/dist/repo/repo.api.js +0 -40
  379. package/dist/repo/repo.api.js.map +0 -1
  380. package/dist/repo/repo.interface.js +0 -8
  381. package/dist/repo/repo.interface.js.map +0 -1
  382. package/dist/repo/repo.script-loader.js +0 -108
  383. package/dist/repo/repo.script-loader.js.map +0 -1
  384. package/dist/review/review.api.d.ts +0 -14
  385. package/dist/review/review.api.d.ts.map +0 -1
  386. package/dist/review/review.api.js +0 -133
  387. package/dist/review/review.api.js.map +0 -1
  388. package/dist/review/review.interface.d.ts +0 -24
  389. package/dist/review/review.interface.d.ts.map +0 -1
  390. package/dist/review/review.interface.js +0 -10
  391. package/dist/review/review.interface.js.map +0 -1
  392. package/dist/review-v2/apis/post-review-setting.api.d.ts +0 -12
  393. package/dist/review-v2/apis/post-review-setting.api.d.ts.map +0 -1
  394. package/dist/review-v2/apis/post-review-setting.api.js +0 -27
  395. package/dist/review-v2/apis/post-review-setting.api.js.map +0 -1
  396. package/dist/review-v2/apis/post-review.api.d.ts +0 -13
  397. package/dist/review-v2/apis/post-review.api.d.ts.map +0 -1
  398. package/dist/review-v2/apis/post-review.api.js +0 -46
  399. package/dist/review-v2/apis/post-review.api.js.map +0 -1
  400. package/dist/review-v2/review-setting.interface.d.ts +0 -23
  401. package/dist/review-v2/review-setting.interface.d.ts.map +0 -1
  402. package/dist/review-v2/review-setting.interface.js +0 -5
  403. package/dist/review-v2/review-setting.interface.js.map +0 -1
  404. package/dist/review-v2/review.interface.d.ts +0 -20
  405. package/dist/review-v2/review.interface.d.ts.map +0 -1
  406. package/dist/review-v2/review.interface.js +0 -5
  407. package/dist/review-v2/review.interface.js.map +0 -1
  408. package/dist/service/api.interface.d.ts +0 -35
  409. package/dist/service/api.interface.d.ts.map +0 -1
  410. package/dist/service/api.interface.js +0 -12
  411. package/dist/service/api.interface.js.map +0 -1
  412. package/dist/service/base.interface.js +0 -7
  413. package/dist/service/base.interface.js.map +0 -1
  414. package/dist/service/service.interface.js +0 -11
  415. package/dist/service/service.interface.js.map +0 -1
  416. package/dist/shared/log/create-api-logger.d.ts +0 -17
  417. package/dist/shared/log/create-api-logger.d.ts.map +0 -1
  418. package/dist/shared/log/create-api-logger.js +0 -15
  419. package/dist/shared/log/create-api-logger.js.map +0 -1
  420. package/dist/shared/log/log-manager.js +0 -218
  421. package/dist/shared/log/log-manager.js.map +0 -1
  422. package/dist/shared/utils/config-path.utils.js +0 -85
  423. package/dist/shared/utils/config-path.utils.js.map +0 -1
  424. package/dist/shared/utils/error.utils.js +0 -15
  425. package/dist/shared/utils/error.utils.js.map +0 -1
  426. package/dist/shared/utils/id.utils.js +0 -5
  427. package/dist/shared/utils/id.utils.js.map +0 -1
  428. package/dist/supabase.js +0 -100
  429. package/dist/supabase.js.map +0 -1
  430. package/dist/task/local-task-registry.js +0 -153
  431. package/dist/task/local-task-registry.js.map +0 -1
  432. package/dist/task/task-manager.js +0 -217
  433. package/dist/task/task-manager.js.map +0 -1
  434. package/dist/task/task-repo-context.js +0 -12
  435. package/dist/task/task-repo-context.js.map +0 -1
  436. package/dist/task/task.api.js +0 -351
  437. package/dist/task/task.api.js.map +0 -1
  438. package/dist/task/task.interface.js +0 -36
  439. package/dist/task/task.interface.js.map +0 -1
  440. package/dist/task/task.utils.js +0 -2
  441. package/dist/task/task.utils.js.map +0 -1
  442. package/dist/word/word.api.js +0 -30
  443. package/dist/word/word.api.js.map +0 -1
  444. package/dist/word/word.interface.js +0 -6
  445. package/dist/word/word.interface.js.map +0 -1
  446. package/src/auth/auth.api.ts +0 -87
  447. package/src/feed/feed.interface.ts +0 -33
  448. package/src/file/file-manager.ts +0 -145
  449. package/src/file/file.api.ts +0 -43
  450. package/src/file/file.interface.ts +0 -30
  451. package/src/file-list/file-list.api.ts +0 -64
  452. package/src/file-list/file-list.interface.ts +0 -24
  453. package/src/node/node-manager.ts +0 -673
  454. package/src/node/node-task.preset.ts +0 -13
  455. package/src/question-list/question-list.api.ts +0 -42
  456. package/src/question-list/question-list.interface.ts +0 -21
  457. package/src/review/review.api.ts +0 -145
  458. package/src/review/review.interface.ts +0 -26
  459. package/src/review-v2/apis/post-review-setting.api.ts +0 -35
  460. package/src/review-v2/apis/post-review.api.ts +0 -59
  461. package/src/review-v2/review-setting.interface.ts +0 -26
  462. package/src/review-v2/review.interface.ts +0 -23
  463. package/src/service/api.interface.ts +0 -47
  464. package/src/shared/log/create-api-logger.ts +0 -25
@@ -0,0 +1,302 @@
1
+ import { isOptimisticLockResponse } from "../core.api";
2
+ import { BaseNodeRuntime, LOG_TOPIC_NODE, type NodeLoopContext } from "../node/node-runtime.base";
3
+ import { createLogger, createScope, type LoggerWithScope, withModule } from "../shared/log";
4
+ import { getErrorMessage, toError } from "../shared/utils/error.utils";
5
+ import { patchChangeTaskStatus, patchClaimTask } from "./task.api";
6
+ import { CRITICAL_UNKNOWN_TASK_TRACE_ID, LOG_TOPIC_TASK } from "./task.constant";
7
+ import { TaskStatusAction } from "./task.interface";
8
+ import { TaskManager, type TaskRunResult } from "./task-manager";
9
+
10
+ /**
11
+ * Task worker node: commands → heartbeat → claim & execute tasks.
12
+ * Built on {@link BaseNodeRuntime}.
13
+ */
14
+ class TaskNode extends BaseNodeRuntime {
15
+ private _availableTaskList: string[] = [];
16
+ private _includeRemote = true;
17
+
18
+ get availableTaskList(): readonly string[] {
19
+ return [...this._availableTaskList];
20
+ }
21
+
22
+ constructor() {
23
+ super("taskNode");
24
+ }
25
+
26
+ protected async onBeforeRegisterNode(logger: LoggerWithScope): Promise<void> {
27
+ const { availableTaskList, includeRemote } = await TaskManager.registerTasks({ logger });
28
+ this._availableTaskList = availableTaskList;
29
+ this._includeRemote = includeRemote;
30
+ }
31
+
32
+ protected async runLoopSteps(ctx: NodeLoopContext, heartbeatOk: boolean): Promise<void> {
33
+ if (!heartbeatOk) {
34
+ const logger = createLogger({
35
+ scope: createScope({
36
+ module: `${this.runtimeModule}-runLoopSteps`,
37
+ traceId: ctx.loopTraceId,
38
+ labels: { nodeId: ctx.nodeId },
39
+ }),
40
+ });
41
+ logger.warn("心跳失敗,本輪跳過任務認領", { topic: LOG_TOPIC_NODE });
42
+ return;
43
+ }
44
+ await this.runAsWorker(ctx);
45
+ }
46
+
47
+ private async runAsWorker(ctx: NodeLoopContext): Promise<void> {
48
+ const { loopTraceId, nodeId } = ctx;
49
+ const loopScope = createScope({ module: "runAsWorker", traceId: loopTraceId, labels: { nodeId } });
50
+ const logger = createLogger({ scope: loopScope });
51
+
52
+ const availableTaskList = this.availableTaskList;
53
+ if (availableTaskList.length === 0) {
54
+ logger.warn("未配置可認領任務類型,跳過本輪", { topic: LOG_TOPIC_TASK });
55
+ return;
56
+ }
57
+
58
+ logger.debug("向 Supabase 認領任務", {
59
+ topic: LOG_TOPIC_TASK,
60
+ data: { availableTaskList },
61
+ });
62
+ const { data: task, error: claimError } = await patchClaimTask({
63
+ nodeId,
64
+ availableTaskList: [...availableTaskList],
65
+ traceId: loopTraceId,
66
+ });
67
+ if (claimError) {
68
+ if (isOptimisticLockResponse(claimError)) {
69
+ logger.debug("認領競爭失敗,本輪無可認領任務", {
70
+ topic: LOG_TOPIC_TASK,
71
+ data: { availableTaskList },
72
+ });
73
+ return;
74
+ }
75
+ logger.error("認領任務失敗", {
76
+ topic: LOG_TOPIC_TASK,
77
+ data: {
78
+ availableTaskList,
79
+ error: claimError.message,
80
+ code: claimError.code,
81
+ },
82
+ });
83
+ return;
84
+ }
85
+ if (task == null) {
86
+ logger.debug("本輪無匹配的 TODO 任務", {
87
+ topic: LOG_TOPIC_TASK,
88
+ data: { availableTaskList },
89
+ });
90
+ return;
91
+ }
92
+
93
+ const taskTraceId = task.details.traceId ?? CRITICAL_UNKNOWN_TASK_TRACE_ID;
94
+ const taskScope = createScope({
95
+ module: "runAsWorker",
96
+ traceId: loopTraceId,
97
+ labels: { nodeId },
98
+ traceParentId: taskTraceId,
99
+ });
100
+ const taskLogger = createLogger({ scope: taskScope });
101
+ taskLogger.success("認領任務成功,準備執行", {
102
+ topic: LOG_TOPIC_TASK,
103
+ data: {
104
+ taskId: task.id,
105
+ taskName: task.name,
106
+ taskTypeKey: task.value,
107
+ taskStatus: task.details.status,
108
+ },
109
+ });
110
+
111
+ const prepareLogger = createLogger({ scope: withModule(taskScope, "prepareTask") });
112
+ const prepareResult = await TaskManager.prepareTask({
113
+ logger: prepareLogger,
114
+ task,
115
+ includeRemote: this._includeRemote,
116
+ });
117
+ const { isSuccess: isPrepareSuccess, taskFn, code, message, reason, step } = prepareResult;
118
+ if (!isPrepareSuccess || taskFn == null) {
119
+ prepareLogger.critical("任務準備失敗,無法繼續執行,中止任務並 RESET 為 OPEN", {
120
+ topic: LOG_TOPIC_TASK,
121
+ data: {
122
+ taskId: task.id,
123
+ taskTypeKey: task.value,
124
+ code,
125
+ message,
126
+ reason,
127
+ step,
128
+ },
129
+ });
130
+ await this.abortTaskRun({
131
+ logger: prepareLogger,
132
+ taskId: task.id,
133
+ nodeId,
134
+ traceId: taskTraceId,
135
+ });
136
+ return;
137
+ }
138
+ logger.success("任務準備完成", {
139
+ topic: LOG_TOPIC_TASK,
140
+ data: {
141
+ taskId: task.id,
142
+ taskName: task.name,
143
+ taskTypeKey: task.value,
144
+ displayName: taskFn.displayName,
145
+ },
146
+ });
147
+
148
+ const executeLogger = createLogger({ scope: withModule(taskScope, "executeTask") });
149
+ const onExecuteAbort = async (error?: Error) => {
150
+ executeLogger.critical("任務執行遇到未知錯誤,中止任務並 RESET 為 OPEN", {
151
+ topic: LOG_TOPIC_TASK,
152
+ data: {
153
+ taskId: task.id,
154
+ taskTypeKey: task.value,
155
+ taskName: task.name,
156
+ displayName: taskFn.displayName,
157
+ error: getErrorMessage(error),
158
+ },
159
+ });
160
+ await this.abortTaskRun({
161
+ logger: executeLogger,
162
+ taskId: task.id,
163
+ nodeId,
164
+ traceId: taskTraceId,
165
+ });
166
+ };
167
+
168
+ executeLogger.info("開始執行業務邏輯", {
169
+ topic: LOG_TOPIC_TASK,
170
+ data: { taskId: task.id, displayName: taskFn.displayName },
171
+ });
172
+ const startTime = Date.now();
173
+ let result: TaskRunResult | null = null;
174
+ try {
175
+ result = await taskFn();
176
+ } catch (error) {
177
+ await onExecuteAbort(toError(error));
178
+ return;
179
+ }
180
+ if (result == null) {
181
+ await onExecuteAbort(new Error("任務執行結果為空"));
182
+ return;
183
+ }
184
+
185
+ const { isSuccess: isTaskSuccess, cost, extra } = result ?? { isSuccess: false, cost: 0, extra: null };
186
+ if (isTaskSuccess) {
187
+ await this.finalizeTaskRun("success", {
188
+ logger: executeLogger,
189
+ taskId: task.id,
190
+ taskTypeKey: task.value,
191
+ nodeId,
192
+ cost,
193
+ extra,
194
+ traceId: taskTraceId,
195
+ });
196
+ } else {
197
+ await this.finalizeTaskRun("failure", {
198
+ logger: executeLogger,
199
+ taskId: task.id,
200
+ taskTypeKey: task.value,
201
+ nodeId,
202
+ cost,
203
+ extra,
204
+ traceId: taskTraceId,
205
+ });
206
+ }
207
+ const duration = Date.now() - startTime;
208
+ executeLogger.info("業務邏輯執行結束", {
209
+ topic: LOG_TOPIC_TASK,
210
+ data: {
211
+ taskId: task.id,
212
+ taskName: task.name,
213
+ taskTypeKey: task.value,
214
+ displayName: taskFn.displayName,
215
+ durationMs: duration,
216
+ },
217
+ });
218
+ }
219
+
220
+ private async abortTaskRun(params: {
221
+ logger: LoggerWithScope;
222
+ taskId: string;
223
+ nodeId: string;
224
+ traceId: string;
225
+ extra?: TaskRunResult["extra"];
226
+ }): Promise<boolean> {
227
+ const { logger, taskId, nodeId, traceId, extra } = params;
228
+ const logData = { taskId, nodeId };
229
+ const extraValue = typeof extra === "string" ? extra : undefined;
230
+
231
+ const { error } = await patchChangeTaskStatus({
232
+ id: taskId,
233
+ action: TaskStatusAction.RESET,
234
+ nodeId,
235
+ extra: extraValue,
236
+ traceId,
237
+ });
238
+
239
+ if (error) {
240
+ logger.error(error.message, { topic: LOG_TOPIC_TASK, data: logData });
241
+ return false;
242
+ }
243
+ logger.info("任務已中止並 RESET 為 OPEN", { topic: LOG_TOPIC_TASK, data: logData });
244
+ return true;
245
+ }
246
+
247
+ private async finalizeTaskRun(
248
+ outcome: "success" | "failure",
249
+ params: {
250
+ logger: LoggerWithScope;
251
+ taskId: string;
252
+ taskTypeKey: string;
253
+ nodeId: string;
254
+ cost: TaskRunResult["cost"];
255
+ extra: TaskRunResult["extra"];
256
+ traceId: string;
257
+ },
258
+ ): Promise<void> {
259
+ const { logger, taskId, nodeId, taskTypeKey, cost, extra, traceId } = params;
260
+ const outcomePrefix = outcome === "success" ? "任務成功" : "任務失敗";
261
+ const logData = {
262
+ taskTypeKey,
263
+ taskId,
264
+ nodeId,
265
+ ...(extra != null && extra !== "" ? { extra } : {}),
266
+ };
267
+ const extraValue = typeof extra === "string" ? extra : undefined;
268
+
269
+ const { error: changeTaskStatusError } =
270
+ outcome === "success"
271
+ ? await patchChangeTaskStatus({
272
+ id: taskId,
273
+ action: TaskStatusAction.FINISH,
274
+ nodeId,
275
+ cost,
276
+ extra: extraValue,
277
+ traceId,
278
+ })
279
+ : await patchChangeTaskStatus({
280
+ id: taskId,
281
+ action: TaskStatusAction.RESET,
282
+ nodeId,
283
+ extra: extraValue,
284
+ traceId,
285
+ });
286
+
287
+ if (changeTaskStatusError) {
288
+ const upperMessage = `${outcomePrefix}但是更新 TaskStatus 失敗,產生孤兒 Task,請儘快排查問題`;
289
+ logger.critical(upperMessage, { topic: LOG_TOPIC_TASK, data: logData });
290
+ // TODO: 需要處理孤兒 Task
291
+ throw new Error(upperMessage);
292
+ }
293
+ logger.info("更新 TaskStatus 成功", { topic: LOG_TOPIC_TASK, data: logData });
294
+ if (outcome === "success") {
295
+ logger.success("任務執行結束,業務邏輯成功", { topic: LOG_TOPIC_TASK, data: logData });
296
+ } else {
297
+ logger.warn("任務執行結束,業務邏輯失敗", { topic: LOG_TOPIC_TASK, data: logData });
298
+ }
299
+ }
300
+ }
301
+
302
+ export { TaskNode };
@@ -0,0 +1,47 @@
1
+ import { validateWithSchema } from "../core.api";
2
+ import { generateResponse, type SupabaseResponse } from "../core.interface";
3
+ import { createLogger, logManager } from "../shared/log";
4
+ import type { Task } from "./task.interface";
5
+ import { createTaskRow, postTaskSchema } from "./task-post.api";
6
+ import { TaskRepoValidation } from "./task-repo-validation";
7
+
8
+ /**
9
+ * Create a task row with publish-time Repo + params validation.
10
+ * **Node entry only** — requires local Repo bootstrap and {@link TaskRepoValidation}.
11
+ *
12
+ * @see target-supabase-sdk/node
13
+ */
14
+ export const postTaskWithValidation = validateWithSchema(
15
+ postTaskSchema,
16
+ "postTaskSchema",
17
+ )(async ({ name, value, params, taskStatus, tagList, extra, traceId, traceParentId }) => {
18
+ const taskTraceId = traceId?.trim() || logManager.generateTraceId();
19
+ const logger = createLogger({
20
+ module: "postTaskWithValidation",
21
+ traceId: taskTraceId,
22
+ traceParentId: traceParentId ?? null,
23
+ });
24
+
25
+ const validation = await TaskRepoValidation.validate({
26
+ logger,
27
+ taskTypeKey: value,
28
+ params,
29
+ bootstrapLocal: true,
30
+ });
31
+ if (!validation.isValid) {
32
+ logger.warn(validation.message, {
33
+ topic: "task",
34
+ data: {
35
+ taskTypeKey: value,
36
+ reason: validation.reason,
37
+ step: validation.step,
38
+ },
39
+ });
40
+ return generateResponse.error(validation.message, undefined, String(validation.code)) as SupabaseResponse<Task>;
41
+ }
42
+
43
+ return createTaskRow(
44
+ { name, value, params, taskStatus, tagList, extra, traceId, traceParentId, taskTraceId },
45
+ logger,
46
+ );
47
+ });
@@ -0,0 +1,99 @@
1
+ import { z } from "zod";
2
+ import { createTarget, validateWithSchema } from "../core.api";
3
+ import type { SupabaseResponse } from "../core.interface";
4
+ import { createLogger, type LoggerWithScope, logManager } from "../shared/log";
5
+ import { CategoryTask, type Task, TaskStatus } from "./task.interface";
6
+
7
+ const traceIdSchema = z.string().trim().min(1).optional();
8
+ const traceParentIdSchema = z.string().trim().min(1).nullable().optional();
9
+
10
+ /** Initial status for a new task — OPEN (draft) or TODO (claimable by workers). */
11
+ const postTaskInitialStatusSchema = z
12
+ .union([z.literal(TaskStatus.OPEN), z.literal(TaskStatus.TODO)])
13
+ .optional()
14
+ .default(TaskStatus.TODO);
15
+
16
+ export const postTaskSchema = z.object({
17
+ name: z.string().trim().min(1),
18
+ /** Task type key — matches `task.value`, {@link patchClaimTask}, {@link Repo.value}, and local Repo registry. */
19
+ value: z.string().trim().min(1),
20
+ params: z.unknown(),
21
+ taskStatus: postTaskInitialStatusSchema,
22
+ tagList: z.array(z.string()).optional().default([]),
23
+ extra: z.string().optional(),
24
+ traceId: traceIdSchema,
25
+ traceParentId: traceParentIdSchema,
26
+ });
27
+
28
+ export type PostTaskPayload = z.infer<typeof postTaskSchema>;
29
+
30
+ export type CreateTaskRowInput = PostTaskPayload & {
31
+ taskTraceId: string;
32
+ };
33
+
34
+ /** Shared DB insert for {@link postTask} and {@link postTaskWithValidation}. */
35
+ export async function createTaskRow(
36
+ { name, value, params, taskStatus, tagList, extra, taskTraceId, traceParentId }: CreateTaskRowInput,
37
+ logger: LoggerWithScope,
38
+ ): Promise<SupabaseResponse<Task>> {
39
+ const result = await createTarget<Task, PostTaskPayload>({
40
+ payload: {
41
+ name,
42
+ value,
43
+ params,
44
+ taskStatus,
45
+ tagList,
46
+ extra,
47
+ traceId: taskTraceId,
48
+ traceParentId,
49
+ },
50
+ createFn: () => ({
51
+ name,
52
+ value,
53
+ category: CategoryTask.TASK,
54
+ tagList,
55
+ extra,
56
+ details: {
57
+ manifestVersion: 0,
58
+ status: taskStatus,
59
+ params,
60
+ progress: 0,
61
+ nodeId: null,
62
+ traceId: taskTraceId,
63
+ },
64
+ }),
65
+ });
66
+
67
+ logger.info("任務已創建", {
68
+ topic: "task",
69
+ data: {
70
+ taskId: result.data?.id,
71
+ taskTypeKey: value,
72
+ status: taskStatus,
73
+ traceId: taskTraceId,
74
+ },
75
+ });
76
+
77
+ return result;
78
+ }
79
+
80
+ /**
81
+ * Create a task row (scheduler / admin). **Browser and Node** — no Repo or params validation.
82
+ * Execution-time checks live in {@link TaskManager.prepareTask}.
83
+ */
84
+ export const postTask = validateWithSchema(
85
+ postTaskSchema,
86
+ "postTaskSchema",
87
+ )(async ({ name, value, params, taskStatus, tagList, extra, traceId, traceParentId }) => {
88
+ const taskTraceId = traceId?.trim() || logManager.generateTraceId();
89
+ const logger = createLogger({
90
+ module: "postTask",
91
+ traceId: taskTraceId,
92
+ traceParentId: traceParentId ?? null,
93
+ });
94
+
95
+ return createTaskRow(
96
+ { name, value, params, taskStatus, tagList, extra, traceId, traceParentId, taskTraceId },
97
+ logger,
98
+ );
99
+ });
@@ -0,0 +1,18 @@
1
+ import type { Task, TaskStatus } from "./task.interface";
2
+
3
+ export type TaskStatusCount = Partial<Record<TaskStatus, number>>;
4
+
5
+ /** Count tasks of `taskType` grouped by each requested status. */
6
+ export function countTasksByType(tasks: Task[], taskType: string, statuses: TaskStatus[]): TaskStatusCount {
7
+ const filtered = tasks.filter((task) => task.value === taskType);
8
+ const counts: TaskStatusCount = {};
9
+ for (const status of statuses) {
10
+ counts[status] = filtered.filter((task) => task.details.status === status).length;
11
+ }
12
+ return counts;
13
+ }
14
+
15
+ /** Total tasks of `taskType` whose status is in `statuses`. */
16
+ export function summarizeTaskQueue(tasks: Task[], taskType: string, statuses: TaskStatus[]): number {
17
+ return tasks.filter((task) => task.value === taskType && statuses.includes(task.details.status)).length;
18
+ }
@@ -86,6 +86,8 @@ export interface BootstrapLocalTasksResult {
86
86
  registered: string[];
87
87
  skipped: { taskDir: string; reason: string }[];
88
88
  errors: { taskDir: string; error: string }[];
89
+ /** True when scan was skipped due to unchanged config fingerprint */
90
+ cached?: boolean;
89
91
  }
90
92
 
91
93
  /** Host app config directory (relative to `cwd`) — recommended for library consumers */
@@ -94,7 +96,8 @@ export const TASK_RUNNER_CONFIG_DIR = "config" as const;
94
96
  export const TASK_RUNNER_ROOT_CONFIG_FILENAME = "task.config.js" as const;
95
97
 
96
98
  /** Default root config path: `config/task.config.js` */
97
- export const TASK_RUNNER_ROOT_CONFIG_RELATIVE_PATH = `${TASK_RUNNER_CONFIG_DIR}/${TASK_RUNNER_ROOT_CONFIG_FILENAME}` as const;
99
+ export const TASK_RUNNER_ROOT_CONFIG_RELATIVE_PATH =
100
+ `${TASK_RUNNER_CONFIG_DIR}/${TASK_RUNNER_ROOT_CONFIG_FILENAME}` as const;
98
101
 
99
102
  /** Legacy fallback at project root */
100
103
  export const TASK_RUNNER_ROOT_CONFIG_LEGACY_RELATIVE_PATH = TASK_RUNNER_ROOT_CONFIG_FILENAME;
@@ -0,0 +1,169 @@
1
+ import { type RepoContextFailureReason, RepoManager } from "../repo/repo-manager";
2
+ import type { LoggerWithScope } from "../shared/log";
3
+ import { type BootstrapLocalTasksOptions, bootstrapLocalTasks } from "./local-task-registry";
4
+ import { ResultCode } from "./task.interface";
5
+ import type { TaskRepoContext } from "./task-repo-context";
6
+
7
+ export type TaskRepoValidationFailureReason =
8
+ | "MISSING_PARAMS"
9
+ | RepoContextFailureReason
10
+ | "PARAMS_VALIDATION_FAILED"
11
+ | "TASK_TYPE_KEY_MISMATCH";
12
+
13
+ export type ValidateTaskRepoAndParamsInput = {
14
+ logger: LoggerWithScope;
15
+ taskTypeKey: string;
16
+ params: unknown;
17
+ /**
18
+ * When true, run {@link bootstrapLocalTasks} before resolve (CLI / Trigger / postTaskWithValidation).
19
+ * Worker paths should omit — {@link TaskManager.registerTasks} already bootstrapped.
20
+ */
21
+ bootstrapLocal?: boolean;
22
+ bootstrapLocalOptions?: BootstrapLocalTasksOptions;
23
+ /**
24
+ * When false, do not fetch Repo from Supabase if the task type is not locally registered.
25
+ * Default `true`. Align with {@link RegisterTasksOptions.includeRemote}.
26
+ */
27
+ includeRemote?: boolean;
28
+ };
29
+
30
+ export type ValidateTaskRepoAndParamsFailure = {
31
+ isValid: false;
32
+ code: ResultCode;
33
+ message: string;
34
+ reason: TaskRepoValidationFailureReason;
35
+ step: string;
36
+ };
37
+
38
+ export type ValidateTaskRepoAndParamsSuccess = {
39
+ isValid: true;
40
+ repoContext: TaskRepoContext;
41
+ };
42
+
43
+ export type ValidateTaskRepoAndParamsResult = ValidateTaskRepoAndParamsFailure | ValidateTaskRepoAndParamsSuccess;
44
+
45
+ function validateTaskParams(
46
+ validator: TaskRepoContext["taskParamsValidator"],
47
+ taskParams: unknown,
48
+ logger: LoggerWithScope,
49
+ ): boolean {
50
+ try {
51
+ return validator(taskParams) === true;
52
+ } catch (error) {
53
+ logger.warn("taskParamsValidator 拋出異常", {
54
+ topic: "task",
55
+ data: { error: error instanceof Error ? error.message : error },
56
+ });
57
+ return false;
58
+ }
59
+ }
60
+
61
+ function invalid(params: {
62
+ reason: TaskRepoValidationFailureReason;
63
+ code: ResultCode;
64
+ message: string;
65
+ step: string;
66
+ }): ValidateTaskRepoAndParamsFailure {
67
+ return { isValid: false, ...params };
68
+ }
69
+
70
+ /**
71
+ * Resolve task Repo context and validate `params` via `taskParamsValidator`.
72
+ *
73
+ * Repo resolution uses {@link RepoManager.getRepoContext}:
74
+ * local registry first; when no local entry and `includeRemote`, loads from Supabase.
75
+ */
76
+ async function validateTaskRepoAndParams({
77
+ logger,
78
+ taskTypeKey,
79
+ params,
80
+ bootstrapLocal = false,
81
+ bootstrapLocalOptions,
82
+ includeRemote = true,
83
+ }: ValidateTaskRepoAndParamsInput): Promise<ValidateTaskRepoAndParamsResult> {
84
+ if (params == null) {
85
+ return invalid({
86
+ reason: "MISSING_PARAMS",
87
+ code: ResultCode.PARAMS_NOT_VALID,
88
+ message: "任務缺少 params",
89
+ step: "params",
90
+ });
91
+ }
92
+
93
+ if (bootstrapLocal) {
94
+ const bootstrap = await bootstrapLocalTasks({
95
+ ...bootstrapLocalOptions,
96
+ forTaskTypeKey: taskTypeKey,
97
+ });
98
+ logger.debug("本地任務 bootstrap 完成", {
99
+ topic: "task",
100
+ data: {
101
+ taskTypeKey,
102
+ step: "local_bootstrap",
103
+ status: bootstrap.status,
104
+ registered: bootstrap.registered,
105
+ cached: bootstrap.cached ?? false,
106
+ message: bootstrap.message,
107
+ },
108
+ });
109
+ }
110
+
111
+ logger.debug("開始解析 Repo 上下文", {
112
+ topic: "task",
113
+ data: { taskTypeKey, step: "repo_load", includeRemote },
114
+ });
115
+
116
+ const {
117
+ context: repoContext,
118
+ error: repoError,
119
+ failureReason,
120
+ resolvedVia,
121
+ } = await RepoManager.getRepoContext<TaskRepoContext>({
122
+ logger,
123
+ taskTypeKey,
124
+ includeRemote,
125
+ });
126
+
127
+ if (repoContext == null) {
128
+ return invalid({
129
+ reason: failureReason ?? "REMOTE_REPO_LOAD_FAILED",
130
+ code: ResultCode.REPO_NOT_VALID,
131
+ message: repoError ?? "無法加載 Repo 上下文",
132
+ step: "repo_load",
133
+ });
134
+ }
135
+
136
+ logger.debug("Repo 上下文解析完成", {
137
+ topic: "task",
138
+ data: { taskTypeKey, step: "repo_load", resolvedVia },
139
+ });
140
+
141
+ if (repoContext.taskFn.taskTypeKey !== taskTypeKey) {
142
+ return invalid({
143
+ reason: "TASK_TYPE_KEY_MISMATCH",
144
+ code: ResultCode.REPO_NOT_VALID,
145
+ message: `taskFn.taskTypeKey (${repoContext.taskFn.taskTypeKey}) 與 task.value (${taskTypeKey}) 不一致`,
146
+ step: "task_type_key",
147
+ });
148
+ }
149
+
150
+ logger.debug("開始校驗任務參數", { topic: "task", data: { taskTypeKey, step: "params_validation" } });
151
+ if (!validateTaskParams(repoContext.taskParamsValidator, params, logger)) {
152
+ return invalid({
153
+ reason: "PARAMS_VALIDATION_FAILED",
154
+ code: ResultCode.PARAMS_NOT_VALID,
155
+ message: "任務參數校驗失敗",
156
+ step: "params_validation",
157
+ });
158
+ }
159
+
160
+ logger.debug("任務參數校驗通過", { topic: "task", data: { taskTypeKey, step: "params_validation" } });
161
+
162
+ return { isValid: true, repoContext };
163
+ }
164
+
165
+ const TaskRepoValidation = {
166
+ validate: validateTaskRepoAndParams,
167
+ };
168
+
169
+ export { TaskRepoValidation, validateTaskRepoAndParams };