@pyric/cli 0.1.0-alpha.27 → 0.1.0-alpha.29

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 (283) hide show
  1. package/dist/assurance/.generated/conformance-verdicts.d.ts +16 -0
  2. package/dist/assurance/.generated/conformance-verdicts.d.ts.map +1 -1
  3. package/dist/assurance/.generated/conformance-verdicts.js +16 -0
  4. package/dist/assurance/.generated/conformance-verdicts.js.map +1 -1
  5. package/dist/bridge/surface/arguments/assurance.d.ts +6 -6
  6. package/dist/bridge/surface/arguments/messaging.d.ts +2 -2
  7. package/dist/bridge/surface/methods/assurance/map.d.ts +6 -6
  8. package/dist/bridge/surface/methods/assurance/replaySession.d.ts.map +1 -1
  9. package/dist/bridge/surface/methods/assurance/replaySession.js +18 -6
  10. package/dist/bridge/surface/methods/assurance/replaySession.js.map +1 -1
  11. package/dist/bridge/surface/methods/messaging/send.d.ts +4 -4
  12. package/dist/bridge/surface/render/discriminator-schemas.d.ts +4 -4
  13. package/dist/cli/index.d.ts +1 -0
  14. package/dist/cli/index.d.ts.map +1 -1
  15. package/dist/cli/index.js +15 -1
  16. package/dist/cli/index.js.map +1 -1
  17. package/dist/cli/run.d.ts +42 -0
  18. package/dist/cli/run.d.ts.map +1 -0
  19. package/dist/cli/run.js +115 -0
  20. package/dist/cli/run.js.map +1 -0
  21. package/dist/conformance/.generated/can-i-use.d.ts.map +1 -1
  22. package/dist/conformance/.generated/can-i-use.js +1 -1
  23. package/dist/conformance/.generated/can-i-use.js.map +1 -1
  24. package/dist/conformance/.generated/conformance-docs.d.ts.map +1 -1
  25. package/dist/conformance/.generated/conformance-docs.js +1 -1
  26. package/dist/conformance/.generated/conformance-docs.js.map +1 -1
  27. package/dist/remote/local-storage-url.d.ts +2 -15
  28. package/dist/remote/local-storage-url.d.ts.map +1 -1
  29. package/dist/remote/local-storage-url.js +1 -60
  30. package/dist/remote/local-storage-url.js.map +1 -1
  31. package/dist/serve/assets/avatar-route.d.ts.map +1 -1
  32. package/dist/serve/assets/avatar-route.js +6 -6
  33. package/dist/serve/assets/avatar-route.js.map +1 -1
  34. package/dist/serve/assets/resolver.d.ts +3 -0
  35. package/dist/serve/assets/resolver.d.ts.map +1 -1
  36. package/dist/serve/assets/resolver.js +1 -1
  37. package/dist/serve/assets/resolver.js.map +1 -1
  38. package/dist/serve/entries/app-client.d.ts.map +1 -1
  39. package/dist/serve/entries/app-client.js +6 -0
  40. package/dist/serve/entries/app-client.js.map +1 -1
  41. package/dist/serve/site-ui/_astro/{RulesCodeEditor.kBYcclwV.js → RulesCodeEditor.Cp_-FK3b.js} +1 -1
  42. package/dist/serve/site-ui/_astro/app.C--T2qDK.js +151 -0
  43. package/dist/serve/site-ui/_astro/app.DqyhRyrU.js +1 -0
  44. package/dist/serve/site-ui/_astro/{chess-showcase.CZe_3fJZ.js → chess-showcase.CVhCNUi_.js} +1 -1
  45. package/dist/serve/site-ui/_astro/{example-runtime.CXSZXHZF.js → example-runtime.zC1l-Yka.js} +1 -1
  46. package/dist/serve/site-ui/_astro/{sandbox-controls.Bp5PoonS.js → sandbox-controls.Bv6lfpIe.js} +39 -39
  47. package/dist/serve/site-ui/_astro/{seed.BpXSRzLo.js → seed.B4vza_Bv.js} +1 -1
  48. package/dist/serve/site-ui/_astro/{writes.DHSW22XD.js → writes.Bg0YEEA7.js} +1 -1
  49. package/dist/serve/site-ui/auth/index.html +1 -1
  50. package/dist/serve/site-ui/docs/_rhythm/index.html +1 -1
  51. package/dist/serve/site-ui/docs/agent/set-up-your-agent/index.html +1 -1
  52. package/dist/serve/site-ui/docs/agent/watch-and-review/index.html +1 -1
  53. package/dist/serve/site-ui/docs/agent/work-with-an-agent/index.html +1 -1
  54. package/dist/serve/site-ui/docs/ai-compat/index.html +1 -1
  55. package/dist/serve/site-ui/docs/api-reference/index.html +2 -1
  56. package/dist/serve/site-ui/docs/api-reference.md +1 -0
  57. package/dist/serve/site-ui/docs/app-compat/index.html +1 -1
  58. package/dist/serve/site-ui/docs/auth-compat/index.html +2 -2
  59. package/dist/serve/site-ui/docs/auth-compat.md +1 -1
  60. package/dist/serve/site-ui/docs/auth-flutter-compat/index.html +1 -1
  61. package/dist/serve/site-ui/docs/auth-kotlin-compat/index.html +1 -1
  62. package/dist/serve/site-ui/docs/auth-swift-compat/index.html +1 -1
  63. package/dist/serve/site-ui/docs/build/ai-logic/index.html +1 -1
  64. package/dist/serve/site-ui/docs/build/authentication/index.html +1 -1
  65. package/dist/serve/site-ui/docs/build/cloud-firestore/index.html +1 -1
  66. package/dist/serve/site-ui/docs/build/cloud-messaging/index.html +1 -1
  67. package/dist/serve/site-ui/docs/build/cloud-storage/index.html +13 -2
  68. package/dist/serve/site-ui/docs/build/cloud-storage.md +23 -0
  69. package/dist/serve/site-ui/docs/build/default-avatars/index.html +1 -1
  70. package/dist/serve/site-ui/docs/build/inspect-activity/index.html +1 -1
  71. package/dist/serve/site-ui/docs/build/realtime-database/index.html +1 -1
  72. package/dist/serve/site-ui/docs/conformance-scores/index.html +1 -1
  73. package/dist/serve/site-ui/docs/create-pyric-reference-api/index.html +1 -1
  74. package/dist/serve/site-ui/docs/database-compat/index.html +18 -18
  75. package/dist/serve/site-ui/docs/database-compat.md +17 -17
  76. package/dist/serve/site-ui/docs/examples/chess/index.html +1 -1
  77. package/dist/serve/site-ui/docs/examples/index.html +1 -1
  78. package/dist/serve/site-ui/docs/firestore-compat/index.html +1 -1
  79. package/dist/serve/site-ui/docs/firestore-flutter-compat/index.html +1 -1
  80. package/dist/serve/site-ui/docs/firestore-kotlin-compat/index.html +1 -1
  81. package/dist/serve/site-ui/docs/firestore-swift-compat/index.html +1 -1
  82. package/dist/serve/site-ui/docs/functions-rtdb-compat/index.html +1 -1
  83. package/dist/serve/site-ui/docs/get-started/backend-bundlers/index.html +1 -1
  84. package/dist/serve/site-ui/docs/get-started/flutter/index.html +1 -1
  85. package/dist/serve/site-ui/docs/get-started/how-the-swap-works/index.html +1 -1
  86. package/dist/serve/site-ui/docs/get-started/nextjs/index.html +1 -1
  87. package/dist/serve/site-ui/docs/get-started/node-host/index.html +1 -1
  88. package/dist/serve/site-ui/docs/get-started/start-building/index.html +1 -1
  89. package/dist/serve/site-ui/docs/get-started/vite/index.html +4 -2
  90. package/dist/serve/site-ui/docs/get-started/vite.md +4 -0
  91. package/dist/serve/site-ui/docs/index.json +60 -10
  92. package/dist/serve/site-ui/docs/messaging-compat/index.html +1 -1
  93. package/dist/serve/site-ui/docs/observe/resolve-runtime-status/index.html +1 -1
  94. package/dist/serve/site-ui/docs/observe/see-whats-happening/index.html +1 -1
  95. package/dist/serve/site-ui/docs/observe/shape-your-data/index.html +1 -1
  96. package/dist/serve/site-ui/docs/observe/switch-and-impersonate-identities/index.html +1 -1
  97. package/dist/serve/site-ui/docs/overview/index.html +1 -1
  98. package/dist/serve/site-ui/docs/pyric-admin-app-check-reference-api/index.html +1 -1
  99. package/dist/serve/site-ui/docs/pyric-admin-app-reference-api/index.html +1 -1
  100. package/dist/serve/site-ui/docs/pyric-admin-auth-reference-api/index.html +1 -1
  101. package/dist/serve/site-ui/docs/pyric-admin-data-connect-reference-api/index.html +1 -1
  102. package/dist/serve/site-ui/docs/pyric-admin-database-reference-api/index.html +1 -1
  103. package/dist/serve/site-ui/docs/pyric-admin-eventarc-reference-api/index.html +1 -1
  104. package/dist/serve/site-ui/docs/pyric-admin-extensions-reference-api/index.html +1 -1
  105. package/dist/serve/site-ui/docs/pyric-admin-firestore-reference-api/index.html +1 -1
  106. package/dist/serve/site-ui/docs/pyric-admin-functions-reference-api/index.html +1 -1
  107. package/dist/serve/site-ui/docs/pyric-admin-installations-reference-api/index.html +1 -1
  108. package/dist/serve/site-ui/docs/pyric-admin-instance-id-reference-api/index.html +1 -1
  109. package/dist/serve/site-ui/docs/pyric-admin-machine-learning-reference-api/index.html +1 -1
  110. package/dist/serve/site-ui/docs/pyric-admin-messaging-reference-api/index.html +1 -1
  111. package/dist/serve/site-ui/docs/pyric-admin-phone-number-verification-reference-api/index.html +1 -1
  112. package/dist/serve/site-ui/docs/pyric-admin-project-management-reference-api/index.html +1 -1
  113. package/dist/serve/site-ui/docs/pyric-admin-reference-api/index.html +1 -1
  114. package/dist/serve/site-ui/docs/pyric-admin-remote-config-reference-api/index.html +1 -1
  115. package/dist/serve/site-ui/docs/pyric-admin-security-rules-reference-api/index.html +1 -1
  116. package/dist/serve/site-ui/docs/pyric-admin-storage-reference-api/index.html +1 -1
  117. package/dist/serve/site-ui/docs/pyric-ai-reference-api/index.html +1 -1
  118. package/dist/serve/site-ui/docs/pyric-ai-scripting-reference-api/index.html +1 -1
  119. package/dist/serve/site-ui/docs/pyric-analytics-reference-api/index.html +1 -1
  120. package/dist/serve/site-ui/docs/pyric-app-check-reference-api/index.html +1 -1
  121. package/dist/serve/site-ui/docs/pyric-app-reference-api/index.html +1 -1
  122. package/dist/serve/site-ui/docs/pyric-auth-reference-api/index.html +2 -2
  123. package/dist/serve/site-ui/docs/pyric-auth-reference-api.md +1 -1
  124. package/dist/serve/site-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +1 -1
  125. package/dist/serve/site-ui/docs/pyric-cli-assurance-reference-api/index.html +1 -1
  126. package/dist/serve/site-ui/docs/pyric-cli-bridge-client-reference-api/index.html +1 -1
  127. package/dist/serve/site-ui/docs/pyric-cli-bridge-reference-api/index.html +1 -1
  128. package/dist/serve/site-ui/docs/pyric-cli-bundler-reference-api/index.html +1 -1
  129. package/dist/serve/site-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +1 -1
  130. package/dist/serve/site-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +1 -1
  131. package/dist/serve/site-ui/docs/pyric-cli-conformance-reference-api/index.html +1 -1
  132. package/dist/serve/site-ui/docs/pyric-cli-credentials-node-reference-api/index.html +1 -1
  133. package/dist/serve/site-ui/docs/pyric-cli-discover-reference-api/index.html +1 -1
  134. package/dist/serve/site-ui/docs/pyric-cli-flow-reference-api/index.html +1 -1
  135. package/dist/serve/site-ui/docs/pyric-cli-next-reference-api/index.html +1 -1
  136. package/dist/serve/site-ui/docs/pyric-cli-register-app-bridge-reference-api/index.html +1 -1
  137. package/dist/serve/site-ui/docs/pyric-cli-register-client-app-bridge-reference-api/index.html +1 -1
  138. package/dist/serve/site-ui/docs/pyric-cli-register-client-app-reference-api/index.html +1 -1
  139. package/dist/serve/site-ui/docs/pyric-cli-register-client-auth-reference-api/index.html +1 -1
  140. package/dist/serve/site-ui/docs/pyric-cli-register-client-database-reference-api/index.html +1 -1
  141. package/dist/serve/site-ui/docs/pyric-cli-register-client-firestore-reference-api/index.html +1 -1
  142. package/dist/serve/site-ui/docs/pyric-cli-register-client-storage-reference-api/index.html +1 -1
  143. package/dist/serve/site-ui/docs/pyric-cli-register-reference-api/index.html +1 -1
  144. package/dist/serve/site-ui/docs/pyric-cli-remote-reference-api/index.html +1 -1
  145. package/dist/serve/site-ui/docs/pyric-cli-repro-reference-api/index.html +1 -1
  146. package/dist/serve/site-ui/docs/pyric-cli-serve-worker-reference-api/index.html +1 -1
  147. package/dist/serve/site-ui/docs/pyric-cli-verify-reference-api/index.html +1 -1
  148. package/dist/serve/site-ui/docs/pyric-cli-vite-reference-api/index.html +17 -3
  149. package/dist/serve/site-ui/docs/pyric-cli-vite-reference-api.md +7 -5
  150. package/dist/serve/site-ui/docs/pyric-cli-vite-ssr-loader-reference-api/index.html +1 -1
  151. package/dist/serve/site-ui/docs/pyric-database-reference-api/index.html +1 -1
  152. package/dist/serve/site-ui/docs/pyric-firestore-lite-reference-api/index.html +1 -1
  153. package/dist/serve/site-ui/docs/pyric-firestore-reference-api/index.html +1 -1
  154. package/dist/serve/site-ui/docs/pyric-functions-reference-api/index.html +1 -1
  155. package/dist/serve/site-ui/docs/pyric-messaging-reference-api/index.html +1 -1
  156. package/dist/serve/site-ui/docs/pyric-messaging-sw-reference-api/index.html +1 -1
  157. package/dist/serve/site-ui/docs/pyric-performance-reference-api/index.html +1 -1
  158. package/dist/serve/site-ui/docs/pyric-remote-config-reference-api/index.html +1 -1
  159. package/dist/serve/site-ui/docs/pyric-rules-reference-api/index.html +120 -120
  160. package/dist/serve/site-ui/docs/pyric-rules-reference-api.md +53 -53
  161. package/dist/serve/site-ui/docs/pyric-sandbox-branches-store-reference-api/index.html +1 -1
  162. package/dist/serve/site-ui/docs/pyric-sandbox-checkpoints-directory-reference-api/index.html +1 -1
  163. package/dist/serve/site-ui/docs/pyric-sandbox-checkpoints-reference-api/index.html +1 -1
  164. package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api/index.html +1 -1
  165. package/dist/serve/site-ui/docs/pyric-sandbox-firestore-reference-api/index.html +1 -1
  166. package/dist/serve/site-ui/docs/pyric-sandbox-reference-api/index.html +1 -1
  167. package/dist/serve/site-ui/docs/pyric-storage-reference-api/index.html +1 -1
  168. package/dist/serve/site-ui/docs/pyric-storage-sw-reference-api/index.html +102 -0
  169. package/dist/serve/site-ui/docs/pyric-storage-sw-reference-api.md +76 -0
  170. package/dist/serve/site-ui/docs/pyric-ui-agents-reference-api/index.html +1 -1
  171. package/dist/serve/site-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +1 -1
  172. package/dist/serve/site-ui/docs/pyric-ui-auth-reference-api/index.html +1 -1
  173. package/dist/serve/site-ui/docs/pyric-ui-events-hooks-reference-api/index.html +1 -1
  174. package/dist/serve/site-ui/docs/pyric-ui-events-reference-api/index.html +1 -1
  175. package/dist/serve/site-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +1 -1
  176. package/dist/serve/site-ui/docs/pyric-ui-firestore-reference-api/index.html +1 -1
  177. package/dist/serve/site-ui/docs/pyric-ui-listener-owner-reference-api/index.html +1 -1
  178. package/dist/serve/site-ui/docs/pyric-ui-primitives-reference-api/index.html +1 -1
  179. package/dist/serve/site-ui/docs/pyric-ui-rtdb-reference-api/index.html +1 -1
  180. package/dist/serve/site-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +1 -1
  181. package/dist/serve/site-ui/docs/pyric-ui-rules-reference-api/index.html +1 -1
  182. package/dist/serve/site-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +1 -1
  183. package/dist/serve/site-ui/docs/pyric-ui-storage-reference-api/index.html +1 -1
  184. package/dist/serve/site-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +1 -1
  185. package/dist/serve/site-ui/docs/pyric-ui-traffic-reference-api/index.html +1 -1
  186. package/dist/serve/site-ui/docs/reference/cli/index.html +12 -2
  187. package/dist/serve/site-ui/docs/reference/cli.md +24 -0
  188. package/dist/serve/site-ui/docs/rtdb-flutter-compat/index.html +1 -1
  189. package/dist/serve/site-ui/docs/rtdb-kotlin-compat/index.html +1 -1
  190. package/dist/serve/site-ui/docs/rtdb-swift-compat/index.html +1 -1
  191. package/dist/serve/site-ui/docs/rules-compat/index.html +68 -4
  192. package/dist/serve/site-ui/docs/rules-compat.md +67 -3
  193. package/dist/serve/site-ui/docs/secure/audit-your-rules/index.html +1 -1
  194. package/dist/serve/site-ui/docs/secure/firestore-rules-limits/index.html +1 -1
  195. package/dist/serve/site-ui/docs/secure/read-a-denial/index.html +1 -1
  196. package/dist/serve/site-ui/docs/secure/rtdb-rules-in-typescript/index.html +1 -1
  197. package/dist/serve/site-ui/docs/secure/rtdb-rules-standard-library/index.html +18 -5
  198. package/dist/serve/site-ui/docs/secure/rtdb-rules-standard-library.md +19 -4
  199. package/dist/serve/site-ui/docs/secure/rules-standard-library/index.html +1 -1
  200. package/dist/serve/site-ui/docs/secure/secure-it-with-rules/index.html +1 -1
  201. package/dist/serve/site-ui/docs/secure/simulate-and-lint/index.html +5 -5
  202. package/dist/serve/site-ui/docs/secure/simulate-and-lint.md +8 -8
  203. package/dist/serve/site-ui/docs/secure/write-a-rules-test-suite/index.html +1 -1
  204. package/dist/serve/site-ui/docs/ship/ship-to-production/index.html +1 -1
  205. package/dist/serve/site-ui/docs/ship/test-in-node/index.html +1 -1
  206. package/dist/serve/site-ui/docs/storage-compat/index.html +1 -1
  207. package/dist/serve/site-ui/docs/trust/how-we-know-it-matches-firebase/index.html +1 -1
  208. package/dist/serve/site-ui/docs/trust/rules-standard-library/index.html +1 -1
  209. package/dist/serve/site-ui/docs/trust/versioning-and-compatibility/index.html +1 -1
  210. package/dist/serve/site-ui/docs/tutorial/index.html +1 -1
  211. package/dist/serve/site-ui/examples/chess/index.html +1 -1
  212. package/dist/serve/site-ui/firestore/index.html +1 -1
  213. package/dist/serve/site-ui/llms.txt +1 -0
  214. package/dist/serve/site-ui/rtdb/index.html +1 -1
  215. package/dist/serve/site-ui/settings/index.html +1 -1
  216. package/dist/serve/site-ui/storage/index.html +1 -1
  217. package/dist/serve/site-ui/studio/index.html +1 -1
  218. package/dist/serve/site-ui/traffic/index.html +1 -1
  219. package/dist/serve/vite-plugin.d.ts +6 -0
  220. package/dist/serve/vite-plugin.d.ts.map +1 -1
  221. package/dist/serve/vite-plugin.js +11 -1
  222. package/dist/serve/vite-plugin.js.map +1 -1
  223. package/dist/serve/vite-service-worker.d.ts +12 -0
  224. package/dist/serve/vite-service-worker.d.ts.map +1 -0
  225. package/dist/serve/vite-service-worker.js +33 -0
  226. package/dist/serve/vite-service-worker.js.map +1 -0
  227. package/dist/serve/worker/client/auth.d.ts.map +1 -1
  228. package/dist/serve/worker/client/auth.js +4 -3
  229. package/dist/serve/worker/client/auth.js.map +1 -1
  230. package/dist/serve/worker/client/rtdb-info.d.ts +0 -2
  231. package/dist/serve/worker/client/rtdb-info.d.ts.map +1 -1
  232. package/dist/serve/worker/client/rtdb-info.js +4 -17
  233. package/dist/serve/worker/client/rtdb-info.js.map +1 -1
  234. package/dist/serve/worker/client/rtdb-reads.d.ts.map +1 -1
  235. package/dist/serve/worker/client/rtdb-reads.js +3 -5
  236. package/dist/serve/worker/client/rtdb-reads.js.map +1 -1
  237. package/dist/serve/worker/host/auth-action-codes.js +2 -2
  238. package/dist/serve/worker/host/auth-action-codes.js.map +1 -1
  239. package/dist/serve/worker/host/auth-custom-token.d.ts.map +1 -1
  240. package/dist/serve/worker/host/auth-custom-token.js +4 -2
  241. package/dist/serve/worker/host/auth-custom-token.js.map +1 -1
  242. package/dist/serve/worker/host/dispatch.d.ts.map +1 -1
  243. package/dist/serve/worker/host/dispatch.js +3 -1
  244. package/dist/serve/worker/host/dispatch.js.map +1 -1
  245. package/dist/serve/worker/host-auth.d.ts +6 -0
  246. package/dist/serve/worker/host-auth.d.ts.map +1 -1
  247. package/dist/serve/worker/host-auth.js +16 -5
  248. package/dist/serve/worker/host-auth.js.map +1 -1
  249. package/dist/serve/worker/inbound-validation.d.ts.map +1 -1
  250. package/dist/serve/worker/inbound-validation.js +1 -0
  251. package/dist/serve/worker/inbound-validation.js.map +1 -1
  252. package/dist/serve/worker/protocol/storage.d.ts +1 -8
  253. package/dist/serve/worker/protocol/storage.d.ts.map +1 -1
  254. package/dist/serve/worker/protocol/storage.js +2 -14
  255. package/dist/serve/worker/protocol/storage.js.map +1 -1
  256. package/dist/serve/worker/protocol.d.ts +2 -0
  257. package/dist/serve/worker/protocol.d.ts.map +1 -1
  258. package/dist/serve/worker/protocol.js.map +1 -1
  259. package/package.json +12 -8
  260. package/src/assurance/.generated/conformance-verdicts.ts +16 -0
  261. package/src/bridge/surface/methods/assurance/replaySession.ts +19 -6
  262. package/src/cli/index.ts +15 -1
  263. package/src/cli/run.ts +139 -0
  264. package/src/conformance/.generated/can-i-use.ts +1 -1
  265. package/src/conformance/.generated/conformance-docs.ts +1 -1
  266. package/src/remote/local-storage-url.ts +1 -58
  267. package/src/serve/assets/avatar-route.ts +6 -7
  268. package/src/serve/assets/resolver.ts +4 -1
  269. package/src/serve/entries/app-client.ts +7 -0
  270. package/src/serve/vite-plugin.ts +15 -1
  271. package/src/serve/vite-service-worker.ts +44 -0
  272. package/src/serve/worker/client/auth.ts +4 -3
  273. package/src/serve/worker/client/rtdb-info.ts +4 -17
  274. package/src/serve/worker/client/rtdb-reads.ts +3 -4
  275. package/src/serve/worker/host/auth-action-codes.ts +2 -2
  276. package/src/serve/worker/host/auth-custom-token.ts +4 -2
  277. package/src/serve/worker/host/dispatch.ts +2 -0
  278. package/src/serve/worker/host-auth.ts +18 -5
  279. package/src/serve/worker/inbound-validation.ts +1 -0
  280. package/src/serve/worker/protocol/storage.ts +2 -14
  281. package/src/serve/worker/protocol.ts +2 -0
  282. package/dist/serve/site-ui/_astro/app.CiMHEvEW.js +0 -147
  283. package/dist/serve/site-ui/_astro/app.DpzsBfos.js +0 -1
@@ -2,7 +2,7 @@
2
2
  <link rel="stylesheet" href="/__pyric/ui/_astro/_slug_.Da5VLhW1.css">
3
3
  <style>:root{--rhythm-para: .875rem;--rhythm-group: 1.5rem;--rhythm-subsection: 2.25rem;--rhythm-section: 3.25rem;--rhythm-list: calc(var(--rhythm-para) * .75)}.prose>*,.prose blockquote>*,.prose li>*,.prose .compat-stat>*{margin-block:0}.prose>*+*{margin-block-start:var(--rhythm-group)}.prose>*+h2{margin-block-start:var(--rhythm-section)}.prose>*+h3,.prose>*+h4{margin-block-start:var(--rhythm-subsection)}.prose>h1+*,.prose>h2+*,.prose>h3+*,.prose>h4+*{margin-block-start:var(--rhythm-para)}.prose>p+p{margin-block-start:var(--rhythm-para)}.prose>p+ul,.prose>p+ol,.prose>p+blockquote{margin-block-start:var(--rhythm-para)}.prose li+li{margin-block-start:var(--rhythm-list)}.prose li>ul,.prose li>ol{margin-block-start:var(--rhythm-list)}.prose li>*+*,.prose blockquote>*+*{margin-block-start:var(--rhythm-para)}
4
4
  html{scrollbar-gutter:stable}
5
- </style></head> <body> <header class="studio__chrome"> <div class="studio__bar"> <div class="studio__chrome-inner"> <nav class="studio__nav" aria-label="Site"> <a class="studio__brand" href="/__pyric/ui/" aria-label="Pyric">pyric</a> <a class="studio__nav-tab" href="/__pyric/ui/"> Home </a><a class="studio__nav-tab" href="/__pyric/ui/docs" aria-current="page"> Docs </a><a class="studio__nav-tab" href="/__pyric/ui/studio"> Studio </a> </nav> </div> </div> </header> <div class="docs-shell" data-astro-cid-mw7aashj> <details class="docs-nav-drawer" data-astro-cid-mw7aashj> <summary data-astro-cid-mw7aashj>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> <details class="docs-nav-group"> <summary>Overview</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/overview/"> Overview </a> </li><li> <a href="/__pyric/ui/docs/tutorial/"> Tutorial </a> </li><li> <a href="/__pyric/ui/docs/examples/"> Examples </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Get started</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/get-started/start-building/"> Quickstart </a> </li><li> <a href="/__pyric/ui/docs/get-started/vite/"> Vite </a> </li><li> <a href="/__pyric/ui/docs/get-started/node-host/"> Node host </a> </li><li> <a href="/__pyric/ui/docs/get-started/nextjs/"> Next.js </a> </li><li> <a href="/__pyric/ui/docs/get-started/backend-bundlers/"> Backend bundlers </a> </li><li> <a href="/__pyric/ui/docs/get-started/flutter/"> Flutter </a> </li><li> <a href="/__pyric/ui/docs/get-started/how-the-swap-works/"> How the swap works </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Build</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/build/authentication/"> Authentication </a> </li><li> <a href="/__pyric/ui/docs/build/default-avatars/"> Default avatars </a> </li><li> <a href="/__pyric/ui/docs/build/inspect-activity/"> Activity on the page </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-firestore/"> Cloud Firestore </a> </li><li> <a href="/__pyric/ui/docs/build/realtime-database/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-storage/"> Cloud Storage </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-messaging/"> Cloud Messaging </a> </li><li> <a href="/__pyric/ui/docs/build/ai-logic/"> AI Logic </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Secure &amp; debug</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/secure/secure-it-with-rules/"> Security Rules </a> </li><li> <a href="/__pyric/ui/docs/secure/simulate-and-lint/"> Simulate and lint before you deploy </a> </li><li> <a href="/__pyric/ui/docs/secure/write-a-rules-test-suite/"> Write a rules test suite </a> </li><li> <a href="/__pyric/ui/docs/secure/read-a-denial/"> Read a denial and understand it </a> </li><li> <a href="/__pyric/ui/docs/secure/rules-standard-library/"> The rules standard library </a> </li><li> <a href="/__pyric/ui/docs/secure/rtdb-rules-in-typescript/"> RTDB rules in TypeScript </a> </li><li> <a href="/__pyric/ui/docs/secure/rtdb-rules-standard-library/"> RTDB rules standard library </a> </li><li> <a href="/__pyric/ui/docs/secure/firestore-rules-limits/"> Rules limits </a> </li><li> <a href="/__pyric/ui/docs/secure/audit-your-rules/"> Audit rules and data </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading"> Examples </h2> <ul> <li> <a href="/__pyric/ui/docs/examples/chess/"> Chess showcase </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Observe &amp; shape</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/observe/see-whats-happening/"> Traffic &amp; rule verdicts </a> </li><li> <a href="/__pyric/ui/docs/observe/resolve-runtime-status/"> Runtime status </a> </li><li> <a href="/__pyric/ui/docs/observe/switch-and-impersonate-identities/"> Impersonate &amp; tenants </a> </li><li> <a href="/__pyric/ui/docs/observe/shape-your-data/"> Seed, snapshot, replay </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Ship &amp; test</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/ship/ship-to-production/"> Ship to production </a> </li><li> <a href="/__pyric/ui/docs/ship/test-in-node/"> Test in Node </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Work with an agent</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/agent/set-up-your-agent/"> Connect an agent </a> </li><li> <a href="/__pyric/ui/docs/agent/work-with-an-agent/"> Use the MCP tools </a> </li><li> <a href="/__pyric/ui/docs/agent/watch-and-review/"> Watch in Pyric Studio </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Trust</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/trust/versioning-and-compatibility/"> Versioning and the fb tag </a> </li><li> <a href="/__pyric/ui/docs/trust/rules-standard-library/"> Rules standard library reference </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/conformance-scores/"> Conformance scores </a> </li><li> <a href="/__pyric/ui/docs/trust/how-we-know-it-matches-firebase/"> How we know it matches Firebase </a> </li><li> <a href="/__pyric/ui/docs/app-compat/"> App </a> </li><li> <a href="/__pyric/ui/docs/ai-compat/"> AI Logic </a> </li><li> <a href="/__pyric/ui/docs/auth-compat/"> Auth </a> </li><li> <a href="/__pyric/ui/docs/firestore-compat/"> Firestore </a> </li><li> <a href="/__pyric/ui/docs/database-compat/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/storage-compat/"> Storage </a> </li><li> <a href="/__pyric/ui/docs/messaging-compat/"> Messaging </a> </li><li> <a href="/__pyric/ui/docs/functions-rtdb-compat/"> Functions · RTDB </a> </li><li> <a href="/__pyric/ui/docs/rules-compat/"> Rules </a> </li><li> <a href="/__pyric/ui/docs/firestore-flutter-compat/"> Firestore · Flutter </a> </li><li> <a href="/__pyric/ui/docs/firestore-kotlin-compat/"> Firestore · Kotlin </a> </li><li> <a href="/__pyric/ui/docs/firestore-swift-compat/"> Firestore · Swift </a> </li><li> <a href="/__pyric/ui/docs/auth-flutter-compat/"> Auth · Flutter </a> </li><li> <a href="/__pyric/ui/docs/auth-kotlin-compat/"> Auth · Kotlin </a> </li><li> <a href="/__pyric/ui/docs/auth-swift-compat/"> FirebaseAuth Swift </a> </li><li> <a href="/__pyric/ui/docs/rtdb-flutter-compat/"> Realtime Database · Flutter </a> </li><li> <a href="/__pyric/ui/docs/rtdb-kotlin-compat/"> Realtime Database · Kotlin </a> </li><li> <a href="/__pyric/ui/docs/rtdb-swift-compat/"> Realtime Database · Swift </a> </li> </ul> </div> </div> </details> <details class="docs-nav-group" open> <summary>Reference</summary> <div class="docs-nav-group-body docs-nav-group-body--reference"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/api-reference/"> API reference </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-app-reference-api/"> pyric/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-reference-api/"> pyric/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-lite-reference-api/"> pyric/firestore/lite </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth-reference-api/"> pyric/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-reference-api/"> pyric/ai </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-scripting-reference-api/"> pyric/ai/scripting </a> </li><li> <a href="/__pyric/ui/docs/pyric-database-reference-api/"> pyric/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-reference-api/"> pyric/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-reference-api/"> pyric/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-sw-reference-api/"> pyric/messaging/sw </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules-reference-api/" aria-current="page"> pyric/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-reference-api/"> pyric/sandbox </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-branches-store-reference-api/"> pyric/sandbox/branches/store </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-checkpoints-reference-api/"> pyric/sandbox/checkpoints </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-checkpoints-directory-reference-api/"> pyric/sandbox/checkpoints/directory </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-firestore-reference-api/"> pyric/sandbox/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-database-reference-api/"> pyric/sandbox/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-app-check-reference-api/"> pyric/app-check </a> </li><li> <a href="/__pyric/ui/docs/pyric-functions-reference-api/"> pyric/functions </a> </li><li> <a href="/__pyric/ui/docs/pyric-analytics-reference-api/"> pyric/analytics </a> </li><li> <a href="/__pyric/ui/docs/pyric-performance-reference-api/"> pyric/performance </a> </li><li> <a href="/__pyric/ui/docs/pyric-remote-config-reference-api/"> pyric/remote-config </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric-admin</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-admin-reference-api/"> pyric-admin </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-app-reference-api/"> pyric-admin/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-firestore-reference-api/"> pyric-admin/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-auth-reference-api/"> pyric-admin/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-database-reference-api/"> pyric-admin/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-storage-reference-api/"> pyric-admin/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-messaging-reference-api/"> pyric-admin/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-app-check-reference-api/"> pyric-admin/app-check </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-data-connect-reference-api/"> pyric-admin/data-connect </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-eventarc-reference-api/"> pyric-admin/eventarc </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-extensions-reference-api/"> pyric-admin/extensions </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-functions-reference-api/"> pyric-admin/functions </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-installations-reference-api/"> pyric-admin/installations </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-instance-id-reference-api/"> pyric-admin/instance-id </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-machine-learning-reference-api/"> pyric-admin/machine-learning </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-phone-number-verification-reference-api/"> pyric-admin/phone-number-verification </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-project-management-reference-api/"> pyric-admin/project-management </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-remote-config-reference-api/"> pyric-admin/remote-config </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-security-rules-reference-api/"> pyric-admin/security-rules </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">create-pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/create-pyric-reference-api/"> create-pyric </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli-credentials-node-reference-api/"> @pyric/cli/credentials/node </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-verify-reference-api/"> @pyric/cli/verify </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-repro-reference-api/"> @pyric/cli/repro </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-reference-api/"> @pyric/cli/conformance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-browser-reference-api/"> @pyric/cli/conformance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-docs-reference-api/"> @pyric/cli/conformance/docs </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-reference-api/"> @pyric/cli/assurance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-browser-reference-api/"> @pyric/cli/assurance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-reference-api/"> @pyric/cli/bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-client-reference-api/"> @pyric/cli/bridge/client </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-discover-reference-api/"> @pyric/cli/discover </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-reference-api/"> @pyric/cli/vite </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-ssr-loader-reference-api/"> @pyric/cli/vite/ssr-loader </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-next-reference-api/"> @pyric/cli/next </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bundler-reference-api/"> @pyric/cli/bundler </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-serve-worker-reference-api/"> @pyric/cli/serve/worker </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-remote-reference-api/"> @pyric/cli/remote </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-reference-api/"> @pyric/cli/register </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-app-bridge-reference-api/"> @pyric/cli/register/app-bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-client-app-reference-api/"> @pyric/cli/register/client/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-client-app-bridge-reference-api/"> @pyric/cli/register/client/app-bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-client-auth-reference-api/"> @pyric/cli/register/client/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-client-database-reference-api/"> @pyric/cli/register/client/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-client-firestore-reference-api/"> @pyric/cli/register/client/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-client-storage-reference-api/"> @pyric/cli/register/client/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-flow-reference-api/"> @pyric/cli/flow </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/ui</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-ui-auth-reference-api/"> @pyric/ui/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-auth-hooks-reference-api/"> @pyric/ui/auth/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-primitives-reference-api/"> @pyric/ui/primitives </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-listener-owner-reference-api/"> @pyric/ui/listener-owner </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-reference-api/"> @pyric/ui/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-hooks-reference-api/"> @pyric/ui/firestore/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rtdb-reference-api/"> @pyric/ui/rtdb </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-reference-api/"> @pyric/ui/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-hooks-reference-api/"> @pyric/ui/storage/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-reference-api/"> @pyric/ui/traffic </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-hooks-reference-api/"> @pyric/ui/traffic/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-reference-api/"> @pyric/ui/events </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-hooks-reference-api/"> @pyric/ui/events/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-agents-reference-api/"> @pyric/ui/agents </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-reference-api/"> @pyric/ui/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-hooks-reference-api/"> @pyric/ui/rules/hooks </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/reference/cli/"> CLI </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> <details class="docs-nav-group" id="nav-group-overview"> <summary>Overview</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/overview/"> Overview </a> </li><li> <a href="/__pyric/ui/docs/tutorial/"> Tutorial </a> </li><li> <a href="/__pyric/ui/docs/examples/"> Examples </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-get-started"> <summary>Get started</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/get-started/start-building/"> Quickstart </a> </li><li> <a href="/__pyric/ui/docs/get-started/vite/"> Vite </a> </li><li> <a href="/__pyric/ui/docs/get-started/node-host/"> Node host </a> </li><li> <a href="/__pyric/ui/docs/get-started/nextjs/"> Next.js </a> </li><li> <a href="/__pyric/ui/docs/get-started/backend-bundlers/"> Backend bundlers </a> </li><li> <a href="/__pyric/ui/docs/get-started/flutter/"> Flutter </a> </li><li> <a href="/__pyric/ui/docs/get-started/how-the-swap-works/"> How the swap works </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-build"> <summary>Build</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/build/authentication/"> Authentication </a> </li><li> <a href="/__pyric/ui/docs/build/default-avatars/"> Default avatars </a> </li><li> <a href="/__pyric/ui/docs/build/inspect-activity/"> Activity on the page </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-firestore/"> Cloud Firestore </a> </li><li> <a href="/__pyric/ui/docs/build/realtime-database/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-storage/"> Cloud Storage </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-messaging/"> Cloud Messaging </a> </li><li> <a href="/__pyric/ui/docs/build/ai-logic/"> AI Logic </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-secure-debug"> <summary>Secure &amp; debug</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/secure/secure-it-with-rules/"> Security Rules </a> </li><li> <a href="/__pyric/ui/docs/secure/simulate-and-lint/"> Simulate and lint before you deploy </a> </li><li> <a href="/__pyric/ui/docs/secure/write-a-rules-test-suite/"> Write a rules test suite </a> </li><li> <a href="/__pyric/ui/docs/secure/read-a-denial/"> Read a denial and understand it </a> </li><li> <a href="/__pyric/ui/docs/secure/rules-standard-library/"> The rules standard library </a> </li><li> <a href="/__pyric/ui/docs/secure/rtdb-rules-in-typescript/"> RTDB rules in TypeScript </a> </li><li> <a href="/__pyric/ui/docs/secure/rtdb-rules-standard-library/"> RTDB rules standard library </a> </li><li> <a href="/__pyric/ui/docs/secure/firestore-rules-limits/"> Rules limits </a> </li><li> <a href="/__pyric/ui/docs/secure/audit-your-rules/"> Audit rules and data </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading" id="nav-section-secure-debug-examples"> Examples </h2> <ul> <li> <a href="/__pyric/ui/docs/examples/chess/"> Chess showcase </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-observe-shape"> <summary>Observe &amp; shape</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/observe/see-whats-happening/"> Traffic &amp; rule verdicts </a> </li><li> <a href="/__pyric/ui/docs/observe/resolve-runtime-status/"> Runtime status </a> </li><li> <a href="/__pyric/ui/docs/observe/switch-and-impersonate-identities/"> Impersonate &amp; tenants </a> </li><li> <a href="/__pyric/ui/docs/observe/shape-your-data/"> Seed, snapshot, replay </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-ship-test"> <summary>Ship &amp; test</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/ship/ship-to-production/"> Ship to production </a> </li><li> <a href="/__pyric/ui/docs/ship/test-in-node/"> Test in Node </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-work-with-an-agent"> <summary>Work with an agent</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/agent/set-up-your-agent/"> Connect an agent </a> </li><li> <a href="/__pyric/ui/docs/agent/work-with-an-agent/"> Use the MCP tools </a> </li><li> <a href="/__pyric/ui/docs/agent/watch-and-review/"> Watch in Pyric Studio </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-trust"> <summary>Trust</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/trust/versioning-and-compatibility/"> Versioning and the fb tag </a> </li><li> <a href="/__pyric/ui/docs/trust/rules-standard-library/"> Rules standard library reference </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/conformance-scores/"> Conformance scores </a> </li><li> <a href="/__pyric/ui/docs/trust/how-we-know-it-matches-firebase/"> How we know it matches Firebase </a> </li><li> <a href="/__pyric/ui/docs/app-compat/"> App </a> </li><li> <a href="/__pyric/ui/docs/ai-compat/"> AI Logic </a> </li><li> <a href="/__pyric/ui/docs/auth-compat/"> Auth </a> </li><li> <a href="/__pyric/ui/docs/firestore-compat/"> Firestore </a> </li><li> <a href="/__pyric/ui/docs/database-compat/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/storage-compat/"> Storage </a> </li><li> <a href="/__pyric/ui/docs/messaging-compat/"> Messaging </a> </li><li> <a href="/__pyric/ui/docs/functions-rtdb-compat/"> Functions · RTDB </a> </li><li> <a href="/__pyric/ui/docs/rules-compat/"> Rules </a> </li><li> <a href="/__pyric/ui/docs/firestore-flutter-compat/"> Firestore · Flutter </a> </li><li> <a href="/__pyric/ui/docs/firestore-kotlin-compat/"> Firestore · Kotlin </a> </li><li> <a href="/__pyric/ui/docs/firestore-swift-compat/"> Firestore · Swift </a> </li><li> <a href="/__pyric/ui/docs/auth-flutter-compat/"> Auth · Flutter </a> </li><li> <a href="/__pyric/ui/docs/auth-kotlin-compat/"> Auth · Kotlin </a> </li><li> <a href="/__pyric/ui/docs/auth-swift-compat/"> FirebaseAuth Swift </a> </li><li> <a href="/__pyric/ui/docs/rtdb-flutter-compat/"> Realtime Database · Flutter </a> </li><li> <a href="/__pyric/ui/docs/rtdb-kotlin-compat/"> Realtime Database · Kotlin </a> </li><li> <a href="/__pyric/ui/docs/rtdb-swift-compat/"> Realtime Database · Swift </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 docs-nav-group-body--reference"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/api-reference/"> API reference </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-app-reference-api/"> pyric/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-reference-api/"> pyric/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-lite-reference-api/"> pyric/firestore/lite </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth-reference-api/"> pyric/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-reference-api/"> pyric/ai </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-scripting-reference-api/"> pyric/ai/scripting </a> </li><li> <a href="/__pyric/ui/docs/pyric-database-reference-api/"> pyric/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-reference-api/"> pyric/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-reference-api/"> pyric/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-sw-reference-api/"> pyric/messaging/sw </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules-reference-api/" aria-current="page"> pyric/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-reference-api/"> pyric/sandbox </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-branches-store-reference-api/"> pyric/sandbox/branches/store </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-checkpoints-reference-api/"> pyric/sandbox/checkpoints </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-checkpoints-directory-reference-api/"> pyric/sandbox/checkpoints/directory </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-firestore-reference-api/"> pyric/sandbox/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-database-reference-api/"> pyric/sandbox/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-app-check-reference-api/"> pyric/app-check </a> </li><li> <a href="/__pyric/ui/docs/pyric-functions-reference-api/"> pyric/functions </a> </li><li> <a href="/__pyric/ui/docs/pyric-analytics-reference-api/"> pyric/analytics </a> </li><li> <a href="/__pyric/ui/docs/pyric-performance-reference-api/"> pyric/performance </a> </li><li> <a href="/__pyric/ui/docs/pyric-remote-config-reference-api/"> pyric/remote-config </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric-admin</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-admin-reference-api/"> pyric-admin </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-app-reference-api/"> pyric-admin/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-firestore-reference-api/"> pyric-admin/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-auth-reference-api/"> pyric-admin/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-database-reference-api/"> pyric-admin/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-storage-reference-api/"> pyric-admin/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-messaging-reference-api/"> pyric-admin/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-app-check-reference-api/"> pyric-admin/app-check </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-data-connect-reference-api/"> pyric-admin/data-connect </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-eventarc-reference-api/"> pyric-admin/eventarc </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-extensions-reference-api/"> pyric-admin/extensions </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-functions-reference-api/"> pyric-admin/functions </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-installations-reference-api/"> pyric-admin/installations </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-instance-id-reference-api/"> pyric-admin/instance-id </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-machine-learning-reference-api/"> pyric-admin/machine-learning </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-phone-number-verification-reference-api/"> pyric-admin/phone-number-verification </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-project-management-reference-api/"> pyric-admin/project-management </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-remote-config-reference-api/"> pyric-admin/remote-config </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-security-rules-reference-api/"> pyric-admin/security-rules </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">create-pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/create-pyric-reference-api/"> create-pyric </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli-credentials-node-reference-api/"> @pyric/cli/credentials/node </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-verify-reference-api/"> @pyric/cli/verify </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-repro-reference-api/"> @pyric/cli/repro </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-reference-api/"> @pyric/cli/conformance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-browser-reference-api/"> @pyric/cli/conformance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-docs-reference-api/"> @pyric/cli/conformance/docs </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-reference-api/"> @pyric/cli/assurance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-browser-reference-api/"> @pyric/cli/assurance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-reference-api/"> @pyric/cli/bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-client-reference-api/"> @pyric/cli/bridge/client </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-discover-reference-api/"> @pyric/cli/discover </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-reference-api/"> @pyric/cli/vite </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-ssr-loader-reference-api/"> @pyric/cli/vite/ssr-loader </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-next-reference-api/"> @pyric/cli/next </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bundler-reference-api/"> @pyric/cli/bundler </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-serve-worker-reference-api/"> @pyric/cli/serve/worker </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-remote-reference-api/"> @pyric/cli/remote </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-reference-api/"> @pyric/cli/register </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-app-bridge-reference-api/"> @pyric/cli/register/app-bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-client-app-reference-api/"> @pyric/cli/register/client/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-client-app-bridge-reference-api/"> @pyric/cli/register/client/app-bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-client-auth-reference-api/"> @pyric/cli/register/client/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-client-database-reference-api/"> @pyric/cli/register/client/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-client-firestore-reference-api/"> @pyric/cli/register/client/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-client-storage-reference-api/"> @pyric/cli/register/client/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-flow-reference-api/"> @pyric/cli/flow </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/ui</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-ui-auth-reference-api/"> @pyric/ui/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-auth-hooks-reference-api/"> @pyric/ui/auth/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-primitives-reference-api/"> @pyric/ui/primitives </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-listener-owner-reference-api/"> @pyric/ui/listener-owner </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-reference-api/"> @pyric/ui/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-hooks-reference-api/"> @pyric/ui/firestore/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rtdb-reference-api/"> @pyric/ui/rtdb </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-reference-api/"> @pyric/ui/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-hooks-reference-api/"> @pyric/ui/storage/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-reference-api/"> @pyric/ui/traffic </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-hooks-reference-api/"> @pyric/ui/traffic/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-reference-api/"> @pyric/ui/events </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-hooks-reference-api/"> @pyric/ui/events/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-agents-reference-api/"> @pyric/ui/agents </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-reference-api/"> @pyric/ui/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-hooks-reference-api/"> @pyric/ui/rules/hooks </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/reference/cli/"> CLI </a> </li> </ul> </div> </div> </details> </nav> <main class="doc-main" data-astro-cid-mw7aashj> <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" data-astro-cid-mw7aashj> <p class="api-reference-kicker" data-astro-cid-mw7aashj>API reference</p> <h1 data-astro-cid-mw7aashj><code data-astro-cid-mw7aashj>pyric/rules</code></h1> <p class="api-reference-meta" data-astro-cid-mw7aashj> 126 published symbols from <code data-astro-cid-mw7aashj>pyric</code> </p> <p class="api-reference-source" data-astro-cid-mw7aashj>
5
+ </style></head> <body> <header class="studio__chrome"> <div class="studio__bar"> <div class="studio__chrome-inner"> <nav class="studio__nav" aria-label="Site"> <a class="studio__brand" href="/__pyric/ui/" aria-label="Pyric">pyric</a> <a class="studio__nav-tab" href="/__pyric/ui/"> Home </a><a class="studio__nav-tab" href="/__pyric/ui/docs" aria-current="page"> Docs </a><a class="studio__nav-tab" href="/__pyric/ui/studio"> Studio </a> </nav> </div> </div> </header> <div class="docs-shell" data-astro-cid-mw7aashj> <details class="docs-nav-drawer" data-astro-cid-mw7aashj> <summary data-astro-cid-mw7aashj>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> <details class="docs-nav-group"> <summary>Overview</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/overview/"> Overview </a> </li><li> <a href="/__pyric/ui/docs/tutorial/"> Tutorial </a> </li><li> <a href="/__pyric/ui/docs/examples/"> Examples </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Get started</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/get-started/start-building/"> Quickstart </a> </li><li> <a href="/__pyric/ui/docs/get-started/vite/"> Vite </a> </li><li> <a href="/__pyric/ui/docs/get-started/node-host/"> Node host </a> </li><li> <a href="/__pyric/ui/docs/get-started/nextjs/"> Next.js </a> </li><li> <a href="/__pyric/ui/docs/get-started/backend-bundlers/"> Backend bundlers </a> </li><li> <a href="/__pyric/ui/docs/get-started/flutter/"> Flutter </a> </li><li> <a href="/__pyric/ui/docs/get-started/how-the-swap-works/"> How the swap works </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Build</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/build/authentication/"> Authentication </a> </li><li> <a href="/__pyric/ui/docs/build/default-avatars/"> Default avatars </a> </li><li> <a href="/__pyric/ui/docs/build/inspect-activity/"> Activity on the page </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-firestore/"> Cloud Firestore </a> </li><li> <a href="/__pyric/ui/docs/build/realtime-database/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-storage/"> Cloud Storage </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-messaging/"> Cloud Messaging </a> </li><li> <a href="/__pyric/ui/docs/build/ai-logic/"> AI Logic </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Secure &amp; debug</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/secure/secure-it-with-rules/"> Security Rules </a> </li><li> <a href="/__pyric/ui/docs/secure/simulate-and-lint/"> Simulate and lint before you deploy </a> </li><li> <a href="/__pyric/ui/docs/secure/write-a-rules-test-suite/"> Write a rules test suite </a> </li><li> <a href="/__pyric/ui/docs/secure/read-a-denial/"> Read a denial and understand it </a> </li><li> <a href="/__pyric/ui/docs/secure/rules-standard-library/"> The rules standard library </a> </li><li> <a href="/__pyric/ui/docs/secure/rtdb-rules-in-typescript/"> RTDB rules in TypeScript </a> </li><li> <a href="/__pyric/ui/docs/secure/rtdb-rules-standard-library/"> RTDB rules standard library </a> </li><li> <a href="/__pyric/ui/docs/secure/firestore-rules-limits/"> Rules limits </a> </li><li> <a href="/__pyric/ui/docs/secure/audit-your-rules/"> Audit rules and data </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading"> Examples </h2> <ul> <li> <a href="/__pyric/ui/docs/examples/chess/"> Chess showcase </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Observe &amp; shape</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/observe/see-whats-happening/"> Traffic &amp; rule verdicts </a> </li><li> <a href="/__pyric/ui/docs/observe/resolve-runtime-status/"> Runtime status </a> </li><li> <a href="/__pyric/ui/docs/observe/switch-and-impersonate-identities/"> Impersonate &amp; tenants </a> </li><li> <a href="/__pyric/ui/docs/observe/shape-your-data/"> Seed, snapshot, replay </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Ship &amp; test</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/ship/ship-to-production/"> Ship to production </a> </li><li> <a href="/__pyric/ui/docs/ship/test-in-node/"> Test in Node </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Work with an agent</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/agent/set-up-your-agent/"> Connect an agent </a> </li><li> <a href="/__pyric/ui/docs/agent/work-with-an-agent/"> Use the MCP tools </a> </li><li> <a href="/__pyric/ui/docs/agent/watch-and-review/"> Watch in Pyric Studio </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Trust</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/trust/versioning-and-compatibility/"> Versioning and the fb tag </a> </li><li> <a href="/__pyric/ui/docs/trust/rules-standard-library/"> Rules standard library reference </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/conformance-scores/"> Conformance scores </a> </li><li> <a href="/__pyric/ui/docs/trust/how-we-know-it-matches-firebase/"> How we know it matches Firebase </a> </li><li> <a href="/__pyric/ui/docs/app-compat/"> App </a> </li><li> <a href="/__pyric/ui/docs/ai-compat/"> AI Logic </a> </li><li> <a href="/__pyric/ui/docs/auth-compat/"> Auth </a> </li><li> <a href="/__pyric/ui/docs/firestore-compat/"> Firestore </a> </li><li> <a href="/__pyric/ui/docs/database-compat/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/storage-compat/"> Storage </a> </li><li> <a href="/__pyric/ui/docs/messaging-compat/"> Messaging </a> </li><li> <a href="/__pyric/ui/docs/functions-rtdb-compat/"> Functions · RTDB </a> </li><li> <a href="/__pyric/ui/docs/rules-compat/"> Rules </a> </li><li> <a href="/__pyric/ui/docs/firestore-flutter-compat/"> Firestore · Flutter </a> </li><li> <a href="/__pyric/ui/docs/firestore-kotlin-compat/"> Firestore · Kotlin </a> </li><li> <a href="/__pyric/ui/docs/firestore-swift-compat/"> Firestore · Swift </a> </li><li> <a href="/__pyric/ui/docs/auth-flutter-compat/"> Auth · Flutter </a> </li><li> <a href="/__pyric/ui/docs/auth-kotlin-compat/"> Auth · Kotlin </a> </li><li> <a href="/__pyric/ui/docs/auth-swift-compat/"> FirebaseAuth Swift </a> </li><li> <a href="/__pyric/ui/docs/rtdb-flutter-compat/"> Realtime Database · Flutter </a> </li><li> <a href="/__pyric/ui/docs/rtdb-kotlin-compat/"> Realtime Database · Kotlin </a> </li><li> <a href="/__pyric/ui/docs/rtdb-swift-compat/"> Realtime Database · Swift </a> </li> </ul> </div> </div> </details> <details class="docs-nav-group" open> <summary>Reference</summary> <div class="docs-nav-group-body docs-nav-group-body--reference"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/api-reference/"> API reference </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-app-reference-api/"> pyric/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-reference-api/"> pyric/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-lite-reference-api/"> pyric/firestore/lite </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth-reference-api/"> pyric/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-reference-api/"> pyric/ai </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-scripting-reference-api/"> pyric/ai/scripting </a> </li><li> <a href="/__pyric/ui/docs/pyric-database-reference-api/"> pyric/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-reference-api/"> pyric/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-sw-reference-api/"> pyric/storage/sw </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-reference-api/"> pyric/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-sw-reference-api/"> pyric/messaging/sw </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules-reference-api/" aria-current="page"> pyric/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-reference-api/"> pyric/sandbox </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-branches-store-reference-api/"> pyric/sandbox/branches/store </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-checkpoints-reference-api/"> pyric/sandbox/checkpoints </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-checkpoints-directory-reference-api/"> pyric/sandbox/checkpoints/directory </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-firestore-reference-api/"> pyric/sandbox/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-database-reference-api/"> pyric/sandbox/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-app-check-reference-api/"> pyric/app-check </a> </li><li> <a href="/__pyric/ui/docs/pyric-functions-reference-api/"> pyric/functions </a> </li><li> <a href="/__pyric/ui/docs/pyric-analytics-reference-api/"> pyric/analytics </a> </li><li> <a href="/__pyric/ui/docs/pyric-performance-reference-api/"> pyric/performance </a> </li><li> <a href="/__pyric/ui/docs/pyric-remote-config-reference-api/"> pyric/remote-config </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric-admin</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-admin-reference-api/"> pyric-admin </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-app-reference-api/"> pyric-admin/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-firestore-reference-api/"> pyric-admin/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-auth-reference-api/"> pyric-admin/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-database-reference-api/"> pyric-admin/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-storage-reference-api/"> pyric-admin/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-messaging-reference-api/"> pyric-admin/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-app-check-reference-api/"> pyric-admin/app-check </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-data-connect-reference-api/"> pyric-admin/data-connect </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-eventarc-reference-api/"> pyric-admin/eventarc </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-extensions-reference-api/"> pyric-admin/extensions </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-functions-reference-api/"> pyric-admin/functions </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-installations-reference-api/"> pyric-admin/installations </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-instance-id-reference-api/"> pyric-admin/instance-id </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-machine-learning-reference-api/"> pyric-admin/machine-learning </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-phone-number-verification-reference-api/"> pyric-admin/phone-number-verification </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-project-management-reference-api/"> pyric-admin/project-management </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-remote-config-reference-api/"> pyric-admin/remote-config </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-security-rules-reference-api/"> pyric-admin/security-rules </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">create-pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/create-pyric-reference-api/"> create-pyric </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli-credentials-node-reference-api/"> @pyric/cli/credentials/node </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-verify-reference-api/"> @pyric/cli/verify </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-repro-reference-api/"> @pyric/cli/repro </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-reference-api/"> @pyric/cli/conformance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-browser-reference-api/"> @pyric/cli/conformance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-docs-reference-api/"> @pyric/cli/conformance/docs </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-reference-api/"> @pyric/cli/assurance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-browser-reference-api/"> @pyric/cli/assurance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-reference-api/"> @pyric/cli/bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-client-reference-api/"> @pyric/cli/bridge/client </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-discover-reference-api/"> @pyric/cli/discover </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-reference-api/"> @pyric/cli/vite </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-ssr-loader-reference-api/"> @pyric/cli/vite/ssr-loader </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-next-reference-api/"> @pyric/cli/next </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bundler-reference-api/"> @pyric/cli/bundler </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-serve-worker-reference-api/"> @pyric/cli/serve/worker </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-remote-reference-api/"> @pyric/cli/remote </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-reference-api/"> @pyric/cli/register </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-app-bridge-reference-api/"> @pyric/cli/register/app-bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-client-app-reference-api/"> @pyric/cli/register/client/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-client-app-bridge-reference-api/"> @pyric/cli/register/client/app-bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-client-auth-reference-api/"> @pyric/cli/register/client/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-client-database-reference-api/"> @pyric/cli/register/client/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-client-firestore-reference-api/"> @pyric/cli/register/client/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-client-storage-reference-api/"> @pyric/cli/register/client/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-flow-reference-api/"> @pyric/cli/flow </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/ui</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-ui-auth-reference-api/"> @pyric/ui/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-auth-hooks-reference-api/"> @pyric/ui/auth/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-primitives-reference-api/"> @pyric/ui/primitives </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-listener-owner-reference-api/"> @pyric/ui/listener-owner </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-reference-api/"> @pyric/ui/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-hooks-reference-api/"> @pyric/ui/firestore/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rtdb-reference-api/"> @pyric/ui/rtdb </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-reference-api/"> @pyric/ui/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-hooks-reference-api/"> @pyric/ui/storage/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-reference-api/"> @pyric/ui/traffic </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-hooks-reference-api/"> @pyric/ui/traffic/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-reference-api/"> @pyric/ui/events </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-hooks-reference-api/"> @pyric/ui/events/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-agents-reference-api/"> @pyric/ui/agents </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-reference-api/"> @pyric/ui/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-hooks-reference-api/"> @pyric/ui/rules/hooks </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/reference/cli/"> CLI </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> <details class="docs-nav-group" id="nav-group-overview"> <summary>Overview</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/overview/"> Overview </a> </li><li> <a href="/__pyric/ui/docs/tutorial/"> Tutorial </a> </li><li> <a href="/__pyric/ui/docs/examples/"> Examples </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-get-started"> <summary>Get started</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/get-started/start-building/"> Quickstart </a> </li><li> <a href="/__pyric/ui/docs/get-started/vite/"> Vite </a> </li><li> <a href="/__pyric/ui/docs/get-started/node-host/"> Node host </a> </li><li> <a href="/__pyric/ui/docs/get-started/nextjs/"> Next.js </a> </li><li> <a href="/__pyric/ui/docs/get-started/backend-bundlers/"> Backend bundlers </a> </li><li> <a href="/__pyric/ui/docs/get-started/flutter/"> Flutter </a> </li><li> <a href="/__pyric/ui/docs/get-started/how-the-swap-works/"> How the swap works </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-build"> <summary>Build</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/build/authentication/"> Authentication </a> </li><li> <a href="/__pyric/ui/docs/build/default-avatars/"> Default avatars </a> </li><li> <a href="/__pyric/ui/docs/build/inspect-activity/"> Activity on the page </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-firestore/"> Cloud Firestore </a> </li><li> <a href="/__pyric/ui/docs/build/realtime-database/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-storage/"> Cloud Storage </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-messaging/"> Cloud Messaging </a> </li><li> <a href="/__pyric/ui/docs/build/ai-logic/"> AI Logic </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-secure-debug"> <summary>Secure &amp; debug</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/secure/secure-it-with-rules/"> Security Rules </a> </li><li> <a href="/__pyric/ui/docs/secure/simulate-and-lint/"> Simulate and lint before you deploy </a> </li><li> <a href="/__pyric/ui/docs/secure/write-a-rules-test-suite/"> Write a rules test suite </a> </li><li> <a href="/__pyric/ui/docs/secure/read-a-denial/"> Read a denial and understand it </a> </li><li> <a href="/__pyric/ui/docs/secure/rules-standard-library/"> The rules standard library </a> </li><li> <a href="/__pyric/ui/docs/secure/rtdb-rules-in-typescript/"> RTDB rules in TypeScript </a> </li><li> <a href="/__pyric/ui/docs/secure/rtdb-rules-standard-library/"> RTDB rules standard library </a> </li><li> <a href="/__pyric/ui/docs/secure/firestore-rules-limits/"> Rules limits </a> </li><li> <a href="/__pyric/ui/docs/secure/audit-your-rules/"> Audit rules and data </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading" id="nav-section-secure-debug-examples"> Examples </h2> <ul> <li> <a href="/__pyric/ui/docs/examples/chess/"> Chess showcase </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-observe-shape"> <summary>Observe &amp; shape</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/observe/see-whats-happening/"> Traffic &amp; rule verdicts </a> </li><li> <a href="/__pyric/ui/docs/observe/resolve-runtime-status/"> Runtime status </a> </li><li> <a href="/__pyric/ui/docs/observe/switch-and-impersonate-identities/"> Impersonate &amp; tenants </a> </li><li> <a href="/__pyric/ui/docs/observe/shape-your-data/"> Seed, snapshot, replay </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-ship-test"> <summary>Ship &amp; test</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/ship/ship-to-production/"> Ship to production </a> </li><li> <a href="/__pyric/ui/docs/ship/test-in-node/"> Test in Node </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-work-with-an-agent"> <summary>Work with an agent</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/agent/set-up-your-agent/"> Connect an agent </a> </li><li> <a href="/__pyric/ui/docs/agent/work-with-an-agent/"> Use the MCP tools </a> </li><li> <a href="/__pyric/ui/docs/agent/watch-and-review/"> Watch in Pyric Studio </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-trust"> <summary>Trust</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/trust/versioning-and-compatibility/"> Versioning and the fb tag </a> </li><li> <a href="/__pyric/ui/docs/trust/rules-standard-library/"> Rules standard library reference </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/conformance-scores/"> Conformance scores </a> </li><li> <a href="/__pyric/ui/docs/trust/how-we-know-it-matches-firebase/"> How we know it matches Firebase </a> </li><li> <a href="/__pyric/ui/docs/app-compat/"> App </a> </li><li> <a href="/__pyric/ui/docs/ai-compat/"> AI Logic </a> </li><li> <a href="/__pyric/ui/docs/auth-compat/"> Auth </a> </li><li> <a href="/__pyric/ui/docs/firestore-compat/"> Firestore </a> </li><li> <a href="/__pyric/ui/docs/database-compat/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/storage-compat/"> Storage </a> </li><li> <a href="/__pyric/ui/docs/messaging-compat/"> Messaging </a> </li><li> <a href="/__pyric/ui/docs/functions-rtdb-compat/"> Functions · RTDB </a> </li><li> <a href="/__pyric/ui/docs/rules-compat/"> Rules </a> </li><li> <a href="/__pyric/ui/docs/firestore-flutter-compat/"> Firestore · Flutter </a> </li><li> <a href="/__pyric/ui/docs/firestore-kotlin-compat/"> Firestore · Kotlin </a> </li><li> <a href="/__pyric/ui/docs/firestore-swift-compat/"> Firestore · Swift </a> </li><li> <a href="/__pyric/ui/docs/auth-flutter-compat/"> Auth · Flutter </a> </li><li> <a href="/__pyric/ui/docs/auth-kotlin-compat/"> Auth · Kotlin </a> </li><li> <a href="/__pyric/ui/docs/auth-swift-compat/"> FirebaseAuth Swift </a> </li><li> <a href="/__pyric/ui/docs/rtdb-flutter-compat/"> Realtime Database · Flutter </a> </li><li> <a href="/__pyric/ui/docs/rtdb-kotlin-compat/"> Realtime Database · Kotlin </a> </li><li> <a href="/__pyric/ui/docs/rtdb-swift-compat/"> Realtime Database · Swift </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 docs-nav-group-body--reference"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/api-reference/"> API reference </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-app-reference-api/"> pyric/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-reference-api/"> pyric/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-lite-reference-api/"> pyric/firestore/lite </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth-reference-api/"> pyric/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-reference-api/"> pyric/ai </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-scripting-reference-api/"> pyric/ai/scripting </a> </li><li> <a href="/__pyric/ui/docs/pyric-database-reference-api/"> pyric/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-reference-api/"> pyric/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-sw-reference-api/"> pyric/storage/sw </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-reference-api/"> pyric/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-sw-reference-api/"> pyric/messaging/sw </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules-reference-api/" aria-current="page"> pyric/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-reference-api/"> pyric/sandbox </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-branches-store-reference-api/"> pyric/sandbox/branches/store </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-checkpoints-reference-api/"> pyric/sandbox/checkpoints </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-checkpoints-directory-reference-api/"> pyric/sandbox/checkpoints/directory </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-firestore-reference-api/"> pyric/sandbox/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-database-reference-api/"> pyric/sandbox/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-app-check-reference-api/"> pyric/app-check </a> </li><li> <a href="/__pyric/ui/docs/pyric-functions-reference-api/"> pyric/functions </a> </li><li> <a href="/__pyric/ui/docs/pyric-analytics-reference-api/"> pyric/analytics </a> </li><li> <a href="/__pyric/ui/docs/pyric-performance-reference-api/"> pyric/performance </a> </li><li> <a href="/__pyric/ui/docs/pyric-remote-config-reference-api/"> pyric/remote-config </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric-admin</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-admin-reference-api/"> pyric-admin </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-app-reference-api/"> pyric-admin/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-firestore-reference-api/"> pyric-admin/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-auth-reference-api/"> pyric-admin/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-database-reference-api/"> pyric-admin/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-storage-reference-api/"> pyric-admin/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-messaging-reference-api/"> pyric-admin/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-app-check-reference-api/"> pyric-admin/app-check </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-data-connect-reference-api/"> pyric-admin/data-connect </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-eventarc-reference-api/"> pyric-admin/eventarc </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-extensions-reference-api/"> pyric-admin/extensions </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-functions-reference-api/"> pyric-admin/functions </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-installations-reference-api/"> pyric-admin/installations </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-instance-id-reference-api/"> pyric-admin/instance-id </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-machine-learning-reference-api/"> pyric-admin/machine-learning </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-phone-number-verification-reference-api/"> pyric-admin/phone-number-verification </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-project-management-reference-api/"> pyric-admin/project-management </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-remote-config-reference-api/"> pyric-admin/remote-config </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-security-rules-reference-api/"> pyric-admin/security-rules </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">create-pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/create-pyric-reference-api/"> create-pyric </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli-credentials-node-reference-api/"> @pyric/cli/credentials/node </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-verify-reference-api/"> @pyric/cli/verify </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-repro-reference-api/"> @pyric/cli/repro </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-reference-api/"> @pyric/cli/conformance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-browser-reference-api/"> @pyric/cli/conformance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-docs-reference-api/"> @pyric/cli/conformance/docs </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-reference-api/"> @pyric/cli/assurance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-browser-reference-api/"> @pyric/cli/assurance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-reference-api/"> @pyric/cli/bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-client-reference-api/"> @pyric/cli/bridge/client </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-discover-reference-api/"> @pyric/cli/discover </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-reference-api/"> @pyric/cli/vite </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-ssr-loader-reference-api/"> @pyric/cli/vite/ssr-loader </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-next-reference-api/"> @pyric/cli/next </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bundler-reference-api/"> @pyric/cli/bundler </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-serve-worker-reference-api/"> @pyric/cli/serve/worker </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-remote-reference-api/"> @pyric/cli/remote </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-reference-api/"> @pyric/cli/register </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-app-bridge-reference-api/"> @pyric/cli/register/app-bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-client-app-reference-api/"> @pyric/cli/register/client/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-client-app-bridge-reference-api/"> @pyric/cli/register/client/app-bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-client-auth-reference-api/"> @pyric/cli/register/client/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-client-database-reference-api/"> @pyric/cli/register/client/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-client-firestore-reference-api/"> @pyric/cli/register/client/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-client-storage-reference-api/"> @pyric/cli/register/client/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-flow-reference-api/"> @pyric/cli/flow </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/ui</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-ui-auth-reference-api/"> @pyric/ui/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-auth-hooks-reference-api/"> @pyric/ui/auth/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-primitives-reference-api/"> @pyric/ui/primitives </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-listener-owner-reference-api/"> @pyric/ui/listener-owner </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-reference-api/"> @pyric/ui/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-hooks-reference-api/"> @pyric/ui/firestore/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rtdb-reference-api/"> @pyric/ui/rtdb </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-reference-api/"> @pyric/ui/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-hooks-reference-api/"> @pyric/ui/storage/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-reference-api/"> @pyric/ui/traffic </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-hooks-reference-api/"> @pyric/ui/traffic/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-reference-api/"> @pyric/ui/events </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-hooks-reference-api/"> @pyric/ui/events/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-agents-reference-api/"> @pyric/ui/agents </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-reference-api/"> @pyric/ui/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-hooks-reference-api/"> @pyric/ui/rules/hooks </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/reference/cli/"> CLI </a> </li> </ul> </div> </div> </details> </nav> <main class="doc-main" data-astro-cid-mw7aashj> <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" data-astro-cid-mw7aashj> <p class="api-reference-kicker" data-astro-cid-mw7aashj>API reference</p> <h1 data-astro-cid-mw7aashj><code data-astro-cid-mw7aashj>pyric/rules</code></h1> <p class="api-reference-meta" data-astro-cid-mw7aashj> 126 published symbols from <code data-astro-cid-mw7aashj>pyric</code> </p> <p class="api-reference-source" data-astro-cid-mw7aashj>
6
6
  Generated from the TypeScript declarations shipped at this import path.
7
7
  </p> <a class="api-reference-evidence" href="/__pyric/ui/docs/rules-compat/" data-astro-cid-mw7aashj>
8
8
  Check behavioral conformance
@@ -742,7 +742,7 @@ evaluation on <code>TestResult</code> / <code>CaseResult</code> / <code>Explanat
742
742
 
743
743
 
744
744
 
745
- <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="children"></a> <code>children?</code></td><td align="left"><code>Record</code>&#x3C;<code>string</code>, <a href="#pathdef"><code>PathDef</code></a>></td><td align="left">-</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><td align="left">-</td></tr><tr><td align="left"><a id="indexon"></a> <code>indexOn?</code></td><td align="left"><code>string</code>[]</td><td align="left">Fields to emit under <code>.indexOn</code> for the container node. May be declared directly on a container path (e.g. <code>"/jobs"</code>) or on a <code>$wildcard</code> child path (e.g. <code>"/jobs/$jobId"</code>), which lifts <code>.indexOn</code> onto its parent.</td></tr><tr><td align="left"><a id="read"></a> <code>read?</code></td><td align="left"><code>string</code></td><td align="left">-</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><td align="left">-</td></tr><tr><td align="left"><a id="validate"></a> <code>validate?</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="write"></a> <code>write?</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr></tbody></table></div>
745
+ <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="children"></a> <code>children?</code></td><td align="left"><code>Record</code>&#x3C;<code>string</code>, <a href="#pathdef"><code>PathDef</code></a>></td><td align="left">-</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><td align="left">-</td></tr><tr><td align="left"><a id="indexon"></a> <code>indexOn?</code></td><td align="left"><code>string</code>[]</td><td align="left">Fields to emit under <code>.indexOn</code> for the container node. May be declared directly on a container path (e.g. <code>"/jobs"</code>) or on a <code>$wildcard</code> child path (e.g. <code>"/jobs/$jobId"</code>), which lifts <code>.indexOn</code> onto its parent.</td></tr><tr><td align="left"><a id="read"></a> <code>read?</code></td><td align="left"><code>string</code> | <code>boolean</code></td><td align="left">An expression, or a boolean as database.rules.json spells it: false denies, true allows.</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><td align="left">-</td></tr><tr><td align="left"><a id="validate"></a> <code>validate?</code></td><td align="left"><code>string</code> | <code>boolean</code></td><td align="left">-</td></tr><tr><td align="left"><a id="write"></a> <code>write?</code></td><td align="left"><code>string</code> | <code>boolean</code></td><td align="left">-</td></tr></tbody></table></div>
746
746
  <hr>
747
747
  <p><a id="pathresolutionentry"></a></p>
748
748
  <h3 id="pathresolutionentry">PathResolutionEntry</h3>
@@ -1132,7 +1132,7 @@ of an expectation.</p>
1132
1132
 
1133
1133
 
1134
1134
 
1135
- <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>tenant?</code>: <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>> | <a href="#rtdbinstancesdata"><code>RtdbInstancesData</code></a></td><td align="left">Existing data the rules read: the instance’s tree, or one tree per instance as <code>{ instances: { "&#x3C;name>": tree } }</code>. The per-instance form applies when the case names an <code>instance</code> or the ruleset holds rules per instance (<code>rtdbRules.fromFirebaseJson</code>); otherwise an object whose one key is <code>instances</code> is a tree with an <code>/instances</code> child, as before.</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="instance"></a> <code>instance?</code></td><td align="left"><code>string</code></td><td align="left">The database instance the request goes to, by name, such as <code>"demo-app-shard-1"</code>. Omit it for the default instance. A rule’s <code>root</code> and <code>data</code> read only this instance’s tree.</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. Any JSON value: a scalar such as <code>5</code> or <code>true</code> is a scalar write. For an <code>update</code> case it is the patch, an object keyed by paths relative to <code>path</code>, such as <code>{ "rooms/r1/title": "x", "rooms/r2/title": "y" }</code>.</td></tr><tr><td align="left"><a id="now"></a> <code>now?</code></td><td align="left"><code>number</code></td><td align="left">The instant <code>now</code> reports in this case, in epoch milliseconds. A caller hosting a sandbox passes its sandbox clock so a <code>now</code>-gated rule moves with the sandbox rather than the wall clock. Omit to evaluate at the real current instant.</td></tr><tr><td align="left"><a id="operation"></a> <code>operation</code></td><td align="left"><code>"read"</code> | <code>"write"</code> | <code>"update"</code> | <code>"validate"</code></td><td align="left">RTDB rule kind under test. <code>update</code> is a multi-path <code>update()</code>: every path in <code>newData</code> is written together and each is judged against the tree the whole update produces.</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><tr><td align="left"><a id="query-1"></a> <code>query?</code></td><td align="left"><a href="#rtdbcasequery-1"><code>RtdbCaseQuery</code></a></td><td align="left">The query a <code>read</code> case carries, so <code>query.*</code> rule expressions evaluate. Omit it to simulate a plain read of <code>path</code>.</td></tr><tr><td align="left"><a id="updates"></a> <code>updates?</code></td><td align="left">{ <code>path</code>: <code>string</code>; <code>value</code>: <code>unknown</code>; }[]</td><td align="left">For a <code>'write'</code> or <code>'validate'</code> case, the full set of paths written together in one atomic multi-path <code>update()</code>, so <code>path</code>’s rules evaluate against the shared post-write tree projection.</td></tr></tbody></table></div>
1135
+ <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>tenant?</code>: <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>> | <a href="#rtdbinstancesdata"><code>RtdbInstancesData</code></a></td><td align="left">Existing data the rules read: the instance’s tree, or one tree per instance as <code>{ instances: { "&#x3C;name>": tree } }</code>. The per-instance form applies when the case names an <code>instance</code> or the ruleset holds rules per instance (<code>rtdbRules.fromFirebaseJson</code>); otherwise an object whose one key is <code>instances</code> is a tree with an <code>/instances</code> child, as before.</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="instance"></a> <code>instance?</code></td><td align="left"><code>string</code></td><td align="left">The database instance the request goes to, by name, such as <code>"demo-app-shard-1"</code>. Omit it for the default instance. A rule’s <code>root</code> and <code>data</code> read only this instance’s tree.</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. Any JSON value: a scalar such as <code>5</code> or <code>true</code> is a scalar write. For an <code>update</code> case it is the patch, an object keyed by paths relative to <code>path</code>, such as <code>{ "rooms/r1/title": "x", "rooms/r2/title": "y" }</code>. Its keys are checked as the SDK checks <code>update()</code> keys: an invalid key, or a key that is an ancestor or duplicate of another, makes the case UNSUPPORTED.</td></tr><tr><td align="left"><a id="now"></a> <code>now?</code></td><td align="left"><code>number</code></td><td align="left">The instant <code>now</code> reports in this case, in epoch milliseconds. A caller hosting a sandbox passes its sandbox clock so a <code>now</code>-gated rule moves with the sandbox rather than the wall clock. Omit to evaluate at the real current instant.</td></tr><tr><td align="left"><a id="operation"></a> <code>operation</code></td><td align="left"><code>"read"</code> | <code>"write"</code> | <code>"update"</code> | <code>"validate"</code></td><td align="left">RTDB rule kind under test. <code>update</code> is a multi-path <code>update()</code>: every path in <code>newData</code> is written together and each is judged against the tree the whole update produces.</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>. A path the SDK refuses, one holding <code>.</code>, <code>#</code>, <code>$</code>, <code>[</code> or <code>]</code>, is UNSUPPORTED.</td></tr><tr><td align="left"><a id="query-1"></a> <code>query?</code></td><td align="left"><a href="#rtdbcasequery-1"><code>RtdbCaseQuery</code></a></td><td align="left">The query a <code>read</code> case carries, so <code>query.*</code> rule expressions evaluate. Omit it to simulate a plain read of <code>path</code>.</td></tr><tr><td align="left"><a id="updates"></a> <code>updates?</code></td><td align="left">{ <code>path</code>: <code>string</code>; <code>value</code>: <code>unknown</code>; }[]</td><td align="left">For a <code>'write'</code> or <code>'validate'</code> case, the full set of paths written together in one atomic multi-path <code>update()</code>, so <code>path</code>’s rules evaluate against the shared post-write tree projection. It lists <code>path</code>, with <code>newData</code> as its value when the case gives <code>newData</code>, and no path in it is an ancestor or duplicate of another; a case that breaks either is UNSUPPORTED.</td></tr></tbody></table></div>
1136
1136
  <hr>
1137
1137
  <p><a id="rtdbcasequery-1"></a></p>
1138
1138
  <h3 id="rtdbcasequery">RtdbCaseQuery</h3>
@@ -2688,44 +2688,18 @@ limit; nothing downstream ran.</li>
2688
2688
  <h4 id="returns-34">Returns</h4>
2689
2689
  <p><a href="#expr"><code>Expr</code></a></p>
2690
2690
  <hr>
2691
- <p><a id="ismember"></a></p>
2692
- <h3 id="ismember">isMember()</h3>
2693
- <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>
2694
- <p>Cross-path membership check: root.child(list).child($var).child(auth.uid).exists()</p>
2695
- <h4 id="parameters-25">Parameters</h4>
2696
- <div class="table-scroll">
2697
-
2698
-
2699
-
2700
-
2701
-
2702
-
2703
-
2704
-
2705
-
2706
-
2707
-
2708
-
2709
-
2710
-
2711
-
2712
-
2713
- <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>
2714
- <h4 id="returns-35">Returns</h4>
2715
- <p><a href="#expr"><code>Expr</code></a></p>
2716
- <hr>
2717
2691
  <p><a id="isnew"></a></p>
2718
2692
  <h3 id="isnew">isNew()</h3>
2719
2693
  <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>
2720
2694
  <p>Data at this path doesn’t exist yet (creation check)</p>
2721
- <h4 id="returns-36">Returns</h4>
2695
+ <h4 id="returns-35">Returns</h4>
2722
2696
  <p><a href="#expr"><code>Expr</code></a></p>
2723
2697
  <hr>
2724
2698
  <p><a id="lte"></a></p>
2725
2699
  <h3 id="lte">lte()</h3>
2726
2700
  <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>
2727
2701
  <p>Less than or equal: left &#x3C;= right</p>
2728
- <h4 id="parameters-26">Parameters</h4>
2702
+ <h4 id="parameters-25">Parameters</h4>
2729
2703
  <div class="table-scroll">
2730
2704
 
2731
2705
 
@@ -2744,14 +2718,14 @@ limit; nothing downstream ran.</li>
2744
2718
 
2745
2719
 
2746
2720
  <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>
2747
- <h4 id="returns-37">Returns</h4>
2721
+ <h4 id="returns-36">Returns</h4>
2748
2722
  <p><a href="#expr"><code>Expr</code></a></p>
2749
2723
  <hr>
2750
2724
  <p><a id="neq"></a></p>
2751
2725
  <h3 id="neq">neq()</h3>
2752
2726
  <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>
2753
2727
  <p>Inequality: left != right</p>
2754
- <h4 id="parameters-27">Parameters</h4>
2728
+ <h4 id="parameters-26">Parameters</h4>
2755
2729
  <div class="table-scroll">
2756
2730
 
2757
2731
 
@@ -2770,14 +2744,14 @@ limit; nothing downstream ran.</li>
2770
2744
 
2771
2745
 
2772
2746
  <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>
2773
- <h4 id="returns-38">Returns</h4>
2747
+ <h4 id="returns-37">Returns</h4>
2774
2748
  <p><a href="#expr"><code>Expr</code></a></p>
2775
2749
  <hr>
2776
2750
  <p><a id="newdataexists"></a></p>
2777
2751
  <h3 id="newdataexists">newDataExists()</h3>
2778
2752
  <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>
2779
2753
  <p>Check if incoming data exists at current node or a child path</p>
2780
- <h4 id="parameters-28">Parameters</h4>
2754
+ <h4 id="parameters-27">Parameters</h4>
2781
2755
  <div class="table-scroll">
2782
2756
 
2783
2757
 
@@ -2792,14 +2766,14 @@ limit; nothing downstream ran.</li>
2792
2766
 
2793
2767
 
2794
2768
  <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>
2795
- <h4 id="returns-39">Returns</h4>
2769
+ <h4 id="returns-38">Returns</h4>
2796
2770
  <p><a href="#expr"><code>Expr</code></a></p>
2797
2771
  <hr>
2798
2772
  <p><a id="newdatais"></a></p>
2799
2773
  <h3 id="newdatais">newDataIs()</h3>
2800
2774
  <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>
2801
2775
  <p>Check incoming data type at current node</p>
2802
- <h4 id="parameters-29">Parameters</h4>
2776
+ <h4 id="parameters-28">Parameters</h4>
2803
2777
  <div class="table-scroll">
2804
2778
 
2805
2779
 
@@ -2814,14 +2788,14 @@ limit; nothing downstream ran.</li>
2814
2788
 
2815
2789
 
2816
2790
  <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>
2817
- <h4 id="returns-40">Returns</h4>
2791
+ <h4 id="returns-39">Returns</h4>
2818
2792
  <p><a href="#expr"><code>Expr</code></a></p>
2819
2793
  <hr>
2820
2794
  <p><a id="newdataparentexists"></a></p>
2821
2795
  <h3 id="newdataparentexists">newDataParentExists()</h3>
2822
2796
  <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>
2823
2797
  <p>Navigate up from newData snapshot, then check if a child field exists</p>
2824
- <h4 id="parameters-30">Parameters</h4>
2798
+ <h4 id="parameters-29">Parameters</h4>
2825
2799
  <div class="table-scroll">
2826
2800
 
2827
2801
 
@@ -2840,14 +2814,14 @@ limit; nothing downstream ran.</li>
2840
2814
 
2841
2815
 
2842
2816
  <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>
2843
- <h4 id="returns-41">Returns</h4>
2817
+ <h4 id="returns-40">Returns</h4>
2844
2818
  <p><a href="#expr"><code>Expr</code></a></p>
2845
2819
  <hr>
2846
2820
  <p><a id="newdataparentval"></a></p>
2847
2821
  <h3 id="newdataparentval">newDataParentVal()</h3>
2848
2822
  <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>
2849
2823
  <p>Navigate up from newData snapshot, then read a child field’s value</p>
2850
- <h4 id="parameters-31">Parameters</h4>
2824
+ <h4 id="parameters-30">Parameters</h4>
2851
2825
  <div class="table-scroll">
2852
2826
 
2853
2827
 
@@ -2866,14 +2840,14 @@ limit; nothing downstream ran.</li>
2866
2840
 
2867
2841
 
2868
2842
  <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>
2869
- <h4 id="returns-42">Returns</h4>
2843
+ <h4 id="returns-41">Returns</h4>
2870
2844
  <p><a href="#expr"><code>Expr</code></a></p>
2871
2845
  <hr>
2872
2846
  <p><a id="newdataval"></a></p>
2873
2847
  <h3 id="newdataval">newDataVal()</h3>
2874
2848
  <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>
2875
2849
  <p>Read incoming data value at current node or a child path (post-write state)</p>
2876
- <h4 id="parameters-32">Parameters</h4>
2850
+ <h4 id="parameters-31">Parameters</h4>
2877
2851
  <div class="table-scroll">
2878
2852
 
2879
2853
 
@@ -2888,14 +2862,14 @@ limit; nothing downstream ran.</li>
2888
2862
 
2889
2863
 
2890
2864
  <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>
2891
- <h4 id="returns-43">Returns</h4>
2865
+ <h4 id="returns-42">Returns</h4>
2892
2866
  <p><a href="#expr"><code>Expr</code></a></p>
2893
2867
  <hr>
2894
2868
  <p><a id="ownerornew"></a></p>
2895
2869
  <h3 id="ownerornew">ownerOrNew()</h3>
2896
2870
  <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>
2897
2871
  <p>Anyone authenticated can create; only the field owner can edit</p>
2898
- <h4 id="parameters-33">Parameters</h4>
2872
+ <h4 id="parameters-32">Parameters</h4>
2899
2873
  <div class="table-scroll">
2900
2874
 
2901
2875
 
@@ -2910,14 +2884,14 @@ limit; nothing downstream ran.</li>
2910
2884
 
2911
2885
 
2912
2886
  <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>
2913
- <h4 id="returns-44">Returns</h4>
2887
+ <h4 id="returns-43">Returns</h4>
2914
2888
  <p><a href="#expr"><code>Expr</code></a></p>
2915
2889
  <hr>
2916
2890
  <p><a id="ownfield"></a></p>
2917
2891
  <h3 id="ownfield">ownField()</h3>
2918
2892
  <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>
2919
2893
  <p>Field-based ownership: auth.uid matches a value stored in a data field</p>
2920
- <h4 id="parameters-34">Parameters</h4>
2894
+ <h4 id="parameters-33">Parameters</h4>
2921
2895
  <div class="table-scroll">
2922
2896
 
2923
2897
 
@@ -2932,36 +2906,14 @@ limit; nothing downstream ran.</li>
2932
2906
 
2933
2907
 
2934
2908
  <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>
2935
- <h4 id="returns-45">Returns</h4>
2936
- <p><a href="#expr"><code>Expr</code></a></p>
2937
- <hr>
2938
- <p><a id="ownpath"></a></p>
2939
- <h3 id="ownpath">ownPath()</h3>
2940
- <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>
2941
- <p>Path-based ownership: auth.uid matches a URL path variable</p>
2942
- <h4 id="parameters-35">Parameters</h4>
2943
- <div class="table-scroll">
2944
-
2945
-
2946
-
2947
-
2948
-
2949
-
2950
-
2951
-
2952
-
2953
-
2954
-
2955
-
2956
- <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>
2957
- <h4 id="returns-46">Returns</h4>
2909
+ <h4 id="returns-44">Returns</h4>
2958
2910
  <p><a href="#expr"><code>Expr</code></a></p>
2959
2911
  <hr>
2960
2912
  <p><a id="pathowneronly"></a></p>
2961
2913
  <h3 id="pathowneronly">pathOwnerOnly()</h3>
2962
2914
  <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>
2963
2915
  <p>Only the path owner (auth.uid == $pathVar) can access</p>
2964
- <h4 id="parameters-36">Parameters</h4>
2916
+ <h4 id="parameters-34">Parameters</h4>
2965
2917
  <div class="table-scroll">
2966
2918
 
2967
2919
 
@@ -2976,14 +2928,14 @@ limit; nothing downstream ran.</li>
2976
2928
 
2977
2929
 
2978
2930
  <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>
2979
- <h4 id="returns-47">Returns</h4>
2931
+ <h4 id="returns-45">Returns</h4>
2980
2932
  <p><a href="#expr"><code>Expr</code></a></p>
2981
2933
  <hr>
2982
2934
  <p><a id="ref"></a></p>
2983
2935
  <h3 id="ref">ref()</h3>
2984
2936
  <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"> ref</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">expression</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"> Segment</span><span style="color:#ABB2BF">;</span></span></code></pre>
2985
2937
  <p>Wrap a runtime rule expression so comparisons emit it unquoted</p>
2986
- <h4 id="parameters-37">Parameters</h4>
2938
+ <h4 id="parameters-35">Parameters</h4>
2987
2939
  <div class="table-scroll">
2988
2940
 
2989
2941
 
@@ -2998,7 +2950,7 @@ limit; nothing downstream ran.</li>
2998
2950
 
2999
2951
 
3000
2952
  <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>expression</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
3001
- <h4 id="returns-48">Returns</h4>
2953
+ <h4 id="returns-46">Returns</h4>
3002
2954
  <p><a href="#segment"><code>Segment</code></a></p>
3003
2955
  <hr>
3004
2956
  <p><a id="required-1"></a></p>
@@ -3008,7 +2960,7 @@ limit; nothing downstream ran.</li>
3008
2960
  checked together with <code>newData.hasChildren([...])</code>; a nested path such as
3009
2961
  ‘puck/x’ is checked with <code>newData.hasChild('puck/x')</code>, joined with <code>&#x26;&#x26;</code>.
3010
2962
  Every segment of every field must be a valid RTDB key.</p>
3011
- <h4 id="parameters-38">Parameters</h4>
2963
+ <h4 id="parameters-36">Parameters</h4>
3012
2964
  <div class="table-scroll">
3013
2965
 
3014
2966
 
@@ -3023,14 +2975,14 @@ Every segment of every field must be a valid RTDB key.</p>
3023
2975
 
3024
2976
 
3025
2977
  <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>
3026
- <h4 id="returns-49">Returns</h4>
2978
+ <h4 id="returns-47">Returns</h4>
3027
2979
  <p><a href="#expr"><code>Expr</code></a></p>
3028
2980
  <hr>
3029
2981
  <p><a id="rootequals"></a></p>
3030
2982
  <h3 id="rootequals">rootEquals()</h3>
3031
2983
  <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>
3032
2984
  <p>Check if a path’s value equals a specific string (via root)</p>
3033
- <h4 id="parameters-39">Parameters</h4>
2985
+ <h4 id="parameters-37">Parameters</h4>
3034
2986
  <div class="table-scroll">
3035
2987
 
3036
2988
 
@@ -3049,14 +3001,14 @@ Every segment of every field must be a valid RTDB key.</p>
3049
3001
 
3050
3002
 
3051
3003
  <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>
3052
- <h4 id="returns-50">Returns</h4>
3004
+ <h4 id="returns-48">Returns</h4>
3053
3005
  <p><a href="#expr"><code>Expr</code></a></p>
3054
3006
  <hr>
3055
3007
  <p><a id="rootexists"></a></p>
3056
3008
  <h3 id="rootexists">rootExists()</h3>
3057
3009
  <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>
3058
3010
  <p>Check if a path exists in the database (via root)</p>
3059
- <h4 id="parameters-40">Parameters</h4>
3011
+ <h4 id="parameters-38">Parameters</h4>
3060
3012
  <div class="table-scroll">
3061
3013
 
3062
3014
 
@@ -3071,7 +3023,7 @@ Every segment of every field must be a valid RTDB key.</p>
3071
3023
 
3072
3024
 
3073
3025
  <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>
3074
- <h4 id="returns-51">Returns</h4>
3026
+ <h4 id="returns-49">Returns</h4>
3075
3027
  <p><a href="#expr"><code>Expr</code></a></p>
3076
3028
  <hr>
3077
3029
  <p><a id="rtdbrules"></a></p>
@@ -3104,7 +3056,7 @@ and trailing commas) or has no top-level <code>rules</code> object.</p>
3104
3056
  <h3 id="transition">transition()</h3>
3105
3057
  <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>
3106
3058
  <p>State machine: only allowed transitions on a field</p>
3107
- <h4 id="parameters-41">Parameters</h4>
3059
+ <h4 id="parameters-39">Parameters</h4>
3108
3060
  <div class="table-scroll">
3109
3061
 
3110
3062
 
@@ -3123,7 +3075,7 @@ and trailing commas) or has no top-level <code>rules</code> object.</p>
3123
3075
 
3124
3076
 
3125
3077
  <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>
3126
- <h4 id="returns-52">Returns</h4>
3078
+ <h4 id="returns-50">Returns</h4>
3127
3079
  <p><a href="#expr"><code>Expr</code></a></p>
3128
3080
  <h2 id="functions">Functions</h2>
3129
3081
  <p><a id="all"></a></p>
@@ -3131,9 +3083,9 @@ and trailing commas) or has no top-level <code>rules</code> object.</p>
3131
3083
  <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"> 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">string</span><span style="color:#ABB2BF">[]): </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">;</span></span></code></pre>
3132
3084
  <p>All conditions must be true (AND). An operand is parenthesized only when
3133
3085
  it holds a top-level <code>||</code> or ternary, which binds looser than <code>&#x26;&#x26;</code>.
3134
- Empty operands are dropped; with none left it throws, since an empty
3086
+ Empty and whitespace-only operands are dropped; with none left it throws, since an empty
3135
3087
  conjunction would allow everything. Use <a href="#always">always</a> for that.</p>
3136
- <h4 id="parameters-42">Parameters</h4>
3088
+ <h4 id="parameters-40">Parameters</h4>
3137
3089
  <div class="table-scroll">
3138
3090
 
3139
3091
 
@@ -3148,7 +3100,7 @@ conjunction would allow everything. Use <a href="#always">always</a> for that.</
3148
3100
 
3149
3101
 
3150
3102
  <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"><code>string</code>[]</td></tr></tbody></table></div>
3151
- <h4 id="returns-53">Returns</h4>
3103
+ <h4 id="returns-51">Returns</h4>
3152
3104
  <p><code>string</code></p>
3153
3105
  <hr>
3154
3106
  <p><a id="any"></a></p>
@@ -3156,9 +3108,9 @@ conjunction would allow everything. Use <a href="#always">always</a> for that.</
3156
3108
  <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"> 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">string</span><span style="color:#ABB2BF">[]): </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">;</span></span></code></pre>
3157
3109
  <p>At least one condition must be true (OR). An operand with a top-level <code>&#x26;&#x26;</code>
3158
3110
  is parenthesized for the reader, and one with a ternary for the parser.
3159
- Empty operands are dropped; with none left it throws, since an empty
3111
+ Empty and whitespace-only operands are dropped; with none left it throws, since an empty
3160
3112
  disjunction would deny everything. Use <a href="#deny-1">deny</a> for that.</p>
3161
- <h4 id="parameters-43">Parameters</h4>
3113
+ <h4 id="parameters-41">Parameters</h4>
3162
3114
  <div class="table-scroll">
3163
3115
 
3164
3116
 
@@ -3173,7 +3125,7 @@ disjunction would deny everything. Use <a href="#deny-1">deny</a> for that.</p>
3173
3125
 
3174
3126
 
3175
3127
  <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"><code>string</code>[]</td></tr></tbody></table></div>
3176
- <h4 id="returns-54">Returns</h4>
3128
+ <h4 id="returns-52">Returns</h4>
3177
3129
  <p><code>string</code></p>
3178
3130
  <hr>
3179
3131
  <p><a id="assertcase"></a></p>
@@ -3184,7 +3136,7 @@ disjunction would deny everything. Use <a href="#deny-1">deny</a> for that.</p>
3184
3136
  <a href="#rulesunsupportederror">RulesUnsupportedError</a>; a genuine expectation mismatch throws
3185
3137
  <a href="#rulesassertionerror">RulesAssertionError</a>. Both carry the <a href="#explaincase">explainCase</a> trace as
3186
3138
  their message. Returns <code>void</code> on a passing result.</p>
3187
- <h5 id="parameters-44">Parameters</h5>
3139
+ <h5 id="parameters-42">Parameters</h5>
3188
3140
  <div class="table-scroll">
3189
3141
 
3190
3142
 
@@ -3199,13 +3151,13 @@ their message. Returns <code>void</code> on a passing result.</p>
3199
3151
 
3200
3152
 
3201
3153
  <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="#rtdbcaseresult"><code>RtdbCaseResult</code></a> | <a href="#caseresult"><code>CaseResult</code></a></td></tr></tbody></table></div>
3202
- <h5 id="returns-55">Returns</h5>
3154
+ <h5 id="returns-53">Returns</h5>
3203
3155
  <p><code>void</code></p>
3204
3156
  <h4 id="call-signature-1">Call Signature</h4>
3205
3157
  <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>
3206
3158
  <p>Simulate one case against a ruleset and throw on a miss — the runner
3207
3159
  form: <code>for (const c of cases) test(c.description, () => assertCase(ruleset, c))</code>.</p>
3208
- <h5 id="parameters-45">Parameters</h5>
3160
+ <h5 id="parameters-43">Parameters</h5>
3209
3161
  <div class="table-scroll">
3210
3162
 
3211
3163
 
@@ -3224,7 +3176,7 @@ form: <code>for (const c of cases) test(c.description, () => assertCase(ruleset,
3224
3176
 
3225
3177
 
3226
3178
  <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>
3227
- <h5 id="returns-56">Returns</h5>
3179
+ <h5 id="returns-54">Returns</h5>
3228
3180
  <p><code>void</code></p>
3229
3181
  <h4 id="call-signature-2">Call Signature</h4>
3230
3182
  <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>
@@ -3232,7 +3184,7 @@ form: <code>for (const c of cases) test(c.description, () => assertCase(ruleset,
3232
3184
  <a href="#rulesunsupportederror">RulesUnsupportedError</a>; a genuine expectation mismatch throws
3233
3185
  <a href="#rulesassertionerror">RulesAssertionError</a>. Both carry the <a href="#explaincase">explainCase</a> trace as
3234
3186
  their message. Returns <code>void</code> on a passing result.</p>
3235
- <h5 id="parameters-46">Parameters</h5>
3187
+ <h5 id="parameters-44">Parameters</h5>
3236
3188
  <div class="table-scroll">
3237
3189
 
3238
3190
 
@@ -3251,12 +3203,12 @@ their message. Returns <code>void</code> on a passing result.</p>
3251
3203
 
3252
3204
 
3253
3205
  <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>
3254
- <h5 id="returns-57">Returns</h5>
3206
+ <h5 id="returns-55">Returns</h5>
3255
3207
  <p><code>void</code></p>
3256
3208
  <h4 id="call-signature-3">Call Signature</h4>
3257
3209
  <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>
3258
3210
  <p>Convenience: compile Firestore source and assert one case against it.</p>
3259
- <h5 id="parameters-47">Parameters</h5>
3211
+ <h5 id="parameters-45">Parameters</h5>
3260
3212
  <div class="table-scroll">
3261
3213
 
3262
3214
 
@@ -3275,7 +3227,7 @@ their message. Returns <code>void</code> on a passing result.</p>
3275
3227
 
3276
3228
 
3277
3229
  <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>
3278
- <h5 id="returns-58">Returns</h5>
3230
+ <h5 id="returns-56">Returns</h5>
3279
3231
  <p><code>void</code></p>
3280
3232
  <hr>
3281
3233
  <p><a id="bytes"></a></p>
@@ -3286,7 +3238,7 @@ their message. Returns <code>void</code> on a passing result.</p>
3286
3238
  <li>string → UTF-8 encoded</li>
3287
3239
  <li>Uint8Array → used verbatim</li>
3288
3240
  </ul>
3289
- <h4 id="parameters-48">Parameters</h4>
3241
+ <h4 id="parameters-46">Parameters</h4>
3290
3242
  <div class="table-scroll">
3291
3243
 
3292
3244
 
@@ -3301,7 +3253,7 @@ their message. Returns <code>void</code> on a passing result.</p>
3301
3253
 
3302
3254
 
3303
3255
  <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>
3304
- <h4 id="returns-59">Returns</h4>
3256
+ <h4 id="returns-57">Returns</h4>
3305
3257
  <p><code>Bytes</code></p>
3306
3258
  <hr>
3307
3259
  <p><a id="canonicalrtdbexpression"></a></p>
@@ -3311,7 +3263,7 @@ their message. Returns <code>void</code> on a passing result.</p>
3311
3263
  canonical texts evaluate identically for every request. Deterministic and
3312
3264
  idempotent. Throws <a href="#rtdbexpressionsyntaxerror">RtdbExpressionSyntaxError</a> for text that is not a
3313
3265
  rule expression.</p>
3314
- <h4 id="parameters-49">Parameters</h4>
3266
+ <h4 id="parameters-47">Parameters</h4>
3315
3267
  <div class="table-scroll">
3316
3268
 
3317
3269
 
@@ -3326,13 +3278,13 @@ rule expression.</p>
3326
3278
 
3327
3279
 
3328
3280
  <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>
3329
- <h4 id="returns-60">Returns</h4>
3281
+ <h4 id="returns-58">Returns</h4>
3330
3282
  <p><code>string</code></p>
3331
3283
  <hr>
3332
3284
  <p><a id="definertdbrules"></a></p>
3333
3285
  <h3 id="definertdbrules">defineRtdbRules()</h3>
3334
3286
  <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>
3335
- <h4 id="parameters-50">Parameters</h4>
3287
+ <h4 id="parameters-48">Parameters</h4>
3336
3288
  <div class="table-scroll">
3337
3289
 
3338
3290
 
@@ -3347,7 +3299,7 @@ rule expression.</p>
3347
3299
 
3348
3300
 
3349
3301
  <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>
3350
- <h4 id="returns-61">Returns</h4>
3302
+ <h4 id="returns-59">Returns</h4>
3351
3303
  <p><a href="#rtdbrulesdocument"><code>RtdbRulesDocument</code></a></p>
3352
3304
  <hr>
3353
3305
  <p><a id="diffrtdbrules"></a></p>
@@ -3357,7 +3309,7 @@ rule expression.</p>
3357
3309
  <span class="line"><span style="color:#E06C75;font-style:italic"> local</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>
3358
3310
  <span class="line"><span style="color:#E06C75;font-style:italic"> options</span><span style="color:#C678DD">?</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">DiffRtdbRulesOptions</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">RtdbRuleChange</span><span style="color:#ABB2BF">[];</span></span></code></pre>
3359
3311
  <p>Node-level diff of two <code>rules</code> trees, ordered by path then rule kind.</p>
3360
- <h4 id="parameters-51">Parameters</h4>
3312
+ <h4 id="parameters-49">Parameters</h4>
3361
3313
  <div class="table-scroll">
3362
3314
 
3363
3315
 
@@ -3380,7 +3332,7 @@ rule expression.</p>
3380
3332
 
3381
3333
 
3382
3334
  <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>deployed</code></td><td align="left"><code>Record</code>&#x3C;<code>string</code>, <code>unknown</code>></td></tr><tr><td align="left"><code>local</code></td><td align="left"><code>Record</code>&#x3C;<code>string</code>, <code>unknown</code>></td></tr><tr><td align="left"><code>options?</code></td><td align="left"><a href="#diffrtdbrulesoptions"><code>DiffRtdbRulesOptions</code></a></td></tr></tbody></table></div>
3383
- <h4 id="returns-62">Returns</h4>
3335
+ <h4 id="returns-60">Returns</h4>
3384
3336
  <p><a href="#rtdbrulechange"><code>RtdbRuleChange</code></a>[]</p>
3385
3337
  <hr>
3386
3338
  <p><a id="duration"></a></p>
@@ -3388,7 +3340,7 @@ rule expression.</p>
3388
3340
  <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>
3389
3341
  <p>A <code>duration</code> value. <code>unit</code> is one of the Firestore duration units
3390
3342
  (<code>'w' | 'd' | 'h' | 'm' | 's' | 'ms' | 'ns'</code>); defaults to seconds.</p>
3391
- <h4 id="parameters-52">Parameters</h4>
3343
+ <h4 id="parameters-50">Parameters</h4>
3392
3344
  <div class="table-scroll">
3393
3345
 
3394
3346
 
@@ -3407,7 +3359,7 @@ rule expression.</p>
3407
3359
 
3408
3360
 
3409
3361
  <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>
3410
- <h4 id="returns-63">Returns</h4>
3362
+ <h4 id="returns-61">Returns</h4>
3411
3363
  <p><code>Duration</code></p>
3412
3364
  <hr>
3413
3365
  <p><a id="explaincase"></a></p>
@@ -3416,7 +3368,7 @@ rule expression.</p>
3416
3368
  <p>Render a case result as a human-readable trace. The single sanctioned
3417
3369
  trace renderer — used as the message of the error <code>assertCase</code> throws, and
3418
3370
  available directly for logging a result without asserting.</p>
3419
- <h4 id="parameters-53">Parameters</h4>
3371
+ <h4 id="parameters-51">Parameters</h4>
3420
3372
  <div class="table-scroll">
3421
3373
 
3422
3374
 
@@ -3431,14 +3383,14 @@ available directly for logging a result without asserting.</p>
3431
3383
 
3432
3384
 
3433
3385
  <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="#rtdbcaseresult"><code>RtdbCaseResult</code></a> | <a href="#caseresult"><code>CaseResult</code></a></td></tr></tbody></table></div>
3434
- <h4 id="returns-64">Returns</h4>
3386
+ <h4 id="returns-62">Returns</h4>
3435
3387
  <p><code>string</code></p>
3436
3388
  <hr>
3437
3389
  <p><a id="firestorerules"></a></p>
3438
3390
  <h3 id="firestorerules">firestoreRules()</h3>
3439
3391
  <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>
3440
3392
  <p>Compile Firestore rules source into a deep, safe-by-default handle.</p>
3441
- <h4 id="parameters-54">Parameters</h4>
3393
+ <h4 id="parameters-52">Parameters</h4>
3442
3394
  <div class="table-scroll">
3443
3395
 
3444
3396
 
@@ -3453,7 +3405,7 @@ available directly for logging a result without asserting.</p>
3453
3405
 
3454
3406
 
3455
3407
  <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>
3456
- <h4 id="returns-65">Returns</h4>
3408
+ <h4 id="returns-63">Returns</h4>
3457
3409
  <p><a href="#firestoreruleset"><code>FirestoreRuleset</code></a></p>
3458
3410
  <h4 id="throws-4">Throws</h4>
3459
3411
  <p>when the source does not parse or breaks one
@@ -3466,7 +3418,7 @@ compile-blocking issues on <code>.issues</code>.</p>
3466
3418
  <p>Turn flip: validates a turn field alternates between marks.
3467
3419
  First mark is the initial value on creation.
3468
3420
  Supports 2+ players with circular rotation.</p>
3469
- <h4 id="parameters-55">Parameters</h4>
3421
+ <h4 id="parameters-53">Parameters</h4>
3470
3422
  <div class="table-scroll">
3471
3423
 
3472
3424
 
@@ -3483,14 +3435,40 @@ Supports 2+ players with circular rotation.</p>
3483
3435
 
3484
3436
 
3485
3437
  <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>
3486
- <h4 id="returns-66">Returns</h4>
3438
+ <h4 id="returns-64">Returns</h4>
3439
+ <p><code>string</code></p>
3440
+ <hr>
3441
+ <p><a id="ismember"></a></p>
3442
+ <h3 id="ismember">isMember()</h3>
3443
+ <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"> 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:#E5C07B">string</span><span style="color:#ABB2BF">;</span></span></code></pre>
3444
+ <p>Cross-path membership check: root.child(list).child($var).child(auth.uid).exists()</p>
3445
+ <h4 id="parameters-54">Parameters</h4>
3446
+ <div class="table-scroll">
3447
+
3448
+
3449
+
3450
+
3451
+
3452
+
3453
+
3454
+
3455
+
3456
+
3457
+
3458
+
3459
+
3460
+
3461
+
3462
+
3463
+ <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>
3464
+ <h4 id="returns-65">Returns</h4>
3487
3465
  <p><code>string</code></p>
3488
3466
  <hr>
3489
3467
  <p><a id="latlng"></a></p>
3490
3468
  <h3 id="latlng">latlng()</h3>
3491
3469
  <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>
3492
3470
  <p>A <code>latlng</code> geographic point.</p>
3493
- <h4 id="parameters-56">Parameters</h4>
3471
+ <h4 id="parameters-55">Parameters</h4>
3494
3472
  <div class="table-scroll">
3495
3473
 
3496
3474
 
@@ -3509,7 +3487,7 @@ Supports 2+ players with circular rotation.</p>
3509
3487
 
3510
3488
 
3511
3489
  <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>
3512
- <h4 id="returns-67">Returns</h4>
3490
+ <h4 id="returns-66">Returns</h4>
3513
3491
  <p><code>LatLng</code></p>
3514
3492
  <hr>
3515
3493
  <p><a id="lint-4"></a></p>
@@ -3517,7 +3495,7 @@ Supports 2+ players with circular rotation.</p>
3517
3495
  <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>
3518
3496
  <p>Lint Firestore rules source. Accepts anything — including empty or
3519
3497
  syntactically broken source — and always returns an issue list.</p>
3520
- <h4 id="parameters-57">Parameters</h4>
3498
+ <h4 id="parameters-56">Parameters</h4>
3521
3499
  <div class="table-scroll">
3522
3500
 
3523
3501
 
@@ -3532,7 +3510,7 @@ syntactically broken source — and always returns an issue list.</p>
3532
3510
 
3533
3511
 
3534
3512
  <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>
3535
- <h4 id="returns-68">Returns</h4>
3513
+ <h4 id="returns-67">Returns</h4>
3536
3514
  <p><a href="#ruleissue"><code>RuleIssue</code></a>[]</p>
3537
3515
  <hr>
3538
3516
  <p><a id="lit"></a></p>
@@ -3544,7 +3522,7 @@ so compiled rules use one quote style.</p>
3544
3522
  <p>The quote and backslash escapes match Pyric’s rules simulator. A string
3545
3523
  with a newline or another control character is refused: Pyric does not
3546
3524
  model escapes for those, and production behavior for them is not captured.</p>
3547
- <h4 id="parameters-58">Parameters</h4>
3525
+ <h4 id="parameters-57">Parameters</h4>
3548
3526
  <div class="table-scroll">
3549
3527
 
3550
3528
 
@@ -3559,14 +3537,14 @@ model escapes for those, and production behavior for them is not captured.</p>
3559
3537
 
3560
3538
 
3561
3539
  <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>Literal</code></td></tr></tbody></table></div>
3562
- <h4 id="returns-69">Returns</h4>
3540
+ <h4 id="returns-68">Returns</h4>
3563
3541
  <p><code>string</code></p>
3564
3542
  <hr>
3565
3543
  <p><a id="not"></a></p>
3566
3544
  <h3 id="not">not()</h3>
3567
3545
  <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"> 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">string</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">;</span></span></code></pre>
3568
3546
  <p>Negate a condition. A member chain such as <code>data.child('a').exists()</code> needs no parentheses.</p>
3569
- <h4 id="parameters-59">Parameters</h4>
3547
+ <h4 id="parameters-58">Parameters</h4>
3570
3548
  <div class="table-scroll">
3571
3549
 
3572
3550
 
@@ -3581,6 +3559,28 @@ model escapes for those, and production behavior for them is not captured.</p>
3581
3559
 
3582
3560
 
3583
3561
  <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"><code>string</code></td></tr></tbody></table></div>
3562
+ <h4 id="returns-69">Returns</h4>
3563
+ <p><code>string</code></p>
3564
+ <hr>
3565
+ <p><a id="ownpath"></a></p>
3566
+ <h3 id="ownpath">ownPath()</h3>
3567
+ <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"> 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:#E5C07B">string</span><span style="color:#ABB2BF">;</span></span></code></pre>
3568
+ <p>Path-based ownership: auth.uid matches a URL path variable</p>
3569
+ <h4 id="parameters-59">Parameters</h4>
3570
+ <div class="table-scroll">
3571
+
3572
+
3573
+
3574
+
3575
+
3576
+
3577
+
3578
+
3579
+
3580
+
3581
+
3582
+
3583
+ <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>
3584
3584
  <h4 id="returns-70">Returns</h4>
3585
3585
  <p><code>string</code></p>
3586
3586
  <hr>
@@ -3828,4 +3828,4 @@ Uses the “client claims, rules verify” pattern.</p>
3828
3828
 
3829
3829
  <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>
3830
3830
  <h4 id="returns-79">Returns</h4>
3831
- <p><code>string</code></p> </article> </main> <aside class="doc-toc api-symbols" aria-label="API symbols" data-astro-cid-mw7aashj> <h2 class="doc-toc-heading" data-astro-cid-mw7aashj>Symbols</h2> <input class="api-symbol-filter" type="search" placeholder="Filter symbols" aria-label="Filter API symbols" data-api-symbol-filter data-astro-cid-mw7aashj> <div class="api-symbol-groups" data-api-symbol-groups data-astro-cid-mw7aashj> <section class="api-symbol-group" data-api-symbol-group data-astro-cid-mw7aashj> <a class="api-symbol-kind" href="#classes" data-astro-cid-mw7aashj> Classes </a> <ul data-astro-cid-mw7aashj> <li data-api-symbol="rtdbexpressionsyntaxerror" data-astro-cid-mw7aashj> <a href="#rtdbexpressionsyntaxerror" data-astro-cid-mw7aashj>RtdbExpressionSyntaxError</a> </li><li data-api-symbol="rulesassertionerror" data-astro-cid-mw7aashj> <a href="#rulesassertionerror" data-astro-cid-mw7aashj>RulesAssertionError</a> </li><li data-api-symbol="rulescompileerror" data-astro-cid-mw7aashj> <a href="#rulescompileerror" data-astro-cid-mw7aashj>RulesCompileError</a> </li><li data-api-symbol="rulesunsupportederror" data-astro-cid-mw7aashj> <a href="#rulesunsupportederror" data-astro-cid-mw7aashj>RulesUnsupportedError</a> </li> </ul> </section><section class="api-symbol-group" data-api-symbol-group data-astro-cid-mw7aashj> <a class="api-symbol-kind" href="#interfaces" data-astro-cid-mw7aashj> Interfaces </a> <ul data-astro-cid-mw7aashj> <li data-api-symbol="caseresult" data-astro-cid-mw7aashj> <a href="#caseresult" data-astro-cid-mw7aashj>CaseResult</a> </li><li data-api-symbol="diffrtdbrulesoptions" data-astro-cid-mw7aashj> <a href="#diffrtdbrulesoptions" data-astro-cid-mw7aashj>DiffRtdbRulesOptions</a> </li><li data-api-symbol="evaluatedruleinfo" data-astro-cid-mw7aashj> <a href="#evaluatedruleinfo" data-astro-cid-mw7aashj>EvaluatedRuleInfo</a> </li><li data-api-symbol="explanation" data-astro-cid-mw7aashj> <a href="#explanation" data-astro-cid-mw7aashj>Explanation</a> </li><li data-api-symbol="exprtraceentry" data-astro-cid-mw7aashj> <a href="#exprtraceentry" data-astro-cid-mw7aashj>ExprTraceEntry</a> </li><li data-api-symbol="firestorecase" data-astro-cid-mw7aashj> <a href="#firestorecase" data-astro-cid-mw7aashj>FirestoreCase</a> </li><li data-api-symbol="firestoreruleset" data-astro-cid-mw7aashj> <a href="#firestoreruleset" data-astro-cid-mw7aashj>FirestoreRuleset</a> </li><li data-api-symbol="listqueryproofreport" data-astro-cid-mw7aashj> <a href="#listqueryproofreport" data-astro-cid-mw7aashj>ListQueryProofReport</a> </li><li data-api-symbol="pathdef" data-astro-cid-mw7aashj> <a href="#pathdef" data-astro-cid-mw7aashj>PathDef</a> </li><li data-api-symbol="pathresolutionentry" data-astro-cid-mw7aashj> <a href="#pathresolutionentry" data-astro-cid-mw7aashj>PathResolutionEntry</a> </li><li data-api-symbol="pathresolutiontrace" data-astro-cid-mw7aashj> <a href="#pathresolutiontrace" data-astro-cid-mw7aashj>PathResolutionTrace</a> </li><li data-api-symbol="queryprooffailure" data-astro-cid-mw7aashj> <a href="#queryprooffailure" data-astro-cid-mw7aashj>QueryProofFailure</a> </li><li data-api-symbol="queryproofresidual" data-astro-cid-mw7aashj> <a href="#queryproofresidual" data-astro-cid-mw7aashj>QueryProofResidual</a> </li><li data-api-symbol="queryrepro" data-astro-cid-mw7aashj> <a href="#queryrepro" data-astro-cid-mw7aashj>QueryRepro</a> </li><li data-api-symbol="rtdbcase" data-astro-cid-mw7aashj> <a href="#rtdbcase" data-astro-cid-mw7aashj>RtdbCase</a> </li><li data-api-symbol="rtdbcasequery" data-astro-cid-mw7aashj> <a href="#rtdbcasequery" data-astro-cid-mw7aashj>RtdbCaseQuery</a> </li><li data-api-symbol="rtdbcaseresult" data-astro-cid-mw7aashj> <a href="#rtdbcaseresult" data-astro-cid-mw7aashj>RtdbCaseResult</a> </li><li data-api-symbol="rtdbcoverageoptions" data-astro-cid-mw7aashj> <a href="#rtdbcoverageoptions" data-astro-cid-mw7aashj>RtdbCoverageOptions</a> </li><li data-api-symbol="rtdbcoveragesummary" data-astro-cid-mw7aashj> <a href="#rtdbcoveragesummary" data-astro-cid-mw7aashj>RtdbCoverageSummary</a> </li><li data-api-symbol="rtdbexplanation" data-astro-cid-mw7aashj> <a href="#rtdbexplanation" data-astro-cid-mw7aashj>RtdbExplanation</a> </li><li data-api-symbol="rtdbfilecoverage" data-astro-cid-mw7aashj> <a href="#rtdbfilecoverage" data-astro-cid-mw7aashj>RtdbFileCoverage</a> </li><li data-api-symbol="rtdbfirebasejsonoptions" data-astro-cid-mw7aashj> <a href="#rtdbfirebasejsonoptions" data-astro-cid-mw7aashj>RtdbFirebaseJsonOptions</a> </li><li data-api-symbol="rtdbrulechange" data-astro-cid-mw7aashj> <a href="#rtdbrulechange" data-astro-cid-mw7aashj>RtdbRuleChange</a> </li><li data-api-symbol="rtdbrulecoverage" data-astro-cid-mw7aashj> <a href="#rtdbrulecoverage" data-astro-cid-mw7aashj>RtdbRuleCoverage</a> </li><li data-api-symbol="rtdbrulescheckresult" data-astro-cid-mw7aashj> <a href="#rtdbrulescheckresult" data-astro-cid-mw7aashj>RtdbRulesCheckResult</a> </li><li data-api-symbol="rtdbrulesconstructor()" data-astro-cid-mw7aashj> <a href="#rtdbrulesconstructor" data-astro-cid-mw7aashj>RtdbRulesConstructor()</a> </li><li data-api-symbol="rtdbrulesdefinition" data-astro-cid-mw7aashj> <a href="#rtdbrulesdefinition" data-astro-cid-mw7aashj>RtdbRulesDefinition</a> </li><li data-api-symbol="rtdbrulesdocument" data-astro-cid-mw7aashj> <a href="#rtdbrulesdocument" data-astro-cid-mw7aashj>RtdbRulesDocument</a> </li><li data-api-symbol="rtdbruleset" data-astro-cid-mw7aashj> <a href="#rtdbruleset" data-astro-cid-mw7aashj>RtdbRuleset</a> </li><li data-api-symbol="rtdbrulesfinding" data-astro-cid-mw7aashj> <a href="#rtdbrulesfinding" data-astro-cid-mw7aashj>RtdbRulesFinding</a> </li><li data-api-symbol="rtdbsimulationsummary" data-astro-cid-mw7aashj> <a href="#rtdbsimulationsummary" data-astro-cid-mw7aashj>RtdbSimulationSummary</a> </li><li data-api-symbol="ruleevaluation" data-astro-cid-mw7aashj> <a href="#ruleevaluation" data-astro-cid-mw7aashj>RuleEvaluation</a> </li><li data-api-symbol="ruleissue" data-astro-cid-mw7aashj> <a href="#ruleissue" data-astro-cid-mw7aashj>RuleIssue</a> </li><li data-api-symbol="rulesetcontext" data-astro-cid-mw7aashj> <a href="#rulesetcontext" data-astro-cid-mw7aashj>RulesetContext</a> </li><li data-api-symbol="rulesresourcelimit" data-astro-cid-mw7aashj> <a href="#rulesresourcelimit" data-astro-cid-mw7aashj>RulesResourceLimit</a> </li><li data-api-symbol="schemarulesresult" data-astro-cid-mw7aashj> <a href="#schemarulesresult" data-astro-cid-mw7aashj>SchemaRulesResult</a> </li><li data-api-symbol="shapeoptions" data-astro-cid-mw7aashj> <a href="#shapeoptions" data-astro-cid-mw7aashj>ShapeOptions</a> </li><li data-api-symbol="shaperesult" data-astro-cid-mw7aashj> <a href="#shaperesult" data-astro-cid-mw7aashj>ShapeResult</a> </li><li data-api-symbol="simulationsummary" data-astro-cid-mw7aashj> <a href="#simulationsummary" data-astro-cid-mw7aashj>SimulationSummary</a> </li> </ul> </section><section class="api-symbol-group" data-api-symbol-group data-astro-cid-mw7aashj> <a class="api-symbol-kind" href="#type-aliases" data-astro-cid-mw7aashj> Type Aliases </a> <ul data-astro-cid-mw7aashj> <li data-api-symbol="expr" data-astro-cid-mw7aashj> <a href="#expr" data-astro-cid-mw7aashj>Expr</a> </li><li data-api-symbol="fieldrule" data-astro-cid-mw7aashj> <a href="#fieldrule" data-astro-cid-mw7aashj>FieldRule</a> </li><li data-api-symbol="firestoremethod" data-astro-cid-mw7aashj> <a href="#firestoremethod" data-astro-cid-mw7aashj>FirestoreMethod</a> </li><li data-api-symbol="listquery" data-astro-cid-mw7aashj> <a href="#listquery" data-astro-cid-mw7aashj>ListQuery</a> </li><li data-api-symbol="listquerywhereconstraint" data-astro-cid-mw7aashj> <a href="#listquerywhereconstraint" data-astro-cid-mw7aashj>ListQueryWhereConstraint</a> </li><li data-api-symbol="rtdbcoveragekind" data-astro-cid-mw7aashj> <a href="#rtdbcoveragekind" data-astro-cid-mw7aashj>RtdbCoverageKind</a> </li><li data-api-symbol="rtdbcoveragestatus" data-astro-cid-mw7aashj> <a href="#rtdbcoveragestatus" data-astro-cid-mw7aashj>RtdbCoverageStatus</a> </li><li data-api-symbol="rtdbinstancesdata" data-astro-cid-mw7aashj> <a href="#rtdbinstancesdata" data-astro-cid-mw7aashj>RtdbInstancesData</a> </li><li data-api-symbol="rtdbruleevaluation" data-astro-cid-mw7aashj> <a href="#rtdbruleevaluation" data-astro-cid-mw7aashj>RtdbRuleEvaluation</a> </li><li data-api-symbol="rtdbrulekind" data-astro-cid-mw7aashj> <a href="#rtdbrulekind" data-astro-cid-mw7aashj>RtdbRuleKind</a> </li><li data-api-symbol="rtdbrulesfindingrule" data-astro-cid-mw7aashj> <a href="#rtdbrulesfindingrule" data-astro-cid-mw7aashj>RtdbRulesFindingRule</a> </li><li data-api-symbol="rtdbrulesjson" data-astro-cid-mw7aashj> <a href="#rtdbrulesjson" data-astro-cid-mw7aashj>RtdbRulesJson</a> </li><li data-api-symbol="rtdbrulessimulationauth" data-astro-cid-mw7aashj> <a href="#rtdbrulessimulationauth" data-astro-cid-mw7aashj>RtdbRulesSimulationAuth</a> </li><li data-api-symbol="rtdbrulessimulationinput" data-astro-cid-mw7aashj> <a href="#rtdbrulessimulationinput" data-astro-cid-mw7aashj>RtdbRulesSimulationInput</a> </li><li data-api-symbol="rtdbstdlib" data-astro-cid-mw7aashj> <a href="#rtdbstdlib" data-astro-cid-mw7aashj>RtdbStdlib</a> </li><li data-api-symbol="ruleissueorigin" data-astro-cid-mw7aashj> <a href="#ruleissueorigin" data-astro-cid-mw7aashj>RuleIssueOrigin</a> </li><li data-api-symbol="ruleissueseverity" data-astro-cid-mw7aashj> <a href="#ruleissueseverity" data-astro-cid-mw7aashj>RuleIssueSeverity</a> </li><li data-api-symbol="segment" data-astro-cid-mw7aashj> <a href="#segment" data-astro-cid-mw7aashj>Segment</a> </li> </ul> </section><section class="api-symbol-group" data-api-symbol-group data-astro-cid-mw7aashj> <a class="api-symbol-kind" href="#variables" data-astro-cid-mw7aashj> Variables </a> <ul data-astro-cid-mw7aashj> <li data-api-symbol="allow()" data-astro-cid-mw7aashj> <a href="#allow" data-astro-cid-mw7aashj>allow()</a> </li><li data-api-symbol="always()" data-astro-cid-mw7aashj> <a href="#always" data-astro-cid-mw7aashj>always()</a> </li><li data-api-symbol="auth_uid" data-astro-cid-mw7aashj> <a href="#auth_uid" data-astro-cid-mw7aashj>AUTH_UID</a> </li><li data-api-symbol="authenticated()" data-astro-cid-mw7aashj> <a href="#authenticated" data-astro-cid-mw7aashj>authenticated()</a> </li><li data-api-symbol="dataexists()" data-astro-cid-mw7aashj> <a href="#dataexists" data-astro-cid-mw7aashj>dataExists()</a> </li><li data-api-symbol="dataparentval()" data-astro-cid-mw7aashj> <a href="#dataparentval" data-astro-cid-mw7aashj>dataParentVal()</a> </li><li data-api-symbol="dataval()" data-astro-cid-mw7aashj> <a href="#dataval" data-astro-cid-mw7aashj>dataVal()</a> </li><li data-api-symbol="deny()" data-astro-cid-mw7aashj> <a href="#deny" data-astro-cid-mw7aashj>deny()</a> </li><li data-api-symbol="eq()" data-astro-cid-mw7aashj> <a href="#eq" data-astro-cid-mw7aashj>eq()</a> </li><li data-api-symbol="expr()" data-astro-cid-mw7aashj> <a href="#expr-1" data-astro-cid-mw7aashj>expr()</a> </li><li data-api-symbol="fieldenum()" data-astro-cid-mw7aashj> <a href="#fieldenum" data-astro-cid-mw7aashj>fieldEnum()</a> </li><li data-api-symbol="fieldisboolean()" data-astro-cid-mw7aashj> <a href="#fieldisboolean" data-astro-cid-mw7aashj>fieldIsBoolean()</a> </li><li data-api-symbol="fieldisnumber()" data-astro-cid-mw7aashj> <a href="#fieldisnumber" data-astro-cid-mw7aashj>fieldIsNumber()</a> </li><li data-api-symbol="fieldisstring()" data-astro-cid-mw7aashj> <a href="#fieldisstring" data-astro-cid-mw7aashj>fieldIsString()</a> </li><li data-api-symbol="fieldowneronly()" data-astro-cid-mw7aashj> <a href="#fieldowneronly" data-astro-cid-mw7aashj>fieldOwnerOnly()</a> </li><li data-api-symbol="gt()" data-astro-cid-mw7aashj> <a href="#gt" data-astro-cid-mw7aashj>gt()</a> </li><li data-api-symbol="haschild()" data-astro-cid-mw7aashj> <a href="#haschild" data-astro-cid-mw7aashj>hasChild()</a> </li><li data-api-symbol="haschildren()" data-astro-cid-mw7aashj> <a href="#haschildren" data-astro-cid-mw7aashj>hasChildren()</a> </li><li data-api-symbol="hasrole()" data-astro-cid-mw7aashj> <a href="#hasrole" data-astro-cid-mw7aashj>hasRole()</a> </li><li data-api-symbol="immutable()" data-astro-cid-mw7aashj> <a href="#immutable" data-astro-cid-mw7aashj>immutable()</a> </li><li data-api-symbol="immutableself()" data-astro-cid-mw7aashj> <a href="#immutableself" data-astro-cid-mw7aashj>immutableSelf()</a> </li><li data-api-symbol="ismember()" data-astro-cid-mw7aashj> <a href="#ismember" data-astro-cid-mw7aashj>isMember()</a> </li><li data-api-symbol="isnew()" data-astro-cid-mw7aashj> <a href="#isnew" data-astro-cid-mw7aashj>isNew()</a> </li><li data-api-symbol="lte()" data-astro-cid-mw7aashj> <a href="#lte" data-astro-cid-mw7aashj>lte()</a> </li><li data-api-symbol="neq()" data-astro-cid-mw7aashj> <a href="#neq" data-astro-cid-mw7aashj>neq()</a> </li><li data-api-symbol="newdataexists()" data-astro-cid-mw7aashj> <a href="#newdataexists" data-astro-cid-mw7aashj>newDataExists()</a> </li><li data-api-symbol="newdatais()" data-astro-cid-mw7aashj> <a href="#newdatais" data-astro-cid-mw7aashj>newDataIs()</a> </li><li data-api-symbol="newdataparentexists()" data-astro-cid-mw7aashj> <a href="#newdataparentexists" data-astro-cid-mw7aashj>newDataParentExists()</a> </li><li data-api-symbol="newdataparentval()" data-astro-cid-mw7aashj> <a href="#newdataparentval" data-astro-cid-mw7aashj>newDataParentVal()</a> </li><li data-api-symbol="newdataval()" data-astro-cid-mw7aashj> <a href="#newdataval" data-astro-cid-mw7aashj>newDataVal()</a> </li><li data-api-symbol="ownerornew()" data-astro-cid-mw7aashj> <a href="#ownerornew" data-astro-cid-mw7aashj>ownerOrNew()</a> </li><li data-api-symbol="ownfield()" data-astro-cid-mw7aashj> <a href="#ownfield" data-astro-cid-mw7aashj>ownField()</a> </li><li data-api-symbol="ownpath()" data-astro-cid-mw7aashj> <a href="#ownpath" data-astro-cid-mw7aashj>ownPath()</a> </li><li data-api-symbol="pathowneronly()" data-astro-cid-mw7aashj> <a href="#pathowneronly" data-astro-cid-mw7aashj>pathOwnerOnly()</a> </li><li data-api-symbol="ref()" data-astro-cid-mw7aashj> <a href="#ref" data-astro-cid-mw7aashj>ref()</a> </li><li data-api-symbol="required()" data-astro-cid-mw7aashj> <a href="#required" data-astro-cid-mw7aashj>required()</a> </li><li data-api-symbol="rootequals()" data-astro-cid-mw7aashj> <a href="#rootequals" data-astro-cid-mw7aashj>rootEquals()</a> </li><li data-api-symbol="rootexists()" data-astro-cid-mw7aashj> <a href="#rootexists" data-astro-cid-mw7aashj>rootExists()</a> </li><li data-api-symbol="rtdbrules" data-astro-cid-mw7aashj> <a href="#rtdbrules" data-astro-cid-mw7aashj>rtdbRules</a> </li><li data-api-symbol="rtdbstdlib" data-astro-cid-mw7aashj> <a href="#rtdbstdlib-1" data-astro-cid-mw7aashj>rtdbStdlib</a> </li><li data-api-symbol="transition()" data-astro-cid-mw7aashj> <a href="#transition" data-astro-cid-mw7aashj>transition()</a> </li> </ul> </section><section class="api-symbol-group" data-api-symbol-group data-astro-cid-mw7aashj> <a class="api-symbol-kind" href="#functions" data-astro-cid-mw7aashj> Functions </a> <ul data-astro-cid-mw7aashj> <li data-api-symbol="all()" data-astro-cid-mw7aashj> <a href="#all" data-astro-cid-mw7aashj>all()</a> </li><li data-api-symbol="any()" data-astro-cid-mw7aashj> <a href="#any" data-astro-cid-mw7aashj>any()</a> </li><li data-api-symbol="assertcase()" data-astro-cid-mw7aashj> <a href="#assertcase" data-astro-cid-mw7aashj>assertCase()</a> </li><li data-api-symbol="bytes()" data-astro-cid-mw7aashj> <a href="#bytes" data-astro-cid-mw7aashj>bytes()</a> </li><li data-api-symbol="canonicalrtdbexpression()" data-astro-cid-mw7aashj> <a href="#canonicalrtdbexpression" data-astro-cid-mw7aashj>canonicalRtdbExpression()</a> </li><li data-api-symbol="definertdbrules()" data-astro-cid-mw7aashj> <a href="#definertdbrules" data-astro-cid-mw7aashj>defineRtdbRules()</a> </li><li data-api-symbol="diffrtdbrules()" data-astro-cid-mw7aashj> <a href="#diffrtdbrules" data-astro-cid-mw7aashj>diffRtdbRules()</a> </li><li data-api-symbol="duration()" data-astro-cid-mw7aashj> <a href="#duration" data-astro-cid-mw7aashj>duration()</a> </li><li data-api-symbol="explaincase()" data-astro-cid-mw7aashj> <a href="#explaincase" data-astro-cid-mw7aashj>explainCase()</a> </li><li data-api-symbol="firestorerules()" data-astro-cid-mw7aashj> <a href="#firestorerules" data-astro-cid-mw7aashj>firestoreRules()</a> </li><li data-api-symbol="flip()" data-astro-cid-mw7aashj> <a href="#flip" data-astro-cid-mw7aashj>flip()</a> </li><li data-api-symbol="latlng()" data-astro-cid-mw7aashj> <a href="#latlng" data-astro-cid-mw7aashj>latlng()</a> </li><li data-api-symbol="lint()" data-astro-cid-mw7aashj> <a href="#lint-2" data-astro-cid-mw7aashj>lint()</a> </li><li data-api-symbol="lit()" data-astro-cid-mw7aashj> <a href="#lit" data-astro-cid-mw7aashj>lit()</a> </li><li data-api-symbol="not()" data-astro-cid-mw7aashj> <a href="#not" data-astro-cid-mw7aashj>not()</a> </li><li data-api-symbol="reference()" data-astro-cid-mw7aashj> <a href="#reference" data-astro-cid-mw7aashj>reference()</a> </li><li data-api-symbol="renderrtdbcoverage()" data-astro-cid-mw7aashj> <a href="#renderrtdbcoverage" data-astro-cid-mw7aashj>renderRtdbCoverage()</a> </li><li data-api-symbol="ruleset()" data-astro-cid-mw7aashj> <a href="#ruleset" data-astro-cid-mw7aashj>ruleset()</a> </li><li data-api-symbol="schemarules()" data-astro-cid-mw7aashj> <a href="#schemarules" data-astro-cid-mw7aashj>schemaRules()</a> </li><li data-api-symbol="servertimestamp()" data-astro-cid-mw7aashj> <a href="#servertimestamp" data-astro-cid-mw7aashj>serverTimestamp()</a> </li><li data-api-symbol="timestamp()" data-astro-cid-mw7aashj> <a href="#timestamp" data-astro-cid-mw7aashj>timestamp()</a> </li><li data-api-symbol="turnguard()" data-astro-cid-mw7aashj> <a href="#turnguard" data-astro-cid-mw7aashj>turnGuard()</a> </li><li data-api-symbol="vector()" data-astro-cid-mw7aashj> <a href="#vector" data-astro-cid-mw7aashj>vector()</a> </li><li data-api-symbol="wincheckhelper()" data-astro-cid-mw7aashj> <a href="#wincheckhelper" data-astro-cid-mw7aashj>winCheckHelper()</a> </li> </ul> </section> <p class="api-symbol-empty" data-api-symbol-empty hidden data-astro-cid-mw7aashj>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>
3831
+ <p><code>string</code></p> </article> </main> <aside class="doc-toc api-symbols" aria-label="API symbols" data-astro-cid-mw7aashj> <h2 class="doc-toc-heading" data-astro-cid-mw7aashj>Symbols</h2> <input class="api-symbol-filter" type="search" placeholder="Filter symbols" aria-label="Filter API symbols" data-api-symbol-filter data-astro-cid-mw7aashj> <div class="api-symbol-groups" data-api-symbol-groups data-astro-cid-mw7aashj> <section class="api-symbol-group" data-api-symbol-group data-astro-cid-mw7aashj> <a class="api-symbol-kind" href="#classes" data-astro-cid-mw7aashj> Classes </a> <ul data-astro-cid-mw7aashj> <li data-api-symbol="rtdbexpressionsyntaxerror" data-astro-cid-mw7aashj> <a href="#rtdbexpressionsyntaxerror" data-astro-cid-mw7aashj>RtdbExpressionSyntaxError</a> </li><li data-api-symbol="rulesassertionerror" data-astro-cid-mw7aashj> <a href="#rulesassertionerror" data-astro-cid-mw7aashj>RulesAssertionError</a> </li><li data-api-symbol="rulescompileerror" data-astro-cid-mw7aashj> <a href="#rulescompileerror" data-astro-cid-mw7aashj>RulesCompileError</a> </li><li data-api-symbol="rulesunsupportederror" data-astro-cid-mw7aashj> <a href="#rulesunsupportederror" data-astro-cid-mw7aashj>RulesUnsupportedError</a> </li> </ul> </section><section class="api-symbol-group" data-api-symbol-group data-astro-cid-mw7aashj> <a class="api-symbol-kind" href="#interfaces" data-astro-cid-mw7aashj> Interfaces </a> <ul data-astro-cid-mw7aashj> <li data-api-symbol="caseresult" data-astro-cid-mw7aashj> <a href="#caseresult" data-astro-cid-mw7aashj>CaseResult</a> </li><li data-api-symbol="diffrtdbrulesoptions" data-astro-cid-mw7aashj> <a href="#diffrtdbrulesoptions" data-astro-cid-mw7aashj>DiffRtdbRulesOptions</a> </li><li data-api-symbol="evaluatedruleinfo" data-astro-cid-mw7aashj> <a href="#evaluatedruleinfo" data-astro-cid-mw7aashj>EvaluatedRuleInfo</a> </li><li data-api-symbol="explanation" data-astro-cid-mw7aashj> <a href="#explanation" data-astro-cid-mw7aashj>Explanation</a> </li><li data-api-symbol="exprtraceentry" data-astro-cid-mw7aashj> <a href="#exprtraceentry" data-astro-cid-mw7aashj>ExprTraceEntry</a> </li><li data-api-symbol="firestorecase" data-astro-cid-mw7aashj> <a href="#firestorecase" data-astro-cid-mw7aashj>FirestoreCase</a> </li><li data-api-symbol="firestoreruleset" data-astro-cid-mw7aashj> <a href="#firestoreruleset" data-astro-cid-mw7aashj>FirestoreRuleset</a> </li><li data-api-symbol="listqueryproofreport" data-astro-cid-mw7aashj> <a href="#listqueryproofreport" data-astro-cid-mw7aashj>ListQueryProofReport</a> </li><li data-api-symbol="pathdef" data-astro-cid-mw7aashj> <a href="#pathdef" data-astro-cid-mw7aashj>PathDef</a> </li><li data-api-symbol="pathresolutionentry" data-astro-cid-mw7aashj> <a href="#pathresolutionentry" data-astro-cid-mw7aashj>PathResolutionEntry</a> </li><li data-api-symbol="pathresolutiontrace" data-astro-cid-mw7aashj> <a href="#pathresolutiontrace" data-astro-cid-mw7aashj>PathResolutionTrace</a> </li><li data-api-symbol="queryprooffailure" data-astro-cid-mw7aashj> <a href="#queryprooffailure" data-astro-cid-mw7aashj>QueryProofFailure</a> </li><li data-api-symbol="queryproofresidual" data-astro-cid-mw7aashj> <a href="#queryproofresidual" data-astro-cid-mw7aashj>QueryProofResidual</a> </li><li data-api-symbol="queryrepro" data-astro-cid-mw7aashj> <a href="#queryrepro" data-astro-cid-mw7aashj>QueryRepro</a> </li><li data-api-symbol="rtdbcase" data-astro-cid-mw7aashj> <a href="#rtdbcase" data-astro-cid-mw7aashj>RtdbCase</a> </li><li data-api-symbol="rtdbcasequery" data-astro-cid-mw7aashj> <a href="#rtdbcasequery" data-astro-cid-mw7aashj>RtdbCaseQuery</a> </li><li data-api-symbol="rtdbcaseresult" data-astro-cid-mw7aashj> <a href="#rtdbcaseresult" data-astro-cid-mw7aashj>RtdbCaseResult</a> </li><li data-api-symbol="rtdbcoverageoptions" data-astro-cid-mw7aashj> <a href="#rtdbcoverageoptions" data-astro-cid-mw7aashj>RtdbCoverageOptions</a> </li><li data-api-symbol="rtdbcoveragesummary" data-astro-cid-mw7aashj> <a href="#rtdbcoveragesummary" data-astro-cid-mw7aashj>RtdbCoverageSummary</a> </li><li data-api-symbol="rtdbexplanation" data-astro-cid-mw7aashj> <a href="#rtdbexplanation" data-astro-cid-mw7aashj>RtdbExplanation</a> </li><li data-api-symbol="rtdbfilecoverage" data-astro-cid-mw7aashj> <a href="#rtdbfilecoverage" data-astro-cid-mw7aashj>RtdbFileCoverage</a> </li><li data-api-symbol="rtdbfirebasejsonoptions" data-astro-cid-mw7aashj> <a href="#rtdbfirebasejsonoptions" data-astro-cid-mw7aashj>RtdbFirebaseJsonOptions</a> </li><li data-api-symbol="rtdbrulechange" data-astro-cid-mw7aashj> <a href="#rtdbrulechange" data-astro-cid-mw7aashj>RtdbRuleChange</a> </li><li data-api-symbol="rtdbrulecoverage" data-astro-cid-mw7aashj> <a href="#rtdbrulecoverage" data-astro-cid-mw7aashj>RtdbRuleCoverage</a> </li><li data-api-symbol="rtdbrulescheckresult" data-astro-cid-mw7aashj> <a href="#rtdbrulescheckresult" data-astro-cid-mw7aashj>RtdbRulesCheckResult</a> </li><li data-api-symbol="rtdbrulesconstructor()" data-astro-cid-mw7aashj> <a href="#rtdbrulesconstructor" data-astro-cid-mw7aashj>RtdbRulesConstructor()</a> </li><li data-api-symbol="rtdbrulesdefinition" data-astro-cid-mw7aashj> <a href="#rtdbrulesdefinition" data-astro-cid-mw7aashj>RtdbRulesDefinition</a> </li><li data-api-symbol="rtdbrulesdocument" data-astro-cid-mw7aashj> <a href="#rtdbrulesdocument" data-astro-cid-mw7aashj>RtdbRulesDocument</a> </li><li data-api-symbol="rtdbruleset" data-astro-cid-mw7aashj> <a href="#rtdbruleset" data-astro-cid-mw7aashj>RtdbRuleset</a> </li><li data-api-symbol="rtdbrulesfinding" data-astro-cid-mw7aashj> <a href="#rtdbrulesfinding" data-astro-cid-mw7aashj>RtdbRulesFinding</a> </li><li data-api-symbol="rtdbsimulationsummary" data-astro-cid-mw7aashj> <a href="#rtdbsimulationsummary" data-astro-cid-mw7aashj>RtdbSimulationSummary</a> </li><li data-api-symbol="ruleevaluation" data-astro-cid-mw7aashj> <a href="#ruleevaluation" data-astro-cid-mw7aashj>RuleEvaluation</a> </li><li data-api-symbol="ruleissue" data-astro-cid-mw7aashj> <a href="#ruleissue" data-astro-cid-mw7aashj>RuleIssue</a> </li><li data-api-symbol="rulesetcontext" data-astro-cid-mw7aashj> <a href="#rulesetcontext" data-astro-cid-mw7aashj>RulesetContext</a> </li><li data-api-symbol="rulesresourcelimit" data-astro-cid-mw7aashj> <a href="#rulesresourcelimit" data-astro-cid-mw7aashj>RulesResourceLimit</a> </li><li data-api-symbol="schemarulesresult" data-astro-cid-mw7aashj> <a href="#schemarulesresult" data-astro-cid-mw7aashj>SchemaRulesResult</a> </li><li data-api-symbol="shapeoptions" data-astro-cid-mw7aashj> <a href="#shapeoptions" data-astro-cid-mw7aashj>ShapeOptions</a> </li><li data-api-symbol="shaperesult" data-astro-cid-mw7aashj> <a href="#shaperesult" data-astro-cid-mw7aashj>ShapeResult</a> </li><li data-api-symbol="simulationsummary" data-astro-cid-mw7aashj> <a href="#simulationsummary" data-astro-cid-mw7aashj>SimulationSummary</a> </li> </ul> </section><section class="api-symbol-group" data-api-symbol-group data-astro-cid-mw7aashj> <a class="api-symbol-kind" href="#type-aliases" data-astro-cid-mw7aashj> Type Aliases </a> <ul data-astro-cid-mw7aashj> <li data-api-symbol="expr" data-astro-cid-mw7aashj> <a href="#expr" data-astro-cid-mw7aashj>Expr</a> </li><li data-api-symbol="fieldrule" data-astro-cid-mw7aashj> <a href="#fieldrule" data-astro-cid-mw7aashj>FieldRule</a> </li><li data-api-symbol="firestoremethod" data-astro-cid-mw7aashj> <a href="#firestoremethod" data-astro-cid-mw7aashj>FirestoreMethod</a> </li><li data-api-symbol="listquery" data-astro-cid-mw7aashj> <a href="#listquery" data-astro-cid-mw7aashj>ListQuery</a> </li><li data-api-symbol="listquerywhereconstraint" data-astro-cid-mw7aashj> <a href="#listquerywhereconstraint" data-astro-cid-mw7aashj>ListQueryWhereConstraint</a> </li><li data-api-symbol="rtdbcoveragekind" data-astro-cid-mw7aashj> <a href="#rtdbcoveragekind" data-astro-cid-mw7aashj>RtdbCoverageKind</a> </li><li data-api-symbol="rtdbcoveragestatus" data-astro-cid-mw7aashj> <a href="#rtdbcoveragestatus" data-astro-cid-mw7aashj>RtdbCoverageStatus</a> </li><li data-api-symbol="rtdbinstancesdata" data-astro-cid-mw7aashj> <a href="#rtdbinstancesdata" data-astro-cid-mw7aashj>RtdbInstancesData</a> </li><li data-api-symbol="rtdbruleevaluation" data-astro-cid-mw7aashj> <a href="#rtdbruleevaluation" data-astro-cid-mw7aashj>RtdbRuleEvaluation</a> </li><li data-api-symbol="rtdbrulekind" data-astro-cid-mw7aashj> <a href="#rtdbrulekind" data-astro-cid-mw7aashj>RtdbRuleKind</a> </li><li data-api-symbol="rtdbrulesfindingrule" data-astro-cid-mw7aashj> <a href="#rtdbrulesfindingrule" data-astro-cid-mw7aashj>RtdbRulesFindingRule</a> </li><li data-api-symbol="rtdbrulesjson" data-astro-cid-mw7aashj> <a href="#rtdbrulesjson" data-astro-cid-mw7aashj>RtdbRulesJson</a> </li><li data-api-symbol="rtdbrulessimulationauth" data-astro-cid-mw7aashj> <a href="#rtdbrulessimulationauth" data-astro-cid-mw7aashj>RtdbRulesSimulationAuth</a> </li><li data-api-symbol="rtdbrulessimulationinput" data-astro-cid-mw7aashj> <a href="#rtdbrulessimulationinput" data-astro-cid-mw7aashj>RtdbRulesSimulationInput</a> </li><li data-api-symbol="rtdbstdlib" data-astro-cid-mw7aashj> <a href="#rtdbstdlib" data-astro-cid-mw7aashj>RtdbStdlib</a> </li><li data-api-symbol="ruleissueorigin" data-astro-cid-mw7aashj> <a href="#ruleissueorigin" data-astro-cid-mw7aashj>RuleIssueOrigin</a> </li><li data-api-symbol="ruleissueseverity" data-astro-cid-mw7aashj> <a href="#ruleissueseverity" data-astro-cid-mw7aashj>RuleIssueSeverity</a> </li><li data-api-symbol="segment" data-astro-cid-mw7aashj> <a href="#segment" data-astro-cid-mw7aashj>Segment</a> </li> </ul> </section><section class="api-symbol-group" data-api-symbol-group data-astro-cid-mw7aashj> <a class="api-symbol-kind" href="#variables" data-astro-cid-mw7aashj> Variables </a> <ul data-astro-cid-mw7aashj> <li data-api-symbol="allow()" data-astro-cid-mw7aashj> <a href="#allow" data-astro-cid-mw7aashj>allow()</a> </li><li data-api-symbol="always()" data-astro-cid-mw7aashj> <a href="#always" data-astro-cid-mw7aashj>always()</a> </li><li data-api-symbol="auth_uid" data-astro-cid-mw7aashj> <a href="#auth_uid" data-astro-cid-mw7aashj>AUTH_UID</a> </li><li data-api-symbol="authenticated()" data-astro-cid-mw7aashj> <a href="#authenticated" data-astro-cid-mw7aashj>authenticated()</a> </li><li data-api-symbol="dataexists()" data-astro-cid-mw7aashj> <a href="#dataexists" data-astro-cid-mw7aashj>dataExists()</a> </li><li data-api-symbol="dataparentval()" data-astro-cid-mw7aashj> <a href="#dataparentval" data-astro-cid-mw7aashj>dataParentVal()</a> </li><li data-api-symbol="dataval()" data-astro-cid-mw7aashj> <a href="#dataval" data-astro-cid-mw7aashj>dataVal()</a> </li><li data-api-symbol="deny()" data-astro-cid-mw7aashj> <a href="#deny" data-astro-cid-mw7aashj>deny()</a> </li><li data-api-symbol="eq()" data-astro-cid-mw7aashj> <a href="#eq" data-astro-cid-mw7aashj>eq()</a> </li><li data-api-symbol="expr()" data-astro-cid-mw7aashj> <a href="#expr-1" data-astro-cid-mw7aashj>expr()</a> </li><li data-api-symbol="fieldenum()" data-astro-cid-mw7aashj> <a href="#fieldenum" data-astro-cid-mw7aashj>fieldEnum()</a> </li><li data-api-symbol="fieldisboolean()" data-astro-cid-mw7aashj> <a href="#fieldisboolean" data-astro-cid-mw7aashj>fieldIsBoolean()</a> </li><li data-api-symbol="fieldisnumber()" data-astro-cid-mw7aashj> <a href="#fieldisnumber" data-astro-cid-mw7aashj>fieldIsNumber()</a> </li><li data-api-symbol="fieldisstring()" data-astro-cid-mw7aashj> <a href="#fieldisstring" data-astro-cid-mw7aashj>fieldIsString()</a> </li><li data-api-symbol="fieldowneronly()" data-astro-cid-mw7aashj> <a href="#fieldowneronly" data-astro-cid-mw7aashj>fieldOwnerOnly()</a> </li><li data-api-symbol="gt()" data-astro-cid-mw7aashj> <a href="#gt" data-astro-cid-mw7aashj>gt()</a> </li><li data-api-symbol="haschild()" data-astro-cid-mw7aashj> <a href="#haschild" data-astro-cid-mw7aashj>hasChild()</a> </li><li data-api-symbol="haschildren()" data-astro-cid-mw7aashj> <a href="#haschildren" data-astro-cid-mw7aashj>hasChildren()</a> </li><li data-api-symbol="hasrole()" data-astro-cid-mw7aashj> <a href="#hasrole" data-astro-cid-mw7aashj>hasRole()</a> </li><li data-api-symbol="immutable()" data-astro-cid-mw7aashj> <a href="#immutable" data-astro-cid-mw7aashj>immutable()</a> </li><li data-api-symbol="immutableself()" data-astro-cid-mw7aashj> <a href="#immutableself" data-astro-cid-mw7aashj>immutableSelf()</a> </li><li data-api-symbol="isnew()" data-astro-cid-mw7aashj> <a href="#isnew" data-astro-cid-mw7aashj>isNew()</a> </li><li data-api-symbol="lte()" data-astro-cid-mw7aashj> <a href="#lte" data-astro-cid-mw7aashj>lte()</a> </li><li data-api-symbol="neq()" data-astro-cid-mw7aashj> <a href="#neq" data-astro-cid-mw7aashj>neq()</a> </li><li data-api-symbol="newdataexists()" data-astro-cid-mw7aashj> <a href="#newdataexists" data-astro-cid-mw7aashj>newDataExists()</a> </li><li data-api-symbol="newdatais()" data-astro-cid-mw7aashj> <a href="#newdatais" data-astro-cid-mw7aashj>newDataIs()</a> </li><li data-api-symbol="newdataparentexists()" data-astro-cid-mw7aashj> <a href="#newdataparentexists" data-astro-cid-mw7aashj>newDataParentExists()</a> </li><li data-api-symbol="newdataparentval()" data-astro-cid-mw7aashj> <a href="#newdataparentval" data-astro-cid-mw7aashj>newDataParentVal()</a> </li><li data-api-symbol="newdataval()" data-astro-cid-mw7aashj> <a href="#newdataval" data-astro-cid-mw7aashj>newDataVal()</a> </li><li data-api-symbol="ownerornew()" data-astro-cid-mw7aashj> <a href="#ownerornew" data-astro-cid-mw7aashj>ownerOrNew()</a> </li><li data-api-symbol="ownfield()" data-astro-cid-mw7aashj> <a href="#ownfield" data-astro-cid-mw7aashj>ownField()</a> </li><li data-api-symbol="pathowneronly()" data-astro-cid-mw7aashj> <a href="#pathowneronly" data-astro-cid-mw7aashj>pathOwnerOnly()</a> </li><li data-api-symbol="ref()" data-astro-cid-mw7aashj> <a href="#ref" data-astro-cid-mw7aashj>ref()</a> </li><li data-api-symbol="required()" data-astro-cid-mw7aashj> <a href="#required" data-astro-cid-mw7aashj>required()</a> </li><li data-api-symbol="rootequals()" data-astro-cid-mw7aashj> <a href="#rootequals" data-astro-cid-mw7aashj>rootEquals()</a> </li><li data-api-symbol="rootexists()" data-astro-cid-mw7aashj> <a href="#rootexists" data-astro-cid-mw7aashj>rootExists()</a> </li><li data-api-symbol="rtdbrules" data-astro-cid-mw7aashj> <a href="#rtdbrules" data-astro-cid-mw7aashj>rtdbRules</a> </li><li data-api-symbol="rtdbstdlib" data-astro-cid-mw7aashj> <a href="#rtdbstdlib-1" data-astro-cid-mw7aashj>rtdbStdlib</a> </li><li data-api-symbol="transition()" data-astro-cid-mw7aashj> <a href="#transition" data-astro-cid-mw7aashj>transition()</a> </li> </ul> </section><section class="api-symbol-group" data-api-symbol-group data-astro-cid-mw7aashj> <a class="api-symbol-kind" href="#functions" data-astro-cid-mw7aashj> Functions </a> <ul data-astro-cid-mw7aashj> <li data-api-symbol="all()" data-astro-cid-mw7aashj> <a href="#all" data-astro-cid-mw7aashj>all()</a> </li><li data-api-symbol="any()" data-astro-cid-mw7aashj> <a href="#any" data-astro-cid-mw7aashj>any()</a> </li><li data-api-symbol="assertcase()" data-astro-cid-mw7aashj> <a href="#assertcase" data-astro-cid-mw7aashj>assertCase()</a> </li><li data-api-symbol="bytes()" data-astro-cid-mw7aashj> <a href="#bytes" data-astro-cid-mw7aashj>bytes()</a> </li><li data-api-symbol="canonicalrtdbexpression()" data-astro-cid-mw7aashj> <a href="#canonicalrtdbexpression" data-astro-cid-mw7aashj>canonicalRtdbExpression()</a> </li><li data-api-symbol="definertdbrules()" data-astro-cid-mw7aashj> <a href="#definertdbrules" data-astro-cid-mw7aashj>defineRtdbRules()</a> </li><li data-api-symbol="diffrtdbrules()" data-astro-cid-mw7aashj> <a href="#diffrtdbrules" data-astro-cid-mw7aashj>diffRtdbRules()</a> </li><li data-api-symbol="duration()" data-astro-cid-mw7aashj> <a href="#duration" data-astro-cid-mw7aashj>duration()</a> </li><li data-api-symbol="explaincase()" data-astro-cid-mw7aashj> <a href="#explaincase" data-astro-cid-mw7aashj>explainCase()</a> </li><li data-api-symbol="firestorerules()" data-astro-cid-mw7aashj> <a href="#firestorerules" data-astro-cid-mw7aashj>firestoreRules()</a> </li><li data-api-symbol="flip()" data-astro-cid-mw7aashj> <a href="#flip" data-astro-cid-mw7aashj>flip()</a> </li><li data-api-symbol="ismember()" data-astro-cid-mw7aashj> <a href="#ismember" data-astro-cid-mw7aashj>isMember()</a> </li><li data-api-symbol="latlng()" data-astro-cid-mw7aashj> <a href="#latlng" data-astro-cid-mw7aashj>latlng()</a> </li><li data-api-symbol="lint()" data-astro-cid-mw7aashj> <a href="#lint-2" data-astro-cid-mw7aashj>lint()</a> </li><li data-api-symbol="lit()" data-astro-cid-mw7aashj> <a href="#lit" data-astro-cid-mw7aashj>lit()</a> </li><li data-api-symbol="not()" data-astro-cid-mw7aashj> <a href="#not" data-astro-cid-mw7aashj>not()</a> </li><li data-api-symbol="ownpath()" data-astro-cid-mw7aashj> <a href="#ownpath" data-astro-cid-mw7aashj>ownPath()</a> </li><li data-api-symbol="reference()" data-astro-cid-mw7aashj> <a href="#reference" data-astro-cid-mw7aashj>reference()</a> </li><li data-api-symbol="renderrtdbcoverage()" data-astro-cid-mw7aashj> <a href="#renderrtdbcoverage" data-astro-cid-mw7aashj>renderRtdbCoverage()</a> </li><li data-api-symbol="ruleset()" data-astro-cid-mw7aashj> <a href="#ruleset" data-astro-cid-mw7aashj>ruleset()</a> </li><li data-api-symbol="schemarules()" data-astro-cid-mw7aashj> <a href="#schemarules" data-astro-cid-mw7aashj>schemaRules()</a> </li><li data-api-symbol="servertimestamp()" data-astro-cid-mw7aashj> <a href="#servertimestamp" data-astro-cid-mw7aashj>serverTimestamp()</a> </li><li data-api-symbol="timestamp()" data-astro-cid-mw7aashj> <a href="#timestamp" data-astro-cid-mw7aashj>timestamp()</a> </li><li data-api-symbol="turnguard()" data-astro-cid-mw7aashj> <a href="#turnguard" data-astro-cid-mw7aashj>turnGuard()</a> </li><li data-api-symbol="vector()" data-astro-cid-mw7aashj> <a href="#vector" data-astro-cid-mw7aashj>vector()</a> </li><li data-api-symbol="wincheckhelper()" data-astro-cid-mw7aashj> <a href="#wincheckhelper" data-astro-cid-mw7aashj>winCheckHelper()</a> </li> </ul> </section> <p class="api-symbol-empty" data-api-symbol-empty hidden data-astro-cid-mw7aashj>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>