workerstack 0.1.0-beta.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 (605) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/LICENSE +21 -0
  3. package/README.md +138 -0
  4. package/dist/access.d.ts +131 -0
  5. package/dist/access.d.ts.map +1 -0
  6. package/dist/access.js +333 -0
  7. package/dist/access.js.map +1 -0
  8. package/dist/api/builder.d.ts +457 -0
  9. package/dist/api/builder.d.ts.map +1 -0
  10. package/dist/api/builder.js +45 -0
  11. package/dist/api/builder.js.map +1 -0
  12. package/dist/api/catalog.d.ts +8 -0
  13. package/dist/api/catalog.d.ts.map +1 -0
  14. package/dist/api/catalog.js +56 -0
  15. package/dist/api/catalog.js.map +1 -0
  16. package/dist/api/context.d.ts +47 -0
  17. package/dist/api/context.d.ts.map +1 -0
  18. package/dist/api/context.js +40 -0
  19. package/dist/api/context.js.map +1 -0
  20. package/dist/api/crud-router.d.ts +476 -0
  21. package/dist/api/crud-router.d.ts.map +1 -0
  22. package/dist/api/crud-router.js +354 -0
  23. package/dist/api/crud-router.js.map +1 -0
  24. package/dist/api/list-input-schema.d.ts +37 -0
  25. package/dist/api/list-input-schema.d.ts.map +1 -0
  26. package/dist/api/list-input-schema.js +63 -0
  27. package/dist/api/list-input-schema.js.map +1 -0
  28. package/dist/api/list-spec.d.ts +44 -0
  29. package/dist/api/list-spec.d.ts.map +1 -0
  30. package/dist/api/list-spec.js +49 -0
  31. package/dist/api/list-spec.js.map +1 -0
  32. package/dist/api/live-view.d.ts +14 -0
  33. package/dist/api/live-view.d.ts.map +1 -0
  34. package/dist/api/live-view.js +42 -0
  35. package/dist/api/live-view.js.map +1 -0
  36. package/dist/api/live-window.d.ts +40 -0
  37. package/dist/api/live-window.d.ts.map +1 -0
  38. package/dist/api/live-window.js +93 -0
  39. package/dist/api/live-window.js.map +1 -0
  40. package/dist/api/openapi.d.ts +6 -0
  41. package/dist/api/openapi.d.ts.map +1 -0
  42. package/dist/api/openapi.js +146 -0
  43. package/dist/api/openapi.js.map +1 -0
  44. package/dist/api/realtime-router.d.ts +94 -0
  45. package/dist/api/realtime-router.d.ts.map +1 -0
  46. package/dist/api/realtime-router.js +45 -0
  47. package/dist/api/realtime-router.js.map +1 -0
  48. package/dist/api/registry.d.ts +30 -0
  49. package/dist/api/registry.d.ts.map +1 -0
  50. package/dist/api/registry.js +236 -0
  51. package/dist/api/registry.js.map +1 -0
  52. package/dist/api/router.d.ts +15 -0
  53. package/dist/api/router.d.ts.map +1 -0
  54. package/dist/api/router.js +32 -0
  55. package/dist/api/router.js.map +1 -0
  56. package/dist/api/storage-router.d.ts +349 -0
  57. package/dist/api/storage-router.d.ts.map +1 -0
  58. package/dist/api/storage-router.js +155 -0
  59. package/dist/api/storage-router.js.map +1 -0
  60. package/dist/api/types.d.ts +55 -0
  61. package/dist/api/types.d.ts.map +1 -0
  62. package/dist/api/types.js +2 -0
  63. package/dist/api/types.js.map +1 -0
  64. package/dist/auth-password.d.ts +27 -0
  65. package/dist/auth-password.d.ts.map +1 -0
  66. package/dist/auth-password.js +60 -0
  67. package/dist/auth-password.js.map +1 -0
  68. package/dist/auth.d.ts +59 -0
  69. package/dist/auth.d.ts.map +1 -0
  70. package/dist/auth.js +146 -0
  71. package/dist/auth.js.map +1 -0
  72. package/dist/backend-internals.d.ts +35 -0
  73. package/dist/backend-internals.d.ts.map +1 -0
  74. package/dist/backend-internals.js +2 -0
  75. package/dist/backend-internals.js.map +1 -0
  76. package/dist/backend.d.ts +63 -0
  77. package/dist/backend.d.ts.map +1 -0
  78. package/dist/backend.js +59 -0
  79. package/dist/backend.js.map +1 -0
  80. package/dist/blueprint-generator.d.ts +21 -0
  81. package/dist/blueprint-generator.d.ts.map +1 -0
  82. package/dist/blueprint-generator.js +199 -0
  83. package/dist/blueprint-generator.js.map +1 -0
  84. package/dist/blueprint.d.ts +99 -0
  85. package/dist/blueprint.d.ts.map +1 -0
  86. package/dist/blueprint.js +257 -0
  87. package/dist/blueprint.js.map +1 -0
  88. package/dist/cli-skills.d.ts +16 -0
  89. package/dist/cli-skills.d.ts.map +1 -0
  90. package/dist/cli-skills.js +108 -0
  91. package/dist/cli-skills.js.map +1 -0
  92. package/dist/cli.d.ts +18 -0
  93. package/dist/cli.d.ts.map +1 -0
  94. package/dist/cli.js +205 -0
  95. package/dist/cli.js.map +1 -0
  96. package/dist/client/client.d.ts +53 -0
  97. package/dist/client/client.d.ts.map +1 -0
  98. package/dist/client/client.js +111 -0
  99. package/dist/client/client.js.map +1 -0
  100. package/dist/client/index.d.ts +4 -0
  101. package/dist/client/index.d.ts.map +1 -0
  102. package/dist/client/index.js +4 -0
  103. package/dist/client/index.js.map +1 -0
  104. package/dist/client/live-view.d.ts +49 -0
  105. package/dist/client/live-view.d.ts.map +1 -0
  106. package/dist/client/live-view.js +184 -0
  107. package/dist/client/live-view.js.map +1 -0
  108. package/dist/client/react.d.ts +4 -0
  109. package/dist/client/react.d.ts.map +1 -0
  110. package/dist/client/react.js +6 -0
  111. package/dist/client/react.js.map +1 -0
  112. package/dist/client/realtime.d.ts +54 -0
  113. package/dist/client/realtime.d.ts.map +1 -0
  114. package/dist/client/realtime.js +105 -0
  115. package/dist/client/realtime.js.map +1 -0
  116. package/dist/client/rest.d.ts +2 -0
  117. package/dist/client/rest.d.ts.map +1 -0
  118. package/dist/client/rest.js +2 -0
  119. package/dist/client/rest.js.map +1 -0
  120. package/dist/client/rpc-client.d.ts +38 -0
  121. package/dist/client/rpc-client.d.ts.map +1 -0
  122. package/dist/client/rpc-client.js +59 -0
  123. package/dist/client/rpc-client.js.map +1 -0
  124. package/dist/client/solid.d.ts +7 -0
  125. package/dist/client/solid.d.ts.map +1 -0
  126. package/dist/client/solid.js +21 -0
  127. package/dist/client/solid.js.map +1 -0
  128. package/dist/client/svelte.d.ts +6 -0
  129. package/dist/client/svelte.d.ts.map +1 -0
  130. package/dist/client/svelte.js +9 -0
  131. package/dist/client/svelte.js.map +1 -0
  132. package/dist/client/vue.d.ts +5 -0
  133. package/dist/client/vue.d.ts.map +1 -0
  134. package/dist/client/vue.js +11 -0
  135. package/dist/client/vue.js.map +1 -0
  136. package/dist/codegen.d.ts +36 -0
  137. package/dist/codegen.d.ts.map +1 -0
  138. package/dist/codegen.js +235 -0
  139. package/dist/codegen.js.map +1 -0
  140. package/dist/config.d.ts +129 -0
  141. package/dist/config.d.ts.map +1 -0
  142. package/dist/config.js +75 -0
  143. package/dist/config.js.map +1 -0
  144. package/dist/cron.d.ts +4 -0
  145. package/dist/cron.d.ts.map +1 -0
  146. package/dist/cron.js +3 -0
  147. package/dist/cron.js.map +1 -0
  148. package/dist/crud-operations.d.ts +43 -0
  149. package/dist/crud-operations.d.ts.map +1 -0
  150. package/dist/crud-operations.js +249 -0
  151. package/dist/crud-operations.js.map +1 -0
  152. package/dist/database/adapter.d.ts +26 -0
  153. package/dist/database/adapter.d.ts.map +1 -0
  154. package/dist/database/adapter.js +2 -0
  155. package/dist/database/adapter.js.map +1 -0
  156. package/dist/database/libsql.d.ts +3 -0
  157. package/dist/database/libsql.d.ts.map +1 -0
  158. package/dist/database/libsql.js +39 -0
  159. package/dist/database/libsql.js.map +1 -0
  160. package/dist/db.d.ts +15 -0
  161. package/dist/db.d.ts.map +1 -0
  162. package/dist/db.js +8 -0
  163. package/dist/db.js.map +1 -0
  164. package/dist/dev/binaries.d.ts +22 -0
  165. package/dist/dev/binaries.d.ts.map +1 -0
  166. package/dist/dev/binaries.js +119 -0
  167. package/dist/dev/binaries.js.map +1 -0
  168. package/dist/dev/env.d.ts +11 -0
  169. package/dist/dev/env.d.ts.map +1 -0
  170. package/dist/dev/env.js +71 -0
  171. package/dist/dev/env.js.map +1 -0
  172. package/dist/dev/index.d.ts +39 -0
  173. package/dist/dev/index.d.ts.map +1 -0
  174. package/dist/dev/index.js +273 -0
  175. package/dist/dev/index.js.map +1 -0
  176. package/dist/dev/processes.d.ts +37 -0
  177. package/dist/dev/processes.d.ts.map +1 -0
  178. package/dist/dev/processes.js +104 -0
  179. package/dist/dev/processes.js.map +1 -0
  180. package/dist/dev/push.d.ts +2 -0
  181. package/dist/dev/push.d.ts.map +1 -0
  182. package/dist/dev/push.js +30 -0
  183. package/dist/dev/push.js.map +1 -0
  184. package/dist/dialect.d.ts +17 -0
  185. package/dist/dialect.d.ts.map +1 -0
  186. package/dist/dialect.js +12 -0
  187. package/dist/dialect.js.map +1 -0
  188. package/dist/email/smtp.d.ts +20 -0
  189. package/dist/email/smtp.d.ts.map +1 -0
  190. package/dist/email/smtp.js +31 -0
  191. package/dist/email/smtp.js.map +1 -0
  192. package/dist/email.d.ts +26 -0
  193. package/dist/email.d.ts.map +1 -0
  194. package/dist/email.js +2 -0
  195. package/dist/email.js.map +1 -0
  196. package/dist/env-probe.d.ts +9 -0
  197. package/dist/env-probe.d.ts.map +1 -0
  198. package/dist/env-probe.js +72 -0
  199. package/dist/env-probe.js.map +1 -0
  200. package/dist/env.d.ts +62 -0
  201. package/dist/env.d.ts.map +1 -0
  202. package/dist/env.js +86 -0
  203. package/dist/env.js.map +1 -0
  204. package/dist/errors.d.ts +153 -0
  205. package/dist/errors.d.ts.map +1 -0
  206. package/dist/errors.js +106 -0
  207. package/dist/errors.js.map +1 -0
  208. package/dist/handler.d.ts +11 -0
  209. package/dist/handler.d.ts.map +1 -0
  210. package/dist/handler.js +21 -0
  211. package/dist/handler.js.map +1 -0
  212. package/dist/hosted-contract.d.ts +11 -0
  213. package/dist/hosted-contract.d.ts.map +1 -0
  214. package/dist/hosted-contract.js +50 -0
  215. package/dist/hosted-contract.js.map +1 -0
  216. package/dist/idempotency.d.ts +17 -0
  217. package/dist/idempotency.d.ts.map +1 -0
  218. package/dist/idempotency.js +65 -0
  219. package/dist/idempotency.js.map +1 -0
  220. package/dist/index.d.ts +41 -0
  221. package/dist/index.d.ts.map +1 -0
  222. package/dist/index.js +18 -0
  223. package/dist/index.js.map +1 -0
  224. package/dist/inspect.d.ts +15 -0
  225. package/dist/inspect.d.ts.map +1 -0
  226. package/dist/inspect.js +44 -0
  227. package/dist/inspect.js.map +1 -0
  228. package/dist/internal-tables.d.ts +1767 -0
  229. package/dist/internal-tables.d.ts.map +1 -0
  230. package/dist/internal-tables.js +114 -0
  231. package/dist/internal-tables.js.map +1 -0
  232. package/dist/jobs/cron.d.ts +15 -0
  233. package/dist/jobs/cron.d.ts.map +1 -0
  234. package/dist/jobs/cron.js +74 -0
  235. package/dist/jobs/cron.js.map +1 -0
  236. package/dist/jobs/define.d.ts +186 -0
  237. package/dist/jobs/define.d.ts.map +1 -0
  238. package/dist/jobs/define.js +99 -0
  239. package/dist/jobs/define.js.map +1 -0
  240. package/dist/jobs/index.d.ts +9 -0
  241. package/dist/jobs/index.d.ts.map +1 -0
  242. package/dist/jobs/index.js +7 -0
  243. package/dist/jobs/index.js.map +1 -0
  244. package/dist/jobs/queue.d.ts +13 -0
  245. package/dist/jobs/queue.d.ts.map +1 -0
  246. package/dist/jobs/queue.js +71 -0
  247. package/dist/jobs/queue.js.map +1 -0
  248. package/dist/jobs/slots.d.ts +30 -0
  249. package/dist/jobs/slots.d.ts.map +1 -0
  250. package/dist/jobs/slots.js +53 -0
  251. package/dist/jobs/slots.js.map +1 -0
  252. package/dist/jobs/worker.d.ts +45 -0
  253. package/dist/jobs/worker.d.ts.map +1 -0
  254. package/dist/jobs/worker.js +605 -0
  255. package/dist/jobs/worker.js.map +1 -0
  256. package/dist/lifecycle.d.ts +10 -0
  257. package/dist/lifecycle.d.ts.map +1 -0
  258. package/dist/lifecycle.js +37 -0
  259. package/dist/lifecycle.js.map +1 -0
  260. package/dist/list-query.d.ts +62 -0
  261. package/dist/list-query.d.ts.map +1 -0
  262. package/dist/list-query.js +190 -0
  263. package/dist/list-query.js.map +1 -0
  264. package/dist/live/apply.d.ts +13 -0
  265. package/dist/live/apply.d.ts.map +1 -0
  266. package/dist/live/apply.js +32 -0
  267. package/dist/live/apply.js.map +1 -0
  268. package/dist/live/index.d.ts +48 -0
  269. package/dist/live/index.d.ts.map +1 -0
  270. package/dist/live/index.js +108 -0
  271. package/dist/live/index.js.map +1 -0
  272. package/dist/live/protocol.d.ts +47 -0
  273. package/dist/live/protocol.d.ts.map +1 -0
  274. package/dist/live/protocol.js +12 -0
  275. package/dist/live/protocol.js.map +1 -0
  276. package/dist/live/sse.d.ts +22 -0
  277. package/dist/live/sse.d.ts.map +1 -0
  278. package/dist/live/sse.js +41 -0
  279. package/dist/live/sse.js.map +1 -0
  280. package/dist/logging.d.ts +8 -0
  281. package/dist/logging.d.ts.map +1 -0
  282. package/dist/logging.js +6 -0
  283. package/dist/logging.js.map +1 -0
  284. package/dist/manifest-diff.d.ts +6 -0
  285. package/dist/manifest-diff.d.ts.map +1 -0
  286. package/dist/manifest-diff.js +42 -0
  287. package/dist/manifest-diff.js.map +1 -0
  288. package/dist/manifest.d.ts +87 -0
  289. package/dist/manifest.d.ts.map +1 -0
  290. package/dist/manifest.js +237 -0
  291. package/dist/manifest.js.map +1 -0
  292. package/dist/messaging/email.d.ts +16 -0
  293. package/dist/messaging/email.d.ts.map +1 -0
  294. package/dist/messaging/email.js +8 -0
  295. package/dist/messaging/email.js.map +1 -0
  296. package/dist/messaging/index.d.ts +8 -0
  297. package/dist/messaging/index.d.ts.map +1 -0
  298. package/dist/messaging/index.js +4 -0
  299. package/dist/messaging/index.js.map +1 -0
  300. package/dist/messaging/journal.d.ts +4 -0
  301. package/dist/messaging/journal.d.ts.map +1 -0
  302. package/dist/messaging/journal.js +19 -0
  303. package/dist/messaging/journal.js.map +1 -0
  304. package/dist/messaging/runtime.d.ts +16 -0
  305. package/dist/messaging/runtime.d.ts.map +1 -0
  306. package/dist/messaging/runtime.js +213 -0
  307. package/dist/messaging/runtime.js.map +1 -0
  308. package/dist/messaging/standalone.d.ts +27 -0
  309. package/dist/messaging/standalone.d.ts.map +1 -0
  310. package/dist/messaging/standalone.js +18 -0
  311. package/dist/messaging/standalone.js.map +1 -0
  312. package/dist/messaging/telegram.d.ts +16 -0
  313. package/dist/messaging/telegram.d.ts.map +1 -0
  314. package/dist/messaging/telegram.js +5 -0
  315. package/dist/messaging/telegram.js.map +1 -0
  316. package/dist/messaging/types.d.ts +22 -0
  317. package/dist/messaging/types.d.ts.map +1 -0
  318. package/dist/messaging/types.js +17 -0
  319. package/dist/messaging/types.js.map +1 -0
  320. package/dist/platform.d.ts +25 -0
  321. package/dist/platform.d.ts.map +1 -0
  322. package/dist/platform.js +24 -0
  323. package/dist/platform.js.map +1 -0
  324. package/dist/provision-internals.d.ts +23 -0
  325. package/dist/provision-internals.d.ts.map +1 -0
  326. package/dist/provision-internals.js +7 -0
  327. package/dist/provision-internals.js.map +1 -0
  328. package/dist/provision-runtime.d.ts +6 -0
  329. package/dist/provision-runtime.d.ts.map +1 -0
  330. package/dist/provision-runtime.js +41 -0
  331. package/dist/provision-runtime.js.map +1 -0
  332. package/dist/provision-schema.d.ts +16 -0
  333. package/dist/provision-schema.d.ts.map +1 -0
  334. package/dist/provision-schema.js +59 -0
  335. package/dist/provision-schema.js.map +1 -0
  336. package/dist/provision.d.ts +8 -0
  337. package/dist/provision.d.ts.map +1 -0
  338. package/dist/provision.js +16 -0
  339. package/dist/provision.js.map +1 -0
  340. package/dist/query/api.d.ts +10 -0
  341. package/dist/query/api.d.ts.map +1 -0
  342. package/dist/query/api.js +7 -0
  343. package/dist/query/api.js.map +1 -0
  344. package/dist/query/client.d.ts +28 -0
  345. package/dist/query/client.d.ts.map +1 -0
  346. package/dist/query/client.js +87 -0
  347. package/dist/query/client.js.map +1 -0
  348. package/dist/query/fetch.d.ts +3 -0
  349. package/dist/query/fetch.d.ts.map +1 -0
  350. package/dist/query/fetch.js +4 -0
  351. package/dist/query/fetch.js.map +1 -0
  352. package/dist/query/index.d.ts +8 -0
  353. package/dist/query/index.d.ts.map +1 -0
  354. package/dist/query/index.js +4 -0
  355. package/dist/query/index.js.map +1 -0
  356. package/dist/query/infer.d.ts +25 -0
  357. package/dist/query/infer.d.ts.map +1 -0
  358. package/dist/query/infer.js +2 -0
  359. package/dist/query/infer.js.map +1 -0
  360. package/dist/query/react.d.ts +3 -0
  361. package/dist/query/react.d.ts.map +1 -0
  362. package/dist/query/react.js +2 -0
  363. package/dist/query/react.js.map +1 -0
  364. package/dist/query/realtime-flush.d.ts +26 -0
  365. package/dist/query/realtime-flush.d.ts.map +1 -0
  366. package/dist/query/realtime-flush.js +45 -0
  367. package/dist/query/realtime-flush.js.map +1 -0
  368. package/dist/query/realtime-stream.d.ts +3 -0
  369. package/dist/query/realtime-stream.d.ts.map +1 -0
  370. package/dist/query/realtime-stream.js +3 -0
  371. package/dist/query/realtime-stream.js.map +1 -0
  372. package/dist/query/realtime.d.ts +88 -0
  373. package/dist/query/realtime.d.ts.map +1 -0
  374. package/dist/query/realtime.js +255 -0
  375. package/dist/query/realtime.js.map +1 -0
  376. package/dist/rate-limit.d.ts +8 -0
  377. package/dist/rate-limit.d.ts.map +1 -0
  378. package/dist/rate-limit.js +46 -0
  379. package/dist/rate-limit.js.map +1 -0
  380. package/dist/readiness-probes.d.ts +4 -0
  381. package/dist/readiness-probes.d.ts.map +1 -0
  382. package/dist/readiness-probes.js +23 -0
  383. package/dist/readiness-probes.js.map +1 -0
  384. package/dist/readiness.d.ts +39 -0
  385. package/dist/readiness.d.ts.map +1 -0
  386. package/dist/readiness.js +72 -0
  387. package/dist/readiness.js.map +1 -0
  388. package/dist/realtime/facade.d.ts +20 -0
  389. package/dist/realtime/facade.d.ts.map +1 -0
  390. package/dist/realtime/facade.js +37 -0
  391. package/dist/realtime/facade.js.map +1 -0
  392. package/dist/realtime/filter.d.ts +42 -0
  393. package/dist/realtime/filter.d.ts.map +1 -0
  394. package/dist/realtime/filter.js +86 -0
  395. package/dist/realtime/filter.js.map +1 -0
  396. package/dist/realtime/heartbeat.d.ts +20 -0
  397. package/dist/realtime/heartbeat.d.ts.map +1 -0
  398. package/dist/realtime/heartbeat.js +64 -0
  399. package/dist/realtime/heartbeat.js.map +1 -0
  400. package/dist/realtime/publisher.d.ts +19 -0
  401. package/dist/realtime/publisher.d.ts.map +1 -0
  402. package/dist/realtime/publisher.js +8 -0
  403. package/dist/realtime/publisher.js.map +1 -0
  404. package/dist/runtime.d.ts +141 -0
  405. package/dist/runtime.d.ts.map +1 -0
  406. package/dist/runtime.js +463 -0
  407. package/dist/runtime.js.map +1 -0
  408. package/dist/schema-export.d.ts +2 -0
  409. package/dist/schema-export.d.ts.map +1 -0
  410. package/dist/schema-export.js +2 -0
  411. package/dist/schema-export.js.map +1 -0
  412. package/dist/scope.d.ts +4 -0
  413. package/dist/scope.d.ts.map +1 -0
  414. package/dist/scope.js +13 -0
  415. package/dist/scope.js.map +1 -0
  416. package/dist/standard-schema.d.ts +13 -0
  417. package/dist/standard-schema.d.ts.map +1 -0
  418. package/dist/standard-schema.js +34 -0
  419. package/dist/standard-schema.js.map +1 -0
  420. package/dist/start/auth-client.d.ts +11 -0
  421. package/dist/start/auth-client.d.ts.map +1 -0
  422. package/dist/start/auth-client.js +15 -0
  423. package/dist/start/auth-client.js.map +1 -0
  424. package/dist/start/create-start-worker.d.ts +16 -0
  425. package/dist/start/create-start-worker.d.ts.map +1 -0
  426. package/dist/start/create-start-worker.js +24 -0
  427. package/dist/start/create-start-worker.js.map +1 -0
  428. package/dist/start/index.d.ts +66 -0
  429. package/dist/start/index.d.ts.map +1 -0
  430. package/dist/start/index.js +49 -0
  431. package/dist/start/index.js.map +1 -0
  432. package/dist/start/isomorphic-fetch.d.ts +22 -0
  433. package/dist/start/isomorphic-fetch.d.ts.map +1 -0
  434. package/dist/start/isomorphic-fetch.js +49 -0
  435. package/dist/start/isomorphic-fetch.js.map +1 -0
  436. package/dist/start/server-entry.d.ts +7 -0
  437. package/dist/start/server-entry.d.ts.map +1 -0
  438. package/dist/start/server-entry.js +8 -0
  439. package/dist/start/server-entry.js.map +1 -0
  440. package/dist/storage/background.d.ts +3 -0
  441. package/dist/storage/background.d.ts.map +1 -0
  442. package/dist/storage/background.js +3 -0
  443. package/dist/storage/background.js.map +1 -0
  444. package/dist/storage/buckets.d.ts +78 -0
  445. package/dist/storage/buckets.d.ts.map +1 -0
  446. package/dist/storage/buckets.js +177 -0
  447. package/dist/storage/buckets.js.map +1 -0
  448. package/dist/storage/delete.d.ts +8 -0
  449. package/dist/storage/delete.d.ts.map +1 -0
  450. package/dist/storage/delete.js +10 -0
  451. package/dist/storage/delete.js.map +1 -0
  452. package/dist/storage/file-meta.d.ts +37 -0
  453. package/dist/storage/file-meta.d.ts.map +1 -0
  454. package/dist/storage/file-meta.js +166 -0
  455. package/dist/storage/file-meta.js.map +1 -0
  456. package/dist/storage/index.d.ts +28 -0
  457. package/dist/storage/index.d.ts.map +1 -0
  458. package/dist/storage/index.js +5 -0
  459. package/dist/storage/index.js.map +1 -0
  460. package/dist/storage/local.d.ts +15 -0
  461. package/dist/storage/local.d.ts.map +1 -0
  462. package/dist/storage/local.js +56 -0
  463. package/dist/storage/local.js.map +1 -0
  464. package/dist/storage/operations.d.ts +54 -0
  465. package/dist/storage/operations.d.ts.map +1 -0
  466. package/dist/storage/operations.js +212 -0
  467. package/dist/storage/operations.js.map +1 -0
  468. package/dist/storage/registry.d.ts +11 -0
  469. package/dist/storage/registry.d.ts.map +1 -0
  470. package/dist/storage/registry.js +23 -0
  471. package/dist/storage/registry.js.map +1 -0
  472. package/dist/storage/s3.d.ts +35 -0
  473. package/dist/storage/s3.d.ts.map +1 -0
  474. package/dist/storage/s3.js +125 -0
  475. package/dist/storage/s3.js.map +1 -0
  476. package/dist/storage/sigv4.d.ts +24 -0
  477. package/dist/storage/sigv4.d.ts.map +1 -0
  478. package/dist/storage/sigv4.js +107 -0
  479. package/dist/storage/sigv4.js.map +1 -0
  480. package/dist/storage/sweep.d.ts +9 -0
  481. package/dist/storage/sweep.d.ts.map +1 -0
  482. package/dist/storage/sweep.js +17 -0
  483. package/dist/storage/sweep.js.map +1 -0
  484. package/dist/sync/collection.d.ts +106 -0
  485. package/dist/sync/collection.d.ts.map +1 -0
  486. package/dist/sync/collection.js +258 -0
  487. package/dist/sync/collection.js.map +1 -0
  488. package/dist/sync/index.d.ts +8 -0
  489. package/dist/sync/index.d.ts.map +1 -0
  490. package/dist/sync/index.js +4 -0
  491. package/dist/sync/index.js.map +1 -0
  492. package/dist/sync/realtime-sync.d.ts +31 -0
  493. package/dist/sync/realtime-sync.d.ts.map +1 -0
  494. package/dist/sync/realtime-sync.js +46 -0
  495. package/dist/sync/realtime-sync.js.map +1 -0
  496. package/dist/sync/sync-client.d.ts +28 -0
  497. package/dist/sync/sync-client.d.ts.map +1 -0
  498. package/dist/sync/sync-client.js +52 -0
  499. package/dist/sync/sync-client.js.map +1 -0
  500. package/dist/sync/update-queue.d.ts +27 -0
  501. package/dist/sync/update-queue.d.ts.map +1 -0
  502. package/dist/sync/update-queue.js +66 -0
  503. package/dist/sync/update-queue.js.map +1 -0
  504. package/dist/testing/auth.d.ts +85 -0
  505. package/dist/testing/auth.d.ts.map +1 -0
  506. package/dist/testing/auth.js +140 -0
  507. package/dist/testing/auth.js.map +1 -0
  508. package/dist/testing/client.d.ts +6 -0
  509. package/dist/testing/client.d.ts.map +1 -0
  510. package/dist/testing/client.js +9 -0
  511. package/dist/testing/client.js.map +1 -0
  512. package/dist/testing/database.d.ts +6 -0
  513. package/dist/testing/database.d.ts.map +1 -0
  514. package/dist/testing/database.js +8 -0
  515. package/dist/testing/database.js.map +1 -0
  516. package/dist/testing/email.d.ts +15 -0
  517. package/dist/testing/email.d.ts.map +1 -0
  518. package/dist/testing/email.js +32 -0
  519. package/dist/testing/email.js.map +1 -0
  520. package/dist/testing/fixture.d.ts +51 -0
  521. package/dist/testing/fixture.d.ts.map +1 -0
  522. package/dist/testing/fixture.js +177 -0
  523. package/dist/testing/fixture.js.map +1 -0
  524. package/dist/testing/jobs.d.ts +40 -0
  525. package/dist/testing/jobs.d.ts.map +1 -0
  526. package/dist/testing/jobs.js +76 -0
  527. package/dist/testing/jobs.js.map +1 -0
  528. package/dist/testing/logs.d.ts +18 -0
  529. package/dist/testing/logs.d.ts.map +1 -0
  530. package/dist/testing/logs.js +53 -0
  531. package/dist/testing/logs.js.map +1 -0
  532. package/dist/testing/messaging.d.ts +21 -0
  533. package/dist/testing/messaging.d.ts.map +1 -0
  534. package/dist/testing/messaging.js +34 -0
  535. package/dist/testing/messaging.js.map +1 -0
  536. package/dist/testing/storage.d.ts +7 -0
  537. package/dist/testing/storage.d.ts.map +1 -0
  538. package/dist/testing/storage.js +29 -0
  539. package/dist/testing/storage.js.map +1 -0
  540. package/dist/testing/workers-fakes.d.ts +17 -0
  541. package/dist/testing/workers-fakes.d.ts.map +1 -0
  542. package/dist/testing/workers-fakes.js +98 -0
  543. package/dist/testing/workers-fakes.js.map +1 -0
  544. package/dist/testing.d.ts +12 -0
  545. package/dist/testing.d.ts.map +1 -0
  546. package/dist/testing.js +5 -0
  547. package/dist/testing.js.map +1 -0
  548. package/dist/typeid.d.ts +46 -0
  549. package/dist/typeid.d.ts.map +1 -0
  550. package/dist/typeid.js +130 -0
  551. package/dist/typeid.js.map +1 -0
  552. package/dist/vite.d.ts +26 -0
  553. package/dist/vite.d.ts.map +1 -0
  554. package/dist/vite.js +100 -0
  555. package/dist/vite.js.map +1 -0
  556. package/dist/worker-plan.d.ts +37 -0
  557. package/dist/worker-plan.d.ts.map +1 -0
  558. package/dist/worker-plan.js +63 -0
  559. package/dist/worker-plan.js.map +1 -0
  560. package/dist/workers/app.d.ts +19 -0
  561. package/dist/workers/app.d.ts.map +1 -0
  562. package/dist/workers/app.js +56 -0
  563. package/dist/workers/app.js.map +1 -0
  564. package/dist/workers/entry.d.ts +7 -0
  565. package/dist/workers/entry.d.ts.map +1 -0
  566. package/dist/workers/entry.js +8 -0
  567. package/dist/workers/entry.js.map +1 -0
  568. package/dist/workers/index.d.ts +23 -0
  569. package/dist/workers/index.d.ts.map +1 -0
  570. package/dist/workers/index.js +39 -0
  571. package/dist/workers/index.js.map +1 -0
  572. package/dist/workers/r2.d.ts +24 -0
  573. package/dist/workers/r2.d.ts.map +1 -0
  574. package/dist/workers/r2.js +76 -0
  575. package/dist/workers/r2.js.map +1 -0
  576. package/dist/workers/rate-limiter.d.ts +9 -0
  577. package/dist/workers/rate-limiter.d.ts.map +1 -0
  578. package/dist/workers/rate-limiter.js +22 -0
  579. package/dist/workers/rate-limiter.js.map +1 -0
  580. package/dist/workers/realtime-hub.d.ts +20 -0
  581. package/dist/workers/realtime-hub.d.ts.map +1 -0
  582. package/dist/workers/realtime-hub.js +117 -0
  583. package/dist/workers/realtime-hub.js.map +1 -0
  584. package/dist/workers/registry.d.ts +13 -0
  585. package/dist/workers/registry.d.ts.map +1 -0
  586. package/dist/workers/registry.js +19 -0
  587. package/dist/workers/registry.js.map +1 -0
  588. package/dist/workers/scheduler.d.ts +13 -0
  589. package/dist/workers/scheduler.d.ts.map +1 -0
  590. package/dist/workers/scheduler.js +71 -0
  591. package/dist/workers/scheduler.js.map +1 -0
  592. package/dist/workers/types.d.ts +55 -0
  593. package/dist/workers/types.d.ts.map +1 -0
  594. package/dist/workers/types.js +4 -0
  595. package/dist/workers/types.js.map +1 -0
  596. package/dist/workers/wrangler.d.ts +62 -0
  597. package/dist/workers/wrangler.d.ts.map +1 -0
  598. package/dist/workers/wrangler.js +90 -0
  599. package/dist/workers/wrangler.js.map +1 -0
  600. package/package.json +286 -0
  601. package/skills/creating-workerstack-apps/SKILL.md +45 -0
  602. package/skills/creating-workerstack-apps/agents/openai.yaml +4 -0
  603. package/skills/creating-workerstack-apps/references/application-structure.md +219 -0
  604. package/skills/creating-workerstack-apps/references/runtime-integrations.md +96 -0
  605. package/skills/creating-workerstack-apps/references/verification.md +29 -0
@@ -0,0 +1,37 @@
1
+ export type ProcessSpec = {
2
+ name: string;
3
+ cmd: string[];
4
+ cwd: string;
5
+ env?: Record<string, string>;
6
+ /** Rewrites an output line; `undefined` drops it. */
7
+ filter?: (line: string) => string | undefined;
8
+ };
9
+ export declare function prefixLines(chunk: string, pending: string): {
10
+ lines: string[];
11
+ pending: string;
12
+ };
13
+ export declare class ProcessGroup {
14
+ private write;
15
+ readonly exited: Promise<{
16
+ name: string;
17
+ code: number | null;
18
+ }>;
19
+ private children;
20
+ private resolveExit;
21
+ private stopping;
22
+ private width;
23
+ constructor(write?: (line: string) => void);
24
+ private label;
25
+ private names;
26
+ private labelIndex;
27
+ /** Writes one line with the name's prefix; the dev command logs here too. */
28
+ log(name: string, line: string): void;
29
+ start(spec: ProcessSpec): void;
30
+ /**
31
+ * SIGINT to each child's process group, as Ctrl+C in a terminal does, then
32
+ * SIGKILL to the groups after 3 s. `celld dev` runs a node process that
33
+ * ignores SIGTERM, so a signal to the leader alone leaves it running.
34
+ */
35
+ stop(): Promise<void>;
36
+ }
37
+ //# sourceMappingURL=processes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processes.d.ts","sourceRoot":"","sources":["../../src/dev/processes.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,EAAE,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B,qDAAqD;IACrD,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAA;CAC9C,CAAA;AAID,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAItC;AAED,qBAAa,YAAY;IAQrB,OAAO,CAAC,KAAK;IAPf,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAA;IAC/D,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,WAAW,CAAyD;IAC5E,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,KAAK,CAAI;gBAGP,KAAK,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAkC;IAKrE,OAAO,CAAC,KAAK;IAOb,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,UAAU;IAKlB,6EAA6E;IAC7E,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAM9B,KAAK,CAAC,IAAI,EAAE,WAAW;IAqCvB;;;;OAIG;IACG,IAAI;CAmBX"}
@@ -0,0 +1,104 @@
1
+ const COLORS = [36, 35, 33, 32, 34];
2
+ export function prefixLines(chunk, pending) {
3
+ const parts = (pending + chunk).split(/\r?\n/);
4
+ const rest = parts.pop() ?? '';
5
+ return { lines: parts, pending: rest };
6
+ }
7
+ export class ProcessGroup {
8
+ write;
9
+ exited;
10
+ children = [];
11
+ resolveExit;
12
+ stopping = false;
13
+ width = 0;
14
+ constructor(write = (line) => console.log(line)) {
15
+ this.write = write;
16
+ this.exited = new Promise((resolve) => (this.resolveExit = resolve));
17
+ }
18
+ label(name) {
19
+ const text = `[${name}]`.padEnd(this.width + 2);
20
+ if (!process.stdout.isTTY)
21
+ return text;
22
+ const color = COLORS[this.labelIndex(name) % COLORS.length];
23
+ return `\x1b[${color}m${text}\x1b[0m`;
24
+ }
25
+ names = [];
26
+ labelIndex(name) {
27
+ if (!this.names.includes(name))
28
+ this.names.push(name);
29
+ return this.names.indexOf(name);
30
+ }
31
+ /** Writes one line with the name's prefix; the dev command logs here too. */
32
+ log(name, line) {
33
+ this.labelIndex(name);
34
+ this.width = Math.max(this.width, name.length);
35
+ this.write(`${this.label(name)} ${line}`);
36
+ }
37
+ start(spec) {
38
+ this.width = Math.max(this.width, spec.name.length);
39
+ const child = Bun.spawn(spec.cmd, {
40
+ cwd: spec.cwd,
41
+ env: { ...process.env, ...spec.env },
42
+ stdin: 'ignore',
43
+ // Own process group, so stop() reaches the child's children too.
44
+ detached: true,
45
+ stdout: 'pipe',
46
+ stderr: 'pipe',
47
+ });
48
+ this.children.push(child);
49
+ const emit = (line) => {
50
+ const shown = spec.filter ? spec.filter(line) : line;
51
+ if (shown !== undefined)
52
+ this.log(spec.name, shown);
53
+ };
54
+ const pump = async (stream) => {
55
+ let pending = '';
56
+ const decoder = new TextDecoder();
57
+ const reader = stream.getReader();
58
+ for (;;) {
59
+ const { done, value } = await reader.read();
60
+ if (done)
61
+ break;
62
+ const chunk = decoder.decode(value, { stream: true });
63
+ const result = prefixLines(chunk, pending);
64
+ pending = result.pending;
65
+ for (const line of result.lines)
66
+ emit(line);
67
+ }
68
+ if (pending)
69
+ emit(pending);
70
+ };
71
+ const output = Promise.all([pump(child.stdout), pump(child.stderr)]);
72
+ void child.exited.then(async (code) => {
73
+ await output.catch(() => { });
74
+ if (!this.stopping)
75
+ this.resolveExit({ name: spec.name, code });
76
+ });
77
+ }
78
+ /**
79
+ * SIGINT to each child's process group, as Ctrl+C in a terminal does, then
80
+ * SIGKILL to the groups after 3 s. `celld dev` runs a node process that
81
+ * ignores SIGTERM, so a signal to the leader alone leaves it running.
82
+ */
83
+ async stop() {
84
+ this.stopping = true;
85
+ const signal = (sig) => {
86
+ for (const child of this.children) {
87
+ try {
88
+ process.kill(-child.pid, sig);
89
+ }
90
+ catch {
91
+ // The group is gone already.
92
+ }
93
+ }
94
+ };
95
+ signal('SIGINT');
96
+ await Promise.race([
97
+ Promise.allSettled(this.children.map((child) => child.exited)),
98
+ Bun.sleep(3_000),
99
+ ]);
100
+ signal('SIGKILL');
101
+ await Promise.allSettled(this.children.map((child) => child.exited));
102
+ }
103
+ }
104
+ //# sourceMappingURL=processes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processes.js","sourceRoot":"","sources":["../../src/dev/processes.ts"],"names":[],"mappings":"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","sourcesContent":["// The child processes of `workerstack dev`: one log with a prefix per process,\n// and one stop for all of them.\nimport type { Subprocess } from 'bun'\n\nexport type ProcessSpec = {\n name: string\n cmd: string[]\n cwd: string\n env?: Record<string, string>\n /** Rewrites an output line; `undefined` drops it. */\n filter?: (line: string) => string | undefined\n}\n\nconst COLORS = [36, 35, 33, 32, 34]\n\nexport function prefixLines(\n chunk: string,\n pending: string,\n): { lines: string[]; pending: string } {\n const parts = (pending + chunk).split(/\\r?\\n/)\n const rest = parts.pop() ?? ''\n return { lines: parts, pending: rest }\n}\n\nexport class ProcessGroup {\n readonly exited: Promise<{ name: string; code: number | null }>\n private children: Subprocess[] = []\n private resolveExit!: (value: { name: string; code: number | null }) => void\n private stopping = false\n private width = 0\n\n constructor(\n private write: (line: string) => void = (line) => console.log(line),\n ) {\n this.exited = new Promise((resolve) => (this.resolveExit = resolve))\n }\n\n private label(name: string) {\n const text = `[${name}]`.padEnd(this.width + 2)\n if (!process.stdout.isTTY) return text\n const color = COLORS[this.labelIndex(name) % COLORS.length]\n return `\\x1b[${color}m${text}\\x1b[0m`\n }\n\n private names: string[] = []\n private labelIndex(name: string) {\n if (!this.names.includes(name)) this.names.push(name)\n return this.names.indexOf(name)\n }\n\n /** Writes one line with the name's prefix; the dev command logs here too. */\n log(name: string, line: string) {\n this.labelIndex(name)\n this.width = Math.max(this.width, name.length)\n this.write(`${this.label(name)} ${line}`)\n }\n\n start(spec: ProcessSpec) {\n this.width = Math.max(this.width, spec.name.length)\n const child = Bun.spawn(spec.cmd, {\n cwd: spec.cwd,\n env: { ...process.env, ...spec.env },\n stdin: 'ignore',\n // Own process group, so stop() reaches the child's children too.\n detached: true,\n stdout: 'pipe',\n stderr: 'pipe',\n })\n this.children.push(child)\n const emit = (line: string) => {\n const shown = spec.filter ? spec.filter(line) : line\n if (shown !== undefined) this.log(spec.name, shown)\n }\n const pump = async (stream: ReadableStream<Uint8Array>) => {\n let pending = ''\n const decoder = new TextDecoder()\n const reader = stream.getReader()\n for (;;) {\n const { done, value } = await reader.read()\n if (done) break\n const chunk = decoder.decode(value, { stream: true })\n const result = prefixLines(chunk, pending)\n pending = result.pending\n for (const line of result.lines) emit(line)\n }\n if (pending) emit(pending)\n }\n const output = Promise.all([pump(child.stdout), pump(child.stderr)])\n void child.exited.then(async (code) => {\n await output.catch(() => {})\n if (!this.stopping) this.resolveExit({ name: spec.name, code })\n })\n }\n\n /**\n * SIGINT to each child's process group, as Ctrl+C in a terminal does, then\n * SIGKILL to the groups after 3 s. `celld dev` runs a node process that\n * ignores SIGTERM, so a signal to the leader alone leaves it running.\n */\n async stop() {\n this.stopping = true\n const signal = (sig: NodeJS.Signals) => {\n for (const child of this.children) {\n try {\n process.kill(-child.pid, sig)\n } catch {\n // The group is gone already.\n }\n }\n }\n signal('SIGINT')\n await Promise.race([\n Promise.allSettled(this.children.map((child) => child.exited)),\n Bun.sleep(3_000),\n ])\n signal('SIGKILL')\n await Promise.allSettled(this.children.map((child) => child.exited))\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=push.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../src/dev/push.ts"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ // Subprocess of `workerstack dev`: `bun push.ts <app directory>`. A fresh
2
+ // process sees the current app code on each run. It regenerates
3
+ // workerstack.blueprint.yaml and wrangler.json from it, and pushes the schema
4
+ // (or applies committed migrations) to the dev database.
5
+ import { generateBlueprint } from '../blueprint-generator.js';
6
+ import { loadBackend, runWranglerCommand } from '../workers/wrangler.js';
7
+ const directory = process.argv[2];
8
+ if (!directory)
9
+ throw new Error('usage: push.ts <app directory>');
10
+ const blueprint = await generateBlueprint({ directory });
11
+ if (blueprint.changed)
12
+ console.log('workerstack.blueprint.yaml updated');
13
+ const wrangler = await runWranglerCommand({ directory });
14
+ if (wrangler.changed)
15
+ console.log('wrangler.json updated');
16
+ const { backend } = await loadBackend(directory);
17
+ // Resolve from the app, so provision sees the same workerstack instance as
18
+ // the backend it provisions.
19
+ const { provision } = (await import(Bun.resolveSync('workerstack/provision-schema', directory)));
20
+ const app = (await backend.start({
21
+ env: process.env,
22
+ }));
23
+ try {
24
+ await provision(app);
25
+ console.log('schema is current');
26
+ }
27
+ finally {
28
+ await app.close();
29
+ }
30
+ //# sourceMappingURL=push.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/dev/push.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,gEAAgE;AAChE,8EAA8E;AAC9E,yDAAyD;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAErE,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjC,IAAI,CAAC,SAAS;IAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;AAEjE,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,EAAE,SAAS,EAAE,CAAC,CAAA;AACxD,IAAI,SAAS,CAAC,OAAO;IAAE,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAA;AAExE,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,EAAE,SAAS,EAAE,CAAC,CAAA;AACxD,IAAI,QAAQ,CAAC,OAAO;IAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA;AAE1D,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,WAAW,CAAC,SAAS,CAAC,CAAA;AAChD,2EAA2E;AAC3E,6BAA6B;AAC7B,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,MAAM,CACjC,GAAG,CAAC,WAAW,CAAC,8BAA8B,EAAE,SAAS,CAAC,CAC3D,CAAyC,CAAA;AAC1C,MAAM,GAAG,GAAG,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC;IAC/B,GAAG,EAAE,OAAO,CAAC,GAAyC;CACvD,CAAC,CAA+B,CAAA;AACjC,IAAI,CAAC;IACH,MAAM,SAAS,CAAC,GAAG,CAAC,CAAA;IACpB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;AAClC,CAAC;QAAS,CAAC;IACT,MAAM,GAAG,CAAC,KAAK,EAAE,CAAA;AACnB,CAAC","sourcesContent":["// Subprocess of `workerstack dev`: `bun push.ts <app directory>`. A fresh\n// process sees the current app code on each run. It regenerates\n// workerstack.blueprint.yaml and wrangler.json from it, and pushes the schema\n// (or applies committed migrations) to the dev database.\nimport { generateBlueprint } from '../blueprint-generator'\nimport { loadBackend, runWranglerCommand } from '../workers/wrangler'\n\nconst directory = process.argv[2]\nif (!directory) throw new Error('usage: push.ts <app directory>')\n\nconst blueprint = await generateBlueprint({ directory })\nif (blueprint.changed) console.log('workerstack.blueprint.yaml updated')\n\nconst wrangler = await runWranglerCommand({ directory })\nif (wrangler.changed) console.log('wrangler.json updated')\n\nconst { backend } = await loadBackend(directory)\n// Resolve from the app, so provision sees the same workerstack instance as\n// the backend it provisions.\nconst { provision } = (await import(\n Bun.resolveSync('workerstack/provision-schema', directory)\n)) as typeof import('../provision-schema')\nconst app = (await backend.start({\n env: process.env as Record<string, string | undefined>,\n})) as { close(): Promise<void> }\ntry {\n await provision(app)\n console.log('schema is current')\n} finally {\n await app.close()\n}\n"]}
@@ -0,0 +1,17 @@
1
+ /** The only dialect: SQLite (libsql, Turso). Kept in the blueprint schema. */
2
+ export type Dialect = 'sqlite';
3
+ /**
4
+ * Minimal structural view of a drizzle db. Internal modules run dynamic
5
+ * tables (Record<string, unknown> schemas) where drizzle's generics add no
6
+ * safety, so they accept this instead. The public surface (`app.db`, API
7
+ * context) keeps full typing via `DbFor` in db.ts.
8
+ */
9
+ export type AnyDb = {
10
+ select: (...args: any[]) => any;
11
+ insert: (...args: any[]) => any;
12
+ update: (...args: any[]) => any;
13
+ delete: (...args: any[]) => any;
14
+ };
15
+ /** Every table must be a SQLite table. */
16
+ export declare function assertSqliteSchema(schema: Record<string, unknown>): void;
17
+ //# sourceMappingURL=dialect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialect.d.ts","sourceRoot":"","sources":["../src/dialect.ts"],"names":[],"mappings":"AAIA,8EAA8E;AAC9E,MAAM,MAAM,OAAO,GAAG,QAAQ,CAAA;AAE9B;;;;;GAKG;AACH,MAAM,MAAM,KAAK,GAAG;IAClB,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAA;IAC/B,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAA;IAC/B,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAA;IAC/B,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAA;CAChC,CAAA;AAED,0CAA0C;AAC1C,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAQxE"}
@@ -0,0 +1,12 @@
1
+ // src/dialect.ts — the database is SQLite (libsql locally and on Turso).
2
+ import { is, isTable } from 'drizzle-orm';
3
+ import { SQLiteTable } from 'drizzle-orm/sqlite-core';
4
+ /** Every table must be a SQLite table. */
5
+ export function assertSqliteSchema(schema) {
6
+ for (const [key, value] of Object.entries(schema)) {
7
+ if (isTable(value) && !is(value, SQLiteTable)) {
8
+ throw new Error(`[workerstack] "${key}" is not a SQLite table. Define every table with drizzle-orm/sqlite-core.`);
9
+ }
10
+ }
11
+ }
12
+ //# sourceMappingURL=dialect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialect.js","sourceRoot":"","sources":["../src/dialect.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAkBrD,0CAA0C;AAC1C,MAAM,UAAU,kBAAkB,CAAC,MAA+B;IAChE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CACb,kBAAkB,GAAG,2EAA2E,CACjG,CAAA;QACH,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["// src/dialect.ts — the database is SQLite (libsql locally and on Turso).\nimport { is, isTable } from 'drizzle-orm'\nimport { SQLiteTable } from 'drizzle-orm/sqlite-core'\n\n/** The only dialect: SQLite (libsql, Turso). Kept in the blueprint schema. */\nexport type Dialect = 'sqlite'\n\n/**\n * Minimal structural view of a drizzle db. Internal modules run dynamic\n * tables (Record<string, unknown> schemas) where drizzle's generics add no\n * safety, so they accept this instead. The public surface (`app.db`, API\n * context) keeps full typing via `DbFor` in db.ts.\n */\nexport type AnyDb = {\n select: (...args: any[]) => any\n insert: (...args: any[]) => any\n update: (...args: any[]) => any\n delete: (...args: any[]) => any\n}\n\n/** Every table must be a SQLite table. */\nexport function assertSqliteSchema(schema: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(schema)) {\n if (isTable(value) && !is(value, SQLiteTable)) {\n throw new Error(\n `[workerstack] \"${key}\" is not a SQLite table. Define every table with drizzle-orm/sqlite-core.`,\n )\n }\n }\n}\n"]}
@@ -0,0 +1,20 @@
1
+ import type { EmailAdapter } from '../email.js';
2
+ import type { EmailMessage, SentEmail } from '../email.js';
3
+ import type { MessagingDescriptor } from '../messaging/types.js';
4
+ type SmtpTransport = {
5
+ sendMail(message: Record<string, unknown>): Promise<{
6
+ messageId?: string;
7
+ }>;
8
+ };
9
+ export declare function createSmtpAdapter(options: {
10
+ url: string;
11
+ }, createTransport?: (url: string) => SmtpTransport): EmailAdapter;
12
+ export declare const smtp: (options: {
13
+ url: string;
14
+ from?: string;
15
+ }) => MessagingDescriptor<"email", "smtp", EmailMessage, SentEmail, {
16
+ adapter: EmailAdapter;
17
+ from?: string;
18
+ }>;
19
+ export {};
20
+ //# sourceMappingURL=smtp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smtp.d.ts","sourceRoot":"","sources":["../../src/email/smtp.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAI7D,KAAK,aAAa,GAAG;IACnB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC5E,CAAA;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,EACxB,eAAe,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,aACgB,GACjD,YAAY,CA6Bd;AAED,eAAO,MAAM,IAAI,GAAI,SAAS;IAC5B,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,KAAG,mBAAmB,CACrB,OAAO,EACP,MAAM,EACN,YAAY,EACZ,SAAS,EACT;IAAE,OAAO,EAAE,YAAY,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAKtC,CAAA"}
@@ -0,0 +1,31 @@
1
+ import nodemailer from 'nodemailer';
2
+ import { descriptor } from '../messaging/types.js';
3
+ export function createSmtpAdapter(options, createTransport = (url) => nodemailer.createTransport(url)) {
4
+ const toArray = (v) => v === undefined ? undefined : Array.isArray(v) ? v : [v];
5
+ let transportPromise = null;
6
+ const getTransport = () => {
7
+ transportPromise ??= Promise.resolve(createTransport(options.url));
8
+ return transportPromise;
9
+ };
10
+ return {
11
+ async send(msg) {
12
+ const transport = await getTransport();
13
+ const info = await transport.sendMail({
14
+ from: msg.from,
15
+ to: toArray(msg.to).join(', '),
16
+ subject: msg.subject,
17
+ html: msg.html,
18
+ text: msg.text,
19
+ replyTo: msg.replyTo,
20
+ cc: toArray(msg.cc)?.join(', '),
21
+ bcc: toArray(msg.bcc)?.join(', '),
22
+ });
23
+ return { id: info.messageId };
24
+ },
25
+ };
26
+ }
27
+ export const smtp = (options) => descriptor('email', 'smtp', {
28
+ adapter: createSmtpAdapter(options),
29
+ from: options.from,
30
+ });
31
+ //# sourceMappingURL=smtp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smtp.js","sourceRoot":"","sources":["../../src/email/smtp.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,YAAY,CAAA;AAMnC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAM/C,MAAM,UAAU,iBAAiB,CAC/B,OAAwB,EACxB,kBAAkD,CAAC,GAAG,EAAE,EAAE,CACxD,UAAU,CAAC,eAAe,CAAC,GAAG,CAAkB;IAElD,MAAM,OAAO,GAAG,CAAC,CAAgC,EAAE,EAAE,CACnD,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAE1D,IAAI,gBAAgB,GAER,IAAI,CAAA;IAEhB,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,gBAAgB,KAAK,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA;QAClE,OAAO,gBAAgB,CAAA;IACzB,CAAC,CAAA;IAED,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,GAAG;YACZ,MAAM,SAAS,GAAG,MAAM,YAAY,EAAE,CAAA;YACtC,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC;gBACpC,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC/B,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC;gBAC/B,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC;aAClC,CAAC,CAAA;YACF,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,CAAA;QAC/B,CAAC;KACF,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,OAGpB,EAMC,EAAE,CACF,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE;IAC1B,OAAO,EAAE,iBAAiB,CAAC,OAAO,CAAC;IACnC,IAAI,EAAE,OAAO,CAAC,IAAI;CACnB,CAAC,CAAA","sourcesContent":["import nodemailer from 'nodemailer'\n\nimport type { EmailAdapter } from '../email'\nimport type { EmailMessage, SentEmail } from '../email'\nimport type { MessagingDescriptor } from '../messaging/types'\n\nimport { descriptor } from '../messaging/types'\n\ntype SmtpTransport = {\n sendMail(message: Record<string, unknown>): Promise<{ messageId?: string }>\n}\n\nexport function createSmtpAdapter(\n options: { url: string },\n createTransport: (url: string) => SmtpTransport = (url) =>\n nodemailer.createTransport(url) as SmtpTransport,\n): EmailAdapter {\n const toArray = (v: string | string[] | undefined) =>\n v === undefined ? undefined : Array.isArray(v) ? v : [v]\n\n let transportPromise: Promise<{\n sendMail(opts: Record<string, unknown>): Promise<{ messageId?: string }>\n }> | null = null\n\n const getTransport = () => {\n transportPromise ??= Promise.resolve(createTransport(options.url))\n return transportPromise\n }\n\n return {\n async send(msg) {\n const transport = await getTransport()\n const info = await transport.sendMail({\n from: msg.from,\n to: toArray(msg.to)!.join(', '),\n subject: msg.subject,\n html: msg.html,\n text: msg.text,\n replyTo: msg.replyTo,\n cc: toArray(msg.cc)?.join(', '),\n bcc: toArray(msg.bcc)?.join(', '),\n })\n return { id: info.messageId }\n },\n }\n}\n\nexport const smtp = (options: {\n url: string\n from?: string\n}): MessagingDescriptor<\n 'email',\n 'smtp',\n EmailMessage,\n SentEmail,\n { adapter: EmailAdapter; from?: string }\n> =>\n descriptor('email', 'smtp', {\n adapter: createSmtpAdapter(options),\n from: options.from,\n })\n"]}
@@ -0,0 +1,26 @@
1
+ export type EmailMessage = {
2
+ to: string | string[];
3
+ subject: string;
4
+ html?: string;
5
+ text?: string;
6
+ from?: string;
7
+ replyTo?: string;
8
+ cc?: string | string[];
9
+ bcc?: string | string[];
10
+ };
11
+ export type SentEmail = {
12
+ id?: string;
13
+ providerId?: string;
14
+ };
15
+ /** Adapters receive the message with `from` already resolved. */
16
+ export type EmailAdapter = {
17
+ send(msg: EmailMessage & {
18
+ from: string;
19
+ }): Promise<{
20
+ id?: string;
21
+ }>;
22
+ };
23
+ export type EmailFacade = {
24
+ send(msg: EmailMessage): Promise<SentEmail>;
25
+ };
26
+ //# sourceMappingURL=email.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../src/email.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACtB,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAE5D,iEAAiE;AACjE,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,CAAC,GAAG,EAAE,YAAY,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACrE,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;CAC5C,CAAA"}
package/dist/email.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=email.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email.js","sourceRoot":"","sources":["../src/email.ts"],"names":[],"mappings":"","sourcesContent":["export type EmailMessage = {\n to: string | string[]\n subject: string\n html?: string\n text?: string\n from?: string\n replyTo?: string\n cc?: string | string[]\n bcc?: string | string[]\n}\n\nexport type SentEmail = { id?: string; providerId?: string }\n\n/** Adapters receive the message with `from` already resolved. */\nexport type EmailAdapter = {\n send(msg: EmailMessage & { from: string }): Promise<{ id?: string }>\n}\n\nexport type EmailFacade = {\n send(msg: EmailMessage): Promise<SentEmail>\n}\n"]}
@@ -0,0 +1,9 @@
1
+ import type { EnvConfigInput } from './env.js';
2
+ export declare class BlueprintProbeError extends Error {
3
+ constructor(key: string);
4
+ }
5
+ export declare function createEnvProbeSources(envSchema: EnvConfigInput | undefined, configured: Record<string, string | undefined>): readonly [
6
+ Record<string, string | undefined>,
7
+ Record<string, string | undefined>
8
+ ];
9
+ //# sourceMappingURL=env-probe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-probe.d.ts","sourceRoot":"","sources":["../src/env-probe.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;AAwB3C,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,GAAG,EAAE,MAAM;CAOxB;AAmCD,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,cAAc,GAAG,SAAS,EACrC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAC7C,SAAS;IACV,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC,CAUA"}
@@ -0,0 +1,72 @@
1
+ import { validateStandardSchema } from './standard-schema.js';
2
+ const CANDIDATES = [
3
+ undefined,
4
+ '',
5
+ 'probe',
6
+ 'true',
7
+ 'false',
8
+ '0',
9
+ '1',
10
+ 'https://example.invalid',
11
+ 'file:./workerstack-probe.db',
12
+ 'probe@example.invalid',
13
+ '00000000-0000-4000-8000-000000000000',
14
+ ];
15
+ const BASE_SOURCE = {
16
+ NODE_ENV: 'production',
17
+ AUTH_SECRET: 'workerstack-blueprint-probe-secret',
18
+ DATABASE_URL: 'file:./workerstack-blueprint-probe.db',
19
+ };
20
+ export class BlueprintProbeError extends Error {
21
+ constructor(key) {
22
+ super(`[workerstack] cannot synthesize a valid blueprint probe for env key ${key}; ` +
23
+ 'provide a valid value while generating the blueprint');
24
+ this.name = 'BlueprintProbeError';
25
+ }
26
+ }
27
+ function identity(value) {
28
+ if (value === undefined)
29
+ return 'undefined';
30
+ if (typeof value === 'number' && Number.isNaN(value))
31
+ return 'number:NaN';
32
+ try {
33
+ return `${typeof value}:${JSON.stringify(value)}`;
34
+ }
35
+ catch {
36
+ return `${typeof value}:${String(value)}`;
37
+ }
38
+ }
39
+ function acceptedValues(key, schema, configured) {
40
+ const accepted = [];
41
+ const outputs = new Set();
42
+ for (const candidate of [configured, ...CANDIDATES]) {
43
+ try {
44
+ const output = validateStandardSchema(schema, candidate, 'env');
45
+ const id = identity(output);
46
+ if (outputs.has(id))
47
+ continue;
48
+ outputs.add(id);
49
+ accepted.push(candidate);
50
+ if (accepted.length === 2)
51
+ return accepted;
52
+ }
53
+ catch {
54
+ // Candidate failures are expected. The eventual error names only the key.
55
+ }
56
+ }
57
+ if (accepted.length === 0)
58
+ throw new BlueprintProbeError(key);
59
+ return accepted;
60
+ }
61
+ export function createEnvProbeSources(envSchema, configured) {
62
+ const first = { ...BASE_SOURCE };
63
+ const second = { ...BASE_SOURCE };
64
+ const variables = { ...envSchema?.server, ...envSchema?.client };
65
+ for (const [key, schema] of Object.entries(variables)) {
66
+ const values = acceptedValues(key, schema, configured[key]);
67
+ first[key] = values[0];
68
+ second[key] = values[1] ?? values[0];
69
+ }
70
+ return [first, second];
71
+ }
72
+ //# sourceMappingURL=env-probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-probe.js","sourceRoot":"","sources":["../src/env-probe.ts"],"names":[],"mappings":"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","sourcesContent":["import type { StandardSchemaV1 } from '@standard-schema/spec'\n\nimport type { EnvConfigInput } from './env'\n\nimport { validateStandardSchema } from './standard-schema'\n\nconst CANDIDATES: readonly (string | undefined)[] = [\n undefined,\n '',\n 'probe',\n 'true',\n 'false',\n '0',\n '1',\n 'https://example.invalid',\n 'file:./workerstack-probe.db',\n 'probe@example.invalid',\n '00000000-0000-4000-8000-000000000000',\n]\n\nconst BASE_SOURCE = {\n NODE_ENV: 'production',\n AUTH_SECRET: 'workerstack-blueprint-probe-secret',\n DATABASE_URL: 'file:./workerstack-blueprint-probe.db',\n} satisfies Record<string, string | undefined>\n\nexport class BlueprintProbeError extends Error {\n constructor(key: string) {\n super(\n `[workerstack] cannot synthesize a valid blueprint probe for env key ${key}; ` +\n 'provide a valid value while generating the blueprint',\n )\n this.name = 'BlueprintProbeError'\n }\n}\n\nfunction identity(value: unknown): string {\n if (value === undefined) return 'undefined'\n if (typeof value === 'number' && Number.isNaN(value)) return 'number:NaN'\n try {\n return `${typeof value}:${JSON.stringify(value)}`\n } catch {\n return `${typeof value}:${String(value)}`\n }\n}\n\nfunction acceptedValues(\n key: string,\n schema: StandardSchemaV1,\n configured: string | undefined,\n): (string | undefined)[] {\n const accepted: (string | undefined)[] = []\n const outputs = new Set<string>()\n for (const candidate of [configured, ...CANDIDATES]) {\n try {\n const output = validateStandardSchema(schema, candidate, 'env')\n const id = identity(output)\n if (outputs.has(id)) continue\n outputs.add(id)\n accepted.push(candidate)\n if (accepted.length === 2) return accepted\n } catch {\n // Candidate failures are expected. The eventual error names only the key.\n }\n }\n if (accepted.length === 0) throw new BlueprintProbeError(key)\n return accepted\n}\n\nexport function createEnvProbeSources(\n envSchema: EnvConfigInput | undefined,\n configured: Record<string, string | undefined>,\n): readonly [\n Record<string, string | undefined>,\n Record<string, string | undefined>,\n] {\n const first: Record<string, string | undefined> = { ...BASE_SOURCE }\n const second: Record<string, string | undefined> = { ...BASE_SOURCE }\n const variables = { ...envSchema?.server, ...envSchema?.client }\n for (const [key, schema] of Object.entries(variables)) {\n const values = acceptedValues(key, schema, configured[key])\n first[key] = values[0]\n second[key] = values[1] ?? values[0]\n }\n return [first, second]\n}\n"]}
package/dist/env.d.ts ADDED
@@ -0,0 +1,62 @@
1
+ import type { StandardSchemaV1 } from '@standard-schema/spec';
2
+ export declare const CLIENT_PREFIX: "PUBLIC_";
3
+ /**
4
+ * Static, value-free metadata about an environment key. It reaches the manifest
5
+ * and the committed blueprint, so it must never contain a value or a secret.
6
+ */
7
+ export type EnvVarMeta = {
8
+ /**
9
+ * Whether the value is a secret. Defaults to `true` for server keys and
10
+ * `false` for client keys. A client key can never be sensitive: `PUBLIC_*`
11
+ * values are compiled into the browser bundle.
12
+ */
13
+ sensitive?: boolean;
14
+ /** Prose shown to whoever fills this key in. Max 200 characters. */
15
+ description?: string;
16
+ };
17
+ export type EnvConfigInput = {
18
+ server?: Record<string, StandardSchemaV1>;
19
+ client?: Record<string, StandardSchemaV1>;
20
+ /** Explicit value source for client vars (e.g. Vite's import.meta.env). */
21
+ runtimeEnv?: Record<string, unknown>;
22
+ /** Value-free metadata per key, keyed by the key's own name. */
23
+ meta?: Record<string, EnvVarMeta>;
24
+ };
25
+ /** Vars workerstack itself consumes, always validated. */
26
+ export type BaseEnv = {
27
+ NODE_ENV?: string;
28
+ DATABASE_URL: string;
29
+ DATABASE_AUTH_TOKEN?: string;
30
+ AUTH_SECRET: string;
31
+ RESEND_API_KEY?: string;
32
+ WORKERSTACK_MESSAGING_CONFIG?: string;
33
+ WORKERSTACK_BLUEPRINT_PATH?: string;
34
+ BUNDERHOST_ENVIRONMENT_ID?: string;
35
+ /** Deployed commit SHA, injected by the platform. Reported by readiness. */
36
+ WORKERSTACK_REVISION?: string;
37
+ };
38
+ type InferVars<T> = T extends Record<string, StandardSchemaV1> ? {
39
+ [K in keyof T]: StandardSchemaV1.InferOutput<T[K]>;
40
+ } : unknown;
41
+ export type ValidatedEnv<TEnv extends EnvConfigInput | undefined> = [
42
+ TEnv
43
+ ] extends [EnvConfigInput] ? BaseEnv & InferVars<NonNullable<TEnv>['server']> & InferVars<NonNullable<TEnv>['client']> : BaseEnv;
44
+ export declare class WorkerstackEnvError extends Error {
45
+ readonly issues: string[];
46
+ constructor(issues: string[]);
47
+ }
48
+ export type ValidateEnvOptions = {
49
+ /** Value source; defaults to process.env. Tests pass this explicitly. */
50
+ source?: Record<string, string | undefined>;
51
+ /** Dialect-aware DATABASE_URL fallback; workerstack passes it. */
52
+ defaultDatabaseUrl?: string;
53
+ };
54
+ export declare function validateEnv<TEnv extends EnvConfigInput | undefined>(envConfig: TEnv, options?: ValidateEnvOptions): ValidatedEnv<TEnv>;
55
+ /**
56
+ * Browser-side companion (t3-env style): validates ONLY the client section.
57
+ * Server keys exist on the returned object as traps that throw on access, so
58
+ * a leaked import fails loudly instead of silently reading undefined.
59
+ */
60
+ export declare function createClientEnv<TEnv extends EnvConfigInput>(envConfig: TEnv): InferVars<TEnv['client']>;
61
+ export {};
62
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAO7D,eAAO,MAAM,aAAa,EAAG,SAAkB,CAAA;AAE/C;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,oEAAoE;IACpE,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;IACzC,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACpC,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;CAClC,CAAA;AAED,0DAA0D;AAC1D,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,4BAA4B,CAAC,EAAE,MAAM,CAAA;IACrC,0BAA0B,CAAC,EAAE,MAAM,CAAA;IACnC,yBAAyB,CAAC,EAAE,MAAM,CAAA;IAClC,4EAA4E;IAC5E,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAC9B,CAAA;AAED,KAAK,SAAS,CAAC,CAAC,IACd,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GACtC;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GACtD,OAAO,CAAA;AAGb,MAAM,MAAM,YAAY,CAAC,IAAI,SAAS,cAAc,GAAG,SAAS,IAAI;IAClE,IAAI;CACL,SAAS,CAAC,cAAc,CAAC,GACtB,OAAO,GACL,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,GACtC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,GACxC,OAAO,CAAA;AAEX,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAA;gBAEb,MAAM,EAAE,MAAM,EAAE;CAK7B;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IAC3C,kEAAkE;IAClE,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B,CAAA;AAqCD,wBAAgB,WAAW,CAAC,IAAI,SAAS,cAAc,GAAG,SAAS,EACjE,SAAS,EAAE,IAAI,EACf,OAAO,GAAE,kBAAuB,GAC/B,YAAY,CAAC,IAAI,CAAC,CA2BpB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,SAAS,cAAc,EACzD,SAAS,EAAE,IAAI,GACd,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAsB3B"}
package/dist/env.js ADDED
@@ -0,0 +1,86 @@
1
+ import { StandardSchemaValidationError, validateStandardSchema, } from './standard-schema.js';
2
+ export const CLIENT_PREFIX = 'PUBLIC_';
3
+ export class WorkerstackEnvError extends Error {
4
+ issues;
5
+ constructor(issues) {
6
+ super(`Invalid environment:\n - ${issues.join('\n - ')}`);
7
+ this.name = 'WorkerstackEnvError';
8
+ this.issues = issues;
9
+ }
10
+ }
11
+ const DEV_AUTH_SECRET = 'dev-secret-change-in-prod';
12
+ function validateSection(section, kind, source, issues, out) {
13
+ for (const [key, schema] of Object.entries(section ?? {})) {
14
+ const isPublic = key.startsWith(CLIENT_PREFIX);
15
+ if (kind === 'server' && isPublic) {
16
+ issues.push(`${key}: server vars must not start with ${CLIENT_PREFIX} (move it to env.client)`);
17
+ continue;
18
+ }
19
+ if (kind === 'client' && !isPublic) {
20
+ issues.push(`${key}: client vars must start with ${CLIENT_PREFIX} (rename it or move it to env.server)`);
21
+ continue;
22
+ }
23
+ try {
24
+ out[key] = validateStandardSchema(schema, source[key], 'env');
25
+ }
26
+ catch (error) {
27
+ if (!(error instanceof StandardSchemaValidationError))
28
+ throw error;
29
+ for (const issue of error.issues) {
30
+ const path = issue.path.map(String).join('.');
31
+ issues.push(`${key}${path ? `.${path}` : ''}: ${issue.message}`);
32
+ }
33
+ }
34
+ }
35
+ }
36
+ export function validateEnv(envConfig, options = {}) {
37
+ const source = options.source ?? process.env;
38
+ const issues = [];
39
+ const isProduction = source.NODE_ENV === 'production';
40
+ const base = {
41
+ NODE_ENV: source.NODE_ENV,
42
+ DATABASE_URL: source.DATABASE_URL ?? options.defaultDatabaseUrl ?? 'file:./data.db',
43
+ DATABASE_AUTH_TOKEN: source.DATABASE_AUTH_TOKEN,
44
+ AUTH_SECRET: source.AUTH_SECRET ?? DEV_AUTH_SECRET,
45
+ RESEND_API_KEY: source.RESEND_API_KEY,
46
+ WORKERSTACK_MESSAGING_CONFIG: source.WORKERSTACK_MESSAGING_CONFIG,
47
+ WORKERSTACK_BLUEPRINT_PATH: source.WORKERSTACK_BLUEPRINT_PATH,
48
+ BUNDERHOST_ENVIRONMENT_ID: source.BUNDERHOST_ENVIRONMENT_ID,
49
+ WORKERSTACK_REVISION: source.WORKERSTACK_REVISION,
50
+ };
51
+ if (isProduction && !source.AUTH_SECRET) {
52
+ issues.push('AUTH_SECRET: required in production');
53
+ }
54
+ const userVars = {};
55
+ validateSection(envConfig?.server, 'server', source, issues, userVars);
56
+ validateSection(envConfig?.client, 'client', source, issues, userVars);
57
+ if (issues.length > 0)
58
+ throw new WorkerstackEnvError(issues);
59
+ return { ...base, ...userVars };
60
+ }
61
+ /**
62
+ * Browser-side companion (t3-env style): validates ONLY the client section.
63
+ * Server keys exist on the returned object as traps that throw on access, so
64
+ * a leaked import fails loudly instead of silently reading undefined.
65
+ */
66
+ export function createClientEnv(envConfig) {
67
+ const source = envConfig.runtimeEnv ??
68
+ (typeof process !== 'undefined'
69
+ ? process.env
70
+ : {});
71
+ const issues = [];
72
+ const values = {};
73
+ validateSection(envConfig.client, 'client', source, issues, values);
74
+ if (issues.length > 0)
75
+ throw new WorkerstackEnvError(issues);
76
+ const serverKeys = new Set(Object.keys(envConfig.server ?? {}));
77
+ return new Proxy(values, {
78
+ get(target, prop) {
79
+ if (typeof prop === 'string' && serverKeys.has(prop)) {
80
+ throw new Error(`${prop} is server-only and not available in client env`);
81
+ }
82
+ return Reflect.get(target, prop);
83
+ },
84
+ });
85
+ }
86
+ //# sourceMappingURL=env.js.map