@mszr/idb-dux 1.0.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 (453) hide show
  1. package/LICENSE +194 -0
  2. package/README.md +84 -0
  3. package/dist/commonjs/admin/index.d.ts +18 -0
  4. package/dist/commonjs/admin/index.d.ts.map +1 -0
  5. package/dist/commonjs/admin/index.js +31 -0
  6. package/dist/commonjs/admin/index.js.map +1 -0
  7. package/dist/commonjs/admin/init.d.ts +67 -0
  8. package/dist/commonjs/admin/init.d.ts.map +1 -0
  9. package/dist/commonjs/admin/init.js +86 -0
  10. package/dist/commonjs/admin/init.js.map +1 -0
  11. package/dist/commonjs/admin/query.d.ts +21 -0
  12. package/dist/commonjs/admin/query.d.ts.map +1 -0
  13. package/dist/commonjs/admin/query.js +46 -0
  14. package/dist/commonjs/admin/query.js.map +1 -0
  15. package/dist/commonjs/admin/types.d.ts +124 -0
  16. package/dist/commonjs/admin/types.d.ts.map +1 -0
  17. package/dist/commonjs/admin/types.js +3 -0
  18. package/dist/commonjs/admin/types.js.map +1 -0
  19. package/dist/commonjs/admin/webhooks.d.ts +11 -0
  20. package/dist/commonjs/admin/webhooks.d.ts.map +1 -0
  21. package/dist/commonjs/admin/webhooks.js +8 -0
  22. package/dist/commonjs/admin/webhooks.js.map +1 -0
  23. package/dist/commonjs/errors.d.ts +13 -0
  24. package/dist/commonjs/errors.d.ts.map +1 -0
  25. package/dist/commonjs/errors.js +19 -0
  26. package/dist/commonjs/errors.js.map +1 -0
  27. package/dist/commonjs/index.d.ts +13 -0
  28. package/dist/commonjs/index.d.ts.map +1 -0
  29. package/dist/commonjs/index.js +29 -0
  30. package/dist/commonjs/index.js.map +1 -0
  31. package/dist/commonjs/nuxt/defineAuthSyncHandler.d.ts +15 -0
  32. package/dist/commonjs/nuxt/defineAuthSyncHandler.d.ts.map +1 -0
  33. package/dist/commonjs/nuxt/defineAuthSyncHandler.js +44 -0
  34. package/dist/commonjs/nuxt/defineAuthSyncHandler.js.map +1 -0
  35. package/dist/commonjs/nuxt/defineServerKit.d.ts +5 -0
  36. package/dist/commonjs/nuxt/defineServerKit.d.ts.map +1 -0
  37. package/dist/commonjs/nuxt/defineServerKit.js +49 -0
  38. package/dist/commonjs/nuxt/defineServerKit.js.map +1 -0
  39. package/dist/commonjs/nuxt/defineWebhookHandler.d.ts +17 -0
  40. package/dist/commonjs/nuxt/defineWebhookHandler.d.ts.map +1 -0
  41. package/dist/commonjs/nuxt/defineWebhookHandler.js +24 -0
  42. package/dist/commonjs/nuxt/defineWebhookHandler.js.map +1 -0
  43. package/dist/commonjs/nuxt/index.d.ts +15 -0
  44. package/dist/commonjs/nuxt/index.d.ts.map +1 -0
  45. package/dist/commonjs/nuxt/index.js +24 -0
  46. package/dist/commonjs/nuxt/index.js.map +1 -0
  47. package/dist/commonjs/nuxt/types.d.ts +54 -0
  48. package/dist/commonjs/nuxt/types.d.ts.map +1 -0
  49. package/dist/commonjs/nuxt/types.js +3 -0
  50. package/dist/commonjs/nuxt/types.js.map +1 -0
  51. package/dist/commonjs/package.json +3 -0
  52. package/dist/commonjs/perms/ast.d.ts +98 -0
  53. package/dist/commonjs/perms/ast.d.ts.map +1 -0
  54. package/dist/commonjs/perms/ast.js +148 -0
  55. package/dist/commonjs/perms/ast.js.map +1 -0
  56. package/dist/commonjs/perms/builder.d.ts +18 -0
  57. package/dist/commonjs/perms/builder.d.ts.map +1 -0
  58. package/dist/commonjs/perms/builder.js +260 -0
  59. package/dist/commonjs/perms/builder.js.map +1 -0
  60. package/dist/commonjs/perms/context.d.ts +27 -0
  61. package/dist/commonjs/perms/context.d.ts.map +1 -0
  62. package/dist/commonjs/perms/context.js +96 -0
  63. package/dist/commonjs/perms/context.js.map +1 -0
  64. package/dist/commonjs/perms/index.d.ts +13 -0
  65. package/dist/commonjs/perms/index.d.ts.map +1 -0
  66. package/dist/commonjs/perms/index.js +6 -0
  67. package/dist/commonjs/perms/index.js.map +1 -0
  68. package/dist/commonjs/perms/types.d.ts +353 -0
  69. package/dist/commonjs/perms/types.d.ts.map +1 -0
  70. package/dist/commonjs/perms/types.js +3 -0
  71. package/dist/commonjs/perms/types.js.map +1 -0
  72. package/dist/commonjs/perms/validate.d.ts +31 -0
  73. package/dist/commonjs/perms/validate.d.ts.map +1 -0
  74. package/dist/commonjs/perms/validate.js +66 -0
  75. package/dist/commonjs/perms/validate.js.map +1 -0
  76. package/dist/commonjs/query/constants.d.ts +13 -0
  77. package/dist/commonjs/query/constants.d.ts.map +1 -0
  78. package/dist/commonjs/query/constants.js +16 -0
  79. package/dist/commonjs/query/constants.js.map +1 -0
  80. package/dist/commonjs/query/defineQuery.d.ts +33 -0
  81. package/dist/commonjs/query/defineQuery.d.ts.map +1 -0
  82. package/dist/commonjs/query/defineQuery.js +28 -0
  83. package/dist/commonjs/query/defineQuery.js.map +1 -0
  84. package/dist/commonjs/query/index.d.ts +9 -0
  85. package/dist/commonjs/query/index.d.ts.map +1 -0
  86. package/dist/commonjs/query/index.js +16 -0
  87. package/dist/commonjs/query/index.js.map +1 -0
  88. package/dist/commonjs/query/keys.d.ts +33 -0
  89. package/dist/commonjs/query/keys.d.ts.map +1 -0
  90. package/dist/commonjs/query/keys.js +3 -0
  91. package/dist/commonjs/query/keys.js.map +1 -0
  92. package/dist/commonjs/query/shapeResult.d.ts +36 -0
  93. package/dist/commonjs/query/shapeResult.d.ts.map +1 -0
  94. package/dist/commonjs/query/shapeResult.js +173 -0
  95. package/dist/commonjs/query/shapeResult.js.map +1 -0
  96. package/dist/commonjs/query/types.d.ts +187 -0
  97. package/dist/commonjs/query/types.d.ts.map +1 -0
  98. package/dist/commonjs/query/types.js +3 -0
  99. package/dist/commonjs/query/types.js.map +1 -0
  100. package/dist/commonjs/query/validation.d.ts +61 -0
  101. package/dist/commonjs/query/validation.d.ts.map +1 -0
  102. package/dist/commonjs/query/validation.js +3 -0
  103. package/dist/commonjs/query/validation.js.map +1 -0
  104. package/dist/commonjs/query/wire.d.ts +13 -0
  105. package/dist/commonjs/query/wire.d.ts.map +1 -0
  106. package/dist/commonjs/query/wire.js +77 -0
  107. package/dist/commonjs/query/wire.js.map +1 -0
  108. package/dist/commonjs/schema/defineSchema.d.ts +110 -0
  109. package/dist/commonjs/schema/defineSchema.d.ts.map +1 -0
  110. package/dist/commonjs/schema/defineSchema.js +72 -0
  111. package/dist/commonjs/schema/defineSchema.js.map +1 -0
  112. package/dist/commonjs/schema/fields.d.ts +33 -0
  113. package/dist/commonjs/schema/fields.d.ts.map +1 -0
  114. package/dist/commonjs/schema/fields.js +3 -0
  115. package/dist/commonjs/schema/fields.js.map +1 -0
  116. package/dist/commonjs/schema/index.d.ts +9 -0
  117. package/dist/commonjs/schema/index.d.ts.map +1 -0
  118. package/dist/commonjs/schema/index.js +10 -0
  119. package/dist/commonjs/schema/index.js.map +1 -0
  120. package/dist/commonjs/schema/namespace.d.ts +82 -0
  121. package/dist/commonjs/schema/namespace.d.ts.map +1 -0
  122. package/dist/commonjs/schema/namespace.js +37 -0
  123. package/dist/commonjs/schema/namespace.js.map +1 -0
  124. package/dist/commonjs/schema/register.d.ts +37 -0
  125. package/dist/commonjs/schema/register.d.ts.map +1 -0
  126. package/dist/commonjs/schema/register.js +3 -0
  127. package/dist/commonjs/schema/register.js.map +1 -0
  128. package/dist/commonjs/schema/singularize.d.ts +45 -0
  129. package/dist/commonjs/schema/singularize.d.ts.map +1 -0
  130. package/dist/commonjs/schema/singularize.js +47 -0
  131. package/dist/commonjs/schema/singularize.js.map +1 -0
  132. package/dist/commonjs/schema/types.d.ts +39 -0
  133. package/dist/commonjs/schema/types.d.ts.map +1 -0
  134. package/dist/commonjs/schema/types.js +3 -0
  135. package/dist/commonjs/schema/types.js.map +1 -0
  136. package/dist/commonjs/schema/util.d.ts +11 -0
  137. package/dist/commonjs/schema/util.d.ts.map +1 -0
  138. package/dist/commonjs/schema/util.js +3 -0
  139. package/dist/commonjs/schema/util.js.map +1 -0
  140. package/dist/commonjs/tx/index.d.ts +4 -0
  141. package/dist/commonjs/tx/index.d.ts.map +1 -0
  142. package/dist/commonjs/tx/index.js +11 -0
  143. package/dist/commonjs/tx/index.js.map +1 -0
  144. package/dist/commonjs/tx/typedTx.d.ts +15 -0
  145. package/dist/commonjs/tx/typedTx.d.ts.map +1 -0
  146. package/dist/commonjs/tx/typedTx.js +54 -0
  147. package/dist/commonjs/tx/typedTx.js.map +1 -0
  148. package/dist/commonjs/tx/types.d.ts +104 -0
  149. package/dist/commonjs/tx/types.d.ts.map +1 -0
  150. package/dist/commonjs/tx/types.js +3 -0
  151. package/dist/commonjs/tx/types.js.map +1 -0
  152. package/dist/commonjs/vue/baseline/InstantDuxDatabase.d.ts +52 -0
  153. package/dist/commonjs/vue/baseline/InstantDuxDatabase.d.ts.map +1 -0
  154. package/dist/commonjs/vue/baseline/InstantDuxDatabase.js +157 -0
  155. package/dist/commonjs/vue/baseline/InstantDuxDatabase.js.map +1 -0
  156. package/dist/commonjs/vue/baseline/InstantDuxRoom.d.ts +72 -0
  157. package/dist/commonjs/vue/baseline/InstantDuxRoom.d.ts.map +1 -0
  158. package/dist/commonjs/vue/baseline/InstantDuxRoom.js +211 -0
  159. package/dist/commonjs/vue/baseline/InstantDuxRoom.js.map +1 -0
  160. package/dist/commonjs/vue/baseline/components/Cursor.d.ts +15 -0
  161. package/dist/commonjs/vue/baseline/components/Cursor.d.ts.map +1 -0
  162. package/dist/commonjs/vue/baseline/components/Cursor.js +39 -0
  163. package/dist/commonjs/vue/baseline/components/Cursor.js.map +1 -0
  164. package/dist/commonjs/vue/baseline/components/Cursors.d.ts +65 -0
  165. package/dist/commonjs/vue/baseline/components/Cursors.d.ts.map +1 -0
  166. package/dist/commonjs/vue/baseline/components/Cursors.js +113 -0
  167. package/dist/commonjs/vue/baseline/components/Cursors.js.map +1 -0
  168. package/dist/commonjs/vue/baseline/components/auth.d.ts +37 -0
  169. package/dist/commonjs/vue/baseline/components/auth.d.ts.map +1 -0
  170. package/dist/commonjs/vue/baseline/components/auth.js +27 -0
  171. package/dist/commonjs/vue/baseline/components/auth.js.map +1 -0
  172. package/dist/commonjs/vue/baseline/index.d.ts +11 -0
  173. package/dist/commonjs/vue/baseline/index.d.ts.map +1 -0
  174. package/dist/commonjs/vue/baseline/index.js +29 -0
  175. package/dist/commonjs/vue/baseline/index.js.map +1 -0
  176. package/dist/commonjs/vue/baseline/useInfiniteQuery.d.ts +19 -0
  177. package/dist/commonjs/vue/baseline/useInfiniteQuery.d.ts.map +1 -0
  178. package/dist/commonjs/vue/baseline/useInfiniteQuery.js +65 -0
  179. package/dist/commonjs/vue/baseline/useInfiniteQuery.js.map +1 -0
  180. package/dist/commonjs/vue/baseline/utils.d.ts +9 -0
  181. package/dist/commonjs/vue/baseline/utils.d.ts.map +1 -0
  182. package/dist/commonjs/vue/baseline/utils.js +29 -0
  183. package/dist/commonjs/vue/baseline/utils.js.map +1 -0
  184. package/dist/commonjs/vue/baseline/version.d.ts +3 -0
  185. package/dist/commonjs/vue/baseline/version.d.ts.map +1 -0
  186. package/dist/commonjs/vue/baseline/version.js +6 -0
  187. package/dist/commonjs/vue/baseline/version.js.map +1 -0
  188. package/dist/commonjs/vue/index.d.ts +21 -0
  189. package/dist/commonjs/vue/index.d.ts.map +1 -0
  190. package/dist/commonjs/vue/index.js +31 -0
  191. package/dist/commonjs/vue/index.js.map +1 -0
  192. package/dist/commonjs/vue/overlay/db.d.ts +106 -0
  193. package/dist/commonjs/vue/overlay/db.d.ts.map +1 -0
  194. package/dist/commonjs/vue/overlay/db.js +105 -0
  195. package/dist/commonjs/vue/overlay/db.js.map +1 -0
  196. package/dist/commonjs/vue/overlay/defineDb.d.ts +34 -0
  197. package/dist/commonjs/vue/overlay/defineDb.d.ts.map +1 -0
  198. package/dist/commonjs/vue/overlay/defineDb.js +48 -0
  199. package/dist/commonjs/vue/overlay/defineDb.js.map +1 -0
  200. package/dist/commonjs/vue/overlay/result.d.ts +29 -0
  201. package/dist/commonjs/vue/overlay/result.d.ts.map +1 -0
  202. package/dist/commonjs/vue/overlay/result.js +75 -0
  203. package/dist/commonjs/vue/overlay/result.js.map +1 -0
  204. package/dist/commonjs/vue/overlay/rooms/index.d.ts +79 -0
  205. package/dist/commonjs/vue/overlay/rooms/index.d.ts.map +1 -0
  206. package/dist/commonjs/vue/overlay/rooms/index.js +28 -0
  207. package/dist/commonjs/vue/overlay/rooms/index.js.map +1 -0
  208. package/dist/commonjs/vue/overlay/types.d.ts +73 -0
  209. package/dist/commonjs/vue/overlay/types.d.ts.map +1 -0
  210. package/dist/commonjs/vue/overlay/types.js +3 -0
  211. package/dist/commonjs/vue/overlay/types.js.map +1 -0
  212. package/dist/commonjs/webhooks/defineWebhookHandlers.d.ts +27 -0
  213. package/dist/commonjs/webhooks/defineWebhookHandlers.d.ts.map +1 -0
  214. package/dist/commonjs/webhooks/defineWebhookHandlers.js +33 -0
  215. package/dist/commonjs/webhooks/defineWebhookHandlers.js.map +1 -0
  216. package/dist/commonjs/webhooks/index.d.ts +15 -0
  217. package/dist/commonjs/webhooks/index.d.ts.map +1 -0
  218. package/dist/commonjs/webhooks/index.js +21 -0
  219. package/dist/commonjs/webhooks/index.js.map +1 -0
  220. package/dist/commonjs/webhooks/init.d.ts +13 -0
  221. package/dist/commonjs/webhooks/init.d.ts.map +1 -0
  222. package/dist/commonjs/webhooks/init.js +39 -0
  223. package/dist/commonjs/webhooks/init.js.map +1 -0
  224. package/dist/commonjs/webhooks/types.d.ts +136 -0
  225. package/dist/commonjs/webhooks/types.d.ts.map +1 -0
  226. package/dist/commonjs/webhooks/types.js +3 -0
  227. package/dist/commonjs/webhooks/types.js.map +1 -0
  228. package/dist/esm/admin/index.d.ts +18 -0
  229. package/dist/esm/admin/index.d.ts.map +1 -0
  230. package/dist/esm/admin/index.js +21 -0
  231. package/dist/esm/admin/index.js.map +1 -0
  232. package/dist/esm/admin/init.d.ts +67 -0
  233. package/dist/esm/admin/init.d.ts.map +1 -0
  234. package/dist/esm/admin/init.js +81 -0
  235. package/dist/esm/admin/init.js.map +1 -0
  236. package/dist/esm/admin/query.d.ts +21 -0
  237. package/dist/esm/admin/query.d.ts.map +1 -0
  238. package/dist/esm/admin/query.js +42 -0
  239. package/dist/esm/admin/query.js.map +1 -0
  240. package/dist/esm/admin/types.d.ts +124 -0
  241. package/dist/esm/admin/types.d.ts.map +1 -0
  242. package/dist/esm/admin/types.js +2 -0
  243. package/dist/esm/admin/types.js.map +1 -0
  244. package/dist/esm/admin/webhooks.d.ts +11 -0
  245. package/dist/esm/admin/webhooks.d.ts.map +1 -0
  246. package/dist/esm/admin/webhooks.js +5 -0
  247. package/dist/esm/admin/webhooks.js.map +1 -0
  248. package/dist/esm/errors.d.ts +13 -0
  249. package/dist/esm/errors.d.ts.map +1 -0
  250. package/dist/esm/errors.js +16 -0
  251. package/dist/esm/errors.js.map +1 -0
  252. package/dist/esm/index.d.ts +13 -0
  253. package/dist/esm/index.d.ts.map +1 -0
  254. package/dist/esm/index.js +13 -0
  255. package/dist/esm/index.js.map +1 -0
  256. package/dist/esm/nuxt/defineAuthSyncHandler.d.ts +15 -0
  257. package/dist/esm/nuxt/defineAuthSyncHandler.d.ts.map +1 -0
  258. package/dist/esm/nuxt/defineAuthSyncHandler.js +41 -0
  259. package/dist/esm/nuxt/defineAuthSyncHandler.js.map +1 -0
  260. package/dist/esm/nuxt/defineServerKit.d.ts +5 -0
  261. package/dist/esm/nuxt/defineServerKit.d.ts.map +1 -0
  262. package/dist/esm/nuxt/defineServerKit.js +46 -0
  263. package/dist/esm/nuxt/defineServerKit.js.map +1 -0
  264. package/dist/esm/nuxt/defineWebhookHandler.d.ts +17 -0
  265. package/dist/esm/nuxt/defineWebhookHandler.d.ts.map +1 -0
  266. package/dist/esm/nuxt/defineWebhookHandler.js +21 -0
  267. package/dist/esm/nuxt/defineWebhookHandler.js.map +1 -0
  268. package/dist/esm/nuxt/index.d.ts +15 -0
  269. package/dist/esm/nuxt/index.d.ts.map +1 -0
  270. package/dist/esm/nuxt/index.js +17 -0
  271. package/dist/esm/nuxt/index.js.map +1 -0
  272. package/dist/esm/nuxt/types.d.ts +54 -0
  273. package/dist/esm/nuxt/types.d.ts.map +1 -0
  274. package/dist/esm/nuxt/types.js +2 -0
  275. package/dist/esm/nuxt/types.js.map +1 -0
  276. package/dist/esm/package.json +3 -0
  277. package/dist/esm/perms/ast.d.ts +98 -0
  278. package/dist/esm/perms/ast.d.ts.map +1 -0
  279. package/dist/esm/perms/ast.js +140 -0
  280. package/dist/esm/perms/ast.js.map +1 -0
  281. package/dist/esm/perms/builder.d.ts +18 -0
  282. package/dist/esm/perms/builder.d.ts.map +1 -0
  283. package/dist/esm/perms/builder.js +257 -0
  284. package/dist/esm/perms/builder.js.map +1 -0
  285. package/dist/esm/perms/context.d.ts +27 -0
  286. package/dist/esm/perms/context.d.ts.map +1 -0
  287. package/dist/esm/perms/context.js +93 -0
  288. package/dist/esm/perms/context.js.map +1 -0
  289. package/dist/esm/perms/index.d.ts +13 -0
  290. package/dist/esm/perms/index.d.ts.map +1 -0
  291. package/dist/esm/perms/index.js +2 -0
  292. package/dist/esm/perms/index.js.map +1 -0
  293. package/dist/esm/perms/types.d.ts +353 -0
  294. package/dist/esm/perms/types.d.ts.map +1 -0
  295. package/dist/esm/perms/types.js +2 -0
  296. package/dist/esm/perms/types.js.map +1 -0
  297. package/dist/esm/perms/validate.d.ts +31 -0
  298. package/dist/esm/perms/validate.d.ts.map +1 -0
  299. package/dist/esm/perms/validate.js +61 -0
  300. package/dist/esm/perms/validate.js.map +1 -0
  301. package/dist/esm/query/constants.d.ts +13 -0
  302. package/dist/esm/query/constants.d.ts.map +1 -0
  303. package/dist/esm/query/constants.js +13 -0
  304. package/dist/esm/query/constants.js.map +1 -0
  305. package/dist/esm/query/defineQuery.d.ts +33 -0
  306. package/dist/esm/query/defineQuery.d.ts.map +1 -0
  307. package/dist/esm/query/defineQuery.js +24 -0
  308. package/dist/esm/query/defineQuery.js.map +1 -0
  309. package/dist/esm/query/index.d.ts +9 -0
  310. package/dist/esm/query/index.d.ts.map +1 -0
  311. package/dist/esm/query/index.js +5 -0
  312. package/dist/esm/query/index.js.map +1 -0
  313. package/dist/esm/query/keys.d.ts +33 -0
  314. package/dist/esm/query/keys.d.ts.map +1 -0
  315. package/dist/esm/query/keys.js +2 -0
  316. package/dist/esm/query/keys.js.map +1 -0
  317. package/dist/esm/query/shapeResult.d.ts +36 -0
  318. package/dist/esm/query/shapeResult.d.ts.map +1 -0
  319. package/dist/esm/query/shapeResult.js +168 -0
  320. package/dist/esm/query/shapeResult.js.map +1 -0
  321. package/dist/esm/query/types.d.ts +187 -0
  322. package/dist/esm/query/types.d.ts.map +1 -0
  323. package/dist/esm/query/types.js +2 -0
  324. package/dist/esm/query/types.js.map +1 -0
  325. package/dist/esm/query/validation.d.ts +61 -0
  326. package/dist/esm/query/validation.d.ts.map +1 -0
  327. package/dist/esm/query/validation.js +2 -0
  328. package/dist/esm/query/validation.js.map +1 -0
  329. package/dist/esm/query/wire.d.ts +13 -0
  330. package/dist/esm/query/wire.d.ts.map +1 -0
  331. package/dist/esm/query/wire.js +74 -0
  332. package/dist/esm/query/wire.js.map +1 -0
  333. package/dist/esm/schema/defineSchema.d.ts +110 -0
  334. package/dist/esm/schema/defineSchema.d.ts.map +1 -0
  335. package/dist/esm/schema/defineSchema.js +69 -0
  336. package/dist/esm/schema/defineSchema.js.map +1 -0
  337. package/dist/esm/schema/fields.d.ts +33 -0
  338. package/dist/esm/schema/fields.d.ts.map +1 -0
  339. package/dist/esm/schema/fields.js +2 -0
  340. package/dist/esm/schema/fields.js.map +1 -0
  341. package/dist/esm/schema/index.d.ts +9 -0
  342. package/dist/esm/schema/index.d.ts.map +1 -0
  343. package/dist/esm/schema/index.js +4 -0
  344. package/dist/esm/schema/index.js.map +1 -0
  345. package/dist/esm/schema/namespace.d.ts +82 -0
  346. package/dist/esm/schema/namespace.d.ts.map +1 -0
  347. package/dist/esm/schema/namespace.js +34 -0
  348. package/dist/esm/schema/namespace.js.map +1 -0
  349. package/dist/esm/schema/register.d.ts +37 -0
  350. package/dist/esm/schema/register.d.ts.map +1 -0
  351. package/dist/esm/schema/register.js +2 -0
  352. package/dist/esm/schema/register.js.map +1 -0
  353. package/dist/esm/schema/singularize.d.ts +45 -0
  354. package/dist/esm/schema/singularize.d.ts.map +1 -0
  355. package/dist/esm/schema/singularize.js +44 -0
  356. package/dist/esm/schema/singularize.js.map +1 -0
  357. package/dist/esm/schema/types.d.ts +39 -0
  358. package/dist/esm/schema/types.d.ts.map +1 -0
  359. package/dist/esm/schema/types.js +2 -0
  360. package/dist/esm/schema/types.js.map +1 -0
  361. package/dist/esm/schema/util.d.ts +11 -0
  362. package/dist/esm/schema/util.d.ts.map +1 -0
  363. package/dist/esm/schema/util.js +2 -0
  364. package/dist/esm/schema/util.js.map +1 -0
  365. package/dist/esm/tx/index.d.ts +4 -0
  366. package/dist/esm/tx/index.d.ts.map +1 -0
  367. package/dist/esm/tx/index.js +5 -0
  368. package/dist/esm/tx/index.js.map +1 -0
  369. package/dist/esm/tx/typedTx.d.ts +15 -0
  370. package/dist/esm/tx/typedTx.d.ts.map +1 -0
  371. package/dist/esm/tx/typedTx.js +51 -0
  372. package/dist/esm/tx/typedTx.js.map +1 -0
  373. package/dist/esm/tx/types.d.ts +104 -0
  374. package/dist/esm/tx/types.d.ts.map +1 -0
  375. package/dist/esm/tx/types.js +2 -0
  376. package/dist/esm/tx/types.js.map +1 -0
  377. package/dist/esm/vue/baseline/InstantDuxDatabase.d.ts +52 -0
  378. package/dist/esm/vue/baseline/InstantDuxDatabase.d.ts.map +1 -0
  379. package/dist/esm/vue/baseline/InstantDuxDatabase.js +149 -0
  380. package/dist/esm/vue/baseline/InstantDuxDatabase.js.map +1 -0
  381. package/dist/esm/vue/baseline/InstantDuxRoom.d.ts +72 -0
  382. package/dist/esm/vue/baseline/InstantDuxRoom.d.ts.map +1 -0
  383. package/dist/esm/vue/baseline/InstantDuxRoom.js +202 -0
  384. package/dist/esm/vue/baseline/InstantDuxRoom.js.map +1 -0
  385. package/dist/esm/vue/baseline/components/Cursor.d.ts +15 -0
  386. package/dist/esm/vue/baseline/components/Cursor.d.ts.map +1 -0
  387. package/dist/esm/vue/baseline/components/Cursor.js +36 -0
  388. package/dist/esm/vue/baseline/components/Cursor.js.map +1 -0
  389. package/dist/esm/vue/baseline/components/Cursors.d.ts +65 -0
  390. package/dist/esm/vue/baseline/components/Cursors.d.ts.map +1 -0
  391. package/dist/esm/vue/baseline/components/Cursors.js +107 -0
  392. package/dist/esm/vue/baseline/components/Cursors.js.map +1 -0
  393. package/dist/esm/vue/baseline/components/auth.d.ts +37 -0
  394. package/dist/esm/vue/baseline/components/auth.d.ts.map +1 -0
  395. package/dist/esm/vue/baseline/components/auth.js +24 -0
  396. package/dist/esm/vue/baseline/components/auth.js.map +1 -0
  397. package/dist/esm/vue/baseline/index.d.ts +11 -0
  398. package/dist/esm/vue/baseline/index.d.ts.map +1 -0
  399. package/dist/esm/vue/baseline/index.js +10 -0
  400. package/dist/esm/vue/baseline/index.js.map +1 -0
  401. package/dist/esm/vue/baseline/useInfiniteQuery.d.ts +19 -0
  402. package/dist/esm/vue/baseline/useInfiniteQuery.d.ts.map +1 -0
  403. package/dist/esm/vue/baseline/useInfiniteQuery.js +62 -0
  404. package/dist/esm/vue/baseline/useInfiniteQuery.js.map +1 -0
  405. package/dist/esm/vue/baseline/utils.d.ts +9 -0
  406. package/dist/esm/vue/baseline/utils.d.ts.map +1 -0
  407. package/dist/esm/vue/baseline/utils.js +25 -0
  408. package/dist/esm/vue/baseline/utils.js.map +1 -0
  409. package/dist/esm/vue/baseline/version.d.ts +3 -0
  410. package/dist/esm/vue/baseline/version.d.ts.map +1 -0
  411. package/dist/esm/vue/baseline/version.js +4 -0
  412. package/dist/esm/vue/baseline/version.js.map +1 -0
  413. package/dist/esm/vue/index.d.ts +21 -0
  414. package/dist/esm/vue/index.d.ts.map +1 -0
  415. package/dist/esm/vue/index.js +18 -0
  416. package/dist/esm/vue/index.js.map +1 -0
  417. package/dist/esm/vue/overlay/db.d.ts +106 -0
  418. package/dist/esm/vue/overlay/db.d.ts.map +1 -0
  419. package/dist/esm/vue/overlay/db.js +101 -0
  420. package/dist/esm/vue/overlay/db.js.map +1 -0
  421. package/dist/esm/vue/overlay/defineDb.d.ts +34 -0
  422. package/dist/esm/vue/overlay/defineDb.d.ts.map +1 -0
  423. package/dist/esm/vue/overlay/defineDb.js +44 -0
  424. package/dist/esm/vue/overlay/defineDb.js.map +1 -0
  425. package/dist/esm/vue/overlay/result.d.ts +29 -0
  426. package/dist/esm/vue/overlay/result.d.ts.map +1 -0
  427. package/dist/esm/vue/overlay/result.js +71 -0
  428. package/dist/esm/vue/overlay/result.js.map +1 -0
  429. package/dist/esm/vue/overlay/rooms/index.d.ts +79 -0
  430. package/dist/esm/vue/overlay/rooms/index.d.ts.map +1 -0
  431. package/dist/esm/vue/overlay/rooms/index.js +25 -0
  432. package/dist/esm/vue/overlay/rooms/index.js.map +1 -0
  433. package/dist/esm/vue/overlay/types.d.ts +73 -0
  434. package/dist/esm/vue/overlay/types.d.ts.map +1 -0
  435. package/dist/esm/vue/overlay/types.js +2 -0
  436. package/dist/esm/vue/overlay/types.js.map +1 -0
  437. package/dist/esm/webhooks/defineWebhookHandlers.d.ts +27 -0
  438. package/dist/esm/webhooks/defineWebhookHandlers.d.ts.map +1 -0
  439. package/dist/esm/webhooks/defineWebhookHandlers.js +30 -0
  440. package/dist/esm/webhooks/defineWebhookHandlers.js.map +1 -0
  441. package/dist/esm/webhooks/index.d.ts +15 -0
  442. package/dist/esm/webhooks/index.d.ts.map +1 -0
  443. package/dist/esm/webhooks/index.js +14 -0
  444. package/dist/esm/webhooks/index.js.map +1 -0
  445. package/dist/esm/webhooks/init.d.ts +13 -0
  446. package/dist/esm/webhooks/init.d.ts.map +1 -0
  447. package/dist/esm/webhooks/init.js +36 -0
  448. package/dist/esm/webhooks/init.js.map +1 -0
  449. package/dist/esm/webhooks/types.d.ts +136 -0
  450. package/dist/esm/webhooks/types.d.ts.map +1 -0
  451. package/dist/esm/webhooks/types.js +2 -0
  452. package/dist/esm/webhooks/types.js.map +1 -0
  453. package/package.json +149 -0
@@ -0,0 +1,140 @@
1
+ /**
2
+ * The expression layer: immutable, phantom-typed nodes that render to CEL.
3
+ *
4
+ * Every authoring helper (`e.title.eq('x')`, `er(...).contains(auth.id)`,
5
+ * `f.or(...)`) builds one of these nodes; `.compile()` walks the tree and
6
+ * emits the plain CEL strings Instant already accepts. The phantom `T` carries
7
+ * the value type so fluent composition type-checks at the cursor; at runtime a
8
+ * node is just a rendered string plus a precedence, so parentheses are added
9
+ * deterministically and only where CEL precedence requires them.
10
+ *
11
+ * The renderer targets the exact bindings the backend installs
12
+ * (`server/src/instant/db/cel.clj`): `auth`, `data`, `newData`, `linkedData`,
13
+ * `ruleParams`, `request`, `rateLimit`.
14
+ */
15
+ // ==========
16
+ // precedence
17
+ /**
18
+ * CEL operator precedence, low to high. A child operand is parenthesized only
19
+ * when its precedence is lower than its parent's — minimal, correct, stable.
20
+ * `raw` sits below everything so any composition around it is always wrapped.
21
+ */
22
+ const RAW = 0;
23
+ const OR = 1;
24
+ const AND = 2;
25
+ const NOT = 3;
26
+ const CMP = 4;
27
+ const ATOM = 5;
28
+ // ==========
29
+ // the node
30
+ const BRAND = Symbol('idb-perms-expr');
31
+ /** The one runtime node behind both `Expr` and `ListExpr`. */
32
+ export class ExprNode {
33
+ cel;
34
+ prec;
35
+ [BRAND] = true;
36
+ constructor(cel, prec) {
37
+ this.cel = cel;
38
+ this.prec = prec;
39
+ }
40
+ render() {
41
+ return this.cel;
42
+ }
43
+ op(operator, value, prec) {
44
+ const right = coerce(value);
45
+ return new ExprNode(`${wrap(this, prec)} ${operator} ${wrap(right, prec)}`, prec);
46
+ }
47
+ eq(value) { return this.op('==', value, CMP); }
48
+ neq(value) { return this.op('!=', value, CMP); }
49
+ gt(value) { return this.op('>', value, CMP); }
50
+ gte(value) { return this.op('>=', value, CMP); }
51
+ lt(value) { return this.op('<', value, CMP); }
52
+ lte(value) { return this.op('<=', value, CMP); }
53
+ in(list) { return this.op('in', list, CMP); }
54
+ and(other) { return this.op('&&', other, AND); }
55
+ or(other) { return this.op('||', other, OR); }
56
+ not() {
57
+ return new ExprNode(`!${this.prec < ATOM ? `(${this.cel})` : this.cel}`, NOT);
58
+ }
59
+ method(name, value) {
60
+ return new ExprNode(`${wrap(this, ATOM)}.${name}(${coerce(value).cel})`, ATOM);
61
+ }
62
+ startsWith(value) { return this.method('startsWith', value); }
63
+ endsWith(value) { return this.method('endsWith', value); }
64
+ // CEL spells substring containment `string.contains`.
65
+ includes(value) { return this.method('contains', value); }
66
+ matches(value) { return this.method('matches', value); }
67
+ // ----- list methods
68
+ contains(value) {
69
+ // `value in list` — the membership test the backend optimizes for refs.
70
+ return new ExprNode(`${coerce(value).cel} in ${wrap(this, CMP)}`, CMP);
71
+ }
72
+ isEmpty() { return new ExprNode(`${wrap(this, CMP)} == []`, CMP); }
73
+ isNonEmpty() { return new ExprNode(`${wrap(this, CMP)} != []`, CMP); }
74
+ size() { return new ExprNode(`size(${this.cel})`, ATOM); }
75
+ at(index) { return new ExprNode(`${wrap(this, ATOM)}[${index}]`, ATOM); }
76
+ some(fn) { return this.macro('exists', fn); }
77
+ every(fn) { return this.macro('all', fn); }
78
+ macro(name, fn) {
79
+ const variable = bindVarName(fn);
80
+ const body = fn(new ExprNode(variable, ATOM));
81
+ return new ExprNode(`${wrap(this, ATOM)}.${name}(${variable}, ${body.render()})`, ATOM);
82
+ }
83
+ }
84
+ function wrap(node, parentPrec) {
85
+ return node.prec < parentPrec ? `(${node.cel})` : node.cel;
86
+ }
87
+ /** Is this an expression node (vs a raw literal value)? */
88
+ export function isExprNode(value) {
89
+ return typeof value === 'object' && value !== null && BRAND in value;
90
+ }
91
+ // ==========
92
+ // literals
93
+ /** Single-quote a CEL string literal, escaping the characters CEL cares about. */
94
+ function quote(value) {
95
+ const escaped = value
96
+ .replace(/\\/g, '\\\\')
97
+ .replace(/'/g, '\\\'')
98
+ .replace(/\n/g, '\\n')
99
+ .replace(/\r/g, '\\r')
100
+ .replace(/\t/g, '\\t');
101
+ return `'${escaped}'`;
102
+ }
103
+ /** Render a JS literal as a CEL atom. */
104
+ function literal(value) {
105
+ if (value === null || value === undefined)
106
+ return 'null';
107
+ if (typeof value === 'string')
108
+ return quote(value);
109
+ if (typeof value === 'number' || typeof value === 'boolean')
110
+ return String(value);
111
+ if (value instanceof Date)
112
+ return String(value.getTime());
113
+ if (Array.isArray(value))
114
+ return `[${value.map(literal).join(', ')}]`;
115
+ throw new TypeError(`Cannot render ${typeof value} as a CEL literal`);
116
+ }
117
+ /** Pass an expression through; turn anything else into an atom literal node. */
118
+ export function coerce(value) {
119
+ return isExprNode(value) ? value : new ExprNode(literal(value), ATOM);
120
+ }
121
+ // ==========
122
+ // node factories (used by the context helpers)
123
+ /** A bare CEL atom — identifiers, property/field access, calls. */
124
+ export function atom(cel) {
125
+ return new ExprNode(cel, ATOM);
126
+ }
127
+ /** A raw, user-authored CEL string — always wrapped when composed. */
128
+ export function raw(cel) {
129
+ return new ExprNode(cel, RAW);
130
+ }
131
+ /**
132
+ * Recover the macro variable name from the callback's source so the emitted
133
+ * CEL reads naturally (`.exists(types, 'admin' in types)`); falls back to
134
+ * `item` when the source can't be parsed.
135
+ */
136
+ function bindVarName(fn) {
137
+ const match = /^[\s(]*([A-Z_$][\w$]*)/i.exec(fn.toString());
138
+ return match?.[1] ?? 'item';
139
+ }
140
+ //# sourceMappingURL=ast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast.js","sourceRoot":"","sources":["../../../src/perms/ast.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAmDH,aAAa;AACb,aAAa;AAEb;;;;GAIG;AACH,MAAM,GAAG,GAAG,CAAC,CAAA;AACb,MAAM,EAAE,GAAG,CAAC,CAAA;AACZ,MAAM,GAAG,GAAG,CAAC,CAAA;AACb,MAAM,GAAG,GAAG,CAAC,CAAA;AACb,MAAM,GAAG,GAAG,CAAC,CAAA;AACb,MAAM,IAAI,GAAG,CAAC,CAAA;AAEd,aAAa;AACb,WAAW;AAEX,MAAM,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAA;AAEtC,8DAA8D;AAC9D,MAAM,OAAO,QAAQ;IAEE;IAAsB;IADlC,CAAC,KAAK,CAAC,GAAG,IAAI,CAAA;IACvB,YAAqB,GAAW,EAAW,IAAY;QAAlC,QAAG,GAAH,GAAG,CAAQ;QAAW,SAAI,GAAJ,IAAI,CAAQ;IAAG,CAAC;IAE3D,MAAM;QACJ,OAAO,IAAI,CAAC,GAAG,CAAA;IACjB,CAAC;IAEO,EAAE,CAAC,QAAgB,EAAE,KAAc,EAAE,IAAY;QACvD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;QAC3B,OAAO,IAAI,QAAQ,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,QAAQ,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;IACnF,CAAC;IAED,EAAE,CAAC,KAAc,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA,CAAC,CAAC;IACvD,GAAG,CAAC,KAAc,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA,CAAC,CAAC;IACxD,EAAE,CAAC,KAAc,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA,CAAC,CAAC;IACtD,GAAG,CAAC,KAAc,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA,CAAC,CAAC;IACxD,EAAE,CAAC,KAAc,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA,CAAC,CAAC;IACtD,GAAG,CAAC,KAAc,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA,CAAC,CAAC;IACxD,EAAE,CAAC,IAAa,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA,CAAC,CAAC;IACrD,GAAG,CAAC,KAAc,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA,CAAC,CAAC;IACxD,EAAE,CAAC,KAAc,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAA,CAAC,CAAC;IAEtD,GAAG;QACD,OAAO,IAAI,QAAQ,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAA;IAC/E,CAAC;IAEO,MAAM,CAAC,IAAY,EAAE,KAAc;QACzC,OAAO,IAAI,QAAQ,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,CAAC,CAAA;IAChF,CAAC;IAED,UAAU,CAAC,KAAc,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,CAAA,CAAC,CAAC;IACtE,QAAQ,CAAC,KAAc,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA,CAAC,CAAC;IAClE,sDAAsD;IACtD,QAAQ,CAAC,KAAc,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA,CAAC,CAAC;IAClE,OAAO,CAAC,KAAc,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA,CAAC,CAAC;IAEhE,qBAAqB;IAErB,QAAQ,CAAC,KAAc;QACrB,wEAAwE;QACxE,OAAO,IAAI,QAAQ,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;IACxE,CAAC;IAED,OAAO,KAAK,OAAO,IAAI,QAAQ,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA,CAAC,CAAC;IAClE,UAAU,KAAK,OAAO,IAAI,QAAQ,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA,CAAC,CAAC;IACrE,IAAI,KAAK,OAAO,IAAI,QAAQ,CAAC,QAAQ,IAAI,CAAC,GAAG,GAAG,EAAE,IAAI,CAAC,CAAA,CAAC,CAAC;IACzD,EAAE,CAAC,KAAa,IAAI,OAAO,IAAI,QAAQ,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,GAAG,EAAE,IAAI,CAAC,CAAA,CAAC,CAAC;IAEhF,IAAI,CAAC,EAAgC,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA,CAAC,CAAC;IAC1E,KAAK,CAAC,EAAgC,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA,CAAC,CAAC;IAEhE,KAAK,CAAC,IAAY,EAAE,EAAgC;QAC1D,MAAM,QAAQ,GAAG,WAAW,CAAC,EAAE,CAAC,CAAA;QAChC,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAwB,CAAA;QACpE,OAAO,IAAI,QAAQ,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,QAAQ,KAAK,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;IACzF,CAAC;CACF;AAED,SAAS,IAAI,CAAC,IAAc,EAAE,UAAkB;IAC9C,OAAO,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAA;AAC5D,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,IAAI,KAAK,CAAA;AACtE,CAAC;AAED,aAAa;AACb,WAAW;AAEX,kFAAkF;AAClF,SAAS,KAAK,CAAC,KAAa;IAC1B,MAAM,OAAO,GAAG,KAAK;SAClB,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;IACxB,OAAO,IAAI,OAAO,GAAG,CAAA;AACvB,CAAC;AAED,yCAAyC;AACzC,SAAS,OAAO,CAAC,KAAc;IAC7B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QACvC,OAAO,MAAM,CAAA;IACf,IAAI,OAAO,KAAK,KAAK,QAAQ;QAC3B,OAAO,KAAK,CAAC,KAAK,CAAC,CAAA;IACrB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS;QACzD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;IACtB,IAAI,KAAK,YAAY,IAAI;QACvB,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;IAChC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACtB,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAA;IAC7C,MAAM,IAAI,SAAS,CAAC,iBAAiB,OAAO,KAAK,mBAAmB,CAAC,CAAA;AACvE,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,MAAM,CAAC,KAAc;IACnC,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAA;AACvE,CAAC;AAED,aAAa;AACb,+CAA+C;AAE/C,mEAAmE;AACnE,MAAM,UAAU,IAAI,CAAC,GAAW;IAC9B,OAAO,IAAI,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;AAChC,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,GAAG,CAAC,GAAW;IAC7B,OAAO,IAAI,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;AAC/B,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CAAC,EAA0B;IAC7C,MAAM,KAAK,GAAG,yBAAyB,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC3D,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAAA;AAC7B,CAAC","sourcesContent":["/**\n * The expression layer: immutable, phantom-typed nodes that render to CEL.\n *\n * Every authoring helper (`e.title.eq('x')`, `er(...).contains(auth.id)`,\n * `f.or(...)`) builds one of these nodes; `.compile()` walks the tree and\n * emits the plain CEL strings Instant already accepts. The phantom `T` carries\n * the value type so fluent composition type-checks at the cursor; at runtime a\n * node is just a rendered string plus a precedence, so parentheses are added\n * deterministically and only where CEL precedence requires them.\n *\n * The renderer targets the exact bindings the backend installs\n * (`server/src/instant/db/cel.clj`): `auth`, `data`, `newData`, `linkedData`,\n * `ruleParams`, `request`, `rateLimit`.\n */\n\n// ==========\n// authoring types\n\n/** A value position accepts a raw literal or another expression of that type. */\nexport type ExprArg<T> = T | Expr<T>\n\n/**\n * A scalar CEL expression. `and`/`or`/`not` return a boolean expression so\n * fluent chains read subject-first (`b.isMember.and(b.isSignedIn)`); the\n * string methods are available everywhere but only meaningful on strings.\n */\nexport interface Expr<T = unknown> {\n // `null` is allowed so the `x != null` / `x == null` idiom reads naturally.\n eq: (value: ExprArg<T> | null) => Expr<boolean>\n neq: (value: ExprArg<T> | null) => Expr<boolean>\n gt: (value: ExprArg<T>) => Expr<boolean>\n gte: (value: ExprArg<T>) => Expr<boolean>\n lt: (value: ExprArg<T>) => Expr<boolean>\n lte: (value: ExprArg<T>) => Expr<boolean>\n in: (list: readonly ExprArg<T>[]) => Expr<boolean>\n and: (other: ExprArg<boolean>) => Expr<boolean>\n or: (other: ExprArg<boolean>) => Expr<boolean>\n not: () => Expr<boolean>\n startsWith: (value: ExprArg<string>) => Expr<boolean>\n endsWith: (value: ExprArg<string>) => Expr<boolean>\n includes: (value: ExprArg<string>) => Expr<boolean>\n matches: (value: ExprArg<string>) => Expr<boolean>\n render: () => string\n}\n\n/** The element view of a list — a JSON-array terminal yields a nested list. */\nexport type ItemExpr<T> = T extends readonly (infer E)[] ? ListExpr<E> : Expr<T>\n\n/**\n * A list-valued CEL expression — what every ref helper (`er`/`ar`/`elr`) and\n * `request.modifiedFields` return. `.some`/`.every` compile to CEL's\n * `.exists`/`.all` macros.\n */\nexport interface ListExpr<T = unknown> {\n contains: (value: ExprArg<T>) => Expr<boolean>\n isEmpty: () => Expr<boolean>\n isNonEmpty: () => Expr<boolean>\n size: () => Expr<number>\n at: (index: number) => ItemExpr<T>\n some: (fn: (item: ItemExpr<T>) => Expr<boolean>) => Expr<boolean>\n every: (fn: (item: ItemExpr<T>) => Expr<boolean>) => Expr<boolean>\n render: () => string\n}\n\n// ==========\n// precedence\n\n/**\n * CEL operator precedence, low to high. A child operand is parenthesized only\n * when its precedence is lower than its parent's — minimal, correct, stable.\n * `raw` sits below everything so any composition around it is always wrapped.\n */\nconst RAW = 0\nconst OR = 1\nconst AND = 2\nconst NOT = 3\nconst CMP = 4\nconst ATOM = 5\n\n// ==========\n// the node\n\nconst BRAND = Symbol('idb-perms-expr')\n\n/** The one runtime node behind both `Expr` and `ListExpr`. */\nexport class ExprNode {\n readonly [BRAND] = true\n constructor(readonly cel: string, readonly prec: number) {}\n\n render(): string {\n return this.cel\n }\n\n private op(operator: string, value: unknown, prec: number): ExprNode {\n const right = coerce(value)\n return new ExprNode(`${wrap(this, prec)} ${operator} ${wrap(right, prec)}`, prec)\n }\n\n eq(value: unknown) { return this.op('==', value, CMP) }\n neq(value: unknown) { return this.op('!=', value, CMP) }\n gt(value: unknown) { return this.op('>', value, CMP) }\n gte(value: unknown) { return this.op('>=', value, CMP) }\n lt(value: unknown) { return this.op('<', value, CMP) }\n lte(value: unknown) { return this.op('<=', value, CMP) }\n in(list: unknown) { return this.op('in', list, CMP) }\n and(other: unknown) { return this.op('&&', other, AND) }\n or(other: unknown) { return this.op('||', other, OR) }\n\n not(): ExprNode {\n return new ExprNode(`!${this.prec < ATOM ? `(${this.cel})` : this.cel}`, NOT)\n }\n\n private method(name: string, value: unknown): ExprNode {\n return new ExprNode(`${wrap(this, ATOM)}.${name}(${coerce(value).cel})`, ATOM)\n }\n\n startsWith(value: unknown) { return this.method('startsWith', value) }\n endsWith(value: unknown) { return this.method('endsWith', value) }\n // CEL spells substring containment `string.contains`.\n includes(value: unknown) { return this.method('contains', value) }\n matches(value: unknown) { return this.method('matches', value) }\n\n // ----- list methods\n\n contains(value: unknown): ExprNode {\n // `value in list` — the membership test the backend optimizes for refs.\n return new ExprNode(`${coerce(value).cel} in ${wrap(this, CMP)}`, CMP)\n }\n\n isEmpty() { return new ExprNode(`${wrap(this, CMP)} == []`, CMP) }\n isNonEmpty() { return new ExprNode(`${wrap(this, CMP)} != []`, CMP) }\n size() { return new ExprNode(`size(${this.cel})`, ATOM) }\n at(index: number) { return new ExprNode(`${wrap(this, ATOM)}[${index}]`, ATOM) }\n\n some(fn: (item: any) => Expr<boolean>) { return this.macro('exists', fn) }\n every(fn: (item: any) => Expr<boolean>) { return this.macro('all', fn) }\n\n private macro(name: string, fn: (item: any) => Expr<boolean>): ExprNode {\n const variable = bindVarName(fn)\n const body = fn(new ExprNode(variable, ATOM)) as unknown as ExprNode\n return new ExprNode(`${wrap(this, ATOM)}.${name}(${variable}, ${body.render()})`, ATOM)\n }\n}\n\nfunction wrap(node: ExprNode, parentPrec: number): string {\n return node.prec < parentPrec ? `(${node.cel})` : node.cel\n}\n\n/** Is this an expression node (vs a raw literal value)? */\nexport function isExprNode(value: unknown): value is ExprNode {\n return typeof value === 'object' && value !== null && BRAND in value\n}\n\n// ==========\n// literals\n\n/** Single-quote a CEL string literal, escaping the characters CEL cares about. */\nfunction quote(value: string): string {\n const escaped = value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/'/g, '\\\\\\'')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r')\n .replace(/\\t/g, '\\\\t')\n return `'${escaped}'`\n}\n\n/** Render a JS literal as a CEL atom. */\nfunction literal(value: unknown): string {\n if (value === null || value === undefined)\n return 'null'\n if (typeof value === 'string')\n return quote(value)\n if (typeof value === 'number' || typeof value === 'boolean')\n return String(value)\n if (value instanceof Date)\n return String(value.getTime())\n if (Array.isArray(value))\n return `[${value.map(literal).join(', ')}]`\n throw new TypeError(`Cannot render ${typeof value} as a CEL literal`)\n}\n\n/** Pass an expression through; turn anything else into an atom literal node. */\nexport function coerce(value: unknown): ExprNode {\n return isExprNode(value) ? value : new ExprNode(literal(value), ATOM)\n}\n\n// ==========\n// node factories (used by the context helpers)\n\n/** A bare CEL atom — identifiers, property/field access, calls. */\nexport function atom(cel: string): ExprNode {\n return new ExprNode(cel, ATOM)\n}\n\n/** A raw, user-authored CEL string — always wrapped when composed. */\nexport function raw(cel: string): ExprNode {\n return new ExprNode(cel, RAW)\n}\n\n/**\n * Recover the macro variable name from the callback's source so the emitted\n * CEL reads naturally (`.exists(types, 'admin' in types)`); falls back to\n * `item` when the source can't be parsed.\n */\nfunction bindVarName(fn: (item: any) => unknown): string {\n const match = /^[\\s(]*([A-Z_$][\\w$]*)/i.exec(fn.toString())\n return match?.[1] ?? 'item'\n}\n"]}
@@ -0,0 +1,18 @@
1
+ import type { IdbSchema } from '../schema/defineSchema.js';
2
+ import type { IdbRegisteredSchema } from '../schema/register.js';
3
+ import type { PermsBuilder } from './types.js';
4
+ /**
5
+ * The typed permissions authoring entry. With the schema registered, no
6
+ * argument is needed; pass the schema value to add runtime validation; pass an
7
+ * explicit type param for a different schema (spec §2).
8
+ *
9
+ * @example
10
+ * export default definePerms(schema)
11
+ * .namespaces({
12
+ * tasks: ns => ns.allow({ view: true }),
13
+ * })
14
+ * .compile()
15
+ */
16
+ export declare function definePerms<S extends IdbSchema>(schema: S): PermsBuilder<S>;
17
+ export declare function definePerms<S extends IdbSchema = IdbRegisteredSchema>(): PermsBuilder<S>;
18
+ //# sourceMappingURL=builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../../src/perms/builder.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAEhE,OAAO,KAAK,EAAsB,YAAY,EAAE,MAAM,YAAY,CAAA;AAsUlE;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,SAAS,EAAE,MAAM,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAA;AAC5E,wBAAgB,WAAW,CAAC,CAAC,SAAS,SAAS,GAAG,mBAAmB,KAAK,YAAY,CAAC,CAAC,CAAC,CAAA"}
@@ -0,0 +1,257 @@
1
+ import { makeContext } from './context.js';
2
+ import { makeValidator, namespaceExists, noValidate } from './validate.js';
3
+ // ==========
4
+ // resolution
5
+ function asCel(value) {
6
+ return typeof value === 'boolean' ? String(value) : value.render();
7
+ }
8
+ function resolveRule(rule, ctx) {
9
+ return asCel(typeof rule === 'function' ? rule(ctx) : rule);
10
+ }
11
+ function renderBinds(binds) {
12
+ return Object.fromEntries(Object.entries(binds).map(([name, node]) => [name, node.render()]));
13
+ }
14
+ const ACTIONS = ['view', 'create', 'update', 'delete'];
15
+ // ==========
16
+ // namespace builder
17
+ class NamespaceRuntime {
18
+ schema;
19
+ ns;
20
+ /** Common staged values — inlined, inherited from defaults, merged into every action. */
21
+ commonStaged;
22
+ /** All emitted bind aliases — common and action-specific share one block. */
23
+ binds = {};
24
+ /** Per-whole-entity-action staged values, visible only in that action. */
25
+ actionStaged = {};
26
+ /** Per-(dir, label) staged values, visible only in that link/unlink rule. */
27
+ linkStaged = {};
28
+ inheritedBindNames;
29
+ allowOut = {};
30
+ fieldsOut = {};
31
+ constructor(schema, ns, defaultStaged, defaultBindNames) {
32
+ this.schema = schema;
33
+ this.ns = ns;
34
+ this.commonStaged = { ...defaultStaged };
35
+ this.inheritedBindNames = new Set(defaultBindNames);
36
+ }
37
+ /** Is this name already a common staged value, an emitted bind, or inherited? */
38
+ known(name) {
39
+ return name in this.commonStaged || name in this.binds || this.inheritedBindNames.has(name);
40
+ }
41
+ linkTargetOf(label) {
42
+ return this.schema?.entities[this.ns]?.links?.[label]?.entityName;
43
+ }
44
+ /** Build a context over a staged snapshot, validating against ns (or a link target). */
45
+ ctxFor(staged, linkTarget) {
46
+ const validator = this.schema
47
+ ? makeValidator(this.schema, this.ns, linkTarget)
48
+ : noValidate;
49
+ return makeContext({ staged, binds: this.binds }, validator);
50
+ }
51
+ mergedStaged(action) {
52
+ return { ...this.commonStaged, ...this.actionStaged[action] };
53
+ }
54
+ mergedLinkStaged(dir, label) {
55
+ return { ...this.commonStaged, ...this.linkStaged[dir]?.[label] };
56
+ }
57
+ add(produced, into, guard, seen) {
58
+ for (const [name, node] of Object.entries(produced)) {
59
+ if (guard && seen(name))
60
+ throw new Error(`QERR_PERMS_DUPLICATE_NAME: '${name}' is already defined on '${this.ns}' — use .overrideStage/.overrideBind`);
61
+ into[name] = node;
62
+ }
63
+ return this;
64
+ }
65
+ stage(fn) {
66
+ return this.add(fn(this.ctxFor(this.commonStaged)), this.commonStaged, true, n => this.known(n));
67
+ }
68
+ overrideStage(fn) {
69
+ return this.add(fn(this.ctxFor(this.commonStaged)), this.commonStaged, false, () => false);
70
+ }
71
+ bind(fn) {
72
+ return this.add(fn(this.ctxFor(this.commonStaged)), this.binds, true, n => this.known(n));
73
+ }
74
+ overrideBind(fn) {
75
+ return this.add(fn(this.ctxFor(this.commonStaged)), this.binds, false, () => false);
76
+ }
77
+ stageFor(actionOrDir, labelOrFn, maybeFn) {
78
+ if (maybeFn === undefined) {
79
+ const action = actionOrDir;
80
+ const into = (this.actionStaged[action] ??= {});
81
+ return this.add(labelOrFn(this.ctxFor(this.mergedStaged(action))), into, true, n => this.known(n) || n in into);
82
+ }
83
+ const [dir, label] = [actionOrDir, labelOrFn];
84
+ const into = ((this.linkStaged[dir] ??= {})[label] ??= {});
85
+ return this.add(maybeFn(this.ctxFor(this.mergedLinkStaged(dir, label), this.linkTargetOf(label))), into, true, n => this.known(n) || n in into);
86
+ }
87
+ bindFor(actionOrDir, labelOrFn, maybeFn) {
88
+ if (maybeFn === undefined) {
89
+ const action = actionOrDir;
90
+ return this.add(labelOrFn(this.ctxFor(this.mergedStaged(action))), this.binds, true, n => this.known(n));
91
+ }
92
+ const [dir, label] = [actionOrDir, labelOrFn];
93
+ return this.add(maybeFn(this.ctxFor(this.mergedLinkStaged(dir, label), this.linkTargetOf(label))), this.binds, true, n => this.known(n));
94
+ }
95
+ allow(input) {
96
+ const block = typeof input === 'function' ? input(this.ctxFor(this.commonStaged)) : input;
97
+ for (const action of ACTIONS) {
98
+ if (block[action] !== undefined)
99
+ this.allowOut[action] = resolveRule(block[action], this.ctxFor(this.mergedStaged(action)));
100
+ }
101
+ for (const dir of ['link', 'unlink']) {
102
+ const labels = block[dir];
103
+ if (!labels)
104
+ continue;
105
+ const map = this.allowOut[dir] ?? {};
106
+ for (const [label, rule] of Object.entries(labels)) {
107
+ if (rule !== undefined) {
108
+ const ctx = this.ctxFor(this.mergedLinkStaged(dir, label), this.linkTargetOf(label));
109
+ map[label] = resolveRule(rule, ctx);
110
+ }
111
+ }
112
+ this.allowOut[dir] = map;
113
+ }
114
+ return this;
115
+ }
116
+ fields(input) {
117
+ const ctx = this.ctxFor(this.commonStaged);
118
+ const block = typeof input === 'function' ? input(ctx) : input;
119
+ for (const [field, rule] of Object.entries(block)) {
120
+ if (rule !== undefined)
121
+ this.fieldsOut[field] = resolveRule(rule, ctx);
122
+ }
123
+ return this;
124
+ }
125
+ /** The compiled namespace block. */
126
+ block() {
127
+ const out = { allow: this.allowOut };
128
+ const bind = renderBinds(this.binds);
129
+ if (Object.keys(bind).length)
130
+ out.bind = bind;
131
+ if (Object.keys(this.fieldsOut).length)
132
+ out.fields = this.fieldsOut;
133
+ return out;
134
+ }
135
+ }
136
+ // ==========
137
+ // defaults builder
138
+ class DefaultsRuntime {
139
+ staged = {};
140
+ binds = {};
141
+ allowOut = {};
142
+ ctx() {
143
+ // The default context is namespace-loose; the type layer narrows it.
144
+ return makeContext({ staged: this.staged, binds: this.binds }, noValidate);
145
+ }
146
+ known(name) {
147
+ return name in this.staged || name in this.binds;
148
+ }
149
+ collect(fn, into) {
150
+ for (const [name, node] of Object.entries(fn(this.ctx()))) {
151
+ if (this.known(name))
152
+ throw new Error(`QERR_PERMS_DUPLICATE_NAME: '${name}' is already defined in defaults — use .overrideStage/.overrideBind`);
153
+ into[name] = node;
154
+ }
155
+ return this;
156
+ }
157
+ stage(fn) {
158
+ return this.collect(fn, this.staged);
159
+ }
160
+ bind(fn) {
161
+ return this.collect(fn, this.binds);
162
+ }
163
+ allow(input) {
164
+ const ctx = this.ctx();
165
+ const block = typeof input === 'function' ? input(ctx) : input;
166
+ for (const key of ['$default', ...ACTIONS]) {
167
+ if (block[key] !== undefined)
168
+ this.allowOut[key] = resolveRule(block[key], ctx);
169
+ }
170
+ return this;
171
+ }
172
+ }
173
+ // ==========
174
+ // attrs builder
175
+ class AttrsRuntime {
176
+ schema;
177
+ out = {};
178
+ constructor(schema) {
179
+ this.schema = schema;
180
+ }
181
+ allow(input) {
182
+ const ctx = makeContext({ staged: {}, binds: {} }, noValidate);
183
+ const block = typeof input === 'function' ? input(ctx) : input;
184
+ if (block.create !== undefined)
185
+ this.out.create = resolveRule(block.create, ctx);
186
+ return this;
187
+ }
188
+ }
189
+ // ==========
190
+ // the top-level builder
191
+ class PermsRuntime {
192
+ schema;
193
+ defaultStaged = {};
194
+ defaultBinds = {};
195
+ defaultAllow;
196
+ hasDefaults = false;
197
+ attrsOut;
198
+ rateLimitsConfig;
199
+ nsBuilders = {};
200
+ constructor(schema) {
201
+ this.schema = schema;
202
+ }
203
+ attrs(fn) {
204
+ const a = new AttrsRuntime(this.schema);
205
+ fn(a);
206
+ this.attrsOut = a.out;
207
+ return this;
208
+ }
209
+ defaults(fn) {
210
+ const d = new DefaultsRuntime();
211
+ fn(d);
212
+ this.hasDefaults = true;
213
+ this.defaultStaged = d.staged;
214
+ this.defaultBinds = d.binds;
215
+ this.defaultAllow = d.allowOut;
216
+ return this;
217
+ }
218
+ rateLimits(config) {
219
+ this.rateLimitsConfig = config;
220
+ return this;
221
+ }
222
+ namespaces(map) {
223
+ const defaultBindNames = Object.keys(this.defaultBinds);
224
+ for (const [ns, build] of Object.entries(map)) {
225
+ if (this.schema && !namespaceExists(this.schema, ns))
226
+ throw new Error(`QERR_PERMS_SCHEMA: '${ns}' is not a namespace in the schema`);
227
+ const nsb = new NamespaceRuntime(this.schema, ns, this.defaultStaged, defaultBindNames);
228
+ build(nsb);
229
+ this.nsBuilders[ns] = nsb;
230
+ }
231
+ return this;
232
+ }
233
+ compile() {
234
+ const out = {};
235
+ if (this.attrsOut) {
236
+ out.attrs = {
237
+ allow: this.attrsOut.create !== undefined ? { create: this.attrsOut.create } : {},
238
+ };
239
+ }
240
+ if (this.hasDefaults) {
241
+ const block = { allow: this.defaultAllow ?? {} };
242
+ const bind = renderBinds(this.defaultBinds);
243
+ if (Object.keys(bind).length)
244
+ block.bind = bind;
245
+ out.$default = block;
246
+ }
247
+ if (this.rateLimitsConfig)
248
+ out.$rateLimits = this.rateLimitsConfig;
249
+ for (const [ns, nsb] of Object.entries(this.nsBuilders))
250
+ out[ns] = nsb.block();
251
+ return out;
252
+ }
253
+ }
254
+ export function definePerms(schema) {
255
+ return new PermsRuntime(schema);
256
+ }
257
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../../src/perms/builder.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The builder runtime and the `.compile()` pipeline.\n *\n * The chainable builders accumulate authoring state (staged expressions, bind\n * aliases, allow/fields rules) and `.compile()` walks them into the plain\n * `IdbPerms` object — CEL strings under ordinary Instant keys. Creativity is in\n * the authoring surface; the output is exactly what Instant already accepts.\n *\n * Inheritance follows the backend (`server/.../rule.clj` `with-binds`):\n * `$default.bind` is concatenated into every namespace there, so dux emits an\n * inherited bind once under `$default.bind` and references it by bare alias —\n * never re-emitting it per namespace. Staged values are authoring-only and are\n * copied into each namespace's scope so `s.*` resolves.\n */\nimport type { InstantRules } from '@instantdb/core'\nimport type { IdbSchema } from '../schema/defineSchema.js'\nimport type { IdbRegisteredSchema } from '../schema/register.js'\nimport type { ExprNode } from './ast.js'\nimport type { IdbPermsRateLimits, PermsBuilder } from './types.js'\nimport { makeContext } from './context.js'\nimport { makeValidator, namespaceExists, noValidate } from './validate.js'\n\ntype RuleValue = boolean | ExprNode | ((ctx: any) => boolean | ExprNode)\ntype Ctx = any\n\n// ==========\n// resolution\n\nfunction asCel(value: boolean | ExprNode): string {\n return typeof value === 'boolean' ? String(value) : value.render()\n}\n\nfunction resolveRule(rule: RuleValue, ctx: Ctx): string {\n return asCel(typeof rule === 'function' ? rule(ctx) : rule)\n}\n\nfunction renderBinds(binds: Record<string, ExprNode>): Record<string, string> {\n return Object.fromEntries(\n Object.entries(binds).map(([name, node]) => [name, node.render()]),\n )\n}\n\nconst ACTIONS = ['view', 'create', 'update', 'delete'] as const\n\n// ==========\n// namespace builder\n\nclass NamespaceRuntime {\n /** Common staged values — inlined, inherited from defaults, merged into every action. */\n private readonly commonStaged: Record<string, ExprNode>\n /** All emitted bind aliases — common and action-specific share one block. */\n private readonly binds: Record<string, ExprNode> = {}\n /** Per-whole-entity-action staged values, visible only in that action. */\n private readonly actionStaged: Record<string, Record<string, ExprNode>> = {}\n /** Per-(dir, label) staged values, visible only in that link/unlink rule. */\n private readonly linkStaged: Record<string, Record<string, Record<string, ExprNode>>> = {}\n private readonly inheritedBindNames: Set<string>\n private allowOut: Record<string, any> = {}\n private fieldsOut: Record<string, string> = {}\n\n constructor(\n private readonly schema: IdbSchema | undefined,\n private readonly ns: string,\n defaultStaged: Record<string, ExprNode>,\n defaultBindNames: string[],\n ) {\n this.commonStaged = { ...defaultStaged }\n this.inheritedBindNames = new Set(defaultBindNames)\n }\n\n /** Is this name already a common staged value, an emitted bind, or inherited? */\n private known(name: string): boolean {\n return name in this.commonStaged || name in this.binds || this.inheritedBindNames.has(name)\n }\n\n private linkTargetOf(label: string): string | undefined {\n return this.schema?.entities[this.ns]?.links?.[label]?.entityName\n }\n\n /** Build a context over a staged snapshot, validating against ns (or a link target). */\n private ctxFor(staged: Record<string, ExprNode>, linkTarget?: string): Ctx {\n const validator = this.schema\n ? makeValidator(this.schema, this.ns, linkTarget)\n : noValidate\n return makeContext({ staged, binds: this.binds }, validator)\n }\n\n private mergedStaged(action: string): Record<string, ExprNode> {\n return { ...this.commonStaged, ...this.actionStaged[action] }\n }\n\n private mergedLinkStaged(dir: string, label: string): Record<string, ExprNode> {\n return { ...this.commonStaged, ...this.linkStaged[dir]?.[label] }\n }\n\n private add(\n produced: Record<string, ExprNode>,\n into: Record<string, ExprNode>,\n guard: boolean,\n seen: (name: string) => boolean,\n ): this {\n for (const [name, node] of Object.entries(produced)) {\n if (guard && seen(name))\n throw new Error(`QERR_PERMS_DUPLICATE_NAME: '${name}' is already defined on '${this.ns}' — use .overrideStage/.overrideBind`)\n into[name] = node\n }\n return this\n }\n\n stage(fn: (ctx: Ctx) => Record<string, ExprNode>) {\n return this.add(fn(this.ctxFor(this.commonStaged)), this.commonStaged, true, n => this.known(n))\n }\n\n overrideStage(fn: (ctx: Ctx) => Record<string, ExprNode>) {\n return this.add(fn(this.ctxFor(this.commonStaged)), this.commonStaged, false, () => false)\n }\n\n bind(fn: (ctx: Ctx) => Record<string, ExprNode>) {\n return this.add(fn(this.ctxFor(this.commonStaged)), this.binds, true, n => this.known(n))\n }\n\n overrideBind(fn: (ctx: Ctx) => Record<string, ExprNode>) {\n return this.add(fn(this.ctxFor(this.commonStaged)), this.binds, false, () => false)\n }\n\n stageFor(actionOrDir: string, labelOrFn: any, maybeFn?: any) {\n if (maybeFn === undefined) {\n const action = actionOrDir\n const into = (this.actionStaged[action] ??= {})\n return this.add(\n labelOrFn(this.ctxFor(this.mergedStaged(action))),\n into,\n true,\n n => this.known(n) || n in into,\n )\n }\n const [dir, label] = [actionOrDir, labelOrFn]\n const into = ((this.linkStaged[dir] ??= {})[label] ??= {})\n return this.add(\n maybeFn(this.ctxFor(this.mergedLinkStaged(dir, label), this.linkTargetOf(label))),\n into,\n true,\n n => this.known(n) || n in into,\n )\n }\n\n bindFor(actionOrDir: string, labelOrFn: any, maybeFn?: any) {\n if (maybeFn === undefined) {\n const action = actionOrDir\n return this.add(labelOrFn(this.ctxFor(this.mergedStaged(action))), this.binds, true, n => this.known(n))\n }\n const [dir, label] = [actionOrDir, labelOrFn]\n return this.add(\n maybeFn(this.ctxFor(this.mergedLinkStaged(dir, label), this.linkTargetOf(label))),\n this.binds,\n true,\n n => this.known(n),\n )\n }\n\n allow(input: any) {\n const block = typeof input === 'function' ? input(this.ctxFor(this.commonStaged)) : input\n for (const action of ACTIONS) {\n if (block[action] !== undefined)\n this.allowOut[action] = resolveRule(block[action], this.ctxFor(this.mergedStaged(action)))\n }\n for (const dir of ['link', 'unlink'] as const) {\n const labels = block[dir]\n if (!labels)\n continue\n const map: Record<string, string> = this.allowOut[dir] ?? {}\n for (const [label, rule] of Object.entries(labels)) {\n if (rule !== undefined) {\n const ctx = this.ctxFor(this.mergedLinkStaged(dir, label), this.linkTargetOf(label))\n map[label] = resolveRule(rule as RuleValue, ctx)\n }\n }\n this.allowOut[dir] = map\n }\n return this\n }\n\n fields(input: any) {\n const ctx = this.ctxFor(this.commonStaged)\n const block = typeof input === 'function' ? input(ctx) : input\n for (const [field, rule] of Object.entries(block)) {\n if (rule !== undefined)\n this.fieldsOut[field] = resolveRule(rule as RuleValue, ctx)\n }\n return this\n }\n\n /** The compiled namespace block. */\n block(): any {\n const out: any = { allow: this.allowOut }\n const bind = renderBinds(this.binds)\n if (Object.keys(bind).length)\n out.bind = bind\n if (Object.keys(this.fieldsOut).length)\n out.fields = this.fieldsOut\n return out\n }\n}\n\n// ==========\n// defaults builder\n\nclass DefaultsRuntime {\n readonly staged: Record<string, ExprNode> = {}\n readonly binds: Record<string, ExprNode> = {}\n allowOut: Record<string, any> = {}\n\n private ctx(): Ctx {\n // The default context is namespace-loose; the type layer narrows it.\n return makeContext({ staged: this.staged, binds: this.binds }, noValidate)\n }\n\n private known(name: string): boolean {\n return name in this.staged || name in this.binds\n }\n\n private collect(fn: (ctx: Ctx) => Record<string, ExprNode>, into: Record<string, ExprNode>) {\n for (const [name, node] of Object.entries(fn(this.ctx()))) {\n if (this.known(name))\n throw new Error(`QERR_PERMS_DUPLICATE_NAME: '${name}' is already defined in defaults — use .overrideStage/.overrideBind`)\n into[name] = node\n }\n return this\n }\n\n stage(fn: (ctx: Ctx) => Record<string, ExprNode>) {\n return this.collect(fn, this.staged)\n }\n\n bind(fn: (ctx: Ctx) => Record<string, ExprNode>) {\n return this.collect(fn, this.binds)\n }\n\n allow(input: any) {\n const ctx = this.ctx()\n const block = typeof input === 'function' ? input(ctx) : input\n for (const key of ['$default', ...ACTIONS]) {\n if (block[key] !== undefined)\n this.allowOut[key] = resolveRule(block[key], ctx)\n }\n return this\n }\n}\n\n// ==========\n// attrs builder\n\nclass AttrsRuntime {\n out: { create?: string } = {}\n\n constructor(private readonly schema: IdbSchema | undefined) {}\n\n allow(input: any) {\n const ctx = makeContext({ staged: {}, binds: {} }, noValidate)\n const block = typeof input === 'function' ? input(ctx) : input\n if (block.create !== undefined)\n this.out.create = resolveRule(block.create, ctx)\n return this\n }\n}\n\n// ==========\n// the top-level builder\n\nclass PermsRuntime {\n private defaultStaged: Record<string, ExprNode> = {}\n private defaultBinds: Record<string, ExprNode> = {}\n private defaultAllow: Record<string, any> | undefined\n private hasDefaults = false\n private attrsOut: { create?: string } | undefined\n private rateLimitsConfig: IdbPermsRateLimits | undefined\n private nsBuilders: Record<string, NamespaceRuntime> = {}\n\n constructor(private readonly schema?: IdbSchema) {}\n\n attrs(fn: (a: AttrsRuntime) => AttrsRuntime) {\n const a = new AttrsRuntime(this.schema)\n fn(a)\n this.attrsOut = a.out\n return this\n }\n\n defaults(fn: (d: DefaultsRuntime) => DefaultsRuntime) {\n const d = new DefaultsRuntime()\n fn(d)\n this.hasDefaults = true\n this.defaultStaged = d.staged\n this.defaultBinds = d.binds\n this.defaultAllow = d.allowOut\n return this\n }\n\n rateLimits(config: IdbPermsRateLimits) {\n this.rateLimitsConfig = config\n return this\n }\n\n namespaces(map: Record<string, (ns: NamespaceRuntime) => NamespaceRuntime>) {\n const defaultBindNames = Object.keys(this.defaultBinds)\n for (const [ns, build] of Object.entries(map)) {\n if (this.schema && !namespaceExists(this.schema, ns))\n throw new Error(`QERR_PERMS_SCHEMA: '${ns}' is not a namespace in the schema`)\n const nsb = new NamespaceRuntime(this.schema, ns, this.defaultStaged, defaultBindNames)\n build(nsb)\n this.nsBuilders[ns] = nsb\n }\n return this\n }\n\n compile(): InstantRules<any> {\n const out: Record<string, any> = {}\n\n if (this.attrsOut) {\n out.attrs = {\n allow: this.attrsOut.create !== undefined ? { create: this.attrsOut.create } : {},\n }\n }\n\n if (this.hasDefaults) {\n const block: any = { allow: this.defaultAllow ?? {} }\n const bind = renderBinds(this.defaultBinds)\n if (Object.keys(bind).length)\n block.bind = bind\n out.$default = block\n }\n\n if (this.rateLimitsConfig)\n out.$rateLimits = this.rateLimitsConfig\n\n for (const [ns, nsb] of Object.entries(this.nsBuilders))\n out[ns] = nsb.block()\n\n return out as InstantRules<any>\n }\n}\n\n// ==========\n// definePerms\n\n/**\n * The typed permissions authoring entry. With the schema registered, no\n * argument is needed; pass the schema value to add runtime validation; pass an\n * explicit type param for a different schema (spec §2).\n *\n * @example\n * export default definePerms(schema)\n * .namespaces({\n * tasks: ns => ns.allow({ view: true }),\n * })\n * .compile()\n */\nexport function definePerms<S extends IdbSchema>(schema: S): PermsBuilder<S>\nexport function definePerms<S extends IdbSchema = IdbRegisteredSchema>(): PermsBuilder<S>\nexport function definePerms(schema?: IdbSchema): PermsBuilder<any> {\n return new PermsRuntime(schema) as unknown as PermsBuilder<any>\n}\n"]}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * The runtime context — the object every authoring callback receives.
3
+ *
4
+ * One full context is built and handed to every callback; the *types* (in
5
+ * `types.ts`) decide which helpers are visible where, so an action-only helper
6
+ * (`eu`, `el`) simply isn't in scope outside its action. At runtime each helper
7
+ * is a thin factory over the CEL globals the backend installs: `auth`, `data`,
8
+ * `newData`, `linkedData`, `ruleParams`, `request`, `rateLimit`.
9
+ *
10
+ * `s` (staged) inlines the stored expression; `b` (bindings) renders the bare
11
+ * alias the backend resolves from the emitted `bind` block.
12
+ */
13
+ import type { ExprNode } from './ast.js';
14
+ import type { Validator } from './validate.js';
15
+ /** The mutable state a namespace/defaults builder threads into its callbacks. */
16
+ export interface ContextState {
17
+ /** Staged name → its inlined expression. */
18
+ staged: Record<string, ExprNode>;
19
+ /** Bound name → its emitted expression (the alias renders bare). */
20
+ binds: Record<string, ExprNode>;
21
+ }
22
+ /**
23
+ * Build the full context. The same object serves common, write, update,
24
+ * link/unlink, default, and attrs callbacks — types gate visibility.
25
+ */
26
+ export declare function makeContext(state: ContextState, v?: Validator): any;
27
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/perms/context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAI9C,iFAAiF;AACjF,MAAM,WAAW,YAAY;IAC3B,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IAChC,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;CAChC;AAyDD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC,GAAE,SAAsB,GAAG,GAAG,CAkC/E"}
@@ -0,0 +1,93 @@
1
+ import { atom, coerce, raw as rawNode } from './ast.js';
2
+ import { noValidate } from './validate.js';
3
+ /** Property access over a CEL root: `entityProxy('data').title` → `data.title`. */
4
+ function entityProxy(root, check) {
5
+ return new Proxy({}, {
6
+ get: (_t, key) => {
7
+ check?.(key);
8
+ return atom(`${root}.${key}`);
9
+ },
10
+ });
11
+ }
12
+ /** `data.ref(...)` / `auth.ref(...)` / `linkedData.ref(...)` — always a list. */
13
+ function refFn(root, check) {
14
+ return (path) => {
15
+ check?.(path);
16
+ return atom(`${root}.ref('${path}')`);
17
+ };
18
+ }
19
+ /** Functional composition helpers (`f` / `ops`). */
20
+ function makeFns() {
21
+ const fold = (op, empty) => (...exprs) => {
22
+ if (exprs.length === 0)
23
+ return atom(empty);
24
+ return exprs.map(coerce).reduce((acc, next) => acc[op](next));
25
+ };
26
+ return {
27
+ and: fold('and', 'true'),
28
+ or: fold('or', 'false'),
29
+ not: (expr) => coerce(expr).not(),
30
+ eq: (a, b) => coerce(a).eq(b),
31
+ neq: (a, b) => coerce(a).neq(b),
32
+ gt: (a, b) => coerce(a).gt(b),
33
+ gte: (a, b) => coerce(a).gte(b),
34
+ lt: (a, b) => coerce(a).lt(b),
35
+ lte: (a, b) => coerce(a).lte(b),
36
+ in: (item, list) => coerce(item).in(list),
37
+ contains: (list, item) => coerce(list).contains(item),
38
+ size: (value) => coerce(value).size(),
39
+ list: (...values) => atom(`[${values.map(v => coerce(v).cel).join(', ')}]`),
40
+ str: (value) => coerce(value),
41
+ num: (value) => coerce(value),
42
+ bool: (value) => coerce(value),
43
+ null: () => atom('null'),
44
+ };
45
+ }
46
+ /** Buckets resolve lazily: `rl.createTask.limit(auth.id)` → `rateLimit.createTask.limit(...)`. */
47
+ function rateLimitProxy() {
48
+ return new Proxy({}, {
49
+ get: (_t, bucket) => ({
50
+ limit: (key) => atom(`rateLimit.${bucket}.limit(${coerce(key).cel})`),
51
+ }),
52
+ });
53
+ }
54
+ /**
55
+ * Build the full context. The same object serves common, write, update,
56
+ * link/unlink, default, and attrs callbacks — types gate visibility.
57
+ */
58
+ export function makeContext(state, v = noValidate) {
59
+ const fns = makeFns();
60
+ return {
61
+ auth: entityProxy('auth'),
62
+ ar: refFn('auth', v.authRef),
63
+ e: entityProxy('data', v.field),
64
+ ef: (key) => {
65
+ v.field(key);
66
+ return atom(`data.${key}`);
67
+ },
68
+ er: refFn('data', v.ref),
69
+ rp: (key) => {
70
+ v.ruleParam(key);
71
+ return atom(`ruleParams.${key}`);
72
+ },
73
+ req: entityProxy('request'),
74
+ eu: entityProxy('newData', v.field),
75
+ euf: (key) => {
76
+ v.field(key);
77
+ return atom(`newData.${key}`);
78
+ },
79
+ el: entityProxy('linkedData', v.linkedField),
80
+ elf: (key) => {
81
+ v.linkedField(key);
82
+ return atom(`linkedData.${key}`);
83
+ },
84
+ elr: refFn('linkedData', v.linkedRef),
85
+ f: fns,
86
+ ops: fns,
87
+ raw: (cel) => rawNode(cel),
88
+ rl: rateLimitProxy(),
89
+ s: state.staged,
90
+ b: new Proxy({}, { get: (_t, name) => atom(name) }),
91
+ };
92
+ }
93
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/perms/context.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The runtime context — the object every authoring callback receives.\n *\n * One full context is built and handed to every callback; the *types* (in\n * `types.ts`) decide which helpers are visible where, so an action-only helper\n * (`eu`, `el`) simply isn't in scope outside its action. At runtime each helper\n * is a thin factory over the CEL globals the backend installs: `auth`, `data`,\n * `newData`, `linkedData`, `ruleParams`, `request`, `rateLimit`.\n *\n * `s` (staged) inlines the stored expression; `b` (bindings) renders the bare\n * alias the backend resolves from the emitted `bind` block.\n */\nimport type { ExprNode } from './ast.js'\nimport type { Validator } from './validate.js'\nimport { atom, coerce, raw as rawNode } from './ast.js'\nimport { noValidate } from './validate.js'\n\n/** The mutable state a namespace/defaults builder threads into its callbacks. */\nexport interface ContextState {\n /** Staged name → its inlined expression. */\n staged: Record<string, ExprNode>\n /** Bound name → its emitted expression (the alias renders bare). */\n binds: Record<string, ExprNode>\n}\n\n/** Property access over a CEL root: `entityProxy('data').title` → `data.title`. */\nfunction entityProxy(root: string, check?: (key: string) => void): any {\n return new Proxy({}, {\n get: (_t, key: string) => {\n check?.(key)\n return atom(`${root}.${key}`)\n },\n })\n}\n\n/** `data.ref(...)` / `auth.ref(...)` / `linkedData.ref(...)` — always a list. */\nfunction refFn(root: string, check?: (path: string) => void) {\n return (path: string) => {\n check?.(path)\n return atom(`${root}.ref('${path}')`)\n }\n}\n\n/** Functional composition helpers (`f` / `ops`). */\nfunction makeFns() {\n const fold = (op: 'and' | 'or', empty: string) => (...exprs: unknown[]): ExprNode => {\n if (exprs.length === 0)\n return atom(empty)\n return exprs.map(coerce).reduce((acc, next) => acc[op](next))\n }\n return {\n and: fold('and', 'true'),\n or: fold('or', 'false'),\n not: (expr: unknown) => coerce(expr).not(),\n eq: (a: unknown, b: unknown) => coerce(a).eq(b),\n neq: (a: unknown, b: unknown) => coerce(a).neq(b),\n gt: (a: unknown, b: unknown) => coerce(a).gt(b),\n gte: (a: unknown, b: unknown) => coerce(a).gte(b),\n lt: (a: unknown, b: unknown) => coerce(a).lt(b),\n lte: (a: unknown, b: unknown) => coerce(a).lte(b),\n in: (item: unknown, list: unknown) => coerce(item).in(list as any),\n contains: (list: unknown, item: unknown) => coerce(list).contains(item),\n size: (value: unknown) => coerce(value).size(),\n list: (...values: unknown[]) => atom(`[${values.map(v => coerce(v).cel).join(', ')}]`),\n str: (value: unknown) => coerce(value),\n num: (value: unknown) => coerce(value),\n bool: (value: unknown) => coerce(value),\n null: () => atom('null'),\n }\n}\n\n/** Buckets resolve lazily: `rl.createTask.limit(auth.id)` → `rateLimit.createTask.limit(...)`. */\nfunction rateLimitProxy(): any {\n return new Proxy({}, {\n get: (_t, bucket: string) => ({\n limit: (key: unknown) => atom(`rateLimit.${bucket}.limit(${coerce(key).cel})`),\n }),\n })\n}\n\n/**\n * Build the full context. The same object serves common, write, update,\n * link/unlink, default, and attrs callbacks — types gate visibility.\n */\nexport function makeContext(state: ContextState, v: Validator = noValidate): any {\n const fns = makeFns()\n return {\n auth: entityProxy('auth'),\n ar: refFn('auth', v.authRef),\n e: entityProxy('data', v.field),\n ef: (key: string) => {\n v.field(key)\n return atom(`data.${key}`)\n },\n er: refFn('data', v.ref),\n rp: (key: string) => {\n v.ruleParam(key)\n return atom(`ruleParams.${key}`)\n },\n req: entityProxy('request'),\n eu: entityProxy('newData', v.field),\n euf: (key: string) => {\n v.field(key)\n return atom(`newData.${key}`)\n },\n el: entityProxy('linkedData', v.linkedField),\n elf: (key: string) => {\n v.linkedField(key)\n return atom(`linkedData.${key}`)\n },\n elr: refFn('linkedData', v.linkedRef),\n f: fns,\n ops: fns,\n raw: (cel: string) => rawNode(cel),\n rl: rateLimitProxy(),\n s: state.staged,\n b: new Proxy({}, { get: (_t, name: string) => atom(name) }),\n }\n}\n"]}