pyric 0.0.1 → 0.1.0-alpha.7

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 (786) hide show
  1. package/README.md +52 -1
  2. package/dist/app/index.d.ts +81 -0
  3. package/dist/app/index.d.ts.map +1 -0
  4. package/dist/app/index.js +78 -0
  5. package/dist/app/index.js.map +1 -0
  6. package/dist/auth/index.d.ts +346 -0
  7. package/dist/auth/index.d.ts.map +1 -0
  8. package/dist/auth/index.js +701 -0
  9. package/dist/auth/index.js.map +1 -0
  10. package/dist/auth/prod-backend.d.ts +39 -0
  11. package/dist/auth/prod-backend.d.ts.map +1 -0
  12. package/dist/auth/prod-backend.js +179 -0
  13. package/dist/auth/prod-backend.js.map +1 -0
  14. package/dist/auth/providers.d.ts +107 -0
  15. package/dist/auth/providers.d.ts.map +1 -0
  16. package/dist/auth/providers.js +138 -0
  17. package/dist/auth/providers.js.map +1 -0
  18. package/dist/auth/sandbox-backend.d.ts +769 -0
  19. package/dist/auth/sandbox-backend.d.ts.map +1 -0
  20. package/dist/auth/sandbox-backend.js +1598 -0
  21. package/dist/auth/sandbox-backend.js.map +1 -0
  22. package/dist/auth/target.d.ts +40 -0
  23. package/dist/auth/target.d.ts.map +1 -0
  24. package/dist/auth/target.js +28 -0
  25. package/dist/auth/target.js.map +1 -0
  26. package/dist/auth/types.d.ts +252 -0
  27. package/dist/auth/types.d.ts.map +1 -0
  28. package/dist/auth/types.js +26 -0
  29. package/dist/auth/types.js.map +1 -0
  30. package/dist/database/constraints/atoms.d.ts +29 -0
  31. package/dist/database/constraints/atoms.d.ts.map +1 -0
  32. package/dist/database/constraints/atoms.js +43 -0
  33. package/dist/database/constraints/atoms.js.map +1 -0
  34. package/dist/database/constraints/compose.d.ts +16 -0
  35. package/dist/database/constraints/compose.d.ts.map +1 -0
  36. package/dist/database/constraints/compose.js +15 -0
  37. package/dist/database/constraints/compose.js.map +1 -0
  38. package/dist/database/constraints/data.d.ts +30 -0
  39. package/dist/database/constraints/data.d.ts.map +1 -0
  40. package/dist/database/constraints/data.js +46 -0
  41. package/dist/database/constraints/data.js.map +1 -0
  42. package/dist/database/constraints/document.d.ts +42 -0
  43. package/dist/database/constraints/document.d.ts.map +1 -0
  44. package/dist/database/constraints/document.js +86 -0
  45. package/dist/database/constraints/document.js.map +1 -0
  46. package/dist/database/constraints/game.d.ts +30 -0
  47. package/dist/database/constraints/game.d.ts.map +1 -0
  48. package/dist/database/constraints/game.js +49 -0
  49. package/dist/database/constraints/game.js.map +1 -0
  50. package/dist/database/constraints/index.d.ts +12 -0
  51. package/dist/database/constraints/index.d.ts.map +1 -0
  52. package/dist/database/constraints/index.js +9 -0
  53. package/dist/database/constraints/index.js.map +1 -0
  54. package/dist/database/constraints/policies.d.ts +16 -0
  55. package/dist/database/constraints/policies.d.ts.map +1 -0
  56. package/dist/database/constraints/policies.js +17 -0
  57. package/dist/database/constraints/policies.js.map +1 -0
  58. package/dist/database/constraints/ruleset.d.ts +5 -0
  59. package/dist/database/constraints/ruleset.d.ts.map +1 -0
  60. package/dist/database/constraints/ruleset.js +132 -0
  61. package/dist/database/constraints/ruleset.js.map +1 -0
  62. package/dist/database/constraints/schema.d.ts +17 -0
  63. package/dist/database/constraints/schema.d.ts.map +1 -0
  64. package/dist/database/constraints/schema.js +74 -0
  65. package/dist/database/constraints/schema.js.map +1 -0
  66. package/dist/database/constraints/types.d.ts +22 -0
  67. package/dist/database/constraints/types.d.ts.map +1 -0
  68. package/dist/database/constraints/types.js +2 -0
  69. package/dist/database/constraints/types.js.map +1 -0
  70. package/dist/database/crawl/handler.d.ts +7 -0
  71. package/dist/database/crawl/handler.d.ts.map +1 -0
  72. package/dist/database/crawl/handler.js +91 -0
  73. package/dist/database/crawl/handler.js.map +1 -0
  74. package/dist/database/crawl/semaphore.d.ts +9 -0
  75. package/dist/database/crawl/semaphore.d.ts.map +1 -0
  76. package/dist/database/crawl/semaphore.js +27 -0
  77. package/dist/database/crawl/semaphore.js.map +1 -0
  78. package/dist/database/crawl/spec.d.ts +33 -0
  79. package/dist/database/crawl/spec.d.ts.map +1 -0
  80. package/dist/database/crawl/spec.js +12 -0
  81. package/dist/database/crawl/spec.js.map +1 -0
  82. package/dist/database/data/handler.d.ts +9 -0
  83. package/dist/database/data/handler.d.ts.map +1 -0
  84. package/dist/database/data/handler.js +96 -0
  85. package/dist/database/data/handler.js.map +1 -0
  86. package/dist/database/data/spec.d.ts +77 -0
  87. package/dist/database/data/spec.d.ts.map +1 -0
  88. package/dist/database/data/spec.js +17 -0
  89. package/dist/database/data/spec.js.map +1 -0
  90. package/dist/database/data/validated.d.ts +8 -0
  91. package/dist/database/data/validated.d.ts.map +1 -0
  92. package/dist/database/data/validated.js +99 -0
  93. package/dist/database/data/validated.js.map +1 -0
  94. package/dist/database/grammar/RtdbExpr.ohm +98 -0
  95. package/dist/database/grammar/RtdbExpr.ohm.generated.d.ts +2 -0
  96. package/dist/database/grammar/RtdbExpr.ohm.generated.d.ts.map +1 -0
  97. package/dist/database/grammar/RtdbExpr.ohm.generated.js +103 -0
  98. package/dist/database/grammar/RtdbExpr.ohm.generated.js.map +1 -0
  99. package/dist/database/grammar/RtdbExprParser.d.ts +5 -0
  100. package/dist/database/grammar/RtdbExprParser.d.ts.map +1 -0
  101. package/dist/database/grammar/RtdbExprParser.js +53 -0
  102. package/dist/database/grammar/RtdbExprParser.js.map +1 -0
  103. package/dist/database/grammar/linter.d.ts +3 -0
  104. package/dist/database/grammar/linter.d.ts.map +1 -0
  105. package/dist/database/grammar/linter.js +66 -0
  106. package/dist/database/grammar/linter.js.map +1 -0
  107. package/dist/database/grammar/simulator.d.ts +31 -0
  108. package/dist/database/grammar/simulator.d.ts.map +1 -0
  109. package/dist/database/grammar/simulator.js +255 -0
  110. package/dist/database/grammar/simulator.js.map +1 -0
  111. package/dist/database/grammar/validator.d.ts +3 -0
  112. package/dist/database/grammar/validator.d.ts.map +1 -0
  113. package/dist/database/grammar/validator.js +84 -0
  114. package/dist/database/grammar/validator.js.map +1 -0
  115. package/dist/database/host.d.ts +50 -0
  116. package/dist/database/host.d.ts.map +1 -0
  117. package/dist/database/host.js +41 -0
  118. package/dist/database/host.js.map +1 -0
  119. package/dist/database/index.d.ts +40 -0
  120. package/dist/database/index.d.ts.map +1 -0
  121. package/dist/database/index.js +47 -0
  122. package/dist/database/index.js.map +1 -0
  123. package/dist/database/initialize-from-app.d.ts +28 -0
  124. package/dist/database/initialize-from-app.d.ts.map +1 -0
  125. package/dist/database/initialize-from-app.js +23 -0
  126. package/dist/database/initialize-from-app.js.map +1 -0
  127. package/dist/database/ir/handler.d.ts +6 -0
  128. package/dist/database/ir/handler.d.ts.map +1 -0
  129. package/dist/database/ir/handler.js +52 -0
  130. package/dist/database/ir/handler.js.map +1 -0
  131. package/dist/database/ir/spec.d.ts +25 -0
  132. package/dist/database/ir/spec.d.ts.map +1 -0
  133. package/dist/database/ir/spec.js +11 -0
  134. package/dist/database/ir/spec.js.map +1 -0
  135. package/dist/database/mapper.d.ts +9 -0
  136. package/dist/database/mapper.d.ts.map +1 -0
  137. package/dist/database/mapper.js +115 -0
  138. package/dist/database/mapper.js.map +1 -0
  139. package/dist/database/modular.d.ts +604 -0
  140. package/dist/database/modular.d.ts.map +1 -0
  141. package/dist/database/modular.js +1226 -0
  142. package/dist/database/modular.js.map +1 -0
  143. package/dist/database/replay.d.ts +33 -0
  144. package/dist/database/replay.d.ts.map +1 -0
  145. package/dist/database/replay.js +124 -0
  146. package/dist/database/replay.js.map +1 -0
  147. package/dist/database/resolver.d.ts +4 -0
  148. package/dist/database/resolver.d.ts.map +1 -0
  149. package/dist/database/resolver.js +66 -0
  150. package/dist/database/resolver.js.map +1 -0
  151. package/dist/database/sandbox/backend.d.ts +403 -0
  152. package/dist/database/sandbox/backend.d.ts.map +1 -0
  153. package/dist/database/sandbox/backend.js +1467 -0
  154. package/dist/database/sandbox/backend.js.map +1 -0
  155. package/dist/database/sandbox/data-tree.d.ts +123 -0
  156. package/dist/database/sandbox/data-tree.d.ts.map +1 -0
  157. package/dist/database/sandbox/data-tree.js +310 -0
  158. package/dist/database/sandbox/data-tree.js.map +1 -0
  159. package/dist/database/sandbox/normalize.d.ts +77 -0
  160. package/dist/database/sandbox/normalize.d.ts.map +1 -0
  161. package/dist/database/sandbox/normalize.js +165 -0
  162. package/dist/database/sandbox/normalize.js.map +1 -0
  163. package/dist/database/sandbox/push-id.d.ts +32 -0
  164. package/dist/database/sandbox/push-id.d.ts.map +1 -0
  165. package/dist/database/sandbox/push-id.js +82 -0
  166. package/dist/database/sandbox/push-id.js.map +1 -0
  167. package/dist/database/sandbox/query.d.ts +175 -0
  168. package/dist/database/sandbox/query.d.ts.map +1 -0
  169. package/dist/database/sandbox/query.js +269 -0
  170. package/dist/database/sandbox/query.js.map +1 -0
  171. package/dist/database/sandbox/rules-eval.d.ts +69 -0
  172. package/dist/database/sandbox/rules-eval.d.ts.map +1 -0
  173. package/dist/database/sandbox/rules-eval.js +124 -0
  174. package/dist/database/sandbox/rules-eval.js.map +1 -0
  175. package/dist/database/sandbox/sentinels.d.ts +71 -0
  176. package/dist/database/sandbox/sentinels.d.ts.map +1 -0
  177. package/dist/database/sandbox/sentinels.js +92 -0
  178. package/dist/database/sandbox/sentinels.js.map +1 -0
  179. package/dist/database/simulation/handler.d.ts +6 -0
  180. package/dist/database/simulation/handler.d.ts.map +1 -0
  181. package/dist/database/simulation/handler.js +236 -0
  182. package/dist/database/simulation/handler.js.map +1 -0
  183. package/dist/database/simulation/spec.d.ts +69 -0
  184. package/dist/database/simulation/spec.d.ts.map +1 -0
  185. package/dist/database/simulation/spec.js +25 -0
  186. package/dist/database/simulation/spec.js.map +1 -0
  187. package/dist/database/tools.d.ts +22 -0
  188. package/dist/database/tools.d.ts.map +1 -0
  189. package/dist/database/tools.js +272 -0
  190. package/dist/database/tools.js.map +1 -0
  191. package/dist/database/types.d.ts +210 -0
  192. package/dist/database/types.d.ts.map +1 -0
  193. package/dist/database/types.js +26 -0
  194. package/dist/database/types.js.map +1 -0
  195. package/dist/database/write/handler.d.ts +7 -0
  196. package/dist/database/write/handler.d.ts.map +1 -0
  197. package/dist/database/write/handler.js +42 -0
  198. package/dist/database/write/handler.js.map +1 -0
  199. package/dist/database/write/spec.d.ts +18 -0
  200. package/dist/database/write/spec.d.ts.map +1 -0
  201. package/dist/database/write/spec.js +7 -0
  202. package/dist/database/write/spec.js.map +1 -0
  203. package/dist/firestore/index.d.ts +533 -0
  204. package/dist/firestore/index.d.ts.map +1 -0
  205. package/dist/firestore/index.js +1536 -0
  206. package/dist/firestore/index.js.map +1 -0
  207. package/dist/firestore/tools.d.ts +67 -0
  208. package/dist/firestore/tools.d.ts.map +1 -0
  209. package/dist/firestore/tools.js +318 -0
  210. package/dist/firestore/tools.js.map +1 -0
  211. package/dist/firestore-values/index.d.ts +63 -0
  212. package/dist/firestore-values/index.d.ts.map +1 -0
  213. package/dist/firestore-values/index.js +148 -0
  214. package/dist/firestore-values/index.js.map +1 -0
  215. package/dist/project-scope.d.ts +5 -0
  216. package/dist/project-scope.d.ts.map +1 -0
  217. package/dist/project-scope.js +2 -0
  218. package/dist/project-scope.js.map +1 -0
  219. package/dist/rules/extract.d.ts +28 -0
  220. package/dist/rules/extract.d.ts.map +1 -0
  221. package/dist/rules/extract.js +25 -0
  222. package/dist/rules/extract.js.map +1 -0
  223. package/dist/rules/generators/assembler.d.ts +19 -0
  224. package/dist/rules/generators/assembler.d.ts.map +1 -0
  225. package/dist/rules/generators/assembler.js +292 -0
  226. package/dist/rules/generators/assembler.js.map +1 -0
  227. package/dist/rules/generators/expressions.d.ts +52 -0
  228. package/dist/rules/generators/expressions.d.ts.map +1 -0
  229. package/dist/rules/generators/expressions.js +117 -0
  230. package/dist/rules/generators/expressions.js.map +1 -0
  231. package/dist/rules/generators/grid.d.ts +22 -0
  232. package/dist/rules/generators/grid.d.ts.map +1 -0
  233. package/dist/rules/generators/grid.js +52 -0
  234. package/dist/rules/generators/grid.js.map +1 -0
  235. package/dist/rules/grammar/FirestoreAST.d.ts +129 -0
  236. package/dist/rules/grammar/FirestoreAST.d.ts.map +1 -0
  237. package/dist/rules/grammar/FirestoreAST.js +3 -0
  238. package/dist/rules/grammar/FirestoreAST.js.map +1 -0
  239. package/dist/rules/grammar/FirestoreAssembler.d.ts +5 -0
  240. package/dist/rules/grammar/FirestoreAssembler.d.ts.map +1 -0
  241. package/dist/rules/grammar/FirestoreAssembler.js +158 -0
  242. package/dist/rules/grammar/FirestoreAssembler.js.map +1 -0
  243. package/dist/rules/grammar/FirestoreParser.d.ts +46 -0
  244. package/dist/rules/grammar/FirestoreParser.d.ts.map +1 -0
  245. package/dist/rules/grammar/FirestoreParser.js +409 -0
  246. package/dist/rules/grammar/FirestoreParser.js.map +1 -0
  247. package/dist/rules/grammar/FirestoreRules.ohm +229 -0
  248. package/dist/rules/grammar/FirestoreRules.ohm.generated.d.ts +2 -0
  249. package/dist/rules/grammar/FirestoreRules.ohm.generated.d.ts.map +1 -0
  250. package/dist/rules/grammar/FirestoreRules.ohm.generated.js +234 -0
  251. package/dist/rules/grammar/FirestoreRules.ohm.generated.js.map +1 -0
  252. package/dist/rules/grammar/FirestoreValidator.d.ts +10 -0
  253. package/dist/rules/grammar/FirestoreValidator.d.ts.map +1 -0
  254. package/dist/rules/grammar/FirestoreValidator.js +482 -0
  255. package/dist/rules/grammar/FirestoreValidator.js.map +1 -0
  256. package/dist/rules/index.d.ts +67 -0
  257. package/dist/rules/index.d.ts.map +1 -0
  258. package/dist/rules/index.js +80 -0
  259. package/dist/rules/index.js.map +1 -0
  260. package/dist/rules/indexes/extract/annotation-collect.d.ts +42 -0
  261. package/dist/rules/indexes/extract/annotation-collect.d.ts.map +1 -0
  262. package/dist/rules/indexes/extract/annotation-collect.js +69 -0
  263. package/dist/rules/indexes/extract/annotation-collect.js.map +1 -0
  264. package/dist/rules/indexes/extract/annotations.d.ts +50 -0
  265. package/dist/rules/indexes/extract/annotations.d.ts.map +1 -0
  266. package/dist/rules/indexes/extract/annotations.js +144 -0
  267. package/dist/rules/indexes/extract/annotations.js.map +1 -0
  268. package/dist/rules/indexes/extract/ast.d.ts +54 -0
  269. package/dist/rules/indexes/extract/ast.d.ts.map +1 -0
  270. package/dist/rules/indexes/extract/ast.js +119 -0
  271. package/dist/rules/indexes/extract/ast.js.map +1 -0
  272. package/dist/rules/indexes/extract/classify.d.ts +41 -0
  273. package/dist/rules/indexes/extract/classify.d.ts.map +1 -0
  274. package/dist/rules/indexes/extract/classify.js +138 -0
  275. package/dist/rules/indexes/extract/classify.js.map +1 -0
  276. package/dist/rules/indexes/extract/composite.d.ts +38 -0
  277. package/dist/rules/indexes/extract/composite.d.ts.map +1 -0
  278. package/dist/rules/indexes/extract/composite.js +85 -0
  279. package/dist/rules/indexes/extract/composite.js.map +1 -0
  280. package/dist/rules/indexes/extract/dataflow.d.ts +45 -0
  281. package/dist/rules/indexes/extract/dataflow.d.ts.map +1 -0
  282. package/dist/rules/indexes/extract/dataflow.js +200 -0
  283. package/dist/rules/indexes/extract/dataflow.js.map +1 -0
  284. package/dist/rules/indexes/extract/enumerate.d.ts +41 -0
  285. package/dist/rules/indexes/extract/enumerate.d.ts.map +1 -0
  286. package/dist/rules/indexes/extract/enumerate.js +163 -0
  287. package/dist/rules/indexes/extract/enumerate.js.map +1 -0
  288. package/dist/rules/indexes/extract/extractor.d.ts +3 -0
  289. package/dist/rules/indexes/extract/extractor.d.ts.map +1 -0
  290. package/dist/rules/indexes/extract/extractor.js +274 -0
  291. package/dist/rules/indexes/extract/extractor.js.map +1 -0
  292. package/dist/rules/indexes/extract/types.d.ts +211 -0
  293. package/dist/rules/indexes/extract/types.d.ts.map +1 -0
  294. package/dist/rules/indexes/extract/types.js +14 -0
  295. package/dist/rules/indexes/extract/types.js.map +1 -0
  296. package/dist/rules/indexes/extractHandler.d.ts +16 -0
  297. package/dist/rules/indexes/extractHandler.d.ts.map +1 -0
  298. package/dist/rules/indexes/extractHandler.js +100 -0
  299. package/dist/rules/indexes/extractHandler.js.map +1 -0
  300. package/dist/rules/indexes/extractTool.d.ts +15 -0
  301. package/dist/rules/indexes/extractTool.d.ts.map +1 -0
  302. package/dist/rules/indexes/extractTool.js +55 -0
  303. package/dist/rules/indexes/extractTool.js.map +1 -0
  304. package/dist/rules/indexes/types.d.ts +71 -0
  305. package/dist/rules/indexes/types.d.ts.map +1 -0
  306. package/dist/rules/indexes/types.js +15 -0
  307. package/dist/rules/indexes/types.js.map +1 -0
  308. package/dist/rules/inspect/handler.d.ts +6 -0
  309. package/dist/rules/inspect/handler.d.ts.map +1 -0
  310. package/dist/rules/inspect/handler.js +144 -0
  311. package/dist/rules/inspect/handler.js.map +1 -0
  312. package/dist/rules/inspect/spec.d.ts +37 -0
  313. package/dist/rules/inspect/spec.d.ts.map +1 -0
  314. package/dist/rules/inspect/spec.js +2 -0
  315. package/dist/rules/inspect/spec.js.map +1 -0
  316. package/dist/rules/inspect/tools.d.ts +21 -0
  317. package/dist/rules/inspect/tools.d.ts.map +1 -0
  318. package/dist/rules/inspect/tools.js +21 -0
  319. package/dist/rules/inspect/tools.js.map +1 -0
  320. package/dist/rules/linter/ast-utils.d.ts +97 -0
  321. package/dist/rules/linter/ast-utils.d.ts.map +1 -0
  322. package/dist/rules/linter/ast-utils.js +491 -0
  323. package/dist/rules/linter/ast-utils.js.map +1 -0
  324. package/dist/rules/linter/hallucinations.d.ts +34 -0
  325. package/dist/rules/linter/hallucinations.d.ts.map +1 -0
  326. package/dist/rules/linter/hallucinations.js +334 -0
  327. package/dist/rules/linter/hallucinations.js.map +1 -0
  328. package/dist/rules/linter/linter.d.ts +84 -0
  329. package/dist/rules/linter/linter.d.ts.map +1 -0
  330. package/dist/rules/linter/linter.js +784 -0
  331. package/dist/rules/linter/linter.js.map +1 -0
  332. package/dist/rules/modules/resolver-browser.d.ts +41 -0
  333. package/dist/rules/modules/resolver-browser.d.ts.map +1 -0
  334. package/dist/rules/modules/resolver-browser.js +63 -0
  335. package/dist/rules/modules/resolver-browser.js.map +1 -0
  336. package/dist/rules/modules/resolver-core.d.ts +51 -0
  337. package/dist/rules/modules/resolver-core.d.ts.map +1 -0
  338. package/dist/rules/modules/resolver-core.js +338 -0
  339. package/dist/rules/modules/resolver-core.js.map +1 -0
  340. package/dist/rules/modules/resolver.d.ts +17 -0
  341. package/dist/rules/modules/resolver.d.ts.map +1 -0
  342. package/dist/rules/modules/resolver.js +49 -0
  343. package/dist/rules/modules/resolver.js.map +1 -0
  344. package/dist/rules/modules/stdlib/atomic.rules +52 -0
  345. package/dist/rules/modules/stdlib/atomic.test.json +152 -0
  346. package/dist/rules/modules/stdlib/auth.rules +7 -0
  347. package/dist/rules/modules/stdlib/auth.test.json +53 -0
  348. package/dist/rules/modules/stdlib/content.rules +50 -0
  349. package/dist/rules/modules/stdlib/content.test.json +238 -0
  350. package/dist/rules/modules/stdlib/counters.rules +41 -0
  351. package/dist/rules/modules/stdlib/counters.test.json +254 -0
  352. package/dist/rules/modules/stdlib/geometry.rules +43 -0
  353. package/dist/rules/modules/stdlib/geometry.test.json +200 -0
  354. package/dist/rules/modules/stdlib/joining.rules +49 -0
  355. package/dist/rules/modules/stdlib/joining.test.json +287 -0
  356. package/dist/rules/modules/stdlib/lifecycle.rules +51 -0
  357. package/dist/rules/modules/stdlib/lifecycle.test.json +288 -0
  358. package/dist/rules/modules/stdlib/lobby.rules +44 -0
  359. package/dist/rules/modules/stdlib/lobby.test.json +32 -0
  360. package/dist/rules/modules/stdlib/membership.rules +40 -0
  361. package/dist/rules/modules/stdlib/membership.test.json +107 -0
  362. package/dist/rules/modules/stdlib/spaces.rules +46 -0
  363. package/dist/rules/modules/stdlib/spaces.test.json +392 -0
  364. package/dist/rules/modules/stdlib/state.rules +28 -0
  365. package/dist/rules/modules/stdlib/state.test.json +55 -0
  366. package/dist/rules/modules/stdlib/timing.rules +20 -0
  367. package/dist/rules/modules/stdlib/timing.test.json +106 -0
  368. package/dist/rules/modules/stdlib/transitions.rules +34 -0
  369. package/dist/rules/modules/stdlib/transitions.test.json +86 -0
  370. package/dist/rules/modules/stdlib/turns.rules +27 -0
  371. package/dist/rules/modules/stdlib/turns.test.json +64 -0
  372. package/dist/rules/modules/stdlib/validation.rules +31 -0
  373. package/dist/rules/modules/stdlib/validation.test.json +184 -0
  374. package/dist/rules/modules/stdlib-content.d.ts +11 -0
  375. package/dist/rules/modules/stdlib-content.d.ts.map +1 -0
  376. package/dist/rules/modules/stdlib-content.js +590 -0
  377. package/dist/rules/modules/stdlib-content.js.map +1 -0
  378. package/dist/rules/node.d.ts +17 -0
  379. package/dist/rules/node.d.ts.map +1 -0
  380. package/dist/rules/node.js +21 -0
  381. package/dist/rules/node.js.map +1 -0
  382. package/dist/rules/rtdb.d.ts +28 -0
  383. package/dist/rules/rtdb.d.ts.map +1 -0
  384. package/dist/rules/rtdb.js +15 -0
  385. package/dist/rules/rtdb.js.map +1 -0
  386. package/dist/rules/simulator/evaluator.d.ts +179 -0
  387. package/dist/rules/simulator/evaluator.d.ts.map +1 -0
  388. package/dist/rules/simulator/evaluator.js +1221 -0
  389. package/dist/rules/simulator/evaluator.js.map +1 -0
  390. package/dist/rules/simulator/expression/eval-errors.d.ts +86 -0
  391. package/dist/rules/simulator/expression/eval-errors.d.ts.map +1 -0
  392. package/dist/rules/simulator/expression/eval-errors.js +68 -0
  393. package/dist/rules/simulator/expression/eval-errors.js.map +1 -0
  394. package/dist/rules/simulator/expression/evaluator.d.ts +43 -0
  395. package/dist/rules/simulator/expression/evaluator.d.ts.map +1 -0
  396. package/dist/rules/simulator/expression/evaluator.js +298 -0
  397. package/dist/rules/simulator/expression/evaluator.js.map +1 -0
  398. package/dist/rules/simulator/expression/lexer.d.ts +36 -0
  399. package/dist/rules/simulator/expression/lexer.d.ts.map +1 -0
  400. package/dist/rules/simulator/expression/lexer.js +318 -0
  401. package/dist/rules/simulator/expression/lexer.js.map +1 -0
  402. package/dist/rules/simulator/expression/parser.d.ts +39 -0
  403. package/dist/rules/simulator/expression/parser.d.ts.map +1 -0
  404. package/dist/rules/simulator/expression/parser.js +329 -0
  405. package/dist/rules/simulator/expression/parser.js.map +1 -0
  406. package/dist/rules/simulator/expression/types.d.ts +137 -0
  407. package/dist/rules/simulator/expression/types.d.ts.map +1 -0
  408. package/dist/rules/simulator/expression/types.js +90 -0
  409. package/dist/rules/simulator/expression/types.js.map +1 -0
  410. package/dist/rules/simulator/expression/walk-data.d.ts +52 -0
  411. package/dist/rules/simulator/expression/walk-data.d.ts.map +1 -0
  412. package/dist/rules/simulator/expression/walk-data.js +167 -0
  413. package/dist/rules/simulator/expression/walk-data.js.map +1 -0
  414. package/dist/rules/simulator/firestore-set.d.ts +25 -0
  415. package/dist/rules/simulator/firestore-set.d.ts.map +1 -0
  416. package/dist/rules/simulator/firestore-set.js +89 -0
  417. package/dist/rules/simulator/firestore-set.js.map +1 -0
  418. package/dist/rules/simulator/handler.d.ts +36 -0
  419. package/dist/rules/simulator/handler.d.ts.map +1 -0
  420. package/dist/rules/simulator/handler.js +583 -0
  421. package/dist/rules/simulator/handler.js.map +1 -0
  422. package/dist/rules/simulator/mapdiff.d.ts +29 -0
  423. package/dist/rules/simulator/mapdiff.d.ts.map +1 -0
  424. package/dist/rules/simulator/mapdiff.js +72 -0
  425. package/dist/rules/simulator/mapdiff.js.map +1 -0
  426. package/dist/rules/simulator/project-after-state.d.ts +33 -0
  427. package/dist/rules/simulator/project-after-state.d.ts.map +1 -0
  428. package/dist/rules/simulator/project-after-state.js +88 -0
  429. package/dist/rules/simulator/project-after-state.js.map +1 -0
  430. package/dist/rules/simulator/query-proof.d.ts +80 -0
  431. package/dist/rules/simulator/query-proof.d.ts.map +1 -0
  432. package/dist/rules/simulator/query-proof.js +142 -0
  433. package/dist/rules/simulator/query-proof.js.map +1 -0
  434. package/dist/rules/simulator/value-equality.d.ts +8 -0
  435. package/dist/rules/simulator/value-equality.d.ts.map +1 -0
  436. package/dist/rules/simulator/value-equality.js +40 -0
  437. package/dist/rules/simulator/value-equality.js.map +1 -0
  438. package/dist/rules/simulator/wrappers/base.d.ts +129 -0
  439. package/dist/rules/simulator/wrappers/base.d.ts.map +1 -0
  440. package/dist/rules/simulator/wrappers/base.js +90 -0
  441. package/dist/rules/simulator/wrappers/base.js.map +1 -0
  442. package/dist/rules/simulator/wrappers/bytes.d.ts +45 -0
  443. package/dist/rules/simulator/wrappers/bytes.d.ts.map +1 -0
  444. package/dist/rules/simulator/wrappers/bytes.js +130 -0
  445. package/dist/rules/simulator/wrappers/bytes.js.map +1 -0
  446. package/dist/rules/simulator/wrappers/duration.d.ts +76 -0
  447. package/dist/rules/simulator/wrappers/duration.d.ts.map +1 -0
  448. package/dist/rules/simulator/wrappers/duration.js +176 -0
  449. package/dist/rules/simulator/wrappers/duration.js.map +1 -0
  450. package/dist/rules/simulator/wrappers/float.d.ts +52 -0
  451. package/dist/rules/simulator/wrappers/float.d.ts.map +1 -0
  452. package/dist/rules/simulator/wrappers/float.js +88 -0
  453. package/dist/rules/simulator/wrappers/float.js.map +1 -0
  454. package/dist/rules/simulator/wrappers/latlng.d.ts +40 -0
  455. package/dist/rules/simulator/wrappers/latlng.d.ts.map +1 -0
  456. package/dist/rules/simulator/wrappers/latlng.js +100 -0
  457. package/dist/rules/simulator/wrappers/latlng.js.map +1 -0
  458. package/dist/rules/simulator/wrappers/path.d.ts +75 -0
  459. package/dist/rules/simulator/wrappers/path.d.ts.map +1 -0
  460. package/dist/rules/simulator/wrappers/path.js +158 -0
  461. package/dist/rules/simulator/wrappers/path.js.map +1 -0
  462. package/dist/rules/simulator/wrappers/reference.d.ts +82 -0
  463. package/dist/rules/simulator/wrappers/reference.d.ts.map +1 -0
  464. package/dist/rules/simulator/wrappers/reference.js +145 -0
  465. package/dist/rules/simulator/wrappers/reference.js.map +1 -0
  466. package/dist/rules/simulator/wrappers/timestamp.d.ts +86 -0
  467. package/dist/rules/simulator/wrappers/timestamp.d.ts.map +1 -0
  468. package/dist/rules/simulator/wrappers/timestamp.js +207 -0
  469. package/dist/rules/simulator/wrappers/timestamp.js.map +1 -0
  470. package/dist/rules/simulator/wrappers/vector.d.ts +43 -0
  471. package/dist/rules/simulator/wrappers/vector.d.ts.map +1 -0
  472. package/dist/rules/simulator/wrappers/vector.js +80 -0
  473. package/dist/rules/simulator/wrappers/vector.js.map +1 -0
  474. package/dist/rules/simulator-tools-impl.d.ts +64 -0
  475. package/dist/rules/simulator-tools-impl.d.ts.map +1 -0
  476. package/dist/rules/simulator-tools-impl.js +462 -0
  477. package/dist/rules/simulator-tools-impl.js.map +1 -0
  478. package/dist/rules/simulator.d.ts +20 -0
  479. package/dist/rules/simulator.d.ts.map +1 -0
  480. package/dist/rules/simulator.js +24 -0
  481. package/dist/rules/simulator.js.map +1 -0
  482. package/dist/rules/stdlib-modules.d.ts +73 -0
  483. package/dist/rules/stdlib-modules.d.ts.map +1 -0
  484. package/dist/rules/stdlib-modules.js +849 -0
  485. package/dist/rules/stdlib-modules.js.map +1 -0
  486. package/dist/rules/stdlib-tools.d.ts +19 -0
  487. package/dist/rules/stdlib-tools.d.ts.map +1 -0
  488. package/dist/rules/stdlib-tools.js +164 -0
  489. package/dist/rules/stdlib-tools.js.map +1 -0
  490. package/dist/rules/test/handler.d.ts +9 -0
  491. package/dist/rules/test/handler.d.ts.map +1 -0
  492. package/dist/rules/test/handler.js +124 -0
  493. package/dist/rules/test/handler.js.map +1 -0
  494. package/dist/rules/test/spec.d.ts +517 -0
  495. package/dist/rules/test/spec.d.ts.map +1 -0
  496. package/dist/rules/test/spec.js +227 -0
  497. package/dist/rules/test/spec.js.map +1 -0
  498. package/dist/rules/tools.d.ts +41 -0
  499. package/dist/rules/tools.d.ts.map +1 -0
  500. package/dist/rules/tools.js +124 -0
  501. package/dist/rules/tools.js.map +1 -0
  502. package/dist/rules/write/handler.d.ts +6 -0
  503. package/dist/rules/write/handler.d.ts.map +1 -0
  504. package/dist/rules/write/handler.js +126 -0
  505. package/dist/rules/write/handler.js.map +1 -0
  506. package/dist/rules/write/spec.d.ts +28 -0
  507. package/dist/rules/write/spec.d.ts.map +1 -0
  508. package/dist/rules/write/spec.js +2 -0
  509. package/dist/rules/write/spec.js.map +1 -0
  510. package/dist/sandbox/admin-compat.d.ts +20 -0
  511. package/dist/sandbox/admin-compat.d.ts.map +1 -0
  512. package/dist/sandbox/admin-compat.js +19 -0
  513. package/dist/sandbox/admin-compat.js.map +1 -0
  514. package/dist/sandbox/admin-firestore/error-translation.d.ts +86 -0
  515. package/dist/sandbox/admin-firestore/error-translation.d.ts.map +1 -0
  516. package/dist/sandbox/admin-firestore/error-translation.js +204 -0
  517. package/dist/sandbox/admin-firestore/error-translation.js.map +1 -0
  518. package/dist/sandbox/admin-firestore/index.d.ts +169 -0
  519. package/dist/sandbox/admin-firestore/index.d.ts.map +1 -0
  520. package/dist/sandbox/admin-firestore/index.js +456 -0
  521. package/dist/sandbox/admin-firestore/index.js.map +1 -0
  522. package/dist/sandbox/admin-firestore/remote.d.ts +97 -0
  523. package/dist/sandbox/admin-firestore/remote.d.ts.map +1 -0
  524. package/dist/sandbox/admin-firestore/remote.js +735 -0
  525. package/dist/sandbox/admin-firestore/remote.js.map +1 -0
  526. package/dist/sandbox/branches/index.d.ts +141 -0
  527. package/dist/sandbox/branches/index.d.ts.map +1 -0
  528. package/dist/sandbox/branches/index.js +327 -0
  529. package/dist/sandbox/branches/index.js.map +1 -0
  530. package/dist/sandbox/firestore/admin-compat/batch.d.ts +34 -0
  531. package/dist/sandbox/firestore/admin-compat/batch.d.ts.map +1 -0
  532. package/dist/sandbox/firestore/admin-compat/batch.js +73 -0
  533. package/dist/sandbox/firestore/admin-compat/batch.js.map +1 -0
  534. package/dist/sandbox/firestore/admin-compat/doc-ref.d.ts +38 -0
  535. package/dist/sandbox/firestore/admin-compat/doc-ref.d.ts.map +1 -0
  536. package/dist/sandbox/firestore/admin-compat/doc-ref.js +154 -0
  537. package/dist/sandbox/firestore/admin-compat/doc-ref.js.map +1 -0
  538. package/dist/sandbox/firestore/admin-compat/firestore.d.ts +45 -0
  539. package/dist/sandbox/firestore/admin-compat/firestore.d.ts.map +1 -0
  540. package/dist/sandbox/firestore/admin-compat/firestore.js +114 -0
  541. package/dist/sandbox/firestore/admin-compat/firestore.js.map +1 -0
  542. package/dist/sandbox/firestore/admin-compat/index.d.ts +45 -0
  543. package/dist/sandbox/firestore/admin-compat/index.d.ts.map +1 -0
  544. package/dist/sandbox/firestore/admin-compat/index.js +27 -0
  545. package/dist/sandbox/firestore/admin-compat/index.js.map +1 -0
  546. package/dist/sandbox/firestore/admin-compat/paths.d.ts +37 -0
  547. package/dist/sandbox/firestore/admin-compat/paths.d.ts.map +1 -0
  548. package/dist/sandbox/firestore/admin-compat/paths.js +49 -0
  549. package/dist/sandbox/firestore/admin-compat/paths.js.map +1 -0
  550. package/dist/sandbox/firestore/admin-compat/query.d.ts +261 -0
  551. package/dist/sandbox/firestore/admin-compat/query.d.ts.map +1 -0
  552. package/dist/sandbox/firestore/admin-compat/query.js +704 -0
  553. package/dist/sandbox/firestore/admin-compat/query.js.map +1 -0
  554. package/dist/sandbox/firestore/admin-compat/read-translation.d.ts +8 -0
  555. package/dist/sandbox/firestore/admin-compat/read-translation.d.ts.map +1 -0
  556. package/dist/sandbox/firestore/admin-compat/read-translation.js +59 -0
  557. package/dist/sandbox/firestore/admin-compat/read-translation.js.map +1 -0
  558. package/dist/sandbox/firestore/admin-compat/snapshots.d.ts +39 -0
  559. package/dist/sandbox/firestore/admin-compat/snapshots.d.ts.map +1 -0
  560. package/dist/sandbox/firestore/admin-compat/snapshots.js +50 -0
  561. package/dist/sandbox/firestore/admin-compat/snapshots.js.map +1 -0
  562. package/dist/sandbox/firestore/admin-compat/transaction.d.ts +35 -0
  563. package/dist/sandbox/firestore/admin-compat/transaction.d.ts.map +1 -0
  564. package/dist/sandbox/firestore/admin-compat/transaction.js +88 -0
  565. package/dist/sandbox/firestore/admin-compat/transaction.js.map +1 -0
  566. package/dist/sandbox/firestore/admin-compat/types.d.ts +297 -0
  567. package/dist/sandbox/firestore/admin-compat/types.d.ts.map +1 -0
  568. package/dist/sandbox/firestore/admin-compat/types.js +127 -0
  569. package/dist/sandbox/firestore/admin-compat/types.js.map +1 -0
  570. package/dist/sandbox/firestore/admin-compat/value-order.d.ts +49 -0
  571. package/dist/sandbox/firestore/admin-compat/value-order.d.ts.map +1 -0
  572. package/dist/sandbox/firestore/admin-compat/value-order.js +172 -0
  573. package/dist/sandbox/firestore/admin-compat/value-order.js.map +1 -0
  574. package/dist/sandbox/firestore/auto-id.d.ts +26 -0
  575. package/dist/sandbox/firestore/auto-id.d.ts.map +1 -0
  576. package/dist/sandbox/firestore/auto-id.js +36 -0
  577. package/dist/sandbox/firestore/auto-id.js.map +1 -0
  578. package/dist/sandbox/firestore/converters/bytes-geopoint.d.ts +48 -0
  579. package/dist/sandbox/firestore/converters/bytes-geopoint.d.ts.map +1 -0
  580. package/dist/sandbox/firestore/converters/bytes-geopoint.js +85 -0
  581. package/dist/sandbox/firestore/converters/bytes-geopoint.js.map +1 -0
  582. package/dist/sandbox/firestore/converters/fieldvalue.d.ts +69 -0
  583. package/dist/sandbox/firestore/converters/fieldvalue.d.ts.map +1 -0
  584. package/dist/sandbox/firestore/converters/fieldvalue.js +166 -0
  585. package/dist/sandbox/firestore/converters/fieldvalue.js.map +1 -0
  586. package/dist/sandbox/firestore/converters/reference.d.ts +31 -0
  587. package/dist/sandbox/firestore/converters/reference.d.ts.map +1 -0
  588. package/dist/sandbox/firestore/converters/reference.js +51 -0
  589. package/dist/sandbox/firestore/converters/reference.js.map +1 -0
  590. package/dist/sandbox/firestore/converters/timestamp.d.ts +32 -0
  591. package/dist/sandbox/firestore/converters/timestamp.d.ts.map +1 -0
  592. package/dist/sandbox/firestore/converters/timestamp.js +63 -0
  593. package/dist/sandbox/firestore/converters/timestamp.js.map +1 -0
  594. package/dist/sandbox/firestore/converters/user-timestamp.d.ts +46 -0
  595. package/dist/sandbox/firestore/converters/user-timestamp.d.ts.map +1 -0
  596. package/dist/sandbox/firestore/converters/user-timestamp.js +65 -0
  597. package/dist/sandbox/firestore/converters/user-timestamp.js.map +1 -0
  598. package/dist/sandbox/firestore/converters/vector.d.ts +24 -0
  599. package/dist/sandbox/firestore/converters/vector.d.ts.map +1 -0
  600. package/dist/sandbox/firestore/converters/vector.js +53 -0
  601. package/dist/sandbox/firestore/converters/vector.js.map +1 -0
  602. package/dist/sandbox/firestore/errors.d.ts +82 -0
  603. package/dist/sandbox/firestore/errors.d.ts.map +1 -0
  604. package/dist/sandbox/firestore/errors.js +54 -0
  605. package/dist/sandbox/firestore/errors.js.map +1 -0
  606. package/dist/sandbox/firestore/event-log.d.ts +99 -0
  607. package/dist/sandbox/firestore/event-log.d.ts.map +1 -0
  608. package/dist/sandbox/firestore/event-log.js +67 -0
  609. package/dist/sandbox/firestore/event-log.js.map +1 -0
  610. package/dist/sandbox/firestore/field-merge.d.ts +64 -0
  611. package/dist/sandbox/firestore/field-merge.d.ts.map +1 -0
  612. package/dist/sandbox/firestore/field-merge.js +221 -0
  613. package/dist/sandbox/firestore/field-merge.js.map +1 -0
  614. package/dist/sandbox/firestore/list-query-proof.d.ts +77 -0
  615. package/dist/sandbox/firestore/list-query-proof.d.ts.map +1 -0
  616. package/dist/sandbox/firestore/list-query-proof.js +170 -0
  617. package/dist/sandbox/firestore/list-query-proof.js.map +1 -0
  618. package/dist/sandbox/firestore/local-environment.d.ts +806 -0
  619. package/dist/sandbox/firestore/local-environment.d.ts.map +1 -0
  620. package/dist/sandbox/firestore/local-environment.js +3028 -0
  621. package/dist/sandbox/firestore/local-environment.js.map +1 -0
  622. package/dist/sandbox/firestore/local-state.d.ts +196 -0
  623. package/dist/sandbox/firestore/local-state.d.ts.map +1 -0
  624. package/dist/sandbox/firestore/local-state.js +413 -0
  625. package/dist/sandbox/firestore/local-state.js.map +1 -0
  626. package/dist/sandbox/firestore/overlay-backing.d.ts +44 -0
  627. package/dist/sandbox/firestore/overlay-backing.d.ts.map +1 -0
  628. package/dist/sandbox/firestore/overlay-backing.js +82 -0
  629. package/dist/sandbox/firestore/overlay-backing.js.map +1 -0
  630. package/dist/sandbox/firestore/sentinel-capture.d.ts +30 -0
  631. package/dist/sandbox/firestore/sentinel-capture.d.ts.map +1 -0
  632. package/dist/sandbox/firestore/sentinel-capture.js +61 -0
  633. package/dist/sandbox/firestore/sentinel-capture.js.map +1 -0
  634. package/dist/sandbox/firestore/snapshot-listeners.d.ts +284 -0
  635. package/dist/sandbox/firestore/snapshot-listeners.d.ts.map +1 -0
  636. package/dist/sandbox/firestore/snapshot-listeners.js +194 -0
  637. package/dist/sandbox/firestore/snapshot-listeners.js.map +1 -0
  638. package/dist/sandbox/firestore/topk.d.ts +12 -0
  639. package/dist/sandbox/firestore/topk.d.ts.map +1 -0
  640. package/dist/sandbox/firestore/topk.js +42 -0
  641. package/dist/sandbox/firestore/topk.js.map +1 -0
  642. package/dist/sandbox/firestore/transaction-merge.d.ts +55 -0
  643. package/dist/sandbox/firestore/transaction-merge.d.ts.map +1 -0
  644. package/dist/sandbox/firestore/transaction-merge.js +107 -0
  645. package/dist/sandbox/firestore/transaction-merge.js.map +1 -0
  646. package/dist/sandbox/firestore/transaction-types.d.ts +152 -0
  647. package/dist/sandbox/firestore/transaction-types.d.ts.map +1 -0
  648. package/dist/sandbox/firestore/transaction-types.js +10 -0
  649. package/dist/sandbox/firestore/transaction-types.js.map +1 -0
  650. package/dist/sandbox/firestore/transaction.d.ts +79 -0
  651. package/dist/sandbox/firestore/transaction.d.ts.map +1 -0
  652. package/dist/sandbox/firestore/transaction.js +95 -0
  653. package/dist/sandbox/firestore/transaction.js.map +1 -0
  654. package/dist/sandbox/firestore/value-equality.d.ts +2 -0
  655. package/dist/sandbox/firestore/value-equality.d.ts.map +1 -0
  656. package/dist/sandbox/firestore/value-equality.js +35 -0
  657. package/dist/sandbox/firestore/value-equality.js.map +1 -0
  658. package/dist/sandbox/firestore/value-resolver.d.ts +172 -0
  659. package/dist/sandbox/firestore/value-resolver.d.ts.map +1 -0
  660. package/dist/sandbox/firestore/value-resolver.js +221 -0
  661. package/dist/sandbox/firestore/value-resolver.js.map +1 -0
  662. package/dist/sandbox/firestore/wire-encoder.d.ts +14 -0
  663. package/dist/sandbox/firestore/wire-encoder.d.ts.map +1 -0
  664. package/dist/sandbox/firestore/wire-encoder.js +130 -0
  665. package/dist/sandbox/firestore/wire-encoder.js.map +1 -0
  666. package/dist/sandbox/index.d.ts +50 -0
  667. package/dist/sandbox/index.d.ts.map +1 -0
  668. package/dist/sandbox/index.js +63 -0
  669. package/dist/sandbox/index.js.map +1 -0
  670. package/dist/sandbox/internal/index.d.ts +36 -0
  671. package/dist/sandbox/internal/index.d.ts.map +1 -0
  672. package/dist/sandbox/internal/index.js +72 -0
  673. package/dist/sandbox/internal/index.js.map +1 -0
  674. package/dist/sandbox/internal/sandbox-impl.d.ts +343 -0
  675. package/dist/sandbox/internal/sandbox-impl.d.ts.map +1 -0
  676. package/dist/sandbox/internal/sandbox-impl.js +718 -0
  677. package/dist/sandbox/internal/sandbox-impl.js.map +1 -0
  678. package/dist/sandbox/persistence/backends.d.ts +37 -0
  679. package/dist/sandbox/persistence/backends.d.ts.map +1 -0
  680. package/dist/sandbox/persistence/backends.js +202 -0
  681. package/dist/sandbox/persistence/backends.js.map +1 -0
  682. package/dist/sandbox/persistence/chunk-format.d.ts +58 -0
  683. package/dist/sandbox/persistence/chunk-format.d.ts.map +1 -0
  684. package/dist/sandbox/persistence/chunk-format.js +163 -0
  685. package/dist/sandbox/persistence/chunk-format.js.map +1 -0
  686. package/dist/sandbox/persistence/controller.d.ts +39 -0
  687. package/dist/sandbox/persistence/controller.d.ts.map +1 -0
  688. package/dist/sandbox/persistence/controller.js +605 -0
  689. package/dist/sandbox/persistence/controller.js.map +1 -0
  690. package/dist/sandbox/persistence/index.d.ts +13 -0
  691. package/dist/sandbox/persistence/index.d.ts.map +1 -0
  692. package/dist/sandbox/persistence/index.js +5 -0
  693. package/dist/sandbox/persistence/index.js.map +1 -0
  694. package/dist/sandbox/persistence/serialize.d.ts +53 -0
  695. package/dist/sandbox/persistence/serialize.d.ts.map +1 -0
  696. package/dist/sandbox/persistence/serialize.js +98 -0
  697. package/dist/sandbox/persistence/serialize.js.map +1 -0
  698. package/dist/sandbox/persistence/types.d.ts +118 -0
  699. package/dist/sandbox/persistence/types.d.ts.map +1 -0
  700. package/dist/sandbox/persistence/types.js +15 -0
  701. package/dist/sandbox/persistence/types.js.map +1 -0
  702. package/dist/sandbox/remote.d.ts +118 -0
  703. package/dist/sandbox/remote.d.ts.map +1 -0
  704. package/dist/sandbox/remote.js +60 -0
  705. package/dist/sandbox/remote.js.map +1 -0
  706. package/dist/sandbox/replay/index.d.ts +106 -0
  707. package/dist/sandbox/replay/index.d.ts.map +1 -0
  708. package/dist/sandbox/replay/index.js +246 -0
  709. package/dist/sandbox/replay/index.js.map +1 -0
  710. package/dist/sandbox/sandbox-context.d.ts +40 -0
  711. package/dist/sandbox/sandbox-context.d.ts.map +1 -0
  712. package/dist/sandbox/sandbox-context.js +72 -0
  713. package/dist/sandbox/sandbox-context.js.map +1 -0
  714. package/dist/sandbox/tab-sync/index.d.ts +120 -0
  715. package/dist/sandbox/tab-sync/index.d.ts.map +1 -0
  716. package/dist/sandbox/tab-sync/index.js +272 -0
  717. package/dist/sandbox/tab-sync/index.js.map +1 -0
  718. package/dist/sandbox/types.d.ts +1235 -0
  719. package/dist/sandbox/types.d.ts.map +1 -0
  720. package/dist/sandbox/types.js +46 -0
  721. package/dist/sandbox/types.js.map +1 -0
  722. package/dist/storage/admin/api.d.ts +206 -0
  723. package/dist/storage/admin/api.d.ts.map +1 -0
  724. package/dist/storage/admin/api.js +349 -0
  725. package/dist/storage/admin/api.js.map +1 -0
  726. package/dist/storage/admin/handler.d.ts +29 -0
  727. package/dist/storage/admin/handler.d.ts.map +1 -0
  728. package/dist/storage/admin/handler.js +82 -0
  729. package/dist/storage/admin/handler.js.map +1 -0
  730. package/dist/storage/admin/spec.d.ts +64 -0
  731. package/dist/storage/admin/spec.d.ts.map +1 -0
  732. package/dist/storage/admin/spec.js +8 -0
  733. package/dist/storage/admin/spec.js.map +1 -0
  734. package/dist/storage/admin/tools.d.ts +23 -0
  735. package/dist/storage/admin/tools.d.ts.map +1 -0
  736. package/dist/storage/admin/tools.js +90 -0
  737. package/dist/storage/admin/tools.js.map +1 -0
  738. package/dist/storage/download.d.ts +27 -0
  739. package/dist/storage/download.d.ts.map +1 -0
  740. package/dist/storage/download.js +136 -0
  741. package/dist/storage/download.js.map +1 -0
  742. package/dist/storage/enforce.d.ts +26 -0
  743. package/dist/storage/enforce.d.ts.map +1 -0
  744. package/dist/storage/enforce.js +16 -0
  745. package/dist/storage/enforce.js.map +1 -0
  746. package/dist/storage/errors.d.ts +46 -0
  747. package/dist/storage/errors.d.ts.map +1 -0
  748. package/dist/storage/errors.js +62 -0
  749. package/dist/storage/errors.js.map +1 -0
  750. package/dist/storage/index.d.ts +49 -0
  751. package/dist/storage/index.d.ts.map +1 -0
  752. package/dist/storage/index.js +60 -0
  753. package/dist/storage/index.js.map +1 -0
  754. package/dist/storage/internal.d.ts +18 -0
  755. package/dist/storage/internal.d.ts.map +1 -0
  756. package/dist/storage/internal.js +18 -0
  757. package/dist/storage/internal.js.map +1 -0
  758. package/dist/storage/list.d.ts +17 -0
  759. package/dist/storage/list.d.ts.map +1 -0
  760. package/dist/storage/list.js +91 -0
  761. package/dist/storage/list.js.map +1 -0
  762. package/dist/storage/metadata.d.ts +86 -0
  763. package/dist/storage/metadata.d.ts.map +1 -0
  764. package/dist/storage/metadata.js +167 -0
  765. package/dist/storage/metadata.js.map +1 -0
  766. package/dist/storage/persistence.d.ts +134 -0
  767. package/dist/storage/persistence.d.ts.map +1 -0
  768. package/dist/storage/persistence.js +132 -0
  769. package/dist/storage/persistence.js.map +1 -0
  770. package/dist/storage/reference.d.ts +63 -0
  771. package/dist/storage/reference.d.ts.map +1 -0
  772. package/dist/storage/reference.js +156 -0
  773. package/dist/storage/reference.js.map +1 -0
  774. package/dist/storage/rules.d.ts +176 -0
  775. package/dist/storage/rules.d.ts.map +1 -0
  776. package/dist/storage/rules.js +621 -0
  777. package/dist/storage/rules.js.map +1 -0
  778. package/dist/storage/service.d.ts +139 -0
  779. package/dist/storage/service.d.ts.map +1 -0
  780. package/dist/storage/service.js +241 -0
  781. package/dist/storage/service.js.map +1 -0
  782. package/dist/storage/upload.d.ts +43 -0
  783. package/dist/storage/upload.d.ts.map +1 -0
  784. package/dist/storage/upload.js +235 -0
  785. package/dist/storage/upload.js.map +1 -0
  786. package/package.json +109 -3
@@ -0,0 +1,583 @@
1
+ import { parseToAST } from '../grammar/FirestoreParser.js';
2
+ import { assembleExpression } from '../grammar/FirestoreAssembler.js';
3
+ import { evaluate, UnsupportedError, TraceRecorder } from './evaluator.js';
4
+ import { Timestamp } from './wrappers/timestamp.js';
5
+ import { Path } from './wrappers/path.js';
6
+ import { projectAfterState } from './project-after-state.js';
7
+ /**
8
+ * Collects per-block resolution attempts as `resolveMatch` walks the
9
+ * match-block tree. Optional — when absent, `resolveMatch` is unchanged.
10
+ * The handler instantiates one per test case and attaches the resulting
11
+ * `attempts` array to the corresponding `TestResult.pathResolution`.
12
+ *
13
+ * Records both successful matches (the winning block) and every block
14
+ * the resolver considered and rejected. Used by `debug_firestore_rules`
15
+ * to surface "near-miss" blocks in PATH_MISMATCH diagnoses — without
16
+ * this trace, the agent would have to manually walk the rule AST to
17
+ * figure out which block was closest to the failing path.
18
+ */
19
+ class PathResolutionRecorder {
20
+ attempts = [];
21
+ push(entry) {
22
+ this.attempts.push(entry);
23
+ }
24
+ }
25
+ /** Render a block's `PathPattern` back to source form for the trace
26
+ * entry. Literal segments pass through; wildcards become `{name}`;
27
+ * recursive segments become `{name=**}`. Matches the shape the agent
28
+ * sees in the rules file. */
29
+ function renderBlockPath(block) {
30
+ const parts = block.path.segments.map(seg => {
31
+ if (seg.type === 'literal')
32
+ return seg.value;
33
+ if (seg.type === 'wildcard')
34
+ return `{${seg.name}}`;
35
+ return `{${seg.name}=**}`;
36
+ });
37
+ return '/' + parts.join('/');
38
+ }
39
+ /**
40
+ * Given a document path like "chess/game1", find the matching match block
41
+ * in the AST. Resolves wildcards and binds path variables.
42
+ *
43
+ * When `recorder` is supplied, every block the function considers
44
+ * (matched or not) is logged as a `PathResolutionEntry`. Tests +
45
+ * `debug_firestore_rules` rely on this trace; production callers can
46
+ * omit it and pay zero cost.
47
+ */
48
+ function resolveMatch(block, pathSegments, parentFunctions, recorder) {
49
+ const allFunctions = [...parentFunctions, ...block.functions];
50
+ // Check if this block's path pattern matches the remaining segments
51
+ const pattern = block.path.segments;
52
+ const bindings = {};
53
+ let consumed = 0;
54
+ // Track WHY we stopped — needed for the resolution trace. Default
55
+ // 'literal-mismatch' is overwritten before the early-return paths
56
+ // that have a more specific reason.
57
+ let failureReason;
58
+ for (const seg of pattern) {
59
+ if (seg.type === 'literal') {
60
+ if (consumed >= pathSegments.length) {
61
+ // The block path has more segments than the request supplied
62
+ // — distinct from a literal-mismatch even though we technically
63
+ // ran out of input mid-loop. Flag it for the trace before the
64
+ // early-return below.
65
+ failureReason = 'request-shorter';
66
+ break;
67
+ }
68
+ if (pathSegments[consumed] !== seg.value) {
69
+ failureReason = 'literal-mismatch';
70
+ break;
71
+ }
72
+ consumed++;
73
+ }
74
+ else if (seg.type === 'wildcard') {
75
+ if (consumed >= pathSegments.length) {
76
+ failureReason = 'request-shorter';
77
+ break;
78
+ }
79
+ bindings[seg.name] = pathSegments[consumed];
80
+ consumed++;
81
+ }
82
+ else if (seg.type === 'recursive') {
83
+ // {document=**} matches all remaining segments
84
+ bindings[seg.name] = pathSegments.slice(consumed).join('/');
85
+ consumed = pathSegments.length;
86
+ }
87
+ }
88
+ // If we exited the loop early with a failureReason set, this block
89
+ // didn't fully consume its own pattern — record + bail.
90
+ if (failureReason !== undefined) {
91
+ recorder?.push({
92
+ ...(block.loc ? { line: block.loc.line } : {}),
93
+ blockPath: renderBlockPath(block),
94
+ matchedSegments: consumed,
95
+ totalSegments: pattern.length,
96
+ bindings,
97
+ matched: false,
98
+ reason: failureReason,
99
+ });
100
+ return null;
101
+ }
102
+ const remaining = pathSegments.slice(consumed);
103
+ // If all segments consumed, this block matches directly
104
+ if (remaining.length === 0) {
105
+ recorder?.push({
106
+ ...(block.loc ? { line: block.loc.line } : {}),
107
+ blockPath: renderBlockPath(block),
108
+ matchedSegments: consumed,
109
+ totalSegments: pattern.length,
110
+ bindings,
111
+ matched: true,
112
+ });
113
+ return { block, pathVariables: bindings, parentFunctions: allFunctions };
114
+ }
115
+ // Otherwise, try children
116
+ for (const child of block.children) {
117
+ const childResult = resolveMatch(child, remaining, allFunctions, recorder);
118
+ if (childResult) {
119
+ // Parent recorded as a successful "partial" match — the child
120
+ // completed the resolution. Record THIS block as matched too;
121
+ // bindings merge happens below.
122
+ recorder?.push({
123
+ ...(block.loc ? { line: block.loc.line } : {}),
124
+ blockPath: renderBlockPath(block),
125
+ matchedSegments: consumed,
126
+ totalSegments: pattern.length,
127
+ bindings,
128
+ matched: true,
129
+ });
130
+ // Merge parent bindings
131
+ childResult.pathVariables = { ...bindings, ...childResult.pathVariables };
132
+ return childResult;
133
+ }
134
+ }
135
+ // Block consumed its own segments but no child block covered the
136
+ // remaining request segments. Record + bail.
137
+ recorder?.push({
138
+ ...(block.loc ? { line: block.loc.line } : {}),
139
+ blockPath: renderBlockPath(block),
140
+ matchedSegments: consumed,
141
+ totalSegments: pattern.length,
142
+ bindings,
143
+ matched: false,
144
+ reason: 'no-matching-child',
145
+ });
146
+ return null;
147
+ }
148
+ // ═══ Operation mapping ═══
149
+ function methodToOperations(method) {
150
+ switch (method) {
151
+ case 'get': return ['get', 'read'];
152
+ case 'list': return ['list', 'read'];
153
+ case 'create': return ['create', 'write'];
154
+ case 'update': return ['update', 'write'];
155
+ case 'delete': return ['delete', 'write'];
156
+ default: return [method];
157
+ }
158
+ }
159
+ // ═══ Rule evaluation ═══
160
+ /**
161
+ * Evaluate all allow rules in a match block for a given operation.
162
+ * Uses OR semantics — if any matching rule allows, access is granted.
163
+ *
164
+ * Decision logic:
165
+ * - any rule ALLOW → ALLOW (short-circuit)
166
+ * - else if any rule threw UnsupportedError → UNSUPPORTED (sim abstains)
167
+ * - else → DENY
168
+ *
169
+ * Real evaluation errors (EvalError, type mismatches) are *not* lifted to
170
+ * UNSUPPORTED — they're caught and counted as deny, matching production's
171
+ * "runtime errors deny the request" behavior.
172
+ */
173
+ function evaluateRules(block, operation, ctx) {
174
+ const ops = methodToOperations(operation);
175
+ const trace = [];
176
+ const notes = [];
177
+ // Find allow rules that match this operation
178
+ const matchingRules = [];
179
+ for (let i = 0; i < block.allows.length; i++) {
180
+ const rule = block.allows[i];
181
+ if (rule.operations.some(op => ops.includes(op))) {
182
+ matchingRules.push({ rule, index: i });
183
+ }
184
+ }
185
+ if (matchingRules.length === 0) {
186
+ notes.push(`No allow rules found for operation '${operation}'`);
187
+ return { decision: 'DENY', trace, notes };
188
+ }
189
+ // Evaluate each matching rule (OR semantics). Each rule gets its own
190
+ // TraceRecorder so the per-rule expressionTrace stays isolated even
191
+ // when multiple rules evaluate before a verdict lands. We attach via
192
+ // mutation+restore on the shared ctx — cheaper than cloning ctx for
193
+ // every rule and keeps wrappers' identity (Timestamp etc.) stable
194
+ // across the loop.
195
+ let sawUnsupported = false;
196
+ const priorRecorder = ctx.trace;
197
+ for (const { rule, index } of matchingRules) {
198
+ const entry = newEntry(rule, index);
199
+ const recorder = new TraceRecorder();
200
+ ctx.trace = recorder;
201
+ try {
202
+ const result = evaluate(rule.condition, ctx);
203
+ entry.expressionTrace = recorder.entries;
204
+ if (result) {
205
+ entry.verdict = 'ALLOW';
206
+ trace.push(entry);
207
+ ctx.trace = priorRecorder;
208
+ return { decision: 'ALLOW', trace, notes };
209
+ }
210
+ entry.verdict = 'DENY';
211
+ trace.push(entry);
212
+ }
213
+ catch (e) {
214
+ entry.expressionTrace = recorder.entries;
215
+ if (e instanceof UnsupportedError) {
216
+ sawUnsupported = true;
217
+ entry.verdict = 'UNSUPPORTED';
218
+ entry.message = e.message;
219
+ }
220
+ else {
221
+ entry.verdict = 'ERROR';
222
+ entry.message = e instanceof Error ? e.message : String(e);
223
+ }
224
+ trace.push(entry);
225
+ }
226
+ }
227
+ ctx.trace = priorRecorder;
228
+ // No rule allowed. If at least one rule abstained on a sim gap, escalate
229
+ // to UNSUPPORTED so the agent sees "sim couldn't decide" rather than a
230
+ // misleading DENY. If every failure was a real eval error, return DENY
231
+ // (production would also deny on runtime errors).
232
+ return { decision: sawUnsupported ? 'UNSUPPORTED' : 'DENY', trace, notes };
233
+ }
234
+ function newEntry(rule, index) {
235
+ const entry = {
236
+ ruleIndex: index,
237
+ operations: [...rule.operations],
238
+ verdict: 'DENY',
239
+ conditionText: assembleExpression(rule.condition),
240
+ };
241
+ if (rule.loc)
242
+ entry.line = rule.loc.line;
243
+ return entry;
244
+ }
245
+ // ═══ Build simulation context from TestCase ═══
246
+ // ═══ Server timestamp sentinel ═══
247
+ /** Sentinel value for FieldValue.serverTimestamp() in test data. */
248
+ export const SERVER_TIMESTAMP = { __type: 'serverTimestamp' };
249
+ function isServerTimestampSentinel(value) {
250
+ return typeof value === 'object' && value !== null
251
+ && value.__type === 'serverTimestamp';
252
+ }
253
+ /**
254
+ * Recursively replace serverTimestamp sentinels with the actual server time.
255
+ * Item 1.3: `serverTime` is now a Timestamp wrapper (was ISO string). The
256
+ * SAME instance is reused across every sentinel hit so `data.createdAt ==
257
+ * request.time` succeeds via rulesValuesEqual -> Timestamp.equals (field
258
+ * compare). Without instance reuse, two distinct Timestamp instances would
259
+ * still equate via field compare — but the single-instance invariant is
260
+ * documented here so future refactors don't break it accidentally.
261
+ */
262
+ export function resolveServerTimestamps(data, serverTime) {
263
+ const resolved = {};
264
+ for (const [key, value] of Object.entries(data)) {
265
+ if (isServerTimestampSentinel(value)) {
266
+ resolved[key] = serverTime;
267
+ }
268
+ else if (isPlainObject(value)) {
269
+ // Only descend into plain objects ({} / Object.create(null)). After
270
+ // Item 1 the value tree may legitimately contain class instances
271
+ // (Timestamp, Bytes, LatLng, future DocumentReference) — walking
272
+ // them as maps would shred their prototype and break `is timestamp`,
273
+ // `is reference`, etc.
274
+ resolved[key] = resolveServerTimestamps(value, serverTime);
275
+ }
276
+ else {
277
+ resolved[key] = value;
278
+ }
279
+ }
280
+ return resolved;
281
+ }
282
+ function isPlainObject(value) {
283
+ if (value === null || typeof value !== 'object')
284
+ return false;
285
+ if (Array.isArray(value))
286
+ return false;
287
+ const proto = Object.getPrototypeOf(value);
288
+ return proto === Object.prototype || proto === null;
289
+ }
290
+ /**
291
+ * Populate `request.query` for `list` operations from the optional
292
+ * TestCase.query payload (REBUILD_PLAN.md Item 6 follow-up).
293
+ *
294
+ * Production's `request.query` exposes `limit / offset / orderBy` as
295
+ * always-present, NULLABLE fields on a `list` request — `request.query.limit
296
+ * == null` is the documented way to assert "no limit clause." So we ALWAYS
297
+ * expose the three keys (null when the test omits them) rather than omitting
298
+ * them; otherwise, after RULES-B2 (dotted-field access of a MISSING key
299
+ * errors), `request.query.limit` would error instead of reading null, breaking
300
+ * the legitimate `== null` guard. For non-list methods `request.query` is the
301
+ * empty map (the fields don't apply), matching production.
302
+ */
303
+ function buildRequestQuery(tc) {
304
+ if (tc.method !== 'list')
305
+ return {};
306
+ return {
307
+ limit: tc.query?.limit ?? null,
308
+ offset: tc.query?.offset ?? null,
309
+ orderBy: tc.query?.orderBy ?? null,
310
+ };
311
+ }
312
+ function buildContext(tc, functions, pathVariables, getDoc) {
313
+ const fnMap = new Map();
314
+ for (const fn of functions)
315
+ fnMap.set(fn.name, fn);
316
+ const mockDocs = new Map();
317
+ if (tc.functionMocks) {
318
+ for (const mock of tc.functionMocks) {
319
+ if (mock.function === 'get' && typeof mock.result === 'object' && mock.result !== null) {
320
+ mockDocs.set(mock.path, mock.result);
321
+ }
322
+ else if (mock.function === 'exists') {
323
+ if (mock.result === true)
324
+ mockDocs.set(mock.path, {});
325
+ }
326
+ }
327
+ }
328
+ // request.time defaults to wallclock; tc.requestTime (Item 0.F) lets
329
+ // tests pin a deterministic value for date-gated rules. Item 1.3
330
+ // flipped the in-evaluator type from ISO string to Timestamp wrapper
331
+ // (REBUILD_PLAN Risk 1) — `tc.requestTime` stays an ISO string for
332
+ // backwards-compat with the prod Test API, parsed here.
333
+ const serverTime = tc.requestTime
334
+ ? Timestamp.fromIsoString(tc.requestTime)
335
+ : Timestamp.fromMillis(Date.now());
336
+ // Item 6: build the full document path for request.path / __name__.
337
+ // tc.path arrives as a relative path like "users/alice"; the spec form
338
+ // is /databases/(default)/documents/<rel>. Strip a leading slash so we
339
+ // don't end up with a double slash.
340
+ const relPath = tc.path.startsWith('/') ? tc.path.slice(1) : tc.path;
341
+ const fullPathSegs = ['databases', '(default)', 'documents', ...relPath.split('/').filter(Boolean)];
342
+ // Pass pathVariables as bindings so `request.path.<name>` (where <name> is
343
+ // a wildcard from the matched rule, e.g. {uid}) returns the bound segment
344
+ // value instead of null. Without this, named-field access on request.path
345
+ // silently DENYs any rule that reads it.
346
+ const fullPath = new Path(fullPathSegs, pathVariables);
347
+ // resource.id = last segment of the relative path
348
+ const relSegs = relPath.split('/').filter(Boolean);
349
+ const docId = relSegs.length > 0 ? relSegs[relSegs.length - 1] : '';
350
+ // Item 7 — project the after-state.
351
+ //
352
+ // If tc.writeMode is set (Item 0.D), run projectAfterState to derive both
353
+ // request.resource.data and what getAfter() returns. Otherwise preserve
354
+ // legacy behavior where tc.data IS the after-state for create/update,
355
+ // tc.resource for read methods, and null for delete. The legacy fallback
356
+ // keeps every existing test passing while letting new tests opt into
357
+ // proper merge semantics.
358
+ const payload = tc.data ?? {};
359
+ const existing = tc.resource ?? null;
360
+ let afterState;
361
+ let existsAfter;
362
+ if (tc.writeMode) {
363
+ afterState = projectAfterState(tc.writeMode, existing, payload);
364
+ existsAfter = afterState !== null;
365
+ }
366
+ else {
367
+ switch (tc.method) {
368
+ case 'create':
369
+ case 'update':
370
+ // RULES-B10: the prod-faithful update post-state is `existing` merged
371
+ // with the payload. That merge IS implemented and correct on the
372
+ // `writeMode: { kind: 'update' }` path above (`projectAfterState`),
373
+ // which agent-facing `simulate()` callers should use. The legacy
374
+ // no-writeMode default keeps `afterState = payload`: the sandbox
375
+ // LocalEnvironment path ALREADY pre-merges + pre-applies deleteField()
376
+ // and hands us the FULL post-write doc, so re-merging here would
377
+ // resurrect deleted keys (RULES-B10 step doc records this cross-track
378
+ // coupling — making merge the unconditional default needs a coordinated
379
+ // T2 change to have LocalEnvironment declare its writeMode).
380
+ afterState = payload;
381
+ existsAfter = true;
382
+ break;
383
+ case 'delete':
384
+ afterState = null;
385
+ existsAfter = false;
386
+ break;
387
+ case 'get':
388
+ case 'list':
389
+ default:
390
+ afterState = existing; // no write happens
391
+ existsAfter = existing !== null;
392
+ break;
393
+ }
394
+ }
395
+ const projectedAfter = afterState !== null
396
+ ? resolveServerTimestamps(afterState, serverTime)
397
+ : null;
398
+ // request.resource.data: for non-write methods (get/list) Firestore exposes
399
+ // null. For writes, it's the projected after-state. We keep the legacy
400
+ // shape (`{}` when tc.data is absent) for backwards-compat — the parity
401
+ // packs that exercise this surface explicitly set tc.data.
402
+ const reqResourceData = projectedAfter ?? {};
403
+ return {
404
+ request: {
405
+ auth: tc.auth ? { uid: tc.auth.uid, token: tc.auth.token ?? {} } : null,
406
+ resource: { data: reqResourceData },
407
+ method: tc.method,
408
+ path: fullPath, // Item 6: Path wrapper, full /databases/.../documents/... form
409
+ query: buildRequestQuery(tc),
410
+ time: serverTime,
411
+ },
412
+ resource: {
413
+ data: existing ?? {}, // NOT resolved — resource is pre-write, no sentinels
414
+ id: docId, // Item 6
415
+ __name__: fullPath, // Item 6
416
+ },
417
+ mockDocuments: mockDocs,
418
+ getDoc,
419
+ pathVariables,
420
+ functions: fnMap,
421
+ database: '(default)',
422
+ // Item 7 — projected post-write state for the request target.
423
+ // afterStatePath: full Path being written to (matches request.path)
424
+ // afterState: post-write doc data, or null when deleted
425
+ // existsAfter: false when method is delete (or projectAfterState → null)
426
+ afterStatePath: fullPath,
427
+ afterState: projectedAfter,
428
+ existsAfter,
429
+ };
430
+ }
431
+ // ═══ Main handler ═══
432
+ export class SimulateFirestoreRulesHandler {
433
+ /**
434
+ * Simulate Firestore rules evaluation locally.
435
+ * Same interface as TestFirestoreRulesHandler.execute().
436
+ */
437
+ simulate(source, testCases, opts) {
438
+ // Parse rules. Give the empty-input case a distinct, actionable
439
+ // error — agents that see "Failed to parse rules source" otherwise
440
+ // hex-dump the rules file looking for invisible characters before
441
+ // realizing the source string is just empty (see
442
+ // CLAUDE_DEBUG_SESSION.md).
443
+ if (!source || source.trim().length === 0) {
444
+ return {
445
+ success: false,
446
+ error: {
447
+ code: 'PARSE_FAILED',
448
+ message: 'Empty rules source — call sandbox.setRules(rules) before operating, '
449
+ + 'or initialize without rules to use the open-by-default ruleset. '
450
+ + 'See pyric/sandbox docs.',
451
+ recoverable: true,
452
+ },
453
+ };
454
+ }
455
+ const ast = parseToAST(source);
456
+ if (!ast) {
457
+ return {
458
+ success: false,
459
+ error: { code: 'PARSE_FAILED', message: 'Failed to parse rules source', recoverable: true },
460
+ };
461
+ }
462
+ const results = [];
463
+ let passed = 0;
464
+ let failed = 0;
465
+ let unsupported = 0;
466
+ // Resolve any wildcards on the root match (typically just one for
467
+ // the database segment) and bind each to '(default)'. The root
468
+ // wildcard can be named anything in production — `database`, `db`,
469
+ // `dbId` are all valid — and `get(/databases/$(name)/...)` paths
470
+ // inside rules expect that exact name to resolve. Previously we
471
+ // hardcoded `database` only, so any other name silently became
472
+ // `undefined` inside path interpolation and broke every `get()` /
473
+ // `exists()` call.
474
+ //
475
+ // `database` stays seeded as a default so rules that don't use a
476
+ // wildcard on the root match (or that hardcode `$(database)` in a
477
+ // `get()` path) still work.
478
+ const rootBindings = { database: '(default)' };
479
+ for (const seg of ast.service.match.path.segments) {
480
+ if (seg.type === 'wildcard') {
481
+ rootBindings[seg.name] = '(default)';
482
+ }
483
+ }
484
+ for (const tc of testCases) {
485
+ // Resolve the match block for this path.
486
+ // The root match is /databases/{database}/documents — skip it,
487
+ // start matching from its children directly.
488
+ const pathSegments = tc.path.split('/').filter(Boolean);
489
+ const rootFunctions = ast.service.match.functions;
490
+ let match = null;
491
+ // Fresh recorder per test case so each `TestResult.pathResolution`
492
+ // captures only its own resolution attempts.
493
+ const pathRecorder = new PathResolutionRecorder();
494
+ for (const child of ast.service.match.children) {
495
+ match = resolveMatch(child, pathSegments, rootFunctions, pathRecorder);
496
+ if (match)
497
+ break;
498
+ }
499
+ // `list` targets a COLLECTION, but rules match blocks are document-
500
+ // level: real Firestore evaluates a query against the doc block with
501
+ // the document wildcard hypothetical (and `resource` undefined). When
502
+ // a collection path resolves no block directly, retry with a
503
+ // synthetic trailing document segment so `list menuItems` evaluates
504
+ // `match /menuItems/{id}` exactly like the emulator does. Doc-style
505
+ // list paths (`menuItems/any`) keep resolving on the first attempt,
506
+ // so existing call sites are unaffected. (RULES-LIST parity pack.)
507
+ let syntheticListDoc = false;
508
+ if (!match && tc.method === 'list') {
509
+ const widened = [...pathSegments, '__hypothetical_doc__'];
510
+ for (const child of ast.service.match.children) {
511
+ match = resolveMatch(child, widened, rootFunctions, pathRecorder);
512
+ if (match)
513
+ break;
514
+ }
515
+ if (match)
516
+ syntheticListDoc = true;
517
+ }
518
+ const pathResolution = {
519
+ requestPath: tc.path,
520
+ attempts: pathRecorder.attempts,
521
+ };
522
+ if (!match) {
523
+ // No match block at all → production default-DENY. Expectation
524
+ // 'DENY' agrees → PASSED; expectation 'ALLOW' disagrees → FAILED.
525
+ const state = tc.expectation === 'DENY' ? 'PASSED' : 'FAILED';
526
+ if (state === 'PASSED')
527
+ passed++;
528
+ else
529
+ failed++;
530
+ results.push({
531
+ description: tc.description,
532
+ expectation: tc.expectation,
533
+ state,
534
+ decision: 'DENY',
535
+ trace: [],
536
+ notes: [`No match block found for path '${tc.path}'`],
537
+ pathResolution,
538
+ });
539
+ continue;
540
+ }
541
+ // Build context — `rootBindings` carries the root-match wildcards
542
+ // (e.g. `db` or `database`) so `$(name)` interpolation inside
543
+ // get()/exists() paths resolves regardless of which name the
544
+ // ruleset chose. Child match bindings override on collision (a
545
+ // child rule that shadows the name wins inside that scope).
546
+ const allFunctions = [...match.parentFunctions, ...match.block.functions];
547
+ const pathVars = { ...rootBindings, ...match.pathVariables };
548
+ const ctx = buildContext(tc, allFunctions, pathVars, opts?.getDoc);
549
+ // Evaluate rules
550
+ const { decision, trace, notes } = evaluateRules(match.block, tc.method, ctx);
551
+ if (syntheticListDoc) {
552
+ notes.push(`list on collection path '${tc.path}' evaluated against the document-level match block (document wildcard hypothetical, resource undefined) — emulator-faithful`);
553
+ }
554
+ // Compare with expectation. UNSUPPORTED is its own terminal state —
555
+ // not PASSED (we didn't agree, we abstained) and not FAILED (the
556
+ // failure is on the simulator's side, not the rule's).
557
+ let state;
558
+ if (decision === 'UNSUPPORTED') {
559
+ state = 'UNSUPPORTED';
560
+ unsupported++;
561
+ }
562
+ else if (decision === tc.expectation) {
563
+ state = 'PASSED';
564
+ passed++;
565
+ }
566
+ else {
567
+ state = 'FAILED';
568
+ failed++;
569
+ }
570
+ results.push({
571
+ description: tc.description,
572
+ expectation: tc.expectation,
573
+ state,
574
+ decision,
575
+ trace,
576
+ notes,
577
+ pathResolution,
578
+ });
579
+ }
580
+ return { success: true, data: { passed, failed, unsupported, results } };
581
+ }
582
+ }
583
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/rules/simulator/handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * MapDiff implementation for Firestore rules simulation.
3
+ *
4
+ * Implements request.resource.data.diff(resource.data) which returns
5
+ * a MapDiff object with methods for comparing two document states.
6
+ *
7
+ * Semantics derived from production Firestore behavior:
8
+ * - Only compares top-level keys (nested map diff is unreliable in production)
9
+ * - Values are compared with Firestore Rules value equality
10
+ * - Returns Set-like objects with hasOnly(), hasAll(), hasAny(), size()
11
+ */
12
+ import { FirestoreSet } from './firestore-set.js';
13
+ export { FirestoreSet } from './firestore-set.js';
14
+ export declare class MapDiff {
15
+ private before;
16
+ private after;
17
+ constructor(before: Record<string, unknown>, after: Record<string, unknown>);
18
+ /** Keys present in `after` but not in `before`. */
19
+ addedKeys(): FirestoreSet;
20
+ /** Keys present in `before` but not in `after`. */
21
+ removedKeys(): FirestoreSet;
22
+ /** Keys present in both but with different values. */
23
+ changedKeys(): FirestoreSet;
24
+ /** Keys that were added, removed, or changed. Union of added + removed + changed. */
25
+ affectedKeys(): FirestoreSet;
26
+ /** Keys present in both with identical values. */
27
+ unchangedKeys(): FirestoreSet;
28
+ }
29
+ //# sourceMappingURL=mapdiff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapdiff.d.ts","sourceRoot":"","sources":["../../../src/rules/simulator/mapdiff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,qBAAa,OAAO;IAClB,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,KAAK,CAA0B;gBAE3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAK3E,mDAAmD;IACnD,SAAS,IAAI,YAAY;IAQzB,mDAAmD;IACnD,WAAW,IAAI,YAAY;IAQ3B,sDAAsD;IACtD,WAAW,IAAI,YAAY;IAU3B,qFAAqF;IACrF,YAAY,IAAI,YAAY;IAW5B,kDAAkD;IAClD,aAAa,IAAI,YAAY;CAS9B"}