semola 0.5.3 → 0.5.4

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 (363) hide show
  1. package/dist/index-BhGNDjPq.d.mts +13 -0
  2. package/dist/index-DxSbeGP-.d.cts +13 -0
  3. package/dist/lib/api/index.cjs +522 -4
  4. package/dist/lib/api/index.d.cts +270 -4
  5. package/dist/lib/api/index.d.mts +270 -4
  6. package/dist/lib/api/index.mjs +520 -2
  7. package/dist/lib/cache/index.d.cts +16 -4
  8. package/dist/lib/cache/index.d.mts +16 -4
  9. package/dist/lib/cache/index.mjs +0 -2
  10. package/dist/lib/cron/index.cjs +734 -12
  11. package/dist/lib/cron/index.d.cts +145 -3
  12. package/dist/lib/cron/index.d.mts +145 -3
  13. package/dist/lib/cron/index.mjs +725 -3
  14. package/dist/lib/errors/index.d.cts +2 -13
  15. package/dist/lib/errors/index.d.mts +2 -13
  16. package/dist/lib/errors/index.mjs +0 -2
  17. package/dist/lib/i18n/index.d.cts +12 -4
  18. package/dist/lib/i18n/index.d.mts +12 -4
  19. package/dist/lib/i18n/index.mjs +0 -2
  20. package/dist/lib/logging/index.cjs +386 -17
  21. package/dist/lib/logging/index.d.cts +107 -6
  22. package/dist/lib/logging/index.d.mts +107 -6
  23. package/dist/lib/logging/index.mjs +373 -4
  24. package/dist/lib/policy/index.cjs +206 -20
  25. package/dist/lib/policy/index.d.cts +61 -5
  26. package/dist/lib/policy/index.d.mts +61 -5
  27. package/dist/lib/policy/index.mjs +187 -3
  28. package/dist/lib/prompts/index.cjs +374 -14
  29. package/dist/lib/prompts/index.d.cts +69 -4
  30. package/dist/lib/prompts/index.d.mts +69 -4
  31. package/dist/lib/prompts/index.mjs +362 -4
  32. package/dist/lib/pubsub/index.d.cts +9 -4
  33. package/dist/lib/pubsub/index.d.mts +9 -4
  34. package/dist/lib/pubsub/index.mjs +0 -2
  35. package/dist/lib/queue/index.d.cts +48 -6
  36. package/dist/lib/queue/index.d.mts +48 -6
  37. package/dist/lib/queue/index.mjs +0 -2
  38. package/dist/lib/workflow/index.d.cts +82 -4
  39. package/dist/lib/workflow/index.d.mts +82 -4
  40. package/dist/lib/workflow/index.mjs +0 -2
  41. package/package.json +1 -1
  42. package/dist/api/core/index.cjs +0 -206
  43. package/dist/api/core/index.d.cts +0 -21
  44. package/dist/api/core/index.d.cts.map +0 -1
  45. package/dist/api/core/index.d.mts +0 -21
  46. package/dist/api/core/index.d.mts.map +0 -1
  47. package/dist/api/core/index.mjs +0 -208
  48. package/dist/api/core/index.mjs.map +0 -1
  49. package/dist/api/core/types.d.cts +0 -107
  50. package/dist/api/core/types.d.cts.map +0 -1
  51. package/dist/api/core/types.d.mts +0 -107
  52. package/dist/api/core/types.d.mts.map +0 -1
  53. package/dist/api/middleware/index.cjs +0 -8
  54. package/dist/api/middleware/index.d.cts +0 -11
  55. package/dist/api/middleware/index.d.cts.map +0 -1
  56. package/dist/api/middleware/index.d.mts +0 -11
  57. package/dist/api/middleware/index.d.mts.map +0 -1
  58. package/dist/api/middleware/index.mjs +0 -10
  59. package/dist/api/middleware/index.mjs.map +0 -1
  60. package/dist/api/middleware/types.d.cts +0 -16
  61. package/dist/api/middleware/types.d.cts.map +0 -1
  62. package/dist/api/middleware/types.d.mts +0 -16
  63. package/dist/api/middleware/types.d.mts.map +0 -1
  64. package/dist/api/openapi/index.cjs +0 -254
  65. package/dist/api/openapi/index.mjs +0 -256
  66. package/dist/api/openapi/index.mjs.map +0 -1
  67. package/dist/api/openapi/types.d.cts +0 -60
  68. package/dist/api/openapi/types.d.cts.map +0 -1
  69. package/dist/api/openapi/types.d.mts +0 -60
  70. package/dist/api/openapi/types.d.mts.map +0 -1
  71. package/dist/api/validation/index.cjs +0 -64
  72. package/dist/api/validation/index.mjs +0 -61
  73. package/dist/api/validation/index.mjs.map +0 -1
  74. package/dist/cache/types.d.cts +0 -17
  75. package/dist/cache/types.d.cts.map +0 -1
  76. package/dist/cache/types.d.mts +0 -17
  77. package/dist/cache/types.d.mts.map +0 -1
  78. package/dist/cron/builder/index.cjs +0 -166
  79. package/dist/cron/builder/index.d.cts +0 -28
  80. package/dist/cron/builder/index.d.cts.map +0 -1
  81. package/dist/cron/builder/index.d.mts +0 -28
  82. package/dist/cron/builder/index.d.mts.map +0 -1
  83. package/dist/cron/builder/index.mjs +0 -163
  84. package/dist/cron/builder/index.mjs.map +0 -1
  85. package/dist/cron/builder/types.cjs +0 -27
  86. package/dist/cron/builder/types.d.cts +0 -79
  87. package/dist/cron/builder/types.d.cts.map +0 -1
  88. package/dist/cron/builder/types.d.mts +0 -79
  89. package/dist/cron/builder/types.d.mts.map +0 -1
  90. package/dist/cron/builder/types.mjs +0 -28
  91. package/dist/cron/builder/types.mjs.map +0 -1
  92. package/dist/cron/core/index.cjs +0 -308
  93. package/dist/cron/core/index.d.cts +0 -39
  94. package/dist/cron/core/index.d.cts.map +0 -1
  95. package/dist/cron/core/index.d.mts +0 -39
  96. package/dist/cron/core/index.d.mts.map +0 -1
  97. package/dist/cron/core/index.mjs +0 -310
  98. package/dist/cron/core/index.mjs.map +0 -1
  99. package/dist/cron/core/scanner.cjs +0 -237
  100. package/dist/cron/core/scanner.mjs +0 -238
  101. package/dist/cron/core/scanner.mjs.map +0 -1
  102. package/dist/cron/core/types.d.cts +0 -11
  103. package/dist/cron/core/types.d.cts.map +0 -1
  104. package/dist/cron/core/types.d.mts +0 -11
  105. package/dist/cron/core/types.d.mts.map +0 -1
  106. package/dist/errors/types.d.cts +0 -5
  107. package/dist/errors/types.d.cts.map +0 -1
  108. package/dist/errors/types.d.mts +0 -5
  109. package/dist/errors/types.d.mts.map +0 -1
  110. package/dist/i18n/types.d.cts +0 -13
  111. package/dist/i18n/types.d.cts.map +0 -1
  112. package/dist/i18n/types.d.mts +0 -13
  113. package/dist/i18n/types.d.mts.map +0 -1
  114. package/dist/lib/cache/index.d.cts.map +0 -1
  115. package/dist/lib/cache/index.d.mts.map +0 -1
  116. package/dist/lib/cache/index.mjs.map +0 -1
  117. package/dist/lib/errors/index.d.cts.map +0 -1
  118. package/dist/lib/errors/index.d.mts.map +0 -1
  119. package/dist/lib/errors/index.mjs.map +0 -1
  120. package/dist/lib/i18n/index.d.cts.map +0 -1
  121. package/dist/lib/i18n/index.d.mts.map +0 -1
  122. package/dist/lib/i18n/index.mjs.map +0 -1
  123. package/dist/lib/orm/index.cjs +0 -20
  124. package/dist/lib/orm/index.d.cts +0 -7
  125. package/dist/lib/orm/index.d.mts +0 -7
  126. package/dist/lib/orm/index.mjs +0 -6
  127. package/dist/lib/policy/index.d.cts.map +0 -1
  128. package/dist/lib/policy/index.d.mts.map +0 -1
  129. package/dist/lib/policy/index.mjs.map +0 -1
  130. package/dist/lib/prompts/index.d.cts.map +0 -1
  131. package/dist/lib/prompts/index.d.mts.map +0 -1
  132. package/dist/lib/prompts/index.mjs.map +0 -1
  133. package/dist/lib/pubsub/index.d.cts.map +0 -1
  134. package/dist/lib/pubsub/index.d.mts.map +0 -1
  135. package/dist/lib/pubsub/index.mjs.map +0 -1
  136. package/dist/lib/queue/index.d.cts.map +0 -1
  137. package/dist/lib/queue/index.d.mts.map +0 -1
  138. package/dist/lib/queue/index.mjs.map +0 -1
  139. package/dist/lib/workflow/index.d.cts.map +0 -1
  140. package/dist/lib/workflow/index.d.mts.map +0 -1
  141. package/dist/lib/workflow/index.mjs.map +0 -1
  142. package/dist/logging/core/index.cjs +0 -99
  143. package/dist/logging/core/index.d.cts +0 -26
  144. package/dist/logging/core/index.d.cts.map +0 -1
  145. package/dist/logging/core/index.d.mts +0 -26
  146. package/dist/logging/core/index.d.mts.map +0 -1
  147. package/dist/logging/core/index.mjs +0 -99
  148. package/dist/logging/core/index.mjs.map +0 -1
  149. package/dist/logging/core/types.cjs +0 -10
  150. package/dist/logging/core/types.d.cts +0 -22
  151. package/dist/logging/core/types.d.cts.map +0 -1
  152. package/dist/logging/core/types.d.mts +0 -22
  153. package/dist/logging/core/types.d.mts.map +0 -1
  154. package/dist/logging/core/types.mjs +0 -12
  155. package/dist/logging/core/types.mjs.map +0 -1
  156. package/dist/logging/formatter/index.cjs +0 -119
  157. package/dist/logging/formatter/index.d.cts +0 -27
  158. package/dist/logging/formatter/index.d.cts.map +0 -1
  159. package/dist/logging/formatter/index.d.mts +0 -27
  160. package/dist/logging/formatter/index.d.mts.map +0 -1
  161. package/dist/logging/formatter/index.mjs +0 -115
  162. package/dist/logging/formatter/index.mjs.map +0 -1
  163. package/dist/logging/formatter/types.d.cts +0 -5
  164. package/dist/logging/formatter/types.d.cts.map +0 -1
  165. package/dist/logging/formatter/types.d.mts +0 -5
  166. package/dist/logging/formatter/types.d.mts.map +0 -1
  167. package/dist/logging/provider/index.cjs +0 -165
  168. package/dist/logging/provider/index.d.cts +0 -28
  169. package/dist/logging/provider/index.d.cts.map +0 -1
  170. package/dist/logging/provider/index.d.mts +0 -28
  171. package/dist/logging/provider/index.d.mts.map +0 -1
  172. package/dist/logging/provider/index.mjs +0 -165
  173. package/dist/logging/provider/index.mjs.map +0 -1
  174. package/dist/logging/provider/types.d.cts +0 -23
  175. package/dist/logging/provider/types.d.cts.map +0 -1
  176. package/dist/logging/provider/types.d.mts +0 -23
  177. package/dist/logging/provider/types.d.mts.map +0 -1
  178. package/dist/node_modules/@standard-schema/spec/dist/index.d.cts +0 -80
  179. package/dist/node_modules/@standard-schema/spec/dist/index.d.cts.map +0 -1
  180. package/dist/node_modules/@standard-schema/spec/dist/index.d.mts +0 -80
  181. package/dist/node_modules/@standard-schema/spec/dist/index.d.mts.map +0 -1
  182. package/dist/orm/column.cjs +0 -137
  183. package/dist/orm/column.d.cts +0 -121
  184. package/dist/orm/column.d.cts.map +0 -1
  185. package/dist/orm/column.d.mts +0 -121
  186. package/dist/orm/column.d.mts.map +0 -1
  187. package/dist/orm/column.mjs +0 -132
  188. package/dist/orm/column.mjs.map +0 -1
  189. package/dist/orm/dialect/index.cjs +0 -14
  190. package/dist/orm/dialect/index.mjs +0 -16
  191. package/dist/orm/dialect/index.mjs.map +0 -1
  192. package/dist/orm/dialect/mysql.cjs +0 -31
  193. package/dist/orm/dialect/mysql.mjs +0 -33
  194. package/dist/orm/dialect/mysql.mjs.map +0 -1
  195. package/dist/orm/dialect/postgres.cjs +0 -23
  196. package/dist/orm/dialect/postgres.mjs +0 -25
  197. package/dist/orm/dialect/postgres.mjs.map +0 -1
  198. package/dist/orm/dialect/sqlite.cjs +0 -31
  199. package/dist/orm/dialect/sqlite.mjs +0 -33
  200. package/dist/orm/dialect/sqlite.mjs.map +0 -1
  201. package/dist/orm/dialect/utils.cjs +0 -8
  202. package/dist/orm/dialect/utils.mjs +0 -10
  203. package/dist/orm/dialect/utils.mjs.map +0 -1
  204. package/dist/orm/internal/table-columns.cjs +0 -31
  205. package/dist/orm/internal/table-columns.mjs +0 -32
  206. package/dist/orm/internal/table-columns.mjs.map +0 -1
  207. package/dist/orm/internal/table-lookup.cjs +0 -35
  208. package/dist/orm/internal/table-lookup.mjs +0 -35
  209. package/dist/orm/internal/table-lookup.mjs.map +0 -1
  210. package/dist/orm/internal/table-relations.cjs +0 -28
  211. package/dist/orm/internal/table-relations.mjs +0 -29
  212. package/dist/orm/internal/table-relations.mjs.map +0 -1
  213. package/dist/orm/migration/config.cjs +0 -7
  214. package/dist/orm/migration/config.d.cts +0 -7
  215. package/dist/orm/migration/config.d.cts.map +0 -1
  216. package/dist/orm/migration/config.d.mts +0 -7
  217. package/dist/orm/migration/config.d.mts.map +0 -1
  218. package/dist/orm/migration/config.mjs +0 -8
  219. package/dist/orm/migration/config.mjs.map +0 -1
  220. package/dist/orm/migration/types.d.cts +0 -20
  221. package/dist/orm/migration/types.d.cts.map +0 -1
  222. package/dist/orm/migration/types.d.mts +0 -20
  223. package/dist/orm/migration/types.d.mts.map +0 -1
  224. package/dist/orm/orm.cjs +0 -41
  225. package/dist/orm/orm.d.cts +0 -18
  226. package/dist/orm/orm.d.cts.map +0 -1
  227. package/dist/orm/orm.d.mts +0 -18
  228. package/dist/orm/orm.d.mts.map +0 -1
  229. package/dist/orm/orm.mjs +0 -43
  230. package/dist/orm/orm.mjs.map +0 -1
  231. package/dist/orm/relation.cjs +0 -18
  232. package/dist/orm/relation.d.cts +0 -8
  233. package/dist/orm/relation.d.cts.map +0 -1
  234. package/dist/orm/relation.d.mts +0 -8
  235. package/dist/orm/relation.d.mts.map +0 -1
  236. package/dist/orm/relation.mjs +0 -19
  237. package/dist/orm/relation.mjs.map +0 -1
  238. package/dist/orm/runtime/builders/mutations.cjs +0 -29
  239. package/dist/orm/runtime/builders/mutations.mjs +0 -28
  240. package/dist/orm/runtime/builders/mutations.mjs.map +0 -1
  241. package/dist/orm/runtime/builders/select.cjs +0 -18
  242. package/dist/orm/runtime/builders/select.mjs +0 -19
  243. package/dist/orm/runtime/builders/select.mjs.map +0 -1
  244. package/dist/orm/runtime/client.cjs +0 -90
  245. package/dist/orm/runtime/client.mjs +0 -92
  246. package/dist/orm/runtime/client.mjs.map +0 -1
  247. package/dist/orm/runtime/context.cjs +0 -49
  248. package/dist/orm/runtime/context.mjs +0 -51
  249. package/dist/orm/runtime/context.mjs.map +0 -1
  250. package/dist/orm/runtime/dialect/index.cjs +0 -11
  251. package/dist/orm/runtime/dialect/index.mjs +0 -13
  252. package/dist/orm/runtime/dialect/index.mjs.map +0 -1
  253. package/dist/orm/runtime/dialect/mysql.cjs +0 -95
  254. package/dist/orm/runtime/dialect/mysql.mjs +0 -97
  255. package/dist/orm/runtime/dialect/mysql.mjs.map +0 -1
  256. package/dist/orm/runtime/dialect/postgres.cjs +0 -51
  257. package/dist/orm/runtime/dialect/postgres.mjs +0 -53
  258. package/dist/orm/runtime/dialect/postgres.mjs.map +0 -1
  259. package/dist/orm/runtime/dialect/sqlite.cjs +0 -4
  260. package/dist/orm/runtime/dialect/sqlite.mjs +0 -7
  261. package/dist/orm/runtime/dialect/sqlite.mjs.map +0 -1
  262. package/dist/orm/runtime/errors.cjs +0 -19
  263. package/dist/orm/runtime/errors.mjs +0 -21
  264. package/dist/orm/runtime/errors.mjs.map +0 -1
  265. package/dist/orm/runtime/hydrate/many.cjs +0 -46
  266. package/dist/orm/runtime/hydrate/many.mjs +0 -48
  267. package/dist/orm/runtime/hydrate/many.mjs.map +0 -1
  268. package/dist/orm/runtime/hydrate/one.cjs +0 -38
  269. package/dist/orm/runtime/hydrate/one.mjs +0 -40
  270. package/dist/orm/runtime/hydrate/one.mjs.map +0 -1
  271. package/dist/orm/runtime/hydrate.cjs +0 -49
  272. package/dist/orm/runtime/hydrate.mjs +0 -51
  273. package/dist/orm/runtime/hydrate.mjs.map +0 -1
  274. package/dist/orm/runtime/rows.cjs +0 -30
  275. package/dist/orm/runtime/rows.mjs +0 -31
  276. package/dist/orm/runtime/rows.mjs.map +0 -1
  277. package/dist/orm/runtime/utils.cjs +0 -27
  278. package/dist/orm/runtime/utils.mjs +0 -27
  279. package/dist/orm/runtime/utils.mjs.map +0 -1
  280. package/dist/orm/sql/parse-array.cjs +0 -64
  281. package/dist/orm/sql/parse-array.mjs +0 -66
  282. package/dist/orm/sql/parse-array.mjs.map +0 -1
  283. package/dist/orm/sql/plan/select.cjs +0 -36
  284. package/dist/orm/sql/plan/select.mjs +0 -38
  285. package/dist/orm/sql/plan/select.mjs.map +0 -1
  286. package/dist/orm/sql/plan/where/operators.cjs +0 -95
  287. package/dist/orm/sql/plan/where/operators.mjs +0 -97
  288. package/dist/orm/sql/plan/where/operators.mjs.map +0 -1
  289. package/dist/orm/sql/plan/where.cjs +0 -59
  290. package/dist/orm/sql/plan/where.mjs +0 -61
  291. package/dist/orm/sql/plan/where.mjs.map +0 -1
  292. package/dist/orm/sql/serialize/clauses.cjs +0 -36
  293. package/dist/orm/sql/serialize/clauses.mjs +0 -37
  294. package/dist/orm/sql/serialize/clauses.mjs.map +0 -1
  295. package/dist/orm/sql/serialize/joins.cjs +0 -31
  296. package/dist/orm/sql/serialize/joins.mjs +0 -33
  297. package/dist/orm/sql/serialize/joins.mjs.map +0 -1
  298. package/dist/orm/sql/serialize/values.cjs +0 -30
  299. package/dist/orm/sql/serialize/values.mjs +0 -32
  300. package/dist/orm/sql/serialize/values.mjs.map +0 -1
  301. package/dist/orm/sql/serialize/where/predicate.cjs +0 -73
  302. package/dist/orm/sql/serialize/where/predicate.mjs +0 -75
  303. package/dist/orm/sql/serialize/where/predicate.mjs.map +0 -1
  304. package/dist/orm/sql/serialize/where/tree.cjs +0 -26
  305. package/dist/orm/sql/serialize/where/tree.mjs +0 -28
  306. package/dist/orm/sql/serialize/where/tree.mjs.map +0 -1
  307. package/dist/orm/sql/serialize/where.cjs +0 -10
  308. package/dist/orm/sql/serialize/where.mjs +0 -12
  309. package/dist/orm/sql/serialize/where.mjs.map +0 -1
  310. package/dist/orm/sql/serialize.cjs +0 -24
  311. package/dist/orm/sql/serialize.mjs +0 -25
  312. package/dist/orm/sql/serialize.mjs.map +0 -1
  313. package/dist/orm/table.cjs +0 -12
  314. package/dist/orm/table.d.cts +0 -12
  315. package/dist/orm/table.d.cts.map +0 -1
  316. package/dist/orm/table.d.mts +0 -12
  317. package/dist/orm/table.d.mts.map +0 -1
  318. package/dist/orm/table.mjs +0 -14
  319. package/dist/orm/table.mjs.map +0 -1
  320. package/dist/orm/types.d.cts +0 -183
  321. package/dist/orm/types.d.cts.map +0 -1
  322. package/dist/orm/types.d.mts +0 -183
  323. package/dist/orm/types.d.mts.map +0 -1
  324. package/dist/policy/helpers.cjs +0 -206
  325. package/dist/policy/helpers.d.cts +0 -50
  326. package/dist/policy/helpers.d.cts.map +0 -1
  327. package/dist/policy/helpers.d.mts +0 -50
  328. package/dist/policy/helpers.d.mts.map +0 -1
  329. package/dist/policy/helpers.mjs +0 -190
  330. package/dist/policy/helpers.mjs.map +0 -1
  331. package/dist/policy/types.d.cts +0 -16
  332. package/dist/policy/types.d.cts.map +0 -1
  333. package/dist/policy/types.d.mts +0 -16
  334. package/dist/policy/types.d.mts.map +0 -1
  335. package/dist/prompts/core/keys.cjs +0 -165
  336. package/dist/prompts/core/keys.mjs +0 -167
  337. package/dist/prompts/core/keys.mjs.map +0 -1
  338. package/dist/prompts/core/runtime.cjs +0 -104
  339. package/dist/prompts/core/runtime.mjs +0 -106
  340. package/dist/prompts/core/runtime.mjs.map +0 -1
  341. package/dist/prompts/core/session.cjs +0 -98
  342. package/dist/prompts/core/session.mjs +0 -100
  343. package/dist/prompts/core/session.mjs.map +0 -1
  344. package/dist/prompts/core/types.d.cts +0 -21
  345. package/dist/prompts/core/types.d.cts.map +0 -1
  346. package/dist/prompts/core/types.d.mts +0 -21
  347. package/dist/prompts/core/types.d.mts.map +0 -1
  348. package/dist/prompts/types.d.cts +0 -52
  349. package/dist/prompts/types.d.cts.map +0 -1
  350. package/dist/prompts/types.d.mts +0 -52
  351. package/dist/prompts/types.d.mts.map +0 -1
  352. package/dist/pubsub/types.d.cts +0 -10
  353. package/dist/pubsub/types.d.cts.map +0 -1
  354. package/dist/pubsub/types.d.mts +0 -10
  355. package/dist/pubsub/types.d.mts.map +0 -1
  356. package/dist/queue/types.d.cts +0 -47
  357. package/dist/queue/types.d.cts.map +0 -1
  358. package/dist/queue/types.d.mts +0 -47
  359. package/dist/queue/types.d.mts.map +0 -1
  360. package/dist/workflow/types.d.cts +0 -83
  361. package/dist/workflow/types.d.cts.map +0 -1
  362. package/dist/workflow/types.d.mts +0 -83
  363. package/dist/workflow/types.d.mts.map +0 -1
@@ -1,4 +1,726 @@
1
- import { any, cronJobBuilder, list, number, range, step } from "../../cron/builder/index.mjs";
2
- import { Month, WeekDay } from "../../cron/builder/types.mjs";
3
- import { Cron } from "../../cron/core/index.mjs";
1
+ import { err, mightThrow, ok } from "../errors/index.mjs";
2
+ //#region src/lib/cron/builder/index.ts
3
+ const CRON_FIELD_ORDER = [
4
+ "second",
5
+ "minute",
6
+ "hour",
7
+ "day",
8
+ "month",
9
+ "weekday"
10
+ ];
11
+ var FieldWrapper = class {
12
+ fields = [];
13
+ add(expr) {
14
+ this.fields.push(expr);
15
+ }
16
+ read() {
17
+ return this.fields;
18
+ }
19
+ };
20
+ var CronListBuilder = class {
21
+ wrapper;
22
+ constructor(wrapper) {
23
+ this.wrapper = wrapper;
24
+ }
25
+ any() {
26
+ this.wrapper.add({ type: "any" });
27
+ return this;
28
+ }
29
+ range(options) {
30
+ this.wrapper.add({
31
+ type: "range",
32
+ ...options
33
+ });
34
+ return this;
35
+ }
36
+ step(options) {
37
+ this.wrapper.add({
38
+ type: "step",
39
+ ...options
40
+ });
41
+ return this;
42
+ }
43
+ number(value) {
44
+ this.wrapper.add({
45
+ type: "value",
46
+ value
47
+ });
48
+ return this;
49
+ }
50
+ };
51
+ function range(options) {
52
+ return {
53
+ type: "range",
54
+ ...options
55
+ };
56
+ }
57
+ function any() {
58
+ return { type: "any" };
59
+ }
60
+ function step(options) {
61
+ return {
62
+ type: "step",
63
+ ...options
64
+ };
65
+ }
66
+ function list(builderFn) {
67
+ const wrapper = new FieldWrapper();
68
+ builderFn(new CronListBuilder(wrapper));
69
+ return {
70
+ type: "list",
71
+ values: wrapper.read()
72
+ };
73
+ }
74
+ function number(value) {
75
+ return {
76
+ type: "value",
77
+ value
78
+ };
79
+ }
80
+ function cronJobBuilder(buildFn) {
81
+ const fields = {
82
+ second: void 0,
83
+ minute: void 0,
84
+ hour: void 0,
85
+ day: void 0,
86
+ month: void 0,
87
+ weekday: void 0
88
+ };
89
+ const obj = {
90
+ second(expr) {
91
+ fields.second = checkExpr(expr);
92
+ return obj;
93
+ },
94
+ minute(expr) {
95
+ fields.minute = checkExpr(expr);
96
+ return obj;
97
+ },
98
+ hour(expr) {
99
+ fields.hour = checkExpr(expr);
100
+ return obj;
101
+ },
102
+ day(expr) {
103
+ fields.day = checkExpr(expr);
104
+ return obj;
105
+ },
106
+ month(expr) {
107
+ fields.month = checkExpr(expr);
108
+ return obj;
109
+ },
110
+ weekday(expr) {
111
+ fields.weekday = checkExpr(expr);
112
+ return obj;
113
+ }
114
+ };
115
+ buildFn(obj);
116
+ return generate(fields);
117
+ }
118
+ function checkExpr(expr) {
119
+ if (expr.type === "list") {
120
+ const { values } = expr;
121
+ if (values.length === 0) throw new Error("EmptyListError: List expression cannot be empty");
122
+ return values.map((e) => handleSimpleExpression(e)).join(",");
123
+ }
124
+ return handleSimpleExpression(expr);
125
+ }
126
+ function handleSimpleExpression(expr) {
127
+ switch (expr.type) {
128
+ case "any": return "*";
129
+ case "value": return `${expr.value}`;
130
+ case "range": {
131
+ const { min, max } = expr;
132
+ if (min > max) throw new Error(`OutOfBoundError: Expected ${min} <= ${max}`);
133
+ return `${min}-${max}`;
134
+ }
135
+ case "step": {
136
+ const { step, range } = expr;
137
+ if (step === 0) throw new Error(`OutOfBoundError: Expected step value greater than zero`);
138
+ if (!range) return `*/${step}`;
139
+ const { min, max } = range;
140
+ if (max === 0) {
141
+ if (min > max) throw new Error(`OutOfBoundError: Expected max value greater than zero`);
142
+ return `${min}-${max}/${step}`;
143
+ }
144
+ if (!max) return `${min}/${step}`;
145
+ if (min > max) throw new Error(`OutOfBoundError: Expected ${min} <= ${max}`);
146
+ return `${min}-${max}/${step}`;
147
+ }
148
+ default: return "*";
149
+ }
150
+ }
151
+ function generate(fields) {
152
+ const parts = [];
153
+ for (let index = 0; index < CRON_FIELD_ORDER.length; index++) {
154
+ const key = CRON_FIELD_ORDER[index];
155
+ if (!key) return "";
156
+ if (key === "second" && !fields[key]) continue;
157
+ parts.push(fields[key] ?? "*");
158
+ }
159
+ return parts.join(" ");
160
+ }
161
+ //#endregion
162
+ //#region src/lib/cron/builder/types.ts
163
+ const WeekDay = {
164
+ sun: 0,
165
+ mon: 1,
166
+ tue: 2,
167
+ wed: 3,
168
+ thu: 4,
169
+ fri: 5,
170
+ sat: 6
171
+ };
172
+ const Month = {
173
+ jan: 1,
174
+ feb: 2,
175
+ mar: 3,
176
+ apr: 4,
177
+ may: 5,
178
+ jun: 6,
179
+ jul: 7,
180
+ aug: 8,
181
+ sep: 9,
182
+ oct: 10,
183
+ nov: 11,
184
+ dec: 12
185
+ };
186
+ //#endregion
187
+ //#region src/lib/cron/core/scanner.ts
188
+ const FieldAmount = {
189
+ min: 5,
190
+ max: 6
191
+ };
192
+ var Token = class {
193
+ type;
194
+ component;
195
+ value;
196
+ field;
197
+ constructor(component, type, value, field) {
198
+ this.component = component;
199
+ this.type = type;
200
+ this.value = value;
201
+ this.field = field;
202
+ }
203
+ getComponent() {
204
+ return this.component;
205
+ }
206
+ getTokenType() {
207
+ return this.type;
208
+ }
209
+ getTokenValue() {
210
+ return this.value;
211
+ }
212
+ getField() {
213
+ return this.field;
214
+ }
215
+ toString() {
216
+ return `Token{${`component="${this.component}", type=${this.type}`}, ${`field="${this.field}", value=${this.value}`}}`;
217
+ }
218
+ equals(other) {
219
+ if (!other) return false;
220
+ const isComponentEqual = this.component === other.getComponent();
221
+ const isTokenTypeEqual = this.type === other.getTokenType();
222
+ const isTokenValueEqual = this.value === other.getTokenValue();
223
+ const isFieldEqual = this.field === other.getField();
224
+ return isComponentEqual && isTokenTypeEqual && isTokenValueEqual && isFieldEqual;
225
+ }
226
+ };
227
+ var Scanner = class {
228
+ expression;
229
+ current;
230
+ start;
231
+ tokens;
232
+ constructor(expression) {
233
+ this.expression = expression;
234
+ this.current = 0;
235
+ this.start = 0;
236
+ this.tokens = [];
237
+ }
238
+ scan() {
239
+ if (this.expression.length === 0) return err("EmptyCronExpressionError", "Cron expression have zero length");
240
+ const fields = this.expression.trim().split(/\s+/);
241
+ const hasMinLen = fields.length === FieldAmount.min;
242
+ const hasMaxLen = fields.length === FieldAmount.max;
243
+ if (!hasMinLen && !hasMaxLen) return err("CronLengthError", `Invalid number of fields for '${this.expression}'. Expected 5 or 6 fields but got ${fields.length} field(s)`);
244
+ const components = this.createComponent(fields);
245
+ for (let idx = 0; idx < components.length; idx++) {
246
+ const component = components[idx];
247
+ if (!component) return err("CronExpressionError", `Invalid cron expression: ${this.expression}`);
248
+ this.current = 0;
249
+ this.start = 0;
250
+ const [error, _] = this.scanComponent(component);
251
+ if (error) return err(error.type, error.message);
252
+ }
253
+ return ok(this.tokens);
254
+ }
255
+ scanComponent(component) {
256
+ const { field, content } = component;
257
+ while (this.current < content.length) {
258
+ let currentCh = this.advance(content);
259
+ switch (currentCh) {
260
+ case "*": {
261
+ const ch = this.peek(content);
262
+ if (this.match(content, "/")) {
263
+ const [error, _] = this.handleStep(component);
264
+ if (error) return err(error.type, error.message);
265
+ } else if (!ch || ch === ",") this.addToken("*", "any", "*", field);
266
+ else return err("CronExpressionError", `Invalid any expression '${content}' for field '${field}'`);
267
+ break;
268
+ }
269
+ case "-":
270
+ currentCh = this.advance(content);
271
+ if (this.isDigit(currentCh)) {
272
+ const [error, _] = this.handleRangeWithStep(component);
273
+ if (error) return err(error.type, error.message);
274
+ } else return err("CronExpressionError", `Invalid range expression '${content}' for field '${field}'`);
275
+ break;
276
+ case ",": {
277
+ if (this.current === 1 && this.start === 0) return err("CronExpressionError", `Invalid list expression '${content}' for field '${field}'`);
278
+ const next = this.peek(content);
279
+ if (!next || next === ",") return err("CronExpressionError", `Invalid list expression '${content}' for field '${field}'`);
280
+ break;
281
+ }
282
+ default:
283
+ if (this.isDigit(currentCh)) {
284
+ const [error, _] = this.handleNumber(component);
285
+ if (error) return err(error.type, error.message);
286
+ } else return err("CronExpressionError", `Invalid cron expression '${this.expression}' in field '${field}'`);
287
+ break;
288
+ }
289
+ this.start = this.current;
290
+ }
291
+ return ok(true);
292
+ }
293
+ addToken(component, type, value, field) {
294
+ const token = new Token(component, type, value, field);
295
+ this.tokens.push(token);
296
+ }
297
+ advance(content) {
298
+ const currentCh = content.charAt(this.current);
299
+ this.current += 1;
300
+ return currentCh;
301
+ }
302
+ match(content, expected) {
303
+ if (this.current >= content.length) return false;
304
+ if (content.charAt(this.current) !== expected) return false;
305
+ this.current += 1;
306
+ return true;
307
+ }
308
+ peek(content) {
309
+ if (this.current >= content.length) return void 0;
310
+ return content.charAt(this.current);
311
+ }
312
+ handleStep(component) {
313
+ const { field, content } = component;
314
+ let ch = this.peek(content);
315
+ const slashIdx = this.current - 1;
316
+ while (ch && this.isDigit(ch)) {
317
+ this.advance(content);
318
+ ch = this.peek(content);
319
+ }
320
+ if (ch && ch !== ",") return err("CronExpressionError", `Invalid step expression '${content}' for field '${field}'`);
321
+ const tokenContent = content.substring(this.start, this.current);
322
+ const value = content.slice(slashIdx + 1, this.current);
323
+ if (value.length === 0) return err("CronExpressionError", `Invalid step expression '${content}' for field '${field}'`);
324
+ this.addToken(tokenContent, "step", Number(value), field);
325
+ return ok(true);
326
+ }
327
+ handleRangeWithStep(component) {
328
+ const { field, content } = component;
329
+ let ch = this.peek(content);
330
+ while (ch && this.isDigit(ch)) {
331
+ this.advance(content);
332
+ ch = this.peek(content);
333
+ }
334
+ if (!ch) return err("CronExpressionError", `Invalid range expression '${content}' for field '${field}'`);
335
+ if (this.match(content, "/")) {
336
+ const [error, _] = this.handleStep(component);
337
+ if (error) return err(error.type, error.message);
338
+ return ok(true);
339
+ }
340
+ return err("CronExpressionError", `Invalid range expression '${content}' for field '${field}'`);
341
+ }
342
+ handleNumber(component) {
343
+ const { field, content } = component;
344
+ let ch = this.peek(content);
345
+ this.start = this.current - 1;
346
+ while (ch && this.isDigit(ch)) {
347
+ this.advance(content);
348
+ ch = this.peek(content);
349
+ }
350
+ if (!ch) {
351
+ const item = content.substring(this.start);
352
+ this.addToken(item, "number", Number(item), field);
353
+ return ok(true);
354
+ }
355
+ if (this.match(content, "-")) {
356
+ const [error, _] = this.handleRange(component);
357
+ if (error) return err(error.type, error.message);
358
+ return ok(true);
359
+ }
360
+ if (this.match(content, "/")) {
361
+ const [error, _] = this.handleStep(component);
362
+ if (error) return err(error.type, error.message);
363
+ return ok(true);
364
+ }
365
+ if (!this.isDigit(ch) && ch !== ",") return err("CronExpressionError", `Invalid number '${content}' for field '${field}'`);
366
+ const item = content.substring(this.start, this.current);
367
+ this.addToken(item, "number", Number(item), field);
368
+ return ok(true);
369
+ }
370
+ handleRange(component) {
371
+ const { field, content } = component;
372
+ let ch = this.peek(content);
373
+ if (!ch) return err("CronExpressionError", `Invalid range expression '${content}' for field '${field}'`);
374
+ while (ch && this.isDigit(ch)) {
375
+ this.advance(content);
376
+ ch = this.peek(content);
377
+ }
378
+ if (!ch) {
379
+ const tokenContent = content.substring(this.start);
380
+ this.addToken(tokenContent, "range", tokenContent, field);
381
+ return ok(true);
382
+ }
383
+ if (this.match(content, "/")) {
384
+ const [error, _] = this.handleStep(component);
385
+ if (error) return err(error.type, error.message);
386
+ return ok(true);
387
+ }
388
+ if (ch && ch !== ",") return err("CronExpressionError", `Invalid range expression '${content}' for field '${field}'`);
389
+ const tokenContent = content.substring(this.start, this.current);
390
+ this.addToken(tokenContent, "range", tokenContent, field);
391
+ return ok(true);
392
+ }
393
+ isDigit(ch) {
394
+ return ch >= "0" && ch <= "9";
395
+ }
396
+ createComponent(fields) {
397
+ const fieldNames = [
398
+ "second",
399
+ "minute",
400
+ "hour",
401
+ "day",
402
+ "month",
403
+ "weekday"
404
+ ];
405
+ const components = [];
406
+ let offset = 1;
407
+ if (fields.length === FieldAmount.max) offset = 0;
408
+ for (let idx = 0; idx < fields.length; idx++) {
409
+ const fieldName = fieldNames[idx + offset];
410
+ const content = fields[idx];
411
+ if (!fieldName || !content) break;
412
+ components.push({
413
+ content,
414
+ field: fieldName
415
+ });
416
+ }
417
+ return components;
418
+ }
419
+ };
420
+ //#endregion
421
+ //#region src/lib/cron/core/index.ts
422
+ const RETRY_DELAY_MS = 3600 * 1e3;
423
+ const MAX_YEARS = 4;
424
+ const ALIASES = {
425
+ "@yearly": "0 0 1 1 *",
426
+ "@monthly": "0 0 1 * *",
427
+ "@weekly": "0 0 * * 0",
428
+ "@daily": "0 0 * * *",
429
+ "@hourly": "0 * * * *",
430
+ "@minutely": "* * * * *"
431
+ };
432
+ const CronSecondRange = {
433
+ min: 0,
434
+ max: 59
435
+ };
436
+ const CronMinuteRange = {
437
+ min: 0,
438
+ max: 59
439
+ };
440
+ const CronHourRange = {
441
+ min: 0,
442
+ max: 23
443
+ };
444
+ const CronDayRange = {
445
+ min: 1,
446
+ max: 31
447
+ };
448
+ const CronMonthRange = {
449
+ min: 1,
450
+ max: 12
451
+ };
452
+ const CronDayOfWeekRange = {
453
+ min: 0,
454
+ max: 6
455
+ };
456
+ var Cron = class {
457
+ options;
458
+ status = "idle";
459
+ timeoutId = null;
460
+ second = Array(CronSecondRange.max + 1).fill(0);
461
+ minute = Array(CronMinuteRange.max + 1).fill(0);
462
+ hour = Array(CronHourRange.max + 1).fill(0);
463
+ day = Array(CronDayRange.max + 1).fill(0);
464
+ month = Array(CronMonthRange.max + 1).fill(0);
465
+ dayOfWeek = Array(CronDayOfWeekRange.max + 1).fill(0);
466
+ hasSeconds;
467
+ _dayWildcard = false;
468
+ _dowWildcard = false;
469
+ fillRange(values, min, max) {
470
+ for (let i = min; i <= max; i++) values[i] = 1;
471
+ }
472
+ handleStep(part, values, min, max) {
473
+ const [rangePart, stepStr] = part.split("/");
474
+ if (!rangePart) return err("InvalidValueError", `'${rangePart}' is empty`);
475
+ if (!stepStr) return err("InvalidValueError", `'${stepStr}' is empty`);
476
+ const step = Number(stepStr);
477
+ if (!Number.isInteger(step)) return err("InvalidValueError", `'${step}' is not a valid number`);
478
+ if (step <= 0) return err("OutOfBoundError", `Expected ${step} > 0`);
479
+ if (rangePart === "*") {
480
+ for (let i = min; i <= max; i += step) values[i] = 1;
481
+ return ok(true);
482
+ }
483
+ if (rangePart.includes("-")) return this.handleStepRange(rangePart, step, values, min, max);
484
+ return this.handleStepSingle(rangePart, step, values, min, max);
485
+ }
486
+ handleStepRange(range, step, values, min, max) {
487
+ const [startStr, endStr] = range.split("-");
488
+ if (!endStr) return err("InvalidValueError", `'${endStr}' is empty`);
489
+ let start = min;
490
+ if (startStr && startStr.length > 0) start = Number(startStr);
491
+ const end = Number(endStr);
492
+ if (!Number.isInteger(start)) return err("InvalidValueError", `'${start}' is not a valid number`);
493
+ if (!Number.isInteger(end)) return err("InvalidValueError", `'${end}' is not a valid number`);
494
+ if (start < min) return err("OutOfBoundError", `Expected ${start} >= ${min}`);
495
+ if (end > max) return err("OutOfBoundError", `Expected ${end} <= ${max}`);
496
+ if (start > end) return err("OutOfBoundError", `Expected ${start} <= ${end}`);
497
+ for (let i = start; i <= end; i += step) values[i] = 1;
498
+ return ok(true);
499
+ }
500
+ handleStepSingle(value, step, values, min, max) {
501
+ const start = Number(value);
502
+ if (!Number.isInteger(start)) return err("InvalidValueError", `'${start}' is not a valid number`);
503
+ if (start < min) return err("OutOfBoundError", `Expected ${start} >= ${min}`);
504
+ if (start > max) return err("OutOfBoundError", `Expected ${start} <= ${max}`);
505
+ for (let i = start; i <= max; i += step) values[i] = 1;
506
+ return ok(true);
507
+ }
508
+ handleRange(part, values, min, max) {
509
+ const [startStr, endStr] = part.split("-");
510
+ if (!startStr) return err("InvalidValueError", `'${startStr}' is empty`);
511
+ if (!endStr) return err("InvalidValueError", `'${endStr}' is empty`);
512
+ const start = Number(startStr);
513
+ const end = Number(endStr);
514
+ if (!Number.isInteger(start)) return err("InvalidValueError", `'${start}' is not a valid number`);
515
+ if (!Number.isInteger(end)) return err("InvalidValueError", `'${end}' is not a valid number`);
516
+ if (start < min) return err("OutOfBoundError", `Expected ${start} >= ${min}`);
517
+ if (end > max) return err("OutOfBoundError", `Expected ${end} <= ${max}`);
518
+ if (start > end) return err("OutOfBoundError", `Expected ${start} <= ${end}`);
519
+ for (let i = start; i <= end; i++) values[i] = 1;
520
+ return ok(true);
521
+ }
522
+ handleNumber(value, values, min, max) {
523
+ const n = Number(value);
524
+ if (!Number.isInteger(n)) return err("InvalidValueError", `'${value}' is not a valid number`);
525
+ if (n < min) return err("OutOfBoundError", `Expected ${n} >= ${min}`);
526
+ if (n > max) return err("OutOfBoundError", `Expected ${n} <= ${max}`);
527
+ values[n] = 1;
528
+ return ok(true);
529
+ }
530
+ constructor(options) {
531
+ this.options = options;
532
+ const expr = this.resolveAlias(options.schedule);
533
+ const [error, tokens] = new Scanner(expr).scan();
534
+ if (error) throw new Error(`${error.type}: ${error.message}`);
535
+ this.hasSeconds = expr.trim().split(/\s+/).length === FieldAmount.max;
536
+ const [parsingError, _] = this.parse(tokens);
537
+ if (parsingError) throw new Error(`${parsingError.type}: ${parsingError.message}`);
538
+ }
539
+ resolveAlias(schedule) {
540
+ return ALIASES[schedule] || schedule;
541
+ }
542
+ parse(tokens) {
543
+ for (let i = 0; i < tokens.length; i++) {
544
+ const token = tokens[i];
545
+ if (!token) return err("InvalidValueError", "Undefined token");
546
+ const tokenType = token.getTokenType();
547
+ switch (token.getField()) {
548
+ case "second": {
549
+ const [error, _] = this.handleField(token, this.second, CronSecondRange.min, CronSecondRange.max);
550
+ if (error) return err(error.type, `${error.message} in field '${token.getField()}'`);
551
+ break;
552
+ }
553
+ case "minute": {
554
+ const [error, _] = this.handleField(token, this.minute, CronMinuteRange.min, CronMinuteRange.max);
555
+ if (error) return err(error.type, `${error.message} in field '${token.getField()}'`);
556
+ break;
557
+ }
558
+ case "hour": {
559
+ const [error, _] = this.handleField(token, this.hour, CronHourRange.min, CronHourRange.max);
560
+ if (error) return err(error.type, `${error.message} in field '${token.getField()}'`);
561
+ break;
562
+ }
563
+ case "day": {
564
+ if (tokenType === "any") this._dayWildcard = true;
565
+ const [error, _] = this.handleField(token, this.day, CronDayRange.min, CronDayRange.max);
566
+ if (error) return err(error.type, `${error.message} in field '${token.getField()}'`);
567
+ break;
568
+ }
569
+ case "month": {
570
+ const [error, _] = this.handleField(token, this.month, CronMonthRange.min, CronMonthRange.max);
571
+ if (error) return err(error.type, `${error.message} in field '${token.getField()}'`);
572
+ break;
573
+ }
574
+ case "weekday": {
575
+ if (tokenType === "any") this._dowWildcard = true;
576
+ const [error, _] = this.handleField(token, this.dayOfWeek, CronDayOfWeekRange.min, CronDayOfWeekRange.max);
577
+ if (error) return err(error.type, `${error.message} in field '${token.getField()}'`);
578
+ break;
579
+ }
580
+ default: return err("InvalidValueError", `Invalid field '${token.getField()}'`);
581
+ }
582
+ }
583
+ return ok(true);
584
+ }
585
+ handleField(token, field, min, max) {
586
+ switch (token.getTokenType()) {
587
+ case "any":
588
+ this.fillRange(field, min, max);
589
+ break;
590
+ case "number": {
591
+ const [error, _] = this.handleNumber(token.getComponent(), field, min, max);
592
+ if (error) return err(error.type, error.message);
593
+ break;
594
+ }
595
+ case "range": {
596
+ const component = token.getComponent();
597
+ const [error, _] = this.handleRange(component, field, min, max);
598
+ if (error) return err(error.type, error.message);
599
+ break;
600
+ }
601
+ case "step": {
602
+ const component = token.getComponent();
603
+ const [error, _] = this.handleStep(component, field, min, max);
604
+ if (error) return err(error.type, error.message);
605
+ break;
606
+ }
607
+ default: return err("InvalidValueError", `Invalid token type '${token.getTokenType()}'`);
608
+ }
609
+ return ok(true);
610
+ }
611
+ matches(date) {
612
+ const s = date.getSeconds();
613
+ const m = date.getMinutes();
614
+ const h = date.getHours();
615
+ const d = date.getDate();
616
+ const mon = date.getMonth();
617
+ const dow = date.getDay();
618
+ const isSecondMatch = this.hasSeconds ? this.second[s] === 1 : true;
619
+ const isMinuteMatch = this.minute[m] === 1;
620
+ const isHourMatch = this.hour[h] === 1;
621
+ const isMonthMatch = this.month[mon + 1] === 1;
622
+ let isDayOrDowMatch;
623
+ if (!this._dayWildcard && !this._dowWildcard) isDayOrDowMatch = this.day[d] === 1 || this.dayOfWeek[dow] === 1;
624
+ else isDayOrDowMatch = this.day[d] === 1 && this.dayOfWeek[dow] === 1;
625
+ return isSecondMatch && isMinuteMatch && isHourMatch && isDayOrDowMatch && isMonthMatch;
626
+ }
627
+ getNextRun() {
628
+ const date = /* @__PURE__ */ new Date();
629
+ if (this.hasSeconds) {
630
+ date.setMilliseconds(0);
631
+ date.setSeconds(date.getSeconds() + 1);
632
+ } else {
633
+ date.setSeconds(0, 0);
634
+ date.setMinutes(date.getMinutes() + 1);
635
+ }
636
+ const deadline = new Date(date);
637
+ deadline.setFullYear(deadline.getFullYear() + MAX_YEARS);
638
+ while (date < deadline) {
639
+ const s = date.getSeconds();
640
+ const m = date.getMinutes();
641
+ const h = date.getHours();
642
+ const d = date.getDate();
643
+ const mon = date.getMonth();
644
+ const dow = date.getDay();
645
+ if (this.month[mon + 1] === 0) {
646
+ date.setDate(1);
647
+ date.setMonth(mon + 1);
648
+ date.setHours(0, 0, 0, 0);
649
+ continue;
650
+ }
651
+ let isDayOrDowMatch;
652
+ if (!this._dayWildcard && !this._dowWildcard) isDayOrDowMatch = this.day[d] === 0 && this.dayOfWeek[dow] === 0;
653
+ else isDayOrDowMatch = this.day[d] === 0 || this.dayOfWeek[dow] === 0;
654
+ if (isDayOrDowMatch) {
655
+ date.setDate(d + 1);
656
+ date.setHours(0, 0, 0, 0);
657
+ continue;
658
+ }
659
+ if (this.hour[h] === 0) {
660
+ date.setHours(h + 1);
661
+ date.setMinutes(0, 0, 0);
662
+ continue;
663
+ }
664
+ if (this.minute[m] === 0) {
665
+ date.setMinutes(m + 1);
666
+ date.setSeconds(0, 0);
667
+ continue;
668
+ }
669
+ if (this.hasSeconds && this.second[s] === 0) {
670
+ date.setSeconds(s + 1);
671
+ date.setMilliseconds(0);
672
+ continue;
673
+ }
674
+ return new Date(date);
675
+ }
676
+ return null;
677
+ }
678
+ start() {
679
+ if (this.status !== "idle") return;
680
+ this.status = "running";
681
+ this.next();
682
+ }
683
+ stop() {
684
+ this.status = "idle";
685
+ if (this.timeoutId) {
686
+ clearTimeout(this.timeoutId);
687
+ this.timeoutId = null;
688
+ }
689
+ }
690
+ pause() {
691
+ if (this.status !== "running") return;
692
+ this.status = "paused";
693
+ if (this.timeoutId) {
694
+ clearTimeout(this.timeoutId);
695
+ this.timeoutId = null;
696
+ }
697
+ }
698
+ resume() {
699
+ if (this.status !== "paused") return;
700
+ this.status = "running";
701
+ this.next();
702
+ }
703
+ getStatus() {
704
+ return this.status;
705
+ }
706
+ next() {
707
+ if (this.status !== "running") return;
708
+ const nextRun = this.getNextRun();
709
+ if (!nextRun) {
710
+ this.timeoutId = setTimeout(() => this.next(), RETRY_DELAY_MS);
711
+ return;
712
+ }
713
+ const delay = nextRun.getTime() - Date.now();
714
+ this.timeoutId = setTimeout(() => {
715
+ this.run();
716
+ }, Math.max(0, delay));
717
+ }
718
+ async run() {
719
+ if (this.status !== "running") return;
720
+ const handlerResult = this.options.handler();
721
+ await mightThrow(Promise.resolve(handlerResult));
722
+ if (this.status === "running") this.next();
723
+ }
724
+ };
725
+ //#endregion
4
726
  export { Cron, Month, WeekDay, any, cronJobBuilder, list, number, range, step };