pyric 0.0.1 → 0.1.0-alpha.8

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 (787) hide show
  1. package/README.md +138 -2
  2. package/README.md.orig +54 -0
  3. package/dist/app/index.d.ts +81 -0
  4. package/dist/app/index.d.ts.map +1 -0
  5. package/dist/app/index.js +78 -0
  6. package/dist/app/index.js.map +1 -0
  7. package/dist/auth/index.d.ts +346 -0
  8. package/dist/auth/index.d.ts.map +1 -0
  9. package/dist/auth/index.js +701 -0
  10. package/dist/auth/index.js.map +1 -0
  11. package/dist/auth/prod-backend.d.ts +39 -0
  12. package/dist/auth/prod-backend.d.ts.map +1 -0
  13. package/dist/auth/prod-backend.js +179 -0
  14. package/dist/auth/prod-backend.js.map +1 -0
  15. package/dist/auth/providers.d.ts +107 -0
  16. package/dist/auth/providers.d.ts.map +1 -0
  17. package/dist/auth/providers.js +138 -0
  18. package/dist/auth/providers.js.map +1 -0
  19. package/dist/auth/sandbox-backend.d.ts +769 -0
  20. package/dist/auth/sandbox-backend.d.ts.map +1 -0
  21. package/dist/auth/sandbox-backend.js +1598 -0
  22. package/dist/auth/sandbox-backend.js.map +1 -0
  23. package/dist/auth/target.d.ts +40 -0
  24. package/dist/auth/target.d.ts.map +1 -0
  25. package/dist/auth/target.js +28 -0
  26. package/dist/auth/target.js.map +1 -0
  27. package/dist/auth/types.d.ts +252 -0
  28. package/dist/auth/types.d.ts.map +1 -0
  29. package/dist/auth/types.js +26 -0
  30. package/dist/auth/types.js.map +1 -0
  31. package/dist/database/constraints/atoms.d.ts +29 -0
  32. package/dist/database/constraints/atoms.d.ts.map +1 -0
  33. package/dist/database/constraints/atoms.js +43 -0
  34. package/dist/database/constraints/atoms.js.map +1 -0
  35. package/dist/database/constraints/compose.d.ts +16 -0
  36. package/dist/database/constraints/compose.d.ts.map +1 -0
  37. package/dist/database/constraints/compose.js +15 -0
  38. package/dist/database/constraints/compose.js.map +1 -0
  39. package/dist/database/constraints/data.d.ts +30 -0
  40. package/dist/database/constraints/data.d.ts.map +1 -0
  41. package/dist/database/constraints/data.js +46 -0
  42. package/dist/database/constraints/data.js.map +1 -0
  43. package/dist/database/constraints/document.d.ts +42 -0
  44. package/dist/database/constraints/document.d.ts.map +1 -0
  45. package/dist/database/constraints/document.js +86 -0
  46. package/dist/database/constraints/document.js.map +1 -0
  47. package/dist/database/constraints/game.d.ts +30 -0
  48. package/dist/database/constraints/game.d.ts.map +1 -0
  49. package/dist/database/constraints/game.js +49 -0
  50. package/dist/database/constraints/game.js.map +1 -0
  51. package/dist/database/constraints/index.d.ts +12 -0
  52. package/dist/database/constraints/index.d.ts.map +1 -0
  53. package/dist/database/constraints/index.js +9 -0
  54. package/dist/database/constraints/index.js.map +1 -0
  55. package/dist/database/constraints/policies.d.ts +16 -0
  56. package/dist/database/constraints/policies.d.ts.map +1 -0
  57. package/dist/database/constraints/policies.js +17 -0
  58. package/dist/database/constraints/policies.js.map +1 -0
  59. package/dist/database/constraints/ruleset.d.ts +5 -0
  60. package/dist/database/constraints/ruleset.d.ts.map +1 -0
  61. package/dist/database/constraints/ruleset.js +132 -0
  62. package/dist/database/constraints/ruleset.js.map +1 -0
  63. package/dist/database/constraints/schema.d.ts +17 -0
  64. package/dist/database/constraints/schema.d.ts.map +1 -0
  65. package/dist/database/constraints/schema.js +74 -0
  66. package/dist/database/constraints/schema.js.map +1 -0
  67. package/dist/database/constraints/types.d.ts +22 -0
  68. package/dist/database/constraints/types.d.ts.map +1 -0
  69. package/dist/database/constraints/types.js +2 -0
  70. package/dist/database/constraints/types.js.map +1 -0
  71. package/dist/database/crawl/handler.d.ts +7 -0
  72. package/dist/database/crawl/handler.d.ts.map +1 -0
  73. package/dist/database/crawl/handler.js +91 -0
  74. package/dist/database/crawl/handler.js.map +1 -0
  75. package/dist/database/crawl/semaphore.d.ts +9 -0
  76. package/dist/database/crawl/semaphore.d.ts.map +1 -0
  77. package/dist/database/crawl/semaphore.js +27 -0
  78. package/dist/database/crawl/semaphore.js.map +1 -0
  79. package/dist/database/crawl/spec.d.ts +33 -0
  80. package/dist/database/crawl/spec.d.ts.map +1 -0
  81. package/dist/database/crawl/spec.js +12 -0
  82. package/dist/database/crawl/spec.js.map +1 -0
  83. package/dist/database/data/handler.d.ts +9 -0
  84. package/dist/database/data/handler.d.ts.map +1 -0
  85. package/dist/database/data/handler.js +96 -0
  86. package/dist/database/data/handler.js.map +1 -0
  87. package/dist/database/data/spec.d.ts +77 -0
  88. package/dist/database/data/spec.d.ts.map +1 -0
  89. package/dist/database/data/spec.js +17 -0
  90. package/dist/database/data/spec.js.map +1 -0
  91. package/dist/database/data/validated.d.ts +8 -0
  92. package/dist/database/data/validated.d.ts.map +1 -0
  93. package/dist/database/data/validated.js +99 -0
  94. package/dist/database/data/validated.js.map +1 -0
  95. package/dist/database/grammar/RtdbExpr.ohm +98 -0
  96. package/dist/database/grammar/RtdbExpr.ohm.generated.d.ts +2 -0
  97. package/dist/database/grammar/RtdbExpr.ohm.generated.d.ts.map +1 -0
  98. package/dist/database/grammar/RtdbExpr.ohm.generated.js +103 -0
  99. package/dist/database/grammar/RtdbExpr.ohm.generated.js.map +1 -0
  100. package/dist/database/grammar/RtdbExprParser.d.ts +5 -0
  101. package/dist/database/grammar/RtdbExprParser.d.ts.map +1 -0
  102. package/dist/database/grammar/RtdbExprParser.js +53 -0
  103. package/dist/database/grammar/RtdbExprParser.js.map +1 -0
  104. package/dist/database/grammar/linter.d.ts +3 -0
  105. package/dist/database/grammar/linter.d.ts.map +1 -0
  106. package/dist/database/grammar/linter.js +66 -0
  107. package/dist/database/grammar/linter.js.map +1 -0
  108. package/dist/database/grammar/simulator.d.ts +31 -0
  109. package/dist/database/grammar/simulator.d.ts.map +1 -0
  110. package/dist/database/grammar/simulator.js +255 -0
  111. package/dist/database/grammar/simulator.js.map +1 -0
  112. package/dist/database/grammar/validator.d.ts +3 -0
  113. package/dist/database/grammar/validator.d.ts.map +1 -0
  114. package/dist/database/grammar/validator.js +84 -0
  115. package/dist/database/grammar/validator.js.map +1 -0
  116. package/dist/database/host.d.ts +50 -0
  117. package/dist/database/host.d.ts.map +1 -0
  118. package/dist/database/host.js +41 -0
  119. package/dist/database/host.js.map +1 -0
  120. package/dist/database/index.d.ts +40 -0
  121. package/dist/database/index.d.ts.map +1 -0
  122. package/dist/database/index.js +47 -0
  123. package/dist/database/index.js.map +1 -0
  124. package/dist/database/initialize-from-app.d.ts +28 -0
  125. package/dist/database/initialize-from-app.d.ts.map +1 -0
  126. package/dist/database/initialize-from-app.js +23 -0
  127. package/dist/database/initialize-from-app.js.map +1 -0
  128. package/dist/database/ir/handler.d.ts +6 -0
  129. package/dist/database/ir/handler.d.ts.map +1 -0
  130. package/dist/database/ir/handler.js +52 -0
  131. package/dist/database/ir/handler.js.map +1 -0
  132. package/dist/database/ir/spec.d.ts +25 -0
  133. package/dist/database/ir/spec.d.ts.map +1 -0
  134. package/dist/database/ir/spec.js +11 -0
  135. package/dist/database/ir/spec.js.map +1 -0
  136. package/dist/database/mapper.d.ts +9 -0
  137. package/dist/database/mapper.d.ts.map +1 -0
  138. package/dist/database/mapper.js +115 -0
  139. package/dist/database/mapper.js.map +1 -0
  140. package/dist/database/modular.d.ts +604 -0
  141. package/dist/database/modular.d.ts.map +1 -0
  142. package/dist/database/modular.js +1226 -0
  143. package/dist/database/modular.js.map +1 -0
  144. package/dist/database/replay.d.ts +33 -0
  145. package/dist/database/replay.d.ts.map +1 -0
  146. package/dist/database/replay.js +124 -0
  147. package/dist/database/replay.js.map +1 -0
  148. package/dist/database/resolver.d.ts +4 -0
  149. package/dist/database/resolver.d.ts.map +1 -0
  150. package/dist/database/resolver.js +66 -0
  151. package/dist/database/resolver.js.map +1 -0
  152. package/dist/database/sandbox/backend.d.ts +403 -0
  153. package/dist/database/sandbox/backend.d.ts.map +1 -0
  154. package/dist/database/sandbox/backend.js +1467 -0
  155. package/dist/database/sandbox/backend.js.map +1 -0
  156. package/dist/database/sandbox/data-tree.d.ts +123 -0
  157. package/dist/database/sandbox/data-tree.d.ts.map +1 -0
  158. package/dist/database/sandbox/data-tree.js +310 -0
  159. package/dist/database/sandbox/data-tree.js.map +1 -0
  160. package/dist/database/sandbox/normalize.d.ts +77 -0
  161. package/dist/database/sandbox/normalize.d.ts.map +1 -0
  162. package/dist/database/sandbox/normalize.js +165 -0
  163. package/dist/database/sandbox/normalize.js.map +1 -0
  164. package/dist/database/sandbox/push-id.d.ts +32 -0
  165. package/dist/database/sandbox/push-id.d.ts.map +1 -0
  166. package/dist/database/sandbox/push-id.js +82 -0
  167. package/dist/database/sandbox/push-id.js.map +1 -0
  168. package/dist/database/sandbox/query.d.ts +175 -0
  169. package/dist/database/sandbox/query.d.ts.map +1 -0
  170. package/dist/database/sandbox/query.js +269 -0
  171. package/dist/database/sandbox/query.js.map +1 -0
  172. package/dist/database/sandbox/rules-eval.d.ts +69 -0
  173. package/dist/database/sandbox/rules-eval.d.ts.map +1 -0
  174. package/dist/database/sandbox/rules-eval.js +124 -0
  175. package/dist/database/sandbox/rules-eval.js.map +1 -0
  176. package/dist/database/sandbox/sentinels.d.ts +71 -0
  177. package/dist/database/sandbox/sentinels.d.ts.map +1 -0
  178. package/dist/database/sandbox/sentinels.js +92 -0
  179. package/dist/database/sandbox/sentinels.js.map +1 -0
  180. package/dist/database/simulation/handler.d.ts +6 -0
  181. package/dist/database/simulation/handler.d.ts.map +1 -0
  182. package/dist/database/simulation/handler.js +236 -0
  183. package/dist/database/simulation/handler.js.map +1 -0
  184. package/dist/database/simulation/spec.d.ts +69 -0
  185. package/dist/database/simulation/spec.d.ts.map +1 -0
  186. package/dist/database/simulation/spec.js +25 -0
  187. package/dist/database/simulation/spec.js.map +1 -0
  188. package/dist/database/tools.d.ts +22 -0
  189. package/dist/database/tools.d.ts.map +1 -0
  190. package/dist/database/tools.js +272 -0
  191. package/dist/database/tools.js.map +1 -0
  192. package/dist/database/types.d.ts +210 -0
  193. package/dist/database/types.d.ts.map +1 -0
  194. package/dist/database/types.js +26 -0
  195. package/dist/database/types.js.map +1 -0
  196. package/dist/database/write/handler.d.ts +7 -0
  197. package/dist/database/write/handler.d.ts.map +1 -0
  198. package/dist/database/write/handler.js +42 -0
  199. package/dist/database/write/handler.js.map +1 -0
  200. package/dist/database/write/spec.d.ts +18 -0
  201. package/dist/database/write/spec.d.ts.map +1 -0
  202. package/dist/database/write/spec.js +7 -0
  203. package/dist/database/write/spec.js.map +1 -0
  204. package/dist/firestore/index.d.ts +533 -0
  205. package/dist/firestore/index.d.ts.map +1 -0
  206. package/dist/firestore/index.js +1536 -0
  207. package/dist/firestore/index.js.map +1 -0
  208. package/dist/firestore/tools.d.ts +67 -0
  209. package/dist/firestore/tools.d.ts.map +1 -0
  210. package/dist/firestore/tools.js +318 -0
  211. package/dist/firestore/tools.js.map +1 -0
  212. package/dist/firestore-values/index.d.ts +63 -0
  213. package/dist/firestore-values/index.d.ts.map +1 -0
  214. package/dist/firestore-values/index.js +148 -0
  215. package/dist/firestore-values/index.js.map +1 -0
  216. package/dist/project-scope.d.ts +5 -0
  217. package/dist/project-scope.d.ts.map +1 -0
  218. package/dist/project-scope.js +2 -0
  219. package/dist/project-scope.js.map +1 -0
  220. package/dist/rules/extract.d.ts +28 -0
  221. package/dist/rules/extract.d.ts.map +1 -0
  222. package/dist/rules/extract.js +25 -0
  223. package/dist/rules/extract.js.map +1 -0
  224. package/dist/rules/generators/assembler.d.ts +19 -0
  225. package/dist/rules/generators/assembler.d.ts.map +1 -0
  226. package/dist/rules/generators/assembler.js +292 -0
  227. package/dist/rules/generators/assembler.js.map +1 -0
  228. package/dist/rules/generators/expressions.d.ts +52 -0
  229. package/dist/rules/generators/expressions.d.ts.map +1 -0
  230. package/dist/rules/generators/expressions.js +117 -0
  231. package/dist/rules/generators/expressions.js.map +1 -0
  232. package/dist/rules/generators/grid.d.ts +22 -0
  233. package/dist/rules/generators/grid.d.ts.map +1 -0
  234. package/dist/rules/generators/grid.js +52 -0
  235. package/dist/rules/generators/grid.js.map +1 -0
  236. package/dist/rules/grammar/FirestoreAST.d.ts +129 -0
  237. package/dist/rules/grammar/FirestoreAST.d.ts.map +1 -0
  238. package/dist/rules/grammar/FirestoreAST.js +3 -0
  239. package/dist/rules/grammar/FirestoreAST.js.map +1 -0
  240. package/dist/rules/grammar/FirestoreAssembler.d.ts +5 -0
  241. package/dist/rules/grammar/FirestoreAssembler.d.ts.map +1 -0
  242. package/dist/rules/grammar/FirestoreAssembler.js +158 -0
  243. package/dist/rules/grammar/FirestoreAssembler.js.map +1 -0
  244. package/dist/rules/grammar/FirestoreParser.d.ts +46 -0
  245. package/dist/rules/grammar/FirestoreParser.d.ts.map +1 -0
  246. package/dist/rules/grammar/FirestoreParser.js +409 -0
  247. package/dist/rules/grammar/FirestoreParser.js.map +1 -0
  248. package/dist/rules/grammar/FirestoreRules.ohm +229 -0
  249. package/dist/rules/grammar/FirestoreRules.ohm.generated.d.ts +2 -0
  250. package/dist/rules/grammar/FirestoreRules.ohm.generated.d.ts.map +1 -0
  251. package/dist/rules/grammar/FirestoreRules.ohm.generated.js +234 -0
  252. package/dist/rules/grammar/FirestoreRules.ohm.generated.js.map +1 -0
  253. package/dist/rules/grammar/FirestoreValidator.d.ts +10 -0
  254. package/dist/rules/grammar/FirestoreValidator.d.ts.map +1 -0
  255. package/dist/rules/grammar/FirestoreValidator.js +482 -0
  256. package/dist/rules/grammar/FirestoreValidator.js.map +1 -0
  257. package/dist/rules/index.d.ts +67 -0
  258. package/dist/rules/index.d.ts.map +1 -0
  259. package/dist/rules/index.js +80 -0
  260. package/dist/rules/index.js.map +1 -0
  261. package/dist/rules/indexes/extract/annotation-collect.d.ts +42 -0
  262. package/dist/rules/indexes/extract/annotation-collect.d.ts.map +1 -0
  263. package/dist/rules/indexes/extract/annotation-collect.js +69 -0
  264. package/dist/rules/indexes/extract/annotation-collect.js.map +1 -0
  265. package/dist/rules/indexes/extract/annotations.d.ts +50 -0
  266. package/dist/rules/indexes/extract/annotations.d.ts.map +1 -0
  267. package/dist/rules/indexes/extract/annotations.js +144 -0
  268. package/dist/rules/indexes/extract/annotations.js.map +1 -0
  269. package/dist/rules/indexes/extract/ast.d.ts +54 -0
  270. package/dist/rules/indexes/extract/ast.d.ts.map +1 -0
  271. package/dist/rules/indexes/extract/ast.js +119 -0
  272. package/dist/rules/indexes/extract/ast.js.map +1 -0
  273. package/dist/rules/indexes/extract/classify.d.ts +41 -0
  274. package/dist/rules/indexes/extract/classify.d.ts.map +1 -0
  275. package/dist/rules/indexes/extract/classify.js +138 -0
  276. package/dist/rules/indexes/extract/classify.js.map +1 -0
  277. package/dist/rules/indexes/extract/composite.d.ts +38 -0
  278. package/dist/rules/indexes/extract/composite.d.ts.map +1 -0
  279. package/dist/rules/indexes/extract/composite.js +85 -0
  280. package/dist/rules/indexes/extract/composite.js.map +1 -0
  281. package/dist/rules/indexes/extract/dataflow.d.ts +45 -0
  282. package/dist/rules/indexes/extract/dataflow.d.ts.map +1 -0
  283. package/dist/rules/indexes/extract/dataflow.js +200 -0
  284. package/dist/rules/indexes/extract/dataflow.js.map +1 -0
  285. package/dist/rules/indexes/extract/enumerate.d.ts +41 -0
  286. package/dist/rules/indexes/extract/enumerate.d.ts.map +1 -0
  287. package/dist/rules/indexes/extract/enumerate.js +163 -0
  288. package/dist/rules/indexes/extract/enumerate.js.map +1 -0
  289. package/dist/rules/indexes/extract/extractor.d.ts +3 -0
  290. package/dist/rules/indexes/extract/extractor.d.ts.map +1 -0
  291. package/dist/rules/indexes/extract/extractor.js +274 -0
  292. package/dist/rules/indexes/extract/extractor.js.map +1 -0
  293. package/dist/rules/indexes/extract/types.d.ts +211 -0
  294. package/dist/rules/indexes/extract/types.d.ts.map +1 -0
  295. package/dist/rules/indexes/extract/types.js +14 -0
  296. package/dist/rules/indexes/extract/types.js.map +1 -0
  297. package/dist/rules/indexes/extractHandler.d.ts +16 -0
  298. package/dist/rules/indexes/extractHandler.d.ts.map +1 -0
  299. package/dist/rules/indexes/extractHandler.js +100 -0
  300. package/dist/rules/indexes/extractHandler.js.map +1 -0
  301. package/dist/rules/indexes/extractTool.d.ts +15 -0
  302. package/dist/rules/indexes/extractTool.d.ts.map +1 -0
  303. package/dist/rules/indexes/extractTool.js +55 -0
  304. package/dist/rules/indexes/extractTool.js.map +1 -0
  305. package/dist/rules/indexes/types.d.ts +71 -0
  306. package/dist/rules/indexes/types.d.ts.map +1 -0
  307. package/dist/rules/indexes/types.js +15 -0
  308. package/dist/rules/indexes/types.js.map +1 -0
  309. package/dist/rules/inspect/handler.d.ts +6 -0
  310. package/dist/rules/inspect/handler.d.ts.map +1 -0
  311. package/dist/rules/inspect/handler.js +144 -0
  312. package/dist/rules/inspect/handler.js.map +1 -0
  313. package/dist/rules/inspect/spec.d.ts +37 -0
  314. package/dist/rules/inspect/spec.d.ts.map +1 -0
  315. package/dist/rules/inspect/spec.js +2 -0
  316. package/dist/rules/inspect/spec.js.map +1 -0
  317. package/dist/rules/inspect/tools.d.ts +21 -0
  318. package/dist/rules/inspect/tools.d.ts.map +1 -0
  319. package/dist/rules/inspect/tools.js +21 -0
  320. package/dist/rules/inspect/tools.js.map +1 -0
  321. package/dist/rules/linter/ast-utils.d.ts +97 -0
  322. package/dist/rules/linter/ast-utils.d.ts.map +1 -0
  323. package/dist/rules/linter/ast-utils.js +491 -0
  324. package/dist/rules/linter/ast-utils.js.map +1 -0
  325. package/dist/rules/linter/hallucinations.d.ts +34 -0
  326. package/dist/rules/linter/hallucinations.d.ts.map +1 -0
  327. package/dist/rules/linter/hallucinations.js +334 -0
  328. package/dist/rules/linter/hallucinations.js.map +1 -0
  329. package/dist/rules/linter/linter.d.ts +84 -0
  330. package/dist/rules/linter/linter.d.ts.map +1 -0
  331. package/dist/rules/linter/linter.js +784 -0
  332. package/dist/rules/linter/linter.js.map +1 -0
  333. package/dist/rules/modules/resolver-browser.d.ts +41 -0
  334. package/dist/rules/modules/resolver-browser.d.ts.map +1 -0
  335. package/dist/rules/modules/resolver-browser.js +63 -0
  336. package/dist/rules/modules/resolver-browser.js.map +1 -0
  337. package/dist/rules/modules/resolver-core.d.ts +51 -0
  338. package/dist/rules/modules/resolver-core.d.ts.map +1 -0
  339. package/dist/rules/modules/resolver-core.js +338 -0
  340. package/dist/rules/modules/resolver-core.js.map +1 -0
  341. package/dist/rules/modules/resolver.d.ts +17 -0
  342. package/dist/rules/modules/resolver.d.ts.map +1 -0
  343. package/dist/rules/modules/resolver.js +49 -0
  344. package/dist/rules/modules/resolver.js.map +1 -0
  345. package/dist/rules/modules/stdlib/atomic.rules +52 -0
  346. package/dist/rules/modules/stdlib/atomic.test.json +152 -0
  347. package/dist/rules/modules/stdlib/auth.rules +7 -0
  348. package/dist/rules/modules/stdlib/auth.test.json +53 -0
  349. package/dist/rules/modules/stdlib/content.rules +50 -0
  350. package/dist/rules/modules/stdlib/content.test.json +238 -0
  351. package/dist/rules/modules/stdlib/counters.rules +41 -0
  352. package/dist/rules/modules/stdlib/counters.test.json +254 -0
  353. package/dist/rules/modules/stdlib/geometry.rules +43 -0
  354. package/dist/rules/modules/stdlib/geometry.test.json +200 -0
  355. package/dist/rules/modules/stdlib/joining.rules +49 -0
  356. package/dist/rules/modules/stdlib/joining.test.json +287 -0
  357. package/dist/rules/modules/stdlib/lifecycle.rules +51 -0
  358. package/dist/rules/modules/stdlib/lifecycle.test.json +288 -0
  359. package/dist/rules/modules/stdlib/lobby.rules +44 -0
  360. package/dist/rules/modules/stdlib/lobby.test.json +32 -0
  361. package/dist/rules/modules/stdlib/membership.rules +40 -0
  362. package/dist/rules/modules/stdlib/membership.test.json +107 -0
  363. package/dist/rules/modules/stdlib/spaces.rules +46 -0
  364. package/dist/rules/modules/stdlib/spaces.test.json +392 -0
  365. package/dist/rules/modules/stdlib/state.rules +28 -0
  366. package/dist/rules/modules/stdlib/state.test.json +55 -0
  367. package/dist/rules/modules/stdlib/timing.rules +20 -0
  368. package/dist/rules/modules/stdlib/timing.test.json +106 -0
  369. package/dist/rules/modules/stdlib/transitions.rules +34 -0
  370. package/dist/rules/modules/stdlib/transitions.test.json +86 -0
  371. package/dist/rules/modules/stdlib/turns.rules +27 -0
  372. package/dist/rules/modules/stdlib/turns.test.json +64 -0
  373. package/dist/rules/modules/stdlib/validation.rules +31 -0
  374. package/dist/rules/modules/stdlib/validation.test.json +184 -0
  375. package/dist/rules/modules/stdlib-content.d.ts +11 -0
  376. package/dist/rules/modules/stdlib-content.d.ts.map +1 -0
  377. package/dist/rules/modules/stdlib-content.js +590 -0
  378. package/dist/rules/modules/stdlib-content.js.map +1 -0
  379. package/dist/rules/node.d.ts +17 -0
  380. package/dist/rules/node.d.ts.map +1 -0
  381. package/dist/rules/node.js +21 -0
  382. package/dist/rules/node.js.map +1 -0
  383. package/dist/rules/rtdb.d.ts +28 -0
  384. package/dist/rules/rtdb.d.ts.map +1 -0
  385. package/dist/rules/rtdb.js +15 -0
  386. package/dist/rules/rtdb.js.map +1 -0
  387. package/dist/rules/simulator/evaluator.d.ts +179 -0
  388. package/dist/rules/simulator/evaluator.d.ts.map +1 -0
  389. package/dist/rules/simulator/evaluator.js +1221 -0
  390. package/dist/rules/simulator/evaluator.js.map +1 -0
  391. package/dist/rules/simulator/expression/eval-errors.d.ts +86 -0
  392. package/dist/rules/simulator/expression/eval-errors.d.ts.map +1 -0
  393. package/dist/rules/simulator/expression/eval-errors.js +68 -0
  394. package/dist/rules/simulator/expression/eval-errors.js.map +1 -0
  395. package/dist/rules/simulator/expression/evaluator.d.ts +43 -0
  396. package/dist/rules/simulator/expression/evaluator.d.ts.map +1 -0
  397. package/dist/rules/simulator/expression/evaluator.js +298 -0
  398. package/dist/rules/simulator/expression/evaluator.js.map +1 -0
  399. package/dist/rules/simulator/expression/lexer.d.ts +36 -0
  400. package/dist/rules/simulator/expression/lexer.d.ts.map +1 -0
  401. package/dist/rules/simulator/expression/lexer.js +318 -0
  402. package/dist/rules/simulator/expression/lexer.js.map +1 -0
  403. package/dist/rules/simulator/expression/parser.d.ts +39 -0
  404. package/dist/rules/simulator/expression/parser.d.ts.map +1 -0
  405. package/dist/rules/simulator/expression/parser.js +329 -0
  406. package/dist/rules/simulator/expression/parser.js.map +1 -0
  407. package/dist/rules/simulator/expression/types.d.ts +137 -0
  408. package/dist/rules/simulator/expression/types.d.ts.map +1 -0
  409. package/dist/rules/simulator/expression/types.js +90 -0
  410. package/dist/rules/simulator/expression/types.js.map +1 -0
  411. package/dist/rules/simulator/expression/walk-data.d.ts +52 -0
  412. package/dist/rules/simulator/expression/walk-data.d.ts.map +1 -0
  413. package/dist/rules/simulator/expression/walk-data.js +167 -0
  414. package/dist/rules/simulator/expression/walk-data.js.map +1 -0
  415. package/dist/rules/simulator/firestore-set.d.ts +25 -0
  416. package/dist/rules/simulator/firestore-set.d.ts.map +1 -0
  417. package/dist/rules/simulator/firestore-set.js +89 -0
  418. package/dist/rules/simulator/firestore-set.js.map +1 -0
  419. package/dist/rules/simulator/handler.d.ts +36 -0
  420. package/dist/rules/simulator/handler.d.ts.map +1 -0
  421. package/dist/rules/simulator/handler.js +583 -0
  422. package/dist/rules/simulator/handler.js.map +1 -0
  423. package/dist/rules/simulator/mapdiff.d.ts +29 -0
  424. package/dist/rules/simulator/mapdiff.d.ts.map +1 -0
  425. package/dist/rules/simulator/mapdiff.js +72 -0
  426. package/dist/rules/simulator/mapdiff.js.map +1 -0
  427. package/dist/rules/simulator/project-after-state.d.ts +33 -0
  428. package/dist/rules/simulator/project-after-state.d.ts.map +1 -0
  429. package/dist/rules/simulator/project-after-state.js +88 -0
  430. package/dist/rules/simulator/project-after-state.js.map +1 -0
  431. package/dist/rules/simulator/query-proof.d.ts +80 -0
  432. package/dist/rules/simulator/query-proof.d.ts.map +1 -0
  433. package/dist/rules/simulator/query-proof.js +142 -0
  434. package/dist/rules/simulator/query-proof.js.map +1 -0
  435. package/dist/rules/simulator/value-equality.d.ts +8 -0
  436. package/dist/rules/simulator/value-equality.d.ts.map +1 -0
  437. package/dist/rules/simulator/value-equality.js +40 -0
  438. package/dist/rules/simulator/value-equality.js.map +1 -0
  439. package/dist/rules/simulator/wrappers/base.d.ts +129 -0
  440. package/dist/rules/simulator/wrappers/base.d.ts.map +1 -0
  441. package/dist/rules/simulator/wrappers/base.js +90 -0
  442. package/dist/rules/simulator/wrappers/base.js.map +1 -0
  443. package/dist/rules/simulator/wrappers/bytes.d.ts +45 -0
  444. package/dist/rules/simulator/wrappers/bytes.d.ts.map +1 -0
  445. package/dist/rules/simulator/wrappers/bytes.js +130 -0
  446. package/dist/rules/simulator/wrappers/bytes.js.map +1 -0
  447. package/dist/rules/simulator/wrappers/duration.d.ts +76 -0
  448. package/dist/rules/simulator/wrappers/duration.d.ts.map +1 -0
  449. package/dist/rules/simulator/wrappers/duration.js +176 -0
  450. package/dist/rules/simulator/wrappers/duration.js.map +1 -0
  451. package/dist/rules/simulator/wrappers/float.d.ts +52 -0
  452. package/dist/rules/simulator/wrappers/float.d.ts.map +1 -0
  453. package/dist/rules/simulator/wrappers/float.js +88 -0
  454. package/dist/rules/simulator/wrappers/float.js.map +1 -0
  455. package/dist/rules/simulator/wrappers/latlng.d.ts +40 -0
  456. package/dist/rules/simulator/wrappers/latlng.d.ts.map +1 -0
  457. package/dist/rules/simulator/wrappers/latlng.js +100 -0
  458. package/dist/rules/simulator/wrappers/latlng.js.map +1 -0
  459. package/dist/rules/simulator/wrappers/path.d.ts +75 -0
  460. package/dist/rules/simulator/wrappers/path.d.ts.map +1 -0
  461. package/dist/rules/simulator/wrappers/path.js +158 -0
  462. package/dist/rules/simulator/wrappers/path.js.map +1 -0
  463. package/dist/rules/simulator/wrappers/reference.d.ts +82 -0
  464. package/dist/rules/simulator/wrappers/reference.d.ts.map +1 -0
  465. package/dist/rules/simulator/wrappers/reference.js +145 -0
  466. package/dist/rules/simulator/wrappers/reference.js.map +1 -0
  467. package/dist/rules/simulator/wrappers/timestamp.d.ts +86 -0
  468. package/dist/rules/simulator/wrappers/timestamp.d.ts.map +1 -0
  469. package/dist/rules/simulator/wrappers/timestamp.js +207 -0
  470. package/dist/rules/simulator/wrappers/timestamp.js.map +1 -0
  471. package/dist/rules/simulator/wrappers/vector.d.ts +43 -0
  472. package/dist/rules/simulator/wrappers/vector.d.ts.map +1 -0
  473. package/dist/rules/simulator/wrappers/vector.js +80 -0
  474. package/dist/rules/simulator/wrappers/vector.js.map +1 -0
  475. package/dist/rules/simulator-tools-impl.d.ts +64 -0
  476. package/dist/rules/simulator-tools-impl.d.ts.map +1 -0
  477. package/dist/rules/simulator-tools-impl.js +462 -0
  478. package/dist/rules/simulator-tools-impl.js.map +1 -0
  479. package/dist/rules/simulator.d.ts +20 -0
  480. package/dist/rules/simulator.d.ts.map +1 -0
  481. package/dist/rules/simulator.js +24 -0
  482. package/dist/rules/simulator.js.map +1 -0
  483. package/dist/rules/stdlib-modules.d.ts +73 -0
  484. package/dist/rules/stdlib-modules.d.ts.map +1 -0
  485. package/dist/rules/stdlib-modules.js +849 -0
  486. package/dist/rules/stdlib-modules.js.map +1 -0
  487. package/dist/rules/stdlib-tools.d.ts +19 -0
  488. package/dist/rules/stdlib-tools.d.ts.map +1 -0
  489. package/dist/rules/stdlib-tools.js +164 -0
  490. package/dist/rules/stdlib-tools.js.map +1 -0
  491. package/dist/rules/test/handler.d.ts +9 -0
  492. package/dist/rules/test/handler.d.ts.map +1 -0
  493. package/dist/rules/test/handler.js +124 -0
  494. package/dist/rules/test/handler.js.map +1 -0
  495. package/dist/rules/test/spec.d.ts +517 -0
  496. package/dist/rules/test/spec.d.ts.map +1 -0
  497. package/dist/rules/test/spec.js +227 -0
  498. package/dist/rules/test/spec.js.map +1 -0
  499. package/dist/rules/tools.d.ts +41 -0
  500. package/dist/rules/tools.d.ts.map +1 -0
  501. package/dist/rules/tools.js +124 -0
  502. package/dist/rules/tools.js.map +1 -0
  503. package/dist/rules/write/handler.d.ts +6 -0
  504. package/dist/rules/write/handler.d.ts.map +1 -0
  505. package/dist/rules/write/handler.js +126 -0
  506. package/dist/rules/write/handler.js.map +1 -0
  507. package/dist/rules/write/spec.d.ts +28 -0
  508. package/dist/rules/write/spec.d.ts.map +1 -0
  509. package/dist/rules/write/spec.js +2 -0
  510. package/dist/rules/write/spec.js.map +1 -0
  511. package/dist/sandbox/admin-compat.d.ts +20 -0
  512. package/dist/sandbox/admin-compat.d.ts.map +1 -0
  513. package/dist/sandbox/admin-compat.js +19 -0
  514. package/dist/sandbox/admin-compat.js.map +1 -0
  515. package/dist/sandbox/admin-firestore/error-translation.d.ts +86 -0
  516. package/dist/sandbox/admin-firestore/error-translation.d.ts.map +1 -0
  517. package/dist/sandbox/admin-firestore/error-translation.js +204 -0
  518. package/dist/sandbox/admin-firestore/error-translation.js.map +1 -0
  519. package/dist/sandbox/admin-firestore/index.d.ts +169 -0
  520. package/dist/sandbox/admin-firestore/index.d.ts.map +1 -0
  521. package/dist/sandbox/admin-firestore/index.js +456 -0
  522. package/dist/sandbox/admin-firestore/index.js.map +1 -0
  523. package/dist/sandbox/admin-firestore/remote.d.ts +97 -0
  524. package/dist/sandbox/admin-firestore/remote.d.ts.map +1 -0
  525. package/dist/sandbox/admin-firestore/remote.js +735 -0
  526. package/dist/sandbox/admin-firestore/remote.js.map +1 -0
  527. package/dist/sandbox/branches/index.d.ts +141 -0
  528. package/dist/sandbox/branches/index.d.ts.map +1 -0
  529. package/dist/sandbox/branches/index.js +327 -0
  530. package/dist/sandbox/branches/index.js.map +1 -0
  531. package/dist/sandbox/firestore/admin-compat/batch.d.ts +34 -0
  532. package/dist/sandbox/firestore/admin-compat/batch.d.ts.map +1 -0
  533. package/dist/sandbox/firestore/admin-compat/batch.js +73 -0
  534. package/dist/sandbox/firestore/admin-compat/batch.js.map +1 -0
  535. package/dist/sandbox/firestore/admin-compat/doc-ref.d.ts +38 -0
  536. package/dist/sandbox/firestore/admin-compat/doc-ref.d.ts.map +1 -0
  537. package/dist/sandbox/firestore/admin-compat/doc-ref.js +154 -0
  538. package/dist/sandbox/firestore/admin-compat/doc-ref.js.map +1 -0
  539. package/dist/sandbox/firestore/admin-compat/firestore.d.ts +45 -0
  540. package/dist/sandbox/firestore/admin-compat/firestore.d.ts.map +1 -0
  541. package/dist/sandbox/firestore/admin-compat/firestore.js +114 -0
  542. package/dist/sandbox/firestore/admin-compat/firestore.js.map +1 -0
  543. package/dist/sandbox/firestore/admin-compat/index.d.ts +45 -0
  544. package/dist/sandbox/firestore/admin-compat/index.d.ts.map +1 -0
  545. package/dist/sandbox/firestore/admin-compat/index.js +27 -0
  546. package/dist/sandbox/firestore/admin-compat/index.js.map +1 -0
  547. package/dist/sandbox/firestore/admin-compat/paths.d.ts +37 -0
  548. package/dist/sandbox/firestore/admin-compat/paths.d.ts.map +1 -0
  549. package/dist/sandbox/firestore/admin-compat/paths.js +49 -0
  550. package/dist/sandbox/firestore/admin-compat/paths.js.map +1 -0
  551. package/dist/sandbox/firestore/admin-compat/query.d.ts +261 -0
  552. package/dist/sandbox/firestore/admin-compat/query.d.ts.map +1 -0
  553. package/dist/sandbox/firestore/admin-compat/query.js +704 -0
  554. package/dist/sandbox/firestore/admin-compat/query.js.map +1 -0
  555. package/dist/sandbox/firestore/admin-compat/read-translation.d.ts +8 -0
  556. package/dist/sandbox/firestore/admin-compat/read-translation.d.ts.map +1 -0
  557. package/dist/sandbox/firestore/admin-compat/read-translation.js +59 -0
  558. package/dist/sandbox/firestore/admin-compat/read-translation.js.map +1 -0
  559. package/dist/sandbox/firestore/admin-compat/snapshots.d.ts +39 -0
  560. package/dist/sandbox/firestore/admin-compat/snapshots.d.ts.map +1 -0
  561. package/dist/sandbox/firestore/admin-compat/snapshots.js +50 -0
  562. package/dist/sandbox/firestore/admin-compat/snapshots.js.map +1 -0
  563. package/dist/sandbox/firestore/admin-compat/transaction.d.ts +35 -0
  564. package/dist/sandbox/firestore/admin-compat/transaction.d.ts.map +1 -0
  565. package/dist/sandbox/firestore/admin-compat/transaction.js +88 -0
  566. package/dist/sandbox/firestore/admin-compat/transaction.js.map +1 -0
  567. package/dist/sandbox/firestore/admin-compat/types.d.ts +297 -0
  568. package/dist/sandbox/firestore/admin-compat/types.d.ts.map +1 -0
  569. package/dist/sandbox/firestore/admin-compat/types.js +127 -0
  570. package/dist/sandbox/firestore/admin-compat/types.js.map +1 -0
  571. package/dist/sandbox/firestore/admin-compat/value-order.d.ts +49 -0
  572. package/dist/sandbox/firestore/admin-compat/value-order.d.ts.map +1 -0
  573. package/dist/sandbox/firestore/admin-compat/value-order.js +172 -0
  574. package/dist/sandbox/firestore/admin-compat/value-order.js.map +1 -0
  575. package/dist/sandbox/firestore/auto-id.d.ts +26 -0
  576. package/dist/sandbox/firestore/auto-id.d.ts.map +1 -0
  577. package/dist/sandbox/firestore/auto-id.js +36 -0
  578. package/dist/sandbox/firestore/auto-id.js.map +1 -0
  579. package/dist/sandbox/firestore/converters/bytes-geopoint.d.ts +48 -0
  580. package/dist/sandbox/firestore/converters/bytes-geopoint.d.ts.map +1 -0
  581. package/dist/sandbox/firestore/converters/bytes-geopoint.js +85 -0
  582. package/dist/sandbox/firestore/converters/bytes-geopoint.js.map +1 -0
  583. package/dist/sandbox/firestore/converters/fieldvalue.d.ts +69 -0
  584. package/dist/sandbox/firestore/converters/fieldvalue.d.ts.map +1 -0
  585. package/dist/sandbox/firestore/converters/fieldvalue.js +166 -0
  586. package/dist/sandbox/firestore/converters/fieldvalue.js.map +1 -0
  587. package/dist/sandbox/firestore/converters/reference.d.ts +31 -0
  588. package/dist/sandbox/firestore/converters/reference.d.ts.map +1 -0
  589. package/dist/sandbox/firestore/converters/reference.js +51 -0
  590. package/dist/sandbox/firestore/converters/reference.js.map +1 -0
  591. package/dist/sandbox/firestore/converters/timestamp.d.ts +32 -0
  592. package/dist/sandbox/firestore/converters/timestamp.d.ts.map +1 -0
  593. package/dist/sandbox/firestore/converters/timestamp.js +63 -0
  594. package/dist/sandbox/firestore/converters/timestamp.js.map +1 -0
  595. package/dist/sandbox/firestore/converters/user-timestamp.d.ts +46 -0
  596. package/dist/sandbox/firestore/converters/user-timestamp.d.ts.map +1 -0
  597. package/dist/sandbox/firestore/converters/user-timestamp.js +65 -0
  598. package/dist/sandbox/firestore/converters/user-timestamp.js.map +1 -0
  599. package/dist/sandbox/firestore/converters/vector.d.ts +24 -0
  600. package/dist/sandbox/firestore/converters/vector.d.ts.map +1 -0
  601. package/dist/sandbox/firestore/converters/vector.js +53 -0
  602. package/dist/sandbox/firestore/converters/vector.js.map +1 -0
  603. package/dist/sandbox/firestore/errors.d.ts +82 -0
  604. package/dist/sandbox/firestore/errors.d.ts.map +1 -0
  605. package/dist/sandbox/firestore/errors.js +54 -0
  606. package/dist/sandbox/firestore/errors.js.map +1 -0
  607. package/dist/sandbox/firestore/event-log.d.ts +99 -0
  608. package/dist/sandbox/firestore/event-log.d.ts.map +1 -0
  609. package/dist/sandbox/firestore/event-log.js +67 -0
  610. package/dist/sandbox/firestore/event-log.js.map +1 -0
  611. package/dist/sandbox/firestore/field-merge.d.ts +64 -0
  612. package/dist/sandbox/firestore/field-merge.d.ts.map +1 -0
  613. package/dist/sandbox/firestore/field-merge.js +221 -0
  614. package/dist/sandbox/firestore/field-merge.js.map +1 -0
  615. package/dist/sandbox/firestore/list-query-proof.d.ts +77 -0
  616. package/dist/sandbox/firestore/list-query-proof.d.ts.map +1 -0
  617. package/dist/sandbox/firestore/list-query-proof.js +170 -0
  618. package/dist/sandbox/firestore/list-query-proof.js.map +1 -0
  619. package/dist/sandbox/firestore/local-environment.d.ts +806 -0
  620. package/dist/sandbox/firestore/local-environment.d.ts.map +1 -0
  621. package/dist/sandbox/firestore/local-environment.js +3028 -0
  622. package/dist/sandbox/firestore/local-environment.js.map +1 -0
  623. package/dist/sandbox/firestore/local-state.d.ts +196 -0
  624. package/dist/sandbox/firestore/local-state.d.ts.map +1 -0
  625. package/dist/sandbox/firestore/local-state.js +413 -0
  626. package/dist/sandbox/firestore/local-state.js.map +1 -0
  627. package/dist/sandbox/firestore/overlay-backing.d.ts +44 -0
  628. package/dist/sandbox/firestore/overlay-backing.d.ts.map +1 -0
  629. package/dist/sandbox/firestore/overlay-backing.js +82 -0
  630. package/dist/sandbox/firestore/overlay-backing.js.map +1 -0
  631. package/dist/sandbox/firestore/sentinel-capture.d.ts +30 -0
  632. package/dist/sandbox/firestore/sentinel-capture.d.ts.map +1 -0
  633. package/dist/sandbox/firestore/sentinel-capture.js +61 -0
  634. package/dist/sandbox/firestore/sentinel-capture.js.map +1 -0
  635. package/dist/sandbox/firestore/snapshot-listeners.d.ts +284 -0
  636. package/dist/sandbox/firestore/snapshot-listeners.d.ts.map +1 -0
  637. package/dist/sandbox/firestore/snapshot-listeners.js +194 -0
  638. package/dist/sandbox/firestore/snapshot-listeners.js.map +1 -0
  639. package/dist/sandbox/firestore/topk.d.ts +12 -0
  640. package/dist/sandbox/firestore/topk.d.ts.map +1 -0
  641. package/dist/sandbox/firestore/topk.js +42 -0
  642. package/dist/sandbox/firestore/topk.js.map +1 -0
  643. package/dist/sandbox/firestore/transaction-merge.d.ts +55 -0
  644. package/dist/sandbox/firestore/transaction-merge.d.ts.map +1 -0
  645. package/dist/sandbox/firestore/transaction-merge.js +107 -0
  646. package/dist/sandbox/firestore/transaction-merge.js.map +1 -0
  647. package/dist/sandbox/firestore/transaction-types.d.ts +152 -0
  648. package/dist/sandbox/firestore/transaction-types.d.ts.map +1 -0
  649. package/dist/sandbox/firestore/transaction-types.js +10 -0
  650. package/dist/sandbox/firestore/transaction-types.js.map +1 -0
  651. package/dist/sandbox/firestore/transaction.d.ts +79 -0
  652. package/dist/sandbox/firestore/transaction.d.ts.map +1 -0
  653. package/dist/sandbox/firestore/transaction.js +95 -0
  654. package/dist/sandbox/firestore/transaction.js.map +1 -0
  655. package/dist/sandbox/firestore/value-equality.d.ts +2 -0
  656. package/dist/sandbox/firestore/value-equality.d.ts.map +1 -0
  657. package/dist/sandbox/firestore/value-equality.js +35 -0
  658. package/dist/sandbox/firestore/value-equality.js.map +1 -0
  659. package/dist/sandbox/firestore/value-resolver.d.ts +172 -0
  660. package/dist/sandbox/firestore/value-resolver.d.ts.map +1 -0
  661. package/dist/sandbox/firestore/value-resolver.js +221 -0
  662. package/dist/sandbox/firestore/value-resolver.js.map +1 -0
  663. package/dist/sandbox/firestore/wire-encoder.d.ts +14 -0
  664. package/dist/sandbox/firestore/wire-encoder.d.ts.map +1 -0
  665. package/dist/sandbox/firestore/wire-encoder.js +130 -0
  666. package/dist/sandbox/firestore/wire-encoder.js.map +1 -0
  667. package/dist/sandbox/index.d.ts +50 -0
  668. package/dist/sandbox/index.d.ts.map +1 -0
  669. package/dist/sandbox/index.js +63 -0
  670. package/dist/sandbox/index.js.map +1 -0
  671. package/dist/sandbox/internal/index.d.ts +36 -0
  672. package/dist/sandbox/internal/index.d.ts.map +1 -0
  673. package/dist/sandbox/internal/index.js +72 -0
  674. package/dist/sandbox/internal/index.js.map +1 -0
  675. package/dist/sandbox/internal/sandbox-impl.d.ts +343 -0
  676. package/dist/sandbox/internal/sandbox-impl.d.ts.map +1 -0
  677. package/dist/sandbox/internal/sandbox-impl.js +718 -0
  678. package/dist/sandbox/internal/sandbox-impl.js.map +1 -0
  679. package/dist/sandbox/persistence/backends.d.ts +37 -0
  680. package/dist/sandbox/persistence/backends.d.ts.map +1 -0
  681. package/dist/sandbox/persistence/backends.js +202 -0
  682. package/dist/sandbox/persistence/backends.js.map +1 -0
  683. package/dist/sandbox/persistence/chunk-format.d.ts +58 -0
  684. package/dist/sandbox/persistence/chunk-format.d.ts.map +1 -0
  685. package/dist/sandbox/persistence/chunk-format.js +163 -0
  686. package/dist/sandbox/persistence/chunk-format.js.map +1 -0
  687. package/dist/sandbox/persistence/controller.d.ts +39 -0
  688. package/dist/sandbox/persistence/controller.d.ts.map +1 -0
  689. package/dist/sandbox/persistence/controller.js +605 -0
  690. package/dist/sandbox/persistence/controller.js.map +1 -0
  691. package/dist/sandbox/persistence/index.d.ts +13 -0
  692. package/dist/sandbox/persistence/index.d.ts.map +1 -0
  693. package/dist/sandbox/persistence/index.js +5 -0
  694. package/dist/sandbox/persistence/index.js.map +1 -0
  695. package/dist/sandbox/persistence/serialize.d.ts +53 -0
  696. package/dist/sandbox/persistence/serialize.d.ts.map +1 -0
  697. package/dist/sandbox/persistence/serialize.js +98 -0
  698. package/dist/sandbox/persistence/serialize.js.map +1 -0
  699. package/dist/sandbox/persistence/types.d.ts +118 -0
  700. package/dist/sandbox/persistence/types.d.ts.map +1 -0
  701. package/dist/sandbox/persistence/types.js +15 -0
  702. package/dist/sandbox/persistence/types.js.map +1 -0
  703. package/dist/sandbox/remote.d.ts +118 -0
  704. package/dist/sandbox/remote.d.ts.map +1 -0
  705. package/dist/sandbox/remote.js +60 -0
  706. package/dist/sandbox/remote.js.map +1 -0
  707. package/dist/sandbox/replay/index.d.ts +106 -0
  708. package/dist/sandbox/replay/index.d.ts.map +1 -0
  709. package/dist/sandbox/replay/index.js +246 -0
  710. package/dist/sandbox/replay/index.js.map +1 -0
  711. package/dist/sandbox/sandbox-context.d.ts +40 -0
  712. package/dist/sandbox/sandbox-context.d.ts.map +1 -0
  713. package/dist/sandbox/sandbox-context.js +72 -0
  714. package/dist/sandbox/sandbox-context.js.map +1 -0
  715. package/dist/sandbox/tab-sync/index.d.ts +120 -0
  716. package/dist/sandbox/tab-sync/index.d.ts.map +1 -0
  717. package/dist/sandbox/tab-sync/index.js +272 -0
  718. package/dist/sandbox/tab-sync/index.js.map +1 -0
  719. package/dist/sandbox/types.d.ts +1235 -0
  720. package/dist/sandbox/types.d.ts.map +1 -0
  721. package/dist/sandbox/types.js +46 -0
  722. package/dist/sandbox/types.js.map +1 -0
  723. package/dist/storage/admin/api.d.ts +206 -0
  724. package/dist/storage/admin/api.d.ts.map +1 -0
  725. package/dist/storage/admin/api.js +349 -0
  726. package/dist/storage/admin/api.js.map +1 -0
  727. package/dist/storage/admin/handler.d.ts +29 -0
  728. package/dist/storage/admin/handler.d.ts.map +1 -0
  729. package/dist/storage/admin/handler.js +82 -0
  730. package/dist/storage/admin/handler.js.map +1 -0
  731. package/dist/storage/admin/spec.d.ts +64 -0
  732. package/dist/storage/admin/spec.d.ts.map +1 -0
  733. package/dist/storage/admin/spec.js +8 -0
  734. package/dist/storage/admin/spec.js.map +1 -0
  735. package/dist/storage/admin/tools.d.ts +23 -0
  736. package/dist/storage/admin/tools.d.ts.map +1 -0
  737. package/dist/storage/admin/tools.js +90 -0
  738. package/dist/storage/admin/tools.js.map +1 -0
  739. package/dist/storage/download.d.ts +27 -0
  740. package/dist/storage/download.d.ts.map +1 -0
  741. package/dist/storage/download.js +136 -0
  742. package/dist/storage/download.js.map +1 -0
  743. package/dist/storage/enforce.d.ts +26 -0
  744. package/dist/storage/enforce.d.ts.map +1 -0
  745. package/dist/storage/enforce.js +16 -0
  746. package/dist/storage/enforce.js.map +1 -0
  747. package/dist/storage/errors.d.ts +46 -0
  748. package/dist/storage/errors.d.ts.map +1 -0
  749. package/dist/storage/errors.js +62 -0
  750. package/dist/storage/errors.js.map +1 -0
  751. package/dist/storage/index.d.ts +49 -0
  752. package/dist/storage/index.d.ts.map +1 -0
  753. package/dist/storage/index.js +60 -0
  754. package/dist/storage/index.js.map +1 -0
  755. package/dist/storage/internal.d.ts +18 -0
  756. package/dist/storage/internal.d.ts.map +1 -0
  757. package/dist/storage/internal.js +18 -0
  758. package/dist/storage/internal.js.map +1 -0
  759. package/dist/storage/list.d.ts +17 -0
  760. package/dist/storage/list.d.ts.map +1 -0
  761. package/dist/storage/list.js +91 -0
  762. package/dist/storage/list.js.map +1 -0
  763. package/dist/storage/metadata.d.ts +86 -0
  764. package/dist/storage/metadata.d.ts.map +1 -0
  765. package/dist/storage/metadata.js +167 -0
  766. package/dist/storage/metadata.js.map +1 -0
  767. package/dist/storage/persistence.d.ts +134 -0
  768. package/dist/storage/persistence.d.ts.map +1 -0
  769. package/dist/storage/persistence.js +132 -0
  770. package/dist/storage/persistence.js.map +1 -0
  771. package/dist/storage/reference.d.ts +63 -0
  772. package/dist/storage/reference.d.ts.map +1 -0
  773. package/dist/storage/reference.js +156 -0
  774. package/dist/storage/reference.js.map +1 -0
  775. package/dist/storage/rules.d.ts +176 -0
  776. package/dist/storage/rules.d.ts.map +1 -0
  777. package/dist/storage/rules.js +621 -0
  778. package/dist/storage/rules.js.map +1 -0
  779. package/dist/storage/service.d.ts +139 -0
  780. package/dist/storage/service.d.ts.map +1 -0
  781. package/dist/storage/service.js +241 -0
  782. package/dist/storage/service.js.map +1 -0
  783. package/dist/storage/upload.d.ts +43 -0
  784. package/dist/storage/upload.d.ts.map +1 -0
  785. package/dist/storage/upload.js +235 -0
  786. package/dist/storage/upload.js.map +1 -0
  787. package/package.json +110 -3
@@ -0,0 +1,413 @@
1
+ /**
2
+ * LocalState — in-memory Firestore document store.
3
+ *
4
+ * Manages a Map<string, Record<string, unknown>> with correct Firestore
5
+ * semantics for create, update (merge), delete, and set (overwrite).
6
+ *
7
+ * This is the "database" for the local environment. The simulator
8
+ * evaluates rules; this class manages the data those rules protect.
9
+ *
10
+ * Write-boundary resolver:
11
+ * Every mutation (`create`, `update`, `set`, `applyBatch`, and the
12
+ * constructor seed pass) routes through {@link resolveValueTree}
13
+ * before the value lands in storage. The resolver is the single
14
+ * chokepoint where Date → Timestamp coercion, FieldValue sentinel
15
+ * resolution, DocumentReference wrapping, etc. happen (see
16
+ * value-resolver.ts). Today the registry is empty (Item 0); Items 1+
17
+ * plug in converters without touching this file.
18
+ *
19
+ * Idempotency: callers higher up the stack (e.g.,
20
+ * `LocalEnvironment.execute`) may resolve before us so rules see the
21
+ * same shape storage will see. Double-resolution is intentional and
22
+ * safe — every converter is required to no-op on its own output.
23
+ */
24
+ import { resolveValueTree, partitionDeletes } from './value-resolver.js';
25
+ import { applyUpdate, applyMerge } from './field-merge.js';
26
+ /** Pick only `fields` from `data` (a shallow top-level projection). */
27
+ function projectFields(data, fields) {
28
+ const out = {};
29
+ for (const f of fields) {
30
+ if (Object.prototype.hasOwnProperty.call(data, f))
31
+ out[f] = data[f];
32
+ }
33
+ return out;
34
+ }
35
+ export class LocalState {
36
+ documents;
37
+ constructor(seed = {}, backing) {
38
+ this.documents = backing ?? new Map();
39
+ for (const [path, data] of Object.entries(seed)) {
40
+ // Seed pass: no prior state, method='seed' so converters can branch.
41
+ const resolved = resolveValueTree({ ...data }, {
42
+ path,
43
+ method: 'seed',
44
+ prior: null,
45
+ });
46
+ // Item 2: drop any DELETE_FIELD sentinels in the seed (a rare but
47
+ // legal shape if the agent reuses payload objects). No prior to
48
+ // delete from on a seed; we just strip the markers.
49
+ const { writes } = partitionDeletes(resolved);
50
+ this.documents.set(path, writes);
51
+ }
52
+ }
53
+ // ═══ Read operations ═══
54
+ /** Get a single document. Returns null if not found. */
55
+ get(path) {
56
+ return this.documents.get(path) ?? null;
57
+ }
58
+ /** Check if a document exists. */
59
+ exists(path) {
60
+ return this.documents.has(path);
61
+ }
62
+ /**
63
+ * Scan the keyspace under `prefix`: the single iteration primitive `list`
64
+ * (and, later, the query engine) build on. With `directOnly`, returns only
65
+ * direct children of `prefix` (a collection scan); otherwise every descendant.
66
+ * With `phantoms`, synthesizes empty parent entries for paths whose parent has
67
+ * descendants but no stored doc of its own (mirrors live Firestore's
68
+ * `listDocuments`). An empty `prefix` scans the whole keyspace. Real stored
69
+ * docs come in keyspace (insertion) order; phantoms are appended after, so a
70
+ * real doc always wins over its phantom synthesis.
71
+ */
72
+ scan(prefix, opts = {}) {
73
+ const norm = prefix === '' || prefix.endsWith('/') ? prefix : prefix + '/';
74
+ const project = opts.projection
75
+ ? (d) => projectFields(d, opts.projection)
76
+ : (d) => d;
77
+ const results = [];
78
+ const seenIds = new Set();
79
+ const phantomIds = [];
80
+ for (const [path, data] of this.documents) {
81
+ if (norm !== '' && !path.startsWith(norm))
82
+ continue;
83
+ if (!opts.directOnly) {
84
+ results.push({ path, data: project(data) });
85
+ continue;
86
+ }
87
+ const remainder = path.slice(norm.length);
88
+ const slashIdx = remainder.indexOf('/');
89
+ if (slashIdx === -1) {
90
+ // Direct child — real stored doc.
91
+ results.push({ path, data: project(data) });
92
+ seenIds.add(remainder);
93
+ }
94
+ else if (opts.phantoms) {
95
+ // Deeper descendant — its top segment is a parent id under our
96
+ // collection. Record once; synthesize after the scan so real
97
+ // stored docs win over the phantom synthesis.
98
+ const parentId = remainder.slice(0, slashIdx);
99
+ if (parentId.length > 0 && !phantomIds.includes(parentId)) {
100
+ phantomIds.push(parentId);
101
+ }
102
+ }
103
+ }
104
+ if (opts.directOnly && opts.phantoms) {
105
+ for (const id of phantomIds) {
106
+ if (seenIds.has(id))
107
+ continue;
108
+ results.push({ path: norm + id, data: {}, phantom: true });
109
+ }
110
+ }
111
+ return results;
112
+ }
113
+ /**
114
+ * List all documents in a collection: real stored direct children plus
115
+ * phantom parents (synthesized empty docs for any parent with descendants).
116
+ * Mirrors live Firestore's `listDocuments`; `getDocument(path)` still returns
117
+ * `null` for a phantom; phantoms only surface via list traversal. This is
118
+ * `scan(collection, { directOnly, phantoms })`.
119
+ */
120
+ list(collection) {
121
+ return this.scan(collection, { directOnly: true, phantoms: true });
122
+ }
123
+ /**
124
+ * List all root collection IDs derived from the document keyspace.
125
+ * For seeded paths `users/u1`, `users/u1/posts/p1`, `articles/a1`, returns
126
+ * `['users', 'articles']` (deduped, insertion order).
127
+ *
128
+ * Note: a collection is "visible" if any document path lives under it.
129
+ * Phantom parents (e.g., a path `users/u1/posts/p1` with no `users/u1`
130
+ * stored doc) still surface their root collection here, mirroring how
131
+ * real Firestore exposes a collection whenever any descendant exists.
132
+ */
133
+ listRootCollections() {
134
+ const seen = new Set();
135
+ const out = [];
136
+ for (const path of this.documents.keys()) {
137
+ const first = path.split('/', 1)[0];
138
+ if (first.length === 0)
139
+ continue;
140
+ if (!seen.has(first)) {
141
+ seen.add(first);
142
+ out.push(first);
143
+ }
144
+ }
145
+ return out;
146
+ }
147
+ /**
148
+ * List subcollection IDs directly underneath the given document path.
149
+ * For docPath `users/u1` and stored paths `users/u1/posts/p1`,
150
+ * `users/u1/posts/p2`, `users/u1/sessions/s1`, returns `['posts', 'sessions']`.
151
+ *
152
+ * Like {@link listRootCollections}, a subcollection is visible whenever
153
+ * any descendant path exists — it does NOT require the parent doc to
154
+ * have stored data.
155
+ */
156
+ listSubcollections(docPath) {
157
+ const prefix = docPath.endsWith('/') ? docPath : docPath + '/';
158
+ const seen = new Set();
159
+ const out = [];
160
+ for (const path of this.documents.keys()) {
161
+ if (!path.startsWith(prefix))
162
+ continue;
163
+ const remainder = path.slice(prefix.length);
164
+ const next = remainder.split('/', 1)[0];
165
+ if (next.length === 0)
166
+ continue;
167
+ if (!seen.has(next)) {
168
+ seen.add(next);
169
+ out.push(next);
170
+ }
171
+ }
172
+ return out;
173
+ }
174
+ /** Get all documents as a plain object. */
175
+ snapshot() {
176
+ const snap = {};
177
+ for (const [path, data] of this.documents) {
178
+ snap[path] = { ...data };
179
+ }
180
+ return snap;
181
+ }
182
+ /** Total document count. */
183
+ size() {
184
+ return this.documents.size;
185
+ }
186
+ // ═══ Write operations ═══
187
+ /**
188
+ * Create a document. Fails if the document already exists.
189
+ * Sets the full document data (no merge).
190
+ */
191
+ create(path, data) {
192
+ if (this.documents.has(path)) {
193
+ return { success: false, error: `Document '${path}' already exists` };
194
+ }
195
+ let writes;
196
+ try {
197
+ const resolved = resolveValueTree({ ...data }, {
198
+ path,
199
+ method: 'create',
200
+ prior: null,
201
+ });
202
+ // Item 2: create has no prior, so deletedKeys are no-ops; we just
203
+ // strip the markers so they don't land in storage.
204
+ writes = partitionDeletes(resolved).writes;
205
+ }
206
+ catch (e) {
207
+ return { success: false, error: e.message };
208
+ }
209
+ this.documents.set(path, writes);
210
+ return { success: true };
211
+ }
212
+ /**
213
+ * Update a document. Fails if the document doesn't exist.
214
+ * MERGES fields — does not replace the entire document.
215
+ * Firestore update() semantics: existing fields not in the update are preserved.
216
+ */
217
+ update(path, data) {
218
+ const existing = this.documents.get(path);
219
+ if (!existing) {
220
+ return { success: false, error: `Document '${path}' does not exist` };
221
+ }
222
+ let merged;
223
+ try {
224
+ const resolved = resolveValueTree({ ...data }, {
225
+ path,
226
+ method: 'update',
227
+ prior: existing,
228
+ });
229
+ // FS-B5: top-level `updateDoc` keys are dot-separated FieldPaths.
230
+ // `applyUpdate` expands `{'a.b': v}` into a nested set (preserving
231
+ // `a.c`), replaces a whole map for a single-segment key, and removes
232
+ // DELETE_FIELD-marked leaves — matching prod's PatchMutation.
233
+ merged = applyUpdate(existing, resolved);
234
+ }
235
+ catch (e) {
236
+ return { success: false, error: e.message };
237
+ }
238
+ this.documents.set(path, merged);
239
+ return { success: true, priorData: { ...existing } };
240
+ }
241
+ /**
242
+ * Merge-set a document — `setDoc(data, {merge:true})` /
243
+ * `{mergeFields}`. Deep-merges nested maps into the existing doc
244
+ * (FS-B6): `setDoc({a:{b:2}}, {merge:true})` over `{a:{c:1}}` yields
245
+ * `{a:{b:2,c:1}}`. Creates the doc if absent. `mergeFields` restricts
246
+ * the write to the listed (dot-separated) field paths.
247
+ */
248
+ setMerge(path, data, mergeFields) {
249
+ const priorData = this.documents.has(path)
250
+ ? { ...this.documents.get(path) }
251
+ : null;
252
+ const resolved = resolveValueTree({ ...data }, {
253
+ path,
254
+ method: 'set',
255
+ prior: priorData,
256
+ });
257
+ const merged = applyMerge(priorData ?? {}, resolved, mergeFields);
258
+ this.documents.set(path, merged);
259
+ return { success: true, priorData, created: priorData === null };
260
+ }
261
+ /**
262
+ * Set a document. Creates or overwrites — always succeeds.
263
+ * Replaces the entire document (no merge).
264
+ */
265
+ set(path, data) {
266
+ const priorData = this.documents.has(path)
267
+ ? { ...this.documents.get(path) }
268
+ : null;
269
+ const resolved = resolveValueTree({ ...data }, {
270
+ path,
271
+ method: 'set',
272
+ prior: priorData,
273
+ });
274
+ // Item 2: set replaces the doc entirely, so deletedKeys have no
275
+ // existing field to remove — but we still strip the markers so
276
+ // they don't reach storage. Real Firestore rejects deleteField()
277
+ // inside a non-merge set; we accept-and-strip for now since merge
278
+ // mode isn't yet plumbed into the simulator's set path.
279
+ const { writes } = partitionDeletes(resolved);
280
+ this.documents.set(path, writes);
281
+ return { success: true, priorData, created: priorData === null };
282
+ }
283
+ /**
284
+ * Delete a document. Fails if the document doesn't exist.
285
+ * Returns the deleted data (for undo).
286
+ */
287
+ delete(path) {
288
+ const existing = this.documents.get(path);
289
+ if (!existing) {
290
+ return { success: false, error: `Document '${path}' does not exist` };
291
+ }
292
+ this.documents.delete(path);
293
+ return { success: true, priorData: { ...existing } };
294
+ }
295
+ // ═══ Batch operations ═══
296
+ /**
297
+ * Apply multiple writes atomically.
298
+ * Evaluates all operations against CURRENT state (no cross-visibility).
299
+ * If all succeed, applies all. If any fails, none apply.
300
+ *
301
+ * Note: This handles the DATA side only. Rules evaluation is the caller's
302
+ * responsibility (LocalEnvironment evaluates rules, then calls batch).
303
+ */
304
+ applyBatch(operations) {
305
+ // Validate all operations against current state first
306
+ const errors = [];
307
+ for (let i = 0; i < operations.length; i++) {
308
+ const op = operations[i];
309
+ switch (op.method) {
310
+ case 'create':
311
+ if (this.documents.has(op.path)) {
312
+ errors.push({ index: i, error: `Document '${op.path}' already exists` });
313
+ }
314
+ break;
315
+ case 'update':
316
+ if (!this.documents.has(op.path)) {
317
+ errors.push({ index: i, error: `Document '${op.path}' does not exist` });
318
+ }
319
+ break;
320
+ case 'delete':
321
+ // Delete-missing is a no-op in production: `WriteBatch.delete`
322
+ // and `Transaction.delete` on an absent doc resolve cleanly,
323
+ // matching the single-op `deleteDoc` contract (matrix row
324
+ // Firestore #39, oracle:
325
+ // scripts/oracle/observations/firestore-deletedoc-missing.json).
326
+ // Apply phase below tolerates the absence via `documents.delete`,
327
+ // which is itself a no-op on a missing key.
328
+ break;
329
+ // 'set' always succeeds
330
+ }
331
+ }
332
+ if (errors.length > 0) {
333
+ return { success: false, errors };
334
+ }
335
+ // Capture prior state for all affected documents (for undo)
336
+ const priorStates = new Map();
337
+ for (const op of operations) {
338
+ if (!priorStates.has(op.path)) {
339
+ priorStates.set(op.path, this.documents.has(op.path) ? { ...this.documents.get(op.path) } : null);
340
+ }
341
+ }
342
+ // Apply all operations. Each non-delete write routes through the
343
+ // resolver with the correct prior — captured above, so resolution
344
+ // order within the batch sees the same prior the rules saw. Item 2:
345
+ // every non-delete branch partitions DELETE_FIELD markers out via
346
+ // partitionDeletes so they don't leak into storage.
347
+ for (const op of operations) {
348
+ switch (op.method) {
349
+ case 'create': {
350
+ const resolved = resolveValueTree({ ...op.data }, {
351
+ path: op.path,
352
+ method: 'create',
353
+ prior: null,
354
+ });
355
+ const { writes } = partitionDeletes(resolved);
356
+ this.documents.set(op.path, writes);
357
+ break;
358
+ }
359
+ case 'update': {
360
+ const existing = this.documents.get(op.path);
361
+ const resolved = resolveValueTree({ ...op.data }, {
362
+ path: op.path,
363
+ method: 'update',
364
+ prior: existing,
365
+ });
366
+ // FS-B5: dot-path FieldPath expansion + sibling-preserving merge.
367
+ this.documents.set(op.path, applyUpdate(existing, resolved));
368
+ break;
369
+ }
370
+ case 'set': {
371
+ const priorForSet = priorStates.get(op.path) ?? null;
372
+ const resolved = resolveValueTree({ ...op.data }, {
373
+ path: op.path,
374
+ method: 'set',
375
+ prior: priorForSet,
376
+ });
377
+ const { writes } = partitionDeletes(resolved);
378
+ this.documents.set(op.path, writes);
379
+ break;
380
+ }
381
+ case 'delete':
382
+ this.documents.delete(op.path);
383
+ break;
384
+ }
385
+ }
386
+ return { success: true, priorStates };
387
+ }
388
+ /**
389
+ * Restore state from a WHOLE-keyspace snapshot (reset to seed, transaction
390
+ * undo). Replaces the entire keyspace.
391
+ */
392
+ restore(snapshot) {
393
+ this.documents.clear();
394
+ for (const [path, data] of Object.entries(snapshot)) {
395
+ this.documents.set(path, { ...data });
396
+ }
397
+ }
398
+ /**
399
+ * Restore only the given paths to their prior state (for single-write / batch
400
+ * undo). `null` means the doc did not exist before, so undo deletes it; any
401
+ * other path in the keyspace is left untouched. This is the affected-path
402
+ * counterpart to {@link restore} that keeps undo O(affected), not O(keyspace).
403
+ */
404
+ restorePaths(priorDocs) {
405
+ for (const [path, data] of Object.entries(priorDocs)) {
406
+ if (data === null)
407
+ this.documents.delete(path);
408
+ else
409
+ this.documents.set(path, { ...data });
410
+ }
411
+ }
412
+ }
413
+ //# sourceMappingURL=local-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-state.js","sourceRoot":"","sources":["../../../src/sandbox/firestore/local-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * OverlayBacking: copy-on-write storage over an immutable base, the engine
3
+ * behind CoW branches. Reads fall through to `base` unless shadowed by the
4
+ * overlay or hidden by a tombstone; writes land in the overlay; deletes
5
+ * tombstone a base path (or just drop an overlay-only doc). A fork is O(1) (an
6
+ * empty overlay over the shared base) instead of O(keyspace) (structuredClone).
7
+ *
8
+ * Isolation: the base (a `snapshot()` result) is only SHALLOW-cloned by
9
+ * snapshot(), so its nested objects are still shared with the live source and
10
+ * any sibling branch. Handing a base doc out by reference would let a caller
11
+ * mutate it in place and corrupt those. So base docs are deep-cloned on first
12
+ * read (memoized in `baseCache`, so repeated reads/scans don't re-clone), which
13
+ * restores the old clone-fork's full decoupling while keeping fork() O(1) and
14
+ * cloning only the docs a branch actually touches. The cache is NOT the overlay:
15
+ * a cached base read is not a write, so `diff` stays overlay-only.
16
+ *
17
+ * Iteration preserves base order: an updated base doc is emitted in its original
18
+ * position (overlay value), overlay-only docs are appended, and a base doc that
19
+ * was deleted then re-created stays in its original base position (which tracks
20
+ * prod's __name__ key order more closely than a Map clone's move-to-end would).
21
+ */
22
+ import type { DocBacking, DocumentData } from './local-state.js';
23
+ export declare class OverlayBacking implements DocBacking {
24
+ private readonly base;
25
+ private readonly overlay;
26
+ private readonly tombstones;
27
+ /** Deep-clone-on-first-read of base docs (see class doc). */
28
+ private readonly baseCache;
29
+ /** Set by clear(): the base is logically dropped, only the overlay counts. */
30
+ private cleared;
31
+ constructor(base: Record<string, DocumentData>);
32
+ private inBase;
33
+ /** A decoupled view of a base doc: deep clone, memoized. */
34
+ private baseDoc;
35
+ get(path: string): DocumentData | undefined;
36
+ set(path: string, data: DocumentData): void;
37
+ has(path: string): boolean;
38
+ delete(path: string): boolean;
39
+ clear(): void;
40
+ get size(): number;
41
+ keys(): IterableIterator<string>;
42
+ [Symbol.iterator](): IterableIterator<[string, DocumentData]>;
43
+ }
44
+ //# sourceMappingURL=overlay-backing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay-backing.d.ts","sourceRoot":"","sources":["../../../src/sandbox/firestore/overlay-backing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEjE,qBAAa,cAAe,YAAW,UAAU;IAQnC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAPjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAC3D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,6DAA6D;IAC7D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmC;IAC7D,8EAA8E;IAC9E,OAAO,CAAC,OAAO,CAAS;gBAEK,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC;IAE/D,OAAO,CAAC,MAAM;IAId,4DAA4D;IAC5D,OAAO,CAAC,OAAO;IASf,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAM3C,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI;IAK3C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAM1B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAO7B,KAAK,IAAI,IAAI;IAOb,IAAI,IAAI,IAAI,MAAM,CAIjB;IAEA,IAAI,IAAI,gBAAgB,CAAC,MAAM,CAAC;IAIhC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CAc/D"}
@@ -0,0 +1,82 @@
1
+ export class OverlayBacking {
2
+ base;
3
+ overlay = new Map();
4
+ tombstones = new Set();
5
+ /** Deep-clone-on-first-read of base docs (see class doc). */
6
+ baseCache = new Map();
7
+ /** Set by clear(): the base is logically dropped, only the overlay counts. */
8
+ cleared = false;
9
+ constructor(base) {
10
+ this.base = base;
11
+ }
12
+ inBase(path) {
13
+ return Object.prototype.hasOwnProperty.call(this.base, path);
14
+ }
15
+ /** A decoupled view of a base doc: deep clone, memoized. */
16
+ baseDoc(path) {
17
+ let cached = this.baseCache.get(path);
18
+ if (cached === undefined) {
19
+ cached = structuredClone(this.base[path]);
20
+ this.baseCache.set(path, cached);
21
+ }
22
+ return cached;
23
+ }
24
+ get(path) {
25
+ if (this.overlay.has(path))
26
+ return this.overlay.get(path);
27
+ if (this.cleared || this.tombstones.has(path))
28
+ return undefined;
29
+ return this.inBase(path) ? this.baseDoc(path) : undefined;
30
+ }
31
+ set(path, data) {
32
+ this.overlay.set(path, data);
33
+ this.tombstones.delete(path);
34
+ }
35
+ has(path) {
36
+ if (this.overlay.has(path))
37
+ return true;
38
+ if (this.cleared || this.tombstones.has(path))
39
+ return false;
40
+ return this.inBase(path);
41
+ }
42
+ delete(path) {
43
+ const existed = this.has(path);
44
+ this.overlay.delete(path);
45
+ if (!this.cleared && this.inBase(path))
46
+ this.tombstones.add(path);
47
+ return existed;
48
+ }
49
+ clear() {
50
+ this.overlay.clear();
51
+ this.tombstones.clear();
52
+ this.baseCache.clear();
53
+ this.cleared = true;
54
+ }
55
+ get size() {
56
+ let n = 0;
57
+ for (const _ of this)
58
+ void _, n++;
59
+ return n;
60
+ }
61
+ *keys() {
62
+ for (const [path] of this)
63
+ yield path;
64
+ }
65
+ *[Symbol.iterator]() {
66
+ const emitted = new Set();
67
+ if (!this.cleared) {
68
+ for (const path of Object.keys(this.base)) {
69
+ if (this.tombstones.has(path))
70
+ continue;
71
+ emitted.add(path);
72
+ yield [path, this.overlay.has(path) ? this.overlay.get(path) : this.baseDoc(path)];
73
+ }
74
+ }
75
+ for (const [path, data] of this.overlay) {
76
+ if (emitted.has(path))
77
+ continue;
78
+ yield [path, data];
79
+ }
80
+ }
81
+ }
82
+ //# sourceMappingURL=overlay-backing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay-backing.js","sourceRoot":"","sources":["../../../src/sandbox/firestore/overlay-backing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Walk a pre-resolution write payload and extract every sentinel hit
3
+ * keyed by its field path.
4
+ *
5
+ * Used by `LocalEnvironment.emitWrite` to populate
6
+ * `WriteSandboxEvent.sentinels` so the replay engine can re-issue the
7
+ * same sentinels at replay time (without consulting resolved values
8
+ * which would have drifted).
9
+ *
10
+ * Detection: every Firestore sentinel converter in
11
+ * `converters/{fieldvalue,timestamp}.ts` marks its payload with a
12
+ * `__type: '<name>'` discriminator. The walk matches that.
13
+ *
14
+ * Field-path syntax (locked in the decision doc, R1):
15
+ * - object keys join with '.'
16
+ * - in-array positions append '[<index>]'
17
+ * - e.g., `tags[0]`, `profile.lastSeen`, `history[0].at`
18
+ *
19
+ * Short-circuit: when a sentinel is detected the walk does NOT recurse
20
+ * into its internals (e.g. `arrayUnion.values` may contain plain values
21
+ * that aren't replay-relevant). This is also what makes the walk cheap
22
+ * — probe R2 measured p99 ≤ 0.009ms across 0/1/16 sentinels per doc.
23
+ */
24
+ export interface SentinelHit {
25
+ /** Dotted path with bracket-array-indices. */
26
+ field: string;
27
+ kind: 'serverTimestamp' | 'increment' | 'arrayUnion' | 'arrayRemove' | 'delete';
28
+ }
29
+ export declare function walkForSentinels(value: unknown, prefix?: string): SentinelHit[];
30
+ //# sourceMappingURL=sentinel-capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sentinel-capture.d.ts","sourceRoot":"","sources":["../../../src/sandbox/firestore/sentinel-capture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,WAAW,WAAW;IAC1B,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,iBAAiB,GAAG,WAAW,GAAG,YAAY,GAAG,aAAa,GAAG,QAAQ,CAAC;CACjF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,SAAK,GAAG,WAAW,EAAE,CAsB3E"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Walk a pre-resolution write payload and extract every sentinel hit
3
+ * keyed by its field path.
4
+ *
5
+ * Used by `LocalEnvironment.emitWrite` to populate
6
+ * `WriteSandboxEvent.sentinels` so the replay engine can re-issue the
7
+ * same sentinels at replay time (without consulting resolved values
8
+ * which would have drifted).
9
+ *
10
+ * Detection: every Firestore sentinel converter in
11
+ * `converters/{fieldvalue,timestamp}.ts` marks its payload with a
12
+ * `__type: '<name>'` discriminator. The walk matches that.
13
+ *
14
+ * Field-path syntax (locked in the decision doc, R1):
15
+ * - object keys join with '.'
16
+ * - in-array positions append '[<index>]'
17
+ * - e.g., `tags[0]`, `profile.lastSeen`, `history[0].at`
18
+ *
19
+ * Short-circuit: when a sentinel is detected the walk does NOT recurse
20
+ * into its internals (e.g. `arrayUnion.values` may contain plain values
21
+ * that aren't replay-relevant). This is also what makes the walk cheap
22
+ * — probe R2 measured p99 ≤ 0.009ms across 0/1/16 sentinels per doc.
23
+ */
24
+ export function walkForSentinels(value, prefix = '') {
25
+ const hits = [];
26
+ visit(value, prefix);
27
+ return hits;
28
+ function visit(v, p) {
29
+ if (v === null || v === undefined || typeof v !== 'object')
30
+ return;
31
+ if (Array.isArray(v)) {
32
+ v.forEach((el, i) => visit(el, `${p}[${i}]`));
33
+ return;
34
+ }
35
+ const obj = v;
36
+ const kind = detect(obj);
37
+ if (kind) {
38
+ hits.push({ field: p, kind });
39
+ return;
40
+ }
41
+ for (const [k, child] of Object.entries(obj)) {
42
+ const next = p ? `${p}.${k}` : k;
43
+ visit(child, next);
44
+ }
45
+ }
46
+ }
47
+ function detect(obj) {
48
+ const t = obj.__type;
49
+ if (t === 'serverTimestamp')
50
+ return 'serverTimestamp';
51
+ if (t === 'increment')
52
+ return 'increment';
53
+ if (t === 'arrayUnion')
54
+ return 'arrayUnion';
55
+ if (t === 'arrayRemove')
56
+ return 'arrayRemove';
57
+ if (t === 'deleteField')
58
+ return 'delete';
59
+ return null;
60
+ }
61
+ //# sourceMappingURL=sentinel-capture.js.map