@pyric/cli 0.1.0-alpha.9

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 (1169) hide show
  1. package/LICENSE +216 -0
  2. package/README.md +156 -0
  3. package/README.md.orig +138 -0
  4. package/dist/assurance/attachment.d.ts +24 -0
  5. package/dist/assurance/attachment.d.ts.map +1 -0
  6. package/dist/assurance/attachment.js +138 -0
  7. package/dist/assurance/attachment.js.map +1 -0
  8. package/dist/assurance/browser.d.ts +7 -0
  9. package/dist/assurance/browser.d.ts.map +1 -0
  10. package/dist/assurance/browser.js +68 -0
  11. package/dist/assurance/browser.js.map +1 -0
  12. package/dist/assurance/campaign.d.ts +41 -0
  13. package/dist/assurance/campaign.d.ts.map +1 -0
  14. package/dist/assurance/campaign.js +364 -0
  15. package/dist/assurance/campaign.js.map +1 -0
  16. package/dist/assurance/capabilities.d.ts +7 -0
  17. package/dist/assurance/capabilities.d.ts.map +1 -0
  18. package/dist/assurance/capabilities.js +295 -0
  19. package/dist/assurance/capabilities.js.map +1 -0
  20. package/dist/assurance/cases.d.ts +14 -0
  21. package/dist/assurance/cases.d.ts.map +1 -0
  22. package/dist/assurance/cases.js +27 -0
  23. package/dist/assurance/cases.js.map +1 -0
  24. package/dist/assurance/generated-capabilities.d.ts +52 -0
  25. package/dist/assurance/generated-capabilities.d.ts.map +1 -0
  26. package/dist/assurance/generated-capabilities.js +329 -0
  27. package/dist/assurance/generated-capabilities.js.map +1 -0
  28. package/dist/assurance/index.d.ts +11 -0
  29. package/dist/assurance/index.d.ts.map +1 -0
  30. package/dist/assurance/index.js +9 -0
  31. package/dist/assurance/index.js.map +1 -0
  32. package/dist/assurance/runner.d.ts +3 -0
  33. package/dist/assurance/runner.d.ts.map +1 -0
  34. package/dist/assurance/runner.js +633 -0
  35. package/dist/assurance/runner.js.map +1 -0
  36. package/dist/assurance/tool-names.d.ts +4 -0
  37. package/dist/assurance/tool-names.d.ts.map +1 -0
  38. package/dist/assurance/tool-names.js +14 -0
  39. package/dist/assurance/tool-names.js.map +1 -0
  40. package/dist/assurance/tools.d.ts +19 -0
  41. package/dist/assurance/tools.d.ts.map +1 -0
  42. package/dist/assurance/tools.js +740 -0
  43. package/dist/assurance/tools.js.map +1 -0
  44. package/dist/assurance/types.d.ts +348 -0
  45. package/dist/assurance/types.d.ts.map +1 -0
  46. package/dist/assurance/types.js +7 -0
  47. package/dist/assurance/types.js.map +1 -0
  48. package/dist/assurance/validation.d.ts +8 -0
  49. package/dist/assurance/validation.d.ts.map +1 -0
  50. package/dist/assurance/validation.js +269 -0
  51. package/dist/assurance/validation.js.map +1 -0
  52. package/dist/bridge/client/bridge.d.ts +133 -0
  53. package/dist/bridge/client/bridge.d.ts.map +1 -0
  54. package/dist/bridge/client/bridge.js +429 -0
  55. package/dist/bridge/client/bridge.js.map +1 -0
  56. package/dist/bridge/client/dispatch.d.ts +41 -0
  57. package/dist/bridge/client/dispatch.d.ts.map +1 -0
  58. package/dist/bridge/client/dispatch.js +111 -0
  59. package/dist/bridge/client/dispatch.js.map +1 -0
  60. package/dist/bridge/client.d.ts +24 -0
  61. package/dist/bridge/client.d.ts.map +1 -0
  62. package/dist/bridge/client.js +26 -0
  63. package/dist/bridge/client.js.map +1 -0
  64. package/dist/bridge/protocol.d.ts +227 -0
  65. package/dist/bridge/protocol.d.ts.map +1 -0
  66. package/dist/bridge/protocol.js +131 -0
  67. package/dist/bridge/protocol.js.map +1 -0
  68. package/dist/bridge/server/audit.d.ts +19 -0
  69. package/dist/bridge/server/audit.d.ts.map +1 -0
  70. package/dist/bridge/server/audit.js +46 -0
  71. package/dist/bridge/server/audit.js.map +1 -0
  72. package/dist/bridge/server/bridge.d.ts +126 -0
  73. package/dist/bridge/server/bridge.d.ts.map +1 -0
  74. package/dist/bridge/server/bridge.js +383 -0
  75. package/dist/bridge/server/bridge.js.map +1 -0
  76. package/dist/bridge/server/headless.d.ts +36 -0
  77. package/dist/bridge/server/headless.d.ts.map +1 -0
  78. package/dist/bridge/server/headless.js +142 -0
  79. package/dist/bridge/server/headless.js.map +1 -0
  80. package/dist/bridge/server/json-schema-to-zod.d.ts +37 -0
  81. package/dist/bridge/server/json-schema-to-zod.d.ts.map +1 -0
  82. package/dist/bridge/server/json-schema-to-zod.js +93 -0
  83. package/dist/bridge/server/json-schema-to-zod.js.map +1 -0
  84. package/dist/bridge/server/local-bridge.d.ts +33 -0
  85. package/dist/bridge/server/local-bridge.d.ts.map +1 -0
  86. package/dist/bridge/server/local-bridge.js +41 -0
  87. package/dist/bridge/server/local-bridge.js.map +1 -0
  88. package/dist/bridge/server/logger.d.ts +28 -0
  89. package/dist/bridge/server/logger.d.ts.map +1 -0
  90. package/dist/bridge/server/logger.js +42 -0
  91. package/dist/bridge/server/logger.js.map +1 -0
  92. package/dist/bridge/server/mcp-contract.d.ts +21 -0
  93. package/dist/bridge/server/mcp-contract.d.ts.map +1 -0
  94. package/dist/bridge/server/mcp-contract.js +62 -0
  95. package/dist/bridge/server/mcp-contract.js.map +1 -0
  96. package/dist/bridge/server/mcp.d.ts +26 -0
  97. package/dist/bridge/server/mcp.d.ts.map +1 -0
  98. package/dist/bridge/server/mcp.js +102 -0
  99. package/dist/bridge/server/mcp.js.map +1 -0
  100. package/dist/bridge/server/peer.d.ts +39 -0
  101. package/dist/bridge/server/peer.d.ts.map +1 -0
  102. package/dist/bridge/server/peer.js +189 -0
  103. package/dist/bridge/server/peer.js.map +1 -0
  104. package/dist/bridge/server/standalone.d.ts +49 -0
  105. package/dist/bridge/server/standalone.d.ts.map +1 -0
  106. package/dist/bridge/server/standalone.js +267 -0
  107. package/dist/bridge/server/standalone.js.map +1 -0
  108. package/dist/bridge/server/tool-metadata.d.ts +38 -0
  109. package/dist/bridge/server/tool-metadata.d.ts.map +1 -0
  110. package/dist/bridge/server/tool-metadata.js +81 -0
  111. package/dist/bridge/server/tool-metadata.js.map +1 -0
  112. package/dist/bridge/server.d.ts +21 -0
  113. package/dist/bridge/server.d.ts.map +1 -0
  114. package/dist/bridge/server.js +18 -0
  115. package/dist/bridge/server.js.map +1 -0
  116. package/dist/cli/database-rules.d.ts +43 -0
  117. package/dist/cli/database-rules.d.ts.map +1 -0
  118. package/dist/cli/database-rules.js +261 -0
  119. package/dist/cli/database-rules.js.map +1 -0
  120. package/dist/cli/dev-runner.d.ts +112 -0
  121. package/dist/cli/dev-runner.d.ts.map +1 -0
  122. package/dist/cli/dev-runner.js +239 -0
  123. package/dist/cli/dev-runner.js.map +1 -0
  124. package/dist/cli/firebase-json.d.ts +66 -0
  125. package/dist/cli/firebase-json.d.ts.map +1 -0
  126. package/dist/cli/firebase-json.js +60 -0
  127. package/dist/cli/firebase-json.js.map +1 -0
  128. package/dist/cli/firestore-indexes.d.ts +21 -0
  129. package/dist/cli/firestore-indexes.d.ts.map +1 -0
  130. package/dist/cli/firestore-indexes.js +39 -0
  131. package/dist/cli/firestore-indexes.js.map +1 -0
  132. package/dist/cli/index.d.ts +56 -0
  133. package/dist/cli/index.d.ts.map +1 -0
  134. package/dist/cli/index.js +379 -0
  135. package/dist/cli/index.js.map +1 -0
  136. package/dist/cli/init.d.ts +50 -0
  137. package/dist/cli/init.d.ts.map +1 -0
  138. package/dist/cli/init.js +182 -0
  139. package/dist/cli/init.js.map +1 -0
  140. package/dist/cli/mcp-proxy.d.ts +10 -0
  141. package/dist/cli/mcp-proxy.d.ts.map +1 -0
  142. package/dist/cli/mcp-proxy.js +129 -0
  143. package/dist/cli/mcp-proxy.js.map +1 -0
  144. package/dist/cli/parse-args.d.ts +20 -0
  145. package/dist/cli/parse-args.d.ts.map +1 -0
  146. package/dist/cli/parse-args.js +69 -0
  147. package/dist/cli/parse-args.js.map +1 -0
  148. package/dist/cli/rules.d.ts +55 -0
  149. package/dist/cli/rules.d.ts.map +1 -0
  150. package/dist/cli/rules.js +199 -0
  151. package/dist/cli/rules.js.map +1 -0
  152. package/dist/cli/scope.d.ts +12 -0
  153. package/dist/cli/scope.d.ts.map +1 -0
  154. package/dist/cli/scope.js +44 -0
  155. package/dist/cli/scope.js.map +1 -0
  156. package/dist/cli/serve.d.ts +122 -0
  157. package/dist/cli/serve.d.ts.map +1 -0
  158. package/dist/cli/serve.js +844 -0
  159. package/dist/cli/serve.js.map +1 -0
  160. package/dist/cli/service-commands.d.ts +8 -0
  161. package/dist/cli/service-commands.d.ts.map +1 -0
  162. package/dist/cli/service-commands.js +58 -0
  163. package/dist/cli/service-commands.js.map +1 -0
  164. package/dist/cli/snapshot.d.ts +22 -0
  165. package/dist/cli/snapshot.d.ts.map +1 -0
  166. package/dist/cli/snapshot.js +139 -0
  167. package/dist/cli/snapshot.js.map +1 -0
  168. package/dist/cli/storage-rules.d.ts +21 -0
  169. package/dist/cli/storage-rules.d.ts.map +1 -0
  170. package/dist/cli/storage-rules.js +121 -0
  171. package/dist/cli/storage-rules.js.map +1 -0
  172. package/dist/cli/verify.d.ts +23 -0
  173. package/dist/cli/verify.d.ts.map +1 -0
  174. package/dist/cli/verify.js +349 -0
  175. package/dist/cli/verify.js.map +1 -0
  176. package/dist/credentials/core/memoize-ttl.d.ts +58 -0
  177. package/dist/credentials/core/memoize-ttl.d.ts.map +1 -0
  178. package/dist/credentials/core/memoize-ttl.js +88 -0
  179. package/dist/credentials/core/memoize-ttl.js.map +1 -0
  180. package/dist/credentials/core/types.d.ts +11 -0
  181. package/dist/credentials/core/types.d.ts.map +1 -0
  182. package/dist/credentials/core/types.js +2 -0
  183. package/dist/credentials/core/types.js.map +1 -0
  184. package/dist/credentials/node/from-adc.d.ts +10 -0
  185. package/dist/credentials/node/from-adc.d.ts.map +1 -0
  186. package/dist/credentials/node/from-adc.js +76 -0
  187. package/dist/credentials/node/from-adc.js.map +1 -0
  188. package/dist/credentials/node/from-service-account.d.ts +24 -0
  189. package/dist/credentials/node/from-service-account.d.ts.map +1 -0
  190. package/dist/credentials/node/from-service-account.js +108 -0
  191. package/dist/credentials/node/from-service-account.js.map +1 -0
  192. package/dist/credentials/node/index.d.ts +7 -0
  193. package/dist/credentials/node/index.d.ts.map +1 -0
  194. package/dist/credentials/node/index.js +7 -0
  195. package/dist/credentials/node/index.js.map +1 -0
  196. package/dist/discover/concurrency.d.ts +42 -0
  197. package/dist/discover/concurrency.d.ts.map +1 -0
  198. package/dist/discover/concurrency.js +113 -0
  199. package/dist/discover/concurrency.js.map +1 -0
  200. package/dist/discover/crawler-adapter.d.ts +48 -0
  201. package/dist/discover/crawler-adapter.d.ts.map +1 -0
  202. package/dist/discover/crawler-adapter.js +92 -0
  203. package/dist/discover/crawler-adapter.js.map +1 -0
  204. package/dist/discover/crawler.d.ts +294 -0
  205. package/dist/discover/crawler.d.ts.map +1 -0
  206. package/dist/discover/crawler.js +764 -0
  207. package/dist/discover/crawler.js.map +1 -0
  208. package/dist/discover/credential-free.d.ts +19 -0
  209. package/dist/discover/credential-free.d.ts.map +1 -0
  210. package/dist/discover/credential-free.js +18 -0
  211. package/dist/discover/credential-free.js.map +1 -0
  212. package/dist/discover/findCollectionGroup.d.ts +44 -0
  213. package/dist/discover/findCollectionGroup.d.ts.map +1 -0
  214. package/dist/discover/findCollectionGroup.js +81 -0
  215. package/dist/discover/findCollectionGroup.js.map +1 -0
  216. package/dist/discover/firestore-source.d.ts +60 -0
  217. package/dist/discover/firestore-source.d.ts.map +1 -0
  218. package/dist/discover/firestore-source.js +11 -0
  219. package/dist/discover/firestore-source.js.map +1 -0
  220. package/dist/discover/index.d.ts +3 -0
  221. package/dist/discover/index.d.ts.map +1 -0
  222. package/dist/discover/index.js +5 -0
  223. package/dist/discover/index.js.map +1 -0
  224. package/dist/discover/merge.d.ts +108 -0
  225. package/dist/discover/merge.d.ts.map +1 -0
  226. package/dist/discover/merge.js +394 -0
  227. package/dist/discover/merge.js.map +1 -0
  228. package/dist/discover/session.d.ts +116 -0
  229. package/dist/discover/session.d.ts.map +1 -0
  230. package/dist/discover/session.js +331 -0
  231. package/dist/discover/session.js.map +1 -0
  232. package/dist/discover/tools.d.ts +58 -0
  233. package/dist/discover/tools.d.ts.map +1 -0
  234. package/dist/discover/tools.js +115 -0
  235. package/dist/discover/tools.js.map +1 -0
  236. package/dist/discover/types.d.ts +190 -0
  237. package/dist/discover/types.d.ts.map +1 -0
  238. package/dist/discover/types.js +12 -0
  239. package/dist/discover/types.js.map +1 -0
  240. package/dist/discover/wire.d.ts +70 -0
  241. package/dist/discover/wire.d.ts.map +1 -0
  242. package/dist/discover/wire.js +309 -0
  243. package/dist/discover/wire.js.map +1 -0
  244. package/dist/functions-rtdb/child.d.ts +52 -0
  245. package/dist/functions-rtdb/child.d.ts.map +1 -0
  246. package/dist/functions-rtdb/child.js +283 -0
  247. package/dist/functions-rtdb/child.js.map +1 -0
  248. package/dist/functions-rtdb/delivery.d.ts +4 -0
  249. package/dist/functions-rtdb/delivery.d.ts.map +1 -0
  250. package/dist/functions-rtdb/delivery.js +2 -0
  251. package/dist/functions-rtdb/delivery.js.map +1 -0
  252. package/dist/functions-rtdb/discovery.d.ts +41 -0
  253. package/dist/functions-rtdb/discovery.d.ts.map +1 -0
  254. package/dist/functions-rtdb/discovery.js +86 -0
  255. package/dist/functions-rtdb/discovery.js.map +1 -0
  256. package/dist/functions-rtdb/event.d.ts +20 -0
  257. package/dist/functions-rtdb/event.d.ts.map +1 -0
  258. package/dist/functions-rtdb/event.js +45 -0
  259. package/dist/functions-rtdb/event.js.map +1 -0
  260. package/dist/functions-rtdb/execution.d.ts +20 -0
  261. package/dist/functions-rtdb/execution.d.ts.map +1 -0
  262. package/dist/functions-rtdb/execution.js +70 -0
  263. package/dist/functions-rtdb/execution.js.map +1 -0
  264. package/dist/functions-rtdb/in-memory-delivery.d.ts +9 -0
  265. package/dist/functions-rtdb/in-memory-delivery.d.ts.map +1 -0
  266. package/dist/functions-rtdb/in-memory-delivery.js +36 -0
  267. package/dist/functions-rtdb/in-memory-delivery.js.map +1 -0
  268. package/dist/functions-rtdb/project.d.ts +7 -0
  269. package/dist/functions-rtdb/project.d.ts.map +1 -0
  270. package/dist/functions-rtdb/project.js +54 -0
  271. package/dist/functions-rtdb/project.js.map +1 -0
  272. package/dist/functions-rtdb/projection.d.ts +14 -0
  273. package/dist/functions-rtdb/projection.d.ts.map +1 -0
  274. package/dist/functions-rtdb/projection.js +65 -0
  275. package/dist/functions-rtdb/projection.js.map +1 -0
  276. package/dist/functions-rtdb/reference-pattern.d.ts +5 -0
  277. package/dist/functions-rtdb/reference-pattern.d.ts.map +1 -0
  278. package/dist/functions-rtdb/reference-pattern.js +14 -0
  279. package/dist/functions-rtdb/reference-pattern.js.map +1 -0
  280. package/dist/functions-rtdb/remote-delivery.d.ts +9 -0
  281. package/dist/functions-rtdb/remote-delivery.d.ts.map +1 -0
  282. package/dist/functions-rtdb/remote-delivery.js +11 -0
  283. package/dist/functions-rtdb/remote-delivery.js.map +1 -0
  284. package/dist/pkg-version.d.ts +2 -0
  285. package/dist/pkg-version.d.ts.map +1 -0
  286. package/dist/pkg-version.js +47 -0
  287. package/dist/pkg-version.js.map +1 -0
  288. package/dist/register/esm-exports.d.ts +26 -0
  289. package/dist/register/esm-exports.d.ts.map +1 -0
  290. package/dist/register/esm-exports.js +61 -0
  291. package/dist/register/esm-exports.js.map +1 -0
  292. package/dist/register/hooks.d.ts +13 -0
  293. package/dist/register/hooks.d.ts.map +1 -0
  294. package/dist/register/hooks.js +15 -0
  295. package/dist/register/hooks.js.map +1 -0
  296. package/dist/register/index.d.ts +5 -0
  297. package/dist/register/index.d.ts.map +1 -0
  298. package/dist/register/index.js +124 -0
  299. package/dist/register/index.js.map +1 -0
  300. package/dist/register/mapping.d.ts +19 -0
  301. package/dist/register/mapping.d.ts.map +1 -0
  302. package/dist/register/mapping.js +35 -0
  303. package/dist/register/mapping.js.map +1 -0
  304. package/dist/remote/index.d.ts +232 -0
  305. package/dist/remote/index.d.ts.map +1 -0
  306. package/dist/remote/index.js +720 -0
  307. package/dist/remote/index.js.map +1 -0
  308. package/dist/rtdb/crawl-snapshot.d.ts +17 -0
  309. package/dist/rtdb/crawl-snapshot.d.ts.map +1 -0
  310. package/dist/rtdb/crawl-snapshot.js +72 -0
  311. package/dist/rtdb/crawl-snapshot.js.map +1 -0
  312. package/dist/rtdb/inspection.d.ts +8 -0
  313. package/dist/rtdb/inspection.d.ts.map +1 -0
  314. package/dist/rtdb/inspection.js +111 -0
  315. package/dist/rtdb/inspection.js.map +1 -0
  316. package/dist/rtdb/load-rules-document.d.ts +25 -0
  317. package/dist/rtdb/load-rules-document.d.ts.map +1 -0
  318. package/dist/rtdb/load-rules-document.js +38 -0
  319. package/dist/rtdb/load-rules-document.js.map +1 -0
  320. package/dist/rtdb/rules-generation-tool.d.ts +4 -0
  321. package/dist/rtdb/rules-generation-tool.d.ts.map +1 -0
  322. package/dist/rtdb/rules-generation-tool.js +35 -0
  323. package/dist/rtdb/rules-generation-tool.js.map +1 -0
  324. package/dist/rtdb/rules-json.d.ts +8 -0
  325. package/dist/rtdb/rules-json.d.ts.map +1 -0
  326. package/dist/rtdb/rules-json.js +17 -0
  327. package/dist/rtdb/rules-json.js.map +1 -0
  328. package/dist/serve/bridge-mount.d.ts +36 -0
  329. package/dist/serve/bridge-mount.d.ts.map +1 -0
  330. package/dist/serve/bridge-mount.js +162 -0
  331. package/dist/serve/bridge-mount.js.map +1 -0
  332. package/dist/serve/bundler.d.ts +110 -0
  333. package/dist/serve/bundler.d.ts.map +1 -0
  334. package/dist/serve/bundler.js +432 -0
  335. package/dist/serve/bundler.js.map +1 -0
  336. package/dist/serve/capture-store.d.ts +27 -0
  337. package/dist/serve/capture-store.d.ts.map +1 -0
  338. package/dist/serve/capture-store.js +47 -0
  339. package/dist/serve/capture-store.js.map +1 -0
  340. package/dist/serve/discovery.d.ts +71 -0
  341. package/dist/serve/discovery.d.ts.map +1 -0
  342. package/dist/serve/discovery.js +158 -0
  343. package/dist/serve/discovery.js.map +1 -0
  344. package/dist/serve/docs-ui/_astro/_slug_.CQYSemvw.css +1 -0
  345. package/dist/serve/docs-ui/docs/_rhythm/index.html +99 -0
  346. package/dist/serve/docs-ui/docs/_rhythm.md +101 -0
  347. package/dist/serve/docs-ui/docs/api-reference/index.html +64 -0
  348. package/dist/serve/docs-ui/docs/api-reference.md +67 -0
  349. package/dist/serve/docs-ui/docs/audit-your-rules/index.html +34 -0
  350. package/dist/serve/docs-ui/docs/audit-your-rules.md +50 -0
  351. package/dist/serve/docs-ui/docs/create-pyric-reference-api/index.html +498 -0
  352. package/dist/serve/docs-ui/docs/create-pyric-reference-api.md +345 -0
  353. package/dist/serve/docs-ui/docs/firestore-rules-limits/index.html +59 -0
  354. package/dist/serve/docs-ui/docs/firestore-rules-limits.md +54 -0
  355. package/dist/serve/docs-ui/docs/how-the-swap-works/index.html +47 -0
  356. package/dist/serve/docs-ui/docs/how-the-swap-works.md +43 -0
  357. package/dist/serve/docs-ui/docs/how-we-know-it-matches-firebase/index.html +131 -0
  358. package/dist/serve/docs-ui/docs/how-we-know-it-matches-firebase.md +169 -0
  359. package/dist/serve/docs-ui/docs/index.html +2 -0
  360. package/dist/serve/docs-ui/docs/index.json +18637 -0
  361. package/dist/serve/docs-ui/docs/overview/index.html +23 -0
  362. package/dist/serve/docs-ui/docs/overview.md +40 -0
  363. package/dist/serve/docs-ui/docs/pyric-admin-app/index.html +19 -0
  364. package/dist/serve/docs-ui/docs/pyric-admin-app-reference-api/index.html +185 -0
  365. package/dist/serve/docs-ui/docs/pyric-admin-app-reference-api.md +206 -0
  366. package/dist/serve/docs-ui/docs/pyric-admin-app.md +27 -0
  367. package/dist/serve/docs-ui/docs/pyric-admin-auth/index.html +24 -0
  368. package/dist/serve/docs-ui/docs/pyric-admin-auth-reference-api/index.html +617 -0
  369. package/dist/serve/docs-ui/docs/pyric-admin-auth-reference-api.md +441 -0
  370. package/dist/serve/docs-ui/docs/pyric-admin-auth.md +29 -0
  371. package/dist/serve/docs-ui/docs/pyric-admin-database/index.html +26 -0
  372. package/dist/serve/docs-ui/docs/pyric-admin-database-reference-api/index.html +583 -0
  373. package/dist/serve/docs-ui/docs/pyric-admin-database-reference-api.md +597 -0
  374. package/dist/serve/docs-ui/docs/pyric-admin-database.md +31 -0
  375. package/dist/serve/docs-ui/docs/pyric-admin-firestore/index.html +38 -0
  376. package/dist/serve/docs-ui/docs/pyric-admin-firestore-explanation-error-translation/index.html +57 -0
  377. package/dist/serve/docs-ui/docs/pyric-admin-firestore-explanation-error-translation.md +95 -0
  378. package/dist/serve/docs-ui/docs/pyric-admin-firestore-explanation-per-call-delegate/index.html +58 -0
  379. package/dist/serve/docs-ui/docs/pyric-admin-firestore-explanation-per-call-delegate.md +94 -0
  380. package/dist/serve/docs-ui/docs/pyric-admin-firestore-explanation-why-mirror-admin-shape/index.html +59 -0
  381. package/dist/serve/docs-ui/docs/pyric-admin-firestore-explanation-why-mirror-admin-shape.md +88 -0
  382. package/dist/serve/docs-ui/docs/pyric-admin-firestore-how-to-run-a-transaction/index.html +53 -0
  383. package/dist/serve/docs-ui/docs/pyric-admin-firestore-how-to-run-a-transaction.md +76 -0
  384. package/dist/serve/docs-ui/docs/pyric-admin-firestore-how-to-seed-and-set-rules/index.html +62 -0
  385. package/dist/serve/docs-ui/docs/pyric-admin-firestore-how-to-seed-and-set-rules.md +96 -0
  386. package/dist/serve/docs-ui/docs/pyric-admin-firestore-how-to-translate-denials/index.html +80 -0
  387. package/dist/serve/docs-ui/docs/pyric-admin-firestore-how-to-translate-denials.md +98 -0
  388. package/dist/serve/docs-ui/docs/pyric-admin-firestore-how-to-use-onsnapshot/index.html +57 -0
  389. package/dist/serve/docs-ui/docs/pyric-admin-firestore-how-to-use-onsnapshot.md +88 -0
  390. package/dist/serve/docs-ui/docs/pyric-admin-firestore-how-to-write-a-batch/index.html +50 -0
  391. package/dist/serve/docs-ui/docs/pyric-admin-firestore-how-to-write-a-batch.md +73 -0
  392. package/dist/serve/docs-ui/docs/pyric-admin-firestore-reference-api/index.html +32 -0
  393. package/dist/serve/docs-ui/docs/pyric-admin-firestore-reference-api.md +30 -0
  394. package/dist/serve/docs-ui/docs/pyric-admin-firestore-reference-onsnapshot/index.html +68 -0
  395. package/dist/serve/docs-ui/docs/pyric-admin-firestore-reference-onsnapshot.md +81 -0
  396. package/dist/serve/docs-ui/docs/pyric-admin-firestore-reference-re-exported-types/index.html +76 -0
  397. package/dist/serve/docs-ui/docs/pyric-admin-firestore-reference-re-exported-types.md +103 -0
  398. package/dist/serve/docs-ui/docs/pyric-admin-firestore-reference-sandbox-firestore/index.html +40 -0
  399. package/dist/serve/docs-ui/docs/pyric-admin-firestore-reference-sandbox-firestore.md +77 -0
  400. package/dist/serve/docs-ui/docs/pyric-admin-firestore-tutorials-01-first-admin-session/index.html +118 -0
  401. package/dist/serve/docs-ui/docs/pyric-admin-firestore-tutorials-01-first-admin-session.md +166 -0
  402. package/dist/serve/docs-ui/docs/pyric-admin-firestore.md +53 -0
  403. package/dist/serve/docs-ui/docs/pyric-admin-storage/index.html +25 -0
  404. package/dist/serve/docs-ui/docs/pyric-admin-storage-reference-api/index.html +317 -0
  405. package/dist/serve/docs-ui/docs/pyric-admin-storage-reference-api.md +285 -0
  406. package/dist/serve/docs-ui/docs/pyric-admin-storage.md +30 -0
  407. package/dist/serve/docs-ui/docs/pyric-ai-compat/index.html +436 -0
  408. package/dist/serve/docs-ui/docs/pyric-ai-compat.md +471 -0
  409. package/dist/serve/docs-ui/docs/pyric-ai-reference-api/index.html +5831 -0
  410. package/dist/serve/docs-ui/docs/pyric-ai-reference-api.md +5440 -0
  411. package/dist/serve/docs-ui/docs/pyric-ai-scripting-reference-api/index.html +159 -0
  412. package/dist/serve/docs-ui/docs/pyric-ai-scripting-reference-api.md +122 -0
  413. package/dist/serve/docs-ui/docs/pyric-app-compat/index.html +180 -0
  414. package/dist/serve/docs-ui/docs/pyric-app-compat.md +199 -0
  415. package/dist/serve/docs-ui/docs/pyric-app-reference-api/index.html +420 -0
  416. package/dist/serve/docs-ui/docs/pyric-app-reference-api.md +326 -0
  417. package/dist/serve/docs-ui/docs/pyric-auth/index.html +59 -0
  418. package/dist/serve/docs-ui/docs/pyric-auth-compat/index.html +804 -0
  419. package/dist/serve/docs-ui/docs/pyric-auth-compat.md +847 -0
  420. package/dist/serve/docs-ui/docs/pyric-auth-reference-api/index.html +5452 -0
  421. package/dist/serve/docs-ui/docs/pyric-auth-reference-api.md +5271 -0
  422. package/dist/serve/docs-ui/docs/pyric-auth-reference-feature-matrix/index.html +781 -0
  423. package/dist/serve/docs-ui/docs/pyric-auth-reference-feature-matrix.md +198 -0
  424. package/dist/serve/docs-ui/docs/pyric-auth-reference-sandbox-test-driver/index.html +71 -0
  425. package/dist/serve/docs-ui/docs/pyric-auth-reference-sandbox-test-driver.md +108 -0
  426. package/dist/serve/docs-ui/docs/pyric-auth.md +86 -0
  427. package/dist/serve/docs-ui/docs/pyric-cli/index.html +40 -0
  428. package/dist/serve/docs-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +98 -0
  429. package/dist/serve/docs-ui/docs/pyric-cli-assurance-browser-reference-api.md +88 -0
  430. package/dist/serve/docs-ui/docs/pyric-cli-assurance-reference-api/index.html +2355 -0
  431. package/dist/serve/docs-ui/docs/pyric-cli-assurance-reference-api.md +1554 -0
  432. package/dist/serve/docs-ui/docs/pyric-cli-bridge/index.html +69 -0
  433. package/dist/serve/docs-ui/docs/pyric-cli-bridge-client-reference-api/index.html +546 -0
  434. package/dist/serve/docs-ui/docs/pyric-cli-bridge-client-reference-api.md +485 -0
  435. package/dist/serve/docs-ui/docs/pyric-cli-bridge-reference-api/index.html +506 -0
  436. package/dist/serve/docs-ui/docs/pyric-cli-bridge-reference-api.md +419 -0
  437. package/dist/serve/docs-ui/docs/pyric-cli-bridge.md +99 -0
  438. package/dist/serve/docs-ui/docs/pyric-cli-credentials-node-reference-api/index.html +67 -0
  439. package/dist/serve/docs-ui/docs/pyric-cli-credentials-node-reference-api.md +59 -0
  440. package/dist/serve/docs-ui/docs/pyric-cli-discover-reference-api/index.html +2355 -0
  441. package/dist/serve/docs-ui/docs/pyric-cli-discover-reference-api.md +2036 -0
  442. package/dist/serve/docs-ui/docs/pyric-cli-functions-rtdb-compat/index.html +112 -0
  443. package/dist/serve/docs-ui/docs/pyric-cli-functions-rtdb-compat.md +124 -0
  444. package/dist/serve/docs-ui/docs/pyric-cli-how-to-build-a-standalone-binary/index.html +91 -0
  445. package/dist/serve/docs-ui/docs/pyric-cli-how-to-build-a-standalone-binary.md +105 -0
  446. package/dist/serve/docs-ui/docs/pyric-cli-how-to-promote-sandbox-state-to-a-fixture/index.html +52 -0
  447. package/dist/serve/docs-ui/docs/pyric-cli-how-to-promote-sandbox-state-to-a-fixture.md +98 -0
  448. package/dist/serve/docs-ui/docs/pyric-cli-how-to-run-rtdb-onvaluecreated/index.html +66 -0
  449. package/dist/serve/docs-ui/docs/pyric-cli-how-to-run-rtdb-onvaluecreated.md +100 -0
  450. package/dist/serve/docs-ui/docs/pyric-cli-how-to-serve-persistence-and-multi-tab/index.html +228 -0
  451. package/dist/serve/docs-ui/docs/pyric-cli-how-to-serve-persistence-and-multi-tab.md +179 -0
  452. package/dist/serve/docs-ui/docs/pyric-cli-how-to-use-the-vite-plugin/index.html +341 -0
  453. package/dist/serve/docs-ui/docs/pyric-cli-how-to-use-the-vite-plugin.md +309 -0
  454. package/dist/serve/docs-ui/docs/pyric-cli-how-to-verify-against-a-captured-session/index.html +128 -0
  455. package/dist/serve/docs-ui/docs/pyric-cli-how-to-verify-against-a-captured-session.md +207 -0
  456. package/dist/serve/docs-ui/docs/pyric-cli-reference-cli/index.html +404 -0
  457. package/dist/serve/docs-ui/docs/pyric-cli-reference-cli.md +249 -0
  458. package/dist/serve/docs-ui/docs/pyric-cli-reference-package-and-resolution/index.html +93 -0
  459. package/dist/serve/docs-ui/docs/pyric-cli-reference-package-and-resolution.md +65 -0
  460. package/dist/serve/docs-ui/docs/pyric-cli-reference-verify/index.html +81 -0
  461. package/dist/serve/docs-ui/docs/pyric-cli-reference-verify.md +110 -0
  462. package/dist/serve/docs-ui/docs/pyric-cli-register-reference-api/index.html +10 -0
  463. package/dist/serve/docs-ui/docs/pyric-cli-register-reference-api.md +16 -0
  464. package/dist/serve/docs-ui/docs/pyric-cli-remote-reference-api/index.html +1044 -0
  465. package/dist/serve/docs-ui/docs/pyric-cli-remote-reference-api.md +952 -0
  466. package/dist/serve/docs-ui/docs/pyric-cli-serve-worker-reference-api/index.html +5041 -0
  467. package/dist/serve/docs-ui/docs/pyric-cli-serve-worker-reference-api.md +4739 -0
  468. package/dist/serve/docs-ui/docs/pyric-cli-tutorials-server-adoption/index.html +219 -0
  469. package/dist/serve/docs-ui/docs/pyric-cli-tutorials-server-adoption.md +251 -0
  470. package/dist/serve/docs-ui/docs/pyric-cli-tutorials-wire-claude-code/index.html +136 -0
  471. package/dist/serve/docs-ui/docs/pyric-cli-tutorials-wire-claude-code.md +217 -0
  472. package/dist/serve/docs-ui/docs/pyric-cli-verify-reference-api/index.html +926 -0
  473. package/dist/serve/docs-ui/docs/pyric-cli-verify-reference-api.md +586 -0
  474. package/dist/serve/docs-ui/docs/pyric-cli-vite-reference-api/index.html +102 -0
  475. package/dist/serve/docs-ui/docs/pyric-cli-vite-reference-api.md +76 -0
  476. package/dist/serve/docs-ui/docs/pyric-cli.md +42 -0
  477. package/dist/serve/docs-ui/docs/pyric-conformance-scores/index.html +180 -0
  478. package/dist/serve/docs-ui/docs/pyric-conformance-scores.md +184 -0
  479. package/dist/serve/docs-ui/docs/pyric-database/index.html +43 -0
  480. package/dist/serve/docs-ui/docs/pyric-database-compat/index.html +1224 -0
  481. package/dist/serve/docs-ui/docs/pyric-database-compat.md +1289 -0
  482. package/dist/serve/docs-ui/docs/pyric-database-explanation-rules-authoring-and-deploy-are-separate/index.html +16 -0
  483. package/dist/serve/docs-ui/docs/pyric-database-explanation-rules-authoring-and-deploy-are-separate.md +23 -0
  484. package/dist/serve/docs-ui/docs/pyric-database-reference-api/index.html +1851 -0
  485. package/dist/serve/docs-ui/docs/pyric-database-reference-api.md +1842 -0
  486. package/dist/serve/docs-ui/docs/pyric-database-reference-constraints/index.html +381 -0
  487. package/dist/serve/docs-ui/docs/pyric-database-reference-constraints.md +168 -0
  488. package/dist/serve/docs-ui/docs/pyric-database-reference-rules-tooling/index.html +218 -0
  489. package/dist/serve/docs-ui/docs/pyric-database-reference-rules-tooling.md +303 -0
  490. package/dist/serve/docs-ui/docs/pyric-database-tutorials-01-author-rtdb-rules-with-constraints/index.html +125 -0
  491. package/dist/serve/docs-ui/docs/pyric-database-tutorials-01-author-rtdb-rules-with-constraints.md +171 -0
  492. package/dist/serve/docs-ui/docs/pyric-database.md +26 -0
  493. package/dist/serve/docs-ui/docs/pyric-explanation-versioning-and-compatibility/index.html +40 -0
  494. package/dist/serve/docs-ui/docs/pyric-explanation-versioning-and-compatibility.md +68 -0
  495. package/dist/serve/docs-ui/docs/pyric-firestore/index.html +48 -0
  496. package/dist/serve/docs-ui/docs/pyric-firestore-compat/index.html +868 -0
  497. package/dist/serve/docs-ui/docs/pyric-firestore-compat.md +939 -0
  498. package/dist/serve/docs-ui/docs/pyric-firestore-explanation-rules-tooling-is-separate/index.html +92 -0
  499. package/dist/serve/docs-ui/docs/pyric-firestore-explanation-rules-tooling-is-separate.md +70 -0
  500. package/dist/serve/docs-ui/docs/pyric-firestore-explanation-target-symbol-opacity/index.html +59 -0
  501. package/dist/serve/docs-ui/docs/pyric-firestore-explanation-target-symbol-opacity.md +91 -0
  502. package/dist/serve/docs-ui/docs/pyric-firestore-explanation-two-backends-one-surface/index.html +43 -0
  503. package/dist/serve/docs-ui/docs/pyric-firestore-explanation-two-backends-one-surface.md +58 -0
  504. package/dist/serve/docs-ui/docs/pyric-firestore-how-to-migrate-from-firebase-firestore/index.html +58 -0
  505. package/dist/serve/docs-ui/docs/pyric-firestore-how-to-migrate-from-firebase-firestore.md +86 -0
  506. package/dist/serve/docs-ui/docs/pyric-firestore-how-to-pick-a-backend/index.html +52 -0
  507. package/dist/serve/docs-ui/docs/pyric-firestore-how-to-pick-a-backend.md +83 -0
  508. package/dist/serve/docs-ui/docs/pyric-firestore-how-to-run-a-transaction/index.html +42 -0
  509. package/dist/serve/docs-ui/docs/pyric-firestore-how-to-run-a-transaction.md +59 -0
  510. package/dist/serve/docs-ui/docs/pyric-firestore-how-to-use-onsnapshot/index.html +66 -0
  511. package/dist/serve/docs-ui/docs/pyric-firestore-how-to-use-onsnapshot.md +96 -0
  512. package/dist/serve/docs-ui/docs/pyric-firestore-how-to-use-sandbox-ops/index.html +61 -0
  513. package/dist/serve/docs-ui/docs/pyric-firestore-how-to-use-sandbox-ops.md +92 -0
  514. package/dist/serve/docs-ui/docs/pyric-firestore-reference-api/index.html +3623 -0
  515. package/dist/serve/docs-ui/docs/pyric-firestore-reference-api.md +3399 -0
  516. package/dist/serve/docs-ui/docs/pyric-firestore-reference-feature-matrix/index.html +80 -0
  517. package/dist/serve/docs-ui/docs/pyric-firestore-reference-feature-matrix.md +66 -0
  518. package/dist/serve/docs-ui/docs/pyric-firestore-reference-getfirestore/index.html +46 -0
  519. package/dist/serve/docs-ui/docs/pyric-firestore-reference-getfirestore.md +73 -0
  520. package/dist/serve/docs-ui/docs/pyric-firestore-reference-query-constraints/index.html +80 -0
  521. package/dist/serve/docs-ui/docs/pyric-firestore-reference-query-constraints.md +129 -0
  522. package/dist/serve/docs-ui/docs/pyric-firestore-reference-sandbox-ops/index.html +58 -0
  523. package/dist/serve/docs-ui/docs/pyric-firestore-reference-sandbox-ops.md +88 -0
  524. package/dist/serve/docs-ui/docs/pyric-firestore-reference-tool-factories/index.html +51 -0
  525. package/dist/serve/docs-ui/docs/pyric-firestore-reference-tool-factories.md +71 -0
  526. package/dist/serve/docs-ui/docs/pyric-firestore-tutorials-01-write-a-sandbox-demo/index.html +130 -0
  527. package/dist/serve/docs-ui/docs/pyric-firestore-tutorials-01-write-a-sandbox-demo.md +180 -0
  528. package/dist/serve/docs-ui/docs/pyric-firestore-tutorials-02-swap-to-prod-backend/index.html +59 -0
  529. package/dist/serve/docs-ui/docs/pyric-firestore-tutorials-02-swap-to-prod-backend.md +92 -0
  530. package/dist/serve/docs-ui/docs/pyric-firestore-values-reference-api/index.html +30 -0
  531. package/dist/serve/docs-ui/docs/pyric-firestore-values-reference-api.md +30 -0
  532. package/dist/serve/docs-ui/docs/pyric-firestore.md +72 -0
  533. package/dist/serve/docs-ui/docs/pyric-messaging-compat/index.html +300 -0
  534. package/dist/serve/docs-ui/docs/pyric-messaging-compat.md +321 -0
  535. package/dist/serve/docs-ui/docs/pyric-messaging-reference-api/index.html +508 -0
  536. package/dist/serve/docs-ui/docs/pyric-messaging-reference-api.md +374 -0
  537. package/dist/serve/docs-ui/docs/pyric-messaging-sw-reference-api/index.html +482 -0
  538. package/dist/serve/docs-ui/docs/pyric-messaging-sw-reference-api.md +348 -0
  539. package/dist/serve/docs-ui/docs/pyric-rules/index.html +87 -0
  540. package/dist/serve/docs-ui/docs/pyric-rules-compat/index.html +328 -0
  541. package/dist/serve/docs-ui/docs/pyric-rules-compat.md +347 -0
  542. package/dist/serve/docs-ui/docs/pyric-rules-explanation-agent-failure-modes/index.html +50 -0
  543. package/dist/serve/docs-ui/docs/pyric-rules-explanation-agent-failure-modes.md +78 -0
  544. package/dist/serve/docs-ui/docs/pyric-rules-explanation-lint-vs-validate-vs-simulate-vs-test/index.html +79 -0
  545. package/dist/serve/docs-ui/docs/pyric-rules-explanation-lint-vs-validate-vs-simulate-vs-test.md +69 -0
  546. package/dist/serve/docs-ui/docs/pyric-rules-explanation-runtime-budget-and-shared-gates/index.html +67 -0
  547. package/dist/serve/docs-ui/docs/pyric-rules-explanation-runtime-budget-and-shared-gates.md +75 -0
  548. package/dist/serve/docs-ui/docs/pyric-rules-explanation-sentinel-expression-engine/index.html +49 -0
  549. package/dist/serve/docs-ui/docs/pyric-rules-explanation-sentinel-expression-engine.md +74 -0
  550. package/dist/serve/docs-ui/docs/pyric-rules-explanation-simulator-vs-rules-test-api/index.html +95 -0
  551. package/dist/serve/docs-ui/docs/pyric-rules-explanation-simulator-vs-rules-test-api.md +80 -0
  552. package/dist/serve/docs-ui/docs/pyric-rules-explanation-the-2-plus-modules-extension/index.html +58 -0
  553. package/dist/serve/docs-ui/docs/pyric-rules-explanation-the-2-plus-modules-extension.md +79 -0
  554. package/dist/serve/docs-ui/docs/pyric-rules-explanation-value-wrappers-design/index.html +63 -0
  555. package/dist/serve/docs-ui/docs/pyric-rules-explanation-value-wrappers-design.md +84 -0
  556. package/dist/serve/docs-ui/docs/pyric-rules-explanation-why-this-package-exists/index.html +34 -0
  557. package/dist/serve/docs-ui/docs/pyric-rules-explanation-why-this-package-exists.md +43 -0
  558. package/dist/serve/docs-ui/docs/pyric-rules-how-to-compare-rulesets-for-weakening/index.html +55 -0
  559. package/dist/serve/docs-ui/docs/pyric-rules-how-to-compare-rulesets-for-weakening.md +77 -0
  560. package/dist/serve/docs-ui/docs/pyric-rules-how-to-inspect-rules-via-the-ast/index.html +90 -0
  561. package/dist/serve/docs-ui/docs/pyric-rules-how-to-inspect-rules-via-the-ast.md +129 -0
  562. package/dist/serve/docs-ui/docs/pyric-rules-how-to-lint-rules-source/index.html +55 -0
  563. package/dist/serve/docs-ui/docs/pyric-rules-how-to-lint-rules-source.md +84 -0
  564. package/dist/serve/docs-ui/docs/pyric-rules-how-to-pin-request-time/index.html +49 -0
  565. package/dist/serve/docs-ui/docs/pyric-rules-how-to-pin-request-time.md +64 -0
  566. package/dist/serve/docs-ui/docs/pyric-rules-how-to-register-tools-with-an-agent/index.html +61 -0
  567. package/dist/serve/docs-ui/docs/pyric-rules-how-to-register-tools-with-an-agent.md +87 -0
  568. package/dist/serve/docs-ui/docs/pyric-rules-how-to-resolve-module-imports/index.html +93 -0
  569. package/dist/serve/docs-ui/docs/pyric-rules-how-to-resolve-module-imports.md +105 -0
  570. package/dist/serve/docs-ui/docs/pyric-rules-how-to-simulate-rules-locally/index.html +89 -0
  571. package/dist/serve/docs-ui/docs/pyric-rules-how-to-simulate-rules-locally.md +134 -0
  572. package/dist/serve/docs-ui/docs/pyric-rules-how-to-test-rules-against-firebase/index.html +66 -0
  573. package/dist/serve/docs-ui/docs/pyric-rules-how-to-test-rules-against-firebase.md +102 -0
  574. package/dist/serve/docs-ui/docs/pyric-rules-reference-api/index.html +2629 -0
  575. package/dist/serve/docs-ui/docs/pyric-rules-reference-api.md +2213 -0
  576. package/dist/serve/docs-ui/docs/pyric-rules-reference-ast/index.html +85 -0
  577. package/dist/serve/docs-ui/docs/pyric-rules-reference-ast.md +121 -0
  578. package/dist/serve/docs-ui/docs/pyric-rules-reference-conformance-gaps/index.html +277 -0
  579. package/dist/serve/docs-ui/docs/pyric-rules-reference-conformance-gaps.md +360 -0
  580. package/dist/serve/docs-ui/docs/pyric-rules-reference-errors/index.html +76 -0
  581. package/dist/serve/docs-ui/docs/pyric-rules-reference-errors.md +123 -0
  582. package/dist/serve/docs-ui/docs/pyric-rules-reference-lint-rules/index.html +148 -0
  583. package/dist/serve/docs-ui/docs/pyric-rules-reference-lint-rules.md +159 -0
  584. package/dist/serve/docs-ui/docs/pyric-rules-reference-simulator-context/index.html +66 -0
  585. package/dist/serve/docs-ui/docs/pyric-rules-reference-simulator-context.md +104 -0
  586. package/dist/serve/docs-ui/docs/pyric-rules-reference-stdlib-modules/index.html +241 -0
  587. package/dist/serve/docs-ui/docs/pyric-rules-reference-stdlib-modules.md +143 -0
  588. package/dist/serve/docs-ui/docs/pyric-rules-reference-test-case-schema/index.html +94 -0
  589. package/dist/serve/docs-ui/docs/pyric-rules-reference-test-case-schema.md +121 -0
  590. package/dist/serve/docs-ui/docs/pyric-rules-reference-validator-findings/index.html +87 -0
  591. package/dist/serve/docs-ui/docs/pyric-rules-reference-validator-findings.md +117 -0
  592. package/dist/serve/docs-ui/docs/pyric-rules-reference-value-wrappers/index.html +102 -0
  593. package/dist/serve/docs-ui/docs/pyric-rules-reference-value-wrappers.md +152 -0
  594. package/dist/serve/docs-ui/docs/pyric-rules.md +93 -0
  595. package/dist/serve/docs-ui/docs/pyric-sandbox/index.html +67 -0
  596. package/dist/serve/docs-ui/docs/pyric-sandbox-database-reference-api/index.html +120 -0
  597. package/dist/serve/docs-ui/docs/pyric-sandbox-database-reference-api.md +110 -0
  598. package/dist/serve/docs-ui/docs/pyric-sandbox-explanation-every-op-is-a-request/index.html +141 -0
  599. package/dist/serve/docs-ui/docs/pyric-sandbox-explanation-every-op-is-a-request.md +161 -0
  600. package/dist/serve/docs-ui/docs/pyric-sandbox-explanation-identity-is-a-context/index.html +66 -0
  601. package/dist/serve/docs-ui/docs/pyric-sandbox-explanation-identity-is-a-context.md +110 -0
  602. package/dist/serve/docs-ui/docs/pyric-sandbox-explanation-internal-adapter-protocol/index.html +71 -0
  603. package/dist/serve/docs-ui/docs/pyric-sandbox-explanation-internal-adapter-protocol.md +111 -0
  604. package/dist/serve/docs-ui/docs/pyric-sandbox-explanation-listener-re-evaluation/index.html +56 -0
  605. package/dist/serve/docs-ui/docs/pyric-sandbox-explanation-listener-re-evaluation.md +82 -0
  606. package/dist/serve/docs-ui/docs/pyric-sandbox-explanation-local-backend-vs-firestore-offline/index.html +64 -0
  607. package/dist/serve/docs-ui/docs/pyric-sandbox-explanation-local-backend-vs-firestore-offline.md +56 -0
  608. package/dist/serve/docs-ui/docs/pyric-sandbox-explanation-why-adapters-are-siblings/index.html +92 -0
  609. package/dist/serve/docs-ui/docs/pyric-sandbox-explanation-why-adapters-are-siblings.md +90 -0
  610. package/dist/serve/docs-ui/docs/pyric-sandbox-explanation-why-this-package-exists/index.html +69 -0
  611. package/dist/serve/docs-ui/docs/pyric-sandbox-explanation-why-this-package-exists.md +57 -0
  612. package/dist/serve/docs-ui/docs/pyric-sandbox-firestore-reference-api/index.html +202 -0
  613. package/dist/serve/docs-ui/docs/pyric-sandbox-firestore-reference-api.md +134 -0
  614. package/dist/serve/docs-ui/docs/pyric-sandbox-how-to-multiple-isolated-sandboxes/index.html +63 -0
  615. package/dist/serve/docs-ui/docs/pyric-sandbox-how-to-multiple-isolated-sandboxes.md +89 -0
  616. package/dist/serve/docs-ui/docs/pyric-sandbox-how-to-observe-events/index.html +159 -0
  617. package/dist/serve/docs-ui/docs/pyric-sandbox-how-to-observe-events.md +168 -0
  618. package/dist/serve/docs-ui/docs/pyric-sandbox-how-to-pick-an-adapter/index.html +79 -0
  619. package/dist/serve/docs-ui/docs/pyric-sandbox-how-to-pick-an-adapter.md +75 -0
  620. package/dist/serve/docs-ui/docs/pyric-sandbox-how-to-replay-events/index.html +88 -0
  621. package/dist/serve/docs-ui/docs/pyric-sandbox-how-to-replay-events.md +92 -0
  622. package/dist/serve/docs-ui/docs/pyric-sandbox-how-to-reset-between-tests/index.html +68 -0
  623. package/dist/serve/docs-ui/docs/pyric-sandbox-how-to-reset-between-tests.md +92 -0
  624. package/dist/serve/docs-ui/docs/pyric-sandbox-how-to-seed-data-and-rules/index.html +91 -0
  625. package/dist/serve/docs-ui/docs/pyric-sandbox-how-to-seed-data-and-rules.md +122 -0
  626. package/dist/serve/docs-ui/docs/pyric-sandbox-how-to-switch-users/index.html +50 -0
  627. package/dist/serve/docs-ui/docs/pyric-sandbox-how-to-switch-users.md +78 -0
  628. package/dist/serve/docs-ui/docs/pyric-sandbox-how-to-use-admin-reads/index.html +54 -0
  629. package/dist/serve/docs-ui/docs/pyric-sandbox-how-to-use-admin-reads.md +85 -0
  630. package/dist/serve/docs-ui/docs/pyric-sandbox-reference-api/index.html +5019 -0
  631. package/dist/serve/docs-ui/docs/pyric-sandbox-reference-api.md +4060 -0
  632. package/dist/serve/docs-ui/docs/pyric-sandbox-reference-divergences/index.html +125 -0
  633. package/dist/serve/docs-ui/docs/pyric-sandbox-reference-divergences.md +151 -0
  634. package/dist/serve/docs-ui/docs/pyric-sandbox-reference-error-codes/index.html +110 -0
  635. package/dist/serve/docs-ui/docs/pyric-sandbox-reference-error-codes.md +118 -0
  636. package/dist/serve/docs-ui/docs/pyric-sandbox-reference-internal-protocol/index.html +72 -0
  637. package/dist/serve/docs-ui/docs/pyric-sandbox-reference-internal-protocol.md +109 -0
  638. package/dist/serve/docs-ui/docs/pyric-sandbox-reference-sandbox-and-context/index.html +90 -0
  639. package/dist/serve/docs-ui/docs/pyric-sandbox-reference-sandbox-and-context.md +140 -0
  640. package/dist/serve/docs-ui/docs/pyric-sandbox-reference-sandbox-event/index.html +146 -0
  641. package/dist/serve/docs-ui/docs/pyric-sandbox-reference-sandbox-event.md +204 -0
  642. package/dist/serve/docs-ui/docs/pyric-sandbox-reference-snapshot-and-admin/index.html +53 -0
  643. package/dist/serve/docs-ui/docs/pyric-sandbox-reference-snapshot-and-admin.md +89 -0
  644. package/dist/serve/docs-ui/docs/pyric-sandbox-tutorials-01-your-first-sandbox-session/index.html +115 -0
  645. package/dist/serve/docs-ui/docs/pyric-sandbox-tutorials-01-your-first-sandbox-session.md +176 -0
  646. package/dist/serve/docs-ui/docs/pyric-sandbox.md +69 -0
  647. package/dist/serve/docs-ui/docs/pyric-storage/index.html +65 -0
  648. package/dist/serve/docs-ui/docs/pyric-storage-compat/index.html +676 -0
  649. package/dist/serve/docs-ui/docs/pyric-storage-compat.md +699 -0
  650. package/dist/serve/docs-ui/docs/pyric-storage-explanation-implementation-scope/index.html +52 -0
  651. package/dist/serve/docs-ui/docs/pyric-storage-explanation-implementation-scope.md +85 -0
  652. package/dist/serve/docs-ui/docs/pyric-storage-explanation-session-archive-use-case/index.html +58 -0
  653. package/dist/serve/docs-ui/docs/pyric-storage-explanation-session-archive-use-case.md +82 -0
  654. package/dist/serve/docs-ui/docs/pyric-storage-explanation-why-indexeddb/index.html +50 -0
  655. package/dist/serve/docs-ui/docs/pyric-storage-explanation-why-indexeddb.md +82 -0
  656. package/dist/serve/docs-ui/docs/pyric-storage-how-to-enforce-rules/index.html +120 -0
  657. package/dist/serve/docs-ui/docs/pyric-storage-how-to-enforce-rules.md +127 -0
  658. package/dist/serve/docs-ui/docs/pyric-storage-how-to-list-and-delete/index.html +53 -0
  659. package/dist/serve/docs-ui/docs/pyric-storage-how-to-list-and-delete.md +86 -0
  660. package/dist/serve/docs-ui/docs/pyric-storage-how-to-switch-backends/index.html +43 -0
  661. package/dist/serve/docs-ui/docs/pyric-storage-how-to-switch-backends.md +65 -0
  662. package/dist/serve/docs-ui/docs/pyric-storage-how-to-test-rule-expressions/index.html +70 -0
  663. package/dist/serve/docs-ui/docs/pyric-storage-how-to-test-rule-expressions.md +88 -0
  664. package/dist/serve/docs-ui/docs/pyric-storage-reference-api/index.html +2120 -0
  665. package/dist/serve/docs-ui/docs/pyric-storage-reference-api.md +1687 -0
  666. package/dist/serve/docs-ui/docs/pyric-storage-reference-conformance-gaps/index.html +137 -0
  667. package/dist/serve/docs-ui/docs/pyric-storage-reference-conformance-gaps.md +171 -0
  668. package/dist/serve/docs-ui/docs/pyric-storage-reference-error-codes/index.html +37 -0
  669. package/dist/serve/docs-ui/docs/pyric-storage-reference-error-codes.md +57 -0
  670. package/dist/serve/docs-ui/docs/pyric-storage-reference-rules-subset/index.html +96 -0
  671. package/dist/serve/docs-ui/docs/pyric-storage-reference-rules-subset.md +134 -0
  672. package/dist/serve/docs-ui/docs/pyric-storage-reference-storage-options/index.html +39 -0
  673. package/dist/serve/docs-ui/docs/pyric-storage-reference-storage-options.md +61 -0
  674. package/dist/serve/docs-ui/docs/pyric-storage.md +67 -0
  675. package/dist/serve/docs-ui/docs/pyric-ui-agents-reference-api/index.html +638 -0
  676. package/dist/serve/docs-ui/docs/pyric-ui-agents-reference-api.md +430 -0
  677. package/dist/serve/docs-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +813 -0
  678. package/dist/serve/docs-ui/docs/pyric-ui-auth-hooks-reference-api.md +634 -0
  679. package/dist/serve/docs-ui/docs/pyric-ui-auth-reference-api/index.html +1708 -0
  680. package/dist/serve/docs-ui/docs/pyric-ui-auth-reference-api.md +1300 -0
  681. package/dist/serve/docs-ui/docs/pyric-ui-events-hooks-reference-api/index.html +177 -0
  682. package/dist/serve/docs-ui/docs/pyric-ui-events-hooks-reference-api.md +111 -0
  683. package/dist/serve/docs-ui/docs/pyric-ui-events-reference-api/index.html +1542 -0
  684. package/dist/serve/docs-ui/docs/pyric-ui-events-reference-api.md +903 -0
  685. package/dist/serve/docs-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +1024 -0
  686. package/dist/serve/docs-ui/docs/pyric-ui-firestore-hooks-reference-api.md +640 -0
  687. package/dist/serve/docs-ui/docs/pyric-ui-firestore-reference-api/index.html +2753 -0
  688. package/dist/serve/docs-ui/docs/pyric-ui-firestore-reference-api.md +2171 -0
  689. package/dist/serve/docs-ui/docs/pyric-ui-primitives-reference-api/index.html +1005 -0
  690. package/dist/serve/docs-ui/docs/pyric-ui-primitives-reference-api.md +693 -0
  691. package/dist/serve/docs-ui/docs/pyric-ui-rtdb-reference-api/index.html +1388 -0
  692. package/dist/serve/docs-ui/docs/pyric-ui-rtdb-reference-api.md +1340 -0
  693. package/dist/serve/docs-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +131 -0
  694. package/dist/serve/docs-ui/docs/pyric-ui-rules-hooks-reference-api.md +76 -0
  695. package/dist/serve/docs-ui/docs/pyric-ui-rules-reference-api/index.html +648 -0
  696. package/dist/serve/docs-ui/docs/pyric-ui-rules-reference-api.md +508 -0
  697. package/dist/serve/docs-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +1457 -0
  698. package/dist/serve/docs-ui/docs/pyric-ui-storage-hooks-reference-api.md +1029 -0
  699. package/dist/serve/docs-ui/docs/pyric-ui-storage-reference-api/index.html +2476 -0
  700. package/dist/serve/docs-ui/docs/pyric-ui-storage-reference-api.md +1919 -0
  701. package/dist/serve/docs-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +1241 -0
  702. package/dist/serve/docs-ui/docs/pyric-ui-traffic-hooks-reference-api.md +817 -0
  703. package/dist/serve/docs-ui/docs/pyric-ui-traffic-reference-api/index.html +2289 -0
  704. package/dist/serve/docs-ui/docs/pyric-ui-traffic-reference-api.md +1489 -0
  705. package/dist/serve/docs-ui/docs/read-a-denial/index.html +40 -0
  706. package/dist/serve/docs-ui/docs/read-a-denial.md +62 -0
  707. package/dist/serve/docs-ui/docs/receive-messages/index.html +28 -0
  708. package/dist/serve/docs-ui/docs/receive-messages.md +43 -0
  709. package/dist/serve/docs-ui/docs/rtdb-rules-in-typescript/index.html +67 -0
  710. package/dist/serve/docs-ui/docs/rtdb-rules-in-typescript.md +101 -0
  711. package/dist/serve/docs-ui/docs/rules-patterns/index.html +68 -0
  712. package/dist/serve/docs-ui/docs/rules-patterns.md +104 -0
  713. package/dist/serve/docs-ui/docs/rules-standard-library/index.html +87 -0
  714. package/dist/serve/docs-ui/docs/rules-standard-library.md +93 -0
  715. package/dist/serve/docs-ui/docs/run-ai-logic-locally/index.html +27 -0
  716. package/dist/serve/docs-ui/docs/run-ai-logic-locally.md +43 -0
  717. package/dist/serve/docs-ui/docs/secure-it-with-rules/index.html +69 -0
  718. package/dist/serve/docs-ui/docs/secure-it-with-rules.md +101 -0
  719. package/dist/serve/docs-ui/docs/see-whats-happening/index.html +73 -0
  720. package/dist/serve/docs-ui/docs/see-whats-happening.md +77 -0
  721. package/dist/serve/docs-ui/docs/set-up-the-project/index.html +14 -0
  722. package/dist/serve/docs-ui/docs/set-up-the-project.md +19 -0
  723. package/dist/serve/docs-ui/docs/set-up-your-agent/index.html +42 -0
  724. package/dist/serve/docs-ui/docs/set-up-your-agent.md +86 -0
  725. package/dist/serve/docs-ui/docs/shape-your-data/index.html +44 -0
  726. package/dist/serve/docs-ui/docs/shape-your-data.md +88 -0
  727. package/dist/serve/docs-ui/docs/ship-to-production/index.html +36 -0
  728. package/dist/serve/docs-ui/docs/ship-to-production.md +80 -0
  729. package/dist/serve/docs-ui/docs/sign-in-and-manage-users/index.html +31 -0
  730. package/dist/serve/docs-ui/docs/sign-in-and-manage-users.md +50 -0
  731. package/dist/serve/docs-ui/docs/simulate-and-lint/index.html +95 -0
  732. package/dist/serve/docs-ui/docs/simulate-and-lint.md +99 -0
  733. package/dist/serve/docs-ui/docs/skills/index.html +20 -0
  734. package/dist/serve/docs-ui/docs/skills.md +34 -0
  735. package/dist/serve/docs-ui/docs/start-building/index.html +32 -0
  736. package/dist/serve/docs-ui/docs/start-building.md +64 -0
  737. package/dist/serve/docs-ui/docs/store-and-query-data/index.html +16 -0
  738. package/dist/serve/docs-ui/docs/store-and-query-data.md +33 -0
  739. package/dist/serve/docs-ui/docs/store-files/index.html +13 -0
  740. package/dist/serve/docs-ui/docs/store-files.md +25 -0
  741. package/dist/serve/docs-ui/docs/sync-realtime-data/index.html +15 -0
  742. package/dist/serve/docs-ui/docs/sync-realtime-data.md +27 -0
  743. package/dist/serve/docs-ui/docs/test-in-node/index.html +74 -0
  744. package/dist/serve/docs-ui/docs/test-in-node.md +100 -0
  745. package/dist/serve/docs-ui/docs/ui/index.html +76 -0
  746. package/dist/serve/docs-ui/docs/ui-auth-authsigninhelper/index.html +194 -0
  747. package/dist/serve/docs-ui/docs/ui-auth-authsigninhelper.md +114 -0
  748. package/dist/serve/docs-ui/docs/ui-auth-authusers/index.html +263 -0
  749. package/dist/serve/docs-ui/docs/ui-auth-authusers.md +183 -0
  750. package/dist/serve/docs-ui/docs/ui-firestore-collectionlist/index.html +92 -0
  751. package/dist/serve/docs-ui/docs/ui-firestore-collectionlist.md +79 -0
  752. package/dist/serve/docs-ui/docs/ui-firestore-deletewithconfirm/index.html +128 -0
  753. package/dist/serve/docs-ui/docs/ui-firestore-deletewithconfirm.md +104 -0
  754. package/dist/serve/docs-ui/docs/ui-firestore-documenteditor/index.html +154 -0
  755. package/dist/serve/docs-ui/docs/ui-firestore-documenteditor.md +117 -0
  756. package/dist/serve/docs-ui/docs/ui-firestore-documentlist/index.html +132 -0
  757. package/dist/serve/docs-ui/docs/ui-firestore-documentlist.md +92 -0
  758. package/dist/serve/docs-ui/docs/ui-firestore-documentpreview/index.html +159 -0
  759. package/dist/serve/docs-ui/docs/ui-firestore-documentpreview.md +84 -0
  760. package/dist/serve/docs-ui/docs/ui-firestore-querybuilder/index.html +104 -0
  761. package/dist/serve/docs-ui/docs/ui-firestore-querybuilder.md +103 -0
  762. package/dist/serve/docs-ui/docs/ui-firestore-referencepicker/index.html +113 -0
  763. package/dist/serve/docs-ui/docs/ui-firestore-referencepicker.md +93 -0
  764. package/dist/serve/docs-ui/docs/ui-primitives-badge/index.html +56 -0
  765. package/dist/serve/docs-ui/docs/ui-primitives-badge.md +40 -0
  766. package/dist/serve/docs-ui/docs/ui-primitives-confirmdialog/index.html +140 -0
  767. package/dist/serve/docs-ui/docs/ui-primitives-confirmdialog.md +108 -0
  768. package/dist/serve/docs-ui/docs/ui-primitives-copybutton/index.html +58 -0
  769. package/dist/serve/docs-ui/docs/ui-primitives-copybutton.md +37 -0
  770. package/dist/serve/docs-ui/docs/ui-primitives-jsonview/index.html +58 -0
  771. package/dist/serve/docs-ui/docs/ui-primitives-jsonview.md +47 -0
  772. package/dist/serve/docs-ui/docs/ui-primitives-segmentedcontrol/index.html +70 -0
  773. package/dist/serve/docs-ui/docs/ui-primitives-segmentedcontrol.md +50 -0
  774. package/dist/serve/docs-ui/docs/ui-primitives-toast/index.html +87 -0
  775. package/dist/serve/docs-ui/docs/ui-primitives-toast.md +82 -0
  776. package/dist/serve/docs-ui/docs/ui-primitives-virtuallist/index.html +85 -0
  777. package/dist/serve/docs-ui/docs/ui-primitives-virtuallist.md +54 -0
  778. package/dist/serve/docs-ui/docs/ui-storage/index.html +150 -0
  779. package/dist/serve/docs-ui/docs/ui-storage-deleteselectionwithconfirm/index.html +126 -0
  780. package/dist/serve/docs-ui/docs/ui-storage-deleteselectionwithconfirm.md +88 -0
  781. package/dist/serve/docs-ui/docs/ui-storage-objectbrowser/index.html +137 -0
  782. package/dist/serve/docs-ui/docs/ui-storage-objectbrowser.md +90 -0
  783. package/dist/serve/docs-ui/docs/ui-storage-objectinspector/index.html +139 -0
  784. package/dist/serve/docs-ui/docs/ui-storage-objectinspector.md +93 -0
  785. package/dist/serve/docs-ui/docs/ui-storage-pathbreadcrumb/index.html +72 -0
  786. package/dist/serve/docs-ui/docs/ui-storage-pathbreadcrumb.md +57 -0
  787. package/dist/serve/docs-ui/docs/ui-storage-rules-aware-affordances/index.html +60 -0
  788. package/dist/serve/docs-ui/docs/ui-storage-rules-aware-affordances.md +52 -0
  789. package/dist/serve/docs-ui/docs/ui-storage-uploaddropzone/index.html +93 -0
  790. package/dist/serve/docs-ui/docs/ui-storage-uploaddropzone.md +78 -0
  791. package/dist/serve/docs-ui/docs/ui-storage-usestoragerulesgate/index.html +144 -0
  792. package/dist/serve/docs-ui/docs/ui-storage-usestoragerulesgate.md +101 -0
  793. package/dist/serve/docs-ui/docs/ui-storage.md +165 -0
  794. package/dist/serve/docs-ui/docs/ui-traffic/index.html +88 -0
  795. package/dist/serve/docs-ui/docs/ui-traffic-ruleheatmap/index.html +79 -0
  796. package/dist/serve/docs-ui/docs/ui-traffic-ruleheatmap.md +60 -0
  797. package/dist/serve/docs-ui/docs/ui-traffic-trafficdetail/index.html +78 -0
  798. package/dist/serve/docs-ui/docs/ui-traffic-trafficdetail.md +59 -0
  799. package/dist/serve/docs-ui/docs/ui-traffic-trafficlog/index.html +118 -0
  800. package/dist/serve/docs-ui/docs/ui-traffic-trafficlog.md +69 -0
  801. package/dist/serve/docs-ui/docs/ui-traffic-trafficstats/index.html +51 -0
  802. package/dist/serve/docs-ui/docs/ui-traffic-trafficstats.md +46 -0
  803. package/dist/serve/docs-ui/docs/ui-traffic.md +102 -0
  804. package/dist/serve/docs-ui/docs/ui.md +90 -0
  805. package/dist/serve/docs-ui/docs/watch-and-review/index.html +25 -0
  806. package/dist/serve/docs-ui/docs/watch-and-review.md +40 -0
  807. package/dist/serve/docs-ui/docs/what-your-agent-can-do/index.html +81 -0
  808. package/dist/serve/docs-ui/docs/what-your-agent-can-do.md +78 -0
  809. package/dist/serve/docs-ui/docs/whats-experimental/index.html +22 -0
  810. package/dist/serve/docs-ui/docs/whats-experimental.md +33 -0
  811. package/dist/serve/docs-ui/docs/whats-possible/index.html +63 -0
  812. package/dist/serve/docs-ui/docs/whats-possible.md +53 -0
  813. package/dist/serve/docs-ui/docs/which-data-service/index.html +8 -0
  814. package/dist/serve/docs-ui/docs/which-data-service.md +11 -0
  815. package/dist/serve/docs-ui/docs/write-a-rules-test-suite/index.html +85 -0
  816. package/dist/serve/docs-ui/docs/write-a-rules-test-suite.md +119 -0
  817. package/dist/serve/docs-ui/index.html +1 -0
  818. package/dist/serve/docs-ui/llms.txt +308 -0
  819. package/dist/serve/entries/ai.d.ts +4 -0
  820. package/dist/serve/entries/ai.d.ts.map +1 -0
  821. package/dist/serve/entries/ai.js +184 -0
  822. package/dist/serve/entries/ai.js.map +1 -0
  823. package/dist/serve/entries/app-backend.d.ts +2 -0
  824. package/dist/serve/entries/app-backend.d.ts.map +1 -0
  825. package/dist/serve/entries/app-backend.js +4 -0
  826. package/dist/serve/entries/app-backend.js.map +1 -0
  827. package/dist/serve/entries/app-client.d.ts +5 -0
  828. package/dist/serve/entries/app-client.d.ts.map +1 -0
  829. package/dist/serve/entries/app-client.js +23 -0
  830. package/dist/serve/entries/app-client.js.map +1 -0
  831. package/dist/serve/entries/app-session-store.d.ts +14 -0
  832. package/dist/serve/entries/app-session-store.d.ts.map +1 -0
  833. package/dist/serve/entries/app-session-store.js +37 -0
  834. package/dist/serve/entries/app-session-store.js.map +1 -0
  835. package/dist/serve/entries/app.d.ts +2 -0
  836. package/dist/serve/entries/app.d.ts.map +1 -0
  837. package/dist/serve/entries/app.js +10 -0
  838. package/dist/serve/entries/app.js.map +1 -0
  839. package/dist/serve/entries/auth-helper-core.d.ts +52 -0
  840. package/dist/serve/entries/auth-helper-core.d.ts.map +1 -0
  841. package/dist/serve/entries/auth-helper-core.js +118 -0
  842. package/dist/serve/entries/auth-helper-core.js.map +1 -0
  843. package/dist/serve/entries/auth-helper-dom.d.ts +14 -0
  844. package/dist/serve/entries/auth-helper-dom.d.ts.map +1 -0
  845. package/dist/serve/entries/auth-helper-dom.js +116 -0
  846. package/dist/serve/entries/auth-helper-dom.js.map +1 -0
  847. package/dist/serve/entries/auth-helper-runtime.d.ts +5 -0
  848. package/dist/serve/entries/auth-helper-runtime.d.ts.map +1 -0
  849. package/dist/serve/entries/auth-helper-runtime.js +11 -0
  850. package/dist/serve/entries/auth-helper-runtime.js.map +1 -0
  851. package/dist/serve/entries/auth.d.ts +77 -0
  852. package/dist/serve/entries/auth.d.ts.map +1 -0
  853. package/dist/serve/entries/auth.js +201 -0
  854. package/dist/serve/entries/auth.js.map +1 -0
  855. package/dist/serve/entries/bridge-url.d.ts +25 -0
  856. package/dist/serve/entries/bridge-url.d.ts.map +1 -0
  857. package/dist/serve/entries/bridge-url.js +30 -0
  858. package/dist/serve/entries/bridge-url.js.map +1 -0
  859. package/dist/serve/entries/database.d.ts +46 -0
  860. package/dist/serve/entries/database.d.ts.map +1 -0
  861. package/dist/serve/entries/database.js +80 -0
  862. package/dist/serve/entries/database.js.map +1 -0
  863. package/dist/serve/entries/firestore.d.ts +104 -0
  864. package/dist/serve/entries/firestore.d.ts.map +1 -0
  865. package/dist/serve/entries/firestore.js +202 -0
  866. package/dist/serve/entries/firestore.js.map +1 -0
  867. package/dist/serve/entries/init.d.ts +2 -0
  868. package/dist/serve/entries/init.d.ts.map +1 -0
  869. package/dist/serve/entries/init.js +40 -0
  870. package/dist/serve/entries/init.js.map +1 -0
  871. package/dist/serve/entries/keepalive.d.ts +20 -0
  872. package/dist/serve/entries/keepalive.d.ts.map +1 -0
  873. package/dist/serve/entries/keepalive.js +38 -0
  874. package/dist/serve/entries/keepalive.js.map +1 -0
  875. package/dist/serve/entries/messaging-sw.d.ts +10 -0
  876. package/dist/serve/entries/messaging-sw.d.ts.map +1 -0
  877. package/dist/serve/entries/messaging-sw.js +36 -0
  878. package/dist/serve/entries/messaging-sw.js.map +1 -0
  879. package/dist/serve/entries/messaging.d.ts +11 -0
  880. package/dist/serve/entries/messaging.d.ts.map +1 -0
  881. package/dist/serve/entries/messaging.js +53 -0
  882. package/dist/serve/entries/messaging.js.map +1 -0
  883. package/dist/serve/entries/runtime.d.ts +46 -0
  884. package/dist/serve/entries/runtime.d.ts.map +1 -0
  885. package/dist/serve/entries/runtime.js +435 -0
  886. package/dist/serve/entries/runtime.js.map +1 -0
  887. package/dist/serve/entries/session-store.d.ts +48 -0
  888. package/dist/serve/entries/session-store.d.ts.map +1 -0
  889. package/dist/serve/entries/session-store.js +82 -0
  890. package/dist/serve/entries/session-store.js.map +1 -0
  891. package/dist/serve/entries/storage.d.ts +25 -0
  892. package/dist/serve/entries/storage.d.ts.map +1 -0
  893. package/dist/serve/entries/storage.js +61 -0
  894. package/dist/serve/entries/storage.js.map +1 -0
  895. package/dist/serve/entries/tab-sync-wiring.d.ts +88 -0
  896. package/dist/serve/entries/tab-sync-wiring.d.ts.map +1 -0
  897. package/dist/serve/entries/tab-sync-wiring.js +217 -0
  898. package/dist/serve/entries/tab-sync-wiring.js.map +1 -0
  899. package/dist/serve/entries/worker-runtime.d.ts +10 -0
  900. package/dist/serve/entries/worker-runtime.d.ts.map +1 -0
  901. package/dist/serve/entries/worker-runtime.js +59 -0
  902. package/dist/serve/entries/worker-runtime.js.map +1 -0
  903. package/dist/serve/init-payload.d.ts +21 -0
  904. package/dist/serve/init-payload.d.ts.map +1 -0
  905. package/dist/serve/init-payload.js +2 -0
  906. package/dist/serve/init-payload.js.map +1 -0
  907. package/dist/serve/namespace.d.ts +73 -0
  908. package/dist/serve/namespace.d.ts.map +1 -0
  909. package/dist/serve/namespace.js +470 -0
  910. package/dist/serve/namespace.js.map +1 -0
  911. package/dist/serve/open-browser.d.ts +23 -0
  912. package/dist/serve/open-browser.d.ts.map +1 -0
  913. package/dist/serve/open-browser.js +58 -0
  914. package/dist/serve/open-browser.js.map +1 -0
  915. package/dist/serve/rules.d.ts +77 -0
  916. package/dist/serve/rules.d.ts.map +1 -0
  917. package/dist/serve/rules.js +202 -0
  918. package/dist/serve/rules.js.map +1 -0
  919. package/dist/serve/sandbox-marker.d.ts +9 -0
  920. package/dist/serve/sandbox-marker.d.ts.map +1 -0
  921. package/dist/serve/sandbox-marker.js +31 -0
  922. package/dist/serve/sandbox-marker.js.map +1 -0
  923. package/dist/serve/server.d.ts +135 -0
  924. package/dist/serve/server.d.ts.map +1 -0
  925. package/dist/serve/server.js +328 -0
  926. package/dist/serve/server.js.map +1 -0
  927. package/dist/serve/standalone-assets.d.ts +67 -0
  928. package/dist/serve/standalone-assets.d.ts.map +1 -0
  929. package/dist/serve/standalone-assets.js +134 -0
  930. package/dist/serve/standalone-assets.js.map +1 -0
  931. package/dist/serve/state-store.d.ts +45 -0
  932. package/dist/serve/state-store.d.ts.map +1 -0
  933. package/dist/serve/state-store.js +120 -0
  934. package/dist/serve/state-store.js.map +1 -0
  935. package/dist/serve/studio/disk-project-store.d.ts +9 -0
  936. package/dist/serve/studio/disk-project-store.d.ts.map +1 -0
  937. package/dist/serve/studio/disk-project-store.js +173 -0
  938. package/dist/serve/studio/disk-project-store.js.map +1 -0
  939. package/dist/serve/studio/disk-workspace.d.ts +14 -0
  940. package/dist/serve/studio/disk-workspace.d.ts.map +1 -0
  941. package/dist/serve/studio/disk-workspace.js +152 -0
  942. package/dist/serve/studio/disk-workspace.js.map +1 -0
  943. package/dist/serve/studio/index.d.ts +10 -0
  944. package/dist/serve/studio/index.d.ts.map +1 -0
  945. package/dist/serve/studio/index.js +9 -0
  946. package/dist/serve/studio/index.js.map +1 -0
  947. package/dist/serve/studio/routes.d.ts +40 -0
  948. package/dist/serve/studio/routes.d.ts.map +1 -0
  949. package/dist/serve/studio/routes.js +182 -0
  950. package/dist/serve/studio/routes.js.map +1 -0
  951. package/dist/serve/studio/store-types.d.ts +45 -0
  952. package/dist/serve/studio/store-types.d.ts.map +1 -0
  953. package/dist/serve/studio/store-types.js +11 -0
  954. package/dist/serve/studio/store-types.js.map +1 -0
  955. package/dist/serve/studio-ui/assets/RulesCodeEditor-BZpD57II.js +23 -0
  956. package/dist/serve/studio-ui/assets/index-Bsa-TQNK.css +1 -0
  957. package/dist/serve/studio-ui/assets/index-DGaVuOhE.js +1211 -0
  958. package/dist/serve/studio-ui/assets/seed-CTmn6YuO.js +2 -0
  959. package/dist/serve/studio-ui/index.html +32 -0
  960. package/dist/serve/studio-ui/pyric-logo.svg +76 -0
  961. package/dist/serve/vite-plugin.d.ts +57 -0
  962. package/dist/serve/vite-plugin.d.ts.map +1 -0
  963. package/dist/serve/vite-plugin.js +658 -0
  964. package/dist/serve/vite-plugin.js.map +1 -0
  965. package/dist/serve/worker/client/admin-firestore.d.ts +18 -0
  966. package/dist/serve/worker/client/admin-firestore.d.ts.map +1 -0
  967. package/dist/serve/worker/client/admin-firestore.js +26 -0
  968. package/dist/serve/worker/client/admin-firestore.js.map +1 -0
  969. package/dist/serve/worker/client/ai.d.ts +31 -0
  970. package/dist/serve/worker/client/ai.d.ts.map +1 -0
  971. package/dist/serve/worker/client/ai.js +89 -0
  972. package/dist/serve/worker/client/ai.js.map +1 -0
  973. package/dist/serve/worker/client/auth.d.ts +168 -0
  974. package/dist/serve/worker/client/auth.d.ts.map +1 -0
  975. package/dist/serve/worker/client/auth.js +322 -0
  976. package/dist/serve/worker/client/auth.js.map +1 -0
  977. package/dist/serve/worker/client/connection.d.ts +80 -0
  978. package/dist/serve/worker/client/connection.d.ts.map +1 -0
  979. package/dist/serve/worker/client/connection.js +148 -0
  980. package/dist/serve/worker/client/connection.js.map +1 -0
  981. package/dist/serve/worker/client/core.d.ts +109 -0
  982. package/dist/serve/worker/client/core.d.ts.map +1 -0
  983. package/dist/serve/worker/client/core.js +248 -0
  984. package/dist/serve/worker/client/core.js.map +1 -0
  985. package/dist/serve/worker/client/disconnect.d.ts +7 -0
  986. package/dist/serve/worker/client/disconnect.d.ts.map +1 -0
  987. package/dist/serve/worker/client/disconnect.js +26 -0
  988. package/dist/serve/worker/client/disconnect.js.map +1 -0
  989. package/dist/serve/worker/client/firestore-reads.d.ts +49 -0
  990. package/dist/serve/worker/client/firestore-reads.d.ts.map +1 -0
  991. package/dist/serve/worker/client/firestore-reads.js +139 -0
  992. package/dist/serve/worker/client/firestore-reads.js.map +1 -0
  993. package/dist/serve/worker/client/firestore-refs.d.ts +54 -0
  994. package/dist/serve/worker/client/firestore-refs.d.ts.map +1 -0
  995. package/dist/serve/worker/client/firestore-refs.js +167 -0
  996. package/dist/serve/worker/client/firestore-refs.js.map +1 -0
  997. package/dist/serve/worker/client/firestore-writes.d.ts +70 -0
  998. package/dist/serve/worker/client/firestore-writes.d.ts.map +1 -0
  999. package/dist/serve/worker/client/firestore-writes.js +169 -0
  1000. package/dist/serve/worker/client/firestore-writes.js.map +1 -0
  1001. package/dist/serve/worker/client/handles.d.ts +73 -0
  1002. package/dist/serve/worker/client/handles.d.ts.map +1 -0
  1003. package/dist/serve/worker/client/handles.js +4 -0
  1004. package/dist/serve/worker/client/handles.js.map +1 -0
  1005. package/dist/serve/worker/client/messaging.d.ts +16 -0
  1006. package/dist/serve/worker/client/messaging.d.ts.map +1 -0
  1007. package/dist/serve/worker/client/messaging.js +60 -0
  1008. package/dist/serve/worker/client/messaging.js.map +1 -0
  1009. package/dist/serve/worker/client/presence.d.ts +43 -0
  1010. package/dist/serve/worker/client/presence.d.ts.map +1 -0
  1011. package/dist/serve/worker/client/presence.js +132 -0
  1012. package/dist/serve/worker/client/presence.js.map +1 -0
  1013. package/dist/serve/worker/client/rtdb.d.ts +36 -0
  1014. package/dist/serve/worker/client/rtdb.d.ts.map +1 -0
  1015. package/dist/serve/worker/client/rtdb.js +241 -0
  1016. package/dist/serve/worker/client/rtdb.js.map +1 -0
  1017. package/dist/serve/worker/client/rules.d.ts +24 -0
  1018. package/dist/serve/worker/client/rules.d.ts.map +1 -0
  1019. package/dist/serve/worker/client/rules.js +44 -0
  1020. package/dist/serve/worker/client/rules.js.map +1 -0
  1021. package/dist/serve/worker/client/service-worker-connection.d.ts +3 -0
  1022. package/dist/serve/worker/client/service-worker-connection.d.ts.map +1 -0
  1023. package/dist/serve/worker/client/service-worker-connection.js +53 -0
  1024. package/dist/serve/worker/client/service-worker-connection.js.map +1 -0
  1025. package/dist/serve/worker/client/snapshots.d.ts +32 -0
  1026. package/dist/serve/worker/client/snapshots.d.ts.map +1 -0
  1027. package/dist/serve/worker/client/snapshots.js +46 -0
  1028. package/dist/serve/worker/client/snapshots.js.map +1 -0
  1029. package/dist/serve/worker/client/storage.d.ts +64 -0
  1030. package/dist/serve/worker/client/storage.d.ts.map +1 -0
  1031. package/dist/serve/worker/client/storage.js +125 -0
  1032. package/dist/serve/worker/client/storage.js.map +1 -0
  1033. package/dist/serve/worker/client/studio.d.ts +32 -0
  1034. package/dist/serve/worker/client/studio.d.ts.map +1 -0
  1035. package/dist/serve/worker/client/studio.js +61 -0
  1036. package/dist/serve/worker/client/studio.js.map +1 -0
  1037. package/dist/serve/worker/client.d.ts +43 -0
  1038. package/dist/serve/worker/client.d.ts.map +1 -0
  1039. package/dist/serve/worker/client.js +44 -0
  1040. package/dist/serve/worker/client.js.map +1 -0
  1041. package/dist/serve/worker/entry.d.ts +40 -0
  1042. package/dist/serve/worker/entry.d.ts.map +1 -0
  1043. package/dist/serve/worker/entry.js +144 -0
  1044. package/dist/serve/worker/entry.js.map +1 -0
  1045. package/dist/serve/worker/host/admin-firestore.d.ts +17 -0
  1046. package/dist/serve/worker/host/admin-firestore.d.ts.map +1 -0
  1047. package/dist/serve/worker/host/admin-firestore.js +92 -0
  1048. package/dist/serve/worker/host/admin-firestore.js.map +1 -0
  1049. package/dist/serve/worker/host/connection.d.ts +40 -0
  1050. package/dist/serve/worker/host/connection.d.ts.map +1 -0
  1051. package/dist/serve/worker/host/connection.js +153 -0
  1052. package/dist/serve/worker/host/connection.js.map +1 -0
  1053. package/dist/serve/worker/host/core.d.ts +159 -0
  1054. package/dist/serve/worker/host/core.d.ts.map +1 -0
  1055. package/dist/serve/worker/host/core.js +296 -0
  1056. package/dist/serve/worker/host/core.js.map +1 -0
  1057. package/dist/serve/worker/host/dispatch.d.ts +34 -0
  1058. package/dist/serve/worker/host/dispatch.d.ts.map +1 -0
  1059. package/dist/serve/worker/host/dispatch.js +267 -0
  1060. package/dist/serve/worker/host/dispatch.js.map +1 -0
  1061. package/dist/serve/worker/host/firestore-reads.d.ts +17 -0
  1062. package/dist/serve/worker/host/firestore-reads.d.ts.map +1 -0
  1063. package/dist/serve/worker/host/firestore-reads.js +108 -0
  1064. package/dist/serve/worker/host/firestore-reads.js.map +1 -0
  1065. package/dist/serve/worker/host/firestore-writes.d.ts +37 -0
  1066. package/dist/serve/worker/host/firestore-writes.d.ts.map +1 -0
  1067. package/dist/serve/worker/host/firestore-writes.js +409 -0
  1068. package/dist/serve/worker/host/firestore-writes.js.map +1 -0
  1069. package/dist/serve/worker/host/presence.d.ts +38 -0
  1070. package/dist/serve/worker/host/presence.d.ts.map +1 -0
  1071. package/dist/serve/worker/host/presence.js +280 -0
  1072. package/dist/serve/worker/host/presence.js.map +1 -0
  1073. package/dist/serve/worker/host/rtdb.d.ts +18 -0
  1074. package/dist/serve/worker/host/rtdb.d.ts.map +1 -0
  1075. package/dist/serve/worker/host/rtdb.js +128 -0
  1076. package/dist/serve/worker/host/rtdb.js.map +1 -0
  1077. package/dist/serve/worker/host/rules.d.ts +17 -0
  1078. package/dist/serve/worker/host/rules.d.ts.map +1 -0
  1079. package/dist/serve/worker/host/rules.js +118 -0
  1080. package/dist/serve/worker/host/rules.js.map +1 -0
  1081. package/dist/serve/worker/host/storage.d.ts +19 -0
  1082. package/dist/serve/worker/host/storage.d.ts.map +1 -0
  1083. package/dist/serve/worker/host/storage.js +260 -0
  1084. package/dist/serve/worker/host/storage.js.map +1 -0
  1085. package/dist/serve/worker/host/studio.d.ts +13 -0
  1086. package/dist/serve/worker/host/studio.d.ts.map +1 -0
  1087. package/dist/serve/worker/host/studio.js +30 -0
  1088. package/dist/serve/worker/host/studio.js.map +1 -0
  1089. package/dist/serve/worker/host/subscriptions.d.ts +21 -0
  1090. package/dist/serve/worker/host/subscriptions.d.ts.map +1 -0
  1091. package/dist/serve/worker/host/subscriptions.js +162 -0
  1092. package/dist/serve/worker/host/subscriptions.js.map +1 -0
  1093. package/dist/serve/worker/host-ai.d.ts +59 -0
  1094. package/dist/serve/worker/host-ai.d.ts.map +1 -0
  1095. package/dist/serve/worker/host-ai.js +158 -0
  1096. package/dist/serve/worker/host-ai.js.map +1 -0
  1097. package/dist/serve/worker/host-auth.d.ts +47 -0
  1098. package/dist/serve/worker/host-auth.d.ts.map +1 -0
  1099. package/dist/serve/worker/host-auth.js +464 -0
  1100. package/dist/serve/worker/host-auth.js.map +1 -0
  1101. package/dist/serve/worker/host-context.d.ts +220 -0
  1102. package/dist/serve/worker/host-context.d.ts.map +1 -0
  1103. package/dist/serve/worker/host-context.js +45 -0
  1104. package/dist/serve/worker/host-context.js.map +1 -0
  1105. package/dist/serve/worker/host-events.d.ts +21 -0
  1106. package/dist/serve/worker/host-events.d.ts.map +1 -0
  1107. package/dist/serve/worker/host-events.js +87 -0
  1108. package/dist/serve/worker/host-events.js.map +1 -0
  1109. package/dist/serve/worker/host-messaging.d.ts +60 -0
  1110. package/dist/serve/worker/host-messaging.d.ts.map +1 -0
  1111. package/dist/serve/worker/host-messaging.js +226 -0
  1112. package/dist/serve/worker/host-messaging.js.map +1 -0
  1113. package/dist/serve/worker/host.d.ts +36 -0
  1114. package/dist/serve/worker/host.d.ts.map +1 -0
  1115. package/dist/serve/worker/host.js +39 -0
  1116. package/dist/serve/worker/host.js.map +1 -0
  1117. package/dist/serve/worker/index.d.ts +22 -0
  1118. package/dist/serve/worker/index.d.ts.map +1 -0
  1119. package/dist/serve/worker/index.js +61 -0
  1120. package/dist/serve/worker/index.js.map +1 -0
  1121. package/dist/serve/worker/presence-timing.d.ts +14 -0
  1122. package/dist/serve/worker/presence-timing.d.ts.map +1 -0
  1123. package/dist/serve/worker/presence-timing.js +14 -0
  1124. package/dist/serve/worker/presence-timing.js.map +1 -0
  1125. package/dist/serve/worker/protocol.d.ts +1150 -0
  1126. package/dist/serve/worker/protocol.d.ts.map +1 -0
  1127. package/dist/serve/worker/protocol.js +228 -0
  1128. package/dist/serve/worker/protocol.js.map +1 -0
  1129. package/dist/serve/worker/serve-init.d.ts +201 -0
  1130. package/dist/serve/worker/serve-init.d.ts.map +1 -0
  1131. package/dist/serve/worker/serve-init.js +579 -0
  1132. package/dist/serve/worker/serve-init.js.map +1 -0
  1133. package/dist/serve/worker/service-worker-channel.d.ts +23 -0
  1134. package/dist/serve/worker/service-worker-channel.d.ts.map +1 -0
  1135. package/dist/serve/worker/service-worker-channel.js +9 -0
  1136. package/dist/serve/worker/service-worker-channel.js.map +1 -0
  1137. package/dist/serve/worker/service-worker-relay.d.ts +22 -0
  1138. package/dist/serve/worker/service-worker-relay.d.ts.map +1 -0
  1139. package/dist/serve/worker/service-worker-relay.js +63 -0
  1140. package/dist/serve/worker/service-worker-relay.js.map +1 -0
  1141. package/dist/serve/writer-lock.d.ts +32 -0
  1142. package/dist/serve/writer-lock.d.ts.map +1 -0
  1143. package/dist/serve/writer-lock.js +43 -0
  1144. package/dist/serve/writer-lock.js.map +1 -0
  1145. package/dist/verify/cases.d.ts +37 -0
  1146. package/dist/verify/cases.d.ts.map +1 -0
  1147. package/dist/verify/cases.js +173 -0
  1148. package/dist/verify/cases.js.map +1 -0
  1149. package/dist/verify/fixture.d.ts +100 -0
  1150. package/dist/verify/fixture.d.ts.map +1 -0
  1151. package/dist/verify/fixture.js +156 -0
  1152. package/dist/verify/fixture.js.map +1 -0
  1153. package/dist/verify/index.d.ts +102 -0
  1154. package/dist/verify/index.d.ts.map +1 -0
  1155. package/dist/verify/index.js +318 -0
  1156. package/dist/verify/index.js.map +1 -0
  1157. package/dist/verify/tools.d.ts +7 -0
  1158. package/dist/verify/tools.d.ts.map +1 -0
  1159. package/dist/verify/tools.js +83 -0
  1160. package/dist/verify/tools.js.map +1 -0
  1161. package/dist/version/compat-target.d.ts +18 -0
  1162. package/dist/version/compat-target.d.ts.map +1 -0
  1163. package/dist/version/compat-target.js +18 -0
  1164. package/dist/version/compat-target.js.map +1 -0
  1165. package/dist/vite.d.ts +12 -0
  1166. package/dist/vite.d.ts.map +1 -0
  1167. package/dist/vite.js +16 -0
  1168. package/dist/vite.js.map +1 -0
  1169. package/package.json +133 -0
@@ -0,0 +1,2629 @@
1
+ <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>API reference: pyric/rules · Pyric Studio</title><meta name="description" content="Published declarations for pyric/rules."><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet"><link rel="stylesheet" href="/__pyric/ui/_astro/_slug_.CQYSemvw.css"></head> <body> <header class="studio__bar"> <div class="studio__bar-inner"> <a class="studio__brand" href="/__pyric/ui/" aria-label="Pyric Studio">Pyric</a> <nav class="studio__nav" aria-label="Studio tabs"> <a class="studio__nav-tab" href="/__pyric/ui/"> Home </a><a class="studio__nav-tab" href="/__pyric/ui/firestore"> Firestore </a><a class="studio__nav-tab" href="/__pyric/ui/auth"> Auth </a><a class="studio__nav-tab" href="/__pyric/ui/rtdb"> RTDB </a><a class="studio__nav-tab" href="/__pyric/ui/storage"> Storage </a><a class="studio__nav-tab" href="/__pyric/ui/traffic"> Traffic </a><a class="studio__nav-tab" href="/__pyric/ui/settings"> Settings </a><a class="studio__nav-tab" href="/__pyric/ui/docs" aria-current="page"> Docs </a> </nav> </div> </header> <div class="docs-shell"> <details class="docs-nav-drawer"> <summary>Navigate</summary> <nav class="docs-nav" aria-label="Documentation"> <div class="docs-search" data-index-url="/__pyric/ui/docs/index.json"> <div class="docs-search-field"> <svg class="docs-search-icon" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"> <path d="M11.5 11.5 15 15M13 7A6 6 0 1 1 1 7a6 6 0 0 1 12 0Z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></path> </svg> <input type="text" class="docs-search-input" placeholder="Search docs" aria-label="Search docs" autocomplete="off" spellcheck="false"> <kbd class="docs-search-kbd">⌘K</kbd> </div> <ul class="docs-search-results" hidden></ul> </div> <script type="module">let i=null;function d(t){return i||(i=fetch(t).then(e=>e.json())),i}function l(t,e){return t.title.toLowerCase().includes(e)||t.excerpt.toLowerCase().includes(e)?!0:t.headings.some(r=>r.text.toLowerCase().includes(e))}function u(t,e,r){if(e.innerHTML="",t.length===0){e.hidden=!1;{const n=document.createElement("li");n.className="docs-search-empty",n.textContent="No matches",e.appendChild(n)}return}e.hidden=!1;for(const n of t.slice(0,8)){const s=document.createElement("li"),c=document.createElement("a");c.href=n.path;const o=document.createElement("span");o.className="docs-search-result-title",o.textContent=n.title;const a=document.createElement("span");a.className="docs-search-result-meta",a.textContent=[n.group,n.section].filter(Boolean).join(" / "),c.append(o,a),s.appendChild(c),e.appendChild(s)}}document.querySelectorAll(".docs-search").forEach(t=>{const e=t.dataset.indexUrl,r=t.querySelector(".docs-search-input"),n=t.querySelector(".docs-search-results");r.addEventListener("input",async()=>{const s=r.value.trim().toLowerCase();if(!s){n.hidden=!0,n.innerHTML="";return}const{pages:c}=await d(e);r.value.trim().toLowerCase()===s&&u(c.filter(o=>l(o,s)),n)}),r.addEventListener("focus",()=>{d(e),n.childElementCount>0&&(n.hidden=!1)}),r.addEventListener("keydown",s=>{s.key==="Escape"&&(r.value="",n.hidden=!0,n.innerHTML="",r.blur())}),r.addEventListener("blur",()=>{window.setTimeout(()=>{n.hidden=!0},150)})});document.addEventListener("keydown",t=>{if(!(t.metaKey||t.ctrlKey)||t.key.toLowerCase()!=="k")return;const e=[...document.querySelectorAll(".docs-search-input")].find(r=>r.offsetParent!==null);e&&(t.preventDefault(),e.focus(),e.select())});</script> <a class="docs-nav-toplink" href="/__pyric/ui/docs/overview/"> Overview </a><details class="docs-nav-group"> <summary>Run locally</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/start-building/"> Quickstart </a> </li><li> <a href="/__pyric/ui/docs/how-the-swap-works/"> How the swap works </a> </li><li> <a href="/__pyric/ui/docs/set-up-your-agent/"> Connect an agent </a> </li><li> <a href="/__pyric/ui/docs/test-in-node/"> Test in Node </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Develop with Firebase APIs</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/sign-in-and-manage-users/"> Sign in and manage users </a> </li><li> <a href="/__pyric/ui/docs/store-and-query-data/"> Store and query data </a> </li><li> <a href="/__pyric/ui/docs/sync-realtime-data/"> Sync realtime data </a> </li><li> <a href="/__pyric/ui/docs/store-files/"> Store files </a> </li><li> <a href="/__pyric/ui/docs/receive-messages/"> Receive messages </a> </li><li> <a href="/__pyric/ui/docs/run-ai-logic-locally/"> Run AI Logic locally </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-how-to-run-rtdb-onvaluecreated/"> Run an RTDB function locally </a> </li><li> <a href="/__pyric/ui/docs/which-data-service/"> Which data service? </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Inspect and correct</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <h2 class="docs-nav-heading"> Inspect the sandbox </h2> <ul> <li> <a href="/__pyric/ui/docs/see-whats-happening/"> Traffic &amp; rule verdicts </a> </li><li> <a href="/__pyric/ui/docs/read-a-denial/"> Read a denial and understand it </a> </li><li> <a href="/__pyric/ui/docs/shape-your-data/"> Seed, snapshot, replay </a> </li><li> <a href="/__pyric/ui/docs/watch-and-review/"> Review agent activity </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading"> Correct Security Rules </h2> <ul> <li> <a href="/__pyric/ui/docs/secure-it-with-rules/"> Security Rules </a> </li><li> <a href="/__pyric/ui/docs/simulate-and-lint/"> Simulate and lint before you deploy </a> </li><li> <a href="/__pyric/ui/docs/rules-patterns/"> Rules patterns </a> </li><li> <a href="/__pyric/ui/docs/rules-standard-library/"> The rules standard library </a> </li><li> <a href="/__pyric/ui/docs/rtdb-rules-in-typescript/"> RTDB rules in TypeScript </a> </li><li> <a href="/__pyric/ui/docs/firestore-rules-limits/"> Rules limits </a> </li><li> <a href="/__pyric/ui/docs/whats-possible/"> Case studies </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading"> Work with an agent </h2> <ul> <li> <a href="/__pyric/ui/docs/what-your-agent-can-do/"> Work through an agent </a> </li><li> <a href="/__pyric/ui/docs/skills/"> Agent skills </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Verify the boundary</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli-how-to-verify-against-a-captured-session/"> Verify a captured session </a> </li><li> <a href="/__pyric/ui/docs/write-a-rules-test-suite/"> Write a rules test suite </a> </li><li> <a href="/__pyric/ui/docs/audit-your-rules/"> Audit rules and data </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Ship unchanged</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/ship-to-production/"> Ship to production </a> </li><li> <a href="/__pyric/ui/docs/set-up-the-project/"> Set up the Firebase project </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Conformance</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/how-we-know-it-matches-firebase/"> Conformance </a> </li><li> <a href="/__pyric/ui/docs/whats-experimental/"> What&#39;s experimental </a> </li><li> <a href="/__pyric/ui/docs/pyric-conformance-scores/"> Conformance scores </a> </li><li> <a href="/__pyric/ui/docs/pyric-app-compat/"> App </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-compat/"> Firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth-compat/"> Auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-database-compat/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-compat/"> Storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules-compat/"> Rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-compat/"> Messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-compat/"> AI Logic </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-functions-rtdb-compat/"> Functions · RTDB </a> </li> </ul> </div> </div> </details> <details class="docs-nav-group" open> <summary>Reference</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli/"> @pyric/cli </a> </li><li> <a href="/__pyric/ui/docs/pyric-explanation-versioning-and-compatibility/"> pyric </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore/"> pyric / firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules/"> pyric / rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox/"> pyric / sandbox </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage/"> pyric / storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth/"> pyric / auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-database/"> pyric / database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-app/"> pyric-admin / app </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-firestore/"> pyric-admin / firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-auth/"> pyric-admin / auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-database/"> pyric-admin / database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-storage/"> pyric-admin / storage </a> </li><li> <a href="/__pyric/ui/docs/ui/"> @pyric/ui </a> </li><li> <a href="/__pyric/ui/docs/api-reference/" aria-current="true"> API reference </a> </li> </ul> </div> </div> </details> </nav> </details> <nav class="docs-nav" aria-label="Documentation"> <div class="docs-search" data-index-url="/__pyric/ui/docs/index.json"> <div class="docs-search-field"> <svg class="docs-search-icon" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"> <path d="M11.5 11.5 15 15M13 7A6 6 0 1 1 1 7a6 6 0 0 1 12 0Z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></path> </svg> <input type="text" class="docs-search-input" placeholder="Search docs" aria-label="Search docs" autocomplete="off" spellcheck="false"> <kbd class="docs-search-kbd">⌘K</kbd> </div> <ul class="docs-search-results" hidden></ul> </div> <a class="docs-nav-toplink" href="/__pyric/ui/docs/overview/" id="nav-group-overview"> Overview </a><details class="docs-nav-group" id="nav-group-run-locally"> <summary>Run locally</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/start-building/"> Quickstart </a> </li><li> <a href="/__pyric/ui/docs/how-the-swap-works/"> How the swap works </a> </li><li> <a href="/__pyric/ui/docs/set-up-your-agent/"> Connect an agent </a> </li><li> <a href="/__pyric/ui/docs/test-in-node/"> Test in Node </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-develop-with-firebase-apis"> <summary>Develop with Firebase APIs</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/sign-in-and-manage-users/"> Sign in and manage users </a> </li><li> <a href="/__pyric/ui/docs/store-and-query-data/"> Store and query data </a> </li><li> <a href="/__pyric/ui/docs/sync-realtime-data/"> Sync realtime data </a> </li><li> <a href="/__pyric/ui/docs/store-files/"> Store files </a> </li><li> <a href="/__pyric/ui/docs/receive-messages/"> Receive messages </a> </li><li> <a href="/__pyric/ui/docs/run-ai-logic-locally/"> Run AI Logic locally </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-how-to-run-rtdb-onvaluecreated/"> Run an RTDB function locally </a> </li><li> <a href="/__pyric/ui/docs/which-data-service/"> Which data service? </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-inspect-and-correct"> <summary>Inspect and correct</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <h2 class="docs-nav-heading" id="nav-section-inspect-and-correct-inspect-the-sandbox"> Inspect the sandbox </h2> <ul> <li> <a href="/__pyric/ui/docs/see-whats-happening/"> Traffic &amp; rule verdicts </a> </li><li> <a href="/__pyric/ui/docs/read-a-denial/"> Read a denial and understand it </a> </li><li> <a href="/__pyric/ui/docs/shape-your-data/"> Seed, snapshot, replay </a> </li><li> <a href="/__pyric/ui/docs/watch-and-review/"> Review agent activity </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading" id="nav-section-inspect-and-correct-correct-security-rules"> Correct Security Rules </h2> <ul> <li> <a href="/__pyric/ui/docs/secure-it-with-rules/"> Security Rules </a> </li><li> <a href="/__pyric/ui/docs/simulate-and-lint/"> Simulate and lint before you deploy </a> </li><li> <a href="/__pyric/ui/docs/rules-patterns/"> Rules patterns </a> </li><li> <a href="/__pyric/ui/docs/rules-standard-library/"> The rules standard library </a> </li><li> <a href="/__pyric/ui/docs/rtdb-rules-in-typescript/"> RTDB rules in TypeScript </a> </li><li> <a href="/__pyric/ui/docs/firestore-rules-limits/"> Rules limits </a> </li><li> <a href="/__pyric/ui/docs/whats-possible/"> Case studies </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading" id="nav-section-inspect-and-correct-work-with-an-agent"> Work with an agent </h2> <ul> <li> <a href="/__pyric/ui/docs/what-your-agent-can-do/"> Work through an agent </a> </li><li> <a href="/__pyric/ui/docs/skills/"> Agent skills </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-verify-the-boundary"> <summary>Verify the boundary</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli-how-to-verify-against-a-captured-session/"> Verify a captured session </a> </li><li> <a href="/__pyric/ui/docs/write-a-rules-test-suite/"> Write a rules test suite </a> </li><li> <a href="/__pyric/ui/docs/audit-your-rules/"> Audit rules and data </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-ship-unchanged"> <summary>Ship unchanged</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/ship-to-production/"> Ship to production </a> </li><li> <a href="/__pyric/ui/docs/set-up-the-project/"> Set up the Firebase project </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-conformance"> <summary>Conformance</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/how-we-know-it-matches-firebase/"> Conformance </a> </li><li> <a href="/__pyric/ui/docs/whats-experimental/"> What&#39;s experimental </a> </li><li> <a href="/__pyric/ui/docs/pyric-conformance-scores/"> Conformance scores </a> </li><li> <a href="/__pyric/ui/docs/pyric-app-compat/"> App </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-compat/"> Firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth-compat/"> Auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-database-compat/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-compat/"> Storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules-compat/"> Rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-compat/"> Messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-compat/"> AI Logic </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-functions-rtdb-compat/"> Functions · RTDB </a> </li> </ul> </div> </div> </details> <details class="docs-nav-group" id="nav-group-reference" open> <summary>Reference</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli/"> @pyric/cli </a> </li><li> <a href="/__pyric/ui/docs/pyric-explanation-versioning-and-compatibility/"> pyric </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore/"> pyric / firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules/"> pyric / rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox/"> pyric / sandbox </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage/"> pyric / storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth/"> pyric / auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-database/"> pyric / database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-app/"> pyric-admin / app </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-firestore/"> pyric-admin / firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-auth/"> pyric-admin / auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-database/"> pyric-admin / database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-storage/"> pyric-admin / storage </a> </li><li> <a href="/__pyric/ui/docs/ui/"> @pyric/ui </a> </li><li> <a href="/__pyric/ui/docs/api-reference/" aria-current="true"> API reference </a> </li> </ul> </div> </div> </details> </nav> <main class="doc-main"> <nav class="docs-breadcrumbs" aria-label="Breadcrumb"> <ol> <li> <a href="/__pyric/ui/docs/api-reference/">API reference</a> </li><li> <span class="docs-breadcrumbs-sep" aria-hidden="true">/</span> <span>pyric</span> </li><li> <span class="docs-breadcrumbs-sep" aria-hidden="true">/</span> <span aria-current="page">pyric/rules</span> </li> </ol> </nav> <header class="api-reference-header"> <p class="api-reference-kicker">API reference</p> <h1><code>pyric/rules</code></h1> <p class="api-reference-meta"> 94 published symbols from <code>pyric</code> </p> <p class="api-reference-source">
2
+ Generated from the TypeScript declarations shipped at this import path.
3
+ </p> <a class="api-reference-evidence" href="/__pyric/ui/docs/pyric-rules-compat/">
4
+ Check behavioral conformance
5
+ </a> </header> <article class="prose api-reference-body"> <!-- Generated from published package declarations via TypeDoc. Do not edit by hand; run bun run docs:api:generate. -->
6
+ <h2 id="classes">Classes</h2>
7
+ <p><a id="rulesassertionerror"></a></p>
8
+ <h3 id="rulesassertionerror">RulesAssertionError</h3>
9
+ <p>Thrown by <code>assertCase</code> / a runner case’s <code>run()</code> when the simulated
10
+ decision did not match the case’s expectation. The message is the
11
+ rendered trace from <code>explainCase</code>, so a test runner surfaces the “why”
12
+ without extra wiring.</p>
13
+ <h4 id="extends">Extends</h4>
14
+ <ul>
15
+ <li><code>Error</code></li>
16
+ </ul>
17
+ <h4 id="constructors">Constructors</h4>
18
+ <p><a id="constructor"></a></p>
19
+ <h5 id="constructor">Constructor</h5>
20
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">new</span><span style="color:#61AFEF"> RulesAssertionError</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">message</span><span style="color:#ABB2BF">: </span><span style="color:#E06C75">string</span><span style="color:#ABB2BF">): </span><span style="color:#E06C75">RulesAssertionError</span><span style="color:#ABB2BF">;</span></span></code></pre>
21
+ <h6 id="parameters">Parameters</h6>
22
+ <div class="table-scroll">
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+
32
+
33
+
34
+
35
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>message</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
36
+ <h6 id="returns">Returns</h6>
37
+ <p><a href="#rulesassertionerror"><code>RulesAssertionError</code></a></p>
38
+ <h6 id="overrides">Overrides</h6>
39
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#E5C07B">Error</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">constructor</span></span></code></pre>
40
+ <hr>
41
+ <p><a id="rulescompileerror"></a></p>
42
+ <h3 id="rulescompileerror">RulesCompileError</h3>
43
+ <p>Thrown by <code>firestoreRules(source)</code> / <code>rtdbRules(...)</code> when the source
44
+ cannot compile. Carries the compile-blocking issues on <code>.issues</code> so a
45
+ caller can surface them without re-parsing.</p>
46
+ <h4 id="extends-1">Extends</h4>
47
+ <ul>
48
+ <li><code>Error</code></li>
49
+ </ul>
50
+ <h4 id="constructors-1">Constructors</h4>
51
+ <p><a id="constructor-1"></a></p>
52
+ <h5 id="constructor-1">Constructor</h5>
53
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">new</span><span style="color:#61AFEF"> RulesCompileError</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">message</span><span style="color:#ABB2BF">: </span><span style="color:#E06C75">string</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75">issues</span><span style="color:#ABB2BF">: </span><span style="color:#E06C75">RuleIssue</span><span style="color:#ABB2BF">[]): </span><span style="color:#E06C75">RulesCompileError</span><span style="color:#ABB2BF">;</span></span></code></pre>
54
+ <h6 id="parameters-1">Parameters</h6>
55
+ <div class="table-scroll">
56
+
57
+
58
+
59
+
60
+
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+
69
+
70
+
71
+
72
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>message</code></td><td align="left"><code>string</code></td></tr><tr><td align="left"><code>issues</code></td><td align="left"><a href="#ruleissue"><code>RuleIssue</code></a>[]</td></tr></tbody></table></div>
73
+ <h6 id="returns-1">Returns</h6>
74
+ <p><a href="#rulescompileerror"><code>RulesCompileError</code></a></p>
75
+ <h6 id="overrides-1">Overrides</h6>
76
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#E5C07B">Error</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">constructor</span></span></code></pre>
77
+ <h4 id="properties">Properties</h4>
78
+ <div class="table-scroll">
79
+
80
+
81
+
82
+
83
+
84
+
85
+
86
+
87
+
88
+
89
+
90
+
91
+
92
+
93
+ <table><thead><tr><th align="left">Property</th><th align="left">Modifier</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="issues"></a> <code>issues</code></td><td align="left"><code>readonly</code></td><td align="left"><a href="#ruleissue"><code>RuleIssue</code></a>[]</td></tr></tbody></table></div>
94
+ <hr>
95
+ <p><a id="rulesunsupportederror"></a></p>
96
+ <h3 id="rulesunsupportederror">RulesUnsupportedError</h3>
97
+ <p>Thrown by <code>assertCase</code> / a runner case’s <code>run()</code> when the simulator
98
+ abstained — it hit a feature it does not implement, so neither a pass nor
99
+ a genuine failure can be asserted. Distinct from
100
+ <a href="#rulesassertionerror">RulesAssertionError</a> so a runner can choose to skip rather than
101
+ fail on a known simulator gap.</p>
102
+ <h4 id="extends-2">Extends</h4>
103
+ <ul>
104
+ <li><code>Error</code></li>
105
+ </ul>
106
+ <h4 id="constructors-2">Constructors</h4>
107
+ <p><a id="constructor-2"></a></p>
108
+ <h5 id="constructor-2">Constructor</h5>
109
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">new</span><span style="color:#61AFEF"> RulesUnsupportedError</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">message</span><span style="color:#ABB2BF">: </span><span style="color:#E06C75">string</span><span style="color:#ABB2BF">): </span><span style="color:#E06C75">RulesUnsupportedError</span><span style="color:#ABB2BF">;</span></span></code></pre>
110
+ <h6 id="parameters-2">Parameters</h6>
111
+ <div class="table-scroll">
112
+
113
+
114
+
115
+
116
+
117
+
118
+
119
+
120
+
121
+
122
+
123
+
124
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>message</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
125
+ <h6 id="returns-2">Returns</h6>
126
+ <p><a href="#rulesunsupportederror"><code>RulesUnsupportedError</code></a></p>
127
+ <h6 id="overrides-2">Overrides</h6>
128
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#E5C07B">Error</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">constructor</span></span></code></pre>
129
+ <h2 id="interfaces">Interfaces</h2>
130
+ <p><a id="caseresult"></a></p>
131
+ <h3 id="caseresult">CaseResult</h3>
132
+ <p>The outcome of running one Firestore case through <code>simulate</code>. Never a
133
+ thrown error — a denied or abstained case is data, not an exception.</p>
134
+ <h4 id="properties-1">Properties</h4>
135
+ <div class="table-scroll">
136
+
137
+
138
+
139
+
140
+
141
+
142
+
143
+
144
+
145
+
146
+
147
+
148
+
149
+
150
+
151
+
152
+
153
+
154
+
155
+
156
+
157
+
158
+
159
+
160
+
161
+
162
+
163
+
164
+
165
+
166
+
167
+
168
+
169
+
170
+
171
+
172
+
173
+
174
+
175
+
176
+
177
+
178
+
179
+
180
+
181
+
182
+
183
+
184
+
185
+
186
+
187
+
188
+
189
+
190
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="case"></a> <code>case</code></td><td align="left"><a href="#firestorecase"><code>FirestoreCase</code></a></td><td align="left">The case that produced this result.</td></tr><tr><td align="left"><a id="decision"></a> <code>decision</code></td><td align="left"><code>"ALLOW"</code> | <code>"DENY"</code> | <code>"UNSUPPORTED"</code></td><td align="left">The engine’s absolute verdict, independent of expectation.</td></tr><tr><td align="left"><a id="description"></a> <code>description</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="expectation"></a> <code>expectation</code></td><td align="left"><code>"ALLOW"</code> | <code>"DENY"</code></td><td align="left">-</td></tr><tr><td align="left"><a id="notes"></a> <code>notes</code></td><td align="left"><code>string</code>[]</td><td align="left">Top-level diagnostic strings.</td></tr><tr><td align="left"><a id="passed"></a> <code>passed</code></td><td align="left"><code>boolean</code></td><td align="left"><code>true</code> when <code>decision</code> matched <code>expectation</code>.</td></tr><tr><td align="left"><a id="pathresolution"></a> <code>pathResolution?</code></td><td align="left"><a href="#pathresolutiontrace"><code>PathResolutionTrace</code></a></td><td align="left">Which match blocks the resolver considered and where each fell apart.</td></tr><tr><td align="left"><a id="trace"></a> <code>trace</code></td><td align="left"><a href="#ruleevaluation"><code>RuleEvaluation</code></a>[]</td><td align="left">Per-rule evaluation entries in source order.</td></tr><tr><td align="left"><a id="unsupported"></a> <code>unsupported</code></td><td align="left"><code>boolean</code></td><td align="left"><code>true</code> when the simulator abstained on a feature it does not implement — neither a pass nor a genuine failure.</td></tr></tbody></table></div>
191
+ <hr>
192
+ <p><a id="evaluatedruleinfo"></a></p>
193
+ <h3 id="evaluatedruleinfo">EvaluatedRuleInfo</h3>
194
+ <p>The DECIDING rule’s source position + sub-expression trace, projected from a
195
+ TestResult — for BOTH verdicts: the <code>allow</code> rule that granted an
196
+ ALLOW, or the rule responsible for a DENY. Additive companion to
197
+ renderLegacyDebugMessages: that flattens the per-rule trace to
198
+ strings (dropping <code>line</code> and <code>expressionTrace</code>); this preserves the
199
+ structured detail a UI needs to point at the exact source line and step
200
+ through the evaluation (“show the work”). Position/trace fields are optional
201
+ so a partial trace projects honestly.</p>
202
+ <h4 id="properties-2">Properties</h4>
203
+ <div class="table-scroll">
204
+
205
+
206
+
207
+
208
+
209
+
210
+
211
+
212
+
213
+
214
+
215
+
216
+
217
+
218
+
219
+
220
+
221
+
222
+
223
+
224
+
225
+
226
+
227
+
228
+
229
+
230
+
231
+
232
+
233
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="expression"></a> <code>expression?</code></td><td align="left"><code>string</code></td><td align="left">Pretty-printed condition text of the deciding rule.</td></tr><tr><td align="left"><a id="expressiontrace"></a> <code>expressionTrace?</code></td><td align="left"><a href="#exprtraceentry"><code>ExprTraceEntry</code></a>[]</td><td align="left">Per-sub-expression evaluation trace of the deciding rule.</td></tr><tr><td align="left"><a id="line"></a> <code>line?</code></td><td align="left"><code>number</code></td><td align="left">1-indexed source line of the deciding <code>allow</code> rule.</td></tr><tr><td align="left"><a id="verdict"></a> <code>verdict</code></td><td align="left"><code>"allow"</code> | <code>"deny"</code></td><td align="left">The verdict the deciding rule produced for the op.</td></tr></tbody></table></div>
234
+ <hr>
235
+ <p><a id="explanation"></a></p>
236
+ <h3 id="explanation">Explanation</h3>
237
+ <p>The structured account of why one Firestore case resolved as it did.</p>
238
+ <h4 id="properties-3">Properties</h4>
239
+ <div class="table-scroll">
240
+
241
+
242
+
243
+
244
+
245
+
246
+
247
+
248
+
249
+
250
+
251
+
252
+
253
+
254
+
255
+
256
+
257
+
258
+
259
+
260
+
261
+
262
+
263
+
264
+
265
+
266
+
267
+
268
+
269
+
270
+
271
+
272
+
273
+
274
+
275
+
276
+
277
+
278
+
279
+
280
+
281
+
282
+
283
+
284
+
285
+
286
+
287
+
288
+
289
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="deciding"></a> <code>deciding?</code></td><td align="left"><a href="#evaluatedruleinfo"><code>EvaluatedRuleInfo</code></a></td><td align="left">The deciding <code>allow</code> rule (line, condition text, sub-expression trace), when one was evaluated. Absent on default-deny / abstain.</td></tr><tr><td align="left"><a id="decision-1"></a> <code>decision</code></td><td align="left"><code>"ALLOW"</code> | <code>"DENY"</code> | <code>"UNSUPPORTED"</code></td><td align="left">-</td></tr><tr><td align="left"><a id="expectation-1"></a> <code>expectation</code></td><td align="left"><code>"ALLOW"</code> | <code>"DENY"</code></td><td align="left">-</td></tr><tr><td align="left"><a id="notes-1"></a> <code>notes</code></td><td align="left"><code>string</code>[]</td><td align="left">-</td></tr><tr><td align="left"><a id="passed-1"></a> <code>passed</code></td><td align="left"><code>boolean</code></td><td align="left">-</td></tr><tr><td align="left"><a id="pathresolution-1"></a> <code>pathResolution?</code></td><td align="left"><a href="#pathresolutiontrace"><code>PathResolutionTrace</code></a></td><td align="left">-</td></tr><tr><td align="left"><a id="trace-1"></a> <code>trace</code></td><td align="left"><a href="#ruleevaluation"><code>RuleEvaluation</code></a>[]</td><td align="left">-</td></tr><tr><td align="left"><a id="unsupported-1"></a> <code>unsupported</code></td><td align="left"><code>boolean</code></td><td align="left">-</td></tr></tbody></table></div>
290
+ <hr>
291
+ <p><a id="exprtraceentry"></a></p>
292
+ <h3 id="exprtraceentry">ExprTraceEntry</h3>
293
+ <p>One entry in the per-rule expression trace recorded by <code>TraceRecorder</code>.</p>
294
+ <p>Trace entries are emitted in evaluation order. The tree shape is
295
+ reconstructable via <code>parent</code>: root entries have <code>parent: null</code>, and
296
+ each child entry’s <code>parent</code> is the array index of its evaluating
297
+ ancestor. This is denser than nested objects for transport (a tool
298
+ call returns a single flat array) and easier for the agent to scan
299
+ top-to-bottom.</p>
300
+ <p><code>value</code> carries the evaluation result. For nodes that threw, see
301
+ <code>error</code>; for short-circuit skips, <code>skipped: true</code> is set instead.</p>
302
+ <h4 id="properties-4">Properties</h4>
303
+ <div class="table-scroll">
304
+
305
+
306
+
307
+
308
+
309
+
310
+
311
+
312
+
313
+
314
+
315
+
316
+
317
+
318
+
319
+
320
+
321
+
322
+
323
+
324
+
325
+
326
+
327
+
328
+
329
+
330
+
331
+
332
+
333
+
334
+
335
+
336
+
337
+
338
+
339
+
340
+
341
+
342
+
343
+
344
+
345
+
346
+
347
+
348
+
349
+
350
+
351
+
352
+
353
+
354
+
355
+
356
+
357
+
358
+
359
+
360
+
361
+
362
+
363
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="error"></a> <code>error?</code></td><td align="left"><code>string</code></td><td align="left">Error message when the expression threw. The wrapper still re-throws; this captures the diagnostic for the caller.</td></tr><tr><td align="left"><a id="inlinedfrom"></a> <code>inlinedFrom?</code></td><td align="left">{ <code>name</code>: <code>string</code>; }</td><td align="left">Set on entries recorded <em>inside</em> a user-defined function’s body (after parameter binding). Carries the enclosing function’s name so the agent can filter the trace by frame — <code>entries.filter(e => e.inlinedFrom?.name === 'isOwner')</code> — without walking the parent chain to find the surrounding <code>functionCall</code>. Parameter expressions are <em>not</em> tagged: they evaluate in the caller’s scope, before the frame is entered. The <code>functionCall</code> entry itself is recorded in the caller’s frame too, so a top-level <code>isOwner()</code> shows <code>inlinedFrom: undefined</code> on the <code>functionCall</code>, but <code>'isOwner'</code> on its body children.</td></tr><tr><td align="left"><code>inlinedFrom.name</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="kind"></a> <code>kind</code></td><td align="left">| <code>"literal"</code> | <code>"identifier"</code> | <code>"memberAccess"</code> | <code>"methodCall"</code> | <code>"bracketAccess"</code> | <code>"sliceAccess"</code> | <code>"binaryOp"</code> | <code>"unaryOp"</code> | <code>"ternary"</code> | <code>"inExpr"</code> | <code>"isExpr"</code> | <code>"listLiteral"</code> | <code>"mapLiteral"</code> | <code>"pathLiteral"</code> | <code>"functionCall"</code></td><td align="left">AST node type — useful for filtering by structural kind.</td></tr><tr><td align="left"><a id="letbinding"></a> <code>letBinding?</code></td><td align="left">{ <code>name</code>: <code>string</code>; }</td><td align="left">Set on entries that record a <code>let</code> binding evaluation inside a user-defined function. <code>value</code> holds the bound value.</td></tr><tr><td align="left"><code>letBinding.name</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="parent"></a> <code>parent</code></td><td align="left"><code>number</code></td><td align="left">Index of the parent entry in the trace array; null at the root.</td></tr><tr><td align="left"><a id="skipped"></a> <code>skipped?</code></td><td align="left"><code>boolean</code></td><td align="left">True for an <code>&#x26;&#x26;</code> / `</td></tr><tr><td align="left"><a id="source"></a> <code>source</code></td><td align="left"><code>string</code></td><td align="left">Pretty-printed source of the expression (via <code>assembleExpression</code>).</td></tr><tr><td align="left"><a id="value"></a> <code>value?</code></td><td align="left"><code>unknown</code></td><td align="left">Evaluation result. Undefined when <code>skipped</code> or <code>error</code> is set.</td></tr></tbody></table></div>
364
+ <hr>
365
+ <p><a id="firestorecase"></a></p>
366
+ <h3 id="firestorecase">FirestoreCase</h3>
367
+ <p>One Firestore rules case: a single request plus the outcome it should
368
+ produce. Structurally identical to the engine’s <code>TestCase</code> — re-exported
369
+ here under the public name so callers never reach into the engine seam.</p>
370
+ <h4 id="properties-5">Properties</h4>
371
+ <div class="table-scroll">
372
+
373
+
374
+
375
+
376
+
377
+
378
+
379
+
380
+
381
+
382
+
383
+
384
+
385
+
386
+
387
+
388
+
389
+
390
+
391
+
392
+
393
+
394
+
395
+
396
+
397
+
398
+
399
+
400
+
401
+
402
+
403
+
404
+
405
+
406
+
407
+
408
+
409
+
410
+
411
+
412
+
413
+
414
+
415
+
416
+
417
+
418
+
419
+
420
+
421
+
422
+
423
+
424
+
425
+
426
+
427
+
428
+
429
+
430
+
431
+
432
+
433
+
434
+
435
+
436
+
437
+
438
+
439
+
440
+
441
+
442
+
443
+
444
+
445
+
446
+
447
+
448
+
449
+
450
+
451
+
452
+
453
+
454
+
455
+
456
+
457
+
458
+
459
+
460
+
461
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="auth"></a> <code>auth?</code></td><td align="left">{ <code>token?</code>: <code>Record</code>&#x3C;<code>string</code>, <code>unknown</code>>; <code>uid</code>: <code>string</code>; }</td><td align="left">Auth context; <code>null</code>/omitted for unauthenticated.</td></tr><tr><td align="left"><code>auth.token?</code></td><td align="left"><code>Record</code>&#x3C;<code>string</code>, <code>unknown</code>></td><td align="left">-</td></tr><tr><td align="left"><code>auth.uid</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="data"></a> <code>data?</code></td><td align="left"><code>Record</code>&#x3C;<code>string</code>, <code>unknown</code>></td><td align="left"><code>request.resource.data</code> for write operations.</td></tr><tr><td align="left"><a id="description-1"></a> <code>description</code></td><td align="left"><code>string</code></td><td align="left">Human-readable description of what this case verifies.</td></tr><tr><td align="left"><a id="expectation-2"></a> <code>expectation</code></td><td align="left"><code>"ALLOW"</code> | <code>"DENY"</code></td><td align="left">Expected outcome.</td></tr><tr><td align="left"><a id="functionmocks"></a> <code>functionMocks?</code></td><td align="left">{ <code>function</code>: <code>"get"</code> | <code>"exists"</code>; <code>path</code>: <code>string</code>; <code>result</code>: <code>boolean</code> | <code>Record</code>&#x3C;<code>string</code>, <code>unknown</code>>; }[]</td><td align="left">Mock <code>get()</code> / <code>exists()</code> calls the rules make.</td></tr><tr><td align="left"><a id="method"></a> <code>method</code></td><td align="left"><code>"get"</code> | <code>"list"</code> | <code>"create"</code> | <code>"update"</code> | <code>"delete"</code></td><td align="left">Firestore method under test.</td></tr><tr><td align="left"><a id="path"></a> <code>path</code></td><td align="left"><code>string</code></td><td align="left">Document path, e.g. <code>"users/alice"</code>.</td></tr><tr><td align="left"><a id="query"></a> <code>query?</code></td><td align="left">{ <code>limit?</code>: <code>number</code>; <code>offset?</code>: <code>number</code>; <code>orderBy?</code>: <code>string</code>; }</td><td align="left"><code>request.query</code> payload (list ops only): limit/offset/orderBy.</td></tr><tr><td align="left"><code>query.limit?</code></td><td align="left"><code>number</code></td><td align="left">-</td></tr><tr><td align="left"><code>query.offset?</code></td><td align="left"><code>number</code></td><td align="left">-</td></tr><tr><td align="left"><code>query.orderBy?</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="requesttime"></a> <code>requestTime?</code></td><td align="left"><code>string</code></td><td align="left">Override for <code>request.time</code> (ISO-8601). Defaults to wallclock.</td></tr><tr><td align="left"><a id="resource"></a> <code>resource?</code></td><td align="left"><code>Record</code>&#x3C;<code>string</code>, <code>unknown</code>></td><td align="left">Existing document data (<code>resource.data</code>).</td></tr><tr><td align="left"><a id="writemode"></a> <code>writeMode?</code></td><td align="left">| { <code>kind</code>: <code>"create"</code>; } | { <code>kind</code>: <code>"set"</code>; <code>merge</code>: <code>boolean</code>; } | { <code>kind</code>: <code>"update"</code>; } | { <code>kind</code>: <code>"delete"</code>; }</td><td align="left">Explicit write semantics — controls update-merge and getAfter() projection. Omit to treat <code>data</code> as the full after-state.</td></tr></tbody></table></div>
462
+ <hr>
463
+ <p><a id="firestoreruleset"></a></p>
464
+ <h3 id="firestoreruleset">FirestoreRuleset</h3>
465
+ <h4 id="methods">Methods</h4>
466
+ <p><a id="explain"></a></p>
467
+ <h5 id="explain">explain()</h5>
468
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#61AFEF">explain</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">oneCase</span><span style="color:#ABB2BF">: </span><span style="color:#E06C75">FirestoreCase</span><span style="color:#ABB2BF">): </span><span style="color:#E06C75">Explanation</span><span style="color:#ABB2BF">;</span></span></code></pre>
469
+ <p>The structured account of why one case resolved as it did.</p>
470
+ <h6 id="parameters-3">Parameters</h6>
471
+ <div class="table-scroll">
472
+
473
+
474
+
475
+
476
+
477
+
478
+
479
+
480
+
481
+
482
+
483
+
484
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>oneCase</code></td><td align="left"><a href="#firestorecase"><code>FirestoreCase</code></a></td></tr></tbody></table></div>
485
+ <h6 id="returns-3">Returns</h6>
486
+ <p><a href="#explanation"><code>Explanation</code></a></p>
487
+ <p><a id="lint"></a></p>
488
+ <h5 id="lint">lint()</h5>
489
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#61AFEF">lint</span><span style="color:#ABB2BF">(): </span><span style="color:#E06C75">RuleIssue</span><span style="color:#ABB2BF">[];</span></span></code></pre>
490
+ <p>Structural, security, and budget findings on the compiled ruleset.
491
+ No parse errors — the source already compiled.</p>
492
+ <h6 id="returns-4">Returns</h6>
493
+ <p><a href="#ruleissue"><code>RuleIssue</code></a>[]</p>
494
+ <p><a id="simulate"></a></p>
495
+ <h5 id="simulate">simulate()</h5>
496
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#61AFEF">simulate</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">cases</span><span style="color:#ABB2BF">: </span><span style="color:#E06C75">FirestoreCase</span><span style="color:#ABB2BF">[]): </span><span style="color:#E06C75">SimulationSummary</span><span style="color:#ABB2BF">;</span></span></code></pre>
497
+ <p>Run every case. Never throws on a rule outcome: a denied or abstained
498
+ case is reported in the returned summary.</p>
499
+ <h6 id="parameters-4">Parameters</h6>
500
+ <div class="table-scroll">
501
+
502
+
503
+
504
+
505
+
506
+
507
+
508
+
509
+
510
+
511
+
512
+
513
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>cases</code></td><td align="left"><a href="#firestorecase"><code>FirestoreCase</code></a>[]</td></tr></tbody></table></div>
514
+ <h6 id="returns-5">Returns</h6>
515
+ <p><a href="#simulationsummary"><code>SimulationSummary</code></a></p>
516
+ <p><a id="tojson"></a></p>
517
+ <h5 id="tojson">toJSON()</h5>
518
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#61AFEF">toJSON</span><span style="color:#ABB2BF">(): </span><span style="color:#E06C75">FirestoreRules</span><span style="color:#ABB2BF">;</span></span></code></pre>
519
+ <p>The parsed ruleset as plain data (the AST).</p>
520
+ <h6 id="returns-6">Returns</h6>
521
+ <p><code>FirestoreRules</code></p>
522
+ <hr>
523
+ <p><a id="pathdef"></a></p>
524
+ <h3 id="pathdef">PathDef</h3>
525
+ <p>Definition of rules for a single database path.</p>
526
+ <h4 id="properties-6">Properties</h4>
527
+ <div class="table-scroll">
528
+
529
+
530
+
531
+
532
+
533
+
534
+
535
+
536
+
537
+
538
+
539
+
540
+
541
+
542
+
543
+
544
+
545
+
546
+
547
+
548
+
549
+
550
+
551
+
552
+
553
+
554
+
555
+
556
+
557
+
558
+
559
+
560
+
561
+
562
+
563
+
564
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="children"></a> <code>children?</code></td><td align="left"><code>Record</code>&#x3C;<code>string</code>, <a href="#pathdef"><code>PathDef</code></a>></td></tr><tr><td align="left"><a id="fieldconstraints"></a> <code>fieldConstraints?</code></td><td align="left"><code>Record</code>&#x3C;<code>string</code>, <a href="#expr"><code>Expr</code></a>[]></td></tr><tr><td align="left"><a id="indexon"></a> <code>indexOn?</code></td><td align="left"><code>string</code>[]</td></tr><tr><td align="left"><a id="read"></a> <code>read?</code></td><td align="left"><code>string</code></td></tr><tr><td align="left"><a id="schema"></a> <code>schema?</code></td><td align="left"><code>ZodObject</code>&#x3C;<code>any</code>></td></tr><tr><td align="left"><a id="validate"></a> <code>validate?</code></td><td align="left"><code>string</code></td></tr><tr><td align="left"><a id="write"></a> <code>write?</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
565
+ <hr>
566
+ <p><a id="pathresolutionentry"></a></p>
567
+ <h3 id="pathresolutionentry">PathResolutionEntry</h3>
568
+ <p>One <code>match</code> block the simulator considered while resolving the
569
+ request path. Together, <code>PathResolutionTrace.attempts</code> forms a
570
+ complete picture of “what did the resolver try, and where did
571
+ each attempt fall apart?” — useful for the agent when a request
572
+ lands in the default-deny path because no block matched.</p>
573
+ <p>Recorded only by the local simulator; the production Test API
574
+ client doesn’t expose path-resolution internals.</p>
575
+ <h4 id="properties-7">Properties</h4>
576
+ <div class="table-scroll">
577
+
578
+
579
+
580
+
581
+
582
+
583
+
584
+
585
+
586
+
587
+
588
+
589
+
590
+
591
+
592
+
593
+
594
+
595
+
596
+
597
+
598
+
599
+
600
+
601
+
602
+
603
+
604
+
605
+
606
+
607
+
608
+
609
+
610
+
611
+
612
+
613
+
614
+
615
+
616
+
617
+
618
+
619
+
620
+
621
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="bindings"></a> <code>bindings</code></td><td align="left"><code>Record</code>&#x3C;<code>string</code>, <code>string</code>></td><td align="left">Wildcard / recursive bindings the block produced (even when the overall match failed — the partial bindings are still diagnostic).</td></tr><tr><td align="left"><a id="blockpath"></a> <code>blockPath</code></td><td align="left"><code>string</code></td><td align="left">Raw match path as written in the source, e.g. <code>'/users/{uid}/messages/{mId}'</code>.</td></tr><tr><td align="left"><a id="line-1"></a> <code>line?</code></td><td align="left"><code>number</code></td><td align="left">Source line of the <code>match</code> keyword. Absent when the parser didn’t populate <code>loc</code> (programmatically-constructed blocks).</td></tr><tr><td align="left"><a id="matched"></a> <code>matched</code></td><td align="left"><code>boolean</code></td><td align="left">True for a block that fully resolved (no remaining request segments AND every nested match either completed or wasn’t needed). MULTIPLE entries may be <code>matched: true</code> in one trace: a request path can match several overlapping <code>match</code> blocks (e.g. <code>/docs/{doc}</code> and a sibling <code>/{document=**}</code>), and every matching block’s allows OR-combine. Container blocks whose children completed the resolution are also flagged matched.</td></tr><tr><td align="left"><a id="matchedsegments"></a> <code>matchedSegments</code></td><td align="left"><code>number</code></td><td align="left">How many of the block’s path segments matched against the request path before the resolver gave up or completed.</td></tr><tr><td align="left"><a id="reason"></a> <code>reason?</code></td><td align="left"><code>"literal-mismatch"</code> | <code>"request-shorter"</code> | <code>"no-matching-child"</code></td><td align="left">Why the resolver moved on. Absent when <code>matched: true</code>. - <code>'literal-mismatch'</code> — a literal segment in the block didn’t match the corresponding request segment. - <code>'request-shorter'</code> — block path had more segments than the request supplied (e.g. block is <code>/a/{b}/c</code>, request is <code>/a/x</code>). - <code>'no-matching-child'</code> — block matched its own segments but remaining request segments weren’t covered by any child block.</td></tr><tr><td align="left"><a id="totalsegments"></a> <code>totalSegments</code></td><td align="left"><code>number</code></td><td align="left">Total segments in the block’s path pattern.</td></tr></tbody></table></div>
622
+ <hr>
623
+ <p><a id="pathresolutiontrace"></a></p>
624
+ <h3 id="pathresolutiontrace">PathResolutionTrace</h3>
625
+ <h4 id="properties-8">Properties</h4>
626
+ <div class="table-scroll">
627
+
628
+
629
+
630
+
631
+
632
+
633
+
634
+
635
+
636
+
637
+
638
+
639
+
640
+
641
+
642
+
643
+
644
+
645
+
646
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="attempts"></a> <code>attempts</code></td><td align="left"><a href="#pathresolutionentry"><code>PathResolutionEntry</code></a>[]</td><td align="left">One entry per match block the resolver considered, in the order it tried them. <code>attempts[i].matched: true</code> marks a block that fully resolved; one or more per trace, since overlapping blocks all match and OR-combine.</td></tr><tr><td align="left"><a id="requestpath"></a> <code>requestPath</code></td><td align="left"><code>string</code></td><td align="left">The request path that was resolved, verbatim from <code>TestCase.path</code>.</td></tr></tbody></table></div>
647
+ <hr>
648
+ <p><a id="rtdbcase"></a></p>
649
+ <h3 id="rtdbcase">RtdbCase</h3>
650
+ <p>One Realtime Database rules case. <code>expectation</code> is required so a <code>simulate</code>
651
+ run can partition cases into passed/failed the same way Firestore does —
652
+ the RTDB simulator otherwise returns only a raw allow/deny with no notion
653
+ of an expectation.</p>
654
+ <h4 id="properties-9">Properties</h4>
655
+ <div class="table-scroll">
656
+
657
+
658
+
659
+
660
+
661
+
662
+
663
+
664
+
665
+
666
+
667
+
668
+
669
+
670
+
671
+
672
+
673
+
674
+
675
+
676
+
677
+
678
+
679
+
680
+
681
+
682
+
683
+
684
+
685
+
686
+
687
+
688
+
689
+
690
+
691
+
692
+
693
+
694
+
695
+
696
+
697
+
698
+
699
+
700
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="auth-1"></a> <code>auth?</code></td><td align="left">| <code>string</code> | { <code>token?</code>: <code>Record</code>&#x3C;<code>string</code>, <code>unknown</code>>; <code>uid</code>: <code>string</code>; }</td><td align="left">Auth context; a bare uid string, a full identity, or <code>null</code>.</td></tr><tr><td align="left"><a id="data-1"></a> <code>data?</code></td><td align="left"><code>Record</code>&#x3C;<code>string</code>, <code>unknown</code>></td><td align="left">Existing tree data the rule reads (<code>data</code>).</td></tr><tr><td align="left"><a id="description-2"></a> <code>description?</code></td><td align="left"><code>string</code></td><td align="left">Human-readable description of what this case verifies.</td></tr><tr><td align="left"><a id="expectation-3"></a> <code>expectation</code></td><td align="left"><code>"ALLOW"</code> | <code>"DENY"</code></td><td align="left">Expected outcome.</td></tr><tr><td align="left"><a id="newdata"></a> <code>newData?</code></td><td align="left"><code>unknown</code></td><td align="left">Proposed write value (<code>newData</code>), for write/validate cases.</td></tr><tr><td align="left"><a id="operation"></a> <code>operation</code></td><td align="left"><code>"validate"</code> | <code>"read"</code> | <code>"write"</code></td><td align="left">RTDB rule kind under test.</td></tr><tr><td align="left"><a id="path-1"></a> <code>path</code></td><td align="left"><code>string</code></td><td align="left">Absolute, root-relative tree path, e.g. <code>"/users/alice"</code>.</td></tr></tbody></table></div>
701
+ <hr>
702
+ <p><a id="rtdbcaseresult"></a></p>
703
+ <h3 id="rtdbcaseresult">RtdbCaseResult</h3>
704
+ <p>The outcome of running one RTDB case through <code>simulate</code>.</p>
705
+ <h4 id="properties-10">Properties</h4>
706
+ <div class="table-scroll">
707
+
708
+
709
+
710
+
711
+
712
+
713
+
714
+
715
+
716
+
717
+
718
+
719
+
720
+
721
+
722
+
723
+
724
+
725
+
726
+
727
+
728
+
729
+
730
+
731
+
732
+
733
+
734
+
735
+
736
+
737
+
738
+
739
+
740
+
741
+
742
+
743
+
744
+
745
+
746
+
747
+
748
+
749
+
750
+
751
+
752
+
753
+
754
+
755
+
756
+
757
+
758
+
759
+
760
+
761
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="case-1"></a> <code>case</code></td><td align="left"><a href="#rtdbcase"><code>RtdbCase</code></a></td><td align="left">-</td></tr><tr><td align="left"><a id="decision-2"></a> <code>decision</code></td><td align="left"><code>"ALLOW"</code> | <code>"DENY"</code> | <code>"UNSUPPORTED"</code></td><td align="left">-</td></tr><tr><td align="left"><a id="description-3"></a> <code>description?</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="expectation-4"></a> <code>expectation</code></td><td align="left"><code>"ALLOW"</code> | <code>"DENY"</code></td><td align="left">-</td></tr><tr><td align="left"><a id="matchedpath"></a> <code>matchedPath</code></td><td align="left"><code>string</code></td><td align="left">The tree path whose rule decided the request.</td></tr><tr><td align="left"><a id="matchedrule"></a> <code>matchedRule</code></td><td align="left"><code>string</code></td><td align="left">Which rule kind (<code>.read</code> / <code>.write</code> / <code>.validate</code>) decided.</td></tr><tr><td align="left"><a id="passed-2"></a> <code>passed</code></td><td align="left"><code>boolean</code></td><td align="left">-</td></tr><tr><td align="left"><a id="reason-1"></a> <code>reason</code></td><td align="left"><code>string</code></td><td align="left">Engine-provided reason string.</td></tr><tr><td align="left"><a id="unsupported-2"></a> <code>unsupported</code></td><td align="left"><code>boolean</code></td><td align="left">-</td></tr></tbody></table></div>
762
+ <hr>
763
+ <p><a id="rtdbexplanation"></a></p>
764
+ <h3 id="rtdbexplanation">RtdbExplanation</h3>
765
+ <h4 id="properties-11">Properties</h4>
766
+ <div class="table-scroll">
767
+
768
+
769
+
770
+
771
+
772
+
773
+
774
+
775
+
776
+
777
+
778
+
779
+
780
+
781
+
782
+
783
+
784
+
785
+
786
+
787
+
788
+
789
+
790
+
791
+
792
+
793
+
794
+
795
+
796
+
797
+
798
+
799
+
800
+
801
+
802
+
803
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="decision-3"></a> <code>decision</code></td><td align="left"><code>"ALLOW"</code> | <code>"DENY"</code> | <code>"UNSUPPORTED"</code></td></tr><tr><td align="left"><a id="expectation-5"></a> <code>expectation</code></td><td align="left"><code>"ALLOW"</code> | <code>"DENY"</code></td></tr><tr><td align="left"><a id="matchedpath-1"></a> <code>matchedPath</code></td><td align="left"><code>string</code></td></tr><tr><td align="left"><a id="matchedrule-1"></a> <code>matchedRule</code></td><td align="left"><code>string</code></td></tr><tr><td align="left"><a id="passed-3"></a> <code>passed</code></td><td align="left"><code>boolean</code></td></tr><tr><td align="left"><a id="reason-2"></a> <code>reason</code></td><td align="left"><code>string</code></td></tr><tr><td align="left"><a id="unsupported-3"></a> <code>unsupported</code></td><td align="left"><code>boolean</code></td></tr></tbody></table></div>
804
+ <hr>
805
+ <p><a id="rtdbrulescheckresult"></a></p>
806
+ <h3 id="rtdbrulescheckresult">RtdbRulesCheckResult</h3>
807
+ <h4 id="properties-12">Properties</h4>
808
+ <div class="table-scroll">
809
+
810
+
811
+
812
+
813
+
814
+
815
+
816
+
817
+
818
+
819
+
820
+
821
+
822
+
823
+
824
+
825
+
826
+
827
+
828
+
829
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="errors"></a> <code>errors</code></td><td align="left"><a href="#rtdbrulesfinding"><code>RtdbRulesFinding</code></a>[]</td></tr><tr><td align="left"><a id="ok"></a> <code>ok</code></td><td align="left"><code>boolean</code></td></tr><tr><td align="left"><a id="warnings"></a> <code>warnings</code></td><td align="left"><a href="#rtdbrulesfinding"><code>RtdbRulesFinding</code></a>[]</td></tr></tbody></table></div>
830
+ <hr>
831
+ <p><a id="rtdbrulesdefinition"></a></p>
832
+ <h3 id="rtdbrulesdefinition">RtdbRulesDefinition</h3>
833
+ <h4 id="properties-13">Properties</h4>
834
+ <div class="table-scroll">
835
+
836
+
837
+
838
+
839
+
840
+
841
+
842
+
843
+
844
+
845
+
846
+
847
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="paths"></a> <code>paths</code></td><td align="left">| <code>Record</code>&#x3C;<code>string</code>, <a href="#pathdef"><code>PathDef</code></a>> | (<code>ctx</code>: <a href="#rulesetcontext"><code>RulesetContext</code></a>) => <code>void</code></td></tr></tbody></table></div>
848
+ <hr>
849
+ <p><a id="rtdbrulesdocument"></a></p>
850
+ <h3 id="rtdbrulesdocument">RtdbRulesDocument</h3>
851
+ <p>The authored RTDB rules artifact <code>defineRtdbRules</code> returns.</p>
852
+ <p>Deliberately INERT on the public surface: it exposes no methods. It is a
853
+ value you author and hand to <code>rtdbRules()</code>, which is the one analysis
854
+ surface (<code>lint</code> / <code>simulate</code> / <code>explain</code> / <code>toJSON</code>). The brand is
855
+ type-level only; nothing exists at runtime.</p>
856
+ <h4 id="properties-14">Properties</h4>
857
+ <div class="table-scroll">
858
+
859
+
860
+
861
+
862
+
863
+
864
+
865
+
866
+
867
+
868
+
869
+
870
+
871
+
872
+ <table><thead><tr><th align="left">Property</th><th align="left">Modifier</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="rtdb_rules_document_brand"></a> <code>[RTDB_RULES_DOCUMENT_BRAND]?</code></td><td align="left"><code>readonly</code></td><td align="left"><code>never</code></td></tr></tbody></table></div>
873
+ <hr>
874
+ <p><a id="rtdbruleset"></a></p>
875
+ <h3 id="rtdbruleset">RtdbRuleset</h3>
876
+ <h4 id="methods-1">Methods</h4>
877
+ <p><a id="explain-2"></a></p>
878
+ <h5 id="explain-1">explain()</h5>
879
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#61AFEF">explain</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">oneCase</span><span style="color:#ABB2BF">: </span><span style="color:#E06C75">RtdbCase</span><span style="color:#ABB2BF">): </span><span style="color:#E06C75">RtdbExplanation</span><span style="color:#ABB2BF">;</span></span></code></pre>
880
+ <p>The structured account of why one case resolved as it did.</p>
881
+ <h6 id="parameters-5">Parameters</h6>
882
+ <div class="table-scroll">
883
+
884
+
885
+
886
+
887
+
888
+
889
+
890
+
891
+
892
+
893
+
894
+
895
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>oneCase</code></td><td align="left"><a href="#rtdbcase"><code>RtdbCase</code></a></td></tr></tbody></table></div>
896
+ <h6 id="returns-7">Returns</h6>
897
+ <p><a href="#rtdbexplanation"><code>RtdbExplanation</code></a></p>
898
+ <p><a id="lint-2"></a></p>
899
+ <h5 id="lint-1">lint()</h5>
900
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#61AFEF">lint</span><span style="color:#ABB2BF">(): </span><span style="color:#E06C75">RuleIssue</span><span style="color:#ABB2BF">[];</span></span></code></pre>
901
+ <p>Structural findings on the compiled ruleset (from <code>check()</code>).</p>
902
+ <h6 id="returns-8">Returns</h6>
903
+ <p><a href="#ruleissue"><code>RuleIssue</code></a>[]</p>
904
+ <p><a id="simulate-2"></a></p>
905
+ <h5 id="simulate-1">simulate()</h5>
906
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#61AFEF">simulate</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">cases</span><span style="color:#ABB2BF">: </span><span style="color:#E06C75">RtdbCase</span><span style="color:#ABB2BF">[]): </span><span style="color:#E06C75">RtdbSimulationSummary</span><span style="color:#ABB2BF">;</span></span></code></pre>
907
+ <p>Run every case. Never throws on a rule outcome.</p>
908
+ <h6 id="parameters-6">Parameters</h6>
909
+ <div class="table-scroll">
910
+
911
+
912
+
913
+
914
+
915
+
916
+
917
+
918
+
919
+
920
+
921
+
922
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>cases</code></td><td align="left"><a href="#rtdbcase"><code>RtdbCase</code></a>[]</td></tr></tbody></table></div>
923
+ <h6 id="returns-9">Returns</h6>
924
+ <p><a href="#rtdbsimulationsummary"><code>RtdbSimulationSummary</code></a></p>
925
+ <p><a id="tojson-2"></a></p>
926
+ <h5 id="tojson-1">toJSON()</h5>
927
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#61AFEF">toJSON</span><span style="color:#ABB2BF">(): </span><span style="color:#E06C75">RtdbRulesJson</span><span style="color:#ABB2BF">;</span></span></code></pre>
928
+ <p>The compiled <code>rules.json</code>.</p>
929
+ <h6 id="returns-10">Returns</h6>
930
+ <p><a href="#rtdbrulesjson"><code>RtdbRulesJson</code></a></p>
931
+ <hr>
932
+ <p><a id="rtdbrulesfinding"></a></p>
933
+ <h3 id="rtdbrulesfinding">RtdbRulesFinding</h3>
934
+ <h4 id="properties-15">Properties</h4>
935
+ <div class="table-scroll">
936
+
937
+
938
+
939
+
940
+
941
+
942
+
943
+
944
+
945
+
946
+
947
+
948
+
949
+
950
+
951
+
952
+
953
+
954
+
955
+
956
+
957
+
958
+
959
+
960
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="code"></a> <code>code</code></td><td align="left"><code>string</code></td></tr><tr><td align="left"><a id="message"></a> <code>message</code></td><td align="left"><code>string</code></td></tr><tr><td align="left"><a id="path-2"></a> <code>path</code></td><td align="left"><code>string</code></td></tr><tr><td align="left"><a id="rule"></a> <code>rule</code></td><td align="left"><a href="#rtdbrulesfindingrule-1"><code>RtdbRulesFindingRule</code></a></td></tr></tbody></table></div>
961
+ <hr>
962
+ <p><a id="rtdbsimulationsummary"></a></p>
963
+ <h3 id="rtdbsimulationsummary">RtdbSimulationSummary</h3>
964
+ <h4 id="properties-16">Properties</h4>
965
+ <div class="table-scroll">
966
+
967
+
968
+
969
+
970
+
971
+
972
+
973
+
974
+
975
+
976
+
977
+
978
+
979
+
980
+
981
+
982
+
983
+
984
+
985
+
986
+
987
+
988
+
989
+
990
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="cases"></a> <code>cases</code></td><td align="left"><a href="#rtdbcaseresult"><code>RtdbCaseResult</code></a>[]</td></tr><tr><td align="left"><a id="failed"></a> <code>failed</code></td><td align="left"><code>number</code></td></tr><tr><td align="left"><a id="passed-4"></a> <code>passed</code></td><td align="left"><code>number</code></td></tr><tr><td align="left"><a id="unsupported-4"></a> <code>unsupported</code></td><td align="left"><code>number</code></td></tr></tbody></table></div>
991
+ <hr>
992
+ <p><a id="ruleevaluation"></a></p>
993
+ <h3 id="ruleevaluation">RuleEvaluation</h3>
994
+ <p>Per-rule evaluation entry produced by the local simulator. Each entry
995
+ corresponds to one <code>allow</code> declaration the simulator evaluated, in
996
+ source order.</p>
997
+ <p>Populated only by <code>SimulateFirestoreRulesHandler</code> (which has the parsed
998
+ AST in hand); the production Test API client (<code>TestFirestoreRulesHandler</code>)
999
+ returns an empty <code>trace</code> and surfaces the wire text on <code>TestResult.notes</code>.</p>
1000
+ <h4 id="properties-17">Properties</h4>
1001
+ <div class="table-scroll">
1002
+
1003
+
1004
+
1005
+
1006
+
1007
+
1008
+
1009
+
1010
+
1011
+
1012
+
1013
+
1014
+
1015
+
1016
+
1017
+
1018
+
1019
+
1020
+
1021
+
1022
+
1023
+
1024
+
1025
+
1026
+
1027
+
1028
+
1029
+
1030
+
1031
+
1032
+
1033
+
1034
+
1035
+
1036
+
1037
+
1038
+
1039
+
1040
+
1041
+
1042
+
1043
+
1044
+
1045
+
1046
+
1047
+
1048
+
1049
+
1050
+
1051
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="conditiontext"></a> <code>conditionText?</code></td><td align="left"><code>string</code></td><td align="left">Pretty-printed condition expression. Use this verbatim in agent-facing summaries — derived from the AST via <code>printExpression</code>, so it survives comment removal and whitespace re-flow in the source.</td></tr><tr><td align="left"><a id="expressiontrace-1"></a> <code>expressionTrace?</code></td><td align="left"><a href="#exprtraceentry"><code>ExprTraceEntry</code></a>[]</td><td align="left">Per-sub-expression evaluation trace for this rule’s condition. Flat, in evaluation order; reconstruct the tree via the <code>parent</code> index on each entry. Populated by the local simulator when the caller enables tracing — currently always on for <code>SimulateFirestoreRulesHandler.simulate()</code> so agents can see <em>why</em> a rule’s condition resolved as it did (which disjunct was true, which <code>let</code> binding the value flowed through, which method call threw). Absent on entries that came from the production Test API client (no AST visibility).</td></tr><tr><td align="left"><a id="line-2"></a> <code>line?</code></td><td align="left"><code>number</code></td><td align="left">1-indexed source line of the <code>allow</code> keyword. Populated when the rule’s <code>loc</code> was set by the parser.</td></tr><tr><td align="left"><a id="matchpath"></a> <code>matchPath?</code></td><td align="left"><code>string</code></td><td align="left">Source-rendered path of the <code>match</code> block this rule belongs to, e.g. <code>'/docs/{docId}'</code> or <code>'/{document=**}'</code>. Populated when the request path matches MORE THAN ONE overlapping <code>match</code> block: allows OR-combine across every matching block (production semantics — there is no first-match-wins), so a DENY trace can carry entries from several blocks. This field keeps them unambiguous — which block did this rule live in. Absent for the common single-block case.</td></tr><tr><td align="left"><a id="message-1"></a> <code>message?</code></td><td align="left"><code>string</code></td><td align="left">Human-readable diagnostic — populated for <code>UNSUPPORTED</code> (which sim surface is missing) and <code>ERROR</code> (which runtime error caused the rule to abort).</td></tr><tr><td align="left"><a id="operations"></a> <code>operations</code></td><td align="left">(<code>"get"</code> | <code>"list"</code> | <code>"create"</code> | <code>"update"</code> | <code>"delete"</code> | <code>"read"</code> | <code>"write"</code>)[]</td><td align="left">Operations declared on the allow rule (<code>read</code>, <code>write</code>, <code>get</code>, …).</td></tr><tr><td align="left"><a id="ruleindex"></a> <code>ruleIndex</code></td><td align="left"><code>number</code></td><td align="left">Position of the <code>allow</code> declaration within its match block, 0-indexed in source order.</td></tr><tr><td align="left"><a id="verdict-1"></a> <code>verdict</code></td><td align="left"><code>"ALLOW"</code> | <code>"DENY"</code> | <code>"UNSUPPORTED"</code> | <code>"ERROR"</code></td><td align="left">Outcome for this single rule. The TestResult’s overall <code>decision</code> is derived from the trace under OR semantics (any <code>'ALLOW'</code> ⇒ ALLOW, else any <code>'UNSUPPORTED'</code> ⇒ UNSUPPORTED, else DENY).</td></tr></tbody></table></div>
1052
+ <hr>
1053
+ <p><a id="ruleissue"></a></p>
1054
+ <h3 id="ruleissue">RuleIssue</h3>
1055
+ <h4 id="properties-18">Properties</h4>
1056
+ <div class="table-scroll">
1057
+
1058
+
1059
+
1060
+
1061
+
1062
+
1063
+
1064
+
1065
+
1066
+
1067
+
1068
+
1069
+
1070
+
1071
+
1072
+
1073
+
1074
+
1075
+
1076
+
1077
+
1078
+
1079
+
1080
+
1081
+
1082
+
1083
+
1084
+
1085
+
1086
+
1087
+
1088
+
1089
+
1090
+
1091
+
1092
+
1093
+
1094
+
1095
+
1096
+
1097
+
1098
+
1099
+
1100
+
1101
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="code-1"></a> <code>code</code></td><td align="left"><code>string</code></td><td align="left">Stable machine code, e.g. <code>'PARSE_ERROR'</code>, <code>'SEC-4'</code>, <code>'GET_BUDGET'</code>.</td></tr><tr><td align="left"><a id="fix"></a> <code>fix?</code></td><td align="left"><code>string</code></td><td align="left">Suggested remediation, verbatim, when the producing stage offers one.</td></tr><tr><td align="left"><a id="line-3"></a> <code>line?</code></td><td align="left"><code>number</code></td><td align="left">1-indexed source line, when known.</td></tr><tr><td align="left"><a id="message-2"></a> <code>message</code></td><td align="left"><code>string</code></td><td align="left">Human-readable description.</td></tr><tr><td align="left"><a id="origin"></a> <code>origin</code></td><td align="left"><a href="#ruleissueorigin-1"><code>RuleIssueOrigin</code></a></td><td align="left">-</td></tr><tr><td align="left"><a id="path-3"></a> <code>path?</code></td><td align="left"><code>string</code></td><td align="left">Rules path the issue applies to, when known (e.g. <code>'/users/{uid}'</code>).</td></tr><tr><td align="left"><a id="severity"></a> <code>severity</code></td><td align="left"><a href="#ruleissueseverity-1"><code>RuleIssueSeverity</code></a></td><td align="left">-</td></tr></tbody></table></div>
1102
+ <hr>
1103
+ <p><a id="rulesetcontext"></a></p>
1104
+ <h3 id="rulesetcontext">RulesetContext</h3>
1105
+ <p>Context passed to the callback overload of ruleset().</p>
1106
+ <h4 id="properties-19">Properties</h4>
1107
+ <div class="table-scroll">
1108
+
1109
+
1110
+
1111
+
1112
+
1113
+
1114
+
1115
+
1116
+
1117
+
1118
+
1119
+
1120
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="path-4"></a> <code>path</code></td><td align="left">(<code>path</code>: <code>string</code>, <code>def</code>: <a href="#pathdef"><code>PathDef</code></a>) => <code>void</code></td></tr></tbody></table></div>
1121
+ <hr>
1122
+ <p><a id="schemarulesresult"></a></p>
1123
+ <h3 id="schemarulesresult">SchemaRulesResult</h3>
1124
+ <h4 id="properties-20">Properties</h4>
1125
+ <div class="table-scroll">
1126
+
1127
+
1128
+
1129
+
1130
+
1131
+
1132
+
1133
+
1134
+
1135
+
1136
+
1137
+
1138
+
1139
+
1140
+
1141
+
1142
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="children-1"></a> <code>children</code></td><td align="left"><code>Record</code>&#x3C;<code>string</code>, { <code>children?</code>: <code>Record</code>&#x3C;<code>string</code>, { <code>validate</code>: <a href="#expr"><code>Expr</code></a>; }>; <code>validate</code>: <a href="#expr"><code>Expr</code></a>; }></td></tr><tr><td align="left"><a id="validate-1"></a> <code>validate</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
1143
+ <hr>
1144
+ <p><a id="simulationsummary"></a></p>
1145
+ <h3 id="simulationsummary">SimulationSummary</h3>
1146
+ <p>Aggregate of a <code>simulate(cases)</code> run. Counts partition the cases:
1147
+ <code>passed + failed + unsupported === cases.length</code>.</p>
1148
+ <h4 id="properties-21">Properties</h4>
1149
+ <div class="table-scroll">
1150
+
1151
+
1152
+
1153
+
1154
+
1155
+
1156
+
1157
+
1158
+
1159
+
1160
+
1161
+
1162
+
1163
+
1164
+
1165
+
1166
+
1167
+
1168
+
1169
+
1170
+
1171
+
1172
+
1173
+
1174
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="cases-1"></a> <code>cases</code></td><td align="left"><a href="#caseresult"><code>CaseResult</code></a>[]</td></tr><tr><td align="left"><a id="failed-1"></a> <code>failed</code></td><td align="left"><code>number</code></td></tr><tr><td align="left"><a id="passed-5"></a> <code>passed</code></td><td align="left"><code>number</code></td></tr><tr><td align="left"><a id="unsupported-5"></a> <code>unsupported</code></td><td align="left"><code>number</code></td></tr></tbody></table></div>
1175
+ <h2 id="type-aliases">Type Aliases</h2>
1176
+ <p><a id="expr"></a></p>
1177
+ <h3 id="expr">Expr</h3>
1178
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">type</span><span style="color:#E5C07B"> Expr</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> string</span><span style="color:#ABB2BF">;</span></span></code></pre>
1179
+ <p>Type alias for RTDB rule expression strings.</p>
1180
+ <hr>
1181
+ <p><a id="firestoremethod"></a></p>
1182
+ <h3 id="firestoremethod">FirestoreMethod</h3>
1183
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">type</span><span style="color:#E5C07B"> FirestoreMethod</span><span style="color:#56B6C2"> =</span><span style="color:#C678DD"> typeof</span><span style="color:#E5C07B"> FIRESTORE_METHODS</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">number</span><span style="color:#ABB2BF">];</span></span></code></pre>
1184
+ <hr>
1185
+ <p><a id="rtdbrulesfindingrule-1"></a></p>
1186
+ <h3 id="rtdbrulesfindingrule">RtdbRulesFindingRule</h3>
1187
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">type</span><span style="color:#E5C07B"> RtdbRulesFindingRule</span><span style="color:#56B6C2"> =</span><span style="color:#98C379"> ".read"</span><span style="color:#ABB2BF"> | </span><span style="color:#98C379">".write"</span><span style="color:#ABB2BF"> | </span><span style="color:#98C379">".validate"</span><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"ruleset"</span><span style="color:#ABB2BF">;</span></span></code></pre>
1188
+ <hr>
1189
+ <p><a id="rtdbrulesjson"></a></p>
1190
+ <h3 id="rtdbrulesjson">RtdbRulesJson</h3>
1191
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">type</span><span style="color:#E5C07B"> RtdbRulesJson</span><span style="color:#56B6C2"> =</span><span style="color:#ABB2BF"> {</span></span>
1192
+ <span class="line"><span style="color:#E06C75"> rules</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">Record</span><span style="color:#ABB2BF">&#x3C;</span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">, </span><span style="color:#E5C07B">unknown</span><span style="color:#ABB2BF">>;</span></span>
1193
+ <span class="line"><span style="color:#ABB2BF">};</span></span></code></pre>
1194
+ <h4 id="properties-22">Properties</h4>
1195
+ <div class="table-scroll">
1196
+
1197
+
1198
+
1199
+
1200
+
1201
+
1202
+
1203
+
1204
+
1205
+
1206
+
1207
+
1208
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="rules"></a> <code>rules</code></td><td align="left"><code>Record</code>&#x3C;<code>string</code>, <code>unknown</code>></td></tr></tbody></table></div>
1209
+ <hr>
1210
+ <p><a id="rtdbrulessimulationauth"></a></p>
1211
+ <h3 id="rtdbrulessimulationauth">RtdbRulesSimulationAuth</h3>
1212
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">type</span><span style="color:#E5C07B"> RtdbRulesSimulationAuth</span><span style="color:#56B6C2"> =</span></span>
1213
+ <span class="line"><span style="color:#ABB2BF"> | </span><span style="color:#E5C07B">string</span></span>
1214
+ <span class="line"><span style="color:#ABB2BF"> | {</span></span>
1215
+ <span class="line"><span style="color:#E06C75"> token</span><span style="color:#C678DD">?</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">Record</span><span style="color:#ABB2BF">&#x3C;</span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">, </span><span style="color:#E5C07B">unknown</span><span style="color:#ABB2BF">>;</span></span>
1216
+ <span class="line"><span style="color:#E06C75"> uid</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">;</span></span>
1217
+ <span class="line"><span style="color:#ABB2BF">}</span></span>
1218
+ <span class="line"><span style="color:#ABB2BF"> | </span><span style="color:#E5C07B">null</span><span style="color:#ABB2BF">;</span></span></code></pre>
1219
+ <hr>
1220
+ <p><a id="rtdbrulessimulationinput"></a></p>
1221
+ <h3 id="rtdbrulessimulationinput">RtdbRulesSimulationInput</h3>
1222
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">type</span><span style="color:#E5C07B"> RtdbRulesSimulationInput</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> Omit</span><span style="color:#ABB2BF">&#x3C;</span><span style="color:#E5C07B">SimulationInput</span><span style="color:#ABB2BF">, </span><span style="color:#98C379">"auth"</span><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"mockData"</span><span style="color:#ABB2BF">> &#x26; {</span></span>
1223
+ <span class="line"><span style="color:#E06C75"> auth</span><span style="color:#C678DD">?</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">RtdbRulesSimulationAuth</span><span style="color:#ABB2BF">;</span></span>
1224
+ <span class="line"><span style="color:#E06C75"> data</span><span style="color:#C678DD">?</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">Record</span><span style="color:#ABB2BF">&#x3C;</span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">, </span><span style="color:#E5C07B">unknown</span><span style="color:#ABB2BF">>;</span></span>
1225
+ <span class="line"><span style="color:#E06C75"> mockData</span><span style="color:#C678DD">?</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">Record</span><span style="color:#ABB2BF">&#x3C;</span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">, </span><span style="color:#E5C07B">unknown</span><span style="color:#ABB2BF">>;</span></span>
1226
+ <span class="line"><span style="color:#ABB2BF">};</span></span></code></pre>
1227
+ <h4 id="type-declaration">Type Declaration</h4>
1228
+ <h5 id="auth">auth?</h5>
1229
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#E06C75">optional</span><span style="color:#E06C75"> auth</span><span style="color:#ABB2BF">: </span><span style="color:#E06C75">RtdbRulesSimulationAuth</span><span style="color:#ABB2BF">;</span></span></code></pre>
1230
+ <h5 id="data">data?</h5>
1231
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#E06C75">optional</span><span style="color:#E06C75"> data</span><span style="color:#ABB2BF">: </span><span style="color:#E06C75">Record</span><span style="color:#56B6C2">&#x3C;</span><span style="color:#E06C75">string</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75">unknown</span><span style="color:#56B6C2">></span><span style="color:#ABB2BF">;</span></span></code></pre>
1232
+ <h5 id="mockdata">mockData?</h5>
1233
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#E06C75">optional</span><span style="color:#E06C75"> mockData</span><span style="color:#ABB2BF">: </span><span style="color:#E06C75">Record</span><span style="color:#56B6C2">&#x3C;</span><span style="color:#E06C75">string</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75">unknown</span><span style="color:#56B6C2">></span><span style="color:#ABB2BF">;</span></span></code></pre>
1234
+ <hr>
1235
+ <p><a id="ruleissueorigin-1"></a></p>
1236
+ <h3 id="ruleissueorigin">RuleIssueOrigin</h3>
1237
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">type</span><span style="color:#E5C07B"> RuleIssueOrigin</span><span style="color:#56B6C2"> =</span><span style="color:#98C379"> "parse"</span><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"validate"</span><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"lint"</span><span style="color:#ABB2BF">;</span></span></code></pre>
1238
+ <p>The stage that produced the issue.</p>
1239
+ <ul>
1240
+ <li><code>parse</code> — the source did not parse; nothing downstream ran.</li>
1241
+ <li><code>validate</code> — a structural/security finding on a parsed ruleset.</li>
1242
+ <li><code>lint</code> — a budget/quality/hallucination warning.</li>
1243
+ </ul>
1244
+ <hr>
1245
+ <p><a id="ruleissueseverity-1"></a></p>
1246
+ <h3 id="ruleissueseverity">RuleIssueSeverity</h3>
1247
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">type</span><span style="color:#E5C07B"> RuleIssueSeverity</span><span style="color:#56B6C2"> =</span><span style="color:#98C379"> "error"</span><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"warning"</span><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"info"</span><span style="color:#ABB2BF">;</span></span></code></pre>
1248
+ <p>Ordered by decreasing urgency. <code>info</code> is advisory.</p>
1249
+ <hr>
1250
+ <p><a id="segment"></a></p>
1251
+ <h3 id="segment">Segment</h3>
1252
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">type</span><span style="color:#E5C07B"> Segment</span><span style="color:#56B6C2"> =</span></span>
1253
+ <span class="line"><span style="color:#ABB2BF"> | </span><span style="color:#E5C07B">string</span></span>
1254
+ <span class="line"><span style="color:#ABB2BF"> | {</span></span>
1255
+ <span class="line"><span style="color:#E06C75"> $</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">;</span></span>
1256
+ <span class="line"><span style="color:#ABB2BF">};</span></span></code></pre>
1257
+ <p>A path segment: string for literal, { $: name } for path variable.</p>
1258
+ <h2 id="variables">Variables</h2>
1259
+ <p><a id="all"></a></p>
1260
+ <h3 id="all">all()</h3>
1261
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> all</span><span style="color:#ABB2BF">: (...</span><span style="color:#E06C75;font-style:italic">exprs</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">Expr</span><span style="color:#ABB2BF">[]) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1262
+ <p>All conditions must be true (AND).</p>
1263
+ <h4 id="parameters-7">Parameters</h4>
1264
+ <div class="table-scroll">
1265
+
1266
+
1267
+
1268
+
1269
+
1270
+
1271
+
1272
+
1273
+
1274
+
1275
+
1276
+
1277
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left">…<code>exprs</code></td><td align="left"><a href="#expr"><code>Expr</code></a>[]</td></tr></tbody></table></div>
1278
+ <h4 id="returns-11">Returns</h4>
1279
+ <p><a href="#expr"><code>Expr</code></a></p>
1280
+ <hr>
1281
+ <p><a id="allow"></a></p>
1282
+ <h3 id="allow">allow()</h3>
1283
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> allow</span><span style="color:#ABB2BF">: () </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1284
+ <p>Always allow (true). Readable alias for always().</p>
1285
+ <h4 id="returns-12">Returns</h4>
1286
+ <p><a href="#expr"><code>Expr</code></a></p>
1287
+ <hr>
1288
+ <p><a id="always"></a></p>
1289
+ <h3 id="always">always()</h3>
1290
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> always</span><span style="color:#ABB2BF">: () </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1291
+ <p>Always allow (true).</p>
1292
+ <h4 id="returns-13">Returns</h4>
1293
+ <p><a href="#expr"><code>Expr</code></a></p>
1294
+ <hr>
1295
+ <p><a id="any"></a></p>
1296
+ <h3 id="any">any()</h3>
1297
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> any</span><span style="color:#ABB2BF">: (...</span><span style="color:#E06C75;font-style:italic">exprs</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">Expr</span><span style="color:#ABB2BF">[]) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1298
+ <p>At least one condition must be true (OR).</p>
1299
+ <h4 id="parameters-8">Parameters</h4>
1300
+ <div class="table-scroll">
1301
+
1302
+
1303
+
1304
+
1305
+
1306
+
1307
+
1308
+
1309
+
1310
+
1311
+
1312
+
1313
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left">…<code>exprs</code></td><td align="left"><a href="#expr"><code>Expr</code></a>[]</td></tr></tbody></table></div>
1314
+ <h4 id="returns-14">Returns</h4>
1315
+ <p><a href="#expr"><code>Expr</code></a></p>
1316
+ <hr>
1317
+ <p><a id="auth_uid"></a></p>
1318
+ <h3 id="auth_uid">AUTH_UID</h3>
1319
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#E5C07B"> AUTH_UID</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">Segment</span><span style="color:#ABB2BF">;</span></span></code></pre>
1320
+ <p>auth.uid as a comparison value (unquoted in expressions)</p>
1321
+ <hr>
1322
+ <p><a id="authenticated"></a></p>
1323
+ <h3 id="authenticated">authenticated()</h3>
1324
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> authenticated</span><span style="color:#ABB2BF">: () </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1325
+ <h4 id="returns-15">Returns</h4>
1326
+ <p><a href="#expr"><code>Expr</code></a></p>
1327
+ <hr>
1328
+ <p><a id="dataexists"></a></p>
1329
+ <h3 id="dataexists">dataExists()</h3>
1330
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> dataExists</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">path</span><span style="color:#C678DD">?</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1331
+ <p>Check if data exists at current node or a child path</p>
1332
+ <h4 id="parameters-9">Parameters</h4>
1333
+ <div class="table-scroll">
1334
+
1335
+
1336
+
1337
+
1338
+
1339
+
1340
+
1341
+
1342
+
1343
+
1344
+
1345
+
1346
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>path?</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
1347
+ <h4 id="returns-16">Returns</h4>
1348
+ <p><a href="#expr"><code>Expr</code></a></p>
1349
+ <hr>
1350
+ <p><a id="dataparentval"></a></p>
1351
+ <h3 id="dataparentval">dataParentVal()</h3>
1352
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> dataParentVal</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">depth</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">number</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75;font-style:italic">field</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1353
+ <p>Navigate up from data snapshot, then read a child field’s value</p>
1354
+ <h4 id="parameters-10">Parameters</h4>
1355
+ <div class="table-scroll">
1356
+
1357
+
1358
+
1359
+
1360
+
1361
+
1362
+
1363
+
1364
+
1365
+
1366
+
1367
+
1368
+
1369
+
1370
+
1371
+
1372
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>depth</code></td><td align="left"><code>number</code></td></tr><tr><td align="left"><code>field</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
1373
+ <h4 id="returns-17">Returns</h4>
1374
+ <p><a href="#expr"><code>Expr</code></a></p>
1375
+ <hr>
1376
+ <p><a id="dataval"></a></p>
1377
+ <h3 id="dataval">dataVal()</h3>
1378
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> dataVal</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">path</span><span style="color:#C678DD">?</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1379
+ <p>Read data value at current node or a child path (pre-write state)</p>
1380
+ <h4 id="parameters-11">Parameters</h4>
1381
+ <div class="table-scroll">
1382
+
1383
+
1384
+
1385
+
1386
+
1387
+
1388
+
1389
+
1390
+
1391
+
1392
+
1393
+
1394
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>path?</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
1395
+ <h4 id="returns-18">Returns</h4>
1396
+ <p><a href="#expr"><code>Expr</code></a></p>
1397
+ <hr>
1398
+ <p><a id="deny"></a></p>
1399
+ <h3 id="deny">deny()</h3>
1400
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> deny</span><span style="color:#ABB2BF">: () </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1401
+ <p>Always deny (false).</p>
1402
+ <h4 id="returns-19">Returns</h4>
1403
+ <p><a href="#expr"><code>Expr</code></a></p>
1404
+ <hr>
1405
+ <p><a id="eq"></a></p>
1406
+ <h3 id="eq">eq()</h3>
1407
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> eq</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">left</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">Expr</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75;font-style:italic">right</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">CompareValue</span><span style="color:#ABB2BF">) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1408
+ <p>Strict equality: left === right (right is a literal value or runtime ref)</p>
1409
+ <h4 id="parameters-12">Parameters</h4>
1410
+ <div class="table-scroll">
1411
+
1412
+
1413
+
1414
+
1415
+
1416
+
1417
+
1418
+
1419
+
1420
+
1421
+
1422
+
1423
+
1424
+
1425
+
1426
+
1427
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>left</code></td><td align="left"><a href="#expr"><code>Expr</code></a></td></tr><tr><td align="left"><code>right</code></td><td align="left"><code>CompareValue</code></td></tr></tbody></table></div>
1428
+ <h4 id="returns-20">Returns</h4>
1429
+ <p><a href="#expr"><code>Expr</code></a></p>
1430
+ <hr>
1431
+ <p><a id="expr-1"></a></p>
1432
+ <h3 id="expr-1">expr()</h3>
1433
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> expr</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">raw</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1434
+ <p>Create an Expr from a raw expression string.</p>
1435
+ <h4 id="parameters-13">Parameters</h4>
1436
+ <div class="table-scroll">
1437
+
1438
+
1439
+
1440
+
1441
+
1442
+
1443
+
1444
+
1445
+
1446
+
1447
+
1448
+
1449
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>raw</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
1450
+ <h4 id="returns-21">Returns</h4>
1451
+ <p><a href="#expr"><code>Expr</code></a></p>
1452
+ <hr>
1453
+ <p><a id="fieldenum"></a></p>
1454
+ <h3 id="fieldenum">fieldEnum()</h3>
1455
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> fieldEnum</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">field</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75;font-style:italic">values</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">[]) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1456
+ <p>Field must be one of the allowed string values</p>
1457
+ <h4 id="parameters-14">Parameters</h4>
1458
+ <div class="table-scroll">
1459
+
1460
+
1461
+
1462
+
1463
+
1464
+
1465
+
1466
+
1467
+
1468
+
1469
+
1470
+
1471
+
1472
+
1473
+
1474
+
1475
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>field</code></td><td align="left"><code>string</code></td></tr><tr><td align="left"><code>values</code></td><td align="left"><code>string</code>[]</td></tr></tbody></table></div>
1476
+ <h4 id="returns-22">Returns</h4>
1477
+ <p><a href="#expr"><code>Expr</code></a></p>
1478
+ <hr>
1479
+ <p><a id="fieldisboolean"></a></p>
1480
+ <h3 id="fieldisboolean">fieldIsBoolean()</h3>
1481
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> fieldIsBoolean</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">field</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1482
+ <p>Field must be a boolean</p>
1483
+ <h4 id="parameters-15">Parameters</h4>
1484
+ <div class="table-scroll">
1485
+
1486
+
1487
+
1488
+
1489
+
1490
+
1491
+
1492
+
1493
+
1494
+
1495
+
1496
+
1497
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>field</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
1498
+ <h4 id="returns-23">Returns</h4>
1499
+ <p><a href="#expr"><code>Expr</code></a></p>
1500
+ <hr>
1501
+ <p><a id="fieldisnumber"></a></p>
1502
+ <h3 id="fieldisnumber">fieldIsNumber()</h3>
1503
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> fieldIsNumber</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">field</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1504
+ <p>Field must be a number</p>
1505
+ <h4 id="parameters-16">Parameters</h4>
1506
+ <div class="table-scroll">
1507
+
1508
+
1509
+
1510
+
1511
+
1512
+
1513
+
1514
+
1515
+
1516
+
1517
+
1518
+
1519
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>field</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
1520
+ <h4 id="returns-24">Returns</h4>
1521
+ <p><a href="#expr"><code>Expr</code></a></p>
1522
+ <hr>
1523
+ <p><a id="fieldisstring"></a></p>
1524
+ <h3 id="fieldisstring">fieldIsString()</h3>
1525
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> fieldIsString</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">field</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1526
+ <p>Field must be a string</p>
1527
+ <h4 id="parameters-17">Parameters</h4>
1528
+ <div class="table-scroll">
1529
+
1530
+
1531
+
1532
+
1533
+
1534
+
1535
+
1536
+
1537
+
1538
+
1539
+
1540
+
1541
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>field</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
1542
+ <h4 id="returns-25">Returns</h4>
1543
+ <p><a href="#expr"><code>Expr</code></a></p>
1544
+ <hr>
1545
+ <p><a id="fieldowneronly"></a></p>
1546
+ <h3 id="fieldowneronly">fieldOwnerOnly()</h3>
1547
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> fieldOwnerOnly</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">field</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1548
+ <p>Only the field owner (auth.uid === data.child(field).val()) can access</p>
1549
+ <h4 id="parameters-18">Parameters</h4>
1550
+ <div class="table-scroll">
1551
+
1552
+
1553
+
1554
+
1555
+
1556
+
1557
+
1558
+
1559
+
1560
+
1561
+
1562
+
1563
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>field</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
1564
+ <h4 id="returns-26">Returns</h4>
1565
+ <p><a href="#expr"><code>Expr</code></a></p>
1566
+ <hr>
1567
+ <p><a id="gt"></a></p>
1568
+ <h3 id="gt">gt()</h3>
1569
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> gt</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">left</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">Expr</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75;font-style:italic">right</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">number</span><span style="color:#ABB2BF">) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1570
+ <p>Greater than: left > right</p>
1571
+ <h4 id="parameters-19">Parameters</h4>
1572
+ <div class="table-scroll">
1573
+
1574
+
1575
+
1576
+
1577
+
1578
+
1579
+
1580
+
1581
+
1582
+
1583
+
1584
+
1585
+
1586
+
1587
+
1588
+
1589
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>left</code></td><td align="left"><a href="#expr"><code>Expr</code></a></td></tr><tr><td align="left"><code>right</code></td><td align="left"><code>number</code></td></tr></tbody></table></div>
1590
+ <h4 id="returns-27">Returns</h4>
1591
+ <p><a href="#expr"><code>Expr</code></a></p>
1592
+ <hr>
1593
+ <p><a id="haschild"></a></p>
1594
+ <h3 id="haschild">hasChild()</h3>
1595
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> hasChild</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">field</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1596
+ <p>Incoming data must have a specific child field</p>
1597
+ <h4 id="parameters-20">Parameters</h4>
1598
+ <div class="table-scroll">
1599
+
1600
+
1601
+
1602
+
1603
+
1604
+
1605
+
1606
+
1607
+
1608
+
1609
+
1610
+
1611
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>field</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
1612
+ <h4 id="returns-28">Returns</h4>
1613
+ <p><a href="#expr"><code>Expr</code></a></p>
1614
+ <hr>
1615
+ <p><a id="haschildren"></a></p>
1616
+ <h3 id="haschildren">hasChildren()</h3>
1617
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> hasChildren</span><span style="color:#ABB2BF">: () </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1618
+ <p>Incoming data must be an object with at least one child</p>
1619
+ <h4 id="returns-29">Returns</h4>
1620
+ <p><a href="#expr"><code>Expr</code></a></p>
1621
+ <hr>
1622
+ <p><a id="hasrole"></a></p>
1623
+ <h3 id="hasrole">hasRole()</h3>
1624
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> hasRole</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">segments</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">Segment</span><span style="color:#ABB2BF">[], </span><span style="color:#E06C75;font-style:italic">role</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1625
+ <p>Cross-path role check via root lookup</p>
1626
+ <h4 id="parameters-21">Parameters</h4>
1627
+ <div class="table-scroll">
1628
+
1629
+
1630
+
1631
+
1632
+
1633
+
1634
+
1635
+
1636
+
1637
+
1638
+
1639
+
1640
+
1641
+
1642
+
1643
+
1644
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>segments</code></td><td align="left"><a href="#segment"><code>Segment</code></a>[]</td></tr><tr><td align="left"><code>role</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
1645
+ <h4 id="returns-30">Returns</h4>
1646
+ <p><a href="#expr"><code>Expr</code></a></p>
1647
+ <hr>
1648
+ <p><a id="immutable"></a></p>
1649
+ <h3 id="immutable">immutable()</h3>
1650
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> immutable</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">field</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1651
+ <p>Field can be set on creation but never changed after</p>
1652
+ <h4 id="parameters-22">Parameters</h4>
1653
+ <div class="table-scroll">
1654
+
1655
+
1656
+
1657
+
1658
+
1659
+
1660
+
1661
+
1662
+
1663
+
1664
+
1665
+
1666
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>field</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
1667
+ <h4 id="returns-31">Returns</h4>
1668
+ <p><a href="#expr"><code>Expr</code></a></p>
1669
+ <hr>
1670
+ <p><a id="immutableself"></a></p>
1671
+ <h3 id="immutableself">immutableSelf()</h3>
1672
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> immutableSelf</span><span style="color:#ABB2BF">: () </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1673
+ <p>This node’s own value can be set on creation but never changed</p>
1674
+ <h4 id="returns-32">Returns</h4>
1675
+ <p><a href="#expr"><code>Expr</code></a></p>
1676
+ <hr>
1677
+ <p><a id="ismember"></a></p>
1678
+ <h3 id="ismember">isMember()</h3>
1679
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> isMember</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">listName</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75;font-style:italic">pathVarName</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1680
+ <p>Cross-path membership check: root.child(list).child($var).child(auth.uid).exists()</p>
1681
+ <h4 id="parameters-23">Parameters</h4>
1682
+ <div class="table-scroll">
1683
+
1684
+
1685
+
1686
+
1687
+
1688
+
1689
+
1690
+
1691
+
1692
+
1693
+
1694
+
1695
+
1696
+
1697
+
1698
+
1699
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>listName</code></td><td align="left"><code>string</code></td></tr><tr><td align="left"><code>pathVarName</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
1700
+ <h4 id="returns-33">Returns</h4>
1701
+ <p><a href="#expr"><code>Expr</code></a></p>
1702
+ <hr>
1703
+ <p><a id="isnew"></a></p>
1704
+ <h3 id="isnew">isNew()</h3>
1705
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> isNew</span><span style="color:#ABB2BF">: () </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1706
+ <p>Data at this path doesn’t exist yet (creation check)</p>
1707
+ <h4 id="returns-34">Returns</h4>
1708
+ <p><a href="#expr"><code>Expr</code></a></p>
1709
+ <hr>
1710
+ <p><a id="lte"></a></p>
1711
+ <h3 id="lte">lte()</h3>
1712
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> lte</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">left</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">Expr</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75;font-style:italic">right</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">number</span><span style="color:#ABB2BF">) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1713
+ <p>Less than or equal: left &#x3C;= right</p>
1714
+ <h4 id="parameters-24">Parameters</h4>
1715
+ <div class="table-scroll">
1716
+
1717
+
1718
+
1719
+
1720
+
1721
+
1722
+
1723
+
1724
+
1725
+
1726
+
1727
+
1728
+
1729
+
1730
+
1731
+
1732
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>left</code></td><td align="left"><a href="#expr"><code>Expr</code></a></td></tr><tr><td align="left"><code>right</code></td><td align="left"><code>number</code></td></tr></tbody></table></div>
1733
+ <h4 id="returns-35">Returns</h4>
1734
+ <p><a href="#expr"><code>Expr</code></a></p>
1735
+ <hr>
1736
+ <p><a id="neq"></a></p>
1737
+ <h3 id="neq">neq()</h3>
1738
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> neq</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">left</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">Expr</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75;font-style:italic">right</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">CompareValue</span><span style="color:#ABB2BF">) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1739
+ <p>Strict inequality: left !== right</p>
1740
+ <h4 id="parameters-25">Parameters</h4>
1741
+ <div class="table-scroll">
1742
+
1743
+
1744
+
1745
+
1746
+
1747
+
1748
+
1749
+
1750
+
1751
+
1752
+
1753
+
1754
+
1755
+
1756
+
1757
+
1758
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>left</code></td><td align="left"><a href="#expr"><code>Expr</code></a></td></tr><tr><td align="left"><code>right</code></td><td align="left"><code>CompareValue</code></td></tr></tbody></table></div>
1759
+ <h4 id="returns-36">Returns</h4>
1760
+ <p><a href="#expr"><code>Expr</code></a></p>
1761
+ <hr>
1762
+ <p><a id="newdataexists"></a></p>
1763
+ <h3 id="newdataexists">newDataExists()</h3>
1764
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> newDataExists</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">path</span><span style="color:#C678DD">?</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1765
+ <p>Check if incoming data exists at current node or a child path</p>
1766
+ <h4 id="parameters-26">Parameters</h4>
1767
+ <div class="table-scroll">
1768
+
1769
+
1770
+
1771
+
1772
+
1773
+
1774
+
1775
+
1776
+
1777
+
1778
+
1779
+
1780
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>path?</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
1781
+ <h4 id="returns-37">Returns</h4>
1782
+ <p><a href="#expr"><code>Expr</code></a></p>
1783
+ <hr>
1784
+ <p><a id="newdatais"></a></p>
1785
+ <h3 id="newdatais">newDataIs()</h3>
1786
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> newDataIs</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">type</span><span style="color:#ABB2BF">: </span><span style="color:#98C379">"String"</span><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"Number"</span><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"Boolean"</span><span style="color:#ABB2BF">) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1787
+ <p>Check incoming data type at current node</p>
1788
+ <h4 id="parameters-27">Parameters</h4>
1789
+ <div class="table-scroll">
1790
+
1791
+
1792
+
1793
+
1794
+
1795
+
1796
+
1797
+
1798
+
1799
+
1800
+
1801
+
1802
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>type</code></td><td align="left"><code>"String"</code> | <code>"Number"</code> | <code>"Boolean"</code></td></tr></tbody></table></div>
1803
+ <h4 id="returns-38">Returns</h4>
1804
+ <p><a href="#expr"><code>Expr</code></a></p>
1805
+ <hr>
1806
+ <p><a id="newdataparentexists"></a></p>
1807
+ <h3 id="newdataparentexists">newDataParentExists()</h3>
1808
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> newDataParentExists</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">depth</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">number</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75;font-style:italic">field</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1809
+ <p>Navigate up from newData snapshot, then check if a child field exists</p>
1810
+ <h4 id="parameters-28">Parameters</h4>
1811
+ <div class="table-scroll">
1812
+
1813
+
1814
+
1815
+
1816
+
1817
+
1818
+
1819
+
1820
+
1821
+
1822
+
1823
+
1824
+
1825
+
1826
+
1827
+
1828
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>depth</code></td><td align="left"><code>number</code></td></tr><tr><td align="left"><code>field</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
1829
+ <h4 id="returns-39">Returns</h4>
1830
+ <p><a href="#expr"><code>Expr</code></a></p>
1831
+ <hr>
1832
+ <p><a id="newdataparentval"></a></p>
1833
+ <h3 id="newdataparentval">newDataParentVal()</h3>
1834
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> newDataParentVal</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">depth</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">number</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75;font-style:italic">field</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1835
+ <p>Navigate up from newData snapshot, then read a child field’s value</p>
1836
+ <h4 id="parameters-29">Parameters</h4>
1837
+ <div class="table-scroll">
1838
+
1839
+
1840
+
1841
+
1842
+
1843
+
1844
+
1845
+
1846
+
1847
+
1848
+
1849
+
1850
+
1851
+
1852
+
1853
+
1854
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>depth</code></td><td align="left"><code>number</code></td></tr><tr><td align="left"><code>field</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
1855
+ <h4 id="returns-40">Returns</h4>
1856
+ <p><a href="#expr"><code>Expr</code></a></p>
1857
+ <hr>
1858
+ <p><a id="newdataval"></a></p>
1859
+ <h3 id="newdataval">newDataVal()</h3>
1860
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> newDataVal</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">path</span><span style="color:#C678DD">?</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1861
+ <p>Read incoming data value at current node or a child path (post-write state)</p>
1862
+ <h4 id="parameters-30">Parameters</h4>
1863
+ <div class="table-scroll">
1864
+
1865
+
1866
+
1867
+
1868
+
1869
+
1870
+
1871
+
1872
+
1873
+
1874
+
1875
+
1876
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>path?</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
1877
+ <h4 id="returns-41">Returns</h4>
1878
+ <p><a href="#expr"><code>Expr</code></a></p>
1879
+ <hr>
1880
+ <p><a id="not"></a></p>
1881
+ <h3 id="not">not()</h3>
1882
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> not</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">e</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">Expr</span><span style="color:#ABB2BF">) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1883
+ <p>Negate a condition.</p>
1884
+ <h4 id="parameters-31">Parameters</h4>
1885
+ <div class="table-scroll">
1886
+
1887
+
1888
+
1889
+
1890
+
1891
+
1892
+
1893
+
1894
+
1895
+
1896
+
1897
+
1898
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>e</code></td><td align="left"><a href="#expr"><code>Expr</code></a></td></tr></tbody></table></div>
1899
+ <h4 id="returns-42">Returns</h4>
1900
+ <p><a href="#expr"><code>Expr</code></a></p>
1901
+ <hr>
1902
+ <p><a id="ownerornew"></a></p>
1903
+ <h3 id="ownerornew">ownerOrNew()</h3>
1904
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> ownerOrNew</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">field</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1905
+ <p>Anyone authenticated can create; only the field owner can edit</p>
1906
+ <h4 id="parameters-32">Parameters</h4>
1907
+ <div class="table-scroll">
1908
+
1909
+
1910
+
1911
+
1912
+
1913
+
1914
+
1915
+
1916
+
1917
+
1918
+
1919
+
1920
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>field</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
1921
+ <h4 id="returns-43">Returns</h4>
1922
+ <p><a href="#expr"><code>Expr</code></a></p>
1923
+ <hr>
1924
+ <p><a id="ownfield"></a></p>
1925
+ <h3 id="ownfield">ownField()</h3>
1926
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> ownField</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">field</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1927
+ <p>Field-based ownership: auth.uid matches a value stored in a data field</p>
1928
+ <h4 id="parameters-33">Parameters</h4>
1929
+ <div class="table-scroll">
1930
+
1931
+
1932
+
1933
+
1934
+
1935
+
1936
+
1937
+
1938
+
1939
+
1940
+
1941
+
1942
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>field</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
1943
+ <h4 id="returns-44">Returns</h4>
1944
+ <p><a href="#expr"><code>Expr</code></a></p>
1945
+ <hr>
1946
+ <p><a id="ownpath"></a></p>
1947
+ <h3 id="ownpath">ownPath()</h3>
1948
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> ownPath</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">pathVar</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1949
+ <p>Path-based ownership: auth.uid matches a URL path variable</p>
1950
+ <h4 id="parameters-34">Parameters</h4>
1951
+ <div class="table-scroll">
1952
+
1953
+
1954
+
1955
+
1956
+
1957
+
1958
+
1959
+
1960
+
1961
+
1962
+
1963
+
1964
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>pathVar</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
1965
+ <h4 id="returns-45">Returns</h4>
1966
+ <p><a href="#expr"><code>Expr</code></a></p>
1967
+ <hr>
1968
+ <p><a id="pathowneronly"></a></p>
1969
+ <h3 id="pathowneronly">pathOwnerOnly()</h3>
1970
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> pathOwnerOnly</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">pathVar</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1971
+ <p>Only the path owner (auth.uid === $pathVar) can access</p>
1972
+ <h4 id="parameters-35">Parameters</h4>
1973
+ <div class="table-scroll">
1974
+
1975
+
1976
+
1977
+
1978
+
1979
+
1980
+
1981
+
1982
+
1983
+
1984
+
1985
+
1986
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>pathVar</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
1987
+ <h4 id="returns-46">Returns</h4>
1988
+ <p><a href="#expr"><code>Expr</code></a></p>
1989
+ <hr>
1990
+ <p><a id="required"></a></p>
1991
+ <h3 id="required">required()</h3>
1992
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> required</span><span style="color:#ABB2BF">: (...</span><span style="color:#E06C75;font-style:italic">fields</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">[]) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
1993
+ <p>All specified fields must be present in the incoming data</p>
1994
+ <h4 id="parameters-36">Parameters</h4>
1995
+ <div class="table-scroll">
1996
+
1997
+
1998
+
1999
+
2000
+
2001
+
2002
+
2003
+
2004
+
2005
+
2006
+
2007
+
2008
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left">…<code>fields</code></td><td align="left"><code>string</code>[]</td></tr></tbody></table></div>
2009
+ <h4 id="returns-47">Returns</h4>
2010
+ <p><a href="#expr"><code>Expr</code></a></p>
2011
+ <hr>
2012
+ <p><a id="rootequals"></a></p>
2013
+ <h3 id="rootequals">rootEquals()</h3>
2014
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> rootEquals</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">segments</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">Segment</span><span style="color:#ABB2BF">[], </span><span style="color:#E06C75;font-style:italic">value</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
2015
+ <p>Check if a path’s value equals a specific string (via root)</p>
2016
+ <h4 id="parameters-37">Parameters</h4>
2017
+ <div class="table-scroll">
2018
+
2019
+
2020
+
2021
+
2022
+
2023
+
2024
+
2025
+
2026
+
2027
+
2028
+
2029
+
2030
+
2031
+
2032
+
2033
+
2034
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>segments</code></td><td align="left"><a href="#segment"><code>Segment</code></a>[]</td></tr><tr><td align="left"><code>value</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
2035
+ <h4 id="returns-48">Returns</h4>
2036
+ <p><a href="#expr"><code>Expr</code></a></p>
2037
+ <hr>
2038
+ <p><a id="rootexists"></a></p>
2039
+ <h3 id="rootexists">rootExists()</h3>
2040
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> rootExists</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">segments</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">Segment</span><span style="color:#ABB2BF">[]) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
2041
+ <p>Check if a path exists in the database (via root)</p>
2042
+ <h4 id="parameters-38">Parameters</h4>
2043
+ <div class="table-scroll">
2044
+
2045
+
2046
+
2047
+
2048
+
2049
+
2050
+
2051
+
2052
+
2053
+
2054
+
2055
+
2056
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>segments</code></td><td align="left"><a href="#segment"><code>Segment</code></a>[]</td></tr></tbody></table></div>
2057
+ <h4 id="returns-49">Returns</h4>
2058
+ <p><a href="#expr"><code>Expr</code></a></p>
2059
+ <hr>
2060
+ <p><a id="transition"></a></p>
2061
+ <h3 id="transition">transition()</h3>
2062
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#61AFEF"> transition</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">field</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75;font-style:italic">allowed</span><span style="color:#ABB2BF">: [</span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">, </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">][]) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> Expr</span><span style="color:#ABB2BF">;</span></span></code></pre>
2063
+ <p>State machine: only allowed transitions on a field</p>
2064
+ <h4 id="parameters-39">Parameters</h4>
2065
+ <div class="table-scroll">
2066
+
2067
+
2068
+
2069
+
2070
+
2071
+
2072
+
2073
+
2074
+
2075
+
2076
+
2077
+
2078
+
2079
+
2080
+
2081
+
2082
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>field</code></td><td align="left"><code>string</code></td></tr><tr><td align="left"><code>allowed</code></td><td align="left">[<code>string</code>, <code>string</code>][]</td></tr></tbody></table></div>
2083
+ <h4 id="returns-50">Returns</h4>
2084
+ <p><a href="#expr"><code>Expr</code></a></p>
2085
+ <h2 id="functions">Functions</h2>
2086
+ <p><a id="assertcase"></a></p>
2087
+ <h3 id="assertcase">assertCase()</h3>
2088
+ <h4 id="call-signature">Call Signature</h4>
2089
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> assertCase</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">result</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">CaseResult</span><span style="color:#ABB2BF"> | </span><span style="color:#E5C07B">RtdbCaseResult</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">void</span><span style="color:#ABB2BF">;</span></span></code></pre>
2090
+ <p>Throw when a case result did not pass. A simulator abstention throws
2091
+ <a href="#rulesunsupportederror">RulesUnsupportedError</a>; a genuine expectation mismatch throws
2092
+ <a href="#rulesassertionerror">RulesAssertionError</a>. Both carry the <a href="#explaincase">explainCase</a> trace as
2093
+ their message. Returns <code>void</code> on a passing result.</p>
2094
+ <h5 id="parameters-40">Parameters</h5>
2095
+ <div class="table-scroll">
2096
+
2097
+
2098
+
2099
+
2100
+
2101
+
2102
+
2103
+
2104
+
2105
+
2106
+
2107
+
2108
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>result</code></td><td align="left"><a href="#caseresult"><code>CaseResult</code></a> | <a href="#rtdbcaseresult"><code>RtdbCaseResult</code></a></td></tr></tbody></table></div>
2109
+ <h5 id="returns-51">Returns</h5>
2110
+ <p><code>void</code></p>
2111
+ <h4 id="call-signature-1">Call Signature</h4>
2112
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> assertCase</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">ruleset</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">FirestoreRuleset</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75;font-style:italic">oneCase</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">FirestoreCase</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">void</span><span style="color:#ABB2BF">;</span></span></code></pre>
2113
+ <p>Simulate one case against a ruleset and throw on a miss — the runner
2114
+ form: <code>for (const c of cases) test(c.description, () => assertCase(ruleset, c))</code>.</p>
2115
+ <h5 id="parameters-41">Parameters</h5>
2116
+ <div class="table-scroll">
2117
+
2118
+
2119
+
2120
+
2121
+
2122
+
2123
+
2124
+
2125
+
2126
+
2127
+
2128
+
2129
+
2130
+
2131
+
2132
+
2133
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>ruleset</code></td><td align="left"><a href="#firestoreruleset"><code>FirestoreRuleset</code></a></td></tr><tr><td align="left"><code>oneCase</code></td><td align="left"><a href="#firestorecase"><code>FirestoreCase</code></a></td></tr></tbody></table></div>
2134
+ <h5 id="returns-52">Returns</h5>
2135
+ <p><code>void</code></p>
2136
+ <h4 id="call-signature-2">Call Signature</h4>
2137
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> assertCase</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">ruleset</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">RtdbRuleset</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75;font-style:italic">oneCase</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">RtdbCase</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">void</span><span style="color:#ABB2BF">;</span></span></code></pre>
2138
+ <p>Throw when a case result did not pass. A simulator abstention throws
2139
+ <a href="#rulesunsupportederror">RulesUnsupportedError</a>; a genuine expectation mismatch throws
2140
+ <a href="#rulesassertionerror">RulesAssertionError</a>. Both carry the <a href="#explaincase">explainCase</a> trace as
2141
+ their message. Returns <code>void</code> on a passing result.</p>
2142
+ <h5 id="parameters-42">Parameters</h5>
2143
+ <div class="table-scroll">
2144
+
2145
+
2146
+
2147
+
2148
+
2149
+
2150
+
2151
+
2152
+
2153
+
2154
+
2155
+
2156
+
2157
+
2158
+
2159
+
2160
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>ruleset</code></td><td align="left"><a href="#rtdbruleset"><code>RtdbRuleset</code></a></td></tr><tr><td align="left"><code>oneCase</code></td><td align="left"><a href="#rtdbcase"><code>RtdbCase</code></a></td></tr></tbody></table></div>
2161
+ <h5 id="returns-53">Returns</h5>
2162
+ <p><code>void</code></p>
2163
+ <h4 id="call-signature-3">Call Signature</h4>
2164
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> assertCase</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">source</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75;font-style:italic">oneCase</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">FirestoreCase</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">void</span><span style="color:#ABB2BF">;</span></span></code></pre>
2165
+ <p>Convenience: compile Firestore source and assert one case against it.</p>
2166
+ <h5 id="parameters-43">Parameters</h5>
2167
+ <div class="table-scroll">
2168
+
2169
+
2170
+
2171
+
2172
+
2173
+
2174
+
2175
+
2176
+
2177
+
2178
+
2179
+
2180
+
2181
+
2182
+
2183
+
2184
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>source</code></td><td align="left"><code>string</code></td></tr><tr><td align="left"><code>oneCase</code></td><td align="left"><a href="#firestorecase"><code>FirestoreCase</code></a></td></tr></tbody></table></div>
2185
+ <h5 id="returns-54">Returns</h5>
2186
+ <p><code>void</code></p>
2187
+ <hr>
2188
+ <p><a id="bytes"></a></p>
2189
+ <h3 id="bytes">bytes()</h3>
2190
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> bytes</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">input</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF"> | </span><span style="color:#E5C07B">Uint8Array</span><span style="color:#ABB2BF">&#x3C;</span><span style="color:#E5C07B">ArrayBufferLike</span><span style="color:#ABB2BF">>): </span><span style="color:#E5C07B">Bytes</span><span style="color:#ABB2BF">;</span></span></code></pre>
2191
+ <p>A <code>bytes</code> value.</p>
2192
+ <ul>
2193
+ <li>string → UTF-8 encoded</li>
2194
+ <li>Uint8Array → used verbatim</li>
2195
+ </ul>
2196
+ <h4 id="parameters-44">Parameters</h4>
2197
+ <div class="table-scroll">
2198
+
2199
+
2200
+
2201
+
2202
+
2203
+
2204
+
2205
+
2206
+
2207
+
2208
+
2209
+
2210
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>input</code></td><td align="left"><code>string</code> | <code>Uint8Array</code>&#x3C;<code>ArrayBufferLike</code>></td></tr></tbody></table></div>
2211
+ <h4 id="returns-55">Returns</h4>
2212
+ <p><code>Bytes</code></p>
2213
+ <hr>
2214
+ <p><a id="definertdbrules"></a></p>
2215
+ <h3 id="definertdbrules">defineRtdbRules()</h3>
2216
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> defineRtdbRules</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">definition</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">RtdbRulesDefinition</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">RtdbRulesDocument</span><span style="color:#ABB2BF">;</span></span></code></pre>
2217
+ <h4 id="parameters-45">Parameters</h4>
2218
+ <div class="table-scroll">
2219
+
2220
+
2221
+
2222
+
2223
+
2224
+
2225
+
2226
+
2227
+
2228
+
2229
+
2230
+
2231
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>definition</code></td><td align="left"><a href="#rtdbrulesdefinition"><code>RtdbRulesDefinition</code></a></td></tr></tbody></table></div>
2232
+ <h4 id="returns-56">Returns</h4>
2233
+ <p><a href="#rtdbrulesdocument"><code>RtdbRulesDocument</code></a></p>
2234
+ <hr>
2235
+ <p><a id="duration"></a></p>
2236
+ <h3 id="duration">duration()</h3>
2237
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> duration</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">value</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">number</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75;font-style:italic">unit</span><span style="color:#C678DD">?</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">Duration</span><span style="color:#ABB2BF">;</span></span></code></pre>
2238
+ <p>A <code>duration</code> value. <code>unit</code> is one of the Firestore duration units
2239
+ (<code>'w' | 'd' | 'h' | 'm' | 's' | 'ms' | 'ns'</code>); defaults to seconds.</p>
2240
+ <h4 id="parameters-46">Parameters</h4>
2241
+ <div class="table-scroll">
2242
+
2243
+
2244
+
2245
+
2246
+
2247
+
2248
+
2249
+
2250
+
2251
+
2252
+
2253
+
2254
+
2255
+
2256
+
2257
+
2258
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>value</code></td><td align="left"><code>number</code></td></tr><tr><td align="left"><code>unit?</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
2259
+ <h4 id="returns-57">Returns</h4>
2260
+ <p><code>Duration</code></p>
2261
+ <hr>
2262
+ <p><a id="explaincase"></a></p>
2263
+ <h3 id="explaincase">explainCase()</h3>
2264
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> explainCase</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">result</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">CaseResult</span><span style="color:#ABB2BF"> | </span><span style="color:#E5C07B">RtdbCaseResult</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">;</span></span></code></pre>
2265
+ <p>Render a case result as a human-readable trace. The single sanctioned
2266
+ trace renderer — used as the message of the error <code>assertCase</code> throws, and
2267
+ available directly for logging a result without asserting.</p>
2268
+ <h4 id="parameters-47">Parameters</h4>
2269
+ <div class="table-scroll">
2270
+
2271
+
2272
+
2273
+
2274
+
2275
+
2276
+
2277
+
2278
+
2279
+
2280
+
2281
+
2282
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>result</code></td><td align="left"><a href="#caseresult"><code>CaseResult</code></a> | <a href="#rtdbcaseresult"><code>RtdbCaseResult</code></a></td></tr></tbody></table></div>
2283
+ <h4 id="returns-58">Returns</h4>
2284
+ <p><code>string</code></p>
2285
+ <hr>
2286
+ <p><a id="firestorerules"></a></p>
2287
+ <h3 id="firestorerules">firestoreRules()</h3>
2288
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> firestoreRules</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">source</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">FirestoreRuleset</span><span style="color:#ABB2BF">;</span></span></code></pre>
2289
+ <p>Compile Firestore rules source into a deep, safe-by-default handle.</p>
2290
+ <h4 id="parameters-48">Parameters</h4>
2291
+ <div class="table-scroll">
2292
+
2293
+
2294
+
2295
+
2296
+
2297
+
2298
+
2299
+
2300
+
2301
+
2302
+
2303
+
2304
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>source</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
2305
+ <h4 id="returns-59">Returns</h4>
2306
+ <p><a href="#firestoreruleset"><code>FirestoreRuleset</code></a></p>
2307
+ <h4 id="throws">Throws</h4>
2308
+ <p>when the source does not parse. The thrown
2309
+ error carries the compile-blocking issues on <code>.issues</code>.</p>
2310
+ <hr>
2311
+ <p><a id="flip"></a></p>
2312
+ <h3 id="flip">flip()</h3>
2313
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> flip</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">marks</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">[]): </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">;</span></span></code></pre>
2314
+ <p>Turn flip: validates a turn field alternates between marks.
2315
+ First mark is the initial value on creation.
2316
+ Supports 2+ players with circular rotation.</p>
2317
+ <h4 id="parameters-49">Parameters</h4>
2318
+ <div class="table-scroll">
2319
+
2320
+
2321
+
2322
+
2323
+
2324
+
2325
+
2326
+
2327
+
2328
+
2329
+
2330
+
2331
+
2332
+
2333
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><code>marks</code></td><td align="left"><code>string</code>[]</td><td align="left">ordered list of marks (e.g., [“X”, “O”])</td></tr></tbody></table></div>
2334
+ <h4 id="returns-60">Returns</h4>
2335
+ <p><code>string</code></p>
2336
+ <hr>
2337
+ <p><a id="latlng"></a></p>
2338
+ <h3 id="latlng">latlng()</h3>
2339
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> latlng</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">lat</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">number</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75;font-style:italic">lng</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">number</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">LatLng</span><span style="color:#ABB2BF">;</span></span></code></pre>
2340
+ <p>A <code>latlng</code> geographic point.</p>
2341
+ <h4 id="parameters-50">Parameters</h4>
2342
+ <div class="table-scroll">
2343
+
2344
+
2345
+
2346
+
2347
+
2348
+
2349
+
2350
+
2351
+
2352
+
2353
+
2354
+
2355
+
2356
+
2357
+
2358
+
2359
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>lat</code></td><td align="left"><code>number</code></td></tr><tr><td align="left"><code>lng</code></td><td align="left"><code>number</code></td></tr></tbody></table></div>
2360
+ <h4 id="returns-61">Returns</h4>
2361
+ <p><code>LatLng</code></p>
2362
+ <hr>
2363
+ <p><a id="lint-4"></a></p>
2364
+ <h3 id="lint-2">lint()</h3>
2365
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> lint</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">source</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">RuleIssue</span><span style="color:#ABB2BF">[];</span></span></code></pre>
2366
+ <p>Lint Firestore rules source. Accepts anything — including empty or
2367
+ syntactically broken source — and always returns an issue list.</p>
2368
+ <h4 id="parameters-51">Parameters</h4>
2369
+ <div class="table-scroll">
2370
+
2371
+
2372
+
2373
+
2374
+
2375
+
2376
+
2377
+
2378
+
2379
+
2380
+
2381
+
2382
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>source</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
2383
+ <h4 id="returns-62">Returns</h4>
2384
+ <p><a href="#ruleissue"><code>RuleIssue</code></a>[]</p>
2385
+ <hr>
2386
+ <p><a id="reference"></a></p>
2387
+ <h3 id="reference">reference()</h3>
2388
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> reference</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">path</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">Reference</span><span style="color:#ABB2BF">;</span></span></code></pre>
2389
+ <p>A <code>reference</code> to a document, by its path (e.g. <code>"users/alice"</code>).</p>
2390
+ <h4 id="parameters-52">Parameters</h4>
2391
+ <div class="table-scroll">
2392
+
2393
+
2394
+
2395
+
2396
+
2397
+
2398
+
2399
+
2400
+
2401
+
2402
+
2403
+
2404
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>path</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
2405
+ <h4 id="returns-63">Returns</h4>
2406
+ <p><code>Reference</code></p>
2407
+ <hr>
2408
+ <p><a id="rtdbrules"></a></p>
2409
+ <h3 id="rtdbrules">rtdbRules()</h3>
2410
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> rtdbRules</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">input</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">RtdbRulesInput</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">RtdbRuleset</span><span style="color:#ABB2BF">;</span></span></code></pre>
2411
+ <p>Build a deep handle on a Realtime Database ruleset from a definition, a
2412
+ compiled document, or compiled <code>{ rules }</code> JSON.</p>
2413
+ <h4 id="parameters-53">Parameters</h4>
2414
+ <div class="table-scroll">
2415
+
2416
+
2417
+
2418
+
2419
+
2420
+
2421
+
2422
+
2423
+
2424
+
2425
+
2426
+
2427
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>input</code></td><td align="left"><code>RtdbRulesInput</code></td></tr></tbody></table></div>
2428
+ <h4 id="returns-64">Returns</h4>
2429
+ <p><a href="#rtdbruleset"><code>RtdbRuleset</code></a></p>
2430
+ <hr>
2431
+ <p><a id="ruleset"></a></p>
2432
+ <h3 id="ruleset">ruleset()</h3>
2433
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> ruleset</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">input</span><span style="color:#ABB2BF">:</span></span>
2434
+ <span class="line"><span style="color:#ABB2BF"> | </span><span style="color:#E5C07B">Record</span><span style="color:#ABB2BF">&#x3C;</span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">, </span><span style="color:#E5C07B">PathDef</span><span style="color:#ABB2BF">></span></span>
2435
+ <span class="line"><span style="color:#ABB2BF"> | (</span><span style="color:#E06C75;font-style:italic">ctx</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">RulesetContext</span><span style="color:#ABB2BF">) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> void</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">RtdbNode</span><span style="color:#ABB2BF">;</span></span></code></pre>
2436
+ <p>Compile a declarative rules definition into an environment-independent tree.</p>
2437
+ <h4 id="parameters-54">Parameters</h4>
2438
+ <div class="table-scroll">
2439
+
2440
+
2441
+
2442
+
2443
+
2444
+
2445
+
2446
+
2447
+
2448
+
2449
+
2450
+
2451
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>input</code></td><td align="left">| <code>Record</code>&#x3C;<code>string</code>, <a href="#pathdef"><code>PathDef</code></a>> | (<code>ctx</code>: <a href="#rulesetcontext"><code>RulesetContext</code></a>) => <code>void</code></td></tr></tbody></table></div>
2452
+ <h4 id="returns-65">Returns</h4>
2453
+ <p><code>RtdbNode</code></p>
2454
+ <hr>
2455
+ <p><a id="schemarules"></a></p>
2456
+ <h3 id="schemarules">schemaRules()</h3>
2457
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> schemaRules</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">schema</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">ZodObject</span><span style="color:#ABB2BF">&#x3C;</span><span style="color:#E5C07B">any</span><span style="color:#ABB2BF">>, </span><span style="color:#E06C75;font-style:italic">fieldConstraints</span><span style="color:#C678DD">?</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">Record</span><span style="color:#ABB2BF">&#x3C;</span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">, </span><span style="color:#E5C07B">Expr</span><span style="color:#ABB2BF">[]>): </span><span style="color:#E5C07B">SchemaRulesResult</span><span style="color:#ABB2BF">;</span></span></code></pre>
2458
+ <p>Generate RTDB validate rules from a Zod object schema.
2459
+ Optional fieldConstraints are AND-composed with the schema type check.</p>
2460
+ <h4 id="parameters-55">Parameters</h4>
2461
+ <div class="table-scroll">
2462
+
2463
+
2464
+
2465
+
2466
+
2467
+
2468
+
2469
+
2470
+
2471
+
2472
+
2473
+
2474
+
2475
+
2476
+
2477
+
2478
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>schema</code></td><td align="left"><code>ZodObject</code>&#x3C;<code>any</code>></td></tr><tr><td align="left"><code>fieldConstraints?</code></td><td align="left"><code>Record</code>&#x3C;<code>string</code>, <a href="#expr"><code>Expr</code></a>[]></td></tr></tbody></table></div>
2479
+ <h4 id="returns-66">Returns</h4>
2480
+ <p><a href="#schemarulesresult"><code>SchemaRulesResult</code></a></p>
2481
+ <hr>
2482
+ <p><a id="servertimestamp"></a></p>
2483
+ <h3 id="servertimestamp">serverTimestamp()</h3>
2484
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> serverTimestamp</span><span style="color:#ABB2BF">(): {</span></span>
2485
+ <span class="line"><span style="color:#ABB2BF">};</span></span></code></pre>
2486
+ <p>The server-timestamp sentinel — the case-data equivalent of
2487
+ <code>FieldValue.serverTimestamp()</code>. The simulator resolves it to the request
2488
+ time, so a rule comparing <code>data.createdAt == request.time</code> sees a match.</p>
2489
+ <h4 id="returns-67">Returns</h4>
2490
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#ABB2BF">{</span></span>
2491
+ <span class="line"><span style="color:#ABB2BF">}</span></span></code></pre>
2492
+ <hr>
2493
+ <p><a id="timestamp"></a></p>
2494
+ <h3 id="timestamp">timestamp()</h3>
2495
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> timestamp</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">input</span><span style="color:#ABB2BF">:</span></span>
2496
+ <span class="line"><span style="color:#ABB2BF"> | </span><span style="color:#E5C07B">string</span></span>
2497
+ <span class="line"><span style="color:#ABB2BF"> | </span><span style="color:#E5C07B">number</span></span>
2498
+ <span class="line"><span style="color:#ABB2BF"> | {</span></span>
2499
+ <span class="line"><span style="color:#E06C75"> nanos</span><span style="color:#C678DD">?</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">number</span><span style="color:#ABB2BF">;</span></span>
2500
+ <span class="line"><span style="color:#E06C75"> seconds</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">number</span><span style="color:#ABB2BF">;</span></span>
2501
+ <span class="line"><span style="color:#ABB2BF">}): </span><span style="color:#E5C07B">Timestamp</span><span style="color:#ABB2BF">;</span></span></code></pre>
2502
+ <p>A Firestore <code>timestamp</code> value.</p>
2503
+ <ul>
2504
+ <li>number → milliseconds since the epoch</li>
2505
+ <li>string → ISO-8601</li>
2506
+ <li>object → explicit <code>{ seconds, nanos }</code></li>
2507
+ </ul>
2508
+ <h4 id="parameters-56">Parameters</h4>
2509
+ <div class="table-scroll">
2510
+
2511
+
2512
+
2513
+
2514
+
2515
+
2516
+
2517
+
2518
+
2519
+
2520
+
2521
+
2522
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>input</code></td><td align="left">| <code>string</code> | <code>number</code> | { <code>nanos?</code>: <code>number</code>; <code>seconds</code>: <code>number</code>; }</td></tr></tbody></table></div>
2523
+ <h4 id="returns-68">Returns</h4>
2524
+ <p><code>Timestamp</code></p>
2525
+ <hr>
2526
+ <p><a id="turnguard"></a></p>
2527
+ <h3 id="turnguard">turnGuard()</h3>
2528
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> turnGuard</span><span style="color:#ABB2BF">(</span></span>
2529
+ <span class="line"><span style="color:#E06C75;font-style:italic"> turnField</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">,</span></span>
2530
+ <span class="line"><span style="color:#E06C75;font-style:italic"> players</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">Record</span><span style="color:#ABB2BF">&#x3C;</span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">, </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">>,</span></span>
2531
+ <span class="line"><span style="color:#E06C75;font-style:italic"> statusField</span><span style="color:#C678DD">?</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">,</span></span>
2532
+ <span class="line"><span style="color:#E06C75;font-style:italic"> playingValue</span><span style="color:#C678DD">?</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">;</span></span></code></pre>
2533
+ <p>Turn enforcement: only the current turn’s player can write.
2534
+ Uses data (pre-write) for the turn check — NOT newData.</p>
2535
+ <h4 id="parameters-57">Parameters</h4>
2536
+ <div class="table-scroll">
2537
+
2538
+
2539
+
2540
+
2541
+
2542
+
2543
+
2544
+
2545
+
2546
+
2547
+
2548
+
2549
+
2550
+
2551
+
2552
+
2553
+
2554
+
2555
+
2556
+
2557
+
2558
+
2559
+
2560
+
2561
+
2562
+
2563
+
2564
+
2565
+
2566
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><code>turnField</code></td><td align="left"><code>string</code></td><td align="left">the field that stores whose turn it is (e.g., “currentTurn”)</td></tr><tr><td align="left"><code>players</code></td><td align="left"><code>Record</code>&#x3C;<code>string</code>, <code>string</code>></td><td align="left">map of mark → player field (e.g., { X: “playerX”, O: “playerO” })</td></tr><tr><td align="left"><code>statusField?</code></td><td align="left"><code>string</code></td><td align="left">optional field that must equal playingValue for moves to be allowed</td></tr><tr><td align="left"><code>playingValue?</code></td><td align="left"><code>string</code></td><td align="left">the value of statusField during active play (e.g., “playing”)</td></tr></tbody></table></div>
2567
+ <h4 id="returns-69">Returns</h4>
2568
+ <p><code>string</code></p>
2569
+ <hr>
2570
+ <p><a id="vector"></a></p>
2571
+ <h3 id="vector">vector()</h3>
2572
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> vector</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">values</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">readonly</span><span style="color:#E5C07B"> number</span><span style="color:#ABB2BF">[]): </span><span style="color:#E5C07B">Vector</span><span style="color:#ABB2BF">;</span></span></code></pre>
2573
+ <p>A <code>vector</code> value from its numeric components.</p>
2574
+ <h4 id="parameters-58">Parameters</h4>
2575
+ <div class="table-scroll">
2576
+
2577
+
2578
+
2579
+
2580
+
2581
+
2582
+
2583
+
2584
+
2585
+
2586
+
2587
+
2588
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>values</code></td><td align="left">readonly <code>number</code>[]</td></tr></tbody></table></div>
2589
+ <h4 id="returns-70">Returns</h4>
2590
+ <p><code>Vector</code></p>
2591
+ <hr>
2592
+ <p><a id="wincheckhelper"></a></p>
2593
+ <h3 id="wincheckhelper">winCheckHelper()</h3>
2594
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> winCheckHelper</span><span style="color:#ABB2BF">(</span></span>
2595
+ <span class="line"><span style="color:#E06C75;font-style:italic"> mark</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">,</span></span>
2596
+ <span class="line"><span style="color:#E06C75;font-style:italic"> lines</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">number</span><span style="color:#ABB2BF">[][],</span></span>
2597
+ <span class="line"><span style="color:#E06C75;font-style:italic"> boardPath</span><span style="color:#C678DD">?</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">;</span></span></code></pre>
2598
+ <p>Win check helper: validates a boolean field against winning lines on a board.
2599
+ If true, at least one winning line must exist. If false, no winning line can exist.
2600
+ Uses the “client claims, rules verify” pattern.</p>
2601
+ <h4 id="parameters-59">Parameters</h4>
2602
+ <div class="table-scroll">
2603
+
2604
+
2605
+
2606
+
2607
+
2608
+
2609
+
2610
+
2611
+
2612
+
2613
+
2614
+
2615
+
2616
+
2617
+
2618
+
2619
+
2620
+
2621
+
2622
+
2623
+
2624
+
2625
+
2626
+
2627
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><code>mark</code></td><td align="left"><code>string</code></td><td align="left">the player mark to check (e.g., “X”)</td></tr><tr><td align="left"><code>lines</code></td><td align="left"><code>number</code>[][]</td><td align="left">array of winning line coordinates (e.g., [[0,1,2], [3,4,5], …])</td></tr><tr><td align="left"><code>boardPath?</code></td><td align="left"><code>string</code></td><td align="left">the path to the board relative to the parent (default “board”)</td></tr></tbody></table></div>
2628
+ <h4 id="returns-71">Returns</h4>
2629
+ <p><code>string</code></p> </article> </main> <aside class="doc-toc api-symbols" aria-label="API symbols"> <h2 class="doc-toc-heading">Symbols</h2> <input class="api-symbol-filter" type="search" placeholder="Filter symbols" aria-label="Filter API symbols" data-api-symbol-filter> <div class="api-symbol-groups" data-api-symbol-groups> <section class="api-symbol-group" data-api-symbol-group> <a class="api-symbol-kind" href="#classes"> Classes </a> <ul> <li data-api-symbol="rulesassertionerror"> <a href="#rulesassertionerror">RulesAssertionError</a> </li><li data-api-symbol="rulescompileerror"> <a href="#rulescompileerror">RulesCompileError</a> </li><li data-api-symbol="rulesunsupportederror"> <a href="#rulesunsupportederror">RulesUnsupportedError</a> </li> </ul> </section><section class="api-symbol-group" data-api-symbol-group> <a class="api-symbol-kind" href="#interfaces"> Interfaces </a> <ul> <li data-api-symbol="caseresult"> <a href="#caseresult">CaseResult</a> </li><li data-api-symbol="evaluatedruleinfo"> <a href="#evaluatedruleinfo">EvaluatedRuleInfo</a> </li><li data-api-symbol="explanation"> <a href="#explanation">Explanation</a> </li><li data-api-symbol="exprtraceentry"> <a href="#exprtraceentry">ExprTraceEntry</a> </li><li data-api-symbol="firestorecase"> <a href="#firestorecase">FirestoreCase</a> </li><li data-api-symbol="firestoreruleset"> <a href="#firestoreruleset">FirestoreRuleset</a> </li><li data-api-symbol="pathdef"> <a href="#pathdef">PathDef</a> </li><li data-api-symbol="pathresolutionentry"> <a href="#pathresolutionentry">PathResolutionEntry</a> </li><li data-api-symbol="pathresolutiontrace"> <a href="#pathresolutiontrace">PathResolutionTrace</a> </li><li data-api-symbol="rtdbcase"> <a href="#rtdbcase">RtdbCase</a> </li><li data-api-symbol="rtdbcaseresult"> <a href="#rtdbcaseresult">RtdbCaseResult</a> </li><li data-api-symbol="rtdbexplanation"> <a href="#rtdbexplanation">RtdbExplanation</a> </li><li data-api-symbol="rtdbrulescheckresult"> <a href="#rtdbrulescheckresult">RtdbRulesCheckResult</a> </li><li data-api-symbol="rtdbrulesdefinition"> <a href="#rtdbrulesdefinition">RtdbRulesDefinition</a> </li><li data-api-symbol="rtdbrulesdocument"> <a href="#rtdbrulesdocument">RtdbRulesDocument</a> </li><li data-api-symbol="rtdbruleset"> <a href="#rtdbruleset">RtdbRuleset</a> </li><li data-api-symbol="rtdbrulesfinding"> <a href="#rtdbrulesfinding">RtdbRulesFinding</a> </li><li data-api-symbol="rtdbsimulationsummary"> <a href="#rtdbsimulationsummary">RtdbSimulationSummary</a> </li><li data-api-symbol="ruleevaluation"> <a href="#ruleevaluation">RuleEvaluation</a> </li><li data-api-symbol="ruleissue"> <a href="#ruleissue">RuleIssue</a> </li><li data-api-symbol="rulesetcontext"> <a href="#rulesetcontext">RulesetContext</a> </li><li data-api-symbol="schemarulesresult"> <a href="#schemarulesresult">SchemaRulesResult</a> </li><li data-api-symbol="simulationsummary"> <a href="#simulationsummary">SimulationSummary</a> </li> </ul> </section><section class="api-symbol-group" data-api-symbol-group> <a class="api-symbol-kind" href="#type-aliases"> Type Aliases </a> <ul> <li data-api-symbol="expr"> <a href="#expr">Expr</a> </li><li data-api-symbol="firestoremethod"> <a href="#firestoremethod">FirestoreMethod</a> </li><li data-api-symbol="rtdbrulesfindingrule"> <a href="#rtdbrulesfindingrule">RtdbRulesFindingRule</a> </li><li data-api-symbol="rtdbrulesjson"> <a href="#rtdbrulesjson">RtdbRulesJson</a> </li><li data-api-symbol="rtdbrulessimulationauth"> <a href="#rtdbrulessimulationauth">RtdbRulesSimulationAuth</a> </li><li data-api-symbol="rtdbrulessimulationinput"> <a href="#rtdbrulessimulationinput">RtdbRulesSimulationInput</a> </li><li data-api-symbol="ruleissueorigin"> <a href="#ruleissueorigin">RuleIssueOrigin</a> </li><li data-api-symbol="ruleissueseverity"> <a href="#ruleissueseverity">RuleIssueSeverity</a> </li><li data-api-symbol="segment"> <a href="#segment">Segment</a> </li> </ul> </section><section class="api-symbol-group" data-api-symbol-group> <a class="api-symbol-kind" href="#variables"> Variables </a> <ul> <li data-api-symbol="all()"> <a href="#all">all()</a> </li><li data-api-symbol="allow()"> <a href="#allow">allow()</a> </li><li data-api-symbol="always()"> <a href="#always">always()</a> </li><li data-api-symbol="any()"> <a href="#any">any()</a> </li><li data-api-symbol="auth_uid"> <a href="#auth_uid">AUTH_UID</a> </li><li data-api-symbol="authenticated()"> <a href="#authenticated">authenticated()</a> </li><li data-api-symbol="dataexists()"> <a href="#dataexists">dataExists()</a> </li><li data-api-symbol="dataparentval()"> <a href="#dataparentval">dataParentVal()</a> </li><li data-api-symbol="dataval()"> <a href="#dataval">dataVal()</a> </li><li data-api-symbol="deny()"> <a href="#deny">deny()</a> </li><li data-api-symbol="eq()"> <a href="#eq">eq()</a> </li><li data-api-symbol="expr()"> <a href="#expr-1">expr()</a> </li><li data-api-symbol="fieldenum()"> <a href="#fieldenum">fieldEnum()</a> </li><li data-api-symbol="fieldisboolean()"> <a href="#fieldisboolean">fieldIsBoolean()</a> </li><li data-api-symbol="fieldisnumber()"> <a href="#fieldisnumber">fieldIsNumber()</a> </li><li data-api-symbol="fieldisstring()"> <a href="#fieldisstring">fieldIsString()</a> </li><li data-api-symbol="fieldowneronly()"> <a href="#fieldowneronly">fieldOwnerOnly()</a> </li><li data-api-symbol="gt()"> <a href="#gt">gt()</a> </li><li data-api-symbol="haschild()"> <a href="#haschild">hasChild()</a> </li><li data-api-symbol="haschildren()"> <a href="#haschildren">hasChildren()</a> </li><li data-api-symbol="hasrole()"> <a href="#hasrole">hasRole()</a> </li><li data-api-symbol="immutable()"> <a href="#immutable">immutable()</a> </li><li data-api-symbol="immutableself()"> <a href="#immutableself">immutableSelf()</a> </li><li data-api-symbol="ismember()"> <a href="#ismember">isMember()</a> </li><li data-api-symbol="isnew()"> <a href="#isnew">isNew()</a> </li><li data-api-symbol="lte()"> <a href="#lte">lte()</a> </li><li data-api-symbol="neq()"> <a href="#neq">neq()</a> </li><li data-api-symbol="newdataexists()"> <a href="#newdataexists">newDataExists()</a> </li><li data-api-symbol="newdatais()"> <a href="#newdatais">newDataIs()</a> </li><li data-api-symbol="newdataparentexists()"> <a href="#newdataparentexists">newDataParentExists()</a> </li><li data-api-symbol="newdataparentval()"> <a href="#newdataparentval">newDataParentVal()</a> </li><li data-api-symbol="newdataval()"> <a href="#newdataval">newDataVal()</a> </li><li data-api-symbol="not()"> <a href="#not">not()</a> </li><li data-api-symbol="ownerornew()"> <a href="#ownerornew">ownerOrNew()</a> </li><li data-api-symbol="ownfield()"> <a href="#ownfield">ownField()</a> </li><li data-api-symbol="ownpath()"> <a href="#ownpath">ownPath()</a> </li><li data-api-symbol="pathowneronly()"> <a href="#pathowneronly">pathOwnerOnly()</a> </li><li data-api-symbol="required()"> <a href="#required">required()</a> </li><li data-api-symbol="rootequals()"> <a href="#rootequals">rootEquals()</a> </li><li data-api-symbol="rootexists()"> <a href="#rootexists">rootExists()</a> </li><li data-api-symbol="transition()"> <a href="#transition">transition()</a> </li> </ul> </section><section class="api-symbol-group" data-api-symbol-group> <a class="api-symbol-kind" href="#functions"> Functions </a> <ul> <li data-api-symbol="assertcase()"> <a href="#assertcase">assertCase()</a> </li><li data-api-symbol="bytes()"> <a href="#bytes">bytes()</a> </li><li data-api-symbol="definertdbrules()"> <a href="#definertdbrules">defineRtdbRules()</a> </li><li data-api-symbol="duration()"> <a href="#duration">duration()</a> </li><li data-api-symbol="explaincase()"> <a href="#explaincase">explainCase()</a> </li><li data-api-symbol="firestorerules()"> <a href="#firestorerules">firestoreRules()</a> </li><li data-api-symbol="flip()"> <a href="#flip">flip()</a> </li><li data-api-symbol="latlng()"> <a href="#latlng">latlng()</a> </li><li data-api-symbol="lint()"> <a href="#lint-2">lint()</a> </li><li data-api-symbol="reference()"> <a href="#reference">reference()</a> </li><li data-api-symbol="rtdbrules()"> <a href="#rtdbrules">rtdbRules()</a> </li><li data-api-symbol="ruleset()"> <a href="#ruleset">ruleset()</a> </li><li data-api-symbol="schemarules()"> <a href="#schemarules">schemaRules()</a> </li><li data-api-symbol="servertimestamp()"> <a href="#servertimestamp">serverTimestamp()</a> </li><li data-api-symbol="timestamp()"> <a href="#timestamp">timestamp()</a> </li><li data-api-symbol="turnguard()"> <a href="#turnguard">turnGuard()</a> </li><li data-api-symbol="vector()"> <a href="#vector">vector()</a> </li><li data-api-symbol="wincheckhelper()"> <a href="#wincheckhelper">winCheckHelper()</a> </li> </ul> </section> <p class="api-symbol-empty" data-api-symbol-empty hidden>No matching symbols</p> </div> </aside> </div> <script type="module">const a=document.querySelector("[data-api-symbol-filter]"),d=[...document.querySelectorAll("[data-api-symbol-group]")],n=document.querySelector("[data-api-symbol-empty]");a?.addEventListener("input",()=>{const t=a.value.trim().toLowerCase();let o=0;for(const i of d){let e=0;i.querySelectorAll("[data-api-symbol]").forEach(l=>{const r=!t||(l.dataset.apiSymbol??"").includes(t);l.hidden=!r,r&&e++}),i.hidden=e===0,o+=e}n&&(n.hidden=o>0)});</script> <script type="module">const s=new Map;document.querySelectorAll('.doc-toc a[href^="#"]').forEach(t=>s.set(decodeURIComponent(t.hash.slice(1)),t));if(s.size>0){const t=new Set,n=()=>{let o=null;for(const e of s.keys())if(t.has(e)){o=e;break}s.forEach((e,c)=>e.classList.toggle("active",c===o))},r=new IntersectionObserver(o=>{for(const e of o)e.isIntersecting?t.add(e.target.id):t.delete(e.target.id);n()},{rootMargin:"-72px 0px -60% 0px"});s.forEach((o,e)=>{const c=document.getElementById(e);c&&r.observe(c)})}</script> <script type="module">document.querySelector('.studio__nav [aria-current="page"]')?.scrollIntoView({block:"nearest",inline:"center"});</script> </body> </html>