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
package/CHANGELOG.md ADDED
@@ -0,0 +1,13 @@
1
+ # Changelog
2
+
3
+ ## 0.1.0-beta.0
4
+
5
+ First release of Workerstack, split from the Workers rewrite of Bunderstack
6
+ (`bunderstack@1.0.0-beta.4`). Changes against that release:
7
+
8
+ - The package, CLI, imports, Vite plugin, and blueprint file are renamed to
9
+ `workerstack` (`workerstack.blueprint.yaml`, `virtual:workerstack/backend`,
10
+ `WORKERSTACK_*` environment variables). Internal table names stay the same.
11
+ - SQLite only (libsql locally, Turso when hosted). Postgres, PGlite, and the
12
+ Bun database drivers are removed.
13
+ - Image transforms are removed: they need `Bun.Image`, which Workers lack.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Kirill Chuprov
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,138 @@
1
+ # workerstack
2
+
3
+ A full-stack framework for Cloudflare Workers. One declaration describes the
4
+ database, auth, API, file buckets, jobs, cron, realtime, and rate limits; the
5
+ TanStack Start app renders on the server in the same Worker.
6
+
7
+ Workerstack started as the Workers rewrite of Bunderstack. Bunderstack 0.x
8
+ stays the choice for apps that need a long-running Bun process (a headless
9
+ browser, native database drivers, large files in memory).
10
+
11
+ ```sh
12
+ bun add workerstack better-auth drizzle-orm valibot @libsql/client
13
+ bun add -d vite wrangler @cloudflare/vite-plugin drizzle-kit
14
+ ```
15
+
16
+ ## The backend
17
+
18
+ ```ts
19
+ // src/workerstack.ts
20
+ import { workerstack } from 'workerstack'
21
+ import { defineAccess } from 'workerstack/access'
22
+ import { libsql } from 'workerstack/libsql'
23
+ import * as v from 'valibot'
24
+
25
+ import * as schema from './schema'
26
+
27
+ export const backend = workerstack({
28
+ schema,
29
+ database: { adapter: libsql() },
30
+ access: defineAccess(schema, {
31
+ notes: { crud: true, list: 'authenticated', create: 'authenticated' },
32
+ }),
33
+ auth: ({ env }) => ({
34
+ baseURL: env.APP_URL,
35
+ emailAndPassword: { enabled: true },
36
+ }),
37
+ storage: { buckets: { media: { upload: { maxSize: '5mb' } } } },
38
+ realtime: true,
39
+ rateLimit: { windowMs: 60_000, max: 100 },
40
+ jobs: (j) =>
41
+ j.define({
42
+ noteCreated: j.job({
43
+ input: v.object({ noteId: v.string() }),
44
+ handler: async (input, ctx) => {
45
+ /* ... */
46
+ },
47
+ }),
48
+ nightly: j.cron({ schedule: '0 3 * * *', handler: async () => {} }),
49
+ }),
50
+ api: (o) => ({
51
+ ping: o.public
52
+ .route({ method: 'GET', path: '/api/ping' })
53
+ .handler(() => ({ ok: true })),
54
+ }),
55
+ })
56
+
57
+ export type App = Awaited<ReturnType<typeof backend.start>>
58
+ ```
59
+
60
+ ```ts
61
+ // vite.config.ts — SSR with TanStack Start by default.
62
+ import viteReact from '@vitejs/plugin-react'
63
+ import { defineConfig } from 'vite'
64
+ import { workerstack } from 'workerstack/vite'
65
+
66
+ export default defineConfig({ plugins: [workerstack(), viteReact()] })
67
+ ```
68
+
69
+ ```ts
70
+ // src/api.ts — one client for loaders, server functions, and the browser.
71
+ import { workerstackStart } from 'workerstack/start'
72
+
73
+ import type { App } from './workerstack'
74
+
75
+ export const { createQueryClient, createApi } = workerstackStart<App>()
76
+ ```
77
+
78
+ On the server the client calls the backend inside the same isolate and
79
+ forwards the request cookie; in the browser it calls `/api` over HTTP.
80
+
81
+ ## Commands
82
+
83
+ ```sh
84
+ bunx workerstack dev # sqld + Vite on workerd, the production runtime
85
+ bunx workerstack build # dist/server/index.js and dist/client
86
+ bunx workerstack blueprint # writes workerstack.blueprint.yaml
87
+ bunx workerstack wrangler # writes wrangler.json from the blueprint
88
+ ```
89
+
90
+ `workerstack.blueprint.yaml` is the single source of truth for hosting: the
91
+ database, buckets, Durable Objects (Scheduler, RealtimeHub, RateLimiter), cron,
92
+ and the Worker entry. `wrangler.json` is generated from it. Commit the
93
+ blueprint and the Drizzle migrations; a host deploys from them.
94
+
95
+ ## Runtime
96
+
97
+ - Database: SQLite through libsql. Locally `workerstack dev` starts sqld;
98
+ hosted apps use Turso.
99
+ - Files: R2 bindings, one per declared bucket.
100
+ - Jobs and cron: a Scheduler Durable Object wakes on alarms; there is no
101
+ worker process.
102
+ - Realtime: a RealtimeHub Durable Object fans writes out to subscribers.
103
+ - Rate limits: a RateLimiter Durable Object.
104
+
105
+ Code runs in a Worker isolate: no file system, no child processes, no native
106
+ modules, and CPU time per request is limited.
107
+
108
+ ## Package subpaths
109
+
110
+ - `workerstack` — `workerstack()`, the backend declaration
111
+ - `workerstack/access`, `workerstack/schema`, `workerstack/typeid`, `workerstack/env`
112
+ - `workerstack/libsql` — the database adapter
113
+ - `workerstack/vite`, `workerstack/start`, `workerstack/start-auth` — the Vite plugin and TanStack Start integration
114
+ - `workerstack/workers` — Worker entry helpers and the Durable Object classes
115
+ - `workerstack/client*`, `workerstack/query*`, `workerstack/sync`, `workerstack/live` — clients
116
+ - `workerstack/messaging`, `workerstack/email-smtp` — messaging channels
117
+ - `workerstack/testing` — `backend.test()` fixtures for `bun test`
118
+ - `workerstack/blueprint` — the blueprint schema, for hosts
119
+
120
+ ## Examples
121
+
122
+ - [`examples/ssr-probe`](https://github.com/kirill-dev-pro/workerstack/tree/main/examples/ssr-probe) — SSR with TanStack Start
123
+ - [`examples/workers-probe`](https://github.com/kirill-dev-pro/workerstack/tree/main/examples/workers-probe) — SPA
124
+ - [`examples/agent-chat`](https://github.com/kirill-dev-pro/workerstack/tree/main/examples/agent-chat) — an agent chat with durable streaming
125
+ - [`examples/todo-solid-native`](https://github.com/kirill-dev-pro/workerstack/tree/main/examples/todo-solid-native) — Solid
126
+
127
+ ## Development
128
+
129
+ ```sh
130
+ bun install
131
+ bun run test # package and repository tests
132
+ bun run test:workers # builds the probes and runs them on celld (-- --runtime workerd for workerd)
133
+ bun run typecheck:all
134
+ ```
135
+
136
+ ## License
137
+
138
+ MIT
@@ -0,0 +1,131 @@
1
+ export declare const AUTH_TABLE_NAMES: Set<string>;
2
+ export type AccessUserBase = {
3
+ id: string;
4
+ email: string;
5
+ emailVerified?: boolean;
6
+ name?: string;
7
+ role?: string;
8
+ };
9
+ export type SessionUserSource = {
10
+ id: string;
11
+ email: string;
12
+ emailVerified?: boolean;
13
+ name?: string;
14
+ role?: string;
15
+ } & Record<string, unknown>;
16
+ export type SessionUserConfig<TExtra extends Record<string, unknown> = Record<never, never>> = {
17
+ mapUser: (user: SessionUserSource) => TExtra;
18
+ };
19
+ export type SessionUserExtraOf<TSession> = TSession extends SessionUserConfig<infer TExtra> ? TExtra : Record<never, never>;
20
+ export type AccessUser<TExtra extends Record<string, unknown> = Record<never, never>> = AccessUserBase & Omit<TExtra, keyof AccessUserBase>;
21
+ export declare function defineSessionUser<const TExtra extends Record<string, unknown>>(config: SessionUserConfig<TExtra>): SessionUserConfig<TExtra>;
22
+ export type AccessContext = {
23
+ user: AccessUser | null;
24
+ request: Request;
25
+ row?: Record<string, unknown>;
26
+ body?: Record<string, unknown>;
27
+ session?: {
28
+ activeOrganizationId: string | null;
29
+ } | null;
30
+ };
31
+ export type OperationRule = 'public' | 'authenticated' | 'owner' | 'deny' | ((ctx: AccessContext) => boolean | Promise<boolean>);
32
+ export type ScopeMap = Record<string, string | string[]>;
33
+ export type ScopeResolver = (ctx: AccessContext) => ScopeMap;
34
+ export type CrudOperation = 'list' | 'get' | 'create' | 'update' | 'delete';
35
+ export type SortOrder = 'asc' | 'desc';
36
+ export type DefaultSort = {
37
+ column: string;
38
+ order: SortOrder;
39
+ };
40
+ export type TableAccessInput = {
41
+ crud?: boolean;
42
+ /** Opt the BetterAuth `user` table into auto-CRUD (read profiles, owner-update image). */
43
+ exposeAuthTable?: boolean;
44
+ ownerColumn?: string;
45
+ list?: OperationRule;
46
+ get?: OperationRule;
47
+ create?: OperationRule;
48
+ update?: OperationRule;
49
+ delete?: OperationRule;
50
+ /** Explicit write allowlist. Entries override matching system-readonly
51
+ * defaults such as `updatedAt`; `id` remains immutable on update. */
52
+ writableColumns?: string[];
53
+ readonlyColumns?: string[];
54
+ /** Columns matched by `?q=` on list — opt-in; omitted columns are never searched. */
55
+ searchableColumns?: string[];
56
+ /** Columns filterable via flat `?column=value` query params. */
57
+ filterableColumns?: string[];
58
+ /** Columns allowed in `?sort=`. Defaults to `['id']`. */
59
+ sortableColumns?: string[];
60
+ /** Default list ordering when `?sort` is omitted. Defaults to `{ column: 'id', order: 'desc' }`. */
61
+ defaultSort?: DefaultSort;
62
+ scope?: {
63
+ read?: ScopeResolver;
64
+ write?: ScopeResolver;
65
+ };
66
+ };
67
+ export type ResolvedTableAccess = {
68
+ tableKey: string;
69
+ tableName: string;
70
+ enabled: boolean;
71
+ ownerColumn?: string;
72
+ list: OperationRule;
73
+ get: OperationRule;
74
+ create: OperationRule;
75
+ update: OperationRule;
76
+ delete: OperationRule;
77
+ writableColumns?: string[];
78
+ readonlyColumns: string[];
79
+ searchableColumns?: string[];
80
+ filterableColumns: string[];
81
+ sortableColumns: string[];
82
+ defaultSort: DefaultSort;
83
+ readScope?: ScopeResolver;
84
+ writeScope?: ScopeResolver;
85
+ };
86
+ export type ResolvedAccess = Map<string, ResolvedTableAccess>;
87
+ /**
88
+ * Look up a table's resolved access by its physical table name.
89
+ *
90
+ * `ResolvedAccess` is keyed by schema export name, not table name, so every
91
+ * consumer that starts from a physical name needs this scan. It lives here so
92
+ * CRUD, realtime, and route validation cannot drift apart on which tables they
93
+ * consider enabled.
94
+ */
95
+ export declare function tableEntryForName(access: ResolvedAccess, tableName: string): ResolvedTableAccess | undefined;
96
+ export declare function validateAndResolveAccess<TSchema extends Record<string, unknown>>(schema: TSchema, accessInput?: Record<string, TableAccessInput>): ResolvedAccess;
97
+ export declare function defineAccess<TSchema extends Record<string, unknown>, const TRules extends Record<string, TableAccessInput>>(schema: TSchema, rules: TRules): TRules;
98
+ export declare function rowMatchesScope(row: Record<string, unknown>, scope: ScopeMap): boolean;
99
+ export declare function stampScope(values: Record<string, unknown>, scope: ScopeMap): Record<string, unknown>;
100
+ export declare function checkAccessSync(rule: Exclude<OperationRule, (ctx: AccessContext) => boolean | Promise<boolean>>, ctx: AccessContext, ownerColumn?: string): {
101
+ allowed: boolean;
102
+ };
103
+ export declare function checkAccess(rule: OperationRule, ctx: AccessContext, ownerColumn?: string): Promise<{
104
+ allowed: boolean;
105
+ status: 401 | 403;
106
+ }>;
107
+ export declare function sanitizeWriteBody(body: Record<string, unknown>, access: ResolvedTableAccess, mode: 'create' | 'update', userId: string | null): Record<string, unknown>;
108
+ export type AuthSessionResolver<TExtra extends Record<string, unknown> = Record<never, never>> = {
109
+ api: {
110
+ getSession: (opts: {
111
+ headers: Headers;
112
+ }) => Promise<{
113
+ user: ({
114
+ id: string;
115
+ email: string;
116
+ emailVerified?: boolean;
117
+ name?: string;
118
+ role?: string;
119
+ } & TExtra) | null;
120
+ session?: {
121
+ activeOrganizationId?: string | null;
122
+ } | null;
123
+ } | null>;
124
+ };
125
+ };
126
+ export declare function resolveAccessUser<TExtra extends Record<string, unknown> = Record<never, never>>(auth: AuthSessionResolver<TExtra> | undefined, headers: Headers): Promise<AccessUser<TExtra> | null>;
127
+ export declare function resolveSession<TExtra extends Record<string, unknown> = Record<never, never>>(auth: AuthSessionResolver<TExtra> | undefined, headers: Headers): Promise<{
128
+ user: AccessUser<TExtra> | null;
129
+ activeOrganizationId: string | null;
130
+ }>;
131
+ //# sourceMappingURL=access.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access.d.ts","sourceRoot":"","sources":["../src/access.ts"],"names":[],"mappings":"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"}
package/dist/access.js ADDED
@@ -0,0 +1,333 @@
1
+ import { getTableColumns, getTableName, isTable } from 'drizzle-orm';
2
+ import { INTERNAL_TABLE_NAMES } from './internal-tables.js';
3
+ export const AUTH_TABLE_NAMES = new Set([
4
+ 'user',
5
+ 'session',
6
+ 'account',
7
+ 'verification',
8
+ ]);
9
+ const EXPOSEABLE_AUTH_TABLES = new Set(['user']);
10
+ export function defineSessionUser(config) {
11
+ return config;
12
+ }
13
+ /**
14
+ * Look up a table's resolved access by its physical table name.
15
+ *
16
+ * `ResolvedAccess` is keyed by schema export name, not table name, so every
17
+ * consumer that starts from a physical name needs this scan. It lives here so
18
+ * CRUD, realtime, and route validation cannot drift apart on which tables they
19
+ * consider enabled.
20
+ */
21
+ export function tableEntryForName(access, tableName) {
22
+ for (const entry of access.values()) {
23
+ if (entry.tableName === tableName)
24
+ return entry;
25
+ }
26
+ return undefined;
27
+ }
28
+ const DEFAULT_READONLY = [
29
+ 'id',
30
+ 'createdAt',
31
+ 'updatedAt',
32
+ 'created_at',
33
+ 'updated_at',
34
+ ];
35
+ function getSchemaTables(schema) {
36
+ const tables = [];
37
+ for (const [key, value] of Object.entries(schema)) {
38
+ if (!isTable(value))
39
+ continue;
40
+ const name = getTableName(value);
41
+ const columns = Object.keys(getTableColumns(value));
42
+ tables.push({ key, table: value, name, columns });
43
+ }
44
+ return tables;
45
+ }
46
+ function resolveListAccess(input, columns) {
47
+ const sortableColumns = input.sortableColumns ?? (columns.includes('id') ? ['id'] : []);
48
+ const defaultSort = input.defaultSort ?? {
49
+ column: sortableColumns[0] ?? 'id',
50
+ order: 'desc',
51
+ };
52
+ if (!columns.includes(defaultSort.column)) {
53
+ throw new Error(`[workerstack] defaultSort.column "${defaultSort.column}" is not a column on this table`);
54
+ }
55
+ if (!sortableColumns.includes(defaultSort.column)) {
56
+ throw new Error(`[workerstack] defaultSort.column "${defaultSort.column}" must be listed in sortableColumns`);
57
+ }
58
+ const filterableColumns = input.filterableColumns ?? [];
59
+ for (const col of filterableColumns) {
60
+ if (!columns.includes(col)) {
61
+ throw new Error(`[workerstack] filterableColumns references unknown column "${col}"`);
62
+ }
63
+ }
64
+ for (const col of sortableColumns) {
65
+ if (!columns.includes(col)) {
66
+ throw new Error(`[workerstack] sortableColumns references unknown column "${col}"`);
67
+ }
68
+ }
69
+ return { filterableColumns, sortableColumns, defaultSort };
70
+ }
71
+ function resolveDefaults(input, ownerColumn, columns) {
72
+ const listAccess = resolveListAccess(input, columns);
73
+ const explicitlyWritable = new Set(input.writableColumns ?? []);
74
+ return {
75
+ ownerColumn,
76
+ list: input.list ?? 'public',
77
+ get: input.get ?? 'public',
78
+ create: input.create ?? 'public',
79
+ update: input.update ?? (ownerColumn ? 'owner' : 'deny'),
80
+ delete: input.delete ?? (ownerColumn ? 'owner' : 'deny'),
81
+ writableColumns: input.writableColumns,
82
+ readonlyColumns: [
83
+ ...DEFAULT_READONLY.filter((column) => column === 'id' || !explicitlyWritable.has(column)),
84
+ ...(input.readonlyColumns ?? []),
85
+ ...(ownerColumn ? [ownerColumn] : []),
86
+ ],
87
+ searchableColumns: input.searchableColumns,
88
+ readScope: input.scope?.read,
89
+ writeScope: input.scope?.write,
90
+ ...listAccess,
91
+ };
92
+ }
93
+ function detectOwnerColumn(columns, input) {
94
+ if (input?.ownerColumn)
95
+ return input.ownerColumn;
96
+ if (columns.includes('userId'))
97
+ return 'userId';
98
+ return undefined;
99
+ }
100
+ export function validateAndResolveAccess(schema, accessInput) {
101
+ const tables = getSchemaTables(schema);
102
+ const tableByKey = new Map(tables.map((t) => [t.key, t]));
103
+ const resolved = new Map();
104
+ if (accessInput) {
105
+ for (const key of Object.keys(accessInput)) {
106
+ if (!tableByKey.has(key)) {
107
+ throw new Error(`[workerstack] access.${key} does not match any table in schema`);
108
+ }
109
+ const tableName = tableByKey.get(key).name;
110
+ const input = accessInput[key];
111
+ if (AUTH_TABLE_NAMES.has(tableName)) {
112
+ if (input?.crud === false)
113
+ continue;
114
+ if (!EXPOSEABLE_AUTH_TABLES.has(tableName) || !input?.exposeAuthTable) {
115
+ throw new Error(`[workerstack] access.${key} cannot target auth table "${tableName}" — use { crud: false } to silence, or exposeAuthTable on user`);
116
+ }
117
+ }
118
+ }
119
+ }
120
+ for (const { key, name, columns } of tables) {
121
+ const input = accessInput?.[key];
122
+ if (input?.crud === false)
123
+ continue;
124
+ if (INTERNAL_TABLE_NAMES.has(name))
125
+ continue;
126
+ if (AUTH_TABLE_NAMES.has(name)) {
127
+ if (!input?.exposeAuthTable || !EXPOSEABLE_AUTH_TABLES.has(name))
128
+ continue;
129
+ const ownerColumn = input.ownerColumn ?? 'id';
130
+ if (!columns.includes(ownerColumn)) {
131
+ throw new Error(`[workerstack] access.${key}.ownerColumn "${ownerColumn}" is not a column on table "${name}"`);
132
+ }
133
+ const defaults = resolveDefaults({
134
+ ...input,
135
+ create: input.create ?? 'deny',
136
+ delete: input.delete ?? 'deny',
137
+ }, ownerColumn, columns);
138
+ const existingReadonly = defaults.readonlyColumns.filter((col) => columns.includes(col));
139
+ const resolvedReadonly = [...new Set(existingReadonly)];
140
+ for (const col of [
141
+ ...(defaults.writableColumns ?? []),
142
+ ...(defaults.searchableColumns ?? []),
143
+ ...defaults.filterableColumns,
144
+ ...defaults.sortableColumns,
145
+ ...resolvedReadonly,
146
+ ]) {
147
+ if (!columns.includes(col)) {
148
+ throw new Error(`[workerstack] access.${key} references unknown column "${col}" on table "${name}"`);
149
+ }
150
+ }
151
+ resolved.set(key, {
152
+ tableKey: key,
153
+ tableName: name,
154
+ enabled: true,
155
+ ...defaults,
156
+ readonlyColumns: resolvedReadonly,
157
+ });
158
+ continue;
159
+ }
160
+ const ownerColumn = detectOwnerColumn(columns, input);
161
+ const hasExplicitRules = input !== undefined;
162
+ const hasConventionOwner = ownerColumn !== undefined &&
163
+ input?.ownerColumn === undefined &&
164
+ columns.includes('userId');
165
+ if (!hasExplicitRules && !hasConventionOwner)
166
+ continue;
167
+ if (!ownerColumn &&
168
+ input?.crud !== true &&
169
+ !input?.scope?.read &&
170
+ !input?.scope?.write)
171
+ continue;
172
+ if (input?.ownerColumn && !columns.includes(input.ownerColumn)) {
173
+ throw new Error(`[workerstack] access.${key}.ownerColumn "${input.ownerColumn}" is not a column on table "${name}"`);
174
+ }
175
+ const defaults = resolveDefaults(input ?? {}, ownerColumn, columns);
176
+ const existingReadonly = defaults.readonlyColumns.filter((col) => columns.includes(col));
177
+ const resolvedReadonly = [...new Set(existingReadonly)];
178
+ for (const col of [
179
+ ...(defaults.writableColumns ?? []),
180
+ ...(defaults.searchableColumns ?? []),
181
+ ...defaults.filterableColumns,
182
+ ...defaults.sortableColumns,
183
+ ...resolvedReadonly,
184
+ ]) {
185
+ if (!columns.includes(col)) {
186
+ throw new Error(`[workerstack] access.${key} references unknown column "${col}" on table "${name}"`);
187
+ }
188
+ }
189
+ const needsOwner = [defaults.update, defaults.delete].some((r) => r === 'owner');
190
+ if (needsOwner && !ownerColumn) {
191
+ throw new Error(`[workerstack] access.${key} requires ownerColumn for owner-based update/delete rules`);
192
+ }
193
+ resolved.set(key, {
194
+ tableKey: key,
195
+ tableName: name,
196
+ enabled: true,
197
+ ...defaults,
198
+ readonlyColumns: resolvedReadonly,
199
+ });
200
+ }
201
+ return resolved;
202
+ }
203
+ export function defineAccess(schema, rules) {
204
+ validateAndResolveAccess(schema, rules);
205
+ return rules;
206
+ }
207
+ export function rowMatchesScope(row, scope) {
208
+ for (const [col, expected] of Object.entries(scope)) {
209
+ const actual = row[col];
210
+ if (actual == null)
211
+ return false;
212
+ if (Array.isArray(expected)) {
213
+ if (!expected.map(String).includes(String(actual)))
214
+ return false;
215
+ }
216
+ else if (String(actual) !== String(expected)) {
217
+ return false;
218
+ }
219
+ }
220
+ return true;
221
+ }
222
+ export function stampScope(values, scope) {
223
+ const out = { ...values };
224
+ for (const [col, expected] of Object.entries(scope)) {
225
+ if (!Array.isArray(expected))
226
+ out[col] = expected;
227
+ }
228
+ return out;
229
+ }
230
+ export function checkAccessSync(rule, ctx, ownerColumn) {
231
+ if (rule === 'deny')
232
+ return { allowed: false };
233
+ if (rule === 'public')
234
+ return { allowed: true };
235
+ if (!ctx.user)
236
+ return { allowed: false };
237
+ if (rule === 'authenticated')
238
+ return { allowed: true };
239
+ if (rule === 'owner') {
240
+ if (!ownerColumn)
241
+ return { allowed: false };
242
+ const owner = ctx.row?.[ownerColumn];
243
+ return { allowed: owner != null && String(owner) === ctx.user.id };
244
+ }
245
+ return { allowed: false };
246
+ }
247
+ export async function checkAccess(rule, ctx, ownerColumn) {
248
+ if (rule === 'deny')
249
+ return { allowed: false, status: 403 };
250
+ if (typeof rule === 'function') {
251
+ return (await rule(ctx))
252
+ ? { allowed: true, status: 403 }
253
+ : { allowed: false, status: 403 };
254
+ }
255
+ if (rule === 'public')
256
+ return { allowed: true, status: 403 };
257
+ if (!ctx.user)
258
+ return { allowed: false, status: 401 };
259
+ if (rule === 'authenticated')
260
+ return { allowed: true, status: 403 };
261
+ if (rule === 'owner') {
262
+ if (!ownerColumn)
263
+ return { allowed: false, status: 403 };
264
+ const rowOwner = ctx.row?.[ownerColumn] ?? ctx.body?.[ownerColumn];
265
+ if (rowOwner == null)
266
+ return { allowed: false, status: 403 };
267
+ if (String(rowOwner) !== ctx.user.id)
268
+ return { allowed: false, status: 403 };
269
+ return { allowed: true, status: 403 };
270
+ }
271
+ return { allowed: false, status: 403 };
272
+ }
273
+ export function sanitizeWriteBody(body, access, mode, userId) {
274
+ const out = {};
275
+ const readonly = new Set(access.readonlyColumns);
276
+ for (const [key, value] of Object.entries(body)) {
277
+ // On create, allow client-supplied `id` even if it appears in readonlyColumns,
278
+ // but still respect an explicit writableColumns allowlist if provided.
279
+ if (mode === 'create' && key === 'id') {
280
+ if (access.writableColumns && !access.writableColumns.includes(key))
281
+ continue;
282
+ out[key] = value;
283
+ continue;
284
+ }
285
+ if (readonly.has(key))
286
+ continue;
287
+ if (access.writableColumns && !access.writableColumns.includes(key))
288
+ continue;
289
+ out[key] = value;
290
+ }
291
+ if (mode === 'create' && access.ownerColumn) {
292
+ out[access.ownerColumn] = userId ?? null;
293
+ }
294
+ if (mode === 'update' && access.ownerColumn) {
295
+ delete out[access.ownerColumn];
296
+ }
297
+ return out;
298
+ }
299
+ export async function resolveAccessUser(auth, headers) {
300
+ if (!auth)
301
+ return null;
302
+ const session = await auth.api.getSession({ headers });
303
+ if (!session?.user)
304
+ return null;
305
+ const user = {
306
+ ...session.user,
307
+ id: session.user.id,
308
+ email: session.user.email,
309
+ emailVerified: session.user.emailVerified === true,
310
+ name: session.user.name,
311
+ role: session.user.role,
312
+ };
313
+ return user;
314
+ }
315
+ export async function resolveSession(auth, headers) {
316
+ if (!auth)
317
+ return { user: null, activeOrganizationId: null };
318
+ const session = await auth.api.getSession({ headers });
319
+ if (!session?.user)
320
+ return { user: null, activeOrganizationId: null };
321
+ return {
322
+ user: {
323
+ ...session.user,
324
+ id: session.user.id,
325
+ email: session.user.email,
326
+ emailVerified: session.user.emailVerified === true,
327
+ name: session.user.name,
328
+ role: session.user.role,
329
+ },
330
+ activeOrganizationId: session.session?.activeOrganizationId ?? null,
331
+ };
332
+ }
333
+ //# sourceMappingURL=access.js.map