@geekmidas/constructs 10.0.0-alpha.0 → 10.0.0-alpha.10

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 (218) hide show
  1. package/README.md +1 -0
  2. package/dist/{Construct-HmWM6YYu.mjs → Construct-BD5neF7w.mjs} +15 -2
  3. package/dist/Construct-BD5neF7w.mjs.map +1 -0
  4. package/dist/{Construct-WhCXIOPV.d.cts → Construct-C0ijr2qp.d.cts} +14 -1
  5. package/dist/Construct-C0ijr2qp.d.cts.map +1 -0
  6. package/dist/{Construct-B-xc0SE9.d.mts → Construct-Ct8nalEi.d.mts} +14 -1
  7. package/dist/Construct-Ct8nalEi.d.mts.map +1 -0
  8. package/dist/{Construct-roId57cU.cjs → Construct-CyS3RpTL.cjs} +14 -1
  9. package/dist/Construct-CyS3RpTL.cjs.map +1 -0
  10. package/dist/Cron-DmQ8vQ4b.d.cts +39 -0
  11. package/dist/Cron-DmQ8vQ4b.d.cts.map +1 -0
  12. package/dist/Cron-dh4rUgib.d.mts +39 -0
  13. package/dist/Cron-dh4rUgib.d.mts.map +1 -0
  14. package/dist/CronBuilder-BquXDbDI.d.cts +44 -0
  15. package/dist/CronBuilder-BquXDbDI.d.cts.map +1 -0
  16. package/dist/CronBuilder-CGgY2080.d.mts +44 -0
  17. package/dist/CronBuilder-CGgY2080.d.mts.map +1 -0
  18. package/dist/CronBuilder-CYKT5RiO.mjs +93 -0
  19. package/dist/CronBuilder-CYKT5RiO.mjs.map +1 -0
  20. package/dist/CronBuilder-Da0C0edR.cjs +105 -0
  21. package/dist/CronBuilder-Da0C0edR.cjs.map +1 -0
  22. package/dist/{Endpoint-ROcXU-eH.d.mts → Endpoint-BjWKinFA.d.mts} +2 -2
  23. package/dist/{Endpoint-ROcXU-eH.d.mts.map → Endpoint-BjWKinFA.d.mts.map} +1 -1
  24. package/dist/{Endpoint-BGwpNEX4.mjs → Endpoint-DCQPMdUX.mjs} +3 -3
  25. package/dist/{Endpoint-BGwpNEX4.mjs.map → Endpoint-DCQPMdUX.mjs.map} +1 -1
  26. package/dist/{Endpoint-BBkV6l0k.cjs → Endpoint-DcWXE-SZ.cjs} +3 -3
  27. package/dist/{Endpoint-BBkV6l0k.cjs.map → Endpoint-DcWXE-SZ.cjs.map} +1 -1
  28. package/dist/{Endpoint-BnxZqIX-.d.cts → Endpoint-dav89W6-.d.cts} +2 -2
  29. package/dist/{Endpoint-BnxZqIX-.d.cts.map → Endpoint-dav89W6-.d.cts.map} +1 -1
  30. package/dist/{EndpointFactory-DYoGLaIT.cjs → EndpointFactory-CdWB7wPw.cjs} +7 -5
  31. package/dist/EndpointFactory-CdWB7wPw.cjs.map +1 -0
  32. package/dist/{EndpointFactory-Di0X9AWp.mjs → EndpointFactory-CjV8F_lJ.mjs} +7 -5
  33. package/dist/EndpointFactory-CjV8F_lJ.mjs.map +1 -0
  34. package/dist/{HonoEndpointAdaptor-wMsCyMgt.cjs → HonoEndpointAdaptor-DtL9j19R.cjs} +5 -6
  35. package/dist/{HonoEndpointAdaptor-wMsCyMgt.cjs.map → HonoEndpointAdaptor-DtL9j19R.cjs.map} +1 -1
  36. package/dist/{HonoEndpointAdaptor-DFKIIG2o.mjs → HonoEndpointAdaptor-P1ahhZHu.mjs} +4 -5
  37. package/dist/{HonoEndpointAdaptor-DFKIIG2o.mjs.map → HonoEndpointAdaptor-P1ahhZHu.mjs.map} +1 -1
  38. package/dist/{Queue-D6WeziRD.d.cts → Queue-D7ZuwBhy.d.cts} +2 -2
  39. package/dist/{Queue-D6WeziRD.d.cts.map → Queue-D7ZuwBhy.d.cts.map} +1 -1
  40. package/dist/{Queue-DpUeqdC8.d.mts → Queue-gVGfi2Yk.d.mts} +2 -2
  41. package/dist/{Queue-DpUeqdC8.d.mts.map → Queue-gVGfi2Yk.d.mts.map} +1 -1
  42. package/dist/{Subscriber-4rBJgDKI.d.mts → Subscriber-2mEi0ImH.d.cts} +3 -3
  43. package/dist/{Subscriber-4rBJgDKI.d.mts.map → Subscriber-2mEi0ImH.d.cts.map} +1 -1
  44. package/dist/{Subscriber-DVQowdyj.d.cts → Subscriber-xTJ9ayPN.d.mts} +3 -3
  45. package/dist/{Subscriber-DVQowdyj.d.cts.map → Subscriber-xTJ9ayPN.d.mts.map} +1 -1
  46. package/dist/SubscriberBuilder-4OPehf2R.cjs +120 -0
  47. package/dist/SubscriberBuilder-4OPehf2R.cjs.map +1 -0
  48. package/dist/SubscriberBuilder-BjkbeT9l.mjs +108 -0
  49. package/dist/SubscriberBuilder-BjkbeT9l.mjs.map +1 -0
  50. package/dist/SubscriberBuilder-Dptmo-1A.d.mts +62 -0
  51. package/dist/SubscriberBuilder-Dptmo-1A.d.mts.map +1 -0
  52. package/dist/SubscriberBuilder-waNhzjSM.d.cts +62 -0
  53. package/dist/SubscriberBuilder-waNhzjSM.d.cts.map +1 -0
  54. package/dist/{Topic-Ohx9dvWr.d.cts → Topic-19QeHBIR.d.cts} +2 -2
  55. package/dist/{Topic-Ohx9dvWr.d.cts.map → Topic-19QeHBIR.d.cts.map} +1 -1
  56. package/dist/{Topic-cmy2jOUy.d.mts → Topic-DuFeqkBh.d.mts} +2 -2
  57. package/dist/{Topic-cmy2jOUy.d.mts.map → Topic-DuFeqkBh.d.mts.map} +1 -1
  58. package/dist/adaptors/aws.cjs +243 -10
  59. package/dist/adaptors/aws.cjs.map +1 -1
  60. package/dist/adaptors/aws.d.cts +99 -10
  61. package/dist/adaptors/aws.d.cts.map +1 -1
  62. package/dist/adaptors/aws.d.mts +99 -10
  63. package/dist/adaptors/aws.d.mts.map +1 -1
  64. package/dist/adaptors/aws.mjs +240 -7
  65. package/dist/adaptors/aws.mjs.map +1 -1
  66. package/dist/adaptors/hono.cjs +6 -7
  67. package/dist/adaptors/hono.d.cts +6 -6
  68. package/dist/adaptors/hono.d.cts.map +1 -1
  69. package/dist/adaptors/hono.d.mts +6 -6
  70. package/dist/adaptors/hono.d.mts.map +1 -1
  71. package/dist/adaptors/hono.mjs +6 -7
  72. package/dist/adaptors/testing.cjs +9 -10
  73. package/dist/adaptors/testing.cjs.map +1 -1
  74. package/dist/adaptors/testing.d.cts +6 -6
  75. package/dist/adaptors/testing.d.mts +6 -6
  76. package/dist/adaptors/testing.mjs +6 -7
  77. package/dist/adaptors/testing.mjs.map +1 -1
  78. package/dist/auth.cjs +2 -2
  79. package/dist/auth.cjs.map +1 -1
  80. package/dist/auth.d.cts +10 -10
  81. package/dist/auth.d.cts.map +1 -1
  82. package/dist/auth.d.mts +10 -10
  83. package/dist/auth.d.mts.map +1 -1
  84. package/dist/auth.mjs +2 -2
  85. package/dist/auth.mjs.map +1 -1
  86. package/dist/{cache-CdQ7OLpR.d.cts → cache-BrRz3fEB.d.mts} +3 -3
  87. package/dist/{cache-CdQ7OLpR.d.cts.map → cache-BrRz3fEB.d.mts.map} +1 -1
  88. package/dist/{cache-DYoJFcfd.d.mts → cache-BtZY_tHe.d.cts} +3 -3
  89. package/dist/{cache-DYoJFcfd.d.mts.map → cache-BtZY_tHe.d.cts.map} +1 -1
  90. package/dist/cache.d.cts +2 -2
  91. package/dist/cache.d.mts +2 -2
  92. package/dist/{construct-interface-BqwRNYA2.d.mts → construct-interface-D9d4Gm4p.d.cts} +2 -2
  93. package/dist/{construct-interface-BqwRNYA2.d.mts.map → construct-interface-D9d4Gm4p.d.cts.map} +1 -1
  94. package/dist/{construct-interface-D2nNkHUN.d.cts → construct-interface-g5GM5pwR.d.mts} +2 -2
  95. package/dist/{construct-interface-D2nNkHUN.d.cts.map → construct-interface-g5GM5pwR.d.mts.map} +1 -1
  96. package/dist/construct-interface.d.cts +1 -1
  97. package/dist/construct-interface.d.mts +1 -1
  98. package/dist/credential.d.cts +1 -1
  99. package/dist/credential.d.mts +1 -1
  100. package/dist/crons/index.cjs +68 -86
  101. package/dist/crons/index.cjs.map +1 -1
  102. package/dist/crons/index.d.cts +36 -48
  103. package/dist/crons/index.d.cts.map +1 -1
  104. package/dist/crons/index.d.mts +36 -48
  105. package/dist/crons/index.d.mts.map +1 -1
  106. package/dist/crons/index.mjs +65 -82
  107. package/dist/crons/index.mjs.map +1 -1
  108. package/dist/database/kysely.d.cts +2 -2
  109. package/dist/database/kysely.d.mts +2 -2
  110. package/dist/email.d.cts +1 -1
  111. package/dist/email.d.mts +1 -1
  112. package/dist/endpoints/index.cjs +6 -7
  113. package/dist/endpoints/index.d.cts +5 -5
  114. package/dist/endpoints/index.d.mts +5 -5
  115. package/dist/endpoints/index.mjs +5 -6
  116. package/dist/file-server.d.cts +1 -1
  117. package/dist/file-server.d.mts +1 -1
  118. package/dist/functions/index.cjs +3 -4
  119. package/dist/functions/index.d.cts +4 -4
  120. package/dist/functions/index.d.mts +4 -4
  121. package/dist/functions/index.mjs +3 -3
  122. package/dist/{functions-CvT_q7Y4.mjs → functions-14lpEFL4.mjs} +22 -9
  123. package/dist/functions-14lpEFL4.mjs.map +1 -0
  124. package/dist/{functions-DukjG8ov.cjs → functions-i_la-N5r.cjs} +21 -14
  125. package/dist/functions-i_la-N5r.cjs.map +1 -0
  126. package/dist/{index-7OcOWe75.d.cts → index-Bd5FqCoe.d.cts} +5 -5
  127. package/dist/{index-7OcOWe75.d.cts.map → index-Bd5FqCoe.d.cts.map} +1 -1
  128. package/dist/index-BknhM6Ux.d.mts +31 -0
  129. package/dist/index-BknhM6Ux.d.mts.map +1 -0
  130. package/dist/index-CBSfrowv.d.cts +31 -0
  131. package/dist/index-CBSfrowv.d.cts.map +1 -0
  132. package/dist/{index-Dadljnh_.d.cts → index-D24Xm79M.d.cts} +19 -11
  133. package/dist/index-D24Xm79M.d.cts.map +1 -0
  134. package/dist/{index-CPeqtKgq.d.mts → index-_ajboYxK.d.mts} +26 -17
  135. package/dist/index-_ajboYxK.d.mts.map +1 -0
  136. package/dist/{index-Bt-F7u8L.d.mts → index-lAO9egTb.d.mts} +5 -5
  137. package/dist/{index-Bt-F7u8L.d.mts.map → index-lAO9egTb.d.mts.map} +1 -1
  138. package/dist/index.cjs +1 -1
  139. package/dist/index.d.cts +1 -1
  140. package/dist/index.d.mts +1 -1
  141. package/dist/index.mjs +1 -1
  142. package/dist/{lazyAccessors-DM6HcXQk.mjs → lazyAccessors-BoJN3SMd.mjs} +41 -2
  143. package/dist/lazyAccessors-BoJN3SMd.mjs.map +1 -0
  144. package/dist/{lazyAccessors-DrJj8NpA.cjs → lazyAccessors-e3j2oE2m.cjs} +52 -1
  145. package/dist/lazyAccessors-e3j2oE2m.cjs.map +1 -0
  146. package/dist/object-storage.d.cts +1 -1
  147. package/dist/object-storage.d.mts +1 -1
  148. package/dist/{processAudits-Bc8rz6Ev.cjs → processAudits-CGqttuXm.cjs} +1 -1
  149. package/dist/{processAudits-Bc8rz6Ev.cjs.map → processAudits-CGqttuXm.cjs.map} +1 -1
  150. package/dist/{processAudits-D89tICM4.mjs → processAudits-Dmts9H_b.mjs} +1 -1
  151. package/dist/{processAudits-D89tICM4.mjs.map → processAudits-Dmts9H_b.mjs.map} +1 -1
  152. package/dist/queue/index.cjs +1 -1
  153. package/dist/queue/index.d.cts +5 -5
  154. package/dist/queue/index.d.mts +5 -5
  155. package/dist/queue/index.mjs +1 -1
  156. package/dist/rest-api.cjs +6 -8
  157. package/dist/rest-api.cjs.map +1 -1
  158. package/dist/rest-api.d.cts +16 -24
  159. package/dist/rest-api.d.cts.map +1 -1
  160. package/dist/rest-api.d.mts +16 -24
  161. package/dist/rest-api.d.mts.map +1 -1
  162. package/dist/rest-api.mjs +6 -8
  163. package/dist/rest-api.mjs.map +1 -1
  164. package/dist/site.cjs +2 -2
  165. package/dist/site.cjs.map +1 -1
  166. package/dist/site.d.cts +9 -16
  167. package/dist/site.d.cts.map +1 -1
  168. package/dist/site.d.mts +9 -16
  169. package/dist/site.d.mts.map +1 -1
  170. package/dist/site.mjs +2 -2
  171. package/dist/site.mjs.map +1 -1
  172. package/dist/subscribers/index.cjs +6 -108
  173. package/dist/subscribers/index.d.cts +6 -63
  174. package/dist/subscribers/index.d.mts +6 -63
  175. package/dist/subscribers/index.mjs +5 -105
  176. package/dist/topic/index.cjs +1 -1
  177. package/dist/topic/index.d.cts +4 -32
  178. package/dist/topic/index.d.mts +4 -32
  179. package/dist/topic/index.mjs +1 -1
  180. package/dist/worker.cjs +166 -0
  181. package/dist/worker.cjs.map +1 -0
  182. package/dist/worker.d.cts +146 -0
  183. package/dist/worker.d.cts.map +1 -0
  184. package/dist/worker.d.mts +145 -0
  185. package/dist/worker.d.mts.map +1 -0
  186. package/dist/worker.mjs +165 -0
  187. package/dist/worker.mjs.map +1 -0
  188. package/package.json +58 -66
  189. package/dist/AWSScheduledFunction-BvFvBsBN.d.cts +0 -122
  190. package/dist/AWSScheduledFunction-BvFvBsBN.d.cts.map +0 -1
  191. package/dist/AWSScheduledFunction-CVccZO-L.d.mts +0 -122
  192. package/dist/AWSScheduledFunction-CVccZO-L.d.mts.map +0 -1
  193. package/dist/AWSScheduledFunction-Db1lttJH.mjs +0 -243
  194. package/dist/AWSScheduledFunction-Db1lttJH.mjs.map +0 -1
  195. package/dist/AWSScheduledFunction-qu4ieRZR.cjs +0 -255
  196. package/dist/AWSScheduledFunction-qu4ieRZR.cjs.map +0 -1
  197. package/dist/Construct-B-xc0SE9.d.mts.map +0 -1
  198. package/dist/Construct-HmWM6YYu.mjs.map +0 -1
  199. package/dist/Construct-WhCXIOPV.d.cts.map +0 -1
  200. package/dist/Construct-roId57cU.cjs.map +0 -1
  201. package/dist/EndpointFactory-DYoGLaIT.cjs.map +0 -1
  202. package/dist/EndpointFactory-Di0X9AWp.mjs.map +0 -1
  203. package/dist/functions-CvT_q7Y4.mjs.map +0 -1
  204. package/dist/functions-DukjG8ov.cjs.map +0 -1
  205. package/dist/index-CPeqtKgq.d.mts.map +0 -1
  206. package/dist/index-Dadljnh_.d.cts.map +0 -1
  207. package/dist/lazyAccessors-DM6HcXQk.mjs.map +0 -1
  208. package/dist/lazyAccessors-DrJj8NpA.cjs.map +0 -1
  209. package/dist/publisher-CGEo8UKD.mjs +0 -41
  210. package/dist/publisher-CGEo8UKD.mjs.map +0 -1
  211. package/dist/publisher-CqGsXB2X.cjs +0 -53
  212. package/dist/publisher-CqGsXB2X.cjs.map +0 -1
  213. package/dist/subscribers/index.cjs.map +0 -1
  214. package/dist/subscribers/index.d.cts.map +0 -1
  215. package/dist/subscribers/index.d.mts.map +0 -1
  216. package/dist/subscribers/index.mjs.map +0 -1
  217. package/dist/topic/index.d.cts.map +0 -1
  218. package/dist/topic/index.d.mts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["Function","obj: any","ConstructType","fn: FunctionHandler<TInput, TServices, TLogger, OutSchema, TDatabase>","timeout?: number","_schedule?: ScheduleExpression","input?: TInput","outputSchema?: OutSchema","services: TServices","logger?: TLogger","publisherService?: Service<TEventPublisherServiceName, TEventPublisher>","events: any[]","memorySize?: number","databaseService?: Service<TDatabaseServiceName, TDatabase>","constructs: string[]","FunctionBuilder","ConstructType","memorySize: number","_expression: ScheduleExpression","schema: T","constructs: T","s: Service","services: T","logger: T","publisher: Service<TName, T>","source: Consumable<TName, T> | Service<TName, T>","fn: FunctionHandler<TInput, TServices, TLogger, OutSchema, TDatabase>"],"sources":["../../src/crons/Cron.ts","../../src/crons/CronBuilder.ts","../../src/crons/index.ts"],"sourcesContent":["import type { AuditableAction } from '@geekmidas/audit';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport type { ComposableStandardSchema } from '@geekmidas/schema';\nimport type { Service } from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\n\nimport { ConstructType } from '../Construct';\nimport { Function, type FunctionHandler } from '../functions';\n\nexport class Cron<\n\tTInput extends ComposableStandardSchema | undefined = undefined,\n\tTServices extends Service[] = [],\n\tTLogger extends Logger = Logger,\n\tOutSchema extends StandardSchemaV1 | undefined = undefined,\n\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\tTEventPublisherServiceName extends string = string,\n\tTDatabase = undefined,\n\tTDatabaseServiceName extends string = string,\n> extends Function<\n\tTInput,\n\tTServices,\n\tTLogger,\n\tOutSchema,\n\tTEventPublisher,\n\tTEventPublisherServiceName,\n\tundefined,\n\tstring,\n\tTDatabase,\n\tTDatabaseServiceName,\n\tAuditableAction<string, unknown>,\n\tFunctionHandler<TInput, TServices, TLogger, OutSchema, TDatabase>\n> {\n\tstatic isCron(obj: any): obj is Cron<any, any, any, any> {\n\t\treturn Boolean(\n\t\t\tobj &&\n\t\t\t\t(obj as Function).__IS_FUNCTION__ === true &&\n\t\t\t\tobj.type === ConstructType.Cron,\n\t\t);\n\t}\n\n\tconstructor(\n\t\tfn: FunctionHandler<TInput, TServices, TLogger, OutSchema, TDatabase>,\n\t\ttimeout?: number,\n\t\tprotected _schedule?: ScheduleExpression,\n\t\tinput?: TInput,\n\t\toutputSchema?: OutSchema,\n\t\tservices: TServices = [] as unknown as TServices,\n\t\tlogger?: TLogger,\n\t\tpublisherService?: Service<TEventPublisherServiceName, TEventPublisher>,\n\t\tevents: any[] = [],\n\t\tmemorySize?: number,\n\t\tdatabaseService?: Service<TDatabaseServiceName, TDatabase>,\n\t\t/**\n\t\t * The construct ids `.dependsOn()` named — last, so no existing positional\n\t\t * argument moves.\n\t\t */\n\t\tconstructs: string[] = [],\n\t) {\n\t\tsuper(\n\t\t\tfn,\n\t\t\ttimeout,\n\t\t\tConstructType.Cron,\n\t\t\tinput,\n\t\t\toutputSchema,\n\t\t\tservices,\n\t\t\tlogger,\n\t\t\tpublisherService,\n\t\t\tevents,\n\t\t\tmemorySize,\n\t\t\tundefined, // auditorStorageService\n\t\t\tdatabaseService,\n\t\t\tconstructs,\n\t\t);\n\t}\n\n\tget schedule(): ScheduleExpression | undefined {\n\t\treturn this._schedule;\n\t}\n}\n\nexport type RateExpression = `rate(${string})`;\n\ntype CronMinute =\n\t| '*'\n\t| number\n\t| `${number}`\n\t| `${number}-${number}`\n\t| `${number}/${number}`\n\t| `*/${number}`\n\t| `${number},${number}`\n\t| string; // Allow more complex patterns\n\ntype CronHour =\n\t| '*'\n\t| number\n\t| `${number}`\n\t| `${number}-${number}`\n\t| `${number}/${number}`\n\t| `*/${number}`\n\t| `${number},${number}`\n\t| string; // Allow more complex patterns\n\ntype CronDay =\n\t| '*'\n\t| number\n\t| `${number}`\n\t| `${number}-${number}`\n\t| `${number}/${number}`\n\t| `*/${number}`\n\t| `${number},${number}`\n\t| string; // Allow more complex patterns\n\ntype CronMonth =\n\t| '*'\n\t| number\n\t| `${number}`\n\t| `${number}-${number}`\n\t| `${number}/${number}`\n\t| `*/${number}`\n\t| 'JAN'\n\t| 'FEB'\n\t| 'MAR'\n\t| 'APR'\n\t| 'MAY'\n\t| 'JUN'\n\t| 'JUL'\n\t| 'AUG'\n\t| 'SEP'\n\t| 'OCT'\n\t| 'NOV'\n\t| 'DEC'\n\t| string; // Allow more complex patterns\n\ntype CronWeekday =\n\t| '*'\n\t| number\n\t| `${number}`\n\t| `${number}-${number}`\n\t| `${number}/${number}`\n\t| `*/${number}`\n\t| 'SUN'\n\t| 'MON'\n\t| 'TUE'\n\t| 'WED'\n\t| 'THU'\n\t| 'FRI'\n\t| 'SAT'\n\t| `${string}-${string}` // Allow patterns like MON-FRI\n\t| string; // Allow more complex patterns\n\nexport type CronExpression =\n\t`cron(${CronMinute} ${CronHour} ${CronDay} ${CronMonth} ${CronWeekday})`;\n\nexport type ScheduleExpression = RateExpression | CronExpression;\n","import type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport type { ComposableStandardSchema } from '@geekmidas/schema';\nimport type { Service } from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport uniqBy from 'lodash.uniqby';\nimport { ConstructType } from '../Construct';\nimport { cloneWith } from '../clone';\nimport {\n\ttype Consumable,\n\tidsOf,\n\ttype ServicesOf,\n\tserviceOf,\n\tservicesOf,\n} from '../construct-interface';\nimport { FunctionBuilder, type FunctionHandler } from '../functions';\nimport { Cron, type ScheduleExpression } from './Cron';\n\nexport class CronBuilder<\n\tTInput extends ComposableStandardSchema,\n\tTServices extends Service[],\n\tTLogger extends Logger = Logger,\n\tOutSchema extends StandardSchemaV1 | undefined = undefined,\n\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\tTEventPublisherServiceName extends string = string,\n\tTDatabase = undefined,\n\tTDatabaseServiceName extends string = string,\n> extends FunctionBuilder<\n\tTInput,\n\tOutSchema,\n\tTServices,\n\tTLogger,\n\tTEventPublisher,\n\tTEventPublisherServiceName,\n\tundefined,\n\tstring,\n\tTDatabase,\n\tTDatabaseServiceName\n> {\n\tprivate _schedule?: ScheduleExpression;\n\n\tconstructor() {\n\t\tsuper(ConstructType.Cron);\n\t}\n\n\toverride memorySize(memorySize: number): this {\n\t\treturn cloneWith(this, { _memorySize: memorySize });\n\t}\n\n\tschedule(\n\t\t_expression: ScheduleExpression,\n\t): CronBuilder<\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tOutSchema,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTDatabase,\n\t\tTDatabaseServiceName\n\t> {\n\t\treturn cloneWith(this, { _schedule: _expression });\n\t}\n\n\toverride input<T extends ComposableStandardSchema>(\n\t\tschema: T,\n\t): CronBuilder<\n\t\tT,\n\t\tTServices,\n\t\tTLogger,\n\t\tOutSchema,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTDatabase,\n\t\tTDatabaseServiceName\n\t> {\n\t\treturn cloneWith(this, {\n\t\t\tinputSchema: schema as unknown as TInput,\n\t\t}) as unknown as CronBuilder<\n\t\t\tT,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tOutSchema,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>;\n\t}\n\n\toverride output<T extends StandardSchemaV1>(\n\t\tschema: T,\n\t): CronBuilder<\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tT,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTDatabase,\n\t\tTDatabaseServiceName\n\t> {\n\t\treturn cloneWith(this, {\n\t\t\toutputSchema: schema as unknown as OutSchema,\n\t\t}) as unknown as CronBuilder<\n\t\t\tTInput,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tT,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>;\n\t}\n\n\t/**\n\t * Depend on constructs — a database, a bucket, a mail sender, a queue, a\n\t * topic.\n\t *\n\t * It records the edge and dissolves each construct's client into the\n\t * handler's service record under the construct's own id, so\n\t * `.dependsOn([uploads])` is what makes `services.uploads` exist and type.\n\t *\n\t * Constructs only. A `Service` does not match the shape, which is what keeps\n\t * env sniffing confined to `.services()` and the explicit lift.\n\t */\n\toverride dependsOn<const T extends readonly Consumable[]>(\n\t\tconstructs: T,\n\t): CronBuilder<\n\t\tTInput,\n\t\t[...TServices, ...ServicesOf<T>],\n\t\tTLogger,\n\t\tOutSchema,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTDatabase,\n\t\tTDatabaseServiceName\n\t> {\n\t\t// Both halves of the edge, from one call and one clone: the services the\n\t\t// handler runs with, and the ids the manifest records. Recording them\n\t\t// separately is what let them drift apart.\n\t\t//\n\t\t// `servicesOf` is the half that validates, so it runs first — recording\n\t\t// ids ahead of it left a caught `NotAConstruct` with `undefined` already\n\t\t// on a `string[]`.\n\t\tconst services = servicesOf(constructs) as unknown as Service[];\n\n\t\treturn cloneWith(this, {\n\t\t\t_services: uniqBy(\n\t\t\t\t[...this._services, ...services],\n\t\t\t\t(s: Service) => s.serviceName,\n\t\t\t),\n\t\t\t_constructs: idsOf(constructs, this._constructs),\n\t\t}) as unknown as CronBuilder<\n\t\t\tTInput,\n\t\t\t[...TServices, ...ServicesOf<T>],\n\t\t\tTLogger,\n\t\t\tOutSchema,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>;\n\t}\n\n\toverride services<T extends Service[]>(\n\t\tservices: T,\n\t): CronBuilder<\n\t\tTInput,\n\t\t[...TServices, ...T],\n\t\tTLogger,\n\t\tOutSchema,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTDatabase,\n\t\tTDatabaseServiceName\n\t> {\n\t\treturn cloneWith(this, {\n\t\t\t_services: uniqBy(\n\t\t\t\t[...this._services, ...services],\n\t\t\t\t(s) => s.serviceName,\n\t\t\t) as TServices,\n\t\t}) as unknown as CronBuilder<\n\t\t\tTInput,\n\t\t\t[...TServices, ...T],\n\t\t\tTLogger,\n\t\t\tOutSchema,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>;\n\t}\n\n\toverride logger<T extends Logger>(\n\t\tlogger: T,\n\t): CronBuilder<\n\t\tTInput,\n\t\tTServices,\n\t\tT,\n\t\tOutSchema,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTDatabase,\n\t\tTDatabaseServiceName\n\t> {\n\t\treturn cloneWith(this, {\n\t\t\t_logger: logger as unknown as TLogger,\n\t\t}) as unknown as CronBuilder<\n\t\t\tTInput,\n\t\t\tTServices,\n\t\t\tT,\n\t\t\tOutSchema,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>;\n\t}\n\n\toverride publisher<T extends EventPublisher<any>, TName extends string>(\n\t\tpublisher: Service<TName, T>,\n\t): CronBuilder<\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tOutSchema,\n\t\tT,\n\t\tTName,\n\t\tTDatabase,\n\t\tTDatabaseServiceName\n\t> {\n\t\treturn cloneWith(this, {\n\t\t\t_publisher: publisher as unknown as Service<\n\t\t\t\tTEventPublisherServiceName,\n\t\t\t\tTEventPublisher\n\t\t\t>,\n\t\t}) as unknown as CronBuilder<\n\t\t\tTInput,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tOutSchema,\n\t\t\tT,\n\t\t\tTName,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>;\n\t}\n\n\t/**\n\t * Set the database service for this cron job.\n\t * The database will be available in the handler context as `db`.\n\t */\n\toverride database<T, TName extends string>(\n\t\tsource: Consumable<TName, T> | Service<TName, T>,\n\t): CronBuilder<\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tOutSchema,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tT,\n\t\tTName\n\t> {\n\t\tconst service = serviceOf(source);\n\n\t\treturn cloneWith(this, {\n\t\t\t_databaseService: service as unknown as Service<\n\t\t\t\tTDatabaseServiceName,\n\t\t\t\tTDatabase\n\t\t\t>,\n\t\t}) as unknown as CronBuilder<\n\t\t\tTInput,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tOutSchema,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tT,\n\t\t\tTName\n\t\t>;\n\t}\n\n\toverride handle(\n\t\tfn: FunctionHandler<TInput, TServices, TLogger, OutSchema, TDatabase>,\n\t): Cron<\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tOutSchema,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTDatabase,\n\t\tTDatabaseServiceName\n\t> {\n\t\tconst cron = new Cron(\n\t\t\tfn,\n\t\t\tthis._timeout,\n\t\t\tthis._schedule,\n\t\t\tthis.inputSchema,\n\t\t\tthis.outputSchema,\n\t\t\tthis._services,\n\t\t\tthis._logger,\n\t\t\tthis._publisher,\n\t\t\tthis._events,\n\t\t\tthis._memorySize,\n\t\t\tthis._databaseService,\n\t\t\tthis._constructs,\n\t\t);\n\n\t\t// No reset. `.handle()` reads this builder and leaves it alone, so a\n\t\t// configured base — `const fn = f.logger(log).timeout(60_000)` — keeps\n\t\t// its configuration for every construct built from it. The reset that\n\t\t// used to be here wiped the base on first use, which made a base usable\n\t\t// exactly once, and quietly reverted the logger to the default.\n\n\t\treturn cron;\n\t}\n}\n","export { AWSScheduledFunction } from './AWSScheduledFunction';\nexport {\n\tCron,\n\ttype CronExpression,\n\ttype RateExpression,\n\ttype ScheduleExpression,\n} from './Cron';\nexport { CronBuilder } from './CronBuilder';\n\nimport { CronBuilder } from './CronBuilder';\n\nexport const c = new CronBuilder();\n"],"mappings":";;;;;;;;;AAUA,IAAa,OAAb,cASUA,2BAaR;CACD,OAAO,OAAOC,KAA2C;AACxD,SAAO,QACN,OACE,IAAiB,oBAAoB,QACtC,IAAI,SAASC,gCAAc,KAC5B;CACD;CAED,YACCC,IACAC,SACUC,WACVC,OACAC,cACAC,WAAsB,CAAE,GACxBC,QACAC,kBACAC,SAAgB,CAAE,GAClBC,YACAC,iBAKAC,aAAuB,CAAE,GACxB;AACD,QACC,IACA,SACAZ,gCAAc,MACd,OACA,cACA,UACA,QACA,kBACA,QACA,oBAEA,iBACA,WACA;EA7BS;CA8BV;CAED,IAAI,WAA2C;AAC9C,SAAO,KAAK;CACZ;AACD;;;;;AC7DD,IAAa,cAAb,cASUa,kCAWR;CACD,AAAQ;CAER,cAAc;AACb,QAAMC,gCAAc,KAAK;CACzB;CAED,AAAS,WAAWC,YAA0B;AAC7C,SAAO,wBAAU,MAAM,EAAE,aAAa,WAAY,EAAC;CACnD;CAED,SACCC,aAUC;AACD,SAAO,wBAAU,MAAM,EAAE,WAAW,YAAa,EAAC;CAClD;CAED,AAAS,MACRC,QAUC;AACD,SAAO,wBAAU,MAAM,EACtB,aAAa,OACb,EAAC;CAUF;CAED,AAAS,OACRA,QAUC;AACD,SAAO,wBAAU,MAAM,EACtB,cAAc,OACd,EAAC;CAUF;;;;;;;;;;;;CAaD,AAAS,UACRC,YAUC;EAQD,MAAM,WAAW,uCAAW,WAAW;AAEvC,SAAO,wBAAU,MAAM;GACtB,WAAW,2BACV,CAAC,GAAG,KAAK,WAAW,GAAG,QAAS,GAChC,CAACC,MAAe,EAAE,YAClB;GACD,aAAa,kCAAM,YAAY,KAAK,YAAY;EAChD,EAAC;CAUF;CAED,AAAS,SACRC,UAUC;AACD,SAAO,wBAAU,MAAM,EACtB,WAAW,2BACV,CAAC,GAAG,KAAK,WAAW,GAAG,QAAS,GAChC,CAAC,MAAM,EAAE,YACT,CACD,EAAC;CAUF;CAED,AAAS,OACRC,QAUC;AACD,SAAO,wBAAU,MAAM,EACtB,SAAS,OACT,EAAC;CAUF;CAED,AAAS,UACRC,WAUC;AACD,SAAO,wBAAU,MAAM,EACtB,YAAY,UAIZ,EAAC;CAUF;;;;;CAMD,AAAS,SACRC,QAUC;EACD,MAAM,UAAU,sCAAU,OAAO;AAEjC,SAAO,wBAAU,MAAM,EACtB,kBAAkB,QAIlB,EAAC;CAUF;CAED,AAAS,OACRC,IAUC;EACD,MAAM,OAAO,IAAI,KAChB,IACA,KAAK,UACL,KAAK,WACL,KAAK,aACL,KAAK,cACL,KAAK,WACL,KAAK,SACL,KAAK,YACL,KAAK,SACL,KAAK,aACL,KAAK,kBACL,KAAK;AASN,SAAO;CACP;AACD;;;;ACrTD,MAAa,IAAI,IAAI"}
1
+ {"version":3,"file":"index.cjs","names":["schedule: string","reason: string","schedule: ScheduleExpression"],"sources":["../../src/crons/schedule.ts"],"sourcesContent":["import type { ScheduleExpression } from './Cron';\n\n/**\n * A schedule a cron runner can take, as standard five-field cron.\n *\n * `ScheduleExpression` has two spellings. `cron(m h dom mon dow)` is already\n * five-field cron and unwraps; `rate(n unit)` is an interval, and an interval\n * is not a schedule — it says how often, where cron says when.\n *\n * Most intervals still have an exact cron equivalent, because they divide their\n * unit evenly: `rate(5 minutes)` is every fifth minute of every hour, and that\n * is `*​/5 * * * *` precisely. `rate(7 hours)` has none. There is no cron field\n * that means \"every seven hours\" — `*​/7` in the hour field fires at 0, 7, 14\n * and 21 and then starts over at midnight, so the gap between the last firing\n * of one day and the first of the next is three hours rather than seven.\n *\n * Those are refused rather than rounded. A job that runs at the wrong hour is\n * far harder to notice than one that refused to build, and a schedule quietly\n * adjusted by the framework is a bug nobody goes looking for.\n */\nexport class UnrepresentableSchedule extends Error {\n\tconstructor(\n\t\treadonly schedule: string,\n\t\treason: string,\n\t) {\n\t\tsuper(\n\t\t\t`\\`${schedule}\\` has no exact cron equivalent: ${reason}.\\n\\n` +\n\t\t\t\t'Cron says *when*, not *how often*, so an interval is only exact when ' +\n\t\t\t\t'it divides its unit evenly.\\n' +\n\t\t\t\t'Write the schedule you mean instead — `cron(0 */6 * * *)` for every ' +\n\t\t\t\t'sixth hour, say — or pick an interval that divides: minutes into 60, ' +\n\t\t\t\t'hours into 24.',\n\t\t);\n\t\tthis.name = 'UnrepresentableSchedule';\n\t}\n}\n\n/** Units `rate(…)` accepts, singular or plural. */\nconst UNITS = ['minute', 'hour', 'day'] as const;\ntype Unit = (typeof UNITS)[number];\n\n/**\n * Standard five-field cron for a schedule expression.\n *\n * @throws {UnrepresentableSchedule} when a `rate(…)` has no exact equivalent.\n */\nexport function toCronExpression(schedule: ScheduleExpression): string {\n\tconst cron = /^cron\\((.+)\\)$/.exec(schedule);\n\tif (cron?.[1]) return cron[1].trim();\n\n\tconst rate = /^rate\\(\\s*(\\d+)\\s+(\\w+?)s?\\s*\\)$/.exec(schedule);\n\tif (!rate) {\n\t\tthrow new UnrepresentableSchedule(\n\t\t\tschedule,\n\t\t\t'it is neither `cron(…)` nor `rate(n unit)`',\n\t\t);\n\t}\n\n\tconst every = Number(rate[1]);\n\tconst unit = rate[2] as Unit;\n\t/* c8 ignore next */ if (!unit)\n\t\tthrow new UnrepresentableSchedule(schedule, 'no unit');\n\n\tif (!UNITS.includes(unit)) {\n\t\tthrow new UnrepresentableSchedule(\n\t\t\tschedule,\n\t\t\t`\\`${unit}\\` is not one of ${UNITS.join(', ')}`,\n\t\t);\n\t}\n\n\tif (every < 1) {\n\t\tthrow new UnrepresentableSchedule(\n\t\t\tschedule,\n\t\t\t'an interval must be at least 1',\n\t\t);\n\t}\n\n\tswitch (unit) {\n\t\tcase 'minute':\n\t\t\tif (every === 1) return '* * * * *';\n\t\t\tif (60 % every !== 0) {\n\t\t\t\tthrow new UnrepresentableSchedule(\n\t\t\t\t\tschedule,\n\t\t\t\t\t`${every} does not divide 60, so the interval would reset at the top of each hour`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn `*/${every} * * * *`;\n\n\t\tcase 'hour':\n\t\t\tif (every === 1) return '0 * * * *';\n\t\t\tif (24 % every !== 0) {\n\t\t\t\tthrow new UnrepresentableSchedule(\n\t\t\t\t\tschedule,\n\t\t\t\t\t`${every} does not divide 24, so the interval would reset at midnight`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn `0 */${every} * * *`;\n\n\t\tcase 'day':\n\t\t\tif (every === 1) return '0 0 * * *';\n\t\t\t// `*/n` in day-of-month restarts on the 1st, so a 2-day interval fires\n\t\t\t// on the 1st and 3rd of a 31-day month and then again on the 1st — one\n\t\t\t// day later, not two. No month length makes that come out even.\n\t\t\tthrow new UnrepresentableSchedule(\n\t\t\t\tschedule,\n\t\t\t\t'day-of-month restarts every month, so no multi-day interval is even',\n\t\t\t);\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAoBA,IAAa,0BAAb,cAA6C,MAAM;CAClD,YACUA,UACTC,QACC;AACD,SACE,IAAI,SAAS,mCAAmC,OAAO;2JAMxD;EAVQ;AAWT,OAAK,OAAO;CACZ;AACD;;AAGD,MAAM,QAAQ;CAAC;CAAU;CAAQ;AAAM;;;;;;AAQvC,SAAgB,iBAAiBC,UAAsC;CACtE,MAAM,OAAO,iBAAiB,KAAK,SAAS;AAC5C,KAAI,OAAO,GAAI,QAAO,KAAK,GAAG,MAAM;CAEpC,MAAM,OAAO,mCAAmC,KAAK,SAAS;AAC9D,MAAK,KACJ,OAAM,IAAI,wBACT,UACA;CAIF,MAAM,QAAQ,OAAO,KAAK,GAAG;CAC7B,MAAM,OAAO,KAAK;qBACG,MAAK,KACzB,OAAM,IAAI,wBAAwB,UAAU;AAE7C,MAAK,MAAM,SAAS,KAAK,CACxB,OAAM,IAAI,wBACT,WACC,IAAI,KAAK,mBAAmB,MAAM,KAAK,KAAK,CAAC;AAIhD,KAAI,QAAQ,EACX,OAAM,IAAI,wBACT,UACA;AAIF,SAAQ,MAAR;EACC,KAAK;AACJ,OAAI,UAAU,EAAG,QAAO;AACxB,OAAI,KAAK,UAAU,EAClB,OAAM,IAAI,wBACT,WACC,EAAE,MAAM;AAGX,WAAQ,IAAI,MAAM;EAEnB,KAAK;AACJ,OAAI,UAAU,EAAG,QAAO;AACxB,OAAI,KAAK,UAAU,EAClB,OAAM,IAAI,wBACT,WACC,EAAE,MAAM;AAGX,WAAQ,MAAM,MAAM;EAErB,KAAK;AACJ,OAAI,UAAU,EAAG,QAAO;AAIxB,SAAM,IAAI,wBACT,UACA;CAEF;AACD"}
@@ -1,52 +1,40 @@
1
- import "../Construct-WhCXIOPV.cjs";
2
- import { FunctionBuilder, FunctionHandler } from "../index-Dadljnh_.cjs";
3
- import { AWSScheduledFunction, Cron, CronExpression, RateExpression, ScheduleExpression } from "../AWSScheduledFunction-BvFvBsBN.cjs";
4
- import { Consumable, ServicesOf } from "../construct-interface-D2nNkHUN.cjs";
5
- import { EventPublisher } from "@geekmidas/events";
6
- import * as _geekmidas_logger14 from "@geekmidas/logger";
7
- import { Logger } from "@geekmidas/logger";
8
- import * as _geekmidas_schema12 from "@geekmidas/schema";
9
- import { ComposableStandardSchema } from "@geekmidas/schema";
10
- import * as _geekmidas_services13 from "@geekmidas/services";
11
- import { Service } from "@geekmidas/services";
12
- import { StandardSchemaV1 } from "@standard-schema/spec";
1
+ import "../Construct-C0ijr2qp.cjs";
2
+ import "../index-D24Xm79M.cjs";
3
+ import "../construct-interface-D9d4Gm4p.cjs";
4
+ import { Cron, CronExpression, RateExpression, ScheduleExpression } from "../Cron-DmQ8vQ4b.cjs";
5
+ import { CronBuilder } from "../CronBuilder-BquXDbDI.cjs";
13
6
 
14
- //#region src/crons/CronBuilder.d.ts
15
- declare class CronBuilder<TInput extends ComposableStandardSchema, TServices extends Service[], TLogger extends Logger = Logger, OutSchema extends StandardSchemaV1 | undefined = undefined, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string> extends FunctionBuilder<TInput, OutSchema, TServices, TLogger, TEventPublisher, TEventPublisherServiceName, undefined, string, TDatabase, TDatabaseServiceName> {
16
- private _schedule?;
17
- constructor();
18
- memorySize(memorySize: number): this;
19
- schedule(_expression: ScheduleExpression): CronBuilder<TInput, TServices, TLogger, OutSchema, TEventPublisher, TEventPublisherServiceName, TDatabase, TDatabaseServiceName>;
20
- input<T extends ComposableStandardSchema>(schema: T): CronBuilder<T, TServices, TLogger, OutSchema, TEventPublisher, TEventPublisherServiceName, TDatabase, TDatabaseServiceName>;
21
- output<T extends StandardSchemaV1>(schema: T): CronBuilder<TInput, TServices, TLogger, T, TEventPublisher, TEventPublisherServiceName, TDatabase, TDatabaseServiceName>;
22
- /**
23
- * Depend on constructs — a database, a bucket, a mail sender, a queue, a
24
- * topic.
25
- *
26
- * It records the edge and dissolves each construct's client into the
27
- * handler's service record under the construct's own id, so
28
- * `.dependsOn([uploads])` is what makes `services.uploads` exist and type.
29
- *
30
- * Constructs only. A `Service` does not match the shape, which is what keeps
31
- * env sniffing confined to `.services()` and the explicit lift.
32
- */
33
- dependsOn<const T extends readonly Consumable[]>(constructs: T): CronBuilder<TInput, [...TServices, ...ServicesOf<T>], TLogger, OutSchema, TEventPublisher, TEventPublisherServiceName, TDatabase, TDatabaseServiceName>;
34
- services<T extends Service[]>(services: T): CronBuilder<TInput, [...TServices, ...T], TLogger, OutSchema, TEventPublisher, TEventPublisherServiceName, TDatabase, TDatabaseServiceName>;
35
- logger<T extends Logger>(logger: T): CronBuilder<TInput, TServices, T, OutSchema, TEventPublisher, TEventPublisherServiceName, TDatabase, TDatabaseServiceName>;
36
- publisher<T extends EventPublisher<any>, TName extends string>(publisher: Service<TName, T>): CronBuilder<TInput, TServices, TLogger, OutSchema, T, TName, TDatabase, TDatabaseServiceName>;
37
- /**
38
- * Set the database service for this cron job.
39
- * The database will be available in the handler context as `db`.
40
- */
41
- database<T, TName extends string>(source: Consumable<TName, T> | Service<TName, T>): CronBuilder<TInput, TServices, TLogger, OutSchema, TEventPublisher, TEventPublisherServiceName, T, TName>;
42
- handle(fn: FunctionHandler<TInput, TServices, TLogger, OutSchema, TDatabase>): Cron<TInput, TServices, TLogger, OutSchema, TEventPublisher, TEventPublisherServiceName, TDatabase, TDatabaseServiceName>;
43
- }
44
- //# sourceMappingURL=CronBuilder.d.ts.map
45
- //#endregion
46
- //#region src/crons/index.d.ts
47
- declare const c: CronBuilder<_geekmidas_schema12.ComposableStandardSchema, _geekmidas_services13.Service<string, unknown>[], _geekmidas_logger14.Logger, undefined, undefined, string, undefined, string>;
48
- //# sourceMappingURL=index.d.ts.map
7
+ //#region src/crons/schedule.d.ts
49
8
 
9
+ /**
10
+ * A schedule a cron runner can take, as standard five-field cron.
11
+ *
12
+ * `ScheduleExpression` has two spellings. `cron(m h dom mon dow)` is already
13
+ * five-field cron and unwraps; `rate(n unit)` is an interval, and an interval
14
+ * is not a schedule — it says how often, where cron says when.
15
+ *
16
+ * Most intervals still have an exact cron equivalent, because they divide their
17
+ * unit evenly: `rate(5 minutes)` is every fifth minute of every hour, and that
18
+ * is `*​/5 * * * *` precisely. `rate(7 hours)` has none. There is no cron field
19
+ * that means "every seven hours" — `*​/7` in the hour field fires at 0, 7, 14
20
+ * and 21 and then starts over at midnight, so the gap between the last firing
21
+ * of one day and the first of the next is three hours rather than seven.
22
+ *
23
+ * Those are refused rather than rounded. A job that runs at the wrong hour is
24
+ * far harder to notice than one that refused to build, and a schedule quietly
25
+ * adjusted by the framework is a bug nobody goes looking for.
26
+ */
27
+ declare class UnrepresentableSchedule extends Error {
28
+ readonly schedule: string;
29
+ constructor(schedule: string, reason: string);
30
+ }
31
+ /**
32
+ * Standard five-field cron for a schedule expression.
33
+ *
34
+ * @throws {UnrepresentableSchedule} when a `rate(…)` has no exact equivalent.
35
+ */
36
+ declare function toCronExpression(schedule: ScheduleExpression): string;
37
+ //# sourceMappingURL=schedule.d.ts.map
50
38
  //#endregion
51
- export { AWSScheduledFunction, Cron, CronBuilder, CronExpression, RateExpression, ScheduleExpression, c };
39
+ export { Cron, CronBuilder, CronExpression, RateExpression, ScheduleExpression, UnrepresentableSchedule, toCronExpression };
52
40
  //# sourceMappingURL=index.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/crons/CronBuilder.ts","../../src/crons/index.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;cAkBa,2BACG,4CACG,2BACF,SAAS,0BACP,kEACM,8KAIf,gBACT,QACA,WACA,WACA,SACA,iBACA,+CAGA,WACA;;;;wBAac,qBACX,YACF,QACA,WACA,SACA,WACA,iBACA,4BACA,WACA;kBAKwB,kCAChB,IACN,YACF,GACA,WACA,SACA,WACA,iBACA,4BACA,WACA;EAxDW,MAAA,CAAA,UAwEc,gBAxEH,CAAA,CAAA,MAAA,EAyEd,CAzEc,CAAA,EA0EpB,WA1EoB,CA2EtB,MA3EsB,EA4EtB,SA5EsB,EA6EtB,OA7EsB,EA8EtB,CA9EsB,EA+EtB,eA/EsB,EAgFtB,0BAhFsB,EAiFtB,SAjFsB,EAkFtB,oBAlFsB,CAAA;EAAA;;;;;;;;;;;EAahB,SACP,CAAA,gBAAA,SA+F4C,UA/F5C,EAAA,CAAA,CAAA,UAAA,EAgGa,CAhGb,CAAA,EAiGG,WAjGH,CAkGC,MAlGD,EAAA,CACA,GAkGK,SAlGL,EAGA,GA+FmB,UA/FnB,CA+F8B,CA/F9B,CAAA,CAAS,EAgGR,OA/FD,EAgGC,SAhGD,EAiGC,eAjGD,EAkGC,0BAlGD,EAmGC,SAnGD,EAoGC,oBApGD,CAAA;EAAoB,QAaN,CAAA,UAoHc,OApHd,EAAA,CAAA,CAAA,QAAA,EAqHH,CArHG,CAAA,EAsHX,WAtHW,CAuHb,MAvHa,EAAA,CAEb,GAsHI,SAtHJ,EACA,GAqHkB,CArHlB,CAAS,EAsHT,OArHA,EAsHA,SAtHA,EAuHA,eAvHA,EAwHA,0BAxHA,EAyHA,SAzHA,EA0HA,oBA1HA,CAAA;EAAO,MACP,CAAA,UA4IyB,MA5IzB,CAAA,CAAA,MAAA,EA6IQ,CA7IR,CAAA,EA8IE,WA9IF,CA+IA,MA/IA,EAgJA,SAhJA,EAiJA,CAjJA,EAkJA,SAlJA,EAmJA,eAnJA,EAoJA,0BApJA,EAqJA,SArJA,EAsJA,oBAtJA,CAAA;EAAS,SACT,CAAA,UAqK4B,cArK5B,CAAA,GAAA,CAAA,EAAA,cAAA,MAAA,CAAA,CAAA,SAAA,EAsKW,OAtKX,CAsKmB,KAtKnB,EAsK0B,CAtK1B,CAAA,CAAA,EAuKE,WAvKF,CAwKA,MAxKA,EAyKA,SAzKA,EA0KA,OA1KA,EA2KA,SA3KA,EA4KA,CA5KA,EA6KA,KA7KA,EA8KA,SA9KA,EA+KA,oBA/KA,CAAA;EAAe;;;;EALF,QAaW,CAAA,CAAA,EAAA,cAAA,MAAA,CAAA,CAAA,MAAA,EA+LhB,UA/LgB,CA+LL,KA/LK,EA+LE,CA/LF,CAAA,GA+LO,OA/LP,CA+Le,KA/Lf,EA+LsB,CA/LtB,CAAA,CAAA,EAgMtB,WAhMsB,CAiMxB,MAjMwB,EAkMxB,SAlMwB,EAmMxB,OAnMwB,EAoMxB,SApMwB,EAqMxB,eArMwB,EAsMxB,0BAtMwB,EAuMxB,CAvMwB,EAwMxB,KAxMwB,CAAA;EAAwB,MACxC,CAAA,EAAA,EA6NJ,eA7NI,CA6NY,MA7NZ,EA6NoB,SA7NpB,EA6N+B,OA7N/B,EA6NwC,SA7NxC,EA6NmD,SA7NnD,CAAA,CAAA,EA8NN,IA9NM,CA+NR,MA/NQ,EAgOR,SAhOQ,EAiOR,OAjOQ,EAkOR,SAlOQ,EAmOR,eAnOQ,EAoOR,0BApOQ,EAqOR,SArOQ,EAsOR,oBAtOQ,CAAA;;;;;cCtDG,GAAC,YAAoB,mBAAA,CAApB,wBAAA,EAAA,qBAAA,CAAA,4BAAA,mBAAA,CAAA,MAAA"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/crons/schedule.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;AAoBA;AA0BA;;;;;;;;;;;cA1Ba,uBAAA,SAAgC,KAAK;;;;;;;;;iBA0BlC,gBAAA,WAA2B"}
@@ -1,52 +1,40 @@
1
- import "../Construct-B-xc0SE9.mjs";
2
- import { FunctionBuilder, FunctionHandler } from "../index-CPeqtKgq.mjs";
3
- import { AWSScheduledFunction, Cron, CronExpression, RateExpression, ScheduleExpression } from "../AWSScheduledFunction-CVccZO-L.mjs";
4
- import { Consumable, ServicesOf } from "../construct-interface-BqwRNYA2.mjs";
5
- import * as _geekmidas_services13 from "@geekmidas/services";
6
- import { Service } from "@geekmidas/services";
7
- import { EventPublisher } from "@geekmidas/events";
8
- import * as _geekmidas_logger14 from "@geekmidas/logger";
9
- import { Logger } from "@geekmidas/logger";
10
- import * as _geekmidas_schema12 from "@geekmidas/schema";
11
- import { ComposableStandardSchema } from "@geekmidas/schema";
12
- import { StandardSchemaV1 } from "@standard-schema/spec";
1
+ import "../Construct-Ct8nalEi.mjs";
2
+ import "../index-_ajboYxK.mjs";
3
+ import "../construct-interface-g5GM5pwR.mjs";
4
+ import { Cron, CronExpression, RateExpression, ScheduleExpression } from "../Cron-dh4rUgib.mjs";
5
+ import { CronBuilder } from "../CronBuilder-CGgY2080.mjs";
13
6
 
14
- //#region src/crons/CronBuilder.d.ts
15
- declare class CronBuilder<TInput extends ComposableStandardSchema, TServices extends Service[], TLogger extends Logger = Logger, OutSchema extends StandardSchemaV1 | undefined = undefined, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string> extends FunctionBuilder<TInput, OutSchema, TServices, TLogger, TEventPublisher, TEventPublisherServiceName, undefined, string, TDatabase, TDatabaseServiceName> {
16
- private _schedule?;
17
- constructor();
18
- memorySize(memorySize: number): this;
19
- schedule(_expression: ScheduleExpression): CronBuilder<TInput, TServices, TLogger, OutSchema, TEventPublisher, TEventPublisherServiceName, TDatabase, TDatabaseServiceName>;
20
- input<T extends ComposableStandardSchema>(schema: T): CronBuilder<T, TServices, TLogger, OutSchema, TEventPublisher, TEventPublisherServiceName, TDatabase, TDatabaseServiceName>;
21
- output<T extends StandardSchemaV1>(schema: T): CronBuilder<TInput, TServices, TLogger, T, TEventPublisher, TEventPublisherServiceName, TDatabase, TDatabaseServiceName>;
22
- /**
23
- * Depend on constructs — a database, a bucket, a mail sender, a queue, a
24
- * topic.
25
- *
26
- * It records the edge and dissolves each construct's client into the
27
- * handler's service record under the construct's own id, so
28
- * `.dependsOn([uploads])` is what makes `services.uploads` exist and type.
29
- *
30
- * Constructs only. A `Service` does not match the shape, which is what keeps
31
- * env sniffing confined to `.services()` and the explicit lift.
32
- */
33
- dependsOn<const T extends readonly Consumable[]>(constructs: T): CronBuilder<TInput, [...TServices, ...ServicesOf<T>], TLogger, OutSchema, TEventPublisher, TEventPublisherServiceName, TDatabase, TDatabaseServiceName>;
34
- services<T extends Service[]>(services: T): CronBuilder<TInput, [...TServices, ...T], TLogger, OutSchema, TEventPublisher, TEventPublisherServiceName, TDatabase, TDatabaseServiceName>;
35
- logger<T extends Logger>(logger: T): CronBuilder<TInput, TServices, T, OutSchema, TEventPublisher, TEventPublisherServiceName, TDatabase, TDatabaseServiceName>;
36
- publisher<T extends EventPublisher<any>, TName extends string>(publisher: Service<TName, T>): CronBuilder<TInput, TServices, TLogger, OutSchema, T, TName, TDatabase, TDatabaseServiceName>;
37
- /**
38
- * Set the database service for this cron job.
39
- * The database will be available in the handler context as `db`.
40
- */
41
- database<T, TName extends string>(source: Consumable<TName, T> | Service<TName, T>): CronBuilder<TInput, TServices, TLogger, OutSchema, TEventPublisher, TEventPublisherServiceName, T, TName>;
42
- handle(fn: FunctionHandler<TInput, TServices, TLogger, OutSchema, TDatabase>): Cron<TInput, TServices, TLogger, OutSchema, TEventPublisher, TEventPublisherServiceName, TDatabase, TDatabaseServiceName>;
43
- }
44
- //# sourceMappingURL=CronBuilder.d.ts.map
45
- //#endregion
46
- //#region src/crons/index.d.ts
47
- declare const c: CronBuilder<_geekmidas_schema12.ComposableStandardSchema, _geekmidas_services13.Service<string, unknown>[], _geekmidas_logger14.Logger, undefined, undefined, string, undefined, string>;
48
- //# sourceMappingURL=index.d.ts.map
7
+ //#region src/crons/schedule.d.ts
49
8
 
9
+ /**
10
+ * A schedule a cron runner can take, as standard five-field cron.
11
+ *
12
+ * `ScheduleExpression` has two spellings. `cron(m h dom mon dow)` is already
13
+ * five-field cron and unwraps; `rate(n unit)` is an interval, and an interval
14
+ * is not a schedule — it says how often, where cron says when.
15
+ *
16
+ * Most intervals still have an exact cron equivalent, because they divide their
17
+ * unit evenly: `rate(5 minutes)` is every fifth minute of every hour, and that
18
+ * is `*​/5 * * * *` precisely. `rate(7 hours)` has none. There is no cron field
19
+ * that means "every seven hours" — `*​/7` in the hour field fires at 0, 7, 14
20
+ * and 21 and then starts over at midnight, so the gap between the last firing
21
+ * of one day and the first of the next is three hours rather than seven.
22
+ *
23
+ * Those are refused rather than rounded. A job that runs at the wrong hour is
24
+ * far harder to notice than one that refused to build, and a schedule quietly
25
+ * adjusted by the framework is a bug nobody goes looking for.
26
+ */
27
+ declare class UnrepresentableSchedule extends Error {
28
+ readonly schedule: string;
29
+ constructor(schedule: string, reason: string);
30
+ }
31
+ /**
32
+ * Standard five-field cron for a schedule expression.
33
+ *
34
+ * @throws {UnrepresentableSchedule} when a `rate(…)` has no exact equivalent.
35
+ */
36
+ declare function toCronExpression(schedule: ScheduleExpression): string;
37
+ //# sourceMappingURL=schedule.d.ts.map
50
38
  //#endregion
51
- export { AWSScheduledFunction, Cron, CronBuilder, CronExpression, RateExpression, ScheduleExpression, c };
39
+ export { Cron, CronBuilder, CronExpression, RateExpression, ScheduleExpression, UnrepresentableSchedule, toCronExpression };
52
40
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/crons/CronBuilder.ts","../../src/crons/index.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;cAkBa,2BACG,4CACG,2BACF,SAAS,0BACP,kEACM,8KAIf,gBACT,QACA,WACA,WACA,SACA,iBACA,+CAGA,WACA;;;;wBAac,qBACX,YACF,QACA,WACA,SACA,WACA,iBACA,4BACA,WACA;kBAKwB,kCAChB,IACN,YACF,GACA,WACA,SACA,WACA,iBACA,4BACA,WACA;EAxDW,MAAA,CAAA,UAwEc,gBAxEH,CAAA,CAAA,MAAA,EAyEd,CAzEc,CAAA,EA0EpB,WA1EoB,CA2EtB,MA3EsB,EA4EtB,SA5EsB,EA6EtB,OA7EsB,EA8EtB,CA9EsB,EA+EtB,eA/EsB,EAgFtB,0BAhFsB,EAiFtB,SAjFsB,EAkFtB,oBAlFsB,CAAA;EAAA;;;;;;;;;;;EAahB,SACP,CAAA,gBAAA,SA+F4C,UA/F5C,EAAA,CAAA,CAAA,UAAA,EAgGa,CAhGb,CAAA,EAiGG,WAjGH,CAkGC,MAlGD,EAAA,CACA,GAkGK,SAlGL,EAGA,GA+FmB,UA/FnB,CA+F8B,CA/F9B,CAAA,CAAS,EAgGR,OA/FD,EAgGC,SAhGD,EAiGC,eAjGD,EAkGC,0BAlGD,EAmGC,SAnGD,EAoGC,oBApGD,CAAA;EAAoB,QAaN,CAAA,UAoHc,OApHd,EAAA,CAAA,CAAA,QAAA,EAqHH,CArHG,CAAA,EAsHX,WAtHW,CAuHb,MAvHa,EAAA,CAEb,GAsHI,SAtHJ,EACA,GAqHkB,CArHlB,CAAS,EAsHT,OArHA,EAsHA,SAtHA,EAuHA,eAvHA,EAwHA,0BAxHA,EAyHA,SAzHA,EA0HA,oBA1HA,CAAA;EAAO,MACP,CAAA,UA4IyB,MA5IzB,CAAA,CAAA,MAAA,EA6IQ,CA7IR,CAAA,EA8IE,WA9IF,CA+IA,MA/IA,EAgJA,SAhJA,EAiJA,CAjJA,EAkJA,SAlJA,EAmJA,eAnJA,EAoJA,0BApJA,EAqJA,SArJA,EAsJA,oBAtJA,CAAA;EAAS,SACT,CAAA,UAqK4B,cArK5B,CAAA,GAAA,CAAA,EAAA,cAAA,MAAA,CAAA,CAAA,SAAA,EAsKW,OAtKX,CAsKmB,KAtKnB,EAsK0B,CAtK1B,CAAA,CAAA,EAuKE,WAvKF,CAwKA,MAxKA,EAyKA,SAzKA,EA0KA,OA1KA,EA2KA,SA3KA,EA4KA,CA5KA,EA6KA,KA7KA,EA8KA,SA9KA,EA+KA,oBA/KA,CAAA;EAAe;;;;EALF,QAaW,CAAA,CAAA,EAAA,cAAA,MAAA,CAAA,CAAA,MAAA,EA+LhB,UA/LgB,CA+LL,KA/LK,EA+LE,CA/LF,CAAA,GA+LO,OA/LP,CA+Le,KA/Lf,EA+LsB,CA/LtB,CAAA,CAAA,EAgMtB,WAhMsB,CAiMxB,MAjMwB,EAkMxB,SAlMwB,EAmMxB,OAnMwB,EAoMxB,SApMwB,EAqMxB,eArMwB,EAsMxB,0BAtMwB,EAuMxB,CAvMwB,EAwMxB,KAxMwB,CAAA;EAAwB,MACxC,CAAA,EAAA,EA6NJ,eA7NI,CA6NY,MA7NZ,EA6NoB,SA7NpB,EA6N+B,OA7N/B,EA6NwC,SA7NxC,EA6NmD,SA7NnD,CAAA,CAAA,EA8NN,IA9NM,CA+NR,MA/NQ,EAgOR,SAhOQ,EAiOR,OAjOQ,EAkOR,SAlOQ,EAmOR,eAnOQ,EAoOR,0BApOQ,EAqOR,SArOQ,EAsOR,oBAtOQ,CAAA;;;;;cCtDG,GAAC,YAAoB,mBAAA,CAApB,wBAAA,EAAA,qBAAA,CAAA,4BAAA,mBAAA,CAAA,MAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/crons/schedule.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;AAoBA;AA0BA;;;;;;;;;;;cA1Ba,uBAAA,SAAgC,KAAK;;;;;;;;;iBA0BlC,gBAAA,WAA2B"}
@@ -1,89 +1,72 @@
1
- import { ConstructType, __toESM } from "../Construct-HmWM6YYu.mjs";
2
- import { idsOf, serviceOf, servicesOf } from "../construct-interface-Z4CpS8tK.mjs";
3
- import { Function, FunctionBuilder, require_lodash } from "../functions-CvT_q7Y4.mjs";
4
- import { cloneWith } from "../clone-DblgEZZa.mjs";
5
- import "../publisher-CGEo8UKD.mjs";
6
- import { AWSScheduledFunction } from "../AWSScheduledFunction-Db1lttJH.mjs";
1
+ import "../Construct-BD5neF7w.mjs";
2
+ import "../construct-interface-Z4CpS8tK.mjs";
3
+ import "../functions-14lpEFL4.mjs";
4
+ import "../clone-DblgEZZa.mjs";
5
+ import { Cron, CronBuilder } from "../CronBuilder-CYKT5RiO.mjs";
7
6
 
8
- //#region src/crons/Cron.ts
9
- var Cron = class extends Function {
10
- static isCron(obj) {
11
- return Boolean(obj && obj.__IS_FUNCTION__ === true && obj.type === ConstructType.Cron);
12
- }
13
- constructor(fn, timeout, _schedule, input, outputSchema, services = [], logger, publisherService, events = [], memorySize, databaseService, constructs = []) {
14
- super(fn, timeout, ConstructType.Cron, input, outputSchema, services, logger, publisherService, events, memorySize, void 0, databaseService, constructs);
15
- this._schedule = _schedule;
16
- }
17
- get schedule() {
18
- return this._schedule;
7
+ //#region src/crons/schedule.ts
8
+ /**
9
+ * A schedule a cron runner can take, as standard five-field cron.
10
+ *
11
+ * `ScheduleExpression` has two spellings. `cron(m h dom mon dow)` is already
12
+ * five-field cron and unwraps; `rate(n unit)` is an interval, and an interval
13
+ * is not a schedule — it says how often, where cron says when.
14
+ *
15
+ * Most intervals still have an exact cron equivalent, because they divide their
16
+ * unit evenly: `rate(5 minutes)` is every fifth minute of every hour, and that
17
+ * is `*​/5 * * * *` precisely. `rate(7 hours)` has none. There is no cron field
18
+ * that means "every seven hours" — `*​/7` in the hour field fires at 0, 7, 14
19
+ * and 21 and then starts over at midnight, so the gap between the last firing
20
+ * of one day and the first of the next is three hours rather than seven.
21
+ *
22
+ * Those are refused rather than rounded. A job that runs at the wrong hour is
23
+ * far harder to notice than one that refused to build, and a schedule quietly
24
+ * adjusted by the framework is a bug nobody goes looking for.
25
+ */
26
+ var UnrepresentableSchedule = class extends Error {
27
+ constructor(schedule, reason) {
28
+ super(`\`${schedule}\` has no exact cron equivalent: ${reason}.\n\nCron says *when*, not *how often*, so an interval is only exact when it divides its unit evenly.
29
+ Write the schedule you mean instead — \`cron(0 */6 * * *)\` for every sixth hour, say — or pick an interval that divides: minutes into 60, hours into 24.`);
30
+ this.schedule = schedule;
31
+ this.name = "UnrepresentableSchedule";
19
32
  }
20
33
  };
21
-
22
- //#endregion
23
- //#region src/crons/CronBuilder.ts
24
- var import_lodash = __toESM(require_lodash(), 1);
25
- var CronBuilder = class extends FunctionBuilder {
26
- _schedule;
27
- constructor() {
28
- super(ConstructType.Cron);
29
- }
30
- memorySize(memorySize) {
31
- return cloneWith(this, { _memorySize: memorySize });
32
- }
33
- schedule(_expression) {
34
- return cloneWith(this, { _schedule: _expression });
35
- }
36
- input(schema) {
37
- return cloneWith(this, { inputSchema: schema });
38
- }
39
- output(schema) {
40
- return cloneWith(this, { outputSchema: schema });
41
- }
42
- /**
43
- * Depend on constructs — a database, a bucket, a mail sender, a queue, a
44
- * topic.
45
- *
46
- * It records the edge and dissolves each construct's client into the
47
- * handler's service record under the construct's own id, so
48
- * `.dependsOn([uploads])` is what makes `services.uploads` exist and type.
49
- *
50
- * Constructs only. A `Service` does not match the shape, which is what keeps
51
- * env sniffing confined to `.services()` and the explicit lift.
52
- */
53
- dependsOn(constructs) {
54
- const services = servicesOf(constructs);
55
- return cloneWith(this, {
56
- _services: (0, import_lodash.default)([...this._services, ...services], (s) => s.serviceName),
57
- _constructs: idsOf(constructs, this._constructs)
58
- });
34
+ /** Units `rate(…)` accepts, singular or plural. */
35
+ const UNITS = [
36
+ "minute",
37
+ "hour",
38
+ "day"
39
+ ];
40
+ /**
41
+ * Standard five-field cron for a schedule expression.
42
+ *
43
+ * @throws {UnrepresentableSchedule} when a `rate(…)` has no exact equivalent.
44
+ */
45
+ function toCronExpression(schedule) {
46
+ const cron = /^cron\((.+)\)$/.exec(schedule);
47
+ if (cron?.[1]) return cron[1].trim();
48
+ const rate = /^rate\(\s*(\d+)\s+(\w+?)s?\s*\)$/.exec(schedule);
49
+ if (!rate) throw new UnrepresentableSchedule(schedule, "it is neither `cron(…)` nor `rate(n unit)`");
50
+ const every = Number(rate[1]);
51
+ const unit = rate[2];
52
+ /* c8 ignore next */ if (!unit) throw new UnrepresentableSchedule(schedule, "no unit");
53
+ if (!UNITS.includes(unit)) throw new UnrepresentableSchedule(schedule, `\`${unit}\` is not one of ${UNITS.join(", ")}`);
54
+ if (every < 1) throw new UnrepresentableSchedule(schedule, "an interval must be at least 1");
55
+ switch (unit) {
56
+ case "minute":
57
+ if (every === 1) return "* * * * *";
58
+ if (60 % every !== 0) throw new UnrepresentableSchedule(schedule, `${every} does not divide 60, so the interval would reset at the top of each hour`);
59
+ return `*/${every} * * * *`;
60
+ case "hour":
61
+ if (every === 1) return "0 * * * *";
62
+ if (24 % every !== 0) throw new UnrepresentableSchedule(schedule, `${every} does not divide 24, so the interval would reset at midnight`);
63
+ return `0 */${every} * * *`;
64
+ case "day":
65
+ if (every === 1) return "0 0 * * *";
66
+ throw new UnrepresentableSchedule(schedule, "day-of-month restarts every month, so no multi-day interval is even");
59
67
  }
60
- services(services) {
61
- return cloneWith(this, { _services: (0, import_lodash.default)([...this._services, ...services], (s) => s.serviceName) });
62
- }
63
- logger(logger) {
64
- return cloneWith(this, { _logger: logger });
65
- }
66
- publisher(publisher) {
67
- return cloneWith(this, { _publisher: publisher });
68
- }
69
- /**
70
- * Set the database service for this cron job.
71
- * The database will be available in the handler context as `db`.
72
- */
73
- database(source) {
74
- const service = serviceOf(source);
75
- return cloneWith(this, { _databaseService: service });
76
- }
77
- handle(fn) {
78
- const cron = new Cron(fn, this._timeout, this._schedule, this.inputSchema, this.outputSchema, this._services, this._logger, this._publisher, this._events, this._memorySize, this._databaseService, this._constructs);
79
- return cron;
80
- }
81
- };
82
-
83
- //#endregion
84
- //#region src/crons/index.ts
85
- const c = new CronBuilder();
68
+ }
86
69
 
87
70
  //#endregion
88
- export { AWSScheduledFunction, Cron, CronBuilder, c };
71
+ export { Cron, CronBuilder, UnrepresentableSchedule, toCronExpression };
89
72
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["obj: any","fn: FunctionHandler<TInput, TServices, TLogger, OutSchema, TDatabase>","timeout?: number","_schedule?: ScheduleExpression","input?: TInput","outputSchema?: OutSchema","services: TServices","logger?: TLogger","publisherService?: Service<TEventPublisherServiceName, TEventPublisher>","events: any[]","memorySize?: number","databaseService?: Service<TDatabaseServiceName, TDatabase>","constructs: string[]","memorySize: number","_expression: ScheduleExpression","schema: T","constructs: T","s: Service","services: T","logger: T","publisher: Service<TName, T>","source: Consumable<TName, T> | Service<TName, T>","fn: FunctionHandler<TInput, TServices, TLogger, OutSchema, TDatabase>"],"sources":["../../src/crons/Cron.ts","../../src/crons/CronBuilder.ts","../../src/crons/index.ts"],"sourcesContent":["import type { AuditableAction } from '@geekmidas/audit';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport type { ComposableStandardSchema } from '@geekmidas/schema';\nimport type { Service } from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\n\nimport { ConstructType } from '../Construct';\nimport { Function, type FunctionHandler } from '../functions';\n\nexport class Cron<\n\tTInput extends ComposableStandardSchema | undefined = undefined,\n\tTServices extends Service[] = [],\n\tTLogger extends Logger = Logger,\n\tOutSchema extends StandardSchemaV1 | undefined = undefined,\n\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\tTEventPublisherServiceName extends string = string,\n\tTDatabase = undefined,\n\tTDatabaseServiceName extends string = string,\n> extends Function<\n\tTInput,\n\tTServices,\n\tTLogger,\n\tOutSchema,\n\tTEventPublisher,\n\tTEventPublisherServiceName,\n\tundefined,\n\tstring,\n\tTDatabase,\n\tTDatabaseServiceName,\n\tAuditableAction<string, unknown>,\n\tFunctionHandler<TInput, TServices, TLogger, OutSchema, TDatabase>\n> {\n\tstatic isCron(obj: any): obj is Cron<any, any, any, any> {\n\t\treturn Boolean(\n\t\t\tobj &&\n\t\t\t\t(obj as Function).__IS_FUNCTION__ === true &&\n\t\t\t\tobj.type === ConstructType.Cron,\n\t\t);\n\t}\n\n\tconstructor(\n\t\tfn: FunctionHandler<TInput, TServices, TLogger, OutSchema, TDatabase>,\n\t\ttimeout?: number,\n\t\tprotected _schedule?: ScheduleExpression,\n\t\tinput?: TInput,\n\t\toutputSchema?: OutSchema,\n\t\tservices: TServices = [] as unknown as TServices,\n\t\tlogger?: TLogger,\n\t\tpublisherService?: Service<TEventPublisherServiceName, TEventPublisher>,\n\t\tevents: any[] = [],\n\t\tmemorySize?: number,\n\t\tdatabaseService?: Service<TDatabaseServiceName, TDatabase>,\n\t\t/**\n\t\t * The construct ids `.dependsOn()` named — last, so no existing positional\n\t\t * argument moves.\n\t\t */\n\t\tconstructs: string[] = [],\n\t) {\n\t\tsuper(\n\t\t\tfn,\n\t\t\ttimeout,\n\t\t\tConstructType.Cron,\n\t\t\tinput,\n\t\t\toutputSchema,\n\t\t\tservices,\n\t\t\tlogger,\n\t\t\tpublisherService,\n\t\t\tevents,\n\t\t\tmemorySize,\n\t\t\tundefined, // auditorStorageService\n\t\t\tdatabaseService,\n\t\t\tconstructs,\n\t\t);\n\t}\n\n\tget schedule(): ScheduleExpression | undefined {\n\t\treturn this._schedule;\n\t}\n}\n\nexport type RateExpression = `rate(${string})`;\n\ntype CronMinute =\n\t| '*'\n\t| number\n\t| `${number}`\n\t| `${number}-${number}`\n\t| `${number}/${number}`\n\t| `*/${number}`\n\t| `${number},${number}`\n\t| string; // Allow more complex patterns\n\ntype CronHour =\n\t| '*'\n\t| number\n\t| `${number}`\n\t| `${number}-${number}`\n\t| `${number}/${number}`\n\t| `*/${number}`\n\t| `${number},${number}`\n\t| string; // Allow more complex patterns\n\ntype CronDay =\n\t| '*'\n\t| number\n\t| `${number}`\n\t| `${number}-${number}`\n\t| `${number}/${number}`\n\t| `*/${number}`\n\t| `${number},${number}`\n\t| string; // Allow more complex patterns\n\ntype CronMonth =\n\t| '*'\n\t| number\n\t| `${number}`\n\t| `${number}-${number}`\n\t| `${number}/${number}`\n\t| `*/${number}`\n\t| 'JAN'\n\t| 'FEB'\n\t| 'MAR'\n\t| 'APR'\n\t| 'MAY'\n\t| 'JUN'\n\t| 'JUL'\n\t| 'AUG'\n\t| 'SEP'\n\t| 'OCT'\n\t| 'NOV'\n\t| 'DEC'\n\t| string; // Allow more complex patterns\n\ntype CronWeekday =\n\t| '*'\n\t| number\n\t| `${number}`\n\t| `${number}-${number}`\n\t| `${number}/${number}`\n\t| `*/${number}`\n\t| 'SUN'\n\t| 'MON'\n\t| 'TUE'\n\t| 'WED'\n\t| 'THU'\n\t| 'FRI'\n\t| 'SAT'\n\t| `${string}-${string}` // Allow patterns like MON-FRI\n\t| string; // Allow more complex patterns\n\nexport type CronExpression =\n\t`cron(${CronMinute} ${CronHour} ${CronDay} ${CronMonth} ${CronWeekday})`;\n\nexport type ScheduleExpression = RateExpression | CronExpression;\n","import type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport type { ComposableStandardSchema } from '@geekmidas/schema';\nimport type { Service } from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport uniqBy from 'lodash.uniqby';\nimport { ConstructType } from '../Construct';\nimport { cloneWith } from '../clone';\nimport {\n\ttype Consumable,\n\tidsOf,\n\ttype ServicesOf,\n\tserviceOf,\n\tservicesOf,\n} from '../construct-interface';\nimport { FunctionBuilder, type FunctionHandler } from '../functions';\nimport { Cron, type ScheduleExpression } from './Cron';\n\nexport class CronBuilder<\n\tTInput extends ComposableStandardSchema,\n\tTServices extends Service[],\n\tTLogger extends Logger = Logger,\n\tOutSchema extends StandardSchemaV1 | undefined = undefined,\n\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\tTEventPublisherServiceName extends string = string,\n\tTDatabase = undefined,\n\tTDatabaseServiceName extends string = string,\n> extends FunctionBuilder<\n\tTInput,\n\tOutSchema,\n\tTServices,\n\tTLogger,\n\tTEventPublisher,\n\tTEventPublisherServiceName,\n\tundefined,\n\tstring,\n\tTDatabase,\n\tTDatabaseServiceName\n> {\n\tprivate _schedule?: ScheduleExpression;\n\n\tconstructor() {\n\t\tsuper(ConstructType.Cron);\n\t}\n\n\toverride memorySize(memorySize: number): this {\n\t\treturn cloneWith(this, { _memorySize: memorySize });\n\t}\n\n\tschedule(\n\t\t_expression: ScheduleExpression,\n\t): CronBuilder<\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tOutSchema,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTDatabase,\n\t\tTDatabaseServiceName\n\t> {\n\t\treturn cloneWith(this, { _schedule: _expression });\n\t}\n\n\toverride input<T extends ComposableStandardSchema>(\n\t\tschema: T,\n\t): CronBuilder<\n\t\tT,\n\t\tTServices,\n\t\tTLogger,\n\t\tOutSchema,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTDatabase,\n\t\tTDatabaseServiceName\n\t> {\n\t\treturn cloneWith(this, {\n\t\t\tinputSchema: schema as unknown as TInput,\n\t\t}) as unknown as CronBuilder<\n\t\t\tT,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tOutSchema,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>;\n\t}\n\n\toverride output<T extends StandardSchemaV1>(\n\t\tschema: T,\n\t): CronBuilder<\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tT,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTDatabase,\n\t\tTDatabaseServiceName\n\t> {\n\t\treturn cloneWith(this, {\n\t\t\toutputSchema: schema as unknown as OutSchema,\n\t\t}) as unknown as CronBuilder<\n\t\t\tTInput,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tT,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>;\n\t}\n\n\t/**\n\t * Depend on constructs — a database, a bucket, a mail sender, a queue, a\n\t * topic.\n\t *\n\t * It records the edge and dissolves each construct's client into the\n\t * handler's service record under the construct's own id, so\n\t * `.dependsOn([uploads])` is what makes `services.uploads` exist and type.\n\t *\n\t * Constructs only. A `Service` does not match the shape, which is what keeps\n\t * env sniffing confined to `.services()` and the explicit lift.\n\t */\n\toverride dependsOn<const T extends readonly Consumable[]>(\n\t\tconstructs: T,\n\t): CronBuilder<\n\t\tTInput,\n\t\t[...TServices, ...ServicesOf<T>],\n\t\tTLogger,\n\t\tOutSchema,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTDatabase,\n\t\tTDatabaseServiceName\n\t> {\n\t\t// Both halves of the edge, from one call and one clone: the services the\n\t\t// handler runs with, and the ids the manifest records. Recording them\n\t\t// separately is what let them drift apart.\n\t\t//\n\t\t// `servicesOf` is the half that validates, so it runs first — recording\n\t\t// ids ahead of it left a caught `NotAConstruct` with `undefined` already\n\t\t// on a `string[]`.\n\t\tconst services = servicesOf(constructs) as unknown as Service[];\n\n\t\treturn cloneWith(this, {\n\t\t\t_services: uniqBy(\n\t\t\t\t[...this._services, ...services],\n\t\t\t\t(s: Service) => s.serviceName,\n\t\t\t),\n\t\t\t_constructs: idsOf(constructs, this._constructs),\n\t\t}) as unknown as CronBuilder<\n\t\t\tTInput,\n\t\t\t[...TServices, ...ServicesOf<T>],\n\t\t\tTLogger,\n\t\t\tOutSchema,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>;\n\t}\n\n\toverride services<T extends Service[]>(\n\t\tservices: T,\n\t): CronBuilder<\n\t\tTInput,\n\t\t[...TServices, ...T],\n\t\tTLogger,\n\t\tOutSchema,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTDatabase,\n\t\tTDatabaseServiceName\n\t> {\n\t\treturn cloneWith(this, {\n\t\t\t_services: uniqBy(\n\t\t\t\t[...this._services, ...services],\n\t\t\t\t(s) => s.serviceName,\n\t\t\t) as TServices,\n\t\t}) as unknown as CronBuilder<\n\t\t\tTInput,\n\t\t\t[...TServices, ...T],\n\t\t\tTLogger,\n\t\t\tOutSchema,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>;\n\t}\n\n\toverride logger<T extends Logger>(\n\t\tlogger: T,\n\t): CronBuilder<\n\t\tTInput,\n\t\tTServices,\n\t\tT,\n\t\tOutSchema,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTDatabase,\n\t\tTDatabaseServiceName\n\t> {\n\t\treturn cloneWith(this, {\n\t\t\t_logger: logger as unknown as TLogger,\n\t\t}) as unknown as CronBuilder<\n\t\t\tTInput,\n\t\t\tTServices,\n\t\t\tT,\n\t\t\tOutSchema,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>;\n\t}\n\n\toverride publisher<T extends EventPublisher<any>, TName extends string>(\n\t\tpublisher: Service<TName, T>,\n\t): CronBuilder<\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tOutSchema,\n\t\tT,\n\t\tTName,\n\t\tTDatabase,\n\t\tTDatabaseServiceName\n\t> {\n\t\treturn cloneWith(this, {\n\t\t\t_publisher: publisher as unknown as Service<\n\t\t\t\tTEventPublisherServiceName,\n\t\t\t\tTEventPublisher\n\t\t\t>,\n\t\t}) as unknown as CronBuilder<\n\t\t\tTInput,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tOutSchema,\n\t\t\tT,\n\t\t\tTName,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>;\n\t}\n\n\t/**\n\t * Set the database service for this cron job.\n\t * The database will be available in the handler context as `db`.\n\t */\n\toverride database<T, TName extends string>(\n\t\tsource: Consumable<TName, T> | Service<TName, T>,\n\t): CronBuilder<\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tOutSchema,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tT,\n\t\tTName\n\t> {\n\t\tconst service = serviceOf(source);\n\n\t\treturn cloneWith(this, {\n\t\t\t_databaseService: service as unknown as Service<\n\t\t\t\tTDatabaseServiceName,\n\t\t\t\tTDatabase\n\t\t\t>,\n\t\t}) as unknown as CronBuilder<\n\t\t\tTInput,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tOutSchema,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tT,\n\t\t\tTName\n\t\t>;\n\t}\n\n\toverride handle(\n\t\tfn: FunctionHandler<TInput, TServices, TLogger, OutSchema, TDatabase>,\n\t): Cron<\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tOutSchema,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTDatabase,\n\t\tTDatabaseServiceName\n\t> {\n\t\tconst cron = new Cron(\n\t\t\tfn,\n\t\t\tthis._timeout,\n\t\t\tthis._schedule,\n\t\t\tthis.inputSchema,\n\t\t\tthis.outputSchema,\n\t\t\tthis._services,\n\t\t\tthis._logger,\n\t\t\tthis._publisher,\n\t\t\tthis._events,\n\t\t\tthis._memorySize,\n\t\t\tthis._databaseService,\n\t\t\tthis._constructs,\n\t\t);\n\n\t\t// No reset. `.handle()` reads this builder and leaves it alone, so a\n\t\t// configured base — `const fn = f.logger(log).timeout(60_000)` — keeps\n\t\t// its configuration for every construct built from it. The reset that\n\t\t// used to be here wiped the base on first use, which made a base usable\n\t\t// exactly once, and quietly reverted the logger to the default.\n\n\t\treturn cron;\n\t}\n}\n","export { AWSScheduledFunction } from './AWSScheduledFunction';\nexport {\n\tCron,\n\ttype CronExpression,\n\ttype RateExpression,\n\ttype ScheduleExpression,\n} from './Cron';\nexport { CronBuilder } from './CronBuilder';\n\nimport { CronBuilder } from './CronBuilder';\n\nexport const c = new CronBuilder();\n"],"mappings":";;;;;;;;AAUA,IAAa,OAAb,cASU,SAaR;CACD,OAAO,OAAOA,KAA2C;AACxD,SAAO,QACN,OACE,IAAiB,oBAAoB,QACtC,IAAI,SAAS,cAAc,KAC5B;CACD;CAED,YACCC,IACAC,SACUC,WACVC,OACAC,cACAC,WAAsB,CAAE,GACxBC,QACAC,kBACAC,SAAgB,CAAE,GAClBC,YACAC,iBAKAC,aAAuB,CAAE,GACxB;AACD,QACC,IACA,SACA,cAAc,MACd,OACA,cACA,UACA,QACA,kBACA,QACA,oBAEA,iBACA,WACA;EA7BS;CA8BV;CAED,IAAI,WAA2C;AAC9C,SAAO,KAAK;CACZ;AACD;;;;;AC7DD,IAAa,cAAb,cASU,gBAWR;CACD,AAAQ;CAER,cAAc;AACb,QAAM,cAAc,KAAK;CACzB;CAED,AAAS,WAAWC,YAA0B;AAC7C,SAAO,UAAU,MAAM,EAAE,aAAa,WAAY,EAAC;CACnD;CAED,SACCC,aAUC;AACD,SAAO,UAAU,MAAM,EAAE,WAAW,YAAa,EAAC;CAClD;CAED,AAAS,MACRC,QAUC;AACD,SAAO,UAAU,MAAM,EACtB,aAAa,OACb,EAAC;CAUF;CAED,AAAS,OACRA,QAUC;AACD,SAAO,UAAU,MAAM,EACtB,cAAc,OACd,EAAC;CAUF;;;;;;;;;;;;CAaD,AAAS,UACRC,YAUC;EAQD,MAAM,WAAW,WAAW,WAAW;AAEvC,SAAO,UAAU,MAAM;GACtB,WAAW,2BACV,CAAC,GAAG,KAAK,WAAW,GAAG,QAAS,GAChC,CAACC,MAAe,EAAE,YAClB;GACD,aAAa,MAAM,YAAY,KAAK,YAAY;EAChD,EAAC;CAUF;CAED,AAAS,SACRC,UAUC;AACD,SAAO,UAAU,MAAM,EACtB,WAAW,2BACV,CAAC,GAAG,KAAK,WAAW,GAAG,QAAS,GAChC,CAAC,MAAM,EAAE,YACT,CACD,EAAC;CAUF;CAED,AAAS,OACRC,QAUC;AACD,SAAO,UAAU,MAAM,EACtB,SAAS,OACT,EAAC;CAUF;CAED,AAAS,UACRC,WAUC;AACD,SAAO,UAAU,MAAM,EACtB,YAAY,UAIZ,EAAC;CAUF;;;;;CAMD,AAAS,SACRC,QAUC;EACD,MAAM,UAAU,UAAU,OAAO;AAEjC,SAAO,UAAU,MAAM,EACtB,kBAAkB,QAIlB,EAAC;CAUF;CAED,AAAS,OACRC,IAUC;EACD,MAAM,OAAO,IAAI,KAChB,IACA,KAAK,UACL,KAAK,WACL,KAAK,aACL,KAAK,cACL,KAAK,WACL,KAAK,SACL,KAAK,YACL,KAAK,SACL,KAAK,aACL,KAAK,kBACL,KAAK;AASN,SAAO;CACP;AACD;;;;ACrTD,MAAa,IAAI,IAAI"}
1
+ {"version":3,"file":"index.mjs","names":["schedule: string","reason: string","schedule: ScheduleExpression"],"sources":["../../src/crons/schedule.ts"],"sourcesContent":["import type { ScheduleExpression } from './Cron';\n\n/**\n * A schedule a cron runner can take, as standard five-field cron.\n *\n * `ScheduleExpression` has two spellings. `cron(m h dom mon dow)` is already\n * five-field cron and unwraps; `rate(n unit)` is an interval, and an interval\n * is not a schedule — it says how often, where cron says when.\n *\n * Most intervals still have an exact cron equivalent, because they divide their\n * unit evenly: `rate(5 minutes)` is every fifth minute of every hour, and that\n * is `*​/5 * * * *` precisely. `rate(7 hours)` has none. There is no cron field\n * that means \"every seven hours\" — `*​/7` in the hour field fires at 0, 7, 14\n * and 21 and then starts over at midnight, so the gap between the last firing\n * of one day and the first of the next is three hours rather than seven.\n *\n * Those are refused rather than rounded. A job that runs at the wrong hour is\n * far harder to notice than one that refused to build, and a schedule quietly\n * adjusted by the framework is a bug nobody goes looking for.\n */\nexport class UnrepresentableSchedule extends Error {\n\tconstructor(\n\t\treadonly schedule: string,\n\t\treason: string,\n\t) {\n\t\tsuper(\n\t\t\t`\\`${schedule}\\` has no exact cron equivalent: ${reason}.\\n\\n` +\n\t\t\t\t'Cron says *when*, not *how often*, so an interval is only exact when ' +\n\t\t\t\t'it divides its unit evenly.\\n' +\n\t\t\t\t'Write the schedule you mean instead — `cron(0 */6 * * *)` for every ' +\n\t\t\t\t'sixth hour, say — or pick an interval that divides: minutes into 60, ' +\n\t\t\t\t'hours into 24.',\n\t\t);\n\t\tthis.name = 'UnrepresentableSchedule';\n\t}\n}\n\n/** Units `rate(…)` accepts, singular or plural. */\nconst UNITS = ['minute', 'hour', 'day'] as const;\ntype Unit = (typeof UNITS)[number];\n\n/**\n * Standard five-field cron for a schedule expression.\n *\n * @throws {UnrepresentableSchedule} when a `rate(…)` has no exact equivalent.\n */\nexport function toCronExpression(schedule: ScheduleExpression): string {\n\tconst cron = /^cron\\((.+)\\)$/.exec(schedule);\n\tif (cron?.[1]) return cron[1].trim();\n\n\tconst rate = /^rate\\(\\s*(\\d+)\\s+(\\w+?)s?\\s*\\)$/.exec(schedule);\n\tif (!rate) {\n\t\tthrow new UnrepresentableSchedule(\n\t\t\tschedule,\n\t\t\t'it is neither `cron(…)` nor `rate(n unit)`',\n\t\t);\n\t}\n\n\tconst every = Number(rate[1]);\n\tconst unit = rate[2] as Unit;\n\t/* c8 ignore next */ if (!unit)\n\t\tthrow new UnrepresentableSchedule(schedule, 'no unit');\n\n\tif (!UNITS.includes(unit)) {\n\t\tthrow new UnrepresentableSchedule(\n\t\t\tschedule,\n\t\t\t`\\`${unit}\\` is not one of ${UNITS.join(', ')}`,\n\t\t);\n\t}\n\n\tif (every < 1) {\n\t\tthrow new UnrepresentableSchedule(\n\t\t\tschedule,\n\t\t\t'an interval must be at least 1',\n\t\t);\n\t}\n\n\tswitch (unit) {\n\t\tcase 'minute':\n\t\t\tif (every === 1) return '* * * * *';\n\t\t\tif (60 % every !== 0) {\n\t\t\t\tthrow new UnrepresentableSchedule(\n\t\t\t\t\tschedule,\n\t\t\t\t\t`${every} does not divide 60, so the interval would reset at the top of each hour`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn `*/${every} * * * *`;\n\n\t\tcase 'hour':\n\t\t\tif (every === 1) return '0 * * * *';\n\t\t\tif (24 % every !== 0) {\n\t\t\t\tthrow new UnrepresentableSchedule(\n\t\t\t\t\tschedule,\n\t\t\t\t\t`${every} does not divide 24, so the interval would reset at midnight`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn `0 */${every} * * *`;\n\n\t\tcase 'day':\n\t\t\tif (every === 1) return '0 0 * * *';\n\t\t\t// `*/n` in day-of-month restarts on the 1st, so a 2-day interval fires\n\t\t\t// on the 1st and 3rd of a 31-day month and then again on the 1st — one\n\t\t\t// day later, not two. No month length makes that come out even.\n\t\t\tthrow new UnrepresentableSchedule(\n\t\t\t\tschedule,\n\t\t\t\t'day-of-month restarts every month, so no multi-day interval is even',\n\t\t\t);\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAoBA,IAAa,0BAAb,cAA6C,MAAM;CAClD,YACUA,UACTC,QACC;AACD,SACE,IAAI,SAAS,mCAAmC,OAAO;2JAMxD;EAVQ;AAWT,OAAK,OAAO;CACZ;AACD;;AAGD,MAAM,QAAQ;CAAC;CAAU;CAAQ;AAAM;;;;;;AAQvC,SAAgB,iBAAiBC,UAAsC;CACtE,MAAM,OAAO,iBAAiB,KAAK,SAAS;AAC5C,KAAI,OAAO,GAAI,QAAO,KAAK,GAAG,MAAM;CAEpC,MAAM,OAAO,mCAAmC,KAAK,SAAS;AAC9D,MAAK,KACJ,OAAM,IAAI,wBACT,UACA;CAIF,MAAM,QAAQ,OAAO,KAAK,GAAG;CAC7B,MAAM,OAAO,KAAK;qBACG,MAAK,KACzB,OAAM,IAAI,wBAAwB,UAAU;AAE7C,MAAK,MAAM,SAAS,KAAK,CACxB,OAAM,IAAI,wBACT,WACC,IAAI,KAAK,mBAAmB,MAAM,KAAK,KAAK,CAAC;AAIhD,KAAI,QAAQ,EACX,OAAM,IAAI,wBACT,UACA;AAIF,SAAQ,MAAR;EACC,KAAK;AACJ,OAAI,UAAU,EAAG,QAAO;AACxB,OAAI,KAAK,UAAU,EAClB,OAAM,IAAI,wBACT,WACC,EAAE,MAAM;AAGX,WAAQ,IAAI,MAAM;EAEnB,KAAK;AACJ,OAAI,UAAU,EAAG,QAAO;AACxB,OAAI,KAAK,UAAU,EAClB,OAAM,IAAI,wBACT,WACC,EAAE,MAAM;AAGX,WAAQ,MAAM,MAAM;EAErB,KAAK;AACJ,OAAI,UAAU,EAAG,QAAO;AAIxB,SAAM,IAAI,wBACT,UACA;CAEF;AACD"}
@@ -1,5 +1,5 @@
1
- import { Construct } from "../construct-interface-D2nNkHUN.cjs";
2
- import { Cache } from "../cache-CdQ7OLpR.cjs";
1
+ import { Construct } from "../construct-interface-D9d4Gm4p.cjs";
2
+ import { Cache } from "../cache-BtZY_tHe.cjs";
3
3
  import { Service } from "@geekmidas/services";
4
4
  import { ConstructName, Declaration, PostgresVersion } from "@geekmidas/manifest";
5
5
  import { Kysely, KyselyConfig } from "kysely";
@@ -1,5 +1,5 @@
1
- import { Construct } from "../construct-interface-BqwRNYA2.mjs";
2
- import { Cache } from "../cache-DYoJFcfd.mjs";
1
+ import { Construct } from "../construct-interface-g5GM5pwR.mjs";
2
+ import { Cache } from "../cache-BrRz3fEB.mjs";
3
3
  import { ConstructName, Declaration, PostgresVersion } from "@geekmidas/manifest";
4
4
  import { Service } from "@geekmidas/services";
5
5
  import { Kysely, KyselyConfig } from "kysely";
package/dist/email.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { Construct } from "./construct-interface-D2nNkHUN.cjs";
1
+ import { Construct } from "./construct-interface-D9d4Gm4p.cjs";
2
2
  import { Service } from "@geekmidas/services";
3
3
  import { ConstructName, Declaration } from "@geekmidas/manifest";
4
4
  import { EmailClient, TemplateRecord } from "@geekmidas/emailkit";
package/dist/email.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { Construct } from "./construct-interface-BqwRNYA2.mjs";
1
+ import { Construct } from "./construct-interface-g5GM5pwR.mjs";
2
2
  import { ConstructName, Declaration } from "@geekmidas/manifest";
3
3
  import { EmailClient, TemplateRecord } from "@geekmidas/emailkit";
4
4
  import { Service } from "@geekmidas/services";
@@ -1,12 +1,11 @@
1
1
  require('../construct-interface-BfjcOD_E.cjs');
2
- require('../Construct-roId57cU.cjs');
3
- require('../functions-DukjG8ov.cjs');
4
- const require_EndpointFactory = require('../EndpointFactory-DYoGLaIT.cjs');
2
+ require('../Construct-CyS3RpTL.cjs');
3
+ require('../functions-i_la-N5r.cjs');
4
+ const require_EndpointFactory = require('../EndpointFactory-CdWB7wPw.cjs');
5
5
  require('../clone-Dy0cR2SZ.cjs');
6
- const require_Endpoint = require('../Endpoint-BBkV6l0k.cjs');
6
+ const require_Endpoint = require('../Endpoint-DcWXE-SZ.cjs');
7
7
  const require_surfaceEnv = require('../surfaceEnv-BFXEms2f.cjs');
8
- const require_publisher = require('../publisher-CqGsXB2X.cjs');
9
- const require_lazyAccessors = require('../lazyAccessors-DrJj8NpA.cjs');
8
+ const require_lazyAccessors = require('../lazyAccessors-e3j2oE2m.cjs');
10
9
 
11
10
  exports.BUILT_IN_SECURITY_SCHEMES = require_EndpointFactory.BUILT_IN_SECURITY_SCHEMES;
12
11
  exports.Endpoint = require_Endpoint.Endpoint;
@@ -25,4 +24,4 @@ exports.defaultEnvParser = require_surfaceEnv.defaultEnvParser;
25
24
  exports.envParserFor = require_surfaceEnv.envParserFor;
26
25
  exports.getSecurityScheme = require_EndpointFactory.getSecurityScheme;
27
26
  exports.isBuiltInSecurityScheme = require_EndpointFactory.isBuiltInSecurityScheme;
28
- exports.publishConstructEvents = require_publisher.publishConstructEvents;
27
+ exports.publishConstructEvents = require_lazyAccessors.publishConstructEvents;
@@ -1,7 +1,7 @@
1
- import "../Construct-WhCXIOPV.cjs";
2
- import "../index-Dadljnh_.cjs";
3
- import "../construct-interface-D2nNkHUN.cjs";
1
+ import "../Construct-C0ijr2qp.cjs";
2
+ import "../index-D24Xm79M.cjs";
3
+ import "../construct-interface-D9d4Gm4p.cjs";
4
4
  import "../types-BlAkSuGI.cjs";
5
- import { ActorExtractor, Authorizer, BUILT_IN_SECURITY_SCHEMES, BuiltInSecuritySchemeId, Endpoint, EndpointContext, EndpointHandler, EndpointOutput, EndpointSchemas, MappedAudit, OAuthFlow, OAuthFlows, RLS_BYPASS, ResponseBuilder, RlsBypass, RlsConfig, RlsContext, RlsContextExtractor, SecurityScheme, createAuthorizer, getSecurityScheme, isBuiltInSecurityScheme } from "../Endpoint-BnxZqIX-.cjs";
6
- import { EndpointBuilder, EndpointFactory, createApiGatewayCookies, createApiGatewayHeaders, createHonoCookies, createHonoHeaders, createNoopCookies, createNoopHeaders, defaultEnvParser, envParserFor, publishConstructEvents } from "../index-7OcOWe75.cjs";
5
+ import { ActorExtractor, Authorizer, BUILT_IN_SECURITY_SCHEMES, BuiltInSecuritySchemeId, Endpoint, EndpointContext, EndpointHandler, EndpointOutput, EndpointSchemas, MappedAudit, OAuthFlow, OAuthFlows, RLS_BYPASS, ResponseBuilder, RlsBypass, RlsConfig, RlsContext, RlsContextExtractor, SecurityScheme, createAuthorizer, getSecurityScheme, isBuiltInSecurityScheme } from "../Endpoint-dav89W6-.cjs";
6
+ import { EndpointBuilder, EndpointFactory, createApiGatewayCookies, createApiGatewayHeaders, createHonoCookies, createHonoHeaders, createNoopCookies, createNoopHeaders, defaultEnvParser, envParserFor, publishConstructEvents } from "../index-Bd5FqCoe.cjs";
7
7
  export { ActorExtractor, Authorizer, BUILT_IN_SECURITY_SCHEMES, BuiltInSecuritySchemeId, Endpoint, EndpointBuilder, EndpointContext, EndpointFactory, EndpointHandler, EndpointOutput, EndpointSchemas, MappedAudit, OAuthFlow, OAuthFlows, RLS_BYPASS, ResponseBuilder, RlsBypass, RlsConfig, RlsContext, RlsContextExtractor, SecurityScheme, createApiGatewayCookies, createApiGatewayHeaders, createAuthorizer, createHonoCookies, createHonoHeaders, createNoopCookies, createNoopHeaders, defaultEnvParser, envParserFor, getSecurityScheme, isBuiltInSecurityScheme, publishConstructEvents };
@@ -1,7 +1,7 @@
1
- import "../Construct-B-xc0SE9.mjs";
2
- import "../index-CPeqtKgq.mjs";
3
- import "../construct-interface-BqwRNYA2.mjs";
1
+ import "../Construct-Ct8nalEi.mjs";
2
+ import "../index-_ajboYxK.mjs";
3
+ import "../construct-interface-g5GM5pwR.mjs";
4
4
  import "../types-aKksMEWL.mjs";
5
- import { ActorExtractor, Authorizer, BUILT_IN_SECURITY_SCHEMES, BuiltInSecuritySchemeId, Endpoint, EndpointContext, EndpointHandler, EndpointOutput, EndpointSchemas, MappedAudit, OAuthFlow, OAuthFlows, RLS_BYPASS, ResponseBuilder, RlsBypass, RlsConfig, RlsContext, RlsContextExtractor, SecurityScheme, createAuthorizer, getSecurityScheme, isBuiltInSecurityScheme } from "../Endpoint-ROcXU-eH.mjs";
6
- import { EndpointBuilder, EndpointFactory, createApiGatewayCookies, createApiGatewayHeaders, createHonoCookies, createHonoHeaders, createNoopCookies, createNoopHeaders, defaultEnvParser, envParserFor, publishConstructEvents } from "../index-Bt-F7u8L.mjs";
5
+ import { ActorExtractor, Authorizer, BUILT_IN_SECURITY_SCHEMES, BuiltInSecuritySchemeId, Endpoint, EndpointContext, EndpointHandler, EndpointOutput, EndpointSchemas, MappedAudit, OAuthFlow, OAuthFlows, RLS_BYPASS, ResponseBuilder, RlsBypass, RlsConfig, RlsContext, RlsContextExtractor, SecurityScheme, createAuthorizer, getSecurityScheme, isBuiltInSecurityScheme } from "../Endpoint-BjWKinFA.mjs";
6
+ import { EndpointBuilder, EndpointFactory, createApiGatewayCookies, createApiGatewayHeaders, createHonoCookies, createHonoHeaders, createNoopCookies, createNoopHeaders, defaultEnvParser, envParserFor, publishConstructEvents } from "../index-lAO9egTb.mjs";
7
7
  export { ActorExtractor, Authorizer, BUILT_IN_SECURITY_SCHEMES, BuiltInSecuritySchemeId, Endpoint, EndpointBuilder, EndpointContext, EndpointFactory, EndpointHandler, EndpointOutput, EndpointSchemas, MappedAudit, OAuthFlow, OAuthFlows, RLS_BYPASS, ResponseBuilder, RlsBypass, RlsConfig, RlsContext, RlsContextExtractor, SecurityScheme, createApiGatewayCookies, createApiGatewayHeaders, createAuthorizer, createHonoCookies, createHonoHeaders, createNoopCookies, createNoopHeaders, defaultEnvParser, envParserFor, getSecurityScheme, isBuiltInSecurityScheme, publishConstructEvents };
@@ -1,11 +1,10 @@
1
- import "../Construct-HmWM6YYu.mjs";
1
+ import "../Construct-BD5neF7w.mjs";
2
2
  import "../construct-interface-Z4CpS8tK.mjs";
3
- import "../functions-CvT_q7Y4.mjs";
4
- import { BUILT_IN_SECURITY_SCHEMES, EndpointBuilder, EndpointFactory, RLS_BYPASS, createAuthorizer, getSecurityScheme, isBuiltInSecurityScheme } from "../EndpointFactory-Di0X9AWp.mjs";
3
+ import "../functions-14lpEFL4.mjs";
4
+ import { BUILT_IN_SECURITY_SCHEMES, EndpointBuilder, EndpointFactory, RLS_BYPASS, createAuthorizer, getSecurityScheme, isBuiltInSecurityScheme } from "../EndpointFactory-CjV8F_lJ.mjs";
5
5
  import "../clone-DblgEZZa.mjs";
6
- import { Endpoint, ResponseBuilder } from "../Endpoint-BGwpNEX4.mjs";
6
+ import { Endpoint, ResponseBuilder } from "../Endpoint-DCQPMdUX.mjs";
7
7
  import { defaultEnvParser, envParserFor } from "../surfaceEnv-C3Ktahea.mjs";
8
- import { publishConstructEvents } from "../publisher-CGEo8UKD.mjs";
9
- import { createApiGatewayCookies, createApiGatewayHeaders, createHonoCookies, createHonoHeaders, createNoopCookies, createNoopHeaders } from "../lazyAccessors-DM6HcXQk.mjs";
8
+ import { createApiGatewayCookies, createApiGatewayHeaders, createHonoCookies, createHonoHeaders, createNoopCookies, createNoopHeaders, publishConstructEvents } from "../lazyAccessors-BoJN3SMd.mjs";
10
9
 
11
10
  export { BUILT_IN_SECURITY_SCHEMES, Endpoint, EndpointBuilder, EndpointFactory, RLS_BYPASS, ResponseBuilder, createApiGatewayCookies, createApiGatewayHeaders, createAuthorizer, createHonoCookies, createHonoHeaders, createNoopCookies, createNoopHeaders, defaultEnvParser, envParserFor, getSecurityScheme, isBuiltInSecurityScheme, publishConstructEvents };
@@ -1,4 +1,4 @@
1
- import { Construct, Declarable } from "./construct-interface-D2nNkHUN.cjs";
1
+ import { Construct, Declarable } from "./construct-interface-D9d4Gm4p.cjs";
2
2
  import { Service } from "@geekmidas/services";
3
3
  import { ConstructName, Declaration } from "@geekmidas/manifest";
4
4
  import { StorageClient } from "@geekmidas/storage";
@@ -1,4 +1,4 @@
1
- import { Construct, Declarable } from "./construct-interface-BqwRNYA2.mjs";
1
+ import { Construct, Declarable } from "./construct-interface-g5GM5pwR.mjs";
2
2
  import { ConstructName, Declaration } from "@geekmidas/manifest";
3
3
  import { StorageClient } from "@geekmidas/storage";
4
4
  import { Service } from "@geekmidas/services";
@@ -1,9 +1,8 @@
1
1
  require('../construct-interface-BfjcOD_E.cjs');
2
- require('../Construct-roId57cU.cjs');
3
- const require_functions = require('../functions-DukjG8ov.cjs');
2
+ require('../Construct-CyS3RpTL.cjs');
3
+ const require_functions = require('../functions-i_la-N5r.cjs');
4
4
  require('../clone-Dy0cR2SZ.cjs');
5
5
 
6
6
  exports.BaseFunctionBuilder = require_functions.BaseFunctionBuilder;
7
7
  exports.Function = require_functions.Function;
8
- exports.FunctionBuilder = require_functions.FunctionBuilder;
9
- exports.f = require_functions.f;
8
+ exports.FunctionBuilder = require_functions.FunctionBuilder;
@@ -1,4 +1,4 @@
1
- import "../Construct-WhCXIOPV.cjs";
2
- import { BaseFunctionBuilder, Function, FunctionBuilder, FunctionContext, FunctionHandler, f } from "../index-Dadljnh_.cjs";
3
- import "../construct-interface-D2nNkHUN.cjs";
4
- export { BaseFunctionBuilder, Function, FunctionBuilder, FunctionContext, FunctionHandler, f };
1
+ import "../Construct-C0ijr2qp.cjs";
2
+ import { BaseFunctionBuilder, Function, FunctionBuilder, FunctionContext, FunctionHandler } from "../index-D24Xm79M.cjs";
3
+ import "../construct-interface-D9d4Gm4p.cjs";
4
+ export { BaseFunctionBuilder, Function, FunctionBuilder, FunctionContext, FunctionHandler };