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,269 @@
1
+ /** Empty spec — equivalent to "no constraints" (a plain ref query). */
2
+ export function emptySpec() {
3
+ return { orderBy: null, bounds: [], limit: null };
4
+ }
5
+ /** Whether the spec already has a lower-bound (start) constraint. A
6
+ * `startAt`/`startAfter`/`equalTo` all set the start. */
7
+ function specHasStart(spec) {
8
+ return spec.bounds.some((b) => b.kind === 'startAt' || b.kind === 'startAfter' || b.kind === 'equalTo');
9
+ }
10
+ /** Whether the spec already has an upper-bound (end) constraint. A
11
+ * `endAt`/`endBefore`/`equalTo` all set the end. */
12
+ function specHasEnd(spec) {
13
+ return spec.bounds.some((b) => b.kind === 'endAt' || b.kind === 'endBefore' || b.kind === 'equalTo');
14
+ }
15
+ /**
16
+ * Append a constraint, returning a NEW spec. (Constraints are immutable
17
+ * values; the query builder threads them via free functions matching
18
+ * `firebase/database`'s shape.)
19
+ *
20
+ * Conflicting constraints throw, mirroring the upstream `_apply` guards
21
+ * (`api/Reference_impl.ts`) — DB-B5. Prod rejects: multiple `orderBy*`,
22
+ * a second `limitToFirst`/`limitToLast`, a second start (`startAt`/
23
+ * `startAfter`/`equalTo`) or end (`endAt`/`endBefore`/`equalTo`).
24
+ */
25
+ export function applyConstraint(spec, c) {
26
+ switch (c.kind) {
27
+ case 'orderBy':
28
+ if (spec.orderBy !== null) {
29
+ throw new Error("You can't combine multiple orderBy calls.");
30
+ }
31
+ return { ...spec, orderBy: c.spec };
32
+ case 'bound': {
33
+ const setsStart = c.bound.kind === 'startAt' || c.bound.kind === 'startAfter' || c.bound.kind === 'equalTo';
34
+ const setsEnd = c.bound.kind === 'endAt' || c.bound.kind === 'endBefore' || c.bound.kind === 'equalTo';
35
+ if (setsStart && specHasStart(spec)) {
36
+ throw new Error(`${c.bound.kind}: Starting point was already set (by another call to startAt, startAfter, or equalTo).`);
37
+ }
38
+ if (setsEnd && specHasEnd(spec)) {
39
+ throw new Error(`${c.bound.kind}: Ending point was already set (by another call to endAt, endBefore, or equalTo).`);
40
+ }
41
+ return { ...spec, bounds: [...spec.bounds, c.bound] };
42
+ }
43
+ case 'limit':
44
+ if (spec.limit !== null) {
45
+ throw new Error(`${c.limitKind}: Limit was already set (by another call to limitToFirst or limitToLast).`);
46
+ }
47
+ return { ...spec, limit: { kind: c.limitKind, n: c.n } };
48
+ }
49
+ }
50
+ /**
51
+ * Compare two `JsonValue`s under RTDB's documented type-order rules.
52
+ * Locked by the upstream contract (Firebase docs: null < false < true
53
+ * < number < string < object). The sandbox's ordering only needs to
54
+ * match against same-type-or-null/undefined.
55
+ *
56
+ * Returns -1 / 0 / 1.
57
+ */
58
+ export function compareValues(a, b) {
59
+ if (a === b)
60
+ return 0;
61
+ // null sorts first.
62
+ if (a === null)
63
+ return -1;
64
+ if (b === null)
65
+ return 1;
66
+ const ta = typeofRank(a);
67
+ const tb = typeofRank(b);
68
+ if (ta !== tb)
69
+ return ta - tb;
70
+ // Same type — value comparison.
71
+ if (typeof a === 'number' && typeof b === 'number')
72
+ return a < b ? -1 : a > b ? 1 : 0;
73
+ if (typeof a === 'boolean' && typeof b === 'boolean')
74
+ return a === b ? 0 : a ? 1 : -1;
75
+ if (typeof a === 'string' && typeof b === 'string')
76
+ return a < b ? -1 : a > b ? 1 : 0;
77
+ // Objects/arrays are "greater" than primitives, but two object-valued
78
+ // children are ORDER-EQUAL under RTDB's model — the tie is broken by
79
+ // key, NOT by an invented JSON-string ordering (DB-B11; mirrors
80
+ // `ChildrenNode.ts:386-400` where ChildrenNodes compare equal). Return
81
+ // 0 so the caller's key tie-break takes over.
82
+ return 0;
83
+ }
84
+ function typeofRank(v) {
85
+ // null = 0; boolean = 1; number = 2; string = 3; object/array = 4.
86
+ if (v === null)
87
+ return 0;
88
+ if (typeof v === 'boolean')
89
+ return 1;
90
+ if (typeof v === 'number')
91
+ return 2;
92
+ if (typeof v === 'string')
93
+ return 3;
94
+ return 4;
95
+ }
96
+ /** Used to test for integer-looking strings. Mirrors `INTEGER_REGEXP_`
97
+ * (`core/util/util.ts:496`). */
98
+ const INTEGER_REGEXP = /^-?(0*)\d{1,10}$/;
99
+ const INTEGER_32_MIN = -2147483648;
100
+ const INTEGER_32_MAX = 2147483647;
101
+ /** If the string is a 32-bit integer, return it; else `null`. Mirrors
102
+ * `tryParseInt` (`core/util/util.ts:511-520`). */
103
+ function tryParseInt(str) {
104
+ if (INTEGER_REGEXP.test(str)) {
105
+ const intVal = Number(str);
106
+ if (intVal >= INTEGER_32_MIN && intVal <= INTEGER_32_MAX) {
107
+ return intVal;
108
+ }
109
+ }
110
+ return null;
111
+ }
112
+ /**
113
+ * Compare two Firebase key names under RTDB's `nameCompare` ordering:
114
+ * integer-looking keys sort FIRST (numerically; ties broken by string
115
+ * length so `"01"` follows `"1"`), then non-integer keys sort
116
+ * lexicographically. Mirrors `nameCompare` (`core/util/util.ts:253-276`).
117
+ *
118
+ * This is RTDB's universal key order — it drives `orderByKey()`, the
119
+ * tie-break for `orderByChild`/`orderByValue`, and the `key` argument of
120
+ * `startAt(value, key)` / `endAt(value, key)` cursors. Plain
121
+ * lexicographic compare (DB-B4) put `"10"` before `"2"`.
122
+ */
123
+ export function nameCompare(a, b) {
124
+ if (a === b)
125
+ return 0;
126
+ const aAsInt = tryParseInt(a);
127
+ const bAsInt = tryParseInt(b);
128
+ if (aAsInt !== null) {
129
+ if (bAsInt !== null) {
130
+ return aAsInt - bAsInt === 0 ? a.length - b.length : aAsInt - bAsInt;
131
+ }
132
+ // Integer keys sort before non-integer keys.
133
+ return -1;
134
+ }
135
+ else if (bAsInt !== null) {
136
+ return 1;
137
+ }
138
+ return a < b ? -1 : 1;
139
+ }
140
+ /**
141
+ * Extract the value the ordering uses to compare a child. For
142
+ * `orderByKey()` it's the key string; for `orderByValue()` the child's
143
+ * raw value; for `orderByChild(path)` the nested field at `path`
144
+ * (which may itself be missing → `null`).
145
+ */
146
+ export function extractOrderValue(spec, key, value) {
147
+ const o = spec ?? { kind: 'key' };
148
+ switch (o.kind) {
149
+ case 'key':
150
+ return key;
151
+ case 'value':
152
+ return value;
153
+ case 'child': {
154
+ if (value === null || typeof value !== 'object' || Array.isArray(value)) {
155
+ return null;
156
+ }
157
+ // Path may be a slash-separated dotted path (`'profile/name'`).
158
+ const segs = o.path.split('/').filter((s) => s.length > 0);
159
+ let cur = value;
160
+ for (const s of segs) {
161
+ if (cur === null || typeof cur !== 'object' || Array.isArray(cur))
162
+ return null;
163
+ cur = cur[s] ?? null;
164
+ }
165
+ return cur;
166
+ }
167
+ }
168
+ }
169
+ /**
170
+ * Run a {@link QuerySpec} against the data at a path. The caller passes
171
+ * the raw value at the path (a `Record<string, JsonValue>` if it's a
172
+ * collection, anything else → empty result).
173
+ *
174
+ * Returns an ordered, filtered, limited list of rows.
175
+ */
176
+ export function executeQuery(pathData, spec) {
177
+ // Non-collection input → no rows. RTDB's `query()` on a primitive
178
+ // path returns an empty snapshot.
179
+ if (pathData === null || typeof pathData !== 'object' || Array.isArray(pathData)) {
180
+ return [];
181
+ }
182
+ const obj = pathData;
183
+ // Enumerate immediate children only — RTDB's query model is one-level.
184
+ let rows = Object.entries(obj).map(([key, value]) => ({ key, value }));
185
+ // ─── 1. Order ─────────────────────────────────────────────────────
186
+ const orderingByKey = (spec.orderBy ?? { kind: 'key' }).kind === 'key';
187
+ rows.sort((a, b) => {
188
+ if (orderingByKey) {
189
+ // `orderByKey` compares keys under RTDB's nameCompare directly
190
+ // (numeric-keys-first) — there's no separate tie-break.
191
+ return nameCompare(a.key, b.key);
192
+ }
193
+ const va = extractOrderValue(spec.orderBy, a.key, a.value);
194
+ const vb = extractOrderValue(spec.orderBy, b.key, b.value);
195
+ const cmp = compareValues(va, vb);
196
+ if (cmp !== 0)
197
+ return cmp;
198
+ // Tie-break by key under nameCompare (RTDB's documented behavior —
199
+ // orderByChild / orderByValue ties break by key, numeric-first).
200
+ return nameCompare(a.key, b.key);
201
+ });
202
+ // ─── 2. Bounds ────────────────────────────────────────────────────
203
+ for (const b of spec.bounds) {
204
+ rows = rows.filter((row) => boundMatches(b, row, spec.orderBy));
205
+ }
206
+ // ─── 3. Limit ─────────────────────────────────────────────────────
207
+ if (spec.limit) {
208
+ const n = spec.limit.n;
209
+ if (spec.limit.kind === 'limitToFirst') {
210
+ rows = rows.slice(0, n);
211
+ }
212
+ else {
213
+ rows = n >= rows.length ? rows : rows.slice(rows.length - n);
214
+ }
215
+ }
216
+ return rows;
217
+ }
218
+ /**
219
+ * Does `row` pass the bound `b` under the active ordering?
220
+ *
221
+ * The bound's `value` is compared against the row's `extractOrderValue`.
222
+ * The optional `key` arg (for `startAt(value, key)`) is a tie-breaker
223
+ * for matching rows whose ordered-value equals `value` — the row passes
224
+ * only if its key is also at-or-past the supplied key.
225
+ */
226
+ function boundMatches(b, row, orderBy) {
227
+ const orderingByKey = (orderBy ?? { kind: 'key' }).kind === 'key';
228
+ // Under `orderByKey`, the bound's `value` IS the comparison key and is
229
+ // compared with nameCompare (numeric-first), NOT the value type-order.
230
+ // Under value/child ordering, compare the ordered value, then break
231
+ // ties on the key with nameCompare.
232
+ const cmp = orderingByKey
233
+ ? nameCompare(row.key, String(b.value))
234
+ : compareValues(extractOrderValue(orderBy, row.key, row.value), b.value);
235
+ const keyCmp = (other) => nameCompare(row.key, other);
236
+ switch (b.kind) {
237
+ case 'startAt':
238
+ if (cmp > 0)
239
+ return true;
240
+ if (cmp < 0)
241
+ return false;
242
+ // Equal: defer to optional key tie-breaker.
243
+ return b.key === undefined || keyCmp(b.key) >= 0;
244
+ case 'startAfter':
245
+ if (cmp > 0)
246
+ return true;
247
+ if (cmp < 0)
248
+ return false;
249
+ // Equal: row passes only if key strictly past the tie-breaker.
250
+ return b.key === undefined ? false : keyCmp(b.key) > 0;
251
+ case 'endAt':
252
+ if (cmp < 0)
253
+ return true;
254
+ if (cmp > 0)
255
+ return false;
256
+ return b.key === undefined || keyCmp(b.key) <= 0;
257
+ case 'endBefore':
258
+ if (cmp < 0)
259
+ return true;
260
+ if (cmp > 0)
261
+ return false;
262
+ return b.key === undefined ? false : keyCmp(b.key) < 0;
263
+ case 'equalTo':
264
+ if (cmp !== 0)
265
+ return false;
266
+ return b.key === undefined || keyCmp(b.key) === 0;
267
+ }
268
+ }
269
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/database/sandbox/query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import type { AuthState } from 'pyric/sandbox';
2
+ /**
3
+ * Plain-Error denial constructor. Matches the oracle observation: the
4
+ * thrown value's `.name === 'Error'`, `.constructor.name === 'Error'`,
5
+ * `.code === 'PERMISSION_DENIED'`, `.message === 'PERMISSION_DENIED: Permission denied'`.
6
+ *
7
+ * Using a one-off constructor instead of a subclass keeps
8
+ * `error.constructor.name === 'Error'` — which is what the live
9
+ * `firebase/database` SDK does. A `class PermissionDeniedError extends Error`
10
+ * would leak its name and break the oracle's shape claim.
11
+ */
12
+ export declare function permissionDenied(): Error;
13
+ /**
14
+ * Wrapper around the existing `SimulateHandler` that:
15
+ * - parses freshly-deployed rules JSON into an IR (cached per
16
+ * `RulesEvaluator` instance);
17
+ * - exposes a `check(op, path, auth, mockData?, newData?)` that
18
+ * returns `'allow' | 'deny' | 'no-rule'`.
19
+ *
20
+ * `'no-rule'` is treated as deny by callers in the user-mode path,
21
+ * matching RTDB's implicit-deny default ("nothing matched → no
22
+ * permission"). The wrapper itself stays neutral so admin-mode callers
23
+ * (which bypass rules entirely) can use a different fold.
24
+ */
25
+ export type RuleCheck = 'allow' | 'deny' | 'no-rule';
26
+ export interface RuleEvaluationDetails {
27
+ check: RuleCheck;
28
+ reasons: string[];
29
+ matchedPath?: string;
30
+ matchedRule?: string;
31
+ reason?: string;
32
+ pathVariableBindings?: Record<string, string>;
33
+ errorCode?: string;
34
+ errorMessage?: string;
35
+ }
36
+ export interface EvalContext {
37
+ /** Identity for `request.auth`. `null` is anonymous. */
38
+ auth: AuthState;
39
+ /** Snapshot the rules engine sees as `data` / `root.child(...)`.
40
+ * Pass the current tree (or a relevant subtree); the simulator
41
+ * walks via path-relative lookups. */
42
+ mockData: Record<string, unknown>;
43
+ /** Proposed value at `path` for write/validate ops. Ignored for read. */
44
+ newData?: unknown;
45
+ }
46
+ export declare class RulesEvaluator {
47
+ private ir;
48
+ private readonly handler;
49
+ /** Replace the deployed rules. `null` clears (sandbox returns to
50
+ * default-allow). */
51
+ setRules(rulesJson: {
52
+ rules: Record<string, unknown>;
53
+ } | null): void;
54
+ /** True when rules have been deployed via `setRules`. */
55
+ hasRules(): boolean;
56
+ /**
57
+ * Evaluate one op. Default-allow when no rules are loaded.
58
+ *
59
+ * Errors from the underlying simulator (grammar mismatches, etc.)
60
+ * surface as `'no-rule'` — they're treated as deny by user-mode
61
+ * callers, which is the safe default for "we couldn't decide". The
62
+ * simulator already returns success-shaped results for true/false
63
+ * outcomes; failures here mean we genuinely can't reason about the
64
+ * rule.
65
+ */
66
+ check(operation: 'read' | 'write' | 'validate', path: string, ctx: EvalContext): RuleCheck;
67
+ evaluate(operation: 'read' | 'write' | 'validate', path: string, ctx: EvalContext): RuleEvaluationDetails;
68
+ }
69
+ //# sourceMappingURL=rules-eval.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules-eval.d.ts","sourceRoot":"","sources":["../../../src/database/sandbox/rules-eval.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/C;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,IAAI,KAAK,CAIxC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AAErD,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,wDAAwD;IACxD,IAAI,EAAE,SAAS,CAAC;IAChB;;2CAEuC;IACvC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,yEAAyE;IACzE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAAuB;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IAEjD;0BACsB;IACtB,QAAQ,CAAC,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,IAAI,GAAG,IAAI;IAUpE,yDAAyD;IACzD,QAAQ,IAAI,OAAO;IAInB;;;;;;;;;OASG;IACH,KAAK,CACH,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,EACxC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,WAAW,GACf,SAAS;IAIZ,QAAQ,CACN,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,EACxC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,WAAW,GACf,qBAAqB;CAqDzB"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * RTDB rules evaluation — adapter from the modular SDK's sandbox
3
+ * backend to `@pyric/rtdb`'s existing simulator.
4
+ *
5
+ * The hard part of an RTDB sandbox is the rules engine; the package
6
+ * already ships one (`SimulateHandler` + the Ohm grammar). This module
7
+ * is the thin glue that lets a path-based read / write op consult that
8
+ * engine without the modular backend needing to know about IR shapes.
9
+ *
10
+ * Permission semantics mirror the empirical oracle observations
11
+ * (`rtdb-rules-denied-error-code.json`):
12
+ * - On denial: throw a plain `Error` (NOT a `FirebaseError`).
13
+ * - `.code === 'PERMISSION_DENIED'` (uppercase snake-case — distinct
14
+ * from Firestore's lowercase `'permission-denied'`).
15
+ * - `.message === 'PERMISSION_DENIED: Permission denied'`.
16
+ *
17
+ * Default-allow stance: if no rules have been deployed, every operation
18
+ * is permitted. Matches the live RTDB default for projects whose rules
19
+ * have never been written (the console's "Start in test mode" template
20
+ * is `{ ".read": "auth != null", ".write": "auth != null" }`; an
21
+ * unconfigured DB allows everything until rules deploy).
22
+ */
23
+ import { RtdbMapper } from '../mapper.js';
24
+ import { SimulateHandler } from '../simulation/handler.js';
25
+ /**
26
+ * Plain-Error denial constructor. Matches the oracle observation: the
27
+ * thrown value's `.name === 'Error'`, `.constructor.name === 'Error'`,
28
+ * `.code === 'PERMISSION_DENIED'`, `.message === 'PERMISSION_DENIED: Permission denied'`.
29
+ *
30
+ * Using a one-off constructor instead of a subclass keeps
31
+ * `error.constructor.name === 'Error'` — which is what the live
32
+ * `firebase/database` SDK does. A `class PermissionDeniedError extends Error`
33
+ * would leak its name and break the oracle's shape claim.
34
+ */
35
+ export function permissionDenied() {
36
+ const err = new Error('PERMISSION_DENIED: Permission denied');
37
+ err.code = 'PERMISSION_DENIED';
38
+ return err;
39
+ }
40
+ export class RulesEvaluator {
41
+ ir = null;
42
+ handler = new SimulateHandler();
43
+ /** Replace the deployed rules. `null` clears (sandbox returns to
44
+ * default-allow). */
45
+ setRules(rulesJson) {
46
+ if (rulesJson === null) {
47
+ this.ir = null;
48
+ return;
49
+ }
50
+ // shallowData is irrelevant here — used only by the IR for crawl
51
+ // metadata. Pass null so we don't synthesize fake-exists flags.
52
+ this.ir = RtdbMapper.mapToIR(rulesJson, null, 'sandbox://rtdb');
53
+ }
54
+ /** True when rules have been deployed via `setRules`. */
55
+ hasRules() {
56
+ return this.ir !== null;
57
+ }
58
+ /**
59
+ * Evaluate one op. Default-allow when no rules are loaded.
60
+ *
61
+ * Errors from the underlying simulator (grammar mismatches, etc.)
62
+ * surface as `'no-rule'` — they're treated as deny by user-mode
63
+ * callers, which is the safe default for "we couldn't decide". The
64
+ * simulator already returns success-shaped results for true/false
65
+ * outcomes; failures here mean we genuinely can't reason about the
66
+ * rule.
67
+ */
68
+ check(operation, path, ctx) {
69
+ return this.evaluate(operation, path, ctx).check;
70
+ }
71
+ evaluate(operation, path, ctx) {
72
+ if (this.ir === null) {
73
+ return {
74
+ check: 'allow',
75
+ reasons: ['No RTDB rules loaded; default allow.'],
76
+ };
77
+ }
78
+ // The simulator's SimulationInputSchema requires `auth` to be
79
+ // either `null` or `{ uid: string, token: Record<string, unknown> }` —
80
+ // `token` is mandatory, not optional. `AuthState` from
81
+ // `pyric/sandbox` makes `token` optional. Normalise here so an
82
+ // auth identity without custom claims (`{ uid: 'alice' }`) still
83
+ // satisfies the schema and the rule sees `auth.token = {}`.
84
+ const normalisedAuth = ctx.auth === null
85
+ ? null
86
+ : { uid: ctx.auth.uid, token: ctx.auth.token ?? {} };
87
+ const result = this.handler.execute(this.ir, {
88
+ operation,
89
+ path: path === '/' ? '/' : path,
90
+ auth: normalisedAuth,
91
+ mockData: ctx.mockData,
92
+ newData: ctx.newData,
93
+ });
94
+ if (!result.success) {
95
+ if (result.error.code === 'NO_MATCHING_RULE') {
96
+ return {
97
+ check: 'no-rule',
98
+ reasons: [result.error.message],
99
+ errorCode: result.error.code,
100
+ errorMessage: result.error.message,
101
+ };
102
+ }
103
+ // INVALID_INPUT / IR_NOT_GENERATED / EVALUATION_ERROR — treat as
104
+ // no-rule (user-mode callers fold to deny).
105
+ return {
106
+ check: 'no-rule',
107
+ reasons: [result.error.message],
108
+ errorCode: result.error.code,
109
+ errorMessage: result.error.message,
110
+ };
111
+ }
112
+ return {
113
+ check: result.data.allowed ? 'allow' : 'deny',
114
+ reasons: [
115
+ `${result.data.matchedPath} ${operation} ${result.data.allowed ? 'ALLOW' : 'DENY'}: ${result.data.reason}`,
116
+ ],
117
+ matchedPath: result.data.matchedPath,
118
+ matchedRule: result.data.matchedRule,
119
+ reason: result.data.reason,
120
+ pathVariableBindings: result.data.pathVariableBindings,
121
+ };
122
+ }
123
+ }
124
+ //# sourceMappingURL=rules-eval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules-eval.js","sourceRoot":"","sources":["../../../src/database/sandbox/rules-eval.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * RTDB-side write sentinels.
3
+ *
4
+ * Production `firebase/database` ships exactly one server-side sentinel
5
+ * for ordinary writes: `serverTimestamp()` returns the shape
6
+ * `{ ".sv": "timestamp" }`. The wire serializer recognises that marker
7
+ * and the server stamps `Date.now()` (epoch ms) into the field. On
8
+ * read-back the client never sees the marker — only the resolved
9
+ * number. Oracle observation
10
+ * `scripts/oracle/observations/rtdb-servertimestamp-resolves.json`
11
+ * confirms the shape.
12
+ *
13
+ * Sandbox match: we recognise the same `{ ".sv": "timestamp" }` marker
14
+ * and resolve it at write time. The marker shape is the cross-target
15
+ * contract — agent code that writes a value built by
16
+ * `import { serverTimestamp } from 'pyric/database'` produces the same
17
+ * literal on either backend.
18
+ */
19
+ export interface ServerTimestampSentinel {
20
+ '.sv': 'timestamp';
21
+ }
22
+ /**
23
+ * The `increment(delta)` sentinel — `{ ".sv": { "increment": delta } }`.
24
+ * Resolves to `current + delta` server-side, starting from `0` when the
25
+ * field is absent or non-numeric. Mirrors upstream
26
+ * `api/ServerValue.ts:38-44` + oracle
27
+ * `rtdb-modular-increment-from-missing.json` (`startsFromZero: true`).
28
+ */
29
+ export interface IncrementSentinel {
30
+ '.sv': {
31
+ increment: number;
32
+ };
33
+ }
34
+ /** True when `v` is the `{ ".sv": "timestamp" }` server-timestamp marker. */
35
+ export declare function isServerTimestampSentinel(v: unknown): v is ServerTimestampSentinel;
36
+ /** True when `v` is the `{ ".sv": { increment: n } }` increment marker. */
37
+ export declare function isIncrementSentinel(v: unknown): v is IncrementSentinel;
38
+ /**
39
+ * Walk the value tree, replacing every server-side sentinel:
40
+ * - `serverTimestamp()` → `now` (epoch ms).
41
+ * - `increment(delta)` → `current + delta` at the corresponding path
42
+ * (`0` when the current value is absent / non-numeric — DB-GAP).
43
+ *
44
+ * Returns a fresh tree — input is left untouched. `current` is the value
45
+ * presently stored at the SAME path as `value`; it's walked in parallel
46
+ * so each nested `increment` resolves against its own field's prior
47
+ * value. Pass `undefined`/`null` when there's nothing stored.
48
+ *
49
+ * Used by the sandbox backend at every write boundary (`set`, `update`,
50
+ * `push`). Multi-path `update({ '/a': sentinel, '/b': { nested: sentinel } })`
51
+ * is handled by the caller calling this per-path with that path's prior
52
+ * value.
53
+ */
54
+ export declare function resolveSentinels(value: unknown, now: number, current?: unknown): unknown;
55
+ /**
56
+ * Factory used by the modular SDK's `serverTimestamp()` export. Returns
57
+ * the same `{ ".sv": "timestamp" }` shape `firebase/database` emits so
58
+ * the prod target's wire encoder accepts it unchanged.
59
+ */
60
+ export declare function serverTimestampSentinel(): ServerTimestampSentinel;
61
+ /**
62
+ * Factory used by the modular SDK's `increment(delta)` export. Returns
63
+ * the same `{ ".sv": { increment: delta } }` shape `firebase/database`
64
+ * emits so the prod target's wire encoder accepts it unchanged.
65
+ */
66
+ export declare function incrementSentinel(delta: number): IncrementSentinel;
67
+ /** Debug-only — for assertions/tests. */
68
+ export declare const SENTINEL_DEBUG: {
69
+ SERVER_TIMESTAMP_MARKER: string;
70
+ };
71
+ //# sourceMappingURL=sentinels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sentinels.d.ts","sourceRoot":"","sources":["../../../src/database/sandbox/sentinels.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,WAAW,CAAC;CACpB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9B;AAED,6EAA6E;AAC7E,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,uBAAuB,CAIlF;AAED,2EAA2E;AAC3E,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,iBAAiB,CAQtE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAsBxF;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,uBAAuB,CAEjE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,CAElE;AAED,yCAAyC;AACzC,eAAO,MAAM,cAAc;;CAA8B,CAAC"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * RTDB-side write sentinels.
3
+ *
4
+ * Production `firebase/database` ships exactly one server-side sentinel
5
+ * for ordinary writes: `serverTimestamp()` returns the shape
6
+ * `{ ".sv": "timestamp" }`. The wire serializer recognises that marker
7
+ * and the server stamps `Date.now()` (epoch ms) into the field. On
8
+ * read-back the client never sees the marker — only the resolved
9
+ * number. Oracle observation
10
+ * `scripts/oracle/observations/rtdb-servertimestamp-resolves.json`
11
+ * confirms the shape.
12
+ *
13
+ * Sandbox match: we recognise the same `{ ".sv": "timestamp" }` marker
14
+ * and resolve it at write time. The marker shape is the cross-target
15
+ * contract — agent code that writes a value built by
16
+ * `import { serverTimestamp } from 'pyric/database'` produces the same
17
+ * literal on either backend.
18
+ */
19
+ const SERVER_TIMESTAMP_MARKER = '{".sv":"timestamp"}';
20
+ /** True when `v` is the `{ ".sv": "timestamp" }` server-timestamp marker. */
21
+ export function isServerTimestampSentinel(v) {
22
+ if (v === null || typeof v !== 'object')
23
+ return false;
24
+ const obj = v;
25
+ return obj['.sv'] === 'timestamp';
26
+ }
27
+ /** True when `v` is the `{ ".sv": { increment: n } }` increment marker. */
28
+ export function isIncrementSentinel(v) {
29
+ if (v === null || typeof v !== 'object')
30
+ return false;
31
+ const sv = v['.sv'];
32
+ return (sv !== null &&
33
+ typeof sv === 'object' &&
34
+ typeof sv.increment === 'number');
35
+ }
36
+ /**
37
+ * Walk the value tree, replacing every server-side sentinel:
38
+ * - `serverTimestamp()` → `now` (epoch ms).
39
+ * - `increment(delta)` → `current + delta` at the corresponding path
40
+ * (`0` when the current value is absent / non-numeric — DB-GAP).
41
+ *
42
+ * Returns a fresh tree — input is left untouched. `current` is the value
43
+ * presently stored at the SAME path as `value`; it's walked in parallel
44
+ * so each nested `increment` resolves against its own field's prior
45
+ * value. Pass `undefined`/`null` when there's nothing stored.
46
+ *
47
+ * Used by the sandbox backend at every write boundary (`set`, `update`,
48
+ * `push`). Multi-path `update({ '/a': sentinel, '/b': { nested: sentinel } })`
49
+ * is handled by the caller calling this per-path with that path's prior
50
+ * value.
51
+ */
52
+ export function resolveSentinels(value, now, current) {
53
+ if (isServerTimestampSentinel(value))
54
+ return now;
55
+ if (isIncrementSentinel(value)) {
56
+ const delta = value['.sv'].increment;
57
+ const base = typeof current === 'number' ? current : 0;
58
+ return base + delta;
59
+ }
60
+ if (value === null || typeof value !== 'object')
61
+ return value;
62
+ if (Array.isArray(value)) {
63
+ return value.map((v, i) => resolveSentinels(v, now, Array.isArray(current) ? current[i] : undefined));
64
+ }
65
+ const curObj = current !== null && typeof current === 'object' && !Array.isArray(current)
66
+ ? current
67
+ : undefined;
68
+ const out = {};
69
+ for (const [k, v] of Object.entries(value)) {
70
+ out[k] = resolveSentinels(v, now, curObj ? curObj[k] : undefined);
71
+ }
72
+ return out;
73
+ }
74
+ /**
75
+ * Factory used by the modular SDK's `serverTimestamp()` export. Returns
76
+ * the same `{ ".sv": "timestamp" }` shape `firebase/database` emits so
77
+ * the prod target's wire encoder accepts it unchanged.
78
+ */
79
+ export function serverTimestampSentinel() {
80
+ return { '.sv': 'timestamp' };
81
+ }
82
+ /**
83
+ * Factory used by the modular SDK's `increment(delta)` export. Returns
84
+ * the same `{ ".sv": { increment: delta } }` shape `firebase/database`
85
+ * emits so the prod target's wire encoder accepts it unchanged.
86
+ */
87
+ export function incrementSentinel(delta) {
88
+ return { '.sv': { increment: delta } };
89
+ }
90
+ /** Debug-only — for assertions/tests. */
91
+ export const SENTINEL_DEBUG = { SERVER_TIMESTAMP_MARKER };
92
+ //# sourceMappingURL=sentinels.js.map