@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 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/nuxt/types.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * The `/nuxt` public types — the kit config and the mode-narrowed kit shapes.\n * `/nuxt` owns no data-plane or verification types of its own; everything it\n * returns comes from the `/admin` and `/webhooks` layers it composes.\n */\nimport type { H3Event } from 'h3'\nimport type { IdbAdminClient, IdbAuthUser } from '../admin/index.js'\nimport type { IdbSchema } from '../schema/defineSchema.js'\nimport type { IdbRegisteredSchema } from '../schema/register.js'\n\n/** `defineServerKit` config — the schema plus lazy, event-scoped credential reads. */\nexport interface IdbServerKitConfig<S extends IdbSchema = IdbRegisteredSchema> {\n /** Your registered schema — unlocks shaping and typed `ruleParams`. */\n schema: S\n /** Resolve the app id from the event (runtime config, env indirection, …). */\n getAppId: (event: H3Event) => string\n /** Resolve the admin token from the event. */\n getAdminToken: (event: H3Event) => string\n /** Base URL for the Instant API (self-hosting). */\n apiURI?: string\n}\n\n/**\n * How strict the kit is about auth, declared at the call site. The kit's keys\n * follow the mode, so there is no manual narrowing or repeated 401 boilerplate.\n */\nexport type IdbServerKitMode = 'user?' | 'user' | 'userDb?' | 'userDb'\n\n/** The kit a given mode yields — keys typed per the declared strictness. */\nexport type IdbServerKit<Mode extends IdbServerKitMode | undefined, S extends IdbSchema>\n = Mode extends undefined\n ? { adminDb: IdbAdminClient<S> }\n : Mode extends 'user'\n ? { adminDb: IdbAdminClient<S>, user: IdbAuthUser }\n : Mode extends 'user?'\n ? { adminDb: IdbAdminClient<S>, user: IdbAuthUser | undefined }\n : Mode extends 'userDb'\n ? { adminDb: IdbAdminClient<S>, user: IdbAuthUser, userDb: IdbAdminClient<S> }\n : { adminDb: IdbAdminClient<S>, user: IdbAuthUser | undefined, userDb: IdbAdminClient<S> | undefined }\n\n/** The request-kit factory `defineServerKit` returns. */\nexport interface IdbServerKitFactory<S extends IdbSchema> {\n (event: H3Event): Promise<IdbServerKit<undefined, S>>\n <Mode extends IdbServerKitMode>(event: H3Event, mode: Mode): Promise<IdbServerKit<Mode, S>>\n}\n\n/** `defineAuthSyncHandler` config — the app id read from the event. */\nexport interface IdbAuthSyncConfig {\n /** Resolve the app id from the event (must match the client's app id). */\n getAppId: (event: H3Event) => string\n}\n"]}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }
@@ -0,0 +1,98 @@
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
+ /** A value position accepts a raw literal or another expression of that type. */
16
+ export type ExprArg<T> = T | Expr<T>;
17
+ /**
18
+ * A scalar CEL expression. `and`/`or`/`not` return a boolean expression so
19
+ * fluent chains read subject-first (`b.isMember.and(b.isSignedIn)`); the
20
+ * string methods are available everywhere but only meaningful on strings.
21
+ */
22
+ export interface Expr<T = unknown> {
23
+ eq: (value: ExprArg<T> | null) => Expr<boolean>;
24
+ neq: (value: ExprArg<T> | null) => Expr<boolean>;
25
+ gt: (value: ExprArg<T>) => Expr<boolean>;
26
+ gte: (value: ExprArg<T>) => Expr<boolean>;
27
+ lt: (value: ExprArg<T>) => Expr<boolean>;
28
+ lte: (value: ExprArg<T>) => Expr<boolean>;
29
+ in: (list: readonly ExprArg<T>[]) => Expr<boolean>;
30
+ and: (other: ExprArg<boolean>) => Expr<boolean>;
31
+ or: (other: ExprArg<boolean>) => Expr<boolean>;
32
+ not: () => Expr<boolean>;
33
+ startsWith: (value: ExprArg<string>) => Expr<boolean>;
34
+ endsWith: (value: ExprArg<string>) => Expr<boolean>;
35
+ includes: (value: ExprArg<string>) => Expr<boolean>;
36
+ matches: (value: ExprArg<string>) => Expr<boolean>;
37
+ render: () => string;
38
+ }
39
+ /** The element view of a list — a JSON-array terminal yields a nested list. */
40
+ export type ItemExpr<T> = T extends readonly (infer E)[] ? ListExpr<E> : Expr<T>;
41
+ /**
42
+ * A list-valued CEL expression — what every ref helper (`er`/`ar`/`elr`) and
43
+ * `request.modifiedFields` return. `.some`/`.every` compile to CEL's
44
+ * `.exists`/`.all` macros.
45
+ */
46
+ export interface ListExpr<T = unknown> {
47
+ contains: (value: ExprArg<T>) => Expr<boolean>;
48
+ isEmpty: () => Expr<boolean>;
49
+ isNonEmpty: () => Expr<boolean>;
50
+ size: () => Expr<number>;
51
+ at: (index: number) => ItemExpr<T>;
52
+ some: (fn: (item: ItemExpr<T>) => Expr<boolean>) => Expr<boolean>;
53
+ every: (fn: (item: ItemExpr<T>) => Expr<boolean>) => Expr<boolean>;
54
+ render: () => string;
55
+ }
56
+ declare const BRAND: unique symbol;
57
+ /** The one runtime node behind both `Expr` and `ListExpr`. */
58
+ export declare class ExprNode {
59
+ readonly cel: string;
60
+ readonly prec: number;
61
+ readonly [BRAND] = true;
62
+ constructor(cel: string, prec: number);
63
+ render(): string;
64
+ private op;
65
+ eq(value: unknown): ExprNode;
66
+ neq(value: unknown): ExprNode;
67
+ gt(value: unknown): ExprNode;
68
+ gte(value: unknown): ExprNode;
69
+ lt(value: unknown): ExprNode;
70
+ lte(value: unknown): ExprNode;
71
+ in(list: unknown): ExprNode;
72
+ and(other: unknown): ExprNode;
73
+ or(other: unknown): ExprNode;
74
+ not(): ExprNode;
75
+ private method;
76
+ startsWith(value: unknown): ExprNode;
77
+ endsWith(value: unknown): ExprNode;
78
+ includes(value: unknown): ExprNode;
79
+ matches(value: unknown): ExprNode;
80
+ contains(value: unknown): ExprNode;
81
+ isEmpty(): ExprNode;
82
+ isNonEmpty(): ExprNode;
83
+ size(): ExprNode;
84
+ at(index: number): ExprNode;
85
+ some(fn: (item: any) => Expr<boolean>): ExprNode;
86
+ every(fn: (item: any) => Expr<boolean>): ExprNode;
87
+ private macro;
88
+ }
89
+ /** Is this an expression node (vs a raw literal value)? */
90
+ export declare function isExprNode(value: unknown): value is ExprNode;
91
+ /** Pass an expression through; turn anything else into an atom literal node. */
92
+ export declare function coerce(value: unknown): ExprNode;
93
+ /** A bare CEL atom — identifiers, property/field access, calls. */
94
+ export declare function atom(cel: string): ExprNode;
95
+ /** A raw, user-authored CEL string — always wrapped when composed. */
96
+ export declare function raw(cel: string): ExprNode;
97
+ export {};
98
+ //# sourceMappingURL=ast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../../../src/perms/ast.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ /**
3
+ * The expression layer: immutable, phantom-typed nodes that render to CEL.
4
+ *
5
+ * Every authoring helper (`e.title.eq('x')`, `er(...).contains(auth.id)`,
6
+ * `f.or(...)`) builds one of these nodes; `.compile()` walks the tree and
7
+ * emits the plain CEL strings Instant already accepts. The phantom `T` carries
8
+ * the value type so fluent composition type-checks at the cursor; at runtime a
9
+ * node is just a rendered string plus a precedence, so parentheses are added
10
+ * deterministically and only where CEL precedence requires them.
11
+ *
12
+ * The renderer targets the exact bindings the backend installs
13
+ * (`server/src/instant/db/cel.clj`): `auth`, `data`, `newData`, `linkedData`,
14
+ * `ruleParams`, `request`, `rateLimit`.
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.ExprNode = void 0;
18
+ exports.isExprNode = isExprNode;
19
+ exports.coerce = coerce;
20
+ exports.atom = atom;
21
+ exports.raw = raw;
22
+ // ==========
23
+ // precedence
24
+ /**
25
+ * CEL operator precedence, low to high. A child operand is parenthesized only
26
+ * when its precedence is lower than its parent's — minimal, correct, stable.
27
+ * `raw` sits below everything so any composition around it is always wrapped.
28
+ */
29
+ const RAW = 0;
30
+ const OR = 1;
31
+ const AND = 2;
32
+ const NOT = 3;
33
+ const CMP = 4;
34
+ const ATOM = 5;
35
+ // ==========
36
+ // the node
37
+ const BRAND = Symbol('idb-perms-expr');
38
+ /** The one runtime node behind both `Expr` and `ListExpr`. */
39
+ class ExprNode {
40
+ cel;
41
+ prec;
42
+ [BRAND] = true;
43
+ constructor(cel, prec) {
44
+ this.cel = cel;
45
+ this.prec = prec;
46
+ }
47
+ render() {
48
+ return this.cel;
49
+ }
50
+ op(operator, value, prec) {
51
+ const right = coerce(value);
52
+ return new ExprNode(`${wrap(this, prec)} ${operator} ${wrap(right, prec)}`, prec);
53
+ }
54
+ eq(value) { return this.op('==', value, CMP); }
55
+ neq(value) { return this.op('!=', value, CMP); }
56
+ gt(value) { return this.op('>', value, CMP); }
57
+ gte(value) { return this.op('>=', value, CMP); }
58
+ lt(value) { return this.op('<', value, CMP); }
59
+ lte(value) { return this.op('<=', value, CMP); }
60
+ in(list) { return this.op('in', list, CMP); }
61
+ and(other) { return this.op('&&', other, AND); }
62
+ or(other) { return this.op('||', other, OR); }
63
+ not() {
64
+ return new ExprNode(`!${this.prec < ATOM ? `(${this.cel})` : this.cel}`, NOT);
65
+ }
66
+ method(name, value) {
67
+ return new ExprNode(`${wrap(this, ATOM)}.${name}(${coerce(value).cel})`, ATOM);
68
+ }
69
+ startsWith(value) { return this.method('startsWith', value); }
70
+ endsWith(value) { return this.method('endsWith', value); }
71
+ // CEL spells substring containment `string.contains`.
72
+ includes(value) { return this.method('contains', value); }
73
+ matches(value) { return this.method('matches', value); }
74
+ // ----- list methods
75
+ contains(value) {
76
+ // `value in list` — the membership test the backend optimizes for refs.
77
+ return new ExprNode(`${coerce(value).cel} in ${wrap(this, CMP)}`, CMP);
78
+ }
79
+ isEmpty() { return new ExprNode(`${wrap(this, CMP)} == []`, CMP); }
80
+ isNonEmpty() { return new ExprNode(`${wrap(this, CMP)} != []`, CMP); }
81
+ size() { return new ExprNode(`size(${this.cel})`, ATOM); }
82
+ at(index) { return new ExprNode(`${wrap(this, ATOM)}[${index}]`, ATOM); }
83
+ some(fn) { return this.macro('exists', fn); }
84
+ every(fn) { return this.macro('all', fn); }
85
+ macro(name, fn) {
86
+ const variable = bindVarName(fn);
87
+ const body = fn(new ExprNode(variable, ATOM));
88
+ return new ExprNode(`${wrap(this, ATOM)}.${name}(${variable}, ${body.render()})`, ATOM);
89
+ }
90
+ }
91
+ exports.ExprNode = ExprNode;
92
+ function wrap(node, parentPrec) {
93
+ return node.prec < parentPrec ? `(${node.cel})` : node.cel;
94
+ }
95
+ /** Is this an expression node (vs a raw literal value)? */
96
+ function isExprNode(value) {
97
+ return typeof value === 'object' && value !== null && BRAND in value;
98
+ }
99
+ // ==========
100
+ // literals
101
+ /** Single-quote a CEL string literal, escaping the characters CEL cares about. */
102
+ function quote(value) {
103
+ const escaped = value
104
+ .replace(/\\/g, '\\\\')
105
+ .replace(/'/g, '\\\'')
106
+ .replace(/\n/g, '\\n')
107
+ .replace(/\r/g, '\\r')
108
+ .replace(/\t/g, '\\t');
109
+ return `'${escaped}'`;
110
+ }
111
+ /** Render a JS literal as a CEL atom. */
112
+ function literal(value) {
113
+ if (value === null || value === undefined)
114
+ return 'null';
115
+ if (typeof value === 'string')
116
+ return quote(value);
117
+ if (typeof value === 'number' || typeof value === 'boolean')
118
+ return String(value);
119
+ if (value instanceof Date)
120
+ return String(value.getTime());
121
+ if (Array.isArray(value))
122
+ return `[${value.map(literal).join(', ')}]`;
123
+ throw new TypeError(`Cannot render ${typeof value} as a CEL literal`);
124
+ }
125
+ /** Pass an expression through; turn anything else into an atom literal node. */
126
+ function coerce(value) {
127
+ return isExprNode(value) ? value : new ExprNode(literal(value), ATOM);
128
+ }
129
+ // ==========
130
+ // node factories (used by the context helpers)
131
+ /** A bare CEL atom — identifiers, property/field access, calls. */
132
+ function atom(cel) {
133
+ return new ExprNode(cel, ATOM);
134
+ }
135
+ /** A raw, user-authored CEL string — always wrapped when composed. */
136
+ function raw(cel) {
137
+ return new ExprNode(cel, RAW);
138
+ }
139
+ /**
140
+ * Recover the macro variable name from the callback's source so the emitted
141
+ * CEL reads naturally (`.exists(types, 'admin' in types)`); falls back to
142
+ * `item` when the source can't be parsed.
143
+ */
144
+ function bindVarName(fn) {
145
+ const match = /^[\s(]*([A-Z_$][\w$]*)/i.exec(fn.toString());
146
+ return match?.[1] ?? 'item';
147
+ }
148
+ //# sourceMappingURL=ast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast.js","sourceRoot":"","sources":["../../../src/perms/ast.ts"],"names":[],"mappings":"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","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,260 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.definePerms = definePerms;
4
+ const context_js_1 = require("./context.js");
5
+ const validate_js_1 = require("./validate.js");
6
+ // ==========
7
+ // resolution
8
+ function asCel(value) {
9
+ return typeof value === 'boolean' ? String(value) : value.render();
10
+ }
11
+ function resolveRule(rule, ctx) {
12
+ return asCel(typeof rule === 'function' ? rule(ctx) : rule);
13
+ }
14
+ function renderBinds(binds) {
15
+ return Object.fromEntries(Object.entries(binds).map(([name, node]) => [name, node.render()]));
16
+ }
17
+ const ACTIONS = ['view', 'create', 'update', 'delete'];
18
+ // ==========
19
+ // namespace builder
20
+ class NamespaceRuntime {
21
+ schema;
22
+ ns;
23
+ /** Common staged values — inlined, inherited from defaults, merged into every action. */
24
+ commonStaged;
25
+ /** All emitted bind aliases — common and action-specific share one block. */
26
+ binds = {};
27
+ /** Per-whole-entity-action staged values, visible only in that action. */
28
+ actionStaged = {};
29
+ /** Per-(dir, label) staged values, visible only in that link/unlink rule. */
30
+ linkStaged = {};
31
+ inheritedBindNames;
32
+ allowOut = {};
33
+ fieldsOut = {};
34
+ constructor(schema, ns, defaultStaged, defaultBindNames) {
35
+ this.schema = schema;
36
+ this.ns = ns;
37
+ this.commonStaged = { ...defaultStaged };
38
+ this.inheritedBindNames = new Set(defaultBindNames);
39
+ }
40
+ /** Is this name already a common staged value, an emitted bind, or inherited? */
41
+ known(name) {
42
+ return name in this.commonStaged || name in this.binds || this.inheritedBindNames.has(name);
43
+ }
44
+ linkTargetOf(label) {
45
+ return this.schema?.entities[this.ns]?.links?.[label]?.entityName;
46
+ }
47
+ /** Build a context over a staged snapshot, validating against ns (or a link target). */
48
+ ctxFor(staged, linkTarget) {
49
+ const validator = this.schema
50
+ ? (0, validate_js_1.makeValidator)(this.schema, this.ns, linkTarget)
51
+ : validate_js_1.noValidate;
52
+ return (0, context_js_1.makeContext)({ staged, binds: this.binds }, validator);
53
+ }
54
+ mergedStaged(action) {
55
+ return { ...this.commonStaged, ...this.actionStaged[action] };
56
+ }
57
+ mergedLinkStaged(dir, label) {
58
+ return { ...this.commonStaged, ...this.linkStaged[dir]?.[label] };
59
+ }
60
+ add(produced, into, guard, seen) {
61
+ for (const [name, node] of Object.entries(produced)) {
62
+ if (guard && seen(name))
63
+ throw new Error(`QERR_PERMS_DUPLICATE_NAME: '${name}' is already defined on '${this.ns}' — use .overrideStage/.overrideBind`);
64
+ into[name] = node;
65
+ }
66
+ return this;
67
+ }
68
+ stage(fn) {
69
+ return this.add(fn(this.ctxFor(this.commonStaged)), this.commonStaged, true, n => this.known(n));
70
+ }
71
+ overrideStage(fn) {
72
+ return this.add(fn(this.ctxFor(this.commonStaged)), this.commonStaged, false, () => false);
73
+ }
74
+ bind(fn) {
75
+ return this.add(fn(this.ctxFor(this.commonStaged)), this.binds, true, n => this.known(n));
76
+ }
77
+ overrideBind(fn) {
78
+ return this.add(fn(this.ctxFor(this.commonStaged)), this.binds, false, () => false);
79
+ }
80
+ stageFor(actionOrDir, labelOrFn, maybeFn) {
81
+ if (maybeFn === undefined) {
82
+ const action = actionOrDir;
83
+ const into = (this.actionStaged[action] ??= {});
84
+ return this.add(labelOrFn(this.ctxFor(this.mergedStaged(action))), into, true, n => this.known(n) || n in into);
85
+ }
86
+ const [dir, label] = [actionOrDir, labelOrFn];
87
+ const into = ((this.linkStaged[dir] ??= {})[label] ??= {});
88
+ return this.add(maybeFn(this.ctxFor(this.mergedLinkStaged(dir, label), this.linkTargetOf(label))), into, true, n => this.known(n) || n in into);
89
+ }
90
+ bindFor(actionOrDir, labelOrFn, maybeFn) {
91
+ if (maybeFn === undefined) {
92
+ const action = actionOrDir;
93
+ return this.add(labelOrFn(this.ctxFor(this.mergedStaged(action))), this.binds, true, n => this.known(n));
94
+ }
95
+ const [dir, label] = [actionOrDir, labelOrFn];
96
+ return this.add(maybeFn(this.ctxFor(this.mergedLinkStaged(dir, label), this.linkTargetOf(label))), this.binds, true, n => this.known(n));
97
+ }
98
+ allow(input) {
99
+ const block = typeof input === 'function' ? input(this.ctxFor(this.commonStaged)) : input;
100
+ for (const action of ACTIONS) {
101
+ if (block[action] !== undefined)
102
+ this.allowOut[action] = resolveRule(block[action], this.ctxFor(this.mergedStaged(action)));
103
+ }
104
+ for (const dir of ['link', 'unlink']) {
105
+ const labels = block[dir];
106
+ if (!labels)
107
+ continue;
108
+ const map = this.allowOut[dir] ?? {};
109
+ for (const [label, rule] of Object.entries(labels)) {
110
+ if (rule !== undefined) {
111
+ const ctx = this.ctxFor(this.mergedLinkStaged(dir, label), this.linkTargetOf(label));
112
+ map[label] = resolveRule(rule, ctx);
113
+ }
114
+ }
115
+ this.allowOut[dir] = map;
116
+ }
117
+ return this;
118
+ }
119
+ fields(input) {
120
+ const ctx = this.ctxFor(this.commonStaged);
121
+ const block = typeof input === 'function' ? input(ctx) : input;
122
+ for (const [field, rule] of Object.entries(block)) {
123
+ if (rule !== undefined)
124
+ this.fieldsOut[field] = resolveRule(rule, ctx);
125
+ }
126
+ return this;
127
+ }
128
+ /** The compiled namespace block. */
129
+ block() {
130
+ const out = { allow: this.allowOut };
131
+ const bind = renderBinds(this.binds);
132
+ if (Object.keys(bind).length)
133
+ out.bind = bind;
134
+ if (Object.keys(this.fieldsOut).length)
135
+ out.fields = this.fieldsOut;
136
+ return out;
137
+ }
138
+ }
139
+ // ==========
140
+ // defaults builder
141
+ class DefaultsRuntime {
142
+ staged = {};
143
+ binds = {};
144
+ allowOut = {};
145
+ ctx() {
146
+ // The default context is namespace-loose; the type layer narrows it.
147
+ return (0, context_js_1.makeContext)({ staged: this.staged, binds: this.binds }, validate_js_1.noValidate);
148
+ }
149
+ known(name) {
150
+ return name in this.staged || name in this.binds;
151
+ }
152
+ collect(fn, into) {
153
+ for (const [name, node] of Object.entries(fn(this.ctx()))) {
154
+ if (this.known(name))
155
+ throw new Error(`QERR_PERMS_DUPLICATE_NAME: '${name}' is already defined in defaults — use .overrideStage/.overrideBind`);
156
+ into[name] = node;
157
+ }
158
+ return this;
159
+ }
160
+ stage(fn) {
161
+ return this.collect(fn, this.staged);
162
+ }
163
+ bind(fn) {
164
+ return this.collect(fn, this.binds);
165
+ }
166
+ allow(input) {
167
+ const ctx = this.ctx();
168
+ const block = typeof input === 'function' ? input(ctx) : input;
169
+ for (const key of ['$default', ...ACTIONS]) {
170
+ if (block[key] !== undefined)
171
+ this.allowOut[key] = resolveRule(block[key], ctx);
172
+ }
173
+ return this;
174
+ }
175
+ }
176
+ // ==========
177
+ // attrs builder
178
+ class AttrsRuntime {
179
+ schema;
180
+ out = {};
181
+ constructor(schema) {
182
+ this.schema = schema;
183
+ }
184
+ allow(input) {
185
+ const ctx = (0, context_js_1.makeContext)({ staged: {}, binds: {} }, validate_js_1.noValidate);
186
+ const block = typeof input === 'function' ? input(ctx) : input;
187
+ if (block.create !== undefined)
188
+ this.out.create = resolveRule(block.create, ctx);
189
+ return this;
190
+ }
191
+ }
192
+ // ==========
193
+ // the top-level builder
194
+ class PermsRuntime {
195
+ schema;
196
+ defaultStaged = {};
197
+ defaultBinds = {};
198
+ defaultAllow;
199
+ hasDefaults = false;
200
+ attrsOut;
201
+ rateLimitsConfig;
202
+ nsBuilders = {};
203
+ constructor(schema) {
204
+ this.schema = schema;
205
+ }
206
+ attrs(fn) {
207
+ const a = new AttrsRuntime(this.schema);
208
+ fn(a);
209
+ this.attrsOut = a.out;
210
+ return this;
211
+ }
212
+ defaults(fn) {
213
+ const d = new DefaultsRuntime();
214
+ fn(d);
215
+ this.hasDefaults = true;
216
+ this.defaultStaged = d.staged;
217
+ this.defaultBinds = d.binds;
218
+ this.defaultAllow = d.allowOut;
219
+ return this;
220
+ }
221
+ rateLimits(config) {
222
+ this.rateLimitsConfig = config;
223
+ return this;
224
+ }
225
+ namespaces(map) {
226
+ const defaultBindNames = Object.keys(this.defaultBinds);
227
+ for (const [ns, build] of Object.entries(map)) {
228
+ if (this.schema && !(0, validate_js_1.namespaceExists)(this.schema, ns))
229
+ throw new Error(`QERR_PERMS_SCHEMA: '${ns}' is not a namespace in the schema`);
230
+ const nsb = new NamespaceRuntime(this.schema, ns, this.defaultStaged, defaultBindNames);
231
+ build(nsb);
232
+ this.nsBuilders[ns] = nsb;
233
+ }
234
+ return this;
235
+ }
236
+ compile() {
237
+ const out = {};
238
+ if (this.attrsOut) {
239
+ out.attrs = {
240
+ allow: this.attrsOut.create !== undefined ? { create: this.attrsOut.create } : {},
241
+ };
242
+ }
243
+ if (this.hasDefaults) {
244
+ const block = { allow: this.defaultAllow ?? {} };
245
+ const bind = renderBinds(this.defaultBinds);
246
+ if (Object.keys(bind).length)
247
+ block.bind = bind;
248
+ out.$default = block;
249
+ }
250
+ if (this.rateLimitsConfig)
251
+ out.$rateLimits = this.rateLimitsConfig;
252
+ for (const [ns, nsb] of Object.entries(this.nsBuilders))
253
+ out[ns] = nsb.block();
254
+ return out;
255
+ }
256
+ }
257
+ function definePerms(schema) {
258
+ return new PermsRuntime(schema);
259
+ }
260
+ //# 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"]}