@nest-batch/core 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 (476) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +368 -0
  3. package/dist/src/adapters/in-process.adapter.d.ts +140 -0
  4. package/dist/src/adapters/in-process.adapter.d.ts.map +1 -0
  5. package/dist/src/adapters/in-process.adapter.js +86 -0
  6. package/dist/src/adapters/in-process.adapter.js.map +1 -0
  7. package/dist/src/adapters/index.d.ts +18 -0
  8. package/dist/src/adapters/index.d.ts.map +1 -0
  9. package/dist/src/adapters/index.js +35 -0
  10. package/dist/src/adapters/index.js.map +1 -0
  11. package/dist/src/builder/batch-builder.d.ts +26 -0
  12. package/dist/src/builder/batch-builder.d.ts.map +1 -0
  13. package/dist/src/builder/batch-builder.js +25 -0
  14. package/dist/src/builder/batch-builder.js.map +1 -0
  15. package/dist/src/builder/flow-builder.d.ts +59 -0
  16. package/dist/src/builder/flow-builder.d.ts.map +1 -0
  17. package/dist/src/builder/flow-builder.js +115 -0
  18. package/dist/src/builder/flow-builder.js.map +1 -0
  19. package/dist/src/builder/index.d.ts +5 -0
  20. package/dist/src/builder/index.d.ts.map +1 -0
  21. package/dist/src/builder/index.js +23 -0
  22. package/dist/src/builder/index.js.map +1 -0
  23. package/dist/src/builder/job-builder.d.ts +76 -0
  24. package/dist/src/builder/job-builder.d.ts.map +1 -0
  25. package/dist/src/builder/job-builder.js +166 -0
  26. package/dist/src/builder/job-builder.js.map +1 -0
  27. package/dist/src/builder/step-builder.d.ts +74 -0
  28. package/dist/src/builder/step-builder.d.ts.map +1 -0
  29. package/dist/src/builder/step-builder.js +144 -0
  30. package/dist/src/builder/step-builder.js.map +1 -0
  31. package/dist/src/compiler/builder-types.d.ts +20 -0
  32. package/dist/src/compiler/builder-types.d.ts.map +1 -0
  33. package/dist/src/compiler/builder-types.js +6 -0
  34. package/dist/src/compiler/builder-types.js.map +1 -0
  35. package/dist/src/compiler/definition-compiler.d.ts +99 -0
  36. package/dist/src/compiler/definition-compiler.d.ts.map +1 -0
  37. package/dist/src/compiler/definition-compiler.js +257 -0
  38. package/dist/src/compiler/definition-compiler.js.map +1 -0
  39. package/dist/src/compiler/index.d.ts +3 -0
  40. package/dist/src/compiler/index.d.ts.map +1 -0
  41. package/dist/src/compiler/index.js +21 -0
  42. package/dist/src/compiler/index.js.map +1 -0
  43. package/dist/src/core/errors.d.ts +77 -0
  44. package/dist/src/core/errors.d.ts.map +1 -0
  45. package/dist/src/core/errors.js +170 -0
  46. package/dist/src/core/errors.js.map +1 -0
  47. package/dist/src/core/execution-context/index.d.ts +4 -0
  48. package/dist/src/core/execution-context/index.d.ts.map +1 -0
  49. package/dist/src/core/execution-context/index.js +22 -0
  50. package/dist/src/core/execution-context/index.js.map +1 -0
  51. package/dist/src/core/execution-context/json-value.d.ts +5 -0
  52. package/dist/src/core/execution-context/json-value.d.ts.map +1 -0
  53. package/dist/src/core/execution-context/json-value.js +6 -0
  54. package/dist/src/core/execution-context/json-value.js.map +1 -0
  55. package/dist/src/core/execution-context/serializer.d.ts +4 -0
  56. package/dist/src/core/execution-context/serializer.d.ts.map +1 -0
  57. package/dist/src/core/execution-context/serializer.js +34 -0
  58. package/dist/src/core/execution-context/serializer.js.map +1 -0
  59. package/dist/src/core/execution-context/validator.d.ts +18 -0
  60. package/dist/src/core/execution-context/validator.d.ts.map +1 -0
  61. package/dist/src/core/execution-context/validator.js +90 -0
  62. package/dist/src/core/execution-context/validator.js.map +1 -0
  63. package/dist/src/core/index.d.ts +8 -0
  64. package/dist/src/core/index.d.ts.map +1 -0
  65. package/dist/src/core/index.js +26 -0
  66. package/dist/src/core/index.js.map +1 -0
  67. package/dist/src/core/ir/decider-definition.d.ts +20 -0
  68. package/dist/src/core/ir/decider-definition.d.ts.map +1 -0
  69. package/dist/src/core/ir/decider-definition.js +6 -0
  70. package/dist/src/core/ir/decider-definition.js.map +1 -0
  71. package/dist/src/core/ir/index.d.ts +8 -0
  72. package/dist/src/core/ir/index.d.ts.map +1 -0
  73. package/dist/src/core/ir/index.js +26 -0
  74. package/dist/src/core/ir/index.js.map +1 -0
  75. package/dist/src/core/ir/job-definition.d.ts +15 -0
  76. package/dist/src/core/ir/job-definition.d.ts.map +1 -0
  77. package/dist/src/core/ir/job-definition.js +6 -0
  78. package/dist/src/core/ir/job-definition.js.map +1 -0
  79. package/dist/src/core/ir/listener-definition.d.ts +10 -0
  80. package/dist/src/core/ir/listener-definition.d.ts.map +1 -0
  81. package/dist/src/core/ir/listener-definition.js +6 -0
  82. package/dist/src/core/ir/listener-definition.js.map +1 -0
  83. package/dist/src/core/ir/policy-config.d.ts +24 -0
  84. package/dist/src/core/ir/policy-config.d.ts.map +1 -0
  85. package/dist/src/core/ir/policy-config.js +6 -0
  86. package/dist/src/core/ir/policy-config.js.map +1 -0
  87. package/dist/src/core/ir/refs.d.ts +42 -0
  88. package/dist/src/core/ir/refs.d.ts.map +1 -0
  89. package/dist/src/core/ir/refs.js +18 -0
  90. package/dist/src/core/ir/refs.js.map +1 -0
  91. package/dist/src/core/ir/step-definition.d.ts +59 -0
  92. package/dist/src/core/ir/step-definition.d.ts.map +1 -0
  93. package/dist/src/core/ir/step-definition.js +6 -0
  94. package/dist/src/core/ir/step-definition.js.map +1 -0
  95. package/dist/src/core/ir/transition-definition.d.ts +8 -0
  96. package/dist/src/core/ir/transition-definition.d.ts.map +1 -0
  97. package/dist/src/core/ir/transition-definition.js +6 -0
  98. package/dist/src/core/ir/transition-definition.js.map +1 -0
  99. package/dist/src/core/item/index.d.ts +2 -0
  100. package/dist/src/core/item/index.d.ts.map +1 -0
  101. package/dist/src/core/item/index.js +20 -0
  102. package/dist/src/core/item/index.js.map +1 -0
  103. package/dist/src/core/item/interfaces.d.ts +64 -0
  104. package/dist/src/core/item/interfaces.d.ts.map +1 -0
  105. package/dist/src/core/item/interfaces.js +6 -0
  106. package/dist/src/core/item/interfaces.js.map +1 -0
  107. package/dist/src/core/repository/index.d.ts +3 -0
  108. package/dist/src/core/repository/index.d.ts.map +1 -0
  109. package/dist/src/core/repository/index.js +21 -0
  110. package/dist/src/core/repository/index.js.map +1 -0
  111. package/dist/src/core/repository/job-repository.d.ts +60 -0
  112. package/dist/src/core/repository/job-repository.d.ts.map +1 -0
  113. package/dist/src/core/repository/job-repository.js +27 -0
  114. package/dist/src/core/repository/job-repository.js.map +1 -0
  115. package/dist/src/core/repository/types.d.ts +84 -0
  116. package/dist/src/core/repository/types.d.ts.map +1 -0
  117. package/dist/src/core/repository/types.js +6 -0
  118. package/dist/src/core/repository/types.js.map +1 -0
  119. package/dist/src/core/status.d.ts +29 -0
  120. package/dist/src/core/status.d.ts.map +1 -0
  121. package/dist/src/core/status.js +58 -0
  122. package/dist/src/core/status.js.map +1 -0
  123. package/dist/src/core/transaction/index.d.ts +2 -0
  124. package/dist/src/core/transaction/index.d.ts.map +1 -0
  125. package/dist/src/core/transaction/index.js +20 -0
  126. package/dist/src/core/transaction/index.js.map +1 -0
  127. package/dist/src/core/transaction/transaction-manager.d.ts +8 -0
  128. package/dist/src/core/transaction/transaction-manager.d.ts.map +1 -0
  129. package/dist/src/core/transaction/transaction-manager.js +14 -0
  130. package/dist/src/core/transaction/transaction-manager.js.map +1 -0
  131. package/dist/src/core/validation/definition-validator.d.ts +46 -0
  132. package/dist/src/core/validation/definition-validator.d.ts.map +1 -0
  133. package/dist/src/core/validation/definition-validator.js +177 -0
  134. package/dist/src/core/validation/definition-validator.js.map +1 -0
  135. package/dist/src/core/validation/index.d.ts +2 -0
  136. package/dist/src/core/validation/index.d.ts.map +1 -0
  137. package/dist/src/core/validation/index.js +20 -0
  138. package/dist/src/core/validation/index.js.map +1 -0
  139. package/dist/src/decorators/constants.d.ts +10 -0
  140. package/dist/src/decorators/constants.d.ts.map +1 -0
  141. package/dist/src/decorators/constants.js +50 -0
  142. package/dist/src/decorators/constants.js.map +1 -0
  143. package/dist/src/decorators/flow.decorator.d.ts +25 -0
  144. package/dist/src/decorators/flow.decorator.d.ts.map +1 -0
  145. package/dist/src/decorators/flow.decorator.js +19 -0
  146. package/dist/src/decorators/flow.decorator.js.map +1 -0
  147. package/dist/src/decorators/index.d.ts +8 -0
  148. package/dist/src/decorators/index.d.ts.map +1 -0
  149. package/dist/src/decorators/index.js +26 -0
  150. package/dist/src/decorators/index.js.map +1 -0
  151. package/dist/src/decorators/item.decorators.d.ts +32 -0
  152. package/dist/src/decorators/item.decorators.d.ts.map +1 -0
  153. package/dist/src/decorators/item.decorators.js +40 -0
  154. package/dist/src/decorators/item.decorators.js.map +1 -0
  155. package/dist/src/decorators/job.decorator.d.ts +11 -0
  156. package/dist/src/decorators/job.decorator.d.ts.map +1 -0
  157. package/dist/src/decorators/job.decorator.js +17 -0
  158. package/dist/src/decorators/job.decorator.js.map +1 -0
  159. package/dist/src/decorators/listener.decorators.d.ts +56 -0
  160. package/dist/src/decorators/listener.decorators.d.ts.map +1 -0
  161. package/dist/src/decorators/listener.decorators.js +157 -0
  162. package/dist/src/decorators/listener.decorators.js.map +1 -0
  163. package/dist/src/decorators/step.decorator.d.ts +25 -0
  164. package/dist/src/decorators/step.decorator.d.ts.map +1 -0
  165. package/dist/src/decorators/step.decorator.js +21 -0
  166. package/dist/src/decorators/step.decorator.js.map +1 -0
  167. package/dist/src/decorators/tasklet.decorator.d.ts +7 -0
  168. package/dist/src/decorators/tasklet.decorator.d.ts.map +1 -0
  169. package/dist/src/decorators/tasklet.decorator.js +21 -0
  170. package/dist/src/decorators/tasklet.decorator.js.map +1 -0
  171. package/dist/src/execution/batch-worker-runner.d.ts +27 -0
  172. package/dist/src/execution/batch-worker-runner.d.ts.map +1 -0
  173. package/dist/src/execution/batch-worker-runner.js +147 -0
  174. package/dist/src/execution/batch-worker-runner.js.map +1 -0
  175. package/dist/src/execution/chunk-step-executor.d.ts +86 -0
  176. package/dist/src/execution/chunk-step-executor.d.ts.map +1 -0
  177. package/dist/src/execution/chunk-step-executor.js +482 -0
  178. package/dist/src/execution/chunk-step-executor.js.map +1 -0
  179. package/dist/src/execution/execution-strategy.d.ts +110 -0
  180. package/dist/src/execution/execution-strategy.d.ts.map +1 -0
  181. package/dist/src/execution/execution-strategy.js +13 -0
  182. package/dist/src/execution/execution-strategy.js.map +1 -0
  183. package/dist/src/execution/external-task-execution-strategy.d.ts +36 -0
  184. package/dist/src/execution/external-task-execution-strategy.d.ts.map +1 -0
  185. package/dist/src/execution/external-task-execution-strategy.js +97 -0
  186. package/dist/src/execution/external-task-execution-strategy.js.map +1 -0
  187. package/dist/src/execution/in-process-execution-strategy.d.ts +129 -0
  188. package/dist/src/execution/in-process-execution-strategy.d.ts.map +1 -0
  189. package/dist/src/execution/in-process-execution-strategy.js +141 -0
  190. package/dist/src/execution/in-process-execution-strategy.js.map +1 -0
  191. package/dist/src/execution/index.d.ts +14 -0
  192. package/dist/src/execution/index.d.ts.map +1 -0
  193. package/dist/src/execution/index.js +32 -0
  194. package/dist/src/execution/index.js.map +1 -0
  195. package/dist/src/execution/job-executor.d.ts +145 -0
  196. package/dist/src/execution/job-executor.d.ts.map +1 -0
  197. package/dist/src/execution/job-executor.js +475 -0
  198. package/dist/src/execution/job-executor.js.map +1 -0
  199. package/dist/src/execution/job-explorer.d.ts +15 -0
  200. package/dist/src/execution/job-explorer.d.ts.map +1 -0
  201. package/dist/src/execution/job-explorer.js +84 -0
  202. package/dist/src/execution/job-explorer.js.map +1 -0
  203. package/dist/src/execution/job-key.d.ts +3 -0
  204. package/dist/src/execution/job-key.d.ts.map +1 -0
  205. package/dist/src/execution/job-key.js +43 -0
  206. package/dist/src/execution/job-key.js.map +1 -0
  207. package/dist/src/execution/job-launcher.d.ts +75 -0
  208. package/dist/src/execution/job-launcher.d.ts.map +1 -0
  209. package/dist/src/execution/job-launcher.js +112 -0
  210. package/dist/src/execution/job-launcher.js.map +1 -0
  211. package/dist/src/execution/job-operator.d.ts +22 -0
  212. package/dist/src/execution/job-operator.d.ts.map +1 -0
  213. package/dist/src/execution/job-operator.js +125 -0
  214. package/dist/src/execution/job-operator.js.map +1 -0
  215. package/dist/src/execution/listener-invoker.d.ts +164 -0
  216. package/dist/src/execution/listener-invoker.d.ts.map +1 -0
  217. package/dist/src/execution/listener-invoker.js +246 -0
  218. package/dist/src/execution/listener-invoker.js.map +1 -0
  219. package/dist/src/execution/ref-resolver.d.ts +40 -0
  220. package/dist/src/execution/ref-resolver.d.ts.map +1 -0
  221. package/dist/src/execution/ref-resolver.js +41 -0
  222. package/dist/src/execution/ref-resolver.js.map +1 -0
  223. package/dist/src/execution/tasklet-step-executor.d.ts +79 -0
  224. package/dist/src/execution/tasklet-step-executor.d.ts.map +1 -0
  225. package/dist/src/execution/tasklet-step-executor.js +138 -0
  226. package/dist/src/execution/tasklet-step-executor.js.map +1 -0
  227. package/dist/src/explorer/batch-explorer.d.ts +138 -0
  228. package/dist/src/explorer/batch-explorer.d.ts.map +1 -0
  229. package/dist/src/explorer/batch-explorer.js +167 -0
  230. package/dist/src/explorer/batch-explorer.js.map +1 -0
  231. package/dist/src/explorer/index.d.ts +2 -0
  232. package/dist/src/explorer/index.d.ts.map +1 -0
  233. package/dist/src/explorer/index.js +20 -0
  234. package/dist/src/explorer/index.js.map +1 -0
  235. package/dist/src/flow/flow-evaluator.d.ts +30 -0
  236. package/dist/src/flow/flow-evaluator.d.ts.map +1 -0
  237. package/dist/src/flow/flow-evaluator.js +80 -0
  238. package/dist/src/flow/flow-evaluator.js.map +1 -0
  239. package/dist/src/flow/index.d.ts +2 -0
  240. package/dist/src/flow/index.d.ts.map +1 -0
  241. package/dist/src/flow/index.js +20 -0
  242. package/dist/src/flow/index.js.map +1 -0
  243. package/dist/src/index.d.ts +18 -0
  244. package/dist/src/index.d.ts.map +1 -0
  245. package/dist/src/index.js +90 -0
  246. package/dist/src/index.js.map +1 -0
  247. package/dist/src/io/checkpoint.d.ts +7 -0
  248. package/dist/src/io/checkpoint.d.ts.map +1 -0
  249. package/dist/src/io/checkpoint.js +56 -0
  250. package/dist/src/io/checkpoint.js.map +1 -0
  251. package/dist/src/io/database.d.ts +50 -0
  252. package/dist/src/io/database.d.ts.map +1 -0
  253. package/dist/src/io/database.js +108 -0
  254. package/dist/src/io/database.js.map +1 -0
  255. package/dist/src/io/file-readers.d.ts +54 -0
  256. package/dist/src/io/file-readers.d.ts.map +1 -0
  257. package/dist/src/io/file-readers.js +167 -0
  258. package/dist/src/io/file-readers.js.map +1 -0
  259. package/dist/src/io/file-writers.d.ts +31 -0
  260. package/dist/src/io/file-writers.d.ts.map +1 -0
  261. package/dist/src/io/file-writers.js +80 -0
  262. package/dist/src/io/file-writers.js.map +1 -0
  263. package/dist/src/io/index.d.ts +6 -0
  264. package/dist/src/io/index.d.ts.map +1 -0
  265. package/dist/src/io/index.js +24 -0
  266. package/dist/src/io/index.js.map +1 -0
  267. package/dist/src/io/s3.d.ts +50 -0
  268. package/dist/src/io/s3.d.ts.map +1 -0
  269. package/dist/src/io/s3.js +96 -0
  270. package/dist/src/io/s3.js.map +1 -0
  271. package/dist/src/listeners/builtin-listeners.d.ts +77 -0
  272. package/dist/src/listeners/builtin-listeners.d.ts.map +1 -0
  273. package/dist/src/listeners/builtin-listeners.js +108 -0
  274. package/dist/src/listeners/builtin-listeners.js.map +1 -0
  275. package/dist/src/listeners/index.d.ts +8 -0
  276. package/dist/src/listeners/index.d.ts.map +1 -0
  277. package/dist/src/listeners/index.js +25 -0
  278. package/dist/src/listeners/index.js.map +1 -0
  279. package/dist/src/module/adapter-options.d.ts +39 -0
  280. package/dist/src/module/adapter-options.d.ts.map +1 -0
  281. package/dist/src/module/adapter-options.js +34 -0
  282. package/dist/src/module/adapter-options.js.map +1 -0
  283. package/dist/src/module/adapter.d.ts +157 -0
  284. package/dist/src/module/adapter.d.ts.map +1 -0
  285. package/dist/src/module/adapter.js +80 -0
  286. package/dist/src/module/adapter.js.map +1 -0
  287. package/dist/src/module/batch-schedule-registry.d.ts +110 -0
  288. package/dist/src/module/batch-schedule-registry.d.ts.map +1 -0
  289. package/dist/src/module/batch-schedule-registry.js +0 -0
  290. package/dist/src/module/batch-schedule-registry.js.map +1 -0
  291. package/dist/src/module/index.d.ts +14 -0
  292. package/dist/src/module/index.d.ts.map +1 -0
  293. package/dist/src/module/index.js +31 -0
  294. package/dist/src/module/index.js.map +1 -0
  295. package/dist/src/module/nest-batch.module.d.ts +236 -0
  296. package/dist/src/module/nest-batch.module.d.ts.map +1 -0
  297. package/dist/src/module/nest-batch.module.js +475 -0
  298. package/dist/src/module/nest-batch.module.js.map +1 -0
  299. package/dist/src/module/tokens.d.ts +83 -0
  300. package/dist/src/module/tokens.d.ts.map +1 -0
  301. package/dist/src/module/tokens.js +58 -0
  302. package/dist/src/module/tokens.js.map +1 -0
  303. package/dist/src/observability/event-types.d.ts +55 -0
  304. package/dist/src/observability/event-types.d.ts.map +1 -0
  305. package/dist/src/observability/event-types.js +36 -0
  306. package/dist/src/observability/event-types.js.map +1 -0
  307. package/dist/src/observability/exporters.d.ts +35 -0
  308. package/dist/src/observability/exporters.d.ts.map +1 -0
  309. package/dist/src/observability/exporters.js +93 -0
  310. package/dist/src/observability/exporters.js.map +1 -0
  311. package/dist/src/observability/index.d.ts +3 -0
  312. package/dist/src/observability/index.d.ts.map +1 -0
  313. package/dist/src/observability/index.js +21 -0
  314. package/dist/src/observability/index.js.map +1 -0
  315. package/dist/src/partition-helpers.d.ts +127 -0
  316. package/dist/src/partition-helpers.d.ts.map +1 -0
  317. package/dist/src/partition-helpers.js +136 -0
  318. package/dist/src/partition-helpers.js.map +1 -0
  319. package/dist/src/policies/backoff.d.ts +3 -0
  320. package/dist/src/policies/backoff.d.ts.map +1 -0
  321. package/dist/src/policies/backoff.js +34 -0
  322. package/dist/src/policies/backoff.js.map +1 -0
  323. package/dist/src/policies/index.d.ts +4 -0
  324. package/dist/src/policies/index.d.ts.map +1 -0
  325. package/dist/src/policies/index.js +22 -0
  326. package/dist/src/policies/index.js.map +1 -0
  327. package/dist/src/policies/retry-policy.d.ts +13 -0
  328. package/dist/src/policies/retry-policy.d.ts.map +1 -0
  329. package/dist/src/policies/retry-policy.js +55 -0
  330. package/dist/src/policies/retry-policy.js.map +1 -0
  331. package/dist/src/policies/skip-policy.d.ts +12 -0
  332. package/dist/src/policies/skip-policy.d.ts.map +1 -0
  333. package/dist/src/policies/skip-policy.js +44 -0
  334. package/dist/src/policies/skip-policy.js.map +1 -0
  335. package/dist/src/registry/index.d.ts +2 -0
  336. package/dist/src/registry/index.d.ts.map +1 -0
  337. package/dist/src/registry/index.js +20 -0
  338. package/dist/src/registry/index.js.map +1 -0
  339. package/dist/src/registry/job-registry.d.ts +16 -0
  340. package/dist/src/registry/job-registry.d.ts.map +1 -0
  341. package/dist/src/registry/job-registry.js +50 -0
  342. package/dist/src/registry/job-registry.js.map +1 -0
  343. package/dist/src/repository/id-generator.d.ts +18 -0
  344. package/dist/src/repository/id-generator.d.ts.map +1 -0
  345. package/dist/src/repository/id-generator.js +37 -0
  346. package/dist/src/repository/id-generator.js.map +1 -0
  347. package/dist/src/repository/in-memory/in-memory-job-repository.d.ts +49 -0
  348. package/dist/src/repository/in-memory/in-memory-job-repository.d.ts.map +1 -0
  349. package/dist/src/repository/in-memory/in-memory-job-repository.js +291 -0
  350. package/dist/src/repository/in-memory/in-memory-job-repository.js.map +1 -0
  351. package/dist/src/repository/in-memory/index.d.ts +2 -0
  352. package/dist/src/repository/in-memory/index.d.ts.map +1 -0
  353. package/dist/src/repository/in-memory/index.js +20 -0
  354. package/dist/src/repository/in-memory/index.js.map +1 -0
  355. package/dist/src/repository/index.d.ts +4 -0
  356. package/dist/src/repository/index.d.ts.map +1 -0
  357. package/dist/src/repository/index.js +22 -0
  358. package/dist/src/repository/index.js.map +1 -0
  359. package/dist/src/repository/uuid-v7.d.ts +20 -0
  360. package/dist/src/repository/uuid-v7.d.ts.map +1 -0
  361. package/dist/src/repository/uuid-v7.js +31 -0
  362. package/dist/src/repository/uuid-v7.js.map +1 -0
  363. package/dist/src/scheduling/batch-scheduled.d.ts +87 -0
  364. package/dist/src/scheduling/batch-scheduled.d.ts.map +1 -0
  365. package/dist/src/scheduling/batch-scheduled.js +170 -0
  366. package/dist/src/scheduling/batch-scheduled.js.map +1 -0
  367. package/dist/src/transaction/in-memory-transaction-manager.d.ts +16 -0
  368. package/dist/src/transaction/in-memory-transaction-manager.d.ts.map +1 -0
  369. package/dist/src/transaction/in-memory-transaction-manager.js +33 -0
  370. package/dist/src/transaction/in-memory-transaction-manager.js.map +1 -0
  371. package/dist/src/transaction/index.d.ts +2 -0
  372. package/dist/src/transaction/index.d.ts.map +1 -0
  373. package/dist/src/transaction/index.js +20 -0
  374. package/dist/src/transaction/index.js.map +1 -0
  375. package/dist/tests/contracts/index.d.ts +26 -0
  376. package/dist/tests/contracts/index.d.ts.map +1 -0
  377. package/dist/tests/contracts/index.js +37 -0
  378. package/dist/tests/contracts/index.js.map +1 -0
  379. package/dist/tests/contracts/job-repository.contract.d.ts +46 -0
  380. package/dist/tests/contracts/job-repository.contract.d.ts.map +1 -0
  381. package/dist/tests/contracts/job-repository.contract.js +644 -0
  382. package/dist/tests/contracts/job-repository.contract.js.map +1 -0
  383. package/package.json +80 -0
  384. package/src/adapters/in-process.adapter.ts +182 -0
  385. package/src/adapters/index.ts +17 -0
  386. package/src/builder/batch-builder.ts +32 -0
  387. package/src/builder/flow-builder.ts +141 -0
  388. package/src/builder/index.ts +4 -0
  389. package/src/builder/job-builder.ts +206 -0
  390. package/src/builder/step-builder.ts +190 -0
  391. package/src/compiler/builder-types.ts +27 -0
  392. package/src/compiler/definition-compiler.ts +325 -0
  393. package/src/compiler/index.ts +2 -0
  394. package/src/core/errors.ts +125 -0
  395. package/src/core/execution-context/index.ts +3 -0
  396. package/src/core/execution-context/json-value.ts +3 -0
  397. package/src/core/execution-context/serializer.ts +21 -0
  398. package/src/core/execution-context/validator.ts +103 -0
  399. package/src/core/index.ts +7 -0
  400. package/src/core/ir/decider-definition.ts +25 -0
  401. package/src/core/ir/index.ts +7 -0
  402. package/src/core/ir/job-definition.ts +15 -0
  403. package/src/core/ir/listener-definition.ts +19 -0
  404. package/src/core/ir/policy-config.ts +19 -0
  405. package/src/core/ir/refs.ts +42 -0
  406. package/src/core/ir/step-definition.ts +62 -0
  407. package/src/core/ir/transition-definition.ts +9 -0
  408. package/src/core/item/index.ts +1 -0
  409. package/src/core/item/interfaces.ts +70 -0
  410. package/src/core/repository/index.ts +2 -0
  411. package/src/core/repository/job-repository.ts +100 -0
  412. package/src/core/repository/types.ts +91 -0
  413. package/src/core/status.ts +31 -0
  414. package/src/core/transaction/index.ts +1 -0
  415. package/src/core/transaction/transaction-manager.ts +8 -0
  416. package/src/core/validation/definition-validator.ts +215 -0
  417. package/src/core/validation/index.ts +1 -0
  418. package/src/decorators/constants.ts +9 -0
  419. package/src/decorators/flow.decorator.ts +31 -0
  420. package/src/decorators/index.ts +7 -0
  421. package/src/decorators/item.decorators.ts +51 -0
  422. package/src/decorators/job.decorator.ts +16 -0
  423. package/src/decorators/listener.decorators.ts +142 -0
  424. package/src/decorators/step.decorator.ts +33 -0
  425. package/src/decorators/tasklet.decorator.ts +14 -0
  426. package/src/execution/batch-worker-runner.ts +142 -0
  427. package/src/execution/chunk-step-executor.ts +594 -0
  428. package/src/execution/execution-strategy.ts +115 -0
  429. package/src/execution/external-task-execution-strategy.ts +104 -0
  430. package/src/execution/in-process-execution-strategy.ts +207 -0
  431. package/src/execution/index.ts +13 -0
  432. package/src/execution/job-executor.ts +553 -0
  433. package/src/execution/job-explorer.ts +73 -0
  434. package/src/execution/job-key.ts +35 -0
  435. package/src/execution/job-launcher.ts +132 -0
  436. package/src/execution/job-operator.ts +127 -0
  437. package/src/execution/listener-invoker.ts +389 -0
  438. package/src/execution/ref-resolver.ts +64 -0
  439. package/src/execution/tasklet-step-executor.ts +182 -0
  440. package/src/explorer/batch-explorer.ts +251 -0
  441. package/src/explorer/index.ts +1 -0
  442. package/src/flow/flow-evaluator.ts +89 -0
  443. package/src/flow/index.ts +1 -0
  444. package/src/index.ts +24 -0
  445. package/src/io/checkpoint.ts +47 -0
  446. package/src/io/database.ts +114 -0
  447. package/src/io/file-readers.ts +191 -0
  448. package/src/io/file-writers.ts +99 -0
  449. package/src/io/index.ts +5 -0
  450. package/src/io/s3.ts +117 -0
  451. package/src/listeners/builtin-listeners.ts +151 -0
  452. package/src/listeners/index.ts +7 -0
  453. package/src/module/adapter-options.ts +38 -0
  454. package/src/module/adapter.ts +160 -0
  455. package/src/module/batch-schedule-registry.ts +0 -0
  456. package/src/module/index.ts +13 -0
  457. package/src/module/nest-batch.module.ts +674 -0
  458. package/src/module/tokens.ts +95 -0
  459. package/src/observability/event-types.ts +61 -0
  460. package/src/observability/exporters.ts +96 -0
  461. package/src/observability/index.ts +2 -0
  462. package/src/partition-helpers.ts +204 -0
  463. package/src/policies/backoff.ts +22 -0
  464. package/src/policies/index.ts +3 -0
  465. package/src/policies/retry-policy.ts +57 -0
  466. package/src/policies/skip-policy.ts +51 -0
  467. package/src/registry/index.ts +1 -0
  468. package/src/registry/job-registry.ts +42 -0
  469. package/src/repository/id-generator.ts +25 -0
  470. package/src/repository/in-memory/in-memory-job-repository.ts +334 -0
  471. package/src/repository/in-memory/index.ts +1 -0
  472. package/src/repository/index.ts +3 -0
  473. package/src/repository/uuid-v7.ts +40 -0
  474. package/src/scheduling/batch-scheduled.ts +257 -0
  475. package/src/transaction/in-memory-transaction-manager.ts +23 -0
  476. package/src/transaction/index.ts +1 -0
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get BATCH_SCHEDULED_OPTIONS () {
13
+ return BATCH_SCHEDULED_OPTIONS;
14
+ },
15
+ get BatchScheduled () {
16
+ return BatchScheduled;
17
+ },
18
+ get InvalidBatchScheduledCronError () {
19
+ return InvalidBatchScheduledCronError;
20
+ },
21
+ get InvalidBatchScheduledTimezoneError () {
22
+ return InvalidBatchScheduledTimezoneError;
23
+ }
24
+ });
25
+ require("reflect-metadata");
26
+ const _common = require("@nestjs/common");
27
+ const _constants = require("../decorators/constants");
28
+ const BATCH_SCHEDULED_OPTIONS = _constants.BATCH_SCHEDULED_OPTIONS;
29
+ /**
30
+ * `@BatchScheduled` — cron decorator.
31
+ *
32
+ * Stamps `BATCH_SCHEDULED_OPTIONS` metadata onto the decorated method's
33
+ * function reference (via `@nestjs/common`'s `SetMetadata`, which writes
34
+ * to `descriptor.value`), so `Reflect.getMetadata(KEY, Job.prototype.run)`
35
+ * returns the stored shape.
36
+ *
37
+ * This is the TDD-RED half of Task 13. It deliberately implements only
38
+ * the metadata-storing contract — i.e. the 10 happy-path assertions in
39
+ * `tests/scheduling/batch-scheduled.test.ts` (sections A + B). The
40
+ * 7 negative-path assertions in sections C + D are the GREEN half
41
+ * of the contract and land in the next task:
42
+ *
43
+ * 1. Cron expression shape validation (5/6 fields, no literal words).
44
+ * 2. IANA timezone validation (rejects unknown / empty / whitespace).
45
+ *
46
+ * The inert-mode flag (section E) is wired up here because it is also
47
+ * a pure metadata capture — `process.env.BATCH_SCHEDULED_DISABLE` is
48
+ * read at decoration time and stamped onto the stored shape. The
49
+ * decorator does NOT install any timer, interval, or scheduler
50
+ * registration at decoration time; `inert` is a hint the future
51
+ * runtime scheduler honors when it later walks the class.
52
+ *
53
+ * The decorator is metadata-only by design — it does NOT depend on
54
+ * `cron` (the boundary test from Task 2 still passes — no `cron`
55
+ * import appears in core).
56
+ */ // ---------------------------------------------------------------------------
57
+ // Validation helpers
58
+ // ---------------------------------------------------------------------------
59
+ /**
60
+ * Minimum + maximum number of whitespace-separated fields a valid
61
+ * cron expression can have. `cronstrue` / Linux
62
+ * `crontab(5)` all agree on 5 (minute, hour, day-of-month, month,
63
+ * day-of-week); Quartz-style extensions add a leading seconds field
64
+ * for 6.
65
+ */ const CRON_MIN_FIELDS = 5;
66
+ const CRON_MAX_FIELDS = 6;
67
+ /**
68
+ * Cron-shape check.
69
+ *
70
+ * Accepts:
71
+ * - 5 fields: `minute hour dom month dow` (Linux crontab style)
72
+ * - 6 fields: `second minute hour dom month dow` (extended cron style)
73
+ *
74
+ * Each field is `\S+` (one or more non-whitespace tokens, no empty
75
+ * fields). The trailing `\S+$` is the final field; the leading
76
+ * `(\S+\s+){4,5}` captures the preceding 4 or 5 fields separated by
77
+ * a single whitespace run.
78
+ *
79
+ * This is a shape check, not a semantic one — `99 99 99 99 99` still
80
+ * passes the regex. The runtime scheduler (in `@nest-batch/bullmq`)
81
+ * is the layer that handles semantic validation via `cron-parser`.
82
+ * The shape check exists so the decorator fails fast on
83
+ * unambiguously-wrong input (empty string, too few / too many
84
+ * fields, literal English words).
85
+ */ const CRON_SHAPE = /^(\S+\s+){4,5}\S+$/;
86
+ /**
87
+ * IANA timezone validation.
88
+ *
89
+ * The platform's `Intl.DateTimeFormat` is the canonical, no-dep
90
+ * source of truth for valid IANA zone identifiers: it throws a
91
+ * `RangeError` for unknown zones. We use it inside a `try/catch` and
92
+ * normalise the result to a boolean so the decorator's failure mode
93
+ * is a deterministic `Error` (not a `RangeError` leaking out).
94
+ *
95
+ * Reference: https://tc39.es/ecma402/#sec-intl-datetimeformat-constructor
96
+ */ function isValidIanaTimezone(tz) {
97
+ try {
98
+ new Intl.DateTimeFormat(undefined, {
99
+ timeZone: tz
100
+ });
101
+ return true;
102
+ } catch {
103
+ return false;
104
+ }
105
+ }
106
+ /**
107
+ * Validate a cron expression. Throws a deterministic
108
+ * `InvalidBatchScheduledCronError` whose `.message` embeds the
109
+ * invalid value verbatim so log lines and test assertions can pin
110
+ * the error to a specific input.
111
+ */ function assertValidCron(cronExpression) {
112
+ // Type guard: a non-string value would have already broken
113
+ // SetMetadata, but checking here keeps the helper standalone.
114
+ if (typeof cronExpression !== 'string' || cronExpression.length === 0) {
115
+ throw new InvalidBatchScheduledCronError(cronExpression, 'empty');
116
+ }
117
+ if (!CRON_SHAPE.test(cronExpression.trim())) {
118
+ const fieldCount = cronExpression.trim().split(/\s+/).length;
119
+ const reason = fieldCount < CRON_MIN_FIELDS ? `fewer than ${CRON_MIN_FIELDS} fields` : fieldCount > CRON_MAX_FIELDS ? `more than ${CRON_MAX_FIELDS} fields` : 'not a valid cron expression';
120
+ throw new InvalidBatchScheduledCronError(cronExpression, reason);
121
+ }
122
+ }
123
+ /**
124
+ * Validate a timezone string. Throws a deterministic
125
+ * `InvalidBatchScheduledTimezoneError` whose `.message` embeds the
126
+ * invalid value verbatim.
127
+ */ function assertValidTimezone(tz) {
128
+ if (typeof tz !== 'string' || tz.trim().length === 0) {
129
+ throw new InvalidBatchScheduledTimezoneError(tz, 'empty');
130
+ }
131
+ if (!isValidIanaTimezone(tz)) {
132
+ throw new InvalidBatchScheduledTimezoneError(tz, 'not a valid IANA timezone');
133
+ }
134
+ }
135
+ let InvalidBatchScheduledCronError = class InvalidBatchScheduledCronError extends Error {
136
+ cron;
137
+ reason;
138
+ constructor(cron, reason){
139
+ super(`[BatchScheduled] invalid cron expression "${cron}": ${reason}. ` + `Expected ${CRON_MIN_FIELDS} (Linux crontab) or ${CRON_MAX_FIELDS} (extended cron) ` + `whitespace-separated fields.`);
140
+ this.name = 'InvalidBatchScheduledCronError';
141
+ this.cron = cron;
142
+ this.reason = reason;
143
+ }
144
+ };
145
+ let InvalidBatchScheduledTimezoneError = class InvalidBatchScheduledTimezoneError extends Error {
146
+ timezone;
147
+ reason;
148
+ constructor(timezone, reason){
149
+ super(`[BatchScheduled] invalid timezone "${timezone}": ${reason}. ` + `Expected a valid IANA zone identifier (e.g. "UTC", "Asia/Seoul", "America/New_York").`);
150
+ this.name = 'InvalidBatchScheduledTimezoneError';
151
+ this.timezone = timezone;
152
+ this.reason = reason;
153
+ }
154
+ };
155
+ function BatchScheduled(cronExpression, options) {
156
+ // 1. Validate inputs at decoration time. The decorator is
157
+ // synchronous and metadata-only; the validation runs BEFORE
158
+ // `SetMetadata(...)` is called so a bad input never reaches
159
+ // the registry.
160
+ assertValidCron(cronExpression);
161
+ assertValidTimezone(options.timezone);
162
+ const meta = {
163
+ cron: cronExpression,
164
+ options,
165
+ inert: process.env.BATCH_SCHEDULED_DISABLE === '1'
166
+ };
167
+ return (0, _common.SetMetadata)(BATCH_SCHEDULED_OPTIONS, meta);
168
+ }
169
+
170
+ //# sourceMappingURL=batch-scheduled.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/scheduling/batch-scheduled.ts"],"sourcesContent":["import 'reflect-metadata';\nimport { SetMetadata } from '@nestjs/common';\n\nimport { BATCH_SCHEDULED_OPTIONS as SCHEDULED_KEY } from '../decorators/constants';\n\nexport const BATCH_SCHEDULED_OPTIONS = SCHEDULED_KEY;\n\n/**\n * Overlap policies for cron-scheduled jobs:\n *\n * - `'skip'` — drop the new tick if the previous run is still in flight.\n * - `'queue'` — buffer the new tick and start it after the current one ends.\n * - `'parallel'` — start the new tick alongside the current one.\n *\n * The runtime scheduler (the future `@nest-batch/bullmq` cron strategy)\n * reads this value off the stored metadata and applies the policy at\n * dispatch time. The decorator itself MUST NOT silently default the\n * policy to `'skip'` on the user's behalf — leaving it `undefined` here\n * is the contract: the runtime applies the default.\n */\nexport type BatchOverlapPolicy = 'skip' | 'queue' | 'parallel';\n\n/**\n * Decorator-facing options for `@BatchScheduled`.\n *\n * - `name` — required, unique per job (used as the scheduling key).\n * - `timezone` — required, IANA zone (e.g. `'UTC'`, `'Asia/Seoul'`).\n * - `overlap` — optional, see `BatchOverlapPolicy`. Default applied at\n * runtime, never silently here.\n * - `startAt` — optional, absolute lower bound. Preserved by reference.\n * - `endAt` — optional, absolute upper bound. Preserved by reference.\n * - `inert` — optional, hints the runtime scheduler to skip actual\n * registration. The decorator stamps this by reading\n * `process.env.BATCH_SCHEDULED_DISABLE` at decoration time\n * so the runtime never has to re-evaluate the env.\n */\nexport interface BatchScheduledOptions {\n name: string;\n timezone: string;\n overlap?: BatchOverlapPolicy;\n startAt?: Date;\n endAt?: Date;\n inert?: boolean;\n}\n\n/**\n * The shape stored under the `BATCH_SCHEDULED_OPTIONS` metadata key on\n * the decorated method function. The runtime scheduler (the future\n * `@nest-batch/bullmq` cron strategy) reads this verbatim to register\n * the job with the underlying scheduler.\n *\n * Note: `inert` lives at the top level (not inside `options`) on\n * purpose. It is a *runtime* flag captured at decoration time from\n * `process.env.BATCH_SCHEDULED_DISABLE`; it is not a user-facing\n * knob in `BatchScheduledOptions`. (The `inert?: boolean` slot on\n * `BatchScheduledOptions` is the user-facing counterpart — see the\n * GREEN half of Task 13 to wire it up.)\n */\nexport interface BatchScheduledMetadata {\n cron: string;\n options: BatchScheduledOptions;\n inert: boolean;\n}\n\n/**\n * `@BatchScheduled` — cron decorator.\n *\n * Stamps `BATCH_SCHEDULED_OPTIONS` metadata onto the decorated method's\n * function reference (via `@nestjs/common`'s `SetMetadata`, which writes\n * to `descriptor.value`), so `Reflect.getMetadata(KEY, Job.prototype.run)`\n * returns the stored shape.\n *\n * This is the TDD-RED half of Task 13. It deliberately implements only\n * the metadata-storing contract — i.e. the 10 happy-path assertions in\n * `tests/scheduling/batch-scheduled.test.ts` (sections A + B). The\n * 7 negative-path assertions in sections C + D are the GREEN half\n * of the contract and land in the next task:\n *\n * 1. Cron expression shape validation (5/6 fields, no literal words).\n * 2. IANA timezone validation (rejects unknown / empty / whitespace).\n *\n * The inert-mode flag (section E) is wired up here because it is also\n * a pure metadata capture — `process.env.BATCH_SCHEDULED_DISABLE` is\n * read at decoration time and stamped onto the stored shape. The\n * decorator does NOT install any timer, interval, or scheduler\n * registration at decoration time; `inert` is a hint the future\n * runtime scheduler honors when it later walks the class.\n *\n * The decorator is metadata-only by design — it does NOT depend on\n * `cron` (the boundary test from Task 2 still passes — no `cron`\n * import appears in core).\n */\n// ---------------------------------------------------------------------------\n// Validation helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Minimum + maximum number of whitespace-separated fields a valid\n * cron expression can have. `cronstrue` / Linux\n * `crontab(5)` all agree on 5 (minute, hour, day-of-month, month,\n * day-of-week); Quartz-style extensions add a leading seconds field\n * for 6.\n */\nconst CRON_MIN_FIELDS = 5;\nconst CRON_MAX_FIELDS = 6;\n\n/**\n * Cron-shape check.\n *\n * Accepts:\n * - 5 fields: `minute hour dom month dow` (Linux crontab style)\n * - 6 fields: `second minute hour dom month dow` (extended cron style)\n *\n * Each field is `\\S+` (one or more non-whitespace tokens, no empty\n * fields). The trailing `\\S+$` is the final field; the leading\n * `(\\S+\\s+){4,5}` captures the preceding 4 or 5 fields separated by\n * a single whitespace run.\n *\n * This is a shape check, not a semantic one — `99 99 99 99 99` still\n * passes the regex. The runtime scheduler (in `@nest-batch/bullmq`)\n * is the layer that handles semantic validation via `cron-parser`.\n * The shape check exists so the decorator fails fast on\n * unambiguously-wrong input (empty string, too few / too many\n * fields, literal English words).\n */\nconst CRON_SHAPE = /^(\\S+\\s+){4,5}\\S+$/;\n\n/**\n * IANA timezone validation.\n *\n * The platform's `Intl.DateTimeFormat` is the canonical, no-dep\n * source of truth for valid IANA zone identifiers: it throws a\n * `RangeError` for unknown zones. We use it inside a `try/catch` and\n * normalise the result to a boolean so the decorator's failure mode\n * is a deterministic `Error` (not a `RangeError` leaking out).\n *\n * Reference: https://tc39.es/ecma402/#sec-intl-datetimeformat-constructor\n */\nfunction isValidIanaTimezone(tz: string): boolean {\n try {\n new Intl.DateTimeFormat(undefined, { timeZone: tz });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Validate a cron expression. Throws a deterministic\n * `InvalidBatchScheduledCronError` whose `.message` embeds the\n * invalid value verbatim so log lines and test assertions can pin\n * the error to a specific input.\n */\nfunction assertValidCron(cronExpression: string): void {\n // Type guard: a non-string value would have already broken\n // SetMetadata, but checking here keeps the helper standalone.\n if (typeof cronExpression !== 'string' || cronExpression.length === 0) {\n throw new InvalidBatchScheduledCronError(cronExpression, 'empty');\n }\n if (!CRON_SHAPE.test(cronExpression.trim())) {\n const fieldCount = cronExpression.trim().split(/\\s+/).length;\n const reason =\n fieldCount < CRON_MIN_FIELDS\n ? `fewer than ${CRON_MIN_FIELDS} fields`\n : fieldCount > CRON_MAX_FIELDS\n ? `more than ${CRON_MAX_FIELDS} fields`\n : 'not a valid cron expression';\n throw new InvalidBatchScheduledCronError(cronExpression, reason);\n }\n}\n\n/**\n * Validate a timezone string. Throws a deterministic\n * `InvalidBatchScheduledTimezoneError` whose `.message` embeds the\n * invalid value verbatim.\n */\nfunction assertValidTimezone(tz: string): void {\n if (typeof tz !== 'string' || tz.trim().length === 0) {\n throw new InvalidBatchScheduledTimezoneError(tz, 'empty');\n }\n if (!isValidIanaTimezone(tz)) {\n throw new InvalidBatchScheduledTimezoneError(tz, 'not a valid IANA timezone');\n }\n}\n\n/**\n * Thrown by `@BatchScheduled` when the cron expression fails the\n * shape check (5/6 fields, non-whitespace tokens). The `.message`\n * includes the invalid value and the failure reason so the error\n * is greppable in logs and pinned in test assertions.\n *\n * Exported from the module barrel so adapter packages (e.g. the\n * BullMQ runtime) can `instanceof`-check it without reaching into\n * the decorator's internal helper.\n */\nexport class InvalidBatchScheduledCronError extends Error {\n readonly cron: string;\n readonly reason: string;\n\n constructor(cron: string, reason: string) {\n super(\n `[BatchScheduled] invalid cron expression \"${cron}\": ${reason}. ` +\n `Expected ${CRON_MIN_FIELDS} (Linux crontab) or ${CRON_MAX_FIELDS} (extended cron) ` +\n `whitespace-separated fields.`,\n );\n this.name = 'InvalidBatchScheduledCronError';\n this.cron = cron;\n this.reason = reason;\n }\n}\n\n/**\n * Thrown by `@BatchScheduled` when the IANA timezone fails the\n * platform check. The `.message` embeds the invalid value and the\n * failure reason.\n *\n * Exported from the module barrel so adapter packages can\n * `instanceof`-check it without reaching into the decorator's\n * internal helper.\n */\nexport class InvalidBatchScheduledTimezoneError extends Error {\n readonly timezone: string;\n readonly reason: string;\n\n constructor(timezone: string, reason: string) {\n super(\n `[BatchScheduled] invalid timezone \"${timezone}\": ${reason}. ` +\n `Expected a valid IANA zone identifier (e.g. \"UTC\", \"Asia/Seoul\", \"America/New_York\").`,\n );\n this.name = 'InvalidBatchScheduledTimezoneError';\n this.timezone = timezone;\n this.reason = reason;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Decorator\n// ---------------------------------------------------------------------------\n\nexport function BatchScheduled(\n cronExpression: string,\n options: BatchScheduledOptions,\n): MethodDecorator {\n // 1. Validate inputs at decoration time. The decorator is\n // synchronous and metadata-only; the validation runs BEFORE\n // `SetMetadata(...)` is called so a bad input never reaches\n // the registry.\n assertValidCron(cronExpression);\n assertValidTimezone(options.timezone);\n\n const meta: BatchScheduledMetadata = {\n cron: cronExpression,\n options,\n inert: process.env.BATCH_SCHEDULED_DISABLE === '1',\n };\n return SetMetadata(BATCH_SCHEDULED_OPTIONS, meta);\n}\n"],"names":["BATCH_SCHEDULED_OPTIONS","BatchScheduled","InvalidBatchScheduledCronError","InvalidBatchScheduledTimezoneError","SCHEDULED_KEY","CRON_MIN_FIELDS","CRON_MAX_FIELDS","CRON_SHAPE","isValidIanaTimezone","tz","Intl","DateTimeFormat","undefined","timeZone","assertValidCron","cronExpression","length","test","trim","fieldCount","split","reason","assertValidTimezone","Error","cron","name","timezone","options","meta","inert","process","env","BATCH_SCHEDULED_DISABLE","SetMetadata"],"mappings":";;;;;;;;;;;QAKaA;eAAAA;;QA0OGC;eAAAA;;QA5CHC;eAAAA;;QAyBAC;eAAAA;;;QA5NN;wBACqB;2BAE6B;AAElD,MAAMH,0BAA0BI,kCAAa;AA2DpD;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BC,GACD,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E;;;;;;CAMC,GACD,MAAMC,kBAAkB;AACxB,MAAMC,kBAAkB;AAExB;;;;;;;;;;;;;;;;;;CAkBC,GACD,MAAMC,aAAa;AAEnB;;;;;;;;;;CAUC,GACD,SAASC,oBAAoBC,EAAU;IACrC,IAAI;QACF,IAAIC,KAAKC,cAAc,CAACC,WAAW;YAAEC,UAAUJ;QAAG;QAClD,OAAO;IACT,EAAE,OAAM;QACN,OAAO;IACT;AACF;AAEA;;;;;CAKC,GACD,SAASK,gBAAgBC,cAAsB;IAC7C,2DAA2D;IAC3D,8DAA8D;IAC9D,IAAI,OAAOA,mBAAmB,YAAYA,eAAeC,MAAM,KAAK,GAAG;QACrE,MAAM,IAAId,+BAA+Ba,gBAAgB;IAC3D;IACA,IAAI,CAACR,WAAWU,IAAI,CAACF,eAAeG,IAAI,KAAK;QAC3C,MAAMC,aAAaJ,eAAeG,IAAI,GAAGE,KAAK,CAAC,OAAOJ,MAAM;QAC5D,MAAMK,SACJF,aAAad,kBACT,CAAC,WAAW,EAAEA,gBAAgB,OAAO,CAAC,GACtCc,aAAab,kBACX,CAAC,UAAU,EAAEA,gBAAgB,OAAO,CAAC,GACrC;QACR,MAAM,IAAIJ,+BAA+Ba,gBAAgBM;IAC3D;AACF;AAEA;;;;CAIC,GACD,SAASC,oBAAoBb,EAAU;IACrC,IAAI,OAAOA,OAAO,YAAYA,GAAGS,IAAI,GAAGF,MAAM,KAAK,GAAG;QACpD,MAAM,IAAIb,mCAAmCM,IAAI;IACnD;IACA,IAAI,CAACD,oBAAoBC,KAAK;QAC5B,MAAM,IAAIN,mCAAmCM,IAAI;IACnD;AACF;AAYO,IAAA,AAAMP,iCAAN,MAAMA,uCAAuCqB;IACzCC,KAAa;IACbH,OAAe;IAExB,YAAYG,IAAY,EAAEH,MAAc,CAAE;QACxC,KAAK,CACH,CAAC,0CAA0C,EAAEG,KAAK,GAAG,EAAEH,OAAO,EAAE,CAAC,GAC/D,CAAC,SAAS,EAAEhB,gBAAgB,oBAAoB,EAAEC,gBAAgB,iBAAiB,CAAC,GACpF,CAAC,4BAA4B,CAAC;QAElC,IAAI,CAACmB,IAAI,GAAG;QACZ,IAAI,CAACD,IAAI,GAAGA;QACZ,IAAI,CAACH,MAAM,GAAGA;IAChB;AACF;AAWO,IAAA,AAAMlB,qCAAN,MAAMA,2CAA2CoB;IAC7CG,SAAiB;IACjBL,OAAe;IAExB,YAAYK,QAAgB,EAAEL,MAAc,CAAE;QAC5C,KAAK,CACH,CAAC,mCAAmC,EAAEK,SAAS,GAAG,EAAEL,OAAO,EAAE,CAAC,GAC5D,CAAC,qFAAqF,CAAC;QAE3F,IAAI,CAACI,IAAI,GAAG;QACZ,IAAI,CAACC,QAAQ,GAAGA;QAChB,IAAI,CAACL,MAAM,GAAGA;IAChB;AACF;AAMO,SAASpB,eACdc,cAAsB,EACtBY,OAA8B;IAE9B,0DAA0D;IAC1D,+DAA+D;IAC/D,+DAA+D;IAC/D,mBAAmB;IACnBb,gBAAgBC;IAChBO,oBAAoBK,QAAQD,QAAQ;IAEpC,MAAME,OAA+B;QACnCJ,MAAMT;QACNY;QACAE,OAAOC,QAAQC,GAAG,CAACC,uBAAuB,KAAK;IACjD;IACA,OAAOC,IAAAA,mBAAW,EAACjC,yBAAyB4B;AAC9C"}
@@ -0,0 +1,16 @@
1
+ import { TransactionContext, TransactionManager } from '../core/transaction/transaction-manager';
2
+ export interface InMemoryTransactionContext extends TransactionContext {
3
+ readonly isActive: true;
4
+ readonly id: string;
5
+ }
6
+ /**
7
+ * No-op TransactionManager for the in-memory adapter and for tests.
8
+ * Calls `fn(ctx)` directly without any real transactional semantics.
9
+ *
10
+ * For real DB transactions, use a MikroORM/SQL adapter implementation
11
+ * (e.g., `MikroORMTransactionManager`).
12
+ */
13
+ export declare class InMemoryTransactionManager extends TransactionManager {
14
+ withTransaction<T>(fn: (ctx: InMemoryTransactionContext) => Promise<T>): Promise<T>;
15
+ }
16
+ //# sourceMappingURL=in-memory-transaction-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-transaction-manager.d.ts","sourceRoot":"","sources":["../../../src/transaction/in-memory-transaction-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAEjG,MAAM,WAAW,0BAA2B,SAAQ,kBAAkB;IACpE,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,qBACa,0BAA2B,SAAQ,kBAAkB;IAC1D,eAAe,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,0BAA0B,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAI1F"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "InMemoryTransactionManager", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return InMemoryTransactionManager;
9
+ }
10
+ });
11
+ const _common = require("@nestjs/common");
12
+ const _crypto = require("crypto");
13
+ const _transactionmanager = require("../core/transaction/transaction-manager");
14
+ function _ts_decorate(decorators, target, key, desc) {
15
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
16
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
17
+ else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
18
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
19
+ }
20
+ let InMemoryTransactionManager = class InMemoryTransactionManager extends _transactionmanager.TransactionManager {
21
+ async withTransaction(fn) {
22
+ const ctx = {
23
+ isActive: true,
24
+ id: (0, _crypto.randomUUID)()
25
+ };
26
+ return fn(ctx);
27
+ }
28
+ };
29
+ InMemoryTransactionManager = _ts_decorate([
30
+ (0, _common.Injectable)()
31
+ ], InMemoryTransactionManager);
32
+
33
+ //# sourceMappingURL=in-memory-transaction-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/transaction/in-memory-transaction-manager.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { randomUUID } from 'crypto';\nimport { TransactionContext, TransactionManager } from '../core/transaction/transaction-manager';\n\nexport interface InMemoryTransactionContext extends TransactionContext {\n readonly isActive: true;\n readonly id: string;\n}\n\n/**\n * No-op TransactionManager for the in-memory adapter and for tests.\n * Calls `fn(ctx)` directly without any real transactional semantics.\n *\n * For real DB transactions, use a MikroORM/SQL adapter implementation\n * (e.g., `MikroORMTransactionManager`).\n */\n@Injectable()\nexport class InMemoryTransactionManager extends TransactionManager {\n async withTransaction<T>(fn: (ctx: InMemoryTransactionContext) => Promise<T>): Promise<T> {\n const ctx: InMemoryTransactionContext = { isActive: true, id: randomUUID() };\n return fn(ctx);\n }\n}\n"],"names":["InMemoryTransactionManager","TransactionManager","withTransaction","fn","ctx","isActive","id","randomUUID"],"mappings":";;;;+BAiBaA;;;eAAAA;;;wBAjBc;wBACA;oCAC4B;;;;;;;AAehD,IAAA,AAAMA,6BAAN,MAAMA,mCAAmCC,sCAAkB;IAChE,MAAMC,gBAAmBC,EAAmD,EAAc;QACxF,MAAMC,MAAkC;YAAEC,UAAU;YAAMC,IAAIC,IAAAA,kBAAU;QAAG;QAC3E,OAAOJ,GAAGC;IACZ;AACF"}
@@ -0,0 +1,2 @@
1
+ export * from './in-memory-transaction-manager';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/transaction/index.ts"],"names":[],"mappings":"AAAA,cAAc,iCAAiC,CAAC"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ _export_star(require("./in-memory-transaction-manager"), exports);
6
+ function _export_star(from, to) {
7
+ Object.keys(from).forEach(function(k) {
8
+ if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) {
9
+ Object.defineProperty(to, k, {
10
+ enumerable: true,
11
+ get: function() {
12
+ return from[k];
13
+ }
14
+ });
15
+ }
16
+ });
17
+ return from;
18
+ }
19
+
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/transaction/index.ts"],"sourcesContent":["export * from './in-memory-transaction-manager';\n"],"names":[],"mappings":";;;;qBAAc"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Shared contract test suites for `@nest-batch/core` adapter packages.
3
+ *
4
+ * These suites are intentionally ORM-agnostic: they reference only the
5
+ * public core interfaces (`IJobRepository`, `TransactionManager`) and
6
+ * value types. Each suite is exposed as a function that takes a factory
7
+ * returning a fresh `(repo, tx)` pair per test.
8
+ *
9
+ * Usage from a future adapter package (e.g. `@nest-batch/mikro-orm`):
10
+ *
11
+ * import { runJobRepositoryContract } from '@nest-batch/core/test-contracts';
12
+ * import { MikroORMJobRepository } from '../mikroorm-job-repository';
13
+ * import { MikroORMTransactionManager } from '../mikroorm-transaction-manager';
14
+ *
15
+ * runJobRepositoryContract(
16
+ * {
17
+ * create: () => ({
18
+ * repo: new MikroORMJobRepository(em),
19
+ * tx: new MikroORMTransactionManager(em),
20
+ * }),
21
+ * },
22
+ * 'MikroORM',
23
+ * );
24
+ */
25
+ export { runJobRepositoryContract, type JobRepositoryContractFactory, } from './job-repository.contract';
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../tests/contracts/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,EACL,wBAAwB,EACxB,KAAK,4BAA4B,GAClC,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Shared contract test suites for `@nest-batch/core` adapter packages.
3
+ *
4
+ * These suites are intentionally ORM-agnostic: they reference only the
5
+ * public core interfaces (`IJobRepository`, `TransactionManager`) and
6
+ * value types. Each suite is exposed as a function that takes a factory
7
+ * returning a fresh `(repo, tx)` pair per test.
8
+ *
9
+ * Usage from a future adapter package (e.g. `@nest-batch/mikro-orm`):
10
+ *
11
+ * import { runJobRepositoryContract } from '@nest-batch/core/test-contracts';
12
+ * import { MikroORMJobRepository } from '../mikroorm-job-repository';
13
+ * import { MikroORMTransactionManager } from '../mikroorm-transaction-manager';
14
+ *
15
+ * runJobRepositoryContract(
16
+ * {
17
+ * create: () => ({
18
+ * repo: new MikroORMJobRepository(em),
19
+ * tx: new MikroORMTransactionManager(em),
20
+ * }),
21
+ * },
22
+ * 'MikroORM',
23
+ * );
24
+ */ "use strict";
25
+ Object.defineProperty(exports, "__esModule", {
26
+ value: true
27
+ });
28
+ Object.defineProperty(exports, "runJobRepositoryContract", {
29
+ enumerable: true,
30
+ get: function() {
31
+ return _jobrepositorycontract.runJobRepositoryContract;
32
+ }
33
+ });
34
+ const _jobrepositorycontract = require("./job-repository.contract");
35
+
36
+
37
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../tests/contracts/index.ts"],"names":["runJobRepositoryContract"],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;CAuBC;;;;+BAECA;;;eAAAA,+CAAwB;;;uCAEnB","file":"index.js","sourcesContent":["/**\n * Shared contract test suites for `@nest-batch/core` adapter packages.\n *\n * These suites are intentionally ORM-agnostic: they reference only the\n * public core interfaces (`IJobRepository`, `TransactionManager`) and\n * value types. Each suite is exposed as a function that takes a factory\n * returning a fresh `(repo, tx)` pair per test.\n *\n * Usage from a future adapter package (e.g. `@nest-batch/mikro-orm`):\n *\n * import { runJobRepositoryContract } from '@nest-batch/core/test-contracts';\n * import { MikroORMJobRepository } from '../mikroorm-job-repository';\n * import { MikroORMTransactionManager } from '../mikroorm-transaction-manager';\n *\n * runJobRepositoryContract(\n * {\n * create: () => ({\n * repo: new MikroORMJobRepository(em),\n * tx: new MikroORMTransactionManager(em),\n * }),\n * },\n * 'MikroORM',\n * );\n */\nexport {\n runJobRepositoryContract,\n type JobRepositoryContractFactory,\n} from './job-repository.contract';\n"]}
@@ -0,0 +1,46 @@
1
+ import { type IJobRepository } from '@nest-batch/core';
2
+ import { TransactionManager } from '@nest-batch/core';
3
+ /**
4
+ * A factory that returns a fresh `JobRepository` + `TransactionManager`
5
+ * pair per call.
6
+ *
7
+ * Every contract test calls this in `beforeEach` to guarantee isolation
8
+ * between cases. Implementations that need a per-test transaction
9
+ * manager, a fresh in-memory store, or a per-test DB transaction
10
+ * rollback can plug that in here.
11
+ */
12
+ export interface JobRepositoryContractFactory {
13
+ create(): {
14
+ repo: IJobRepository;
15
+ tx: TransactionManager;
16
+ };
17
+ }
18
+ /**
19
+ * Shared `JobRepository` + `TransactionManager` contract suite.
20
+ *
21
+ * Every implementation of the batch core repository/transaction contract
22
+ * — in-memory, `@nest-batch/mikro-orm`, `@nest-batch/typeorm`, future
23
+ * adapters — must pass this suite. The contract covers:
24
+ *
25
+ * - Happy-path lifecycle: getOrCreateJobInstance → createExecutionAtomic
26
+ * → status updates → step execution lifecycle.
27
+ * - ExecutionContext save/load roundtrip (the restart-checkpoint
28
+ * payload path).
29
+ * - `findLatestStepExecution` returning the latest matching row (the
30
+ * restart-resume lookup), and only that step name.
31
+ * - `TransactionManager.withTransaction` wrapping + propagation of
32
+ * errors and resolved values.
33
+ * - Negative: a duplicate active execution is rejected
34
+ * (`JobExecutionAlreadyRunningError`).
35
+ * - Concurrency: when N callers race `createExecutionAtomic` against
36
+ * the same `(name, jobKey)`, exactly one wins and the others reject.
37
+ * This is the in-memory stand-in for PostgreSQL's
38
+ * `FOR UPDATE SKIP LOCKED` semantics.
39
+ * - Idempotency: a second launch is allowed after the prior execution
40
+ * is no longer `STARTING`/`STARTED` (e.g. `COMPLETED`).
41
+ *
42
+ * The contract is intentionally decoupled from any concrete ORM entity
43
+ * class: only the public interfaces and value types are referenced.
44
+ */
45
+ export declare function runJobRepositoryContract(factory: JobRepositoryContractFactory, implName: string): void;
46
+ //# sourceMappingURL=job-repository.contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-repository.contract.d.ts","sourceRoot":"","sources":["../../../tests/contracts/job-repository.contract.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAStD;;;;;;;;GAQG;AACH,MAAM,WAAW,4BAA4B;IAC3C,MAAM,IAAI;QAAE,IAAI,EAAE,cAAc,CAAC;QAAC,EAAE,EAAE,kBAAkB,CAAA;KAAE,CAAC;CAC5D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,4BAA4B,EACrC,QAAQ,EAAE,MAAM,GACf,IAAI,CAigBN"}