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 @@
1
+ {"version":3,"file":"blueprint.js","sourceRoot":"","sources":["../src/blueprint.ts"],"names":[],"mappings":"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","sourcesContent":["import * as v from 'valibot'\nimport { parse, stringify } from 'yaml'\n\nimport type { WorkerstackManifest } from './manifest'\n\nimport { parseCron } from './jobs/cron'\nimport { validateStandardSchema } from './standard-schema'\n\nexport type MigrationMode = 'migrations' | 'push'\nexport type ApplicationFramework =\n | 'tanstack-start'\n | 'solid'\n | 'bun-ssr'\n | 'custom'\n\n/**\n * Blueprint form of an environment key. `sensitive` and `description` are\n * optional because blueprints committed before 0.23.0 do not carry them.\n */\nexport type BlueprintEnvVar = {\n key: string\n required: boolean\n scope: 'server' | 'client'\n sensitive?: boolean\n description?: string\n}\n\nexport const WORKER_PACKAGE_ENTRIES = [\n 'workerstack/start/server-entry',\n 'workerstack/workers/entry',\n] as const\nexport type WorkerRender = 'ssr' | 'spa'\n\nexport type WorkerSettings = {\n render: WorkerRender\n /** A relative path inside the package, or one of WORKER_PACKAGE_ENTRIES. */\n main: string\n compatibilityDate: string\n assets: string\n}\n\ntype BlueprintBackground = Pick<\n WorkerstackManifest['background'],\n 'jobs' | 'cron' | 'maintenance'\n>\n\ntype BlueprintBody = {\n generator: { name: 'workerstack'; version: string }\n workerstack: { entry: string; manifestVersion: 4 }\n resources: {\n database: WorkerstackManifest['database'] & { migrationMode: MigrationMode }\n storage: WorkerstackManifest['storage']\n realtime?: { required: true }\n messaging: WorkerstackManifest['messaging']\n }\n environment: BlueprintEnvVar[]\n /** Application-declared procedures. Absent in blueprints written before 0.23.0. */\n api?: { operations: WorkerstackManifest['api']['operations'] }\n}\n\n/** The 0.x server contract. Parsed for hosts; never generated by 1.0. */\nexport type LegacyBlueprint = BlueprintBody & {\n version: 1\n application: {\n framework: ApplicationFramework\n scripts: { build: 'build'; start: 'start'; worker?: 'worker' }\n }\n background: BlueprintBackground & { worker: { required: boolean } }\n}\n\n/** The 1.0 Worker contract. */\nexport type WorkerBlueprint = BlueprintBody & {\n version: 2\n application: {\n framework: ApplicationFramework\n scripts: { build: 'build' }\n worker: WorkerSettings\n }\n background: BlueprintBackground\n}\n\nexport type WorkerstackBlueprint = LegacyBlueprint | WorkerBlueprint\n\nconst nonEmpty = v.pipe(v.string(), v.minLength(1))\nconst relativePath = v.pipe(\n nonEmpty,\n v.check(\n (value) =>\n !value.startsWith('/') &&\n !value.includes('\\\\') &&\n value.split('/').every((part) => part !== '' && part !== '..'),\n 'entry must be a relative path without traversal',\n ),\n)\nconst cronSchedule = v.pipe(\n nonEmpty,\n v.check((value) => {\n try {\n parseCron(value)\n return true\n } catch {\n return false\n }\n }, 'invalid cron schedule'),\n)\n\n// Hosts parse blueprints committed by applications that upgrade workerstack on\n// their own schedule, so a section written by a newer generator has to survive\n// an older parser instead of failing the whole file.\nfunction open<TEntries extends v.ObjectEntries>(entries: TEntries) {\n return v.objectWithRest(entries, v.unknown())\n}\n\nconst compatibilityDate = v.pipe(\n v.string(),\n v.regex(/^\\d{4}-\\d{2}-\\d{2}$/, 'compatibilityDate must be YYYY-MM-DD'),\n)\nconst workerMain = v.pipe(\n nonEmpty,\n v.check(\n (value) =>\n (WORKER_PACKAGE_ENTRIES as readonly string[]).includes(value) ||\n (!value.startsWith('workerstack/') &&\n !value.startsWith('@') &&\n !value.startsWith('/') &&\n !value.includes('\\\\') &&\n value.split('/').every((part) => part !== '' && part !== '..')),\n 'main must be a relative path inside the package or a workerstack entry',\n ),\n)\nconst framework = v.picklist(['tanstack-start', 'solid', 'bun-ssr', 'custom'])\n\nconst generatorEntry = open({\n name: v.literal('workerstack'),\n version: nonEmpty,\n})\n\nconst sharedEntries = {\n workerstack: open({\n entry: relativePath,\n manifestVersion: v.literal(4),\n }),\n resources: open({\n database: open({\n dialect: v.picklist(['sqlite']),\n migrationsDirectory: relativePath,\n migrationMode: v.picklist(['migrations', 'push']),\n tables: v.array(\n open({\n exportName: nonEmpty,\n physicalName: nonEmpty,\n system: v.boolean(),\n }),\n ),\n }),\n storage: open({\n defaultBucket: nonEmpty,\n buckets: v.array(\n open({\n name: nonEmpty,\n visibility: v.picklist(['public', 'private']),\n }),\n ),\n }),\n realtime: v.optional(open({ required: v.literal(true) })),\n messaging: open({\n channels: v.array(\n open({ name: nonEmpty, kind: nonEmpty, provider: nonEmpty }),\n ),\n }),\n }),\n environment: v.array(\n open({\n key: nonEmpty,\n required: v.boolean(),\n scope: v.picklist(['server', 'client']),\n sensitive: v.optional(v.boolean()),\n description: v.optional(v.pipe(nonEmpty, v.maxLength(200))),\n }),\n ),\n api: v.optional(\n open({\n operations: v.array(\n open({\n handle: nonEmpty,\n operationId: nonEmpty,\n effect: v.picklist(['read', 'mutation', 'unknown']),\n method: v.optional(nonEmpty),\n path: v.optional(nonEmpty),\n summary: v.optional(v.pipe(nonEmpty, v.maxLength(200))),\n }),\n ),\n }),\n ),\n}\n\nconst backgroundEntries = {\n jobs: v.array(open({ name: nonEmpty })),\n cron: v.array(\n open({\n name: nonEmpty,\n schedule: cronSchedule,\n timezone: v.literal('UTC'),\n }),\n ),\n maintenance: v.array(\n open({\n name: v.literal('storage-sweep'),\n schedule: cronSchedule,\n timezone: v.literal('UTC'),\n }),\n ),\n}\n\nconst legacySchema = open({\n version: v.literal(1),\n // Key order is the YAML order: identity and application first.\n generator: generatorEntry,\n application: open({\n framework,\n scripts: open({\n build: v.literal('build'),\n start: v.literal('start'),\n worker: v.optional(v.literal('worker')),\n }),\n }),\n ...sharedEntries,\n background: open({\n worker: open({ required: v.boolean() }),\n ...backgroundEntries,\n }),\n})\n\nconst workerSchema = open({\n version: v.literal(2),\n // Key order is the YAML order: identity and application first.\n generator: generatorEntry,\n application: open({\n framework,\n scripts: open({ build: v.literal('build') }),\n worker: open({\n render: v.picklist(['ssr', 'spa']),\n main: workerMain,\n compatibilityDate,\n assets: relativePath,\n }),\n }),\n ...sharedEntries,\n background: open(backgroundEntries),\n})\n\nconst blueprintSchema = v.variant('version', [legacySchema, workerSchema])\n\nfunction sortBy<T>(entries: readonly T[], key: (entry: T) => string): T[] {\n return [...entries].sort((left, right) => key(left).localeCompare(key(right)))\n}\n\nfunction rejectDuplicates(collection: string, values: readonly string[]): void {\n const seen = new Set<string>()\n for (const value of values) {\n if (seen.has(value))\n throw new Error(`[workerstack] duplicate ${collection} \"${value}\"`)\n seen.add(value)\n }\n}\n\nexport function parseBlueprint(value: unknown): WorkerstackBlueprint {\n const raw = value as {\n version?: unknown\n application?: { runtime?: unknown }\n } | null\n if (raw?.version === 1 && raw.application?.runtime === 'worker') {\n throw new Error(\n '[workerstack] this version 1 blueprint declares runtime: worker; regenerate the blueprint with workerstack 1.0.0-beta.3',\n )\n }\n const worker = (\n raw?.application as { worker?: { render?: unknown } } | undefined\n )?.worker\n if (raw?.version === 2 && worker && worker.render === undefined) {\n throw new Error(\n '[workerstack] application.worker.render is missing; regenerate the blueprint with workerstack 1.0.0-beta.4',\n )\n }\n const blueprint = validateStandardSchema(\n blueprintSchema,\n value,\n 'blueprint',\n ) as WorkerstackBlueprint\n rejectDuplicates(\n 'database physical table',\n blueprint.resources.database.tables.map((entry) => entry.physicalName),\n )\n rejectDuplicates(\n 'database export table',\n blueprint.resources.database.tables.map((entry) => entry.exportName),\n )\n rejectDuplicates(\n 'storage bucket',\n blueprint.resources.storage.buckets.map((entry) => entry.name),\n )\n rejectDuplicates(\n 'environment key',\n blueprint.environment.map((entry) => entry.key),\n )\n rejectDuplicates(\n 'messaging channel',\n blueprint.resources.messaging.channels.map((entry) => entry.name),\n )\n if (blueprint.api)\n rejectDuplicates(\n 'api operation',\n blueprint.api.operations.map((entry) => entry.handle),\n )\n rejectDuplicates(\n 'background job',\n blueprint.background.jobs.map((entry) => entry.name),\n )\n rejectDuplicates(\n 'background cron',\n blueprint.background.cron.map((entry) => entry.name),\n )\n rejectDuplicates(\n 'background maintenance',\n blueprint.background.maintenance.map((entry) => entry.name),\n )\n if (\n !blueprint.resources.storage.buckets.some(\n (bucket) => bucket.name === blueprint.resources.storage.defaultBucket,\n )\n ) {\n throw new Error(\n '[workerstack] storage defaultBucket must be declared in storage buckets',\n )\n }\n if (blueprint.version === 1) {\n const workerRequired = blueprint.background.jobs.length > 0\n if (blueprint.background.worker.required !== workerRequired) {\n throw new Error(\n '[workerstack] background worker.required must match declared queue jobs',\n )\n }\n if (Boolean(blueprint.application.scripts.worker) !== workerRequired) {\n throw new Error(\n '[workerstack] application worker script must match declared queue jobs',\n )\n }\n } else {\n const scripts = blueprint.application.scripts as Record<string, unknown>\n if (Object.keys(scripts).some((name) => name !== 'build')) {\n throw new Error(\n '[workerstack] a version 2 blueprint declares only the build script',\n )\n }\n }\n return blueprint\n}\n\nexport function parseWorkerBlueprint(value: unknown): WorkerBlueprint {\n const blueprint = parseBlueprint(value)\n if (blueprint.version !== 2) {\n throw new Error(\n '[workerstack] workerstack.blueprint.yaml is a 0.x (version 1) blueprint; run `workerstack dev` or `workerstack blueprint` to regenerate it for 1.0',\n )\n }\n return blueprint\n}\n\n/**\n * Whether a host must treat this key as a secret. A blueprint generated before\n * 0.23.0 has no flag, and server keys are secret by default.\n */\nexport function isSensitiveEnvVar(entry: BlueprintEnvVar): boolean {\n return entry.sensitive ?? entry.scope === 'server'\n}\n\nexport function blueprintFromManifest(args: {\n manifest: WorkerstackManifest\n generatorVersion: string\n entry: string\n migrationMode: MigrationMode\n framework?: ApplicationFramework\n worker: WorkerSettings\n}): WorkerBlueprint {\n return parseWorkerBlueprint({\n version: 2,\n generator: { name: 'workerstack', version: args.generatorVersion },\n application: {\n framework: args.framework ?? 'tanstack-start',\n scripts: { build: 'build' },\n worker: args.worker,\n },\n workerstack: { entry: args.entry, manifestVersion: 4 },\n resources: {\n database: {\n ...args.manifest.database,\n migrationMode: args.migrationMode,\n tables: sortBy(\n args.manifest.database.tables,\n (entry) => entry.physicalName,\n ),\n },\n storage: {\n ...args.manifest.storage,\n buckets: sortBy(args.manifest.storage.buckets, (entry) => entry.name),\n },\n ...(args.manifest.realtime.required\n ? { realtime: { required: true } }\n : {}),\n messaging: {\n channels: sortBy(\n args.manifest.messaging.channels,\n (entry) => entry.name,\n ),\n },\n },\n environment: sortBy(args.manifest.environment, (entry) => entry.key),\n api: { operations: args.manifest.api.operations },\n background: {\n jobs: sortBy(args.manifest.background.jobs, (entry) => entry.name),\n cron: sortBy(args.manifest.background.cron, (entry) => entry.name),\n maintenance: sortBy(\n args.manifest.background.maintenance,\n (entry) => entry.name,\n ),\n },\n })\n}\n\nexport function parseBlueprintYaml(source: string): WorkerstackBlueprint {\n return parseBlueprint(parse(source) as unknown)\n}\n\nexport function parseWorkerBlueprintYaml(source: string): WorkerBlueprint {\n return parseWorkerBlueprint(parse(source) as unknown)\n}\n\nexport function serializeBlueprint(value: WorkerstackBlueprint): string {\n const blueprint = parseBlueprint(value)\n const options = {\n aliasDuplicateObjects: false,\n defaultKeyType: 'PLAIN',\n defaultStringType: 'PLAIN',\n lineWidth: 0,\n } as const\n const source = stringify(\n parseBlueprintYaml(stringify(blueprint, options)),\n options,\n )\n return source.replace(\n /^(\\s*schedule: )(.+)$/gm,\n (_match, prefix: string, value: string) => {\n const schedule = value.startsWith('\"') ? JSON.parse(value) : value\n return `${prefix}${JSON.stringify(schedule)}`\n },\n )\n}\n\nexport {\n bucketBindingName,\n workerPlanFromBlueprint,\n type WorkerPlan,\n} from './worker-plan'\n"]}
@@ -0,0 +1,16 @@
1
+ /** The skills this package ships, copied from `.agents/skills` at build time. */
2
+ export declare const SHIPPED_SKILLS: readonly ["creating-workerstack-apps"];
3
+ export type SkillsOptions = {
4
+ /** Project root the skills are installed into. */
5
+ cwd: string;
6
+ /** Destination, relative to `cwd`. */
7
+ directory?: string;
8
+ /** Report drift instead of writing. Exits non-zero when anything differs. */
9
+ check?: boolean;
10
+ };
11
+ export type SkillsIo = {
12
+ stdout(message: string): void;
13
+ stderr(message: string): void;
14
+ };
15
+ export declare function installSkills(options: SkillsOptions, io: SkillsIo): Promise<number>;
16
+ //# sourceMappingURL=cli-skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-skills.d.ts","sourceRoot":"","sources":["../src/cli-skills.ts"],"names":[],"mappings":"AAIA,iFAAiF;AACjF,eAAO,MAAM,cAAc,wCAAyC,CAAA;AAmBpE,MAAM,MAAM,aAAa,GAAG;IAC1B,kDAAkD;IAClD,GAAG,EAAE,MAAM,CAAA;IACX,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAC9B,CAAA;AAuDD,wBAAsB,aAAa,CACjC,OAAO,EAAE,aAAa,EACtB,EAAE,EAAE,QAAQ,GACX,OAAO,CAAC,MAAM,CAAC,CAmDjB"}
@@ -0,0 +1,108 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { cp, mkdir, readFile, readdir, writeFile } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ /** The skills this package ships, copied from `.agents/skills` at build time. */
5
+ export const SHIPPED_SKILLS = ['creating-workerstack-apps'];
6
+ const MARKER_START = '<!-- workerstack:skills -->';
7
+ const MARKER_END = '<!-- /workerstack:skills -->';
8
+ /**
9
+ * Agents read AGENTS.md before they search for anything, so the pointer is
10
+ * what actually gets the skills into context. The markers let a later
11
+ * `workerstack skills` run replace the block without touching the rest.
12
+ */
13
+ function agentsBlock(directory) {
14
+ return `${MARKER_START}
15
+ ## Workerstack
16
+
17
+ This project uses Workerstack. Before changing the server API, access rules,
18
+ jobs, storage, or realtime, read \`${directory}/creating-workerstack-apps/SKILL.md\`.
19
+ ${MARKER_END}`;
20
+ }
21
+ /** Where this build keeps its copy of the skills. */
22
+ function packagedSkillsDir() {
23
+ return join(new URL('..', import.meta.url).pathname, 'skills');
24
+ }
25
+ async function filesUnder(dir) {
26
+ const entries = await readdir(dir, { withFileTypes: true, recursive: true });
27
+ return entries
28
+ .filter((entry) => entry.isFile())
29
+ .map((entry) => join(entry.parentPath, entry.name));
30
+ }
31
+ async function differs(from, to) {
32
+ if (!existsSync(to))
33
+ return true;
34
+ const sources = await filesUnder(from);
35
+ for (const source of sources) {
36
+ const target = join(to, source.slice(from.length + 1));
37
+ if (!existsSync(target))
38
+ return true;
39
+ if ((await readFile(source, 'utf8')) !== (await readFile(target, 'utf8'))) {
40
+ return true;
41
+ }
42
+ }
43
+ return false;
44
+ }
45
+ async function writeAgentsPointer(cwd, directory) {
46
+ const path = join(cwd, 'AGENTS.md');
47
+ const block = agentsBlock(directory);
48
+ if (!existsSync(path)) {
49
+ await writeFile(path, `# Agent guide\n\n${block}\n`);
50
+ return 'created';
51
+ }
52
+ const current = await readFile(path, 'utf8');
53
+ const start = current.indexOf(MARKER_START);
54
+ const end = current.indexOf(MARKER_END);
55
+ if (start !== -1 && end !== -1) {
56
+ const replaced = current.slice(0, start) + block + current.slice(end + MARKER_END.length);
57
+ if (replaced === current)
58
+ return 'current';
59
+ await writeFile(path, replaced);
60
+ return 'updated';
61
+ }
62
+ await writeFile(path, `${current.trimEnd()}\n\n${block}\n`);
63
+ return 'updated';
64
+ }
65
+ export async function installSkills(options, io) {
66
+ const source = packagedSkillsDir();
67
+ if (!existsSync(source)) {
68
+ io.stderr('[workerstack] this build ships no skills; reinstall the package or run bun run build');
69
+ return 1;
70
+ }
71
+ const directory = options.directory ?? '.agents/skills';
72
+ const destination = join(options.cwd, directory);
73
+ const stale = [];
74
+ for (const skill of SHIPPED_SKILLS) {
75
+ const from = join(source, skill);
76
+ const to = join(destination, skill);
77
+ if (!(await differs(from, to)))
78
+ continue;
79
+ stale.push(skill);
80
+ if (options.check)
81
+ continue;
82
+ await mkdir(destination, { recursive: true });
83
+ await cp(from, to, { recursive: true });
84
+ }
85
+ if (options.check) {
86
+ const pointer = await readFile(join(options.cwd, 'AGENTS.md'), 'utf8').catch(() => '');
87
+ const pointerStale = !pointer.includes(MARKER_START);
88
+ if (stale.length === 0 && !pointerStale) {
89
+ io.stdout(`${directory} is current`);
90
+ return 0;
91
+ }
92
+ for (const skill of stale) {
93
+ io.stderr(`[workerstack] ${directory}/${skill} is missing or outdated`);
94
+ }
95
+ if (pointerStale)
96
+ io.stderr('[workerstack] AGENTS.md has no Workerstack block');
97
+ io.stderr('[workerstack] run: bunx workerstack skills');
98
+ return 1;
99
+ }
100
+ const pointer = await writeAgentsPointer(options.cwd, directory);
101
+ io.stdout(stale.length === 0
102
+ ? `${directory} is current`
103
+ : `Installed ${stale.length} skill(s) into ${directory}: ${stale.join(', ')}`);
104
+ if (pointer !== 'current')
105
+ io.stdout(`AGENTS.md ${pointer}`);
106
+ return 0;
107
+ }
108
+ //# sourceMappingURL=cli-skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-skills.js","sourceRoot":"","sources":["../src/cli-skills.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from 'node:fs'\nimport { cp, mkdir, readFile, readdir, writeFile } from 'node:fs/promises'\nimport { join } from 'node:path'\n\n/** The skills this package ships, copied from `.agents/skills` at build time. */\nexport const SHIPPED_SKILLS = ['creating-workerstack-apps'] as const\n\nconst MARKER_START = '<!-- workerstack:skills -->'\nconst MARKER_END = '<!-- /workerstack:skills -->'\n\n/**\n * Agents read AGENTS.md before they search for anything, so the pointer is\n * what actually gets the skills into context. The markers let a later\n * `workerstack skills` run replace the block without touching the rest.\n */\nfunction agentsBlock(directory: string): string {\n return `${MARKER_START}\n## Workerstack\n\nThis project uses Workerstack. Before changing the server API, access rules,\njobs, storage, or realtime, read \\`${directory}/creating-workerstack-apps/SKILL.md\\`.\n${MARKER_END}`\n}\n\nexport type SkillsOptions = {\n /** Project root the skills are installed into. */\n cwd: string\n /** Destination, relative to `cwd`. */\n directory?: string\n /** Report drift instead of writing. Exits non-zero when anything differs. */\n check?: boolean\n}\n\nexport type SkillsIo = {\n stdout(message: string): void\n stderr(message: string): void\n}\n\n/** Where this build keeps its copy of the skills. */\nfunction packagedSkillsDir(): string {\n return join(new URL('..', import.meta.url).pathname, 'skills')\n}\n\nasync function filesUnder(dir: string): Promise<string[]> {\n const entries = await readdir(dir, { withFileTypes: true, recursive: true })\n return entries\n .filter((entry) => entry.isFile())\n .map((entry) => join(entry.parentPath, entry.name))\n}\n\nasync function differs(from: string, to: string): Promise<boolean> {\n if (!existsSync(to)) return true\n const sources = await filesUnder(from)\n for (const source of sources) {\n const target = join(to, source.slice(from.length + 1))\n if (!existsSync(target)) return true\n if ((await readFile(source, 'utf8')) !== (await readFile(target, 'utf8'))) {\n return true\n }\n }\n return false\n}\n\nasync function writeAgentsPointer(\n cwd: string,\n directory: string,\n): Promise<'created' | 'updated' | 'current'> {\n const path = join(cwd, 'AGENTS.md')\n const block = agentsBlock(directory)\n\n if (!existsSync(path)) {\n await writeFile(path, `# Agent guide\\n\\n${block}\\n`)\n return 'created'\n }\n\n const current = await readFile(path, 'utf8')\n const start = current.indexOf(MARKER_START)\n const end = current.indexOf(MARKER_END)\n\n if (start !== -1 && end !== -1) {\n const replaced =\n current.slice(0, start) + block + current.slice(end + MARKER_END.length)\n if (replaced === current) return 'current'\n await writeFile(path, replaced)\n return 'updated'\n }\n\n await writeFile(path, `${current.trimEnd()}\\n\\n${block}\\n`)\n return 'updated'\n}\n\nexport async function installSkills(\n options: SkillsOptions,\n io: SkillsIo,\n): Promise<number> {\n const source = packagedSkillsDir()\n if (!existsSync(source)) {\n io.stderr(\n '[workerstack] this build ships no skills; reinstall the package or run bun run build',\n )\n return 1\n }\n\n const directory = options.directory ?? '.agents/skills'\n const destination = join(options.cwd, directory)\n const stale: string[] = []\n\n for (const skill of SHIPPED_SKILLS) {\n const from = join(source, skill)\n const to = join(destination, skill)\n if (!(await differs(from, to))) continue\n stale.push(skill)\n if (options.check) continue\n await mkdir(destination, { recursive: true })\n await cp(from, to, { recursive: true })\n }\n\n if (options.check) {\n const pointer = await readFile(\n join(options.cwd, 'AGENTS.md'),\n 'utf8',\n ).catch(() => '')\n const pointerStale = !pointer.includes(MARKER_START)\n if (stale.length === 0 && !pointerStale) {\n io.stdout(`${directory} is current`)\n return 0\n }\n for (const skill of stale) {\n io.stderr(`[workerstack] ${directory}/${skill} is missing or outdated`)\n }\n if (pointerStale)\n io.stderr('[workerstack] AGENTS.md has no Workerstack block')\n io.stderr('[workerstack] run: bunx workerstack skills')\n return 1\n }\n\n const pointer = await writeAgentsPointer(options.cwd, directory)\n\n io.stdout(\n stale.length === 0\n ? `${directory} is current`\n : `Installed ${stale.length} skill(s) into ${directory}: ${stale.join(', ')}`,\n )\n if (pointer !== 'current') io.stdout(`AGENTS.md ${pointer}`)\n return 0\n}\n"]}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env bun
2
+ import { generateBlueprint } from './blueprint-generator.js';
3
+ export type CliIo = {
4
+ stdout(message: string): void;
5
+ stderr(message: string): void;
6
+ };
7
+ type AppCommands = {
8
+ dev(options: {
9
+ directory: string;
10
+ port?: number;
11
+ }): Promise<number>;
12
+ build(options: {
13
+ directory: string;
14
+ }): Promise<number>;
15
+ };
16
+ export declare function runCli(args: string[], io: CliIo, generate?: typeof generateBlueprint, commands?: AppCommands): Promise<number>;
17
+ export {};
18
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAEL,iBAAiB,EAElB,MAAM,uBAAuB,CAAA;AAG9B,MAAM,MAAM,KAAK,GAAG;IAClB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAC9B,CAAA;AA+BD,KAAK,WAAW,GAAG;IACjB,GAAG,CAAC,OAAO,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IACnE,KAAK,CAAC,OAAO,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;CACvD,CAAA;AAOD,wBAAsB,MAAM,CAC1B,IAAI,EAAE,MAAM,EAAE,EACd,EAAE,EAAE,KAAK,EACT,QAAQ,GAAE,OAAO,iBAAqC,EACtD,QAAQ,GAAE,WAAyB,GAClC,OAAO,CAAC,MAAM,CAAC,CA8KjB"}
package/dist/cli.js ADDED
@@ -0,0 +1,205 @@
1
+ #!/usr/bin/env bun
2
+ import { BlueprintCheckError, generateBlueprint, } from './blueprint-generator.js';
3
+ import { installSkills } from './cli-skills.js';
4
+ const help = `Usage:
5
+ workerstack blueprint [directory] [--entry <path>] [--output <path>] [--check|--hosted-check]
6
+ workerstack skills [--dir <path>] [--check]
7
+ workerstack wrangler [directory] [--name <name>] [--output <path>]
8
+ workerstack dev [directory] [--port <port>]
9
+ workerstack build [directory]
10
+
11
+ blueprint Generate workerstack.blueprint.yaml, the committed deploy contract of a
12
+ Worker application. Entry precedence: --entry,
13
+ package.json#workerstack.entry, src/workerstack.ts.
14
+
15
+ skills Install the Workerstack agent skills that match this version into
16
+ .agents/skills, and point AGENTS.md at them so an agent loads them
17
+ before touching the API. --check reports drift without writing.
18
+
19
+ wrangler Write wrangler.json, the input config of the Cloudflare Vite plugin, from
20
+ workerstack.blueprint.yaml. The file is generated; do not commit
21
+ it.
22
+
23
+ dev Start the app locally: sqld and Vite, with the Worker (SSR, /api,
24
+ Durable Objects) in workerd. Regenerates workerstack.blueprint.yaml
25
+ and wrangler.json and pushes the schema on each change under src/.
26
+ Ctrl+C stops everything. WORKERSTACK_SQLD_BIN selects a system sqld
27
+ instead of the pinned download.
28
+
29
+ build Check that workerstack.blueprint.yaml is current, write
30
+ wrangler.json from it, build the Worker and client with Vite into
31
+ dist/server and dist/client, and remove files hosts must not deploy.`;
32
+ const appCommands = {
33
+ dev: async (options) => (await import('./dev/index.js')).runDev(options),
34
+ build: async (options) => (await import('./dev/index.js')).runBuild(options),
35
+ };
36
+ export async function runCli(args, io, generate = generateBlueprint, commands = appCommands) {
37
+ if (args[0] === '--help' || args[0] === '-h') {
38
+ io.stdout(help);
39
+ return 0;
40
+ }
41
+ if (args[0] === '--version') {
42
+ io.stdout((await Bun.file(new URL('../package.json', import.meta.url)).json()).version);
43
+ return 0;
44
+ }
45
+ if (args[0] === 'skills') {
46
+ const options = {
47
+ cwd: process.cwd(),
48
+ };
49
+ for (let index = 1; index < args.length; index++) {
50
+ const argument = args[index];
51
+ if (argument === '--check') {
52
+ options.check = true;
53
+ continue;
54
+ }
55
+ if (argument === '--dir') {
56
+ const value = args[++index];
57
+ if (!value || value.startsWith('--')) {
58
+ io.stderr('[workerstack] missing value for --dir');
59
+ return 2;
60
+ }
61
+ options.directory = value;
62
+ continue;
63
+ }
64
+ io.stderr(`[workerstack] unknown option: ${argument}`);
65
+ return 2;
66
+ }
67
+ return installSkills(options, io);
68
+ }
69
+ if (args[0] === 'dev' || args[0] === 'build') {
70
+ const command = args[0];
71
+ let directory;
72
+ let port;
73
+ for (let index = 1; index < args.length; index++) {
74
+ const argument = args[index];
75
+ if (command === 'dev' && argument === '--port') {
76
+ const value = Number(args[++index]);
77
+ if (!Number.isInteger(value) || value <= 0) {
78
+ io.stderr('[workerstack] --port needs a port number');
79
+ return 2;
80
+ }
81
+ port = value;
82
+ continue;
83
+ }
84
+ if (argument.startsWith('-')) {
85
+ io.stderr(`[workerstack] unknown option: ${argument}`);
86
+ return 2;
87
+ }
88
+ if (directory !== undefined) {
89
+ io.stderr('[workerstack] only one application directory is allowed');
90
+ return 2;
91
+ }
92
+ directory = argument;
93
+ }
94
+ directory ??= process.cwd();
95
+ return command === 'dev'
96
+ ? commands.dev({ directory, ...(port ? { port } : {}) })
97
+ : commands.build({ directory });
98
+ }
99
+ if (args[0] === 'wrangler') {
100
+ const options = {
101
+ directory: process.cwd(),
102
+ };
103
+ const valued = {
104
+ '--name': 'name',
105
+ '--output': 'output',
106
+ };
107
+ let directorySet = false;
108
+ for (let index = 1; index < args.length; index++) {
109
+ const argument = args[index];
110
+ if (argument in valued) {
111
+ const value = args[++index];
112
+ if (!value || value.startsWith('--')) {
113
+ io.stderr(`[workerstack] missing value for ${argument}`);
114
+ return 2;
115
+ }
116
+ options[valued[argument]] = value;
117
+ continue;
118
+ }
119
+ if (argument.startsWith('-')) {
120
+ io.stderr(`[workerstack] unknown option: ${argument}`);
121
+ return 2;
122
+ }
123
+ if (directorySet) {
124
+ io.stderr('[workerstack] only one application directory is allowed');
125
+ return 2;
126
+ }
127
+ options.directory = argument;
128
+ directorySet = true;
129
+ }
130
+ try {
131
+ const { runWranglerCommand } = await import('./workers/wrangler.js');
132
+ const result = await runWranglerCommand(options);
133
+ io.stdout(result.changed ? 'Generated wrangler.json' : 'wrangler.json is current');
134
+ return 0;
135
+ }
136
+ catch (error) {
137
+ io.stderr(error instanceof Error ? error.message : String(error));
138
+ return 1;
139
+ }
140
+ }
141
+ if (args[0] !== 'blueprint') {
142
+ io.stderr(help);
143
+ return 2;
144
+ }
145
+ const options = { directory: process.cwd() };
146
+ for (let index = 1; index < args.length; index++) {
147
+ const argument = args[index];
148
+ if (argument === '--check') {
149
+ if (options.hostedCheck) {
150
+ io.stderr('[workerstack] --check and --hosted-check are mutually exclusive');
151
+ return 2;
152
+ }
153
+ options.check = true;
154
+ continue;
155
+ }
156
+ if (argument === '--hosted-check') {
157
+ if (options.check) {
158
+ io.stderr('[workerstack] --check and --hosted-check are mutually exclusive');
159
+ return 2;
160
+ }
161
+ options.hostedCheck = true;
162
+ continue;
163
+ }
164
+ if (argument === '--entry' || argument === '--output') {
165
+ const value = args[++index];
166
+ if (!value || value.startsWith('--')) {
167
+ io.stderr(`[workerstack] missing value for ${argument}`);
168
+ return 2;
169
+ }
170
+ if (argument === '--entry')
171
+ options.entry = value;
172
+ else
173
+ options.output = value;
174
+ continue;
175
+ }
176
+ if (argument.startsWith('-')) {
177
+ io.stderr(`[workerstack] unknown option: ${argument}`);
178
+ return 2;
179
+ }
180
+ if (options.directory !== process.cwd()) {
181
+ io.stderr('[workerstack] only one application directory is allowed');
182
+ return 2;
183
+ }
184
+ options.directory = argument;
185
+ }
186
+ try {
187
+ const result = await generate(options);
188
+ io.stdout(options.check || options.hostedCheck || !result.changed
189
+ ? 'workerstack.blueprint.yaml is current'
190
+ : 'Generated workerstack.blueprint.yaml');
191
+ return 0;
192
+ }
193
+ catch (error) {
194
+ io.stderr(error instanceof Error ? error.message : String(error));
195
+ return error instanceof BlueprintCheckError ? 1 : 1;
196
+ }
197
+ }
198
+ if (import.meta.main) {
199
+ const exitCode = await runCli(process.argv.slice(2), {
200
+ stdout: (message) => console.log(message),
201
+ stderr: (message) => console.error(message),
202
+ });
203
+ process.exit(exitCode);
204
+ }
205
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env bun\nimport {\n BlueprintCheckError,\n generateBlueprint,\n type GenerateBlueprintOptions,\n} from './blueprint-generator'\nimport { installSkills } from './cli-skills'\n\nexport type CliIo = {\n stdout(message: string): void\n stderr(message: string): void\n}\n\nconst help = `Usage:\n workerstack blueprint [directory] [--entry <path>] [--output <path>] [--check|--hosted-check]\n workerstack skills [--dir <path>] [--check]\n workerstack wrangler [directory] [--name <name>] [--output <path>]\n workerstack dev [directory] [--port <port>]\n workerstack build [directory]\n\nblueprint Generate workerstack.blueprint.yaml, the committed deploy contract of a\n Worker application. Entry precedence: --entry,\n package.json#workerstack.entry, src/workerstack.ts.\n\nskills Install the Workerstack agent skills that match this version into\n .agents/skills, and point AGENTS.md at them so an agent loads them\n before touching the API. --check reports drift without writing.\n\nwrangler Write wrangler.json, the input config of the Cloudflare Vite plugin, from\n workerstack.blueprint.yaml. The file is generated; do not commit\n it.\n\ndev Start the app locally: sqld and Vite, with the Worker (SSR, /api,\n Durable Objects) in workerd. Regenerates workerstack.blueprint.yaml\n and wrangler.json and pushes the schema on each change under src/.\n Ctrl+C stops everything. WORKERSTACK_SQLD_BIN selects a system sqld\n instead of the pinned download.\n\nbuild Check that workerstack.blueprint.yaml is current, write\n wrangler.json from it, build the Worker and client with Vite into\n dist/server and dist/client, and remove files hosts must not deploy.`\n\ntype AppCommands = {\n dev(options: { directory: string; port?: number }): Promise<number>\n build(options: { directory: string }): Promise<number>\n}\n\nconst appCommands: AppCommands = {\n dev: async (options) => (await import('./dev/index')).runDev(options),\n build: async (options) => (await import('./dev/index')).runBuild(options),\n}\n\nexport async function runCli(\n args: string[],\n io: CliIo,\n generate: typeof generateBlueprint = generateBlueprint,\n commands: AppCommands = appCommands,\n): Promise<number> {\n if (args[0] === '--help' || args[0] === '-h') {\n io.stdout(help)\n return 0\n }\n if (args[0] === '--version') {\n io.stdout(\n (\n (await Bun.file(\n new URL('../package.json', import.meta.url),\n ).json()) as { version: string }\n ).version,\n )\n return 0\n }\n if (args[0] === 'skills') {\n const options: { cwd: string; directory?: string; check?: boolean } = {\n cwd: process.cwd(),\n }\n for (let index = 1; index < args.length; index++) {\n const argument = args[index]!\n if (argument === '--check') {\n options.check = true\n continue\n }\n if (argument === '--dir') {\n const value = args[++index]\n if (!value || value.startsWith('--')) {\n io.stderr('[workerstack] missing value for --dir')\n return 2\n }\n options.directory = value\n continue\n }\n io.stderr(`[workerstack] unknown option: ${argument}`)\n return 2\n }\n return installSkills(options, io)\n }\n\n if (args[0] === 'dev' || args[0] === 'build') {\n const command = args[0]\n let directory: string | undefined\n let port: number | undefined\n for (let index = 1; index < args.length; index++) {\n const argument = args[index]!\n if (command === 'dev' && argument === '--port') {\n const value = Number(args[++index])\n if (!Number.isInteger(value) || value <= 0) {\n io.stderr('[workerstack] --port needs a port number')\n return 2\n }\n port = value\n continue\n }\n if (argument.startsWith('-')) {\n io.stderr(`[workerstack] unknown option: ${argument}`)\n return 2\n }\n if (directory !== undefined) {\n io.stderr('[workerstack] only one application directory is allowed')\n return 2\n }\n directory = argument\n }\n directory ??= process.cwd()\n return command === 'dev'\n ? commands.dev({ directory, ...(port ? { port } : {}) })\n : commands.build({ directory })\n }\n\n if (args[0] === 'wrangler') {\n const options: { directory: string; name?: string; output?: string } = {\n directory: process.cwd(),\n }\n const valued = {\n '--name': 'name',\n '--output': 'output',\n } as const\n let directorySet = false\n for (let index = 1; index < args.length; index++) {\n const argument = args[index]!\n if (argument in valued) {\n const value = args[++index]\n if (!value || value.startsWith('--')) {\n io.stderr(`[workerstack] missing value for ${argument}`)\n return 2\n }\n options[valued[argument as keyof typeof valued]] = value\n continue\n }\n if (argument.startsWith('-')) {\n io.stderr(`[workerstack] unknown option: ${argument}`)\n return 2\n }\n if (directorySet) {\n io.stderr('[workerstack] only one application directory is allowed')\n return 2\n }\n options.directory = argument\n directorySet = true\n }\n try {\n const { runWranglerCommand } = await import('./workers/wrangler')\n const result = await runWranglerCommand(options)\n io.stdout(\n result.changed ? 'Generated wrangler.json' : 'wrangler.json is current',\n )\n return 0\n } catch (error) {\n io.stderr(error instanceof Error ? error.message : String(error))\n return 1\n }\n }\n\n if (args[0] !== 'blueprint') {\n io.stderr(help)\n return 2\n }\n const options: GenerateBlueprintOptions = { directory: process.cwd() }\n for (let index = 1; index < args.length; index++) {\n const argument = args[index]!\n if (argument === '--check') {\n if (options.hostedCheck) {\n io.stderr(\n '[workerstack] --check and --hosted-check are mutually exclusive',\n )\n return 2\n }\n options.check = true\n continue\n }\n if (argument === '--hosted-check') {\n if (options.check) {\n io.stderr(\n '[workerstack] --check and --hosted-check are mutually exclusive',\n )\n return 2\n }\n options.hostedCheck = true\n continue\n }\n if (argument === '--entry' || argument === '--output') {\n const value = args[++index]\n if (!value || value.startsWith('--')) {\n io.stderr(`[workerstack] missing value for ${argument}`)\n return 2\n }\n if (argument === '--entry') options.entry = value\n else options.output = value\n continue\n }\n if (argument.startsWith('-')) {\n io.stderr(`[workerstack] unknown option: ${argument}`)\n return 2\n }\n if (options.directory !== process.cwd()) {\n io.stderr('[workerstack] only one application directory is allowed')\n return 2\n }\n options.directory = argument\n }\n try {\n const result = await generate(options)\n io.stdout(\n options.check || options.hostedCheck || !result.changed\n ? 'workerstack.blueprint.yaml is current'\n : 'Generated workerstack.blueprint.yaml',\n )\n return 0\n } catch (error) {\n io.stderr(error instanceof Error ? error.message : String(error))\n return error instanceof BlueprintCheckError ? 1 : 1\n }\n}\n\nif (import.meta.main) {\n const exitCode = await runCli(process.argv.slice(2), {\n stdout: (message) => console.log(message),\n stderr: (message) => console.error(message),\n })\n process.exit(exitCode)\n}\n"]}
@@ -0,0 +1,53 @@
1
+ import { type CallOptions, type Fetch } from './rpc-client.js';
2
+ export type RouteOperation<TMethod extends string, TPath extends string, TQuery = undefined, TBody = undefined, TOutput = undefined, TStream extends boolean = false> = {
3
+ method: TMethod;
4
+ path: TPath;
5
+ query?: TQuery;
6
+ body?: TBody;
7
+ output?: TOutput;
8
+ stream?: TStream;
9
+ };
10
+ type AnyOperation = {
11
+ method: string;
12
+ path: string;
13
+ query?: unknown;
14
+ body?: unknown;
15
+ output?: unknown;
16
+ stream?: boolean;
17
+ };
18
+ type QueryOf<O extends AnyOperation> = NonNullable<O['query']>;
19
+ type BodyOf<O extends AnyOperation> = NonNullable<O['body']>;
20
+ type OutputOf<O extends AnyOperation> = NonNullable<O['output']>;
21
+ export type RouteCallOptions = CallOptions;
22
+ type PathParamNames<TPath extends string> = TPath extends `${string}{${infer TParam}}${infer TRest}` ? TParam extends `+${infer TName}` ? TName | PathParamNames<TRest> : TParam | PathParamNames<TRest> : never;
23
+ type PathArgs<O extends AnyOperation> = [PathParamNames<O['path']>] extends [
24
+ never
25
+ ] ? object : {
26
+ params: Record<PathParamNames<O['path']>, string>;
27
+ };
28
+ type QueryArgs<O extends AnyOperation> = [O['query']] extends [undefined] ? object : {
29
+ query?: QueryOf<O>;
30
+ };
31
+ type BodyArgs<O extends AnyOperation> = [O['body']] extends [undefined] ? object : {
32
+ body: BodyOf<O>;
33
+ };
34
+ type CallArgs<O extends AnyOperation> = PathArgs<O> & QueryArgs<O> & BodyArgs<O>;
35
+ type HasRequiredArgs<O extends AnyOperation> = [
36
+ PathParamNames<O['path']>
37
+ ] extends [never] ? [O['body']] extends [undefined] ? false : true : true;
38
+ export type RouteMethod<O extends AnyOperation> = (...args: true extends HasRequiredArgs<O> ? [args: CallArgs<O>, options?: RouteCallOptions] : [args?: CallArgs<O>, options?: RouteCallOptions]) => true extends O['stream'] ? AsyncIterable<OutputOf<O>> : Promise<OutputOf<O>>;
39
+ export type ClientOf<TRoutes> = {
40
+ [K in keyof TRoutes]: TRoutes[K] extends AnyOperation ? RouteMethod<TRoutes[K]> : never;
41
+ };
42
+ export type RestClientOptions = {
43
+ baseUrl?: string;
44
+ fetch?: Fetch;
45
+ };
46
+ type RouteDescriptor = {
47
+ method: string;
48
+ path: string;
49
+ stream?: boolean;
50
+ };
51
+ export declare function createRestClient<TRoutes>(routes: Record<string, RouteDescriptor>, options?: RestClientOptions): ClientOf<TRoutes>;
52
+ export {};
53
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ import { OPERATION_ID_HEADER } from './rpc-client.js';
2
+ function joinUrl(baseUrl, path) {
3
+ if (!baseUrl)
4
+ return path;
5
+ return `${baseUrl.replace(/\/$/, '')}/${path.replace(/^\//, '')}`;
6
+ }
7
+ function fillPath(path, params) {
8
+ return path.replace(/\{(\+?)([^}]+)\}/g, (_, catchAll, name) => {
9
+ const value = params?.[name];
10
+ if (value === undefined)
11
+ throw new Error(`Missing path parameter: ${name}`);
12
+ if (catchAll)
13
+ return value.split('/').map(encodeURIComponent).join('/');
14
+ return encodeURIComponent(value);
15
+ });
16
+ }
17
+ function buildUrl(baseUrl, path, query) {
18
+ const url = joinUrl(baseUrl, path);
19
+ if (!query)
20
+ return url;
21
+ const params = new URLSearchParams();
22
+ for (const [key, value] of Object.entries(query)) {
23
+ if (value === undefined)
24
+ continue;
25
+ params.set(key, typeof value === 'string' ? value : JSON.stringify(value));
26
+ }
27
+ return params.size ? `${url}?${params}` : url;
28
+ }
29
+ async function requestJson(fetcher, url, init) {
30
+ const response = await fetcher(url, init);
31
+ if (!response.ok)
32
+ throw new Error(`${response.status} ${await response.text()}`);
33
+ if (response.status === 204)
34
+ return undefined;
35
+ return response.json();
36
+ }
37
+ async function* streamJsonEvents(fetcher, url, init) {
38
+ const response = await fetcher(url, init);
39
+ if (!response.ok || !response.body) {
40
+ throw new Error(`Stream request failed (${response.status})`);
41
+ }
42
+ const reader = response.body.pipeThrough(new TextDecoderStream()).getReader();
43
+ let buffer = '';
44
+ let data = [];
45
+ const flush = () => {
46
+ if (!data.length)
47
+ return undefined;
48
+ const value = JSON.parse(data.join('\n'));
49
+ data = [];
50
+ return value;
51
+ };
52
+ try {
53
+ while (true) {
54
+ const { done, value } = await reader.read();
55
+ if (done)
56
+ break;
57
+ buffer += value;
58
+ let newline = buffer.indexOf('\n');
59
+ while (newline !== -1) {
60
+ const line = buffer.slice(0, newline).replace(/\r$/, '');
61
+ buffer = buffer.slice(newline + 1);
62
+ if (line === '') {
63
+ const event = flush();
64
+ if (event !== undefined)
65
+ yield event;
66
+ }
67
+ else if (line.startsWith('data:')) {
68
+ data.push(line.slice(5).replace(/^ /, ''));
69
+ }
70
+ newline = buffer.indexOf('\n');
71
+ }
72
+ }
73
+ const event = flush();
74
+ if (event !== undefined)
75
+ yield event;
76
+ }
77
+ finally {
78
+ await reader.cancel().catch(() => { });
79
+ }
80
+ }
81
+ export function createRestClient(routes, options = {}) {
82
+ const fetcher = options.fetch ?? globalThis.fetch;
83
+ const client = {};
84
+ for (const [name, route] of Object.entries(routes)) {
85
+ client[name] = (args = {}, callOptions = {}) => {
86
+ const path = fillPath(route.path, args.params);
87
+ const url = buildUrl(options.baseUrl, path, args.query);
88
+ const headers = new Headers(callOptions.headers);
89
+ if (callOptions.operationId)
90
+ headers.set(OPERATION_ID_HEADER, callOptions.operationId);
91
+ if (route.stream) {
92
+ headers.set('accept', 'text/event-stream');
93
+ return streamJsonEvents(fetcher, url, {
94
+ method: route.method,
95
+ signal: callOptions.signal,
96
+ headers,
97
+ });
98
+ }
99
+ if (args.body !== undefined)
100
+ headers.set('content-type', 'application/json');
101
+ return requestJson(fetcher, url, {
102
+ method: route.method,
103
+ signal: callOptions.signal,
104
+ headers,
105
+ ...(args.body === undefined ? {} : { body: JSON.stringify(args.body) }),
106
+ });
107
+ };
108
+ }
109
+ return client;
110
+ }
111
+ //# sourceMappingURL=client.js.map