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,199 @@
1
+ import { mkdir, readFile, realpath, rename, rm, stat, writeFile, } from 'node:fs/promises';
2
+ import { dirname, isAbsolute, join, relative, resolve } from 'node:path';
3
+ import { pathToFileURL } from 'node:url';
4
+ import { parse } from 'yaml';
5
+ import { isWorkerstackBackend } from './backend.js';
6
+ import { BACKEND_INTERNALS } from './backend-internals.js';
7
+ import { blueprintFromManifest, parseWorkerBlueprintYaml, serializeBlueprint, WORKER_PACKAGE_ENTRIES, } from './blueprint.js';
8
+ import { createEnvProbeSources } from './env-probe.js';
9
+ import { assertManifestMatchesBlueprint } from './hosted-contract.js';
10
+ import { parseManifest } from './manifest.js';
11
+ import { diffManifests } from './manifest-diff.js';
12
+ export class BlueprintCheckError extends Error {
13
+ constructor() {
14
+ super('workerstack.blueprint.yaml is missing or stale; run `workerstack blueprint`');
15
+ this.name = 'BlueprintCheckError';
16
+ }
17
+ }
18
+ function requireRelativePath(value, label) {
19
+ const normalized = value.replaceAll('\\', '/');
20
+ if (!normalized ||
21
+ isAbsolute(normalized) ||
22
+ normalized.split('/').some((part) => !part || part === '..')) {
23
+ throw new Error(`[workerstack] ${label} must be a relative path without traversal`);
24
+ }
25
+ return normalized;
26
+ }
27
+ function resolveWithin(root, value, label) {
28
+ const path = resolve(root, requireRelativePath(value, label));
29
+ const pathFromRoot = relative(root, path);
30
+ if (pathFromRoot === '..' ||
31
+ pathFromRoot.startsWith('../') ||
32
+ isAbsolute(pathFromRoot)) {
33
+ throw new Error(`[workerstack] ${label} must stay within the application directory`);
34
+ }
35
+ return path;
36
+ }
37
+ function normalizeProjectPath(root, value, label) {
38
+ if (!isAbsolute(value))
39
+ return requireRelativePath(value, label);
40
+ const pathFromRoot = relative(root, resolve(value)) || '.';
41
+ return requireRelativePath(pathFromRoot, label);
42
+ }
43
+ function requireScript(pkg, name, required) {
44
+ const value = pkg.scripts?.[name];
45
+ if (typeof value === 'string' && value.trim())
46
+ return true;
47
+ if (required)
48
+ throw new Error(`[workerstack] package.json requires a non-empty "${name}" script`);
49
+ return false;
50
+ }
51
+ async function readText(path) {
52
+ return readFile(path, 'utf8').catch(() => undefined);
53
+ }
54
+ /**
55
+ * Worker settings survive regeneration: the committed blueprint wins, then an
56
+ * old wrangler.json (apps from beta.1 and beta.2), then the defaults.
57
+ */
58
+ async function exists(path) {
59
+ return stat(path).then(() => true, () => false);
60
+ }
61
+ async function workerSettings(directory, existing, today, hasStart) {
62
+ let fromBlueprint = {};
63
+ try {
64
+ const raw = parse(existing ?? '');
65
+ fromBlueprint = raw?.application?.worker ?? {};
66
+ }
67
+ catch { }
68
+ let fromWrangler = {};
69
+ try {
70
+ const raw = JSON.parse((await readText(join(directory, 'wrangler.json'))) ?? 'null');
71
+ fromWrangler = {
72
+ main: raw?.main,
73
+ compatibilityDate: raw?.compatibility_date,
74
+ assets: raw?.assets?.directory,
75
+ };
76
+ }
77
+ catch { }
78
+ const pick = (key, fallback) => {
79
+ const value = fromBlueprint[key] ?? fromWrangler[key];
80
+ return typeof value === 'string' && value ? value : fallback;
81
+ };
82
+ const render = fromBlueprint.render === 'ssr' || fromBlueprint.render === 'spa'
83
+ ? fromBlueprint.render
84
+ : hasStart
85
+ ? 'ssr'
86
+ : 'spa';
87
+ // An old wrangler.json names src/worker.ts; keep it only while it exists.
88
+ if (fromWrangler.main &&
89
+ !WORKER_PACKAGE_ENTRIES.includes(fromWrangler.main) &&
90
+ !(await exists(join(directory, fromWrangler.main)))) {
91
+ fromWrangler.main = undefined;
92
+ }
93
+ const defaultMain = (await exists(join(directory, 'src/server.ts')))
94
+ ? 'src/server.ts'
95
+ : render === 'ssr'
96
+ ? 'workerstack/start/server-entry'
97
+ : 'workerstack/workers/entry';
98
+ return {
99
+ render,
100
+ main: pick('main', defaultMain),
101
+ compatibilityDate: pick('compatibilityDate', today),
102
+ assets: pick('assets', 'dist/client'),
103
+ };
104
+ }
105
+ async function packageVersion() {
106
+ const pkg = (await Bun.file(new URL('../package.json', import.meta.url)).json());
107
+ return pkg.version;
108
+ }
109
+ export async function generateBlueprint(options) {
110
+ const directory = await realpath(resolve(options.directory));
111
+ const packagePath = join(directory, 'package.json');
112
+ const pkg = JSON.parse(await readFile(packagePath, 'utf8'));
113
+ const allDependencies = { ...pkg.dependencies, ...pkg.devDependencies };
114
+ let framework = 'bun-ssr';
115
+ if (typeof allDependencies['@tanstack/react-start'] === 'string') {
116
+ framework = 'tanstack-start';
117
+ }
118
+ else if (typeof allDependencies['solid-js'] === 'string' ||
119
+ typeof allDependencies['@solidjs/web'] === 'string') {
120
+ framework = 'solid';
121
+ }
122
+ requireScript(pkg, 'build', true);
123
+ const configuredEntry = pkg.workerstack?.entry;
124
+ const entry = requireRelativePath(options.entry ??
125
+ (typeof configuredEntry === 'string'
126
+ ? configuredEntry
127
+ : 'src/workerstack.ts'), 'entry');
128
+ const entryPath = resolveWithin(directory, entry, 'entry');
129
+ if (!(await Bun.file(entryPath).exists())) {
130
+ throw new Error(`[workerstack] entry does not exist: ${entry}`);
131
+ }
132
+ const output = requireRelativePath(options.output ?? 'workerstack.blueprint.yaml', 'output');
133
+ const outputPath = resolveWithin(directory, output, 'output');
134
+ const module = (await import(`${pathToFileURL(entryPath).href}?blueprint=${Date.now()}`));
135
+ const backend = module.backend;
136
+ if (!isWorkerstackBackend(backend)) {
137
+ throw new Error(`[workerstack] ${entry} must export backend`);
138
+ }
139
+ if (options.hostedCheck) {
140
+ const file = Bun.file(outputPath);
141
+ if (!(await file.exists())) {
142
+ throw new Error(`[workerstack] hosted blueprint does not exist: ${output}`);
143
+ }
144
+ const source = await file.text();
145
+ const manifest = parseManifest(backend.inspect({ env: process.env }));
146
+ assertManifestMatchesBlueprint(manifest, source);
147
+ return {
148
+ path: outputPath,
149
+ blueprint: parseWorkerBlueprintYaml(source),
150
+ source,
151
+ changed: false,
152
+ };
153
+ }
154
+ const probeSources = createEnvProbeSources(backend[BACKEND_INTERNALS].envSchema, process.env);
155
+ const firstManifest = parseManifest(backend.inspect({ env: probeSources[0] }));
156
+ const secondManifest = parseManifest(backend.inspect({ env: probeSources[1] }));
157
+ const differences = diffManifests(firstManifest, secondManifest);
158
+ if (differences.length > 0) {
159
+ throw new Error('[workerstack] environment-dependent blueprint shape:\n' +
160
+ differences.map(({ kind, path }) => ` - ${kind}: ${path}`).join('\n'));
161
+ }
162
+ const manifest = firstManifest;
163
+ const migrationsDirectory = normalizeProjectPath(directory, manifest.database.migrationsDirectory, 'migrationsDirectory');
164
+ const migrationJournal = join(resolveWithin(directory, migrationsDirectory, 'migrationsDirectory'), 'meta', '_journal.json');
165
+ const migrationMode = (await Bun.file(migrationJournal).exists())
166
+ ? 'migrations'
167
+ : 'push';
168
+ const existing = await readText(outputPath);
169
+ const blueprint = blueprintFromManifest({
170
+ manifest: {
171
+ ...manifest,
172
+ database: { ...manifest.database, migrationsDirectory },
173
+ },
174
+ generatorVersion: await packageVersion(),
175
+ entry,
176
+ migrationMode,
177
+ framework,
178
+ worker: await workerSettings(directory, existing, options.today ?? new Date().toISOString().slice(0, 10), typeof allDependencies['@tanstack/react-start'] === 'string'),
179
+ });
180
+ const source = serializeBlueprint(blueprint);
181
+ if (options.check) {
182
+ if (existing !== source)
183
+ throw new BlueprintCheckError();
184
+ return { path: outputPath, blueprint, source, changed: false };
185
+ }
186
+ if (existing === source)
187
+ return { path: outputPath, blueprint, source, changed: false };
188
+ await mkdir(dirname(outputPath), { recursive: true });
189
+ const temporary = `${outputPath}.${process.pid}.${Date.now()}.tmp`;
190
+ try {
191
+ await writeFile(temporary, source, { mode: 0o600 });
192
+ await rename(temporary, outputPath);
193
+ }
194
+ finally {
195
+ await rm(temporary, { force: true });
196
+ }
197
+ return { path: outputPath, blueprint, source, changed: true };
198
+ }
199
+ //# sourceMappingURL=blueprint-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blueprint-generator.js","sourceRoot":"","sources":["../src/blueprint-generator.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n mkdir,\n readFile,\n realpath,\n rename,\n rm,\n stat,\n writeFile,\n} from 'node:fs/promises'\nimport { dirname, isAbsolute, join, relative, resolve } from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport { parse } from 'yaml'\n\nimport { isWorkerstackBackend } from './backend'\nimport { BACKEND_INTERNALS } from './backend-internals'\nimport {\n blueprintFromManifest,\n parseWorkerBlueprintYaml,\n serializeBlueprint,\n WORKER_PACKAGE_ENTRIES,\n type WorkerBlueprint,\n type WorkerRender,\n type WorkerSettings,\n} from './blueprint'\nimport { createEnvProbeSources } from './env-probe'\nimport { assertManifestMatchesBlueprint } from './hosted-contract'\nimport { parseManifest } from './manifest'\nimport { diffManifests } from './manifest-diff'\n\nexport type GenerateBlueprintOptions = {\n directory: string\n entry?: string\n output?: string\n check?: boolean\n hostedCheck?: boolean\n /** UTC date for a new compatibilityDate; tests pin it. */\n today?: string\n}\n\nexport type GenerateBlueprintResult = {\n path: string\n blueprint: WorkerBlueprint\n source: string\n changed: boolean\n}\n\nexport class BlueprintCheckError extends Error {\n constructor() {\n super(\n 'workerstack.blueprint.yaml is missing or stale; run `workerstack blueprint`',\n )\n this.name = 'BlueprintCheckError'\n }\n}\n\ntype AppPackage = {\n scripts?: Record<string, unknown>\n dependencies?: Record<string, unknown>\n devDependencies?: Record<string, unknown>\n workerstack?: { entry?: unknown }\n}\n\nfunction requireRelativePath(value: string, label: string): string {\n const normalized = value.replaceAll('\\\\', '/')\n if (\n !normalized ||\n isAbsolute(normalized) ||\n normalized.split('/').some((part) => !part || part === '..')\n ) {\n throw new Error(\n `[workerstack] ${label} must be a relative path without traversal`,\n )\n }\n return normalized\n}\n\nfunction resolveWithin(root: string, value: string, label: string): string {\n const path = resolve(root, requireRelativePath(value, label))\n const pathFromRoot = relative(root, path)\n if (\n pathFromRoot === '..' ||\n pathFromRoot.startsWith('../') ||\n isAbsolute(pathFromRoot)\n ) {\n throw new Error(\n `[workerstack] ${label} must stay within the application directory`,\n )\n }\n return path\n}\n\nfunction normalizeProjectPath(\n root: string,\n value: string,\n label: string,\n): string {\n if (!isAbsolute(value)) return requireRelativePath(value, label)\n const pathFromRoot = relative(root, resolve(value)) || '.'\n return requireRelativePath(pathFromRoot, label)\n}\n\nfunction requireScript(\n pkg: AppPackage,\n name: 'build',\n required: boolean,\n): boolean {\n const value = pkg.scripts?.[name]\n if (typeof value === 'string' && value.trim()) return true\n if (required)\n throw new Error(\n `[workerstack] package.json requires a non-empty \"${name}\" script`,\n )\n return false\n}\n\nasync function readText(path: string): Promise<string | undefined> {\n return readFile(path, 'utf8').catch(() => undefined)\n}\n\n/**\n * Worker settings survive regeneration: the committed blueprint wins, then an\n * old wrangler.json (apps from beta.1 and beta.2), then the defaults.\n */\nasync function exists(path: string): Promise<boolean> {\n return stat(path).then(\n () => true,\n () => false,\n )\n}\n\nasync function workerSettings(\n directory: string,\n existing: string | undefined,\n today: string,\n hasStart: boolean,\n): Promise<WorkerSettings> {\n let fromBlueprint: Partial<WorkerSettings> = {}\n try {\n const raw = parse(existing ?? '') as {\n application?: { worker?: Partial<WorkerSettings> }\n } | null\n fromBlueprint = raw?.application?.worker ?? {}\n } catch {}\n let fromWrangler: Partial<WorkerSettings> = {}\n try {\n const raw = JSON.parse(\n (await readText(join(directory, 'wrangler.json'))) ?? 'null',\n ) as {\n main?: string\n compatibility_date?: string\n assets?: { directory?: string }\n } | null\n fromWrangler = {\n main: raw?.main,\n compatibilityDate: raw?.compatibility_date,\n assets: raw?.assets?.directory,\n }\n } catch {}\n const pick = (key: keyof WorkerSettings, fallback: string) => {\n const value = fromBlueprint[key] ?? fromWrangler[key]\n return typeof value === 'string' && value ? value : fallback\n }\n const render: WorkerRender =\n fromBlueprint.render === 'ssr' || fromBlueprint.render === 'spa'\n ? fromBlueprint.render\n : hasStart\n ? 'ssr'\n : 'spa'\n // An old wrangler.json names src/worker.ts; keep it only while it exists.\n if (\n fromWrangler.main &&\n !(WORKER_PACKAGE_ENTRIES as readonly string[]).includes(\n fromWrangler.main,\n ) &&\n !(await exists(join(directory, fromWrangler.main)))\n ) {\n fromWrangler.main = undefined\n }\n const defaultMain = (await exists(join(directory, 'src/server.ts')))\n ? 'src/server.ts'\n : render === 'ssr'\n ? 'workerstack/start/server-entry'\n : 'workerstack/workers/entry'\n return {\n render,\n main: pick('main', defaultMain),\n compatibilityDate: pick('compatibilityDate', today),\n assets: pick('assets', 'dist/client'),\n }\n}\n\nasync function packageVersion(): Promise<string> {\n const pkg = (await Bun.file(\n new URL('../package.json', import.meta.url),\n ).json()) as { version: string }\n return pkg.version\n}\n\nexport async function generateBlueprint(\n options: GenerateBlueprintOptions,\n): Promise<GenerateBlueprintResult> {\n const directory = await realpath(resolve(options.directory))\n const packagePath = join(directory, 'package.json')\n const pkg = JSON.parse(await readFile(packagePath, 'utf8')) as AppPackage\n const allDependencies = { ...pkg.dependencies, ...pkg.devDependencies }\n let framework: 'tanstack-start' | 'solid' | 'bun-ssr' = 'bun-ssr'\n if (typeof allDependencies['@tanstack/react-start'] === 'string') {\n framework = 'tanstack-start'\n } else if (\n typeof allDependencies['solid-js'] === 'string' ||\n typeof allDependencies['@solidjs/web'] === 'string'\n ) {\n framework = 'solid'\n }\n requireScript(pkg, 'build', true)\n\n const configuredEntry = pkg.workerstack?.entry\n const entry = requireRelativePath(\n options.entry ??\n (typeof configuredEntry === 'string'\n ? configuredEntry\n : 'src/workerstack.ts'),\n 'entry',\n )\n const entryPath = resolveWithin(directory, entry, 'entry')\n if (!(await Bun.file(entryPath).exists())) {\n throw new Error(`[workerstack] entry does not exist: ${entry}`)\n }\n const output = requireRelativePath(\n options.output ?? 'workerstack.blueprint.yaml',\n 'output',\n )\n const outputPath = resolveWithin(directory, output, 'output')\n\n const module = (await import(\n `${pathToFileURL(entryPath).href}?blueprint=${Date.now()}`\n )) as { backend?: unknown }\n const backend = module.backend\n if (!isWorkerstackBackend(backend)) {\n throw new Error(`[workerstack] ${entry} must export backend`)\n }\n if (options.hostedCheck) {\n const file = Bun.file(outputPath)\n if (!(await file.exists())) {\n throw new Error(\n `[workerstack] hosted blueprint does not exist: ${output}`,\n )\n }\n const source = await file.text()\n const manifest = parseManifest(backend.inspect({ env: process.env }))\n assertManifestMatchesBlueprint(manifest, source)\n return {\n path: outputPath,\n blueprint: parseWorkerBlueprintYaml(source),\n source,\n changed: false,\n }\n }\n const probeSources = createEnvProbeSources(\n backend[BACKEND_INTERNALS].envSchema,\n process.env as Record<string, string | undefined>,\n )\n const firstManifest = parseManifest(backend.inspect({ env: probeSources[0] }))\n const secondManifest = parseManifest(\n backend.inspect({ env: probeSources[1] }),\n )\n const differences = diffManifests(firstManifest, secondManifest)\n if (differences.length > 0) {\n throw new Error(\n '[workerstack] environment-dependent blueprint shape:\\n' +\n differences.map(({ kind, path }) => ` - ${kind}: ${path}`).join('\\n'),\n )\n }\n const manifest = firstManifest\n const migrationsDirectory = normalizeProjectPath(\n directory,\n manifest.database.migrationsDirectory,\n 'migrationsDirectory',\n )\n const migrationJournal = join(\n resolveWithin(directory, migrationsDirectory, 'migrationsDirectory'),\n 'meta',\n '_journal.json',\n )\n const migrationMode = (await Bun.file(migrationJournal).exists())\n ? 'migrations'\n : 'push'\n const existing = await readText(outputPath)\n const blueprint = blueprintFromManifest({\n manifest: {\n ...manifest,\n database: { ...manifest.database, migrationsDirectory },\n },\n generatorVersion: await packageVersion(),\n entry,\n migrationMode,\n framework,\n worker: await workerSettings(\n directory,\n existing,\n options.today ?? new Date().toISOString().slice(0, 10),\n typeof allDependencies['@tanstack/react-start'] === 'string',\n ),\n })\n const source = serializeBlueprint(blueprint)\n if (options.check) {\n if (existing !== source) throw new BlueprintCheckError()\n return { path: outputPath, blueprint, source, changed: false }\n }\n if (existing === source)\n return { path: outputPath, blueprint, source, changed: false }\n await mkdir(dirname(outputPath), { recursive: true })\n const temporary = `${outputPath}.${process.pid}.${Date.now()}.tmp`\n try {\n await writeFile(temporary, source, { mode: 0o600 })\n await rename(temporary, outputPath)\n } finally {\n await rm(temporary, { force: true })\n }\n return { path: outputPath, blueprint, source, changed: true }\n}\n"]}
@@ -0,0 +1,99 @@
1
+ import type { WorkerstackManifest } from './manifest.js';
2
+ export type MigrationMode = 'migrations' | 'push';
3
+ export type ApplicationFramework = 'tanstack-start' | 'solid' | 'bun-ssr' | 'custom';
4
+ /**
5
+ * Blueprint form of an environment key. `sensitive` and `description` are
6
+ * optional because blueprints committed before 0.23.0 do not carry them.
7
+ */
8
+ export type BlueprintEnvVar = {
9
+ key: string;
10
+ required: boolean;
11
+ scope: 'server' | 'client';
12
+ sensitive?: boolean;
13
+ description?: string;
14
+ };
15
+ export declare const WORKER_PACKAGE_ENTRIES: readonly ["workerstack/start/server-entry", "workerstack/workers/entry"];
16
+ export type WorkerRender = 'ssr' | 'spa';
17
+ export type WorkerSettings = {
18
+ render: WorkerRender;
19
+ /** A relative path inside the package, or one of WORKER_PACKAGE_ENTRIES. */
20
+ main: string;
21
+ compatibilityDate: string;
22
+ assets: string;
23
+ };
24
+ type BlueprintBackground = Pick<WorkerstackManifest['background'], 'jobs' | 'cron' | 'maintenance'>;
25
+ type BlueprintBody = {
26
+ generator: {
27
+ name: 'workerstack';
28
+ version: string;
29
+ };
30
+ workerstack: {
31
+ entry: string;
32
+ manifestVersion: 4;
33
+ };
34
+ resources: {
35
+ database: WorkerstackManifest['database'] & {
36
+ migrationMode: MigrationMode;
37
+ };
38
+ storage: WorkerstackManifest['storage'];
39
+ realtime?: {
40
+ required: true;
41
+ };
42
+ messaging: WorkerstackManifest['messaging'];
43
+ };
44
+ environment: BlueprintEnvVar[];
45
+ /** Application-declared procedures. Absent in blueprints written before 0.23.0. */
46
+ api?: {
47
+ operations: WorkerstackManifest['api']['operations'];
48
+ };
49
+ };
50
+ /** The 0.x server contract. Parsed for hosts; never generated by 1.0. */
51
+ export type LegacyBlueprint = BlueprintBody & {
52
+ version: 1;
53
+ application: {
54
+ framework: ApplicationFramework;
55
+ scripts: {
56
+ build: 'build';
57
+ start: 'start';
58
+ worker?: 'worker';
59
+ };
60
+ };
61
+ background: BlueprintBackground & {
62
+ worker: {
63
+ required: boolean;
64
+ };
65
+ };
66
+ };
67
+ /** The 1.0 Worker contract. */
68
+ export type WorkerBlueprint = BlueprintBody & {
69
+ version: 2;
70
+ application: {
71
+ framework: ApplicationFramework;
72
+ scripts: {
73
+ build: 'build';
74
+ };
75
+ worker: WorkerSettings;
76
+ };
77
+ background: BlueprintBackground;
78
+ };
79
+ export type WorkerstackBlueprint = LegacyBlueprint | WorkerBlueprint;
80
+ export declare function parseBlueprint(value: unknown): WorkerstackBlueprint;
81
+ export declare function parseWorkerBlueprint(value: unknown): WorkerBlueprint;
82
+ /**
83
+ * Whether a host must treat this key as a secret. A blueprint generated before
84
+ * 0.23.0 has no flag, and server keys are secret by default.
85
+ */
86
+ export declare function isSensitiveEnvVar(entry: BlueprintEnvVar): boolean;
87
+ export declare function blueprintFromManifest(args: {
88
+ manifest: WorkerstackManifest;
89
+ generatorVersion: string;
90
+ entry: string;
91
+ migrationMode: MigrationMode;
92
+ framework?: ApplicationFramework;
93
+ worker: WorkerSettings;
94
+ }): WorkerBlueprint;
95
+ export declare function parseBlueprintYaml(source: string): WorkerstackBlueprint;
96
+ export declare function parseWorkerBlueprintYaml(source: string): WorkerBlueprint;
97
+ export declare function serializeBlueprint(value: WorkerstackBlueprint): string;
98
+ export { bucketBindingName, workerPlanFromBlueprint, type WorkerPlan, } from './worker-plan.js';
99
+ //# sourceMappingURL=blueprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blueprint.d.ts","sourceRoot":"","sources":["../src/blueprint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,257 @@
1
+ import * as v from 'valibot';
2
+ import { parse, stringify } from 'yaml';
3
+ import { parseCron } from './jobs/cron.js';
4
+ import { validateStandardSchema } from './standard-schema.js';
5
+ export const WORKER_PACKAGE_ENTRIES = [
6
+ 'workerstack/start/server-entry',
7
+ 'workerstack/workers/entry',
8
+ ];
9
+ const nonEmpty = v.pipe(v.string(), v.minLength(1));
10
+ const relativePath = v.pipe(nonEmpty, v.check((value) => !value.startsWith('/') &&
11
+ !value.includes('\\') &&
12
+ value.split('/').every((part) => part !== '' && part !== '..'), 'entry must be a relative path without traversal'));
13
+ const cronSchedule = v.pipe(nonEmpty, v.check((value) => {
14
+ try {
15
+ parseCron(value);
16
+ return true;
17
+ }
18
+ catch {
19
+ return false;
20
+ }
21
+ }, 'invalid cron schedule'));
22
+ // Hosts parse blueprints committed by applications that upgrade workerstack on
23
+ // their own schedule, so a section written by a newer generator has to survive
24
+ // an older parser instead of failing the whole file.
25
+ function open(entries) {
26
+ return v.objectWithRest(entries, v.unknown());
27
+ }
28
+ const compatibilityDate = v.pipe(v.string(), v.regex(/^\d{4}-\d{2}-\d{2}$/, 'compatibilityDate must be YYYY-MM-DD'));
29
+ const workerMain = v.pipe(nonEmpty, v.check((value) => WORKER_PACKAGE_ENTRIES.includes(value) ||
30
+ (!value.startsWith('workerstack/') &&
31
+ !value.startsWith('@') &&
32
+ !value.startsWith('/') &&
33
+ !value.includes('\\') &&
34
+ value.split('/').every((part) => part !== '' && part !== '..')), 'main must be a relative path inside the package or a workerstack entry'));
35
+ const framework = v.picklist(['tanstack-start', 'solid', 'bun-ssr', 'custom']);
36
+ const generatorEntry = open({
37
+ name: v.literal('workerstack'),
38
+ version: nonEmpty,
39
+ });
40
+ const sharedEntries = {
41
+ workerstack: open({
42
+ entry: relativePath,
43
+ manifestVersion: v.literal(4),
44
+ }),
45
+ resources: open({
46
+ database: open({
47
+ dialect: v.picklist(['sqlite']),
48
+ migrationsDirectory: relativePath,
49
+ migrationMode: v.picklist(['migrations', 'push']),
50
+ tables: v.array(open({
51
+ exportName: nonEmpty,
52
+ physicalName: nonEmpty,
53
+ system: v.boolean(),
54
+ })),
55
+ }),
56
+ storage: open({
57
+ defaultBucket: nonEmpty,
58
+ buckets: v.array(open({
59
+ name: nonEmpty,
60
+ visibility: v.picklist(['public', 'private']),
61
+ })),
62
+ }),
63
+ realtime: v.optional(open({ required: v.literal(true) })),
64
+ messaging: open({
65
+ channels: v.array(open({ name: nonEmpty, kind: nonEmpty, provider: nonEmpty })),
66
+ }),
67
+ }),
68
+ environment: v.array(open({
69
+ key: nonEmpty,
70
+ required: v.boolean(),
71
+ scope: v.picklist(['server', 'client']),
72
+ sensitive: v.optional(v.boolean()),
73
+ description: v.optional(v.pipe(nonEmpty, v.maxLength(200))),
74
+ })),
75
+ api: v.optional(open({
76
+ operations: v.array(open({
77
+ handle: nonEmpty,
78
+ operationId: nonEmpty,
79
+ effect: v.picklist(['read', 'mutation', 'unknown']),
80
+ method: v.optional(nonEmpty),
81
+ path: v.optional(nonEmpty),
82
+ summary: v.optional(v.pipe(nonEmpty, v.maxLength(200))),
83
+ })),
84
+ })),
85
+ };
86
+ const backgroundEntries = {
87
+ jobs: v.array(open({ name: nonEmpty })),
88
+ cron: v.array(open({
89
+ name: nonEmpty,
90
+ schedule: cronSchedule,
91
+ timezone: v.literal('UTC'),
92
+ })),
93
+ maintenance: v.array(open({
94
+ name: v.literal('storage-sweep'),
95
+ schedule: cronSchedule,
96
+ timezone: v.literal('UTC'),
97
+ })),
98
+ };
99
+ const legacySchema = open({
100
+ version: v.literal(1),
101
+ // Key order is the YAML order: identity and application first.
102
+ generator: generatorEntry,
103
+ application: open({
104
+ framework,
105
+ scripts: open({
106
+ build: v.literal('build'),
107
+ start: v.literal('start'),
108
+ worker: v.optional(v.literal('worker')),
109
+ }),
110
+ }),
111
+ ...sharedEntries,
112
+ background: open({
113
+ worker: open({ required: v.boolean() }),
114
+ ...backgroundEntries,
115
+ }),
116
+ });
117
+ const workerSchema = open({
118
+ version: v.literal(2),
119
+ // Key order is the YAML order: identity and application first.
120
+ generator: generatorEntry,
121
+ application: open({
122
+ framework,
123
+ scripts: open({ build: v.literal('build') }),
124
+ worker: open({
125
+ render: v.picklist(['ssr', 'spa']),
126
+ main: workerMain,
127
+ compatibilityDate,
128
+ assets: relativePath,
129
+ }),
130
+ }),
131
+ ...sharedEntries,
132
+ background: open(backgroundEntries),
133
+ });
134
+ const blueprintSchema = v.variant('version', [legacySchema, workerSchema]);
135
+ function sortBy(entries, key) {
136
+ return [...entries].sort((left, right) => key(left).localeCompare(key(right)));
137
+ }
138
+ function rejectDuplicates(collection, values) {
139
+ const seen = new Set();
140
+ for (const value of values) {
141
+ if (seen.has(value))
142
+ throw new Error(`[workerstack] duplicate ${collection} "${value}"`);
143
+ seen.add(value);
144
+ }
145
+ }
146
+ export function parseBlueprint(value) {
147
+ const raw = value;
148
+ if (raw?.version === 1 && raw.application?.runtime === 'worker') {
149
+ throw new Error('[workerstack] this version 1 blueprint declares runtime: worker; regenerate the blueprint with workerstack 1.0.0-beta.3');
150
+ }
151
+ const worker = raw?.application?.worker;
152
+ if (raw?.version === 2 && worker && worker.render === undefined) {
153
+ throw new Error('[workerstack] application.worker.render is missing; regenerate the blueprint with workerstack 1.0.0-beta.4');
154
+ }
155
+ const blueprint = validateStandardSchema(blueprintSchema, value, 'blueprint');
156
+ rejectDuplicates('database physical table', blueprint.resources.database.tables.map((entry) => entry.physicalName));
157
+ rejectDuplicates('database export table', blueprint.resources.database.tables.map((entry) => entry.exportName));
158
+ rejectDuplicates('storage bucket', blueprint.resources.storage.buckets.map((entry) => entry.name));
159
+ rejectDuplicates('environment key', blueprint.environment.map((entry) => entry.key));
160
+ rejectDuplicates('messaging channel', blueprint.resources.messaging.channels.map((entry) => entry.name));
161
+ if (blueprint.api)
162
+ rejectDuplicates('api operation', blueprint.api.operations.map((entry) => entry.handle));
163
+ rejectDuplicates('background job', blueprint.background.jobs.map((entry) => entry.name));
164
+ rejectDuplicates('background cron', blueprint.background.cron.map((entry) => entry.name));
165
+ rejectDuplicates('background maintenance', blueprint.background.maintenance.map((entry) => entry.name));
166
+ if (!blueprint.resources.storage.buckets.some((bucket) => bucket.name === blueprint.resources.storage.defaultBucket)) {
167
+ throw new Error('[workerstack] storage defaultBucket must be declared in storage buckets');
168
+ }
169
+ if (blueprint.version === 1) {
170
+ const workerRequired = blueprint.background.jobs.length > 0;
171
+ if (blueprint.background.worker.required !== workerRequired) {
172
+ throw new Error('[workerstack] background worker.required must match declared queue jobs');
173
+ }
174
+ if (Boolean(blueprint.application.scripts.worker) !== workerRequired) {
175
+ throw new Error('[workerstack] application worker script must match declared queue jobs');
176
+ }
177
+ }
178
+ else {
179
+ const scripts = blueprint.application.scripts;
180
+ if (Object.keys(scripts).some((name) => name !== 'build')) {
181
+ throw new Error('[workerstack] a version 2 blueprint declares only the build script');
182
+ }
183
+ }
184
+ return blueprint;
185
+ }
186
+ export function parseWorkerBlueprint(value) {
187
+ const blueprint = parseBlueprint(value);
188
+ if (blueprint.version !== 2) {
189
+ throw new Error('[workerstack] workerstack.blueprint.yaml is a 0.x (version 1) blueprint; run `workerstack dev` or `workerstack blueprint` to regenerate it for 1.0');
190
+ }
191
+ return blueprint;
192
+ }
193
+ /**
194
+ * Whether a host must treat this key as a secret. A blueprint generated before
195
+ * 0.23.0 has no flag, and server keys are secret by default.
196
+ */
197
+ export function isSensitiveEnvVar(entry) {
198
+ return entry.sensitive ?? entry.scope === 'server';
199
+ }
200
+ export function blueprintFromManifest(args) {
201
+ return parseWorkerBlueprint({
202
+ version: 2,
203
+ generator: { name: 'workerstack', version: args.generatorVersion },
204
+ application: {
205
+ framework: args.framework ?? 'tanstack-start',
206
+ scripts: { build: 'build' },
207
+ worker: args.worker,
208
+ },
209
+ workerstack: { entry: args.entry, manifestVersion: 4 },
210
+ resources: {
211
+ database: {
212
+ ...args.manifest.database,
213
+ migrationMode: args.migrationMode,
214
+ tables: sortBy(args.manifest.database.tables, (entry) => entry.physicalName),
215
+ },
216
+ storage: {
217
+ ...args.manifest.storage,
218
+ buckets: sortBy(args.manifest.storage.buckets, (entry) => entry.name),
219
+ },
220
+ ...(args.manifest.realtime.required
221
+ ? { realtime: { required: true } }
222
+ : {}),
223
+ messaging: {
224
+ channels: sortBy(args.manifest.messaging.channels, (entry) => entry.name),
225
+ },
226
+ },
227
+ environment: sortBy(args.manifest.environment, (entry) => entry.key),
228
+ api: { operations: args.manifest.api.operations },
229
+ background: {
230
+ jobs: sortBy(args.manifest.background.jobs, (entry) => entry.name),
231
+ cron: sortBy(args.manifest.background.cron, (entry) => entry.name),
232
+ maintenance: sortBy(args.manifest.background.maintenance, (entry) => entry.name),
233
+ },
234
+ });
235
+ }
236
+ export function parseBlueprintYaml(source) {
237
+ return parseBlueprint(parse(source));
238
+ }
239
+ export function parseWorkerBlueprintYaml(source) {
240
+ return parseWorkerBlueprint(parse(source));
241
+ }
242
+ export function serializeBlueprint(value) {
243
+ const blueprint = parseBlueprint(value);
244
+ const options = {
245
+ aliasDuplicateObjects: false,
246
+ defaultKeyType: 'PLAIN',
247
+ defaultStringType: 'PLAIN',
248
+ lineWidth: 0,
249
+ };
250
+ const source = stringify(parseBlueprintYaml(stringify(blueprint, options)), options);
251
+ return source.replace(/^(\s*schedule: )(.+)$/gm, (_match, prefix, value) => {
252
+ const schedule = value.startsWith('"') ? JSON.parse(value) : value;
253
+ return `${prefix}${JSON.stringify(schedule)}`;
254
+ });
255
+ }
256
+ export { bucketBindingName, workerPlanFromBlueprint, } from './worker-plan.js';
257
+ //# sourceMappingURL=blueprint.js.map