@depup/bun-types 1.3.11-depup.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (361) hide show
  1. package/CLAUDE.md +105 -0
  2. package/README.md +25 -0
  3. package/bun.d.ts +8712 -0
  4. package/bun.ns.d.ts +5 -0
  5. package/bundle.d.ts +74 -0
  6. package/changes.json +5 -0
  7. package/deprecated.d.ts +184 -0
  8. package/devserver.d.ts +187 -0
  9. package/docs/README.md +28 -0
  10. package/docs/bundler/bytecode.mdx +447 -0
  11. package/docs/bundler/css.mdx +1024 -0
  12. package/docs/bundler/esbuild.mdx +304 -0
  13. package/docs/bundler/executables.mdx +1318 -0
  14. package/docs/bundler/fullstack.mdx +1086 -0
  15. package/docs/bundler/hot-reloading.mdx +229 -0
  16. package/docs/bundler/html-static.mdx +498 -0
  17. package/docs/bundler/index.mdx +1840 -0
  18. package/docs/bundler/loaders.mdx +451 -0
  19. package/docs/bundler/macros.mdx +328 -0
  20. package/docs/bundler/minifier.mdx +1286 -0
  21. package/docs/bundler/plugins.mdx +477 -0
  22. package/docs/bundler/standalone-html.mdx +314 -0
  23. package/docs/feedback.mdx +75 -0
  24. package/docs/guides/binary/arraybuffer-to-array.mdx +29 -0
  25. package/docs/guides/binary/arraybuffer-to-blob.mdx +26 -0
  26. package/docs/guides/binary/arraybuffer-to-buffer.mdx +27 -0
  27. package/docs/guides/binary/arraybuffer-to-string.mdx +17 -0
  28. package/docs/guides/binary/arraybuffer-to-typedarray.mdx +41 -0
  29. package/docs/guides/binary/blob-to-arraybuffer.mdx +16 -0
  30. package/docs/guides/binary/blob-to-dataview.mdx +16 -0
  31. package/docs/guides/binary/blob-to-stream.mdx +16 -0
  32. package/docs/guides/binary/blob-to-string.mdx +17 -0
  33. package/docs/guides/binary/blob-to-typedarray.mdx +16 -0
  34. package/docs/guides/binary/buffer-to-arraybuffer.mdx +16 -0
  35. package/docs/guides/binary/buffer-to-blob.mdx +16 -0
  36. package/docs/guides/binary/buffer-to-readablestream.mdx +43 -0
  37. package/docs/guides/binary/buffer-to-string.mdx +27 -0
  38. package/docs/guides/binary/buffer-to-typedarray.mdx +16 -0
  39. package/docs/guides/binary/dataview-to-string.mdx +17 -0
  40. package/docs/guides/binary/typedarray-to-arraybuffer.mdx +27 -0
  41. package/docs/guides/binary/typedarray-to-blob.mdx +18 -0
  42. package/docs/guides/binary/typedarray-to-buffer.mdx +16 -0
  43. package/docs/guides/binary/typedarray-to-dataview.mdx +16 -0
  44. package/docs/guides/binary/typedarray-to-readablestream.mdx +43 -0
  45. package/docs/guides/binary/typedarray-to-string.mdx +18 -0
  46. package/docs/guides/deployment/aws-lambda.mdx +204 -0
  47. package/docs/guides/deployment/digital-ocean.mdx +161 -0
  48. package/docs/guides/deployment/google-cloud-run.mdx +194 -0
  49. package/docs/guides/deployment/railway.mdx +145 -0
  50. package/docs/guides/deployment/render.mdx +82 -0
  51. package/docs/guides/deployment/vercel.mdx +97 -0
  52. package/docs/guides/ecosystem/astro.mdx +82 -0
  53. package/docs/guides/ecosystem/discordjs.mdx +80 -0
  54. package/docs/guides/ecosystem/docker.mdx +151 -0
  55. package/docs/guides/ecosystem/drizzle.mdx +195 -0
  56. package/docs/guides/ecosystem/elysia.mdx +31 -0
  57. package/docs/guides/ecosystem/express.mdx +43 -0
  58. package/docs/guides/ecosystem/gel.mdx +261 -0
  59. package/docs/guides/ecosystem/hono.mdx +47 -0
  60. package/docs/guides/ecosystem/mongoose.mdx +92 -0
  61. package/docs/guides/ecosystem/neon-drizzle.mdx +234 -0
  62. package/docs/guides/ecosystem/neon-serverless-postgres.mdx +60 -0
  63. package/docs/guides/ecosystem/nextjs.mdx +103 -0
  64. package/docs/guides/ecosystem/nuxt.mdx +96 -0
  65. package/docs/guides/ecosystem/pm2.mdx +55 -0
  66. package/docs/guides/ecosystem/prisma-postgres.mdx +169 -0
  67. package/docs/guides/ecosystem/prisma.mdx +164 -0
  68. package/docs/guides/ecosystem/qwik.mdx +114 -0
  69. package/docs/guides/ecosystem/react.mdx +52 -0
  70. package/docs/guides/ecosystem/remix.mdx +97 -0
  71. package/docs/guides/ecosystem/sentry.mdx +54 -0
  72. package/docs/guides/ecosystem/solidstart.mdx +62 -0
  73. package/docs/guides/ecosystem/ssr-react.mdx +49 -0
  74. package/docs/guides/ecosystem/stric.mdx +54 -0
  75. package/docs/guides/ecosystem/sveltekit.mdx +138 -0
  76. package/docs/guides/ecosystem/systemd.mdx +114 -0
  77. package/docs/guides/ecosystem/tanstack-start.mdx +791 -0
  78. package/docs/guides/ecosystem/upstash.mdx +87 -0
  79. package/docs/guides/ecosystem/vite.mdx +77 -0
  80. package/docs/guides/html-rewriter/extract-links.mdx +71 -0
  81. package/docs/guides/html-rewriter/extract-social-meta.mdx +97 -0
  82. package/docs/guides/http/cluster.mdx +69 -0
  83. package/docs/guides/http/fetch-unix.mdx +35 -0
  84. package/docs/guides/http/fetch.mdx +26 -0
  85. package/docs/guides/http/file-uploads.mdx +97 -0
  86. package/docs/guides/http/hot.mdx +28 -0
  87. package/docs/guides/http/proxy.mdx +50 -0
  88. package/docs/guides/http/server.mdx +48 -0
  89. package/docs/guides/http/simple.mdx +20 -0
  90. package/docs/guides/http/sse.mdx +91 -0
  91. package/docs/guides/http/stream-file.mdx +50 -0
  92. package/docs/guides/http/stream-iterator.mdx +49 -0
  93. package/docs/guides/http/stream-node-streams-in-bun.mdx +22 -0
  94. package/docs/guides/http/tls.mdx +32 -0
  95. package/docs/guides/index.mdx +10 -0
  96. package/docs/guides/install/add-dev.mdx +28 -0
  97. package/docs/guides/install/add-git.mdx +40 -0
  98. package/docs/guides/install/add-optional.mdx +27 -0
  99. package/docs/guides/install/add-peer.mdx +45 -0
  100. package/docs/guides/install/add-tarball.mdx +35 -0
  101. package/docs/guides/install/add.mdx +44 -0
  102. package/docs/guides/install/azure-artifacts.mdx +76 -0
  103. package/docs/guides/install/cicd.mdx +43 -0
  104. package/docs/guides/install/custom-registry.mdx +32 -0
  105. package/docs/guides/install/from-npm-install-to-bun-install.mdx +230 -0
  106. package/docs/guides/install/git-diff-bun-lockfile.mdx +48 -0
  107. package/docs/guides/install/jfrog-artifactory.mdx +28 -0
  108. package/docs/guides/install/npm-alias.mdx +25 -0
  109. package/docs/guides/install/registry-scope.mdx +40 -0
  110. package/docs/guides/install/trusted.mdx +52 -0
  111. package/docs/guides/install/workspaces.mdx +70 -0
  112. package/docs/guides/install/yarnlock.mdx +51 -0
  113. package/docs/guides/process/argv.mdx +66 -0
  114. package/docs/guides/process/ctrl-c.mdx +18 -0
  115. package/docs/guides/process/ipc.mdx +69 -0
  116. package/docs/guides/process/nanoseconds.mdx +15 -0
  117. package/docs/guides/process/os-signals.mdx +31 -0
  118. package/docs/guides/process/spawn-stderr.mdx +34 -0
  119. package/docs/guides/process/spawn-stdout.mdx +28 -0
  120. package/docs/guides/process/spawn.mdx +43 -0
  121. package/docs/guides/process/stdin.mdx +62 -0
  122. package/docs/guides/read-file/arraybuffer.mdx +30 -0
  123. package/docs/guides/read-file/buffer.mdx +21 -0
  124. package/docs/guides/read-file/exists.mdx +18 -0
  125. package/docs/guides/read-file/json.mdx +19 -0
  126. package/docs/guides/read-file/mime.mdx +22 -0
  127. package/docs/guides/read-file/stream.mdx +28 -0
  128. package/docs/guides/read-file/string.mdx +24 -0
  129. package/docs/guides/read-file/uint8array.mdx +23 -0
  130. package/docs/guides/read-file/watch.mdx +66 -0
  131. package/docs/guides/runtime/build-time-constants.mdx +295 -0
  132. package/docs/guides/runtime/cicd.mdx +45 -0
  133. package/docs/guides/runtime/codesign-macos-executable.mdx +61 -0
  134. package/docs/guides/runtime/define-constant.mdx +149 -0
  135. package/docs/guides/runtime/delete-directory.mdx +39 -0
  136. package/docs/guides/runtime/delete-file.mdx +21 -0
  137. package/docs/guides/runtime/heap-snapshot.mdx +28 -0
  138. package/docs/guides/runtime/import-html.mdx +15 -0
  139. package/docs/guides/runtime/import-json.mdx +46 -0
  140. package/docs/guides/runtime/import-json5.mdx +74 -0
  141. package/docs/guides/runtime/import-toml.mdx +32 -0
  142. package/docs/guides/runtime/import-yaml.mdx +104 -0
  143. package/docs/guides/runtime/read-env.mdx +37 -0
  144. package/docs/guides/runtime/set-env.mdx +51 -0
  145. package/docs/guides/runtime/shell.mdx +42 -0
  146. package/docs/guides/runtime/timezone.mdx +38 -0
  147. package/docs/guides/runtime/tsconfig-paths.mdx +31 -0
  148. package/docs/guides/runtime/typescript.mdx +51 -0
  149. package/docs/guides/runtime/vscode-debugger.mdx +47 -0
  150. package/docs/guides/runtime/web-debugger.mdx +103 -0
  151. package/docs/guides/streams/node-readable-to-arraybuffer.mdx +13 -0
  152. package/docs/guides/streams/node-readable-to-blob.mdx +13 -0
  153. package/docs/guides/streams/node-readable-to-json.mdx +14 -0
  154. package/docs/guides/streams/node-readable-to-string.mdx +14 -0
  155. package/docs/guides/streams/node-readable-to-uint8array.mdx +13 -0
  156. package/docs/guides/streams/to-array.mdx +16 -0
  157. package/docs/guides/streams/to-arraybuffer.mdx +16 -0
  158. package/docs/guides/streams/to-blob.mdx +16 -0
  159. package/docs/guides/streams/to-buffer.mdx +17 -0
  160. package/docs/guides/streams/to-json.mdx +16 -0
  161. package/docs/guides/streams/to-string.mdx +16 -0
  162. package/docs/guides/streams/to-typedarray.mdx +24 -0
  163. package/docs/guides/test/bail.mdx +24 -0
  164. package/docs/guides/test/concurrent-test-glob.mdx +146 -0
  165. package/docs/guides/test/coverage-threshold.mdx +67 -0
  166. package/docs/guides/test/coverage.mdx +49 -0
  167. package/docs/guides/test/happy-dom.mdx +73 -0
  168. package/docs/guides/test/migrate-from-jest.mdx +125 -0
  169. package/docs/guides/test/mock-clock.mdx +50 -0
  170. package/docs/guides/test/mock-functions.mdx +70 -0
  171. package/docs/guides/test/rerun-each.mdx +16 -0
  172. package/docs/guides/test/run-tests.mdx +116 -0
  173. package/docs/guides/test/skip-tests.mdx +43 -0
  174. package/docs/guides/test/snapshot.mdx +102 -0
  175. package/docs/guides/test/spy-on.mdx +49 -0
  176. package/docs/guides/test/svelte-test.mdx +113 -0
  177. package/docs/guides/test/testing-library.mdx +93 -0
  178. package/docs/guides/test/timeout.mdx +17 -0
  179. package/docs/guides/test/todo-tests.mdx +74 -0
  180. package/docs/guides/test/update-snapshots.mdx +49 -0
  181. package/docs/guides/test/watch-mode.mdx +24 -0
  182. package/docs/guides/util/base64.mdx +17 -0
  183. package/docs/guides/util/deep-equals.mdx +41 -0
  184. package/docs/guides/util/deflate.mdx +20 -0
  185. package/docs/guides/util/detect-bun.mdx +28 -0
  186. package/docs/guides/util/entrypoint.mdx +19 -0
  187. package/docs/guides/util/escape-html.mdx +24 -0
  188. package/docs/guides/util/file-url-to-path.mdx +16 -0
  189. package/docs/guides/util/gzip.mdx +20 -0
  190. package/docs/guides/util/hash-a-password.mdx +56 -0
  191. package/docs/guides/util/import-meta-dir.mdx +15 -0
  192. package/docs/guides/util/import-meta-file.mdx +15 -0
  193. package/docs/guides/util/import-meta-path.mdx +15 -0
  194. package/docs/guides/util/javascript-uuid.mdx +25 -0
  195. package/docs/guides/util/main.mdx +43 -0
  196. package/docs/guides/util/path-to-file-url.mdx +16 -0
  197. package/docs/guides/util/sleep.mdx +24 -0
  198. package/docs/guides/util/upgrade.mdx +93 -0
  199. package/docs/guides/util/version.mdx +23 -0
  200. package/docs/guides/util/which-path-to-executable-bin.mdx +17 -0
  201. package/docs/guides/websocket/compression.mdx +33 -0
  202. package/docs/guides/websocket/context.mdx +79 -0
  203. package/docs/guides/websocket/pubsub.mdx +43 -0
  204. package/docs/guides/websocket/simple.mdx +38 -0
  205. package/docs/guides/write-file/append.mdx +54 -0
  206. package/docs/guides/write-file/basic.mdx +46 -0
  207. package/docs/guides/write-file/blob.mdx +30 -0
  208. package/docs/guides/write-file/cat.mdx +19 -0
  209. package/docs/guides/write-file/file-cp.mdx +18 -0
  210. package/docs/guides/write-file/filesink.mdx +54 -0
  211. package/docs/guides/write-file/response.mdx +19 -0
  212. package/docs/guides/write-file/stdout.mdx +23 -0
  213. package/docs/guides/write-file/stream.mdx +19 -0
  214. package/docs/guides/write-file/unlink.mdx +18 -0
  215. package/docs/index.mdx +133 -0
  216. package/docs/installation.mdx +372 -0
  217. package/docs/pm/bunx.mdx +91 -0
  218. package/docs/pm/catalogs.mdx +292 -0
  219. package/docs/pm/cli/add.mdx +179 -0
  220. package/docs/pm/cli/audit.mdx +60 -0
  221. package/docs/pm/cli/info.mdx +70 -0
  222. package/docs/pm/cli/install.mdx +591 -0
  223. package/docs/pm/cli/link.mdx +61 -0
  224. package/docs/pm/cli/outdated.mdx +197 -0
  225. package/docs/pm/cli/patch.mdx +69 -0
  226. package/docs/pm/cli/pm.mdx +323 -0
  227. package/docs/pm/cli/publish.mdx +131 -0
  228. package/docs/pm/cli/remove.mdx +16 -0
  229. package/docs/pm/cli/update.mdx +140 -0
  230. package/docs/pm/cli/why.mdx +84 -0
  231. package/docs/pm/filter.mdx +127 -0
  232. package/docs/pm/global-cache.mdx +72 -0
  233. package/docs/pm/isolated-installs.mdx +220 -0
  234. package/docs/pm/lifecycle.mdx +64 -0
  235. package/docs/pm/lockfile.mdx +64 -0
  236. package/docs/pm/npmrc.mdx +245 -0
  237. package/docs/pm/overrides.mdx +83 -0
  238. package/docs/pm/scopes-registries.mdx +35 -0
  239. package/docs/pm/security-scanner-api.mdx +95 -0
  240. package/docs/pm/workspaces.mdx +115 -0
  241. package/docs/project/benchmarking.mdx +296 -0
  242. package/docs/project/bindgen.mdx +223 -0
  243. package/docs/project/building-windows.mdx +143 -0
  244. package/docs/project/contributing.mdx +366 -0
  245. package/docs/project/feedback.mdx +20 -0
  246. package/docs/project/license.mdx +78 -0
  247. package/docs/project/roadmap.mdx +8 -0
  248. package/docs/quickstart.mdx +251 -0
  249. package/docs/runtime/archive.mdx +452 -0
  250. package/docs/runtime/auto-install.mdx +97 -0
  251. package/docs/runtime/binary-data.mdx +846 -0
  252. package/docs/runtime/bun-apis.mdx +60 -0
  253. package/docs/runtime/bunfig.mdx +765 -0
  254. package/docs/runtime/c-compiler.mdx +204 -0
  255. package/docs/runtime/child-process.mdx +659 -0
  256. package/docs/runtime/color.mdx +267 -0
  257. package/docs/runtime/console.mdx +67 -0
  258. package/docs/runtime/cookies.mdx +454 -0
  259. package/docs/runtime/cron.mdx +358 -0
  260. package/docs/runtime/csrf.mdx +171 -0
  261. package/docs/runtime/debugger.mdx +335 -0
  262. package/docs/runtime/environment-variables.mdx +231 -0
  263. package/docs/runtime/ffi.mdx +567 -0
  264. package/docs/runtime/file-io.mdx +306 -0
  265. package/docs/runtime/file-system-router.mdx +118 -0
  266. package/docs/runtime/file-types.mdx +482 -0
  267. package/docs/runtime/glob.mdx +181 -0
  268. package/docs/runtime/globals.mdx +72 -0
  269. package/docs/runtime/hashing.mdx +315 -0
  270. package/docs/runtime/html-rewriter.mdx +333 -0
  271. package/docs/runtime/http/cookies.mdx +79 -0
  272. package/docs/runtime/http/error-handling.mdx +40 -0
  273. package/docs/runtime/http/metrics.mdx +36 -0
  274. package/docs/runtime/http/routing.mdx +289 -0
  275. package/docs/runtime/http/server.mdx +672 -0
  276. package/docs/runtime/http/tls.mdx +101 -0
  277. package/docs/runtime/http/websockets.mdx +414 -0
  278. package/docs/runtime/index.mdx +223 -0
  279. package/docs/runtime/json5.mdx +271 -0
  280. package/docs/runtime/jsonl.mdx +188 -0
  281. package/docs/runtime/jsx.mdx +115 -0
  282. package/docs/runtime/markdown.mdx +381 -0
  283. package/docs/runtime/module-resolution.mdx +374 -0
  284. package/docs/runtime/networking/dns.mdx +111 -0
  285. package/docs/runtime/networking/fetch.mdx +484 -0
  286. package/docs/runtime/networking/tcp.mdx +239 -0
  287. package/docs/runtime/networking/udp.mdx +180 -0
  288. package/docs/runtime/node-api.mdx +19 -0
  289. package/docs/runtime/nodejs-compat.mdx +468 -0
  290. package/docs/runtime/plugins.mdx +419 -0
  291. package/docs/runtime/redis.mdx +583 -0
  292. package/docs/runtime/repl.mdx +176 -0
  293. package/docs/runtime/s3.mdx +881 -0
  294. package/docs/runtime/secrets.mdx +340 -0
  295. package/docs/runtime/semver.mdx +57 -0
  296. package/docs/runtime/shell.mdx +637 -0
  297. package/docs/runtime/sql.mdx +1404 -0
  298. package/docs/runtime/sqlite.mdx +721 -0
  299. package/docs/runtime/streams.mdx +232 -0
  300. package/docs/runtime/templating/create.mdx +269 -0
  301. package/docs/runtime/templating/init.mdx +58 -0
  302. package/docs/runtime/toml.mdx +238 -0
  303. package/docs/runtime/transpiler.mdx +288 -0
  304. package/docs/runtime/typescript.mdx +58 -0
  305. package/docs/runtime/utils.mdx +1010 -0
  306. package/docs/runtime/watch-mode.mdx +161 -0
  307. package/docs/runtime/web-apis.mdx +29 -0
  308. package/docs/runtime/workers.mdx +314 -0
  309. package/docs/runtime/yaml.mdx +470 -0
  310. package/docs/snippets/cli/add.mdx +166 -0
  311. package/docs/snippets/cli/build.mdx +197 -0
  312. package/docs/snippets/cli/bunx.mdx +49 -0
  313. package/docs/snippets/cli/feedback.mdx +17 -0
  314. package/docs/snippets/cli/init.mdx +84 -0
  315. package/docs/snippets/cli/install.mdx +173 -0
  316. package/docs/snippets/cli/link.mdx +163 -0
  317. package/docs/snippets/cli/outdated.mdx +140 -0
  318. package/docs/snippets/cli/patch.mdx +171 -0
  319. package/docs/snippets/cli/publish.mdx +198 -0
  320. package/docs/snippets/cli/remove.mdx +146 -0
  321. package/docs/snippets/cli/run.mdx +305 -0
  322. package/docs/snippets/cli/test.mdx +105 -0
  323. package/docs/snippets/cli/update.mdx +144 -0
  324. package/docs/test/code-coverage.mdx +409 -0
  325. package/docs/test/configuration.mdx +574 -0
  326. package/docs/test/dates-times.mdx +129 -0
  327. package/docs/test/discovery.mdx +90 -0
  328. package/docs/test/dom.mdx +226 -0
  329. package/docs/test/index.mdx +409 -0
  330. package/docs/test/lifecycle.mdx +366 -0
  331. package/docs/test/mocks.mdx +637 -0
  332. package/docs/test/reporters.mdx +126 -0
  333. package/docs/test/runtime-behavior.mdx +342 -0
  334. package/docs/test/snapshots.mdx +434 -0
  335. package/docs/test/writing-tests.mdx +672 -0
  336. package/docs/typescript.mdx +54 -0
  337. package/extensions.d.ts +40 -0
  338. package/fetch.d.ts +79 -0
  339. package/ffi.d.ts +1154 -0
  340. package/globals.d.ts +2067 -0
  341. package/html-rewriter.d.ts +186 -0
  342. package/index.d.ts +32 -0
  343. package/jsc.d.ts +233 -0
  344. package/jsx.d.ts +11 -0
  345. package/overrides.d.ts +376 -0
  346. package/package.json +53 -0
  347. package/redis.d.ts +3352 -0
  348. package/s3.d.ts +1354 -0
  349. package/security.d.ts +101 -0
  350. package/serve.d.ts +1296 -0
  351. package/shell.d.ts +380 -0
  352. package/sql.d.ts +887 -0
  353. package/sqlite.d.ts +1322 -0
  354. package/test-globals.d.ts +22 -0
  355. package/test.d.ts +2392 -0
  356. package/vendor/expect-type/branding.d.ts +283 -0
  357. package/vendor/expect-type/index.d.ts +1207 -0
  358. package/vendor/expect-type/messages.d.ts +395 -0
  359. package/vendor/expect-type/overloads.d.ts +669 -0
  360. package/vendor/expect-type/utils.d.ts +431 -0
  361. package/wasm.d.ts +193 -0
@@ -0,0 +1,358 @@
1
+ ---
2
+ title: Cron
3
+ description: Schedule and parse cron jobs with Bun
4
+ ---
5
+
6
+ Bun has built-in support for registering OS-level cron jobs and parsing cron expressions.
7
+
8
+ ## Quickstart
9
+
10
+ **Parse a cron expression to find the next matching time:**
11
+
12
+ ```ts
13
+ // Next weekday at 9:30 AM UTC
14
+ const next = Bun.cron.parse("30 9 * * MON-FRI");
15
+ console.log(next); // => 2025-01-20T09:30:00.000Z
16
+ ```
17
+
18
+ **Register a cron job that runs a script on a schedule:**
19
+
20
+ ```ts
21
+ await Bun.cron("./worker.ts", "30 2 * * MON", "weekly-report");
22
+ ```
23
+
24
+ ---
25
+
26
+ ## `Bun.cron.parse()`
27
+
28
+ Parse a cron expression and return the next matching UTC `Date`.
29
+
30
+ ```ts
31
+ const next = Bun.cron.parse("*/15 * * * *");
32
+ console.log(next); // => next quarter-hour boundary
33
+ ```
34
+
35
+ ### Parameters
36
+
37
+ | Parameter | Type | Description |
38
+ | -------------- | ---------------- | -------------------------------------------------------- |
39
+ | `expression` | `string` | A 5-field cron expression or predefined nickname |
40
+ | `relativeDate` | `Date \| number` | Starting point for the search (defaults to `Date.now()`) |
41
+
42
+ ### Returns
43
+
44
+ `Date | null` — the next matching UTC time, or `null` if no match exists within ~4 years (e.g. February 30th).
45
+
46
+ ### Chaining calls
47
+
48
+ Call `parse()` repeatedly to get a sequence of upcoming times:
49
+
50
+ ```ts
51
+ const from = Date.UTC(2025, 0, 15, 10, 0, 0);
52
+
53
+ const first = Bun.cron.parse("0 * * * *", from);
54
+ console.log(first); // => 2025-01-15T11:00:00.000Z
55
+
56
+ const second = Bun.cron.parse("0 * * * *", first);
57
+ console.log(second); // => 2025-01-15T12:00:00.000Z
58
+ ```
59
+
60
+ ---
61
+
62
+ ## Cron expression syntax
63
+
64
+ Standard 5-field format: `minute hour day-of-month month day-of-week`
65
+
66
+ | Field | Values | Special characters |
67
+ | ------------ | ----------------------- | ------------------ |
68
+ | Minute | `0`–`59` | `*` `,` `-` `/` |
69
+ | Hour | `0`–`23` | `*` `,` `-` `/` |
70
+ | Day of month | `1`–`31` | `*` `,` `-` `/` |
71
+ | Month | `1`–`12` or `JAN`–`DEC` | `*` `,` `-` `/` |
72
+ | Day of week | `0`–`7` or `SUN`–`SAT` | `*` `,` `-` `/` |
73
+
74
+ ### Special characters
75
+
76
+ | Character | Description | Example |
77
+ | --------- | ----------- | ------------------------------------- |
78
+ | `*` | All values | `* * * * *` — every minute |
79
+ | `,` | List | `1,15 * * * *` — minute 1 and 15 |
80
+ | `-` | Range | `9-17 * * * *` — minutes 9 through 17 |
81
+ | `/` | Step | `*/15 * * * *` — every 15 minutes |
82
+
83
+ ### Named values
84
+
85
+ Month and weekday fields accept case-insensitive names:
86
+
87
+ ```ts
88
+ // 3-letter abbreviations
89
+ Bun.cron.parse("0 9 * * MON-FRI"); // weekdays
90
+ Bun.cron.parse("0 0 1 JAN,JUN *"); // January and June
91
+
92
+ // Full names
93
+ Bun.cron.parse("0 9 * * Monday-Friday");
94
+ Bun.cron.parse("0 0 1 January *");
95
+ ```
96
+
97
+ Both `0` and `7` mean Sunday in the weekday field.
98
+
99
+ ### Predefined nicknames
100
+
101
+ | Nickname | Equivalent | Description |
102
+ | ----------------------- | ----------- | ------------------------- |
103
+ | `@yearly` / `@annually` | `0 0 1 1 *` | Once a year (January 1st) |
104
+ | `@monthly` | `0 0 1 * *` | Once a month (1st day) |
105
+ | `@weekly` | `0 0 * * 0` | Once a week (Sunday) |
106
+ | `@daily` / `@midnight` | `0 0 * * *` | Once a day (midnight) |
107
+ | `@hourly` | `0 * * * *` | Once an hour |
108
+
109
+ ```ts
110
+ const next = Bun.cron.parse("@daily");
111
+ console.log(next); // => next midnight UTC
112
+ ```
113
+
114
+ ### Day-of-month and day-of-week interaction
115
+
116
+ When **both** day-of-month and day-of-week are specified (neither is `*`), the expression matches when **either** condition is true. This follows the [POSIX cron](https://pubs.opengroup.org/onlinepubs/9699919799/utilities/crontab.html) standard.
117
+
118
+ ```ts
119
+ // Fires on the 15th of every month OR every Friday
120
+ Bun.cron.parse("0 0 15 * FRI");
121
+ ```
122
+
123
+ When only one is specified (the other is `*`), only that field is used for matching.
124
+
125
+ ---
126
+
127
+ ## `Bun.cron()`
128
+
129
+ Register an OS-level cron job that runs a JavaScript/TypeScript module on a schedule.
130
+
131
+ ```ts
132
+ await Bun.cron("./worker.ts", "30 2 * * MON", "weekly-report");
133
+ ```
134
+
135
+ ### Parameters
136
+
137
+ | Parameter | Type | Description |
138
+ | ---------- | -------- | ---------------------------------------------------------- |
139
+ | `path` | `string` | Path to the script (resolved relative to caller) |
140
+ | `schedule` | `string` | Cron expression or nickname |
141
+ | `title` | `string` | Unique job identifier (alphanumeric, hyphens, underscores) |
142
+
143
+ Re-registering with the same `title` overwrites the existing job in-place — the old schedule is replaced, not duplicated.
144
+
145
+ ```ts
146
+ await Bun.cron("./worker.ts", "0 * * * *", "my-job"); // every hour
147
+ await Bun.cron("./worker.ts", "*/15 * * * *", "my-job"); // replaces: every 15 min
148
+ ```
149
+
150
+ ### The `scheduled()` handler
151
+
152
+ The registered script must export a default object with a `scheduled()` method, following the [Cloudflare Workers Cron Triggers API](https://developers.cloudflare.com/workers/runtime-apis/handlers/scheduled/):
153
+
154
+ ```ts worker.ts
155
+ export default {
156
+ scheduled(controller: Bun.CronController) {
157
+ console.log(controller.cron); // "30 2 * * 1"
158
+ console.log(controller.type); // "scheduled"
159
+ console.log(controller.scheduledTime); // 1737340201847 (Date.now() at invocation)
160
+ },
161
+ };
162
+ ```
163
+
164
+ The handler can be `async`. Bun waits for the returned promise to settle before exiting.
165
+
166
+ ---
167
+
168
+ ## How it works per platform
169
+
170
+ ### Linux
171
+
172
+ Bun uses [crontab](https://man7.org/linux/man-pages/man5/crontab.5.html) to register jobs. Each job is stored as a line in your user's crontab with a `# bun-cron: <title>` marker comment above it.
173
+
174
+ The crontab entry looks like:
175
+
176
+ ```
177
+ <schedule> '<bun-path>' run --cron-title=<title> --cron-period='<schedule>' '<script-path>'
178
+ ```
179
+
180
+ When the cron daemon fires the job, Bun imports your module and calls the `scheduled()` handler.
181
+
182
+ **Viewing registered jobs:**
183
+
184
+ ```sh
185
+ crontab -l
186
+ ```
187
+
188
+ **Logs:** On Linux, cron output goes to the system log. Check with:
189
+
190
+ ```sh
191
+ # systemd-based (Ubuntu, Fedora, Arch, etc.)
192
+ journalctl -u cron # or crond on some distros
193
+ journalctl -u cron --since "1 hour ago"
194
+
195
+ # syslog-based (older systems)
196
+ grep CRON /var/log/syslog
197
+ ```
198
+
199
+ To capture stdout/stderr to a file, redirect output in the crontab entry directly, or add logging inside your `scheduled()` handler.
200
+
201
+ **Manually uninstalling without code:**
202
+
203
+ ```sh
204
+ # Edit your crontab and remove the "# bun-cron: <title>" comment
205
+ # and the command line below it
206
+ crontab -e
207
+
208
+ # Or remove ALL bun cron jobs at once by filtering them out:
209
+ crontab -l | grep -v "# bun-cron:" | grep -v "\-\-cron-title=" | crontab -
210
+ ```
211
+
212
+ ### macOS
213
+
214
+ Bun uses [launchd](https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLaunchdJobs.html) to register jobs. Each job is installed as a plist file at:
215
+
216
+ ```
217
+ ~/Library/LaunchAgents/bun.cron.<title>.plist
218
+ ```
219
+
220
+ The plist uses `StartCalendarInterval` to define the schedule. Complex patterns with ranges, lists, or steps are supported — Bun expands them into multiple `StartCalendarInterval` dicts via Cartesian product.
221
+
222
+ **Viewing registered jobs:**
223
+
224
+ ```sh
225
+ launchctl list | grep bun.cron
226
+ ```
227
+
228
+ **Logs:** stdout and stderr are written to:
229
+
230
+ ```
231
+ /tmp/bun.cron.<title>.stdout.log
232
+ /tmp/bun.cron.<title>.stderr.log
233
+ ```
234
+
235
+ For example, a job titled `weekly-report`:
236
+
237
+ ```sh
238
+ cat /tmp/bun.cron.weekly-report.stdout.log
239
+ tail -f /tmp/bun.cron.weekly-report.stderr.log
240
+ ```
241
+
242
+ **Manually uninstalling without code:**
243
+
244
+ ```sh
245
+ # Unload the job from launchd
246
+ launchctl bootout gui/$(id -u)/bun.cron.<title>
247
+
248
+ # Delete the plist file
249
+ rm ~/Library/LaunchAgents/bun.cron.<title>.plist
250
+
251
+ # Example for a job titled "weekly-report":
252
+ launchctl bootout gui/$(id -u)/bun.cron.weekly-report
253
+ rm ~/Library/LaunchAgents/bun.cron.weekly-report.plist
254
+ ```
255
+
256
+ ### Windows
257
+
258
+ Bun uses [Windows Task Scheduler](https://learn.microsoft.com/en-us/windows/win32/taskschd/task-scheduler-start-page) with XML-based task definitions. Each job is registered as a scheduled task named `bun-cron-<title>` using [`CalendarTrigger`](https://learn.microsoft.com/en-us/windows/win32/taskschd/taskschedulerschema-calendartrigger-triggergroup-element) elements and [`Repetition`](https://learn.microsoft.com/en-us/windows/win32/taskschd/taskschedulerschema-repetition-triggerbasetype-element) patterns.
259
+
260
+ Most cron expressions are fully supported, including `@daily`, `@weekly`, `@monthly`, `@yearly`, ranges (`1-5`), lists (`1,15`), named days/months, and day-of-month patterns.
261
+
262
+ #### User context
263
+
264
+ Tasks are registered using [`S4U` (Service-for-User)](https://learn.microsoft.com/en-us/windows/win32/taskschd/taskschedulerschema-logontype-simpletype) logon type, which runs jobs as the registering user even when not logged in — matching Linux `crontab` behavior. No password is stored.
265
+
266
+ TCP/IP networking (`fetch()`, HTTP, WebSocket, database connections) works normally. The only restriction is that S4U tasks cannot access [Windows-authenticated network resources](https://learn.microsoft.com/en-us/windows/win32/taskschd/security-contexts-for-running-tasks) (SMB file shares, mapped drives, Kerberos/NTLM services).
267
+
268
+ On headless servers and CI environments where the current user's [Security Identifier (SID)](https://learn.microsoft.com/en-us/windows/security/identity-protection/access-control/security-identifiers) cannot be resolved — such as service accounts created by [NSSM](https://nssm.cc/) or similar tools — `Bun.cron()` will fail with an error explaining the issue. To work around this, either run Bun as a regular user account, or create the scheduled task manually with `schtasks /create /xml <file> /tn <name> /ru SYSTEM /f`.
269
+
270
+ #### Trigger limit
271
+
272
+ :::caution
273
+ Windows Task Scheduler enforces a limit of [48 triggers per task](https://learn.microsoft.com/en-us/windows/win32/taskschd/taskschedulerschema-triggers-tasktype-element) (the `CalendarTrigger` element has [`maxOccurs="48"`](https://learn.microsoft.com/en-us/windows/win32/taskschd/taskschedulerschema-calendartrigger-triggergroup-element)). Some cron expressions that work on Linux and macOS exceed this limit on Windows.
274
+
275
+ **Expressions that work on all platforms:**
276
+
277
+ | Pattern | Trigger strategy | Count |
278
+ | ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | ----- |
279
+ | `*/5 * * * *` | Single trigger with [`Repetition`](https://learn.microsoft.com/en-us/windows/win32/taskschd/taskschedulerschema-repetition-triggerbasetype-element) (PT5M) | 1 |
280
+ | `*/15 * * * *` | Single trigger with Repetition (PT15M) | 1 |
281
+ | `0 9 * * MON-FRI` | One `CalendarTrigger` per weekday | 5 |
282
+ | `0,30 9-17 * * *` | 2 minutes × 9 hours | 18 |
283
+ | `@daily`, `@weekly`, `@monthly`, `@yearly` | Single trigger | 1 |
284
+
285
+ **Expressions that fail on Windows** (but work on Linux and macOS):
286
+
287
+ | Pattern | Why | Trigger count |
288
+ | ----------------- | --------------------------------------------- | ------------- |
289
+ | `*/7 * * * *` | 9 minute values × 24 hours | 216 |
290
+ | `*/8 * * * *` | 8 minute values × 24 hours | 192 |
291
+ | `*/9 * * * *` | 7 minute values × 24 hours | 168 |
292
+ | `*/11 * * * *` | 6 minute values × 24 hours | 144 |
293
+ | `*/13 * * * *` | 5 minute values × 24 hours | 120 |
294
+ | `*/15 * * 6 *` | Month restriction prevents Repetition: 4 × 24 | 96 |
295
+ | `0,30 * 15 * FRI` | OR-split doubles triggers: 2 × 24 × 2 | 96 |
296
+
297
+ The key factor is whether the expression can use a [`Repetition`](https://learn.microsoft.com/en-us/windows/win32/taskschd/taskschedulerschema-repetition-triggerbasetype-element) interval (single trigger) or must expand to individual `CalendarTrigger` elements. Minute steps that **evenly divide 60** (`*/1`, `*/2`, `*/3`, `*/4`, `*/5`, `*/6`, `*/10`, `*/12`, `*/15`, `*/20`, `*/30`) use Repetition and work regardless of other fields. Steps that don't divide 60 (`*/7`, `*/8`, `*/9`, `*/11`, `*/13`, etc.) must be expanded, and with 24 hours active, the count quickly exceeds 48.
298
+
299
+ When a pattern exceeds the limit, `Bun.cron()` rejects it with an error message. To work around it, simplify the expression or restrict the hour range:
300
+
301
+ ```ts
302
+ // ❌ Fails on Windows: */7 with all hours = 216 triggers
303
+ await Bun.cron("./job.ts", "*/7 * * * *", "my-job");
304
+
305
+ // ✅ Works: restrict to specific hours (9 values × 5 hours = 45 triggers)
306
+ await Bun.cron("./job.ts", "*/7 9-13 * * *", "my-job");
307
+
308
+ // ✅ Works: use a divisor of 60 instead (Repetition, 1 trigger)
309
+ await Bun.cron("./job.ts", "*/5 * * * *", "my-job");
310
+ ```
311
+
312
+ :::
313
+
314
+ #### Windows containers
315
+
316
+ :::caution
317
+ `Bun.cron()` is not supported in Windows Docker containers. The Task Scheduler service is not running in `servercore` or `nanoserver` images. Use an in-process scheduler for containerized workloads.
318
+ :::
319
+
320
+ **Viewing registered jobs:**
321
+
322
+ ```powershell
323
+ schtasks /query /tn "bun-cron-<title>"
324
+
325
+ # List all bun cron tasks
326
+ schtasks /query | findstr "bun-cron-"
327
+ ```
328
+
329
+ **Manually uninstalling without code:**
330
+
331
+ ```powershell
332
+ schtasks /delete /tn "bun-cron-<title>" /f
333
+
334
+ # Example:
335
+ schtasks /delete /tn "bun-cron-weekly-report" /f
336
+ ```
337
+
338
+ Or open **Task Scheduler** (taskschd.msc), find the task named `bun-cron-<title>`, right-click, and delete it.
339
+
340
+ ---
341
+
342
+ ## `Bun.cron.remove()`
343
+
344
+ Remove a previously registered cron job by its title. Works on all platforms.
345
+
346
+ ```ts
347
+ await Bun.cron.remove("weekly-report");
348
+ ```
349
+
350
+ This reverses what `Bun.cron()` did:
351
+
352
+ | Platform | What `remove()` does |
353
+ | -------- | -------------------------------------------------------- |
354
+ | Linux | Edits crontab to remove the entry and its marker comment |
355
+ | macOS | Runs `launchctl bootout` and deletes the plist file |
356
+ | Windows | Runs `schtasks /delete` to remove the scheduled task |
357
+
358
+ Removing a job that doesn't exist resolves without error.
@@ -0,0 +1,171 @@
1
+ ---
2
+ title: CSRF Protection
3
+ description: Generate and verify CSRF tokens with Bun's built-in API
4
+ ---
5
+
6
+ Bun provides a built-in API for generating and verifying [CSRF (Cross-Site Request Forgery)](https://owasp.org/www-community/attacks/csrf) tokens through `Bun.CSRF`. Tokens are signed with HMAC and include expiration timestamps to limit the token validity window.
7
+
8
+ ```ts title="csrf.ts" icon="/icons/typescript.svg"
9
+ // Generate a token
10
+ const token = Bun.CSRF.generate("my-secret");
11
+
12
+ // Verify it
13
+ const isValid = Bun.CSRF.verify(token, { secret: "my-secret" });
14
+ console.log(isValid); // true
15
+ ```
16
+
17
+ ---
18
+
19
+ ## `Bun.CSRF.generate()`
20
+
21
+ Generate a CSRF token. The token contains a cryptographic nonce, a timestamp, and an HMAC signature, encoded as a string.
22
+
23
+ ```ts title="generate.ts" icon="/icons/typescript.svg"
24
+ const token = Bun.CSRF.generate("my-secret-key");
25
+ ```
26
+
27
+ **Parameters:**
28
+
29
+ - `secret` (string, optional) — The secret key used to sign the token. If not provided, Bun generates a random in-memory default secret (unique per thread).
30
+ - `options` (object, optional):
31
+
32
+ | Option | Type | Default | Description |
33
+ | ----------- | -------- | ------------- | ------------------------------------------------------------------------------------------------------ |
34
+ | `expiresIn` | `number` | `86400000` | Milliseconds until the token expires. Defaults to 24 hours. |
35
+ | `encoding` | `string` | `"base64url"` | Token encoding format: `"base64"`, `"base64url"`, or `"hex"`. |
36
+ | `algorithm` | `string` | `"sha256"` | HMAC algorithm: `"sha256"`, `"sha384"`, `"sha512"`, `"sha512-256"`, `"blake2b256"`, or `"blake2b512"`. |
37
+
38
+ **Returns:** `string` — the encoded token.
39
+
40
+ ```ts title="generate-options.ts" icon="/icons/typescript.svg"
41
+ // Token that expires in 1 hour, encoded as hex
42
+ const token = Bun.CSRF.generate("my-secret", {
43
+ expiresIn: 60 * 60 * 1000,
44
+ encoding: "hex",
45
+ });
46
+
47
+ // Using a different algorithm
48
+ const token2 = Bun.CSRF.generate("my-secret", {
49
+ algorithm: "sha512",
50
+ });
51
+ ```
52
+
53
+ ---
54
+
55
+ ## `Bun.CSRF.verify()`
56
+
57
+ Verify a CSRF token. Returns `true` if the token is valid and has not expired, `false` otherwise.
58
+
59
+ ```ts title="verify.ts" icon="/icons/typescript.svg"
60
+ const isValid = Bun.CSRF.verify(token, { secret: "my-secret-key" });
61
+ ```
62
+
63
+ **Parameters:**
64
+
65
+ - `token` (string, required) — The token to verify.
66
+ - `options` (object, optional):
67
+
68
+ | Option | Type | Default | Description |
69
+ | ----------- | -------- | ------------- | ---------------------------------------------------------------------------------------------------- |
70
+ | `secret` | `string` | (auto) | The secret used to sign the token. If not provided, uses the same in-memory default as `generate()`. |
71
+ | `maxAge` | `number` | `86400000` | Maximum token age in milliseconds, independent of the token's own `expiresIn`. |
72
+ | `encoding` | `string` | `"base64url"` | Must match the encoding used during `generate()`. |
73
+ | `algorithm` | `string` | `"sha256"` | Must match the algorithm used during `generate()`. |
74
+
75
+ **Returns:** `boolean`
76
+
77
+ ```ts title="verify-options.ts" icon="/icons/typescript.svg"
78
+ // Verify a hex-encoded token
79
+ const isValid = Bun.CSRF.verify(hexToken, {
80
+ secret: "my-secret",
81
+ encoding: "hex",
82
+ });
83
+
84
+ // Enforce a shorter max age than what the token was generated with
85
+ const isValid2 = Bun.CSRF.verify(token, {
86
+ secret: "my-secret",
87
+ maxAge: 60 * 1000, // reject tokens older than 1 minute
88
+ });
89
+ ```
90
+
91
+ ---
92
+
93
+ ## Using with `Bun.serve()`
94
+
95
+ A typical pattern is to generate a token when rendering a form, embed it in a hidden field, and verify it when the form is submitted.
96
+
97
+ ```ts title="server.ts" icon="/icons/typescript.svg"
98
+ const SECRET = process.env.CSRF_SECRET || "my-secret";
99
+
100
+ const server = Bun.serve({
101
+ routes: {
102
+ "/form": () => {
103
+ const token = Bun.CSRF.generate(SECRET);
104
+
105
+ return new Response(
106
+ `<form method="POST" action="/submit">
107
+ <input type="hidden" name="_csrf" value="${token}" />
108
+ <input type="text" name="message" />
109
+ <button type="submit">Send</button>
110
+ </form>`,
111
+ { headers: { "Content-Type": "text/html" } },
112
+ );
113
+ },
114
+
115
+ "/submit": {
116
+ POST: async req => {
117
+ const formData = await req.formData();
118
+ const csrfToken = formData.get("_csrf");
119
+
120
+ if (typeof csrfToken !== "string" || !Bun.CSRF.verify(csrfToken, { secret: SECRET })) {
121
+ return new Response("Invalid CSRF token", { status: 403 });
122
+ }
123
+
124
+ return new Response("OK");
125
+ },
126
+ },
127
+ },
128
+ });
129
+
130
+ console.log(`Listening on ${server.url}`);
131
+ ```
132
+
133
+ ---
134
+
135
+ ## Default secret
136
+
137
+ If you omit the `secret` parameter in both `generate()` and `verify()`, Bun uses a random secret generated once per thread. This is convenient for single-thread applications but won't work across multiple servers, workers, or after a restart.
138
+
139
+ ```ts title="default-secret.ts" icon="/icons/typescript.svg"
140
+ // Both calls use the same per-thread default secret within this runtime context.
141
+ const token = Bun.CSRF.generate();
142
+ const isValid = Bun.CSRF.verify(token); // true
143
+ ```
144
+
145
+ For production use, always provide an explicit secret shared across your infrastructure.
146
+
147
+ ---
148
+
149
+ ## TypeScript
150
+
151
+ ```ts title="types.ts" icon="/icons/typescript.svg"
152
+ type CSRFAlgorithm = "blake2b256" | "blake2b512" | "sha256" | "sha384" | "sha512" | "sha512-256";
153
+
154
+ interface CSRFGenerateOptions {
155
+ expiresIn?: number;
156
+ encoding?: "base64" | "base64url" | "hex";
157
+ algorithm?: CSRFAlgorithm;
158
+ }
159
+
160
+ interface CSRFVerifyOptions {
161
+ secret?: string;
162
+ encoding?: "base64" | "base64url" | "hex";
163
+ algorithm?: CSRFAlgorithm;
164
+ maxAge?: number;
165
+ }
166
+
167
+ namespace Bun.CSRF {
168
+ function generate(secret?: string, options?: CSRFGenerateOptions): string;
169
+ function verify(token: string, options?: CSRFVerifyOptions): boolean;
170
+ }
171
+ ```