pyric 0.0.1 → 0.1.0-alpha.10

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 (1204) hide show
  1. package/LICENSE +216 -0
  2. package/README.md +179 -2
  3. package/README.md.orig +54 -0
  4. package/dist/ai/backend.d.ts +35 -0
  5. package/dist/ai/backend.d.ts.map +1 -0
  6. package/dist/ai/backend.js +42 -0
  7. package/dist/ai/backend.js.map +1 -0
  8. package/dist/ai/broker/broker.d.ts +65 -0
  9. package/dist/ai/broker/broker.d.ts.map +1 -0
  10. package/dist/ai/broker/broker.js +184 -0
  11. package/dist/ai/broker/broker.js.map +1 -0
  12. package/dist/ai/broker/index.d.ts +12 -0
  13. package/dist/ai/broker/index.d.ts.map +1 -0
  14. package/dist/ai/broker/index.js +11 -0
  15. package/dist/ai/broker/index.js.map +1 -0
  16. package/dist/ai/broker/openai-engine.d.ts +175 -0
  17. package/dist/ai/broker/openai-engine.d.ts.map +1 -0
  18. package/dist/ai/broker/openai-engine.js +502 -0
  19. package/dist/ai/broker/openai-engine.js.map +1 -0
  20. package/dist/ai/broker/scripted-engine.d.ts +44 -0
  21. package/dist/ai/broker/scripted-engine.d.ts.map +1 -0
  22. package/dist/ai/broker/scripted-engine.js +218 -0
  23. package/dist/ai/broker/scripted-engine.js.map +1 -0
  24. package/dist/ai/broker/synthesizer.d.ts +100 -0
  25. package/dist/ai/broker/synthesizer.d.ts.map +1 -0
  26. package/dist/ai/broker/synthesizer.js +278 -0
  27. package/dist/ai/broker/synthesizer.js.map +1 -0
  28. package/dist/ai/broker/types.d.ts +210 -0
  29. package/dist/ai/broker/types.d.ts.map +1 -0
  30. package/dist/ai/broker/types.js +20 -0
  31. package/dist/ai/broker/types.js.map +1 -0
  32. package/dist/ai/enums.d.ts +174 -0
  33. package/dist/ai/enums.d.ts.map +1 -0
  34. package/dist/ai/enums.js +155 -0
  35. package/dist/ai/enums.js.map +1 -0
  36. package/dist/ai/errors.d.ts +66 -0
  37. package/dist/ai/errors.d.ts.map +1 -0
  38. package/dist/ai/errors.js +100 -0
  39. package/dist/ai/errors.js.map +1 -0
  40. package/dist/ai/index.d.ts +31 -0
  41. package/dist/ai/index.d.ts.map +1 -0
  42. package/dist/ai/index.js +27 -0
  43. package/dist/ai/index.js.map +1 -0
  44. package/dist/ai/instances.d.ts +15 -0
  45. package/dist/ai/instances.d.ts.map +1 -0
  46. package/dist/ai/instances.js +69 -0
  47. package/dist/ai/instances.js.map +1 -0
  48. package/dist/ai/internal.d.ts +13 -0
  49. package/dist/ai/internal.d.ts.map +1 -0
  50. package/dist/ai/internal.js +45 -0
  51. package/dist/ai/internal.js.map +1 -0
  52. package/dist/ai/models.d.ts +116 -0
  53. package/dist/ai/models.d.ts.map +1 -0
  54. package/dist/ai/models.js +213 -0
  55. package/dist/ai/models.js.map +1 -0
  56. package/dist/ai/request-helpers.d.ts +59 -0
  57. package/dist/ai/request-helpers.d.ts.map +1 -0
  58. package/dist/ai/request-helpers.js +157 -0
  59. package/dist/ai/request-helpers.js.map +1 -0
  60. package/dist/ai/response-helpers.d.ts +41 -0
  61. package/dist/ai/response-helpers.d.ts.map +1 -0
  62. package/dist/ai/response-helpers.js +204 -0
  63. package/dist/ai/response-helpers.js.map +1 -0
  64. package/dist/ai/sandbox-plane.d.ts +41 -0
  65. package/dist/ai/sandbox-plane.d.ts.map +1 -0
  66. package/dist/ai/sandbox-plane.js +159 -0
  67. package/dist/ai/sandbox-plane.js.map +1 -0
  68. package/dist/ai/schema.d.ts +105 -0
  69. package/dist/ai/schema.d.ts.map +1 -0
  70. package/dist/ai/schema.js +174 -0
  71. package/dist/ai/schema.js.map +1 -0
  72. package/dist/ai/scripting.d.ts +53 -0
  73. package/dist/ai/scripting.d.ts.map +1 -0
  74. package/dist/ai/scripting.js +73 -0
  75. package/dist/ai/scripting.js.map +1 -0
  76. package/dist/ai/target.d.ts +20 -0
  77. package/dist/ai/target.d.ts.map +1 -0
  78. package/dist/ai/target.js +29 -0
  79. package/dist/ai/target.js.map +1 -0
  80. package/dist/ai/types.d.ts +400 -0
  81. package/dist/ai/types.d.ts.map +1 -0
  82. package/dist/ai/types.js +10 -0
  83. package/dist/ai/types.js.map +1 -0
  84. package/dist/app/diagnostics.d.ts +29 -0
  85. package/dist/app/diagnostics.d.ts.map +1 -0
  86. package/dist/app/diagnostics.js +88 -0
  87. package/dist/app/diagnostics.js.map +1 -0
  88. package/dist/app/index.d.ts +7 -0
  89. package/dist/app/index.d.ts.map +1 -0
  90. package/dist/app/index.js +5 -0
  91. package/dist/app/index.js.map +1 -0
  92. package/dist/app/internal.d.ts +11 -0
  93. package/dist/app/internal.d.ts.map +1 -0
  94. package/dist/app/internal.js +18 -0
  95. package/dist/app/internal.js.map +1 -0
  96. package/dist/app/options.d.ts +3 -0
  97. package/dist/app/options.d.ts.map +1 -0
  98. package/dist/app/options.js +19 -0
  99. package/dist/app/options.js.map +1 -0
  100. package/dist/app/register.d.ts +4 -0
  101. package/dist/app/register.d.ts.map +1 -0
  102. package/dist/app/register.js +35 -0
  103. package/dist/app/register.js.map +1 -0
  104. package/dist/app/registry.d.ts +12 -0
  105. package/dist/app/registry.d.ts.map +1 -0
  106. package/dist/app/registry.js +147 -0
  107. package/dist/app/registry.js.map +1 -0
  108. package/dist/app/runtime.d.ts +18 -0
  109. package/dist/app/runtime.d.ts.map +1 -0
  110. package/dist/app/runtime.js +119 -0
  111. package/dist/app/runtime.js.map +1 -0
  112. package/dist/app/types.d.ts +21 -0
  113. package/dist/app/types.d.ts.map +1 -0
  114. package/dist/app/types.js +2 -0
  115. package/dist/app/types.js.map +1 -0
  116. package/dist/auth/action-code-url.d.ts +70 -0
  117. package/dist/auth/action-code-url.d.ts.map +1 -0
  118. package/dist/auth/action-code-url.js +124 -0
  119. package/dist/auth/action-code-url.js.map +1 -0
  120. package/dist/auth/action-codes.d.ts +201 -0
  121. package/dist/auth/action-codes.d.ts.map +1 -0
  122. package/dist/auth/action-codes.js +355 -0
  123. package/dist/auth/action-codes.js.map +1 -0
  124. package/dist/auth/auth-errors.d.ts +21 -0
  125. package/dist/auth/auth-errors.d.ts.map +1 -0
  126. package/dist/auth/auth-errors.js +23 -0
  127. package/dist/auth/auth-errors.js.map +1 -0
  128. package/dist/auth/config-tokens.d.ts +90 -0
  129. package/dist/auth/config-tokens.d.ts.map +1 -0
  130. package/dist/auth/config-tokens.js +86 -0
  131. package/dist/auth/config-tokens.js.map +1 -0
  132. package/dist/auth/credentials.d.ts +140 -0
  133. package/dist/auth/credentials.d.ts.map +1 -0
  134. package/dist/auth/credentials.js +194 -0
  135. package/dist/auth/credentials.js.map +1 -0
  136. package/dist/auth/email-link.d.ts +91 -0
  137. package/dist/auth/email-link.d.ts.map +1 -0
  138. package/dist/auth/email-link.js +172 -0
  139. package/dist/auth/email-link.js.map +1 -0
  140. package/dist/auth/enums.d.ts +210 -0
  141. package/dist/auth/enums.d.ts.map +1 -0
  142. package/dist/auth/enums.js +206 -0
  143. package/dist/auth/enums.js.map +1 -0
  144. package/dist/auth/index.d.ts +3 -0
  145. package/dist/auth/index.d.ts.map +1 -0
  146. package/dist/auth/index.js +3 -0
  147. package/dist/auth/index.js.map +1 -0
  148. package/dist/auth/instances.d.ts +14 -0
  149. package/dist/auth/instances.d.ts.map +1 -0
  150. package/dist/auth/instances.js +95 -0
  151. package/dist/auth/instances.js.map +1 -0
  152. package/dist/auth/linking.d.ts +93 -0
  153. package/dist/auth/linking.d.ts.map +1 -0
  154. package/dist/auth/linking.js +189 -0
  155. package/dist/auth/linking.js.map +1 -0
  156. package/dist/auth/modular.d.ts +22 -0
  157. package/dist/auth/modular.d.ts.map +1 -0
  158. package/dist/auth/modular.js +18 -0
  159. package/dist/auth/modular.js.map +1 -0
  160. package/dist/auth/password-policy.d.ts +60 -0
  161. package/dist/auth/password-policy.d.ts.map +1 -0
  162. package/dist/auth/password-policy.js +68 -0
  163. package/dist/auth/password-policy.js.map +1 -0
  164. package/dist/auth/providers.d.ts +153 -0
  165. package/dist/auth/providers.d.ts.map +1 -0
  166. package/dist/auth/providers.js +207 -0
  167. package/dist/auth/providers.js.map +1 -0
  168. package/dist/auth/reauth.d.ts +73 -0
  169. package/dist/auth/reauth.d.ts.map +1 -0
  170. package/dist/auth/reauth.js +148 -0
  171. package/dist/auth/reauth.js.map +1 -0
  172. package/dist/auth/sandbox/driver.d.ts +51 -0
  173. package/dist/auth/sandbox/driver.d.ts.map +1 -0
  174. package/dist/auth/sandbox/driver.js +88 -0
  175. package/dist/auth/sandbox/driver.js.map +1 -0
  176. package/dist/auth/sandbox/persistence.d.ts +7 -0
  177. package/dist/auth/sandbox/persistence.d.ts.map +1 -0
  178. package/dist/auth/sandbox/persistence.js +121 -0
  179. package/dist/auth/sandbox/persistence.js.map +1 -0
  180. package/dist/auth/sandbox/project-store.d.ts +15 -0
  181. package/dist/auth/sandbox/project-store.d.ts.map +1 -0
  182. package/dist/auth/sandbox/project-store.js +17 -0
  183. package/dist/auth/sandbox/project-store.js.map +1 -0
  184. package/dist/auth/sandbox-auth-flow.d.ts +173 -0
  185. package/dist/auth/sandbox-auth-flow.d.ts.map +1 -0
  186. package/dist/auth/sandbox-auth-flow.js +165 -0
  187. package/dist/auth/sandbox-auth-flow.js.map +1 -0
  188. package/dist/auth/sandbox-backend-types.d.ts +197 -0
  189. package/dist/auth/sandbox-backend-types.d.ts.map +1 -0
  190. package/dist/auth/sandbox-backend-types.js +18 -0
  191. package/dist/auth/sandbox-backend-types.js.map +1 -0
  192. package/dist/auth/sandbox-backend.d.ts +811 -0
  193. package/dist/auth/sandbox-backend.d.ts.map +1 -0
  194. package/dist/auth/sandbox-backend.js +2007 -0
  195. package/dist/auth/sandbox-backend.js.map +1 -0
  196. package/dist/auth/sandbox-credential-validators.d.ts +30 -0
  197. package/dist/auth/sandbox-credential-validators.d.ts.map +1 -0
  198. package/dist/auth/sandbox-credential-validators.js +47 -0
  199. package/dist/auth/sandbox-credential-validators.js.map +1 -0
  200. package/dist/auth/sandbox-token.d.ts +24 -0
  201. package/dist/auth/sandbox-token.d.ts.map +1 -0
  202. package/dist/auth/sandbox-token.js +32 -0
  203. package/dist/auth/sandbox-token.js.map +1 -0
  204. package/dist/auth/sign-in.d.ts +14 -0
  205. package/dist/auth/sign-in.d.ts.map +1 -0
  206. package/dist/auth/sign-in.js +140 -0
  207. package/dist/auth/sign-in.js.map +1 -0
  208. package/dist/auth/target.d.ts +29 -0
  209. package/dist/auth/target.d.ts.map +1 -0
  210. package/dist/auth/target.js +23 -0
  211. package/dist/auth/target.js.map +1 -0
  212. package/dist/auth/tokens.d.ts +54 -0
  213. package/dist/auth/tokens.d.ts.map +1 -0
  214. package/dist/auth/tokens.js +142 -0
  215. package/dist/auth/tokens.js.map +1 -0
  216. package/dist/auth/types.d.ts +283 -0
  217. package/dist/auth/types.d.ts.map +1 -0
  218. package/dist/auth/types.js +24 -0
  219. package/dist/auth/types.js.map +1 -0
  220. package/dist/auth/user-lifecycle.d.ts +17 -0
  221. package/dist/auth/user-lifecycle.d.ts.map +1 -0
  222. package/dist/auth/user-lifecycle.js +60 -0
  223. package/dist/auth/user-lifecycle.js.map +1 -0
  224. package/dist/database/index.d.ts +9 -0
  225. package/dist/database/index.d.ts.map +1 -0
  226. package/dist/database/index.js +9 -0
  227. package/dist/database/index.js.map +1 -0
  228. package/dist/database/listener-registry.d.ts +16 -0
  229. package/dist/database/listener-registry.d.ts.map +1 -0
  230. package/dist/database/listener-registry.js +68 -0
  231. package/dist/database/listener-registry.js.map +1 -0
  232. package/dist/database/modular.d.ts +632 -0
  233. package/dist/database/modular.d.ts.map +1 -0
  234. package/dist/database/modular.js +1071 -0
  235. package/dist/database/modular.js.map +1 -0
  236. package/dist/database/replay.d.ts +32 -0
  237. package/dist/database/replay.d.ts.map +1 -0
  238. package/dist/database/replay.js +124 -0
  239. package/dist/database/replay.js.map +1 -0
  240. package/dist/database/sandbox/backend-for.d.ts +10 -0
  241. package/dist/database/sandbox/backend-for.d.ts.map +1 -0
  242. package/dist/database/sandbox/backend-for.js +19 -0
  243. package/dist/database/sandbox/backend-for.js.map +1 -0
  244. package/dist/database/sandbox/backend.d.ts +407 -0
  245. package/dist/database/sandbox/backend.d.ts.map +1 -0
  246. package/dist/database/sandbox/backend.js +1495 -0
  247. package/dist/database/sandbox/backend.js.map +1 -0
  248. package/dist/database/sandbox/data-tree.d.ts +123 -0
  249. package/dist/database/sandbox/data-tree.d.ts.map +1 -0
  250. package/dist/database/sandbox/data-tree.js +310 -0
  251. package/dist/database/sandbox/data-tree.js.map +1 -0
  252. package/dist/database/sandbox/normalize.d.ts +77 -0
  253. package/dist/database/sandbox/normalize.d.ts.map +1 -0
  254. package/dist/database/sandbox/normalize.js +165 -0
  255. package/dist/database/sandbox/normalize.js.map +1 -0
  256. package/dist/database/sandbox/push-id.d.ts +32 -0
  257. package/dist/database/sandbox/push-id.d.ts.map +1 -0
  258. package/dist/database/sandbox/push-id.js +82 -0
  259. package/dist/database/sandbox/push-id.js.map +1 -0
  260. package/dist/database/sandbox/query.d.ts +175 -0
  261. package/dist/database/sandbox/query.d.ts.map +1 -0
  262. package/dist/database/sandbox/query.js +269 -0
  263. package/dist/database/sandbox/query.js.map +1 -0
  264. package/dist/database/sandbox/rules-eval.d.ts +87 -0
  265. package/dist/database/sandbox/rules-eval.d.ts.map +1 -0
  266. package/dist/database/sandbox/rules-eval.js +131 -0
  267. package/dist/database/sandbox/rules-eval.js.map +1 -0
  268. package/dist/database/sandbox/sentinels.d.ts +71 -0
  269. package/dist/database/sandbox/sentinels.d.ts.map +1 -0
  270. package/dist/database/sandbox/sentinels.js +92 -0
  271. package/dist/database/sandbox/sentinels.js.map +1 -0
  272. package/dist/database/sandbox-controls.d.ts +15 -0
  273. package/dist/database/sandbox-controls.d.ts.map +1 -0
  274. package/dist/database/sandbox-controls.js +18 -0
  275. package/dist/database/sandbox-controls.js.map +1 -0
  276. package/dist/firestore/aggregates.d.ts +50 -0
  277. package/dist/firestore/aggregates.d.ts.map +1 -0
  278. package/dist/firestore/aggregates.js +40 -0
  279. package/dist/firestore/aggregates.js.map +1 -0
  280. package/dist/firestore/equality.d.ts +5 -0
  281. package/dist/firestore/equality.d.ts.map +1 -0
  282. package/dist/firestore/equality.js +20 -0
  283. package/dist/firestore/equality.js.map +1 -0
  284. package/dist/firestore/field-values.d.ts +61 -0
  285. package/dist/firestore/field-values.d.ts.map +1 -0
  286. package/dist/firestore/field-values.js +167 -0
  287. package/dist/firestore/field-values.js.map +1 -0
  288. package/dist/firestore/index.d.ts +54 -0
  289. package/dist/firestore/index.d.ts.map +1 -0
  290. package/dist/firestore/index.js +54 -0
  291. package/dist/firestore/index.js.map +1 -0
  292. package/dist/firestore/instances.d.ts +123 -0
  293. package/dist/firestore/instances.d.ts.map +1 -0
  294. package/dist/firestore/instances.js +177 -0
  295. package/dist/firestore/instances.js.map +1 -0
  296. package/dist/firestore/internal/index.d.ts +2 -0
  297. package/dist/firestore/internal/index.d.ts.map +1 -0
  298. package/dist/firestore/internal/index.js +2 -0
  299. package/dist/firestore/internal/index.js.map +1 -0
  300. package/dist/firestore/internal/listener-routing.d.ts +4 -0
  301. package/dist/firestore/internal/listener-routing.d.ts.map +1 -0
  302. package/dist/firestore/internal/listener-routing.js +4 -0
  303. package/dist/firestore/internal/listener-routing.js.map +1 -0
  304. package/dist/firestore/listeners.d.ts +12 -0
  305. package/dist/firestore/listeners.d.ts.map +1 -0
  306. package/dist/firestore/listeners.js +200 -0
  307. package/dist/firestore/listeners.js.map +1 -0
  308. package/dist/firestore/persistence.d.ts +227 -0
  309. package/dist/firestore/persistence.d.ts.map +1 -0
  310. package/dist/firestore/persistence.js +245 -0
  311. package/dist/firestore/persistence.js.map +1 -0
  312. package/dist/firestore/query-constraints.d.ts +72 -0
  313. package/dist/firestore/query-constraints.d.ts.map +1 -0
  314. package/dist/firestore/query-constraints.js +168 -0
  315. package/dist/firestore/query-constraints.js.map +1 -0
  316. package/dist/firestore/reads.d.ts +12 -0
  317. package/dist/firestore/reads.d.ts.map +1 -0
  318. package/dist/firestore/reads.js +32 -0
  319. package/dist/firestore/reads.js.map +1 -0
  320. package/dist/firestore/refs.d.ts +27 -0
  321. package/dist/firestore/refs.d.ts.map +1 -0
  322. package/dist/firestore/refs.js +74 -0
  323. package/dist/firestore/refs.js.map +1 -0
  324. package/dist/firestore/sandbox-controls.d.ts +60 -0
  325. package/dist/firestore/sandbox-controls.d.ts.map +1 -0
  326. package/dist/firestore/sandbox-controls.js +77 -0
  327. package/dist/firestore/sandbox-controls.js.map +1 -0
  328. package/dist/firestore/snapshots.d.ts +71 -0
  329. package/dist/firestore/snapshots.d.ts.map +1 -0
  330. package/dist/firestore/snapshots.js +160 -0
  331. package/dist/firestore/snapshots.js.map +1 -0
  332. package/dist/firestore/state.d.ts +168 -0
  333. package/dist/firestore/state.d.ts.map +1 -0
  334. package/dist/firestore/state.js +260 -0
  335. package/dist/firestore/state.js.map +1 -0
  336. package/dist/firestore/tools.d.ts +71 -0
  337. package/dist/firestore/tools.d.ts.map +1 -0
  338. package/dist/firestore/tools.js +320 -0
  339. package/dist/firestore/tools.js.map +1 -0
  340. package/dist/firestore/transactions.d.ts +4 -0
  341. package/dist/firestore/transactions.d.ts.map +1 -0
  342. package/dist/firestore/transactions.js +14 -0
  343. package/dist/firestore/transactions.js.map +1 -0
  344. package/dist/firestore/types.d.ts +82 -0
  345. package/dist/firestore/types.d.ts.map +1 -0
  346. package/dist/firestore/types.js +15 -0
  347. package/dist/firestore/types.js.map +1 -0
  348. package/dist/firestore/writes.d.ts +43 -0
  349. package/dist/firestore/writes.d.ts.map +1 -0
  350. package/dist/firestore/writes.js +40 -0
  351. package/dist/firestore/writes.js.map +1 -0
  352. package/dist/firestore-values/index.d.ts +63 -0
  353. package/dist/firestore-values/index.d.ts.map +1 -0
  354. package/dist/firestore-values/index.js +148 -0
  355. package/dist/firestore-values/index.js.map +1 -0
  356. package/dist/messaging/broker/broker.d.ts +171 -0
  357. package/dist/messaging/broker/broker.d.ts.map +1 -0
  358. package/dist/messaging/broker/broker.js +400 -0
  359. package/dist/messaging/broker/broker.js.map +1 -0
  360. package/dist/messaging/broker/envelopes.d.ts +96 -0
  361. package/dist/messaging/broker/envelopes.d.ts.map +1 -0
  362. package/dist/messaging/broker/envelopes.js +132 -0
  363. package/dist/messaging/broker/envelopes.js.map +1 -0
  364. package/dist/messaging/broker/index.d.ts +27 -0
  365. package/dist/messaging/broker/index.d.ts.map +1 -0
  366. package/dist/messaging/broker/index.js +21 -0
  367. package/dist/messaging/broker/index.js.map +1 -0
  368. package/dist/messaging/broker/tokens.d.ts +22 -0
  369. package/dist/messaging/broker/tokens.d.ts.map +1 -0
  370. package/dist/messaging/broker/tokens.js +37 -0
  371. package/dist/messaging/broker/tokens.js.map +1 -0
  372. package/dist/messaging/broker/types.d.ts +117 -0
  373. package/dist/messaging/broker/types.d.ts.map +1 -0
  374. package/dist/messaging/broker/types.js +12 -0
  375. package/dist/messaging/broker/types.js.map +1 -0
  376. package/dist/messaging/broker/validate.d.ts +58 -0
  377. package/dist/messaging/broker/validate.d.ts.map +1 -0
  378. package/dist/messaging/broker/validate.js +196 -0
  379. package/dist/messaging/broker/validate.js.map +1 -0
  380. package/dist/messaging/client.d.ts +108 -0
  381. package/dist/messaging/client.d.ts.map +1 -0
  382. package/dist/messaging/client.js +65 -0
  383. package/dist/messaging/client.js.map +1 -0
  384. package/dist/messaging/index.d.ts +3 -0
  385. package/dist/messaging/index.d.ts.map +1 -0
  386. package/dist/messaging/index.js +3 -0
  387. package/dist/messaging/index.js.map +1 -0
  388. package/dist/messaging/instance.d.ts +72 -0
  389. package/dist/messaging/instance.d.ts.map +1 -0
  390. package/dist/messaging/instance.js +93 -0
  391. package/dist/messaging/instance.js.map +1 -0
  392. package/dist/messaging/internal.d.ts +12 -0
  393. package/dist/messaging/internal.d.ts.map +1 -0
  394. package/dist/messaging/internal.js +12 -0
  395. package/dist/messaging/internal.js.map +1 -0
  396. package/dist/messaging/sw.d.ts +49 -0
  397. package/dist/messaging/sw.d.ts.map +1 -0
  398. package/dist/messaging/sw.js +49 -0
  399. package/dist/messaging/sw.js.map +1 -0
  400. package/dist/project-scope.d.ts +5 -0
  401. package/dist/project-scope.d.ts.map +1 -0
  402. package/dist/project-scope.js +2 -0
  403. package/dist/project-scope.js.map +1 -0
  404. package/dist/rules/api/assert.d.ts +39 -0
  405. package/dist/rules/api/assert.d.ts.map +1 -0
  406. package/dist/rules/api/assert.js +93 -0
  407. package/dist/rules/api/assert.js.map +1 -0
  408. package/dist/rules/api/case-types.d.ts +141 -0
  409. package/dist/rules/api/case-types.d.ts.map +1 -0
  410. package/dist/rules/api/case-types.js +13 -0
  411. package/dist/rules/api/case-types.js.map +1 -0
  412. package/dist/rules/api/errors.d.ts +38 -0
  413. package/dist/rules/api/errors.d.ts.map +1 -0
  414. package/dist/rules/api/errors.js +47 -0
  415. package/dist/rules/api/errors.js.map +1 -0
  416. package/dist/rules/api/firestore.d.ts +34 -0
  417. package/dist/rules/api/firestore.d.ts.map +1 -0
  418. package/dist/rules/api/firestore.js +137 -0
  419. package/dist/rules/api/firestore.js.map +1 -0
  420. package/dist/rules/api/issue.d.ts +50 -0
  421. package/dist/rules/api/issue.d.ts.map +1 -0
  422. package/dist/rules/api/issue.js +66 -0
  423. package/dist/rules/api/issue.js.map +1 -0
  424. package/dist/rules/api/lint.d.ts +16 -0
  425. package/dist/rules/api/lint.d.ts.map +1 -0
  426. package/dist/rules/api/lint.js +60 -0
  427. package/dist/rules/api/lint.js.map +1 -0
  428. package/dist/rules/api/rtdb.d.ts +33 -0
  429. package/dist/rules/api/rtdb.d.ts.map +1 -0
  430. package/dist/rules/api/rtdb.js +166 -0
  431. package/dist/rules/api/rtdb.js.map +1 -0
  432. package/dist/rules/api/values.d.ts +51 -0
  433. package/dist/rules/api/values.d.ts.map +1 -0
  434. package/dist/rules/api/values.js +66 -0
  435. package/dist/rules/api/values.js.map +1 -0
  436. package/dist/rules/generators/assembler.d.ts +19 -0
  437. package/dist/rules/generators/assembler.d.ts.map +1 -0
  438. package/dist/rules/generators/assembler.js +292 -0
  439. package/dist/rules/generators/assembler.js.map +1 -0
  440. package/dist/rules/generators/expressions.d.ts +52 -0
  441. package/dist/rules/generators/expressions.d.ts.map +1 -0
  442. package/dist/rules/generators/expressions.js +117 -0
  443. package/dist/rules/generators/expressions.js.map +1 -0
  444. package/dist/rules/generators/grid.d.ts +22 -0
  445. package/dist/rules/generators/grid.d.ts.map +1 -0
  446. package/dist/rules/generators/grid.js +52 -0
  447. package/dist/rules/generators/grid.js.map +1 -0
  448. package/dist/rules/grammar/FirestoreAST.d.ts +129 -0
  449. package/dist/rules/grammar/FirestoreAST.d.ts.map +1 -0
  450. package/dist/rules/grammar/FirestoreAST.js +3 -0
  451. package/dist/rules/grammar/FirestoreAST.js.map +1 -0
  452. package/dist/rules/grammar/FirestoreAssembler.d.ts +5 -0
  453. package/dist/rules/grammar/FirestoreAssembler.d.ts.map +1 -0
  454. package/dist/rules/grammar/FirestoreAssembler.js +158 -0
  455. package/dist/rules/grammar/FirestoreAssembler.js.map +1 -0
  456. package/dist/rules/grammar/FirestoreParser.d.ts +46 -0
  457. package/dist/rules/grammar/FirestoreParser.d.ts.map +1 -0
  458. package/dist/rules/grammar/FirestoreParser.js +409 -0
  459. package/dist/rules/grammar/FirestoreParser.js.map +1 -0
  460. package/dist/rules/grammar/FirestoreRules.ohm +229 -0
  461. package/dist/rules/grammar/FirestoreRules.ohm.generated.d.ts +2 -0
  462. package/dist/rules/grammar/FirestoreRules.ohm.generated.d.ts.map +1 -0
  463. package/dist/rules/grammar/FirestoreRules.ohm.generated.js +234 -0
  464. package/dist/rules/grammar/FirestoreRules.ohm.generated.js.map +1 -0
  465. package/dist/rules/grammar/FirestoreValidator.d.ts +10 -0
  466. package/dist/rules/grammar/FirestoreValidator.d.ts.map +1 -0
  467. package/dist/rules/grammar/FirestoreValidator.js +482 -0
  468. package/dist/rules/grammar/FirestoreValidator.js.map +1 -0
  469. package/dist/rules/index.d.ts +41 -0
  470. package/dist/rules/index.d.ts.map +1 -0
  471. package/dist/rules/index.js +40 -0
  472. package/dist/rules/index.js.map +1 -0
  473. package/dist/rules/indexes/extract/annotation-collect.d.ts +42 -0
  474. package/dist/rules/indexes/extract/annotation-collect.d.ts.map +1 -0
  475. package/dist/rules/indexes/extract/annotation-collect.js +69 -0
  476. package/dist/rules/indexes/extract/annotation-collect.js.map +1 -0
  477. package/dist/rules/indexes/extract/annotations.d.ts +50 -0
  478. package/dist/rules/indexes/extract/annotations.d.ts.map +1 -0
  479. package/dist/rules/indexes/extract/annotations.js +144 -0
  480. package/dist/rules/indexes/extract/annotations.js.map +1 -0
  481. package/dist/rules/indexes/extract/ast.d.ts +54 -0
  482. package/dist/rules/indexes/extract/ast.d.ts.map +1 -0
  483. package/dist/rules/indexes/extract/ast.js +119 -0
  484. package/dist/rules/indexes/extract/ast.js.map +1 -0
  485. package/dist/rules/indexes/extract/classify.d.ts +41 -0
  486. package/dist/rules/indexes/extract/classify.d.ts.map +1 -0
  487. package/dist/rules/indexes/extract/classify.js +138 -0
  488. package/dist/rules/indexes/extract/classify.js.map +1 -0
  489. package/dist/rules/indexes/extract/composite.d.ts +38 -0
  490. package/dist/rules/indexes/extract/composite.d.ts.map +1 -0
  491. package/dist/rules/indexes/extract/composite.js +85 -0
  492. package/dist/rules/indexes/extract/composite.js.map +1 -0
  493. package/dist/rules/indexes/extract/dataflow.d.ts +45 -0
  494. package/dist/rules/indexes/extract/dataflow.d.ts.map +1 -0
  495. package/dist/rules/indexes/extract/dataflow.js +200 -0
  496. package/dist/rules/indexes/extract/dataflow.js.map +1 -0
  497. package/dist/rules/indexes/extract/enumerate.d.ts +41 -0
  498. package/dist/rules/indexes/extract/enumerate.d.ts.map +1 -0
  499. package/dist/rules/indexes/extract/enumerate.js +163 -0
  500. package/dist/rules/indexes/extract/enumerate.js.map +1 -0
  501. package/dist/rules/indexes/extract/extractor.d.ts +3 -0
  502. package/dist/rules/indexes/extract/extractor.d.ts.map +1 -0
  503. package/dist/rules/indexes/extract/extractor.js +274 -0
  504. package/dist/rules/indexes/extract/extractor.js.map +1 -0
  505. package/dist/rules/indexes/extract/types.d.ts +211 -0
  506. package/dist/rules/indexes/extract/types.d.ts.map +1 -0
  507. package/dist/rules/indexes/extract/types.js +14 -0
  508. package/dist/rules/indexes/extract/types.js.map +1 -0
  509. package/dist/rules/indexes/extractHandler.d.ts +16 -0
  510. package/dist/rules/indexes/extractHandler.d.ts.map +1 -0
  511. package/dist/rules/indexes/extractHandler.js +100 -0
  512. package/dist/rules/indexes/extractHandler.js.map +1 -0
  513. package/dist/rules/indexes/extractTool.d.ts +15 -0
  514. package/dist/rules/indexes/extractTool.d.ts.map +1 -0
  515. package/dist/rules/indexes/extractTool.js +55 -0
  516. package/dist/rules/indexes/extractTool.js.map +1 -0
  517. package/dist/rules/indexes/types.d.ts +71 -0
  518. package/dist/rules/indexes/types.d.ts.map +1 -0
  519. package/dist/rules/indexes/types.js +15 -0
  520. package/dist/rules/indexes/types.js.map +1 -0
  521. package/dist/rules/inspect/handler.d.ts +6 -0
  522. package/dist/rules/inspect/handler.d.ts.map +1 -0
  523. package/dist/rules/inspect/handler.js +144 -0
  524. package/dist/rules/inspect/handler.js.map +1 -0
  525. package/dist/rules/inspect/spec.d.ts +37 -0
  526. package/dist/rules/inspect/spec.d.ts.map +1 -0
  527. package/dist/rules/inspect/spec.js +2 -0
  528. package/dist/rules/inspect/spec.js.map +1 -0
  529. package/dist/rules/inspect/tools.d.ts +21 -0
  530. package/dist/rules/inspect/tools.d.ts.map +1 -0
  531. package/dist/rules/inspect/tools.js +21 -0
  532. package/dist/rules/inspect/tools.js.map +1 -0
  533. package/dist/rules/internal/extract.d.ts +28 -0
  534. package/dist/rules/internal/extract.d.ts.map +1 -0
  535. package/dist/rules/internal/extract.js +25 -0
  536. package/dist/rules/internal/extract.js.map +1 -0
  537. package/dist/rules/internal/index.d.ts +82 -0
  538. package/dist/rules/internal/index.d.ts.map +1 -0
  539. package/dist/rules/internal/index.js +103 -0
  540. package/dist/rules/internal/index.js.map +1 -0
  541. package/dist/rules/internal/node.d.ts +18 -0
  542. package/dist/rules/internal/node.d.ts.map +1 -0
  543. package/dist/rules/internal/node.js +27 -0
  544. package/dist/rules/internal/node.js.map +1 -0
  545. package/dist/rules/internal/rtdb.d.ts +20 -0
  546. package/dist/rules/internal/rtdb.d.ts.map +1 -0
  547. package/dist/rules/internal/rtdb.js +15 -0
  548. package/dist/rules/internal/rtdb.js.map +1 -0
  549. package/dist/rules/linter/ast-utils.d.ts +97 -0
  550. package/dist/rules/linter/ast-utils.d.ts.map +1 -0
  551. package/dist/rules/linter/ast-utils.js +491 -0
  552. package/dist/rules/linter/ast-utils.js.map +1 -0
  553. package/dist/rules/linter/hallucinations.d.ts +34 -0
  554. package/dist/rules/linter/hallucinations.d.ts.map +1 -0
  555. package/dist/rules/linter/hallucinations.js +334 -0
  556. package/dist/rules/linter/hallucinations.js.map +1 -0
  557. package/dist/rules/linter/linter.d.ts +84 -0
  558. package/dist/rules/linter/linter.d.ts.map +1 -0
  559. package/dist/rules/linter/linter.js +783 -0
  560. package/dist/rules/linter/linter.js.map +1 -0
  561. package/dist/rules/modules/resolver-browser.d.ts +41 -0
  562. package/dist/rules/modules/resolver-browser.d.ts.map +1 -0
  563. package/dist/rules/modules/resolver-browser.js +63 -0
  564. package/dist/rules/modules/resolver-browser.js.map +1 -0
  565. package/dist/rules/modules/resolver-core.d.ts +51 -0
  566. package/dist/rules/modules/resolver-core.d.ts.map +1 -0
  567. package/dist/rules/modules/resolver-core.js +338 -0
  568. package/dist/rules/modules/resolver-core.js.map +1 -0
  569. package/dist/rules/modules/resolver.d.ts +17 -0
  570. package/dist/rules/modules/resolver.d.ts.map +1 -0
  571. package/dist/rules/modules/resolver.js +49 -0
  572. package/dist/rules/modules/resolver.js.map +1 -0
  573. package/dist/rules/modules/stdlib/atomic.rules +52 -0
  574. package/dist/rules/modules/stdlib/atomic.test.json +152 -0
  575. package/dist/rules/modules/stdlib/auth.rules +7 -0
  576. package/dist/rules/modules/stdlib/auth.test.json +53 -0
  577. package/dist/rules/modules/stdlib/content.rules +50 -0
  578. package/dist/rules/modules/stdlib/content.test.json +238 -0
  579. package/dist/rules/modules/stdlib/counters.rules +41 -0
  580. package/dist/rules/modules/stdlib/counters.test.json +254 -0
  581. package/dist/rules/modules/stdlib/geometry.rules +43 -0
  582. package/dist/rules/modules/stdlib/geometry.test.json +200 -0
  583. package/dist/rules/modules/stdlib/joining.rules +49 -0
  584. package/dist/rules/modules/stdlib/joining.test.json +287 -0
  585. package/dist/rules/modules/stdlib/lifecycle.rules +51 -0
  586. package/dist/rules/modules/stdlib/lifecycle.test.json +288 -0
  587. package/dist/rules/modules/stdlib/lobby.rules +44 -0
  588. package/dist/rules/modules/stdlib/lobby.test.json +32 -0
  589. package/dist/rules/modules/stdlib/membership.rules +40 -0
  590. package/dist/rules/modules/stdlib/membership.test.json +107 -0
  591. package/dist/rules/modules/stdlib/spaces.rules +46 -0
  592. package/dist/rules/modules/stdlib/spaces.test.json +392 -0
  593. package/dist/rules/modules/stdlib/state.rules +28 -0
  594. package/dist/rules/modules/stdlib/state.test.json +55 -0
  595. package/dist/rules/modules/stdlib/timing.rules +20 -0
  596. package/dist/rules/modules/stdlib/timing.test.json +106 -0
  597. package/dist/rules/modules/stdlib/transitions.rules +34 -0
  598. package/dist/rules/modules/stdlib/transitions.test.json +86 -0
  599. package/dist/rules/modules/stdlib/turns.rules +27 -0
  600. package/dist/rules/modules/stdlib/turns.test.json +64 -0
  601. package/dist/rules/modules/stdlib/validation.rules +31 -0
  602. package/dist/rules/modules/stdlib/validation.test.json +184 -0
  603. package/dist/rules/modules/stdlib-content.d.ts +11 -0
  604. package/dist/rules/modules/stdlib-content.d.ts.map +1 -0
  605. package/dist/rules/modules/stdlib-content.js +590 -0
  606. package/dist/rules/modules/stdlib-content.js.map +1 -0
  607. package/dist/rules/rtdb/compiled-rules.d.ts +11 -0
  608. package/dist/rules/rtdb/compiled-rules.d.ts.map +1 -0
  609. package/dist/rules/rtdb/compiled-rules.js +95 -0
  610. package/dist/rules/rtdb/compiled-rules.js.map +1 -0
  611. package/dist/rules/rtdb/constraints/atoms.d.ts +29 -0
  612. package/dist/rules/rtdb/constraints/atoms.d.ts.map +1 -0
  613. package/dist/rules/rtdb/constraints/atoms.js +43 -0
  614. package/dist/rules/rtdb/constraints/atoms.js.map +1 -0
  615. package/dist/rules/rtdb/constraints/compose.d.ts +16 -0
  616. package/dist/rules/rtdb/constraints/compose.d.ts.map +1 -0
  617. package/dist/rules/rtdb/constraints/compose.js +15 -0
  618. package/dist/rules/rtdb/constraints/compose.js.map +1 -0
  619. package/dist/rules/rtdb/constraints/data.d.ts +30 -0
  620. package/dist/rules/rtdb/constraints/data.d.ts.map +1 -0
  621. package/dist/rules/rtdb/constraints/data.js +46 -0
  622. package/dist/rules/rtdb/constraints/data.js.map +1 -0
  623. package/dist/rules/rtdb/constraints/document.d.ts +57 -0
  624. package/dist/rules/rtdb/constraints/document.d.ts.map +1 -0
  625. package/dist/rules/rtdb/constraints/document.js +85 -0
  626. package/dist/rules/rtdb/constraints/document.js.map +1 -0
  627. package/dist/rules/rtdb/constraints/game.d.ts +30 -0
  628. package/dist/rules/rtdb/constraints/game.d.ts.map +1 -0
  629. package/dist/rules/rtdb/constraints/game.js +49 -0
  630. package/dist/rules/rtdb/constraints/game.js.map +1 -0
  631. package/dist/rules/rtdb/constraints/index.d.ts +12 -0
  632. package/dist/rules/rtdb/constraints/index.d.ts.map +1 -0
  633. package/dist/rules/rtdb/constraints/index.js +9 -0
  634. package/dist/rules/rtdb/constraints/index.js.map +1 -0
  635. package/dist/rules/rtdb/constraints/policies.d.ts +16 -0
  636. package/dist/rules/rtdb/constraints/policies.d.ts.map +1 -0
  637. package/dist/rules/rtdb/constraints/policies.js +17 -0
  638. package/dist/rules/rtdb/constraints/policies.js.map +1 -0
  639. package/dist/rules/rtdb/constraints/ruleset.d.ts +5 -0
  640. package/dist/rules/rtdb/constraints/ruleset.d.ts.map +1 -0
  641. package/dist/rules/rtdb/constraints/ruleset.js +132 -0
  642. package/dist/rules/rtdb/constraints/ruleset.js.map +1 -0
  643. package/dist/rules/rtdb/constraints/schema.d.ts +17 -0
  644. package/dist/rules/rtdb/constraints/schema.d.ts.map +1 -0
  645. package/dist/rules/rtdb/constraints/schema.js +74 -0
  646. package/dist/rules/rtdb/constraints/schema.js.map +1 -0
  647. package/dist/rules/rtdb/constraints/types.d.ts +22 -0
  648. package/dist/rules/rtdb/constraints/types.d.ts.map +1 -0
  649. package/dist/rules/rtdb/constraints/types.js +2 -0
  650. package/dist/rules/rtdb/constraints/types.js.map +1 -0
  651. package/dist/rules/rtdb/constraints/write-rules-file.d.ts +24 -0
  652. package/dist/rules/rtdb/constraints/write-rules-file.d.ts.map +1 -0
  653. package/dist/rules/rtdb/constraints/write-rules-file.js +30 -0
  654. package/dist/rules/rtdb/constraints/write-rules-file.js.map +1 -0
  655. package/dist/rules/rtdb/expression-engine.d.ts +8 -0
  656. package/dist/rules/rtdb/expression-engine.d.ts.map +1 -0
  657. package/dist/rules/rtdb/expression-engine.js +20 -0
  658. package/dist/rules/rtdb/expression-engine.js.map +1 -0
  659. package/dist/rules/rtdb/grammar/RtdbExpr.ohm +98 -0
  660. package/dist/rules/rtdb/grammar/RtdbExpr.ohm.generated.d.ts +2 -0
  661. package/dist/rules/rtdb/grammar/RtdbExpr.ohm.generated.d.ts.map +1 -0
  662. package/dist/rules/rtdb/grammar/RtdbExpr.ohm.generated.js +103 -0
  663. package/dist/rules/rtdb/grammar/RtdbExpr.ohm.generated.js.map +1 -0
  664. package/dist/rules/rtdb/grammar/RtdbExprParser.d.ts +3 -0
  665. package/dist/rules/rtdb/grammar/RtdbExprParser.d.ts.map +1 -0
  666. package/dist/rules/rtdb/grammar/RtdbExprParser.js +56 -0
  667. package/dist/rules/rtdb/grammar/RtdbExprParser.js.map +1 -0
  668. package/dist/rules/rtdb/grammar/linter.d.ts +3 -0
  669. package/dist/rules/rtdb/grammar/linter.d.ts.map +1 -0
  670. package/dist/rules/rtdb/grammar/linter.js +73 -0
  671. package/dist/rules/rtdb/grammar/linter.js.map +1 -0
  672. package/dist/rules/rtdb/grammar/simulator.d.ts +30 -0
  673. package/dist/rules/rtdb/grammar/simulator.d.ts.map +1 -0
  674. package/dist/rules/rtdb/grammar/simulator.js +282 -0
  675. package/dist/rules/rtdb/grammar/simulator.js.map +1 -0
  676. package/dist/rules/rtdb/grammar/validator.d.ts +3 -0
  677. package/dist/rules/rtdb/grammar/validator.d.ts.map +1 -0
  678. package/dist/rules/rtdb/grammar/validator.js +91 -0
  679. package/dist/rules/rtdb/grammar/validator.js.map +1 -0
  680. package/dist/rules/rtdb/simulation/handler.d.ts +6 -0
  681. package/dist/rules/rtdb/simulation/handler.d.ts.map +1 -0
  682. package/dist/rules/rtdb/simulation/handler.js +325 -0
  683. package/dist/rules/rtdb/simulation/handler.js.map +1 -0
  684. package/dist/rules/rtdb/simulation/spec.d.ts +102 -0
  685. package/dist/rules/rtdb/simulation/spec.d.ts.map +1 -0
  686. package/dist/rules/rtdb/simulation/spec.js +40 -0
  687. package/dist/rules/rtdb/simulation/spec.js.map +1 -0
  688. package/dist/rules/rtdb/types.d.ts +166 -0
  689. package/dist/rules/rtdb/types.d.ts.map +1 -0
  690. package/dist/rules/rtdb/types.js +21 -0
  691. package/dist/rules/rtdb/types.js.map +1 -0
  692. package/dist/rules/simulator/evaluator.d.ts +206 -0
  693. package/dist/rules/simulator/evaluator.d.ts.map +1 -0
  694. package/dist/rules/simulator/evaluator.js +1251 -0
  695. package/dist/rules/simulator/evaluator.js.map +1 -0
  696. package/dist/rules/simulator/expression/eval-errors.d.ts +86 -0
  697. package/dist/rules/simulator/expression/eval-errors.d.ts.map +1 -0
  698. package/dist/rules/simulator/expression/eval-errors.js +68 -0
  699. package/dist/rules/simulator/expression/eval-errors.js.map +1 -0
  700. package/dist/rules/simulator/expression/evaluator.d.ts +43 -0
  701. package/dist/rules/simulator/expression/evaluator.d.ts.map +1 -0
  702. package/dist/rules/simulator/expression/evaluator.js +298 -0
  703. package/dist/rules/simulator/expression/evaluator.js.map +1 -0
  704. package/dist/rules/simulator/expression/lexer.d.ts +36 -0
  705. package/dist/rules/simulator/expression/lexer.d.ts.map +1 -0
  706. package/dist/rules/simulator/expression/lexer.js +318 -0
  707. package/dist/rules/simulator/expression/lexer.js.map +1 -0
  708. package/dist/rules/simulator/expression/parser.d.ts +39 -0
  709. package/dist/rules/simulator/expression/parser.d.ts.map +1 -0
  710. package/dist/rules/simulator/expression/parser.js +329 -0
  711. package/dist/rules/simulator/expression/parser.js.map +1 -0
  712. package/dist/rules/simulator/expression/types.d.ts +137 -0
  713. package/dist/rules/simulator/expression/types.d.ts.map +1 -0
  714. package/dist/rules/simulator/expression/types.js +90 -0
  715. package/dist/rules/simulator/expression/types.js.map +1 -0
  716. package/dist/rules/simulator/expression/walk-data.d.ts +52 -0
  717. package/dist/rules/simulator/expression/walk-data.d.ts.map +1 -0
  718. package/dist/rules/simulator/expression/walk-data.js +167 -0
  719. package/dist/rules/simulator/expression/walk-data.js.map +1 -0
  720. package/dist/rules/simulator/firestore-set.d.ts +25 -0
  721. package/dist/rules/simulator/firestore-set.d.ts.map +1 -0
  722. package/dist/rules/simulator/firestore-set.js +89 -0
  723. package/dist/rules/simulator/firestore-set.js.map +1 -0
  724. package/dist/rules/simulator/handler.d.ts +47 -0
  725. package/dist/rules/simulator/handler.d.ts.map +1 -0
  726. package/dist/rules/simulator/handler.js +644 -0
  727. package/dist/rules/simulator/handler.js.map +1 -0
  728. package/dist/rules/simulator/mapdiff.d.ts +29 -0
  729. package/dist/rules/simulator/mapdiff.d.ts.map +1 -0
  730. package/dist/rules/simulator/mapdiff.js +72 -0
  731. package/dist/rules/simulator/mapdiff.js.map +1 -0
  732. package/dist/rules/simulator/project-after-state.d.ts +33 -0
  733. package/dist/rules/simulator/project-after-state.d.ts.map +1 -0
  734. package/dist/rules/simulator/project-after-state.js +88 -0
  735. package/dist/rules/simulator/project-after-state.js.map +1 -0
  736. package/dist/rules/simulator/query-proof.d.ts +80 -0
  737. package/dist/rules/simulator/query-proof.d.ts.map +1 -0
  738. package/dist/rules/simulator/query-proof.js +142 -0
  739. package/dist/rules/simulator/query-proof.js.map +1 -0
  740. package/dist/rules/simulator/value-equality.d.ts +8 -0
  741. package/dist/rules/simulator/value-equality.d.ts.map +1 -0
  742. package/dist/rules/simulator/value-equality.js +40 -0
  743. package/dist/rules/simulator/value-equality.js.map +1 -0
  744. package/dist/rules/simulator/wrappers/base.d.ts +129 -0
  745. package/dist/rules/simulator/wrappers/base.d.ts.map +1 -0
  746. package/dist/rules/simulator/wrappers/base.js +90 -0
  747. package/dist/rules/simulator/wrappers/base.js.map +1 -0
  748. package/dist/rules/simulator/wrappers/bytes.d.ts +45 -0
  749. package/dist/rules/simulator/wrappers/bytes.d.ts.map +1 -0
  750. package/dist/rules/simulator/wrappers/bytes.js +130 -0
  751. package/dist/rules/simulator/wrappers/bytes.js.map +1 -0
  752. package/dist/rules/simulator/wrappers/duration.d.ts +76 -0
  753. package/dist/rules/simulator/wrappers/duration.d.ts.map +1 -0
  754. package/dist/rules/simulator/wrappers/duration.js +176 -0
  755. package/dist/rules/simulator/wrappers/duration.js.map +1 -0
  756. package/dist/rules/simulator/wrappers/float.d.ts +52 -0
  757. package/dist/rules/simulator/wrappers/float.d.ts.map +1 -0
  758. package/dist/rules/simulator/wrappers/float.js +88 -0
  759. package/dist/rules/simulator/wrappers/float.js.map +1 -0
  760. package/dist/rules/simulator/wrappers/latlng.d.ts +40 -0
  761. package/dist/rules/simulator/wrappers/latlng.d.ts.map +1 -0
  762. package/dist/rules/simulator/wrappers/latlng.js +100 -0
  763. package/dist/rules/simulator/wrappers/latlng.js.map +1 -0
  764. package/dist/rules/simulator/wrappers/path.d.ts +75 -0
  765. package/dist/rules/simulator/wrappers/path.d.ts.map +1 -0
  766. package/dist/rules/simulator/wrappers/path.js +158 -0
  767. package/dist/rules/simulator/wrappers/path.js.map +1 -0
  768. package/dist/rules/simulator/wrappers/reference.d.ts +82 -0
  769. package/dist/rules/simulator/wrappers/reference.d.ts.map +1 -0
  770. package/dist/rules/simulator/wrappers/reference.js +145 -0
  771. package/dist/rules/simulator/wrappers/reference.js.map +1 -0
  772. package/dist/rules/simulator/wrappers/timestamp.d.ts +86 -0
  773. package/dist/rules/simulator/wrappers/timestamp.d.ts.map +1 -0
  774. package/dist/rules/simulator/wrappers/timestamp.js +207 -0
  775. package/dist/rules/simulator/wrappers/timestamp.js.map +1 -0
  776. package/dist/rules/simulator/wrappers/vector.d.ts +43 -0
  777. package/dist/rules/simulator/wrappers/vector.d.ts.map +1 -0
  778. package/dist/rules/simulator/wrappers/vector.js +80 -0
  779. package/dist/rules/simulator/wrappers/vector.js.map +1 -0
  780. package/dist/rules/simulator-tools-impl.d.ts +64 -0
  781. package/dist/rules/simulator-tools-impl.d.ts.map +1 -0
  782. package/dist/rules/simulator-tools-impl.js +462 -0
  783. package/dist/rules/simulator-tools-impl.js.map +1 -0
  784. package/dist/rules/simulator.d.ts +20 -0
  785. package/dist/rules/simulator.d.ts.map +1 -0
  786. package/dist/rules/simulator.js +24 -0
  787. package/dist/rules/simulator.js.map +1 -0
  788. package/dist/rules/stdlib-modules.d.ts +73 -0
  789. package/dist/rules/stdlib-modules.d.ts.map +1 -0
  790. package/dist/rules/stdlib-modules.js +837 -0
  791. package/dist/rules/stdlib-modules.js.map +1 -0
  792. package/dist/rules/stdlib-tools.d.ts +19 -0
  793. package/dist/rules/stdlib-tools.d.ts.map +1 -0
  794. package/dist/rules/stdlib-tools.js +164 -0
  795. package/dist/rules/stdlib-tools.js.map +1 -0
  796. package/dist/rules/test/handler.d.ts +21 -0
  797. package/dist/rules/test/handler.d.ts.map +1 -0
  798. package/dist/rules/test/handler.js +214 -0
  799. package/dist/rules/test/handler.js.map +1 -0
  800. package/dist/rules/test/spec.d.ts +677 -0
  801. package/dist/rules/test/spec.d.ts.map +1 -0
  802. package/dist/rules/test/spec.js +327 -0
  803. package/dist/rules/test/spec.js.map +1 -0
  804. package/dist/rules/tools.d.ts +41 -0
  805. package/dist/rules/tools.d.ts.map +1 -0
  806. package/dist/rules/tools.js +120 -0
  807. package/dist/rules/tools.js.map +1 -0
  808. package/dist/rules/write/handler.d.ts +6 -0
  809. package/dist/rules/write/handler.d.ts.map +1 -0
  810. package/dist/rules/write/handler.js +126 -0
  811. package/dist/rules/write/handler.js.map +1 -0
  812. package/dist/rules/write/spec.d.ts +28 -0
  813. package/dist/rules/write/spec.d.ts.map +1 -0
  814. package/dist/rules/write/spec.js +2 -0
  815. package/dist/rules/write/spec.js.map +1 -0
  816. package/dist/sandbox/admin-compat.d.ts +20 -0
  817. package/dist/sandbox/admin-compat.d.ts.map +1 -0
  818. package/dist/sandbox/admin-compat.js +19 -0
  819. package/dist/sandbox/admin-compat.js.map +1 -0
  820. package/dist/sandbox/admin-firestore/error-translation.d.ts +90 -0
  821. package/dist/sandbox/admin-firestore/error-translation.d.ts.map +1 -0
  822. package/dist/sandbox/admin-firestore/error-translation.js +214 -0
  823. package/dist/sandbox/admin-firestore/error-translation.js.map +1 -0
  824. package/dist/sandbox/admin-firestore/get-admin-firestore.d.ts +44 -0
  825. package/dist/sandbox/admin-firestore/get-admin-firestore.d.ts.map +1 -0
  826. package/dist/sandbox/admin-firestore/get-admin-firestore.js +62 -0
  827. package/dist/sandbox/admin-firestore/get-admin-firestore.js.map +1 -0
  828. package/dist/sandbox/admin-firestore/get-firestore.d.ts +34 -0
  829. package/dist/sandbox/admin-firestore/get-firestore.d.ts.map +1 -0
  830. package/dist/sandbox/admin-firestore/get-firestore.js +71 -0
  831. package/dist/sandbox/admin-firestore/get-firestore.js.map +1 -0
  832. package/dist/sandbox/admin-firestore/index.d.ts +36 -0
  833. package/dist/sandbox/admin-firestore/index.d.ts.map +1 -0
  834. package/dist/sandbox/admin-firestore/index.js +33 -0
  835. package/dist/sandbox/admin-firestore/index.js.map +1 -0
  836. package/dist/sandbox/admin-firestore/listeners.d.ts +46 -0
  837. package/dist/sandbox/admin-firestore/listeners.d.ts.map +1 -0
  838. package/dist/sandbox/admin-firestore/listeners.js +290 -0
  839. package/dist/sandbox/admin-firestore/listeners.js.map +1 -0
  840. package/dist/sandbox/admin-firestore/local-handle.d.ts +23 -0
  841. package/dist/sandbox/admin-firestore/local-handle.d.ts.map +1 -0
  842. package/dist/sandbox/admin-firestore/local-handle.js +74 -0
  843. package/dist/sandbox/admin-firestore/local-handle.js.map +1 -0
  844. package/dist/sandbox/admin-firestore/remote/batch.d.ts +6 -0
  845. package/dist/sandbox/admin-firestore/remote/batch.d.ts.map +1 -0
  846. package/dist/sandbox/admin-firestore/remote/batch.js +38 -0
  847. package/dist/sandbox/admin-firestore/remote/batch.js.map +1 -0
  848. package/dist/sandbox/admin-firestore/remote/channel.d.ts +22 -0
  849. package/dist/sandbox/admin-firestore/remote/channel.d.ts.map +1 -0
  850. package/dist/sandbox/admin-firestore/remote/channel.js +27 -0
  851. package/dist/sandbox/admin-firestore/remote/channel.js.map +1 -0
  852. package/dist/sandbox/admin-firestore/remote/doc-ref.d.ts +10 -0
  853. package/dist/sandbox/admin-firestore/remote/doc-ref.d.ts.map +1 -0
  854. package/dist/sandbox/admin-firestore/remote/doc-ref.js +88 -0
  855. package/dist/sandbox/admin-firestore/remote/doc-ref.js.map +1 -0
  856. package/dist/sandbox/admin-firestore/remote/errors.d.ts +17 -0
  857. package/dist/sandbox/admin-firestore/remote/errors.d.ts.map +1 -0
  858. package/dist/sandbox/admin-firestore/remote/errors.js +32 -0
  859. package/dist/sandbox/admin-firestore/remote/errors.js.map +1 -0
  860. package/dist/sandbox/admin-firestore/remote/listeners.d.ts +43 -0
  861. package/dist/sandbox/admin-firestore/remote/listeners.d.ts.map +1 -0
  862. package/dist/sandbox/admin-firestore/remote/listeners.js +89 -0
  863. package/dist/sandbox/admin-firestore/remote/listeners.js.map +1 -0
  864. package/dist/sandbox/admin-firestore/remote/query.d.ts +47 -0
  865. package/dist/sandbox/admin-firestore/remote/query.d.ts.map +1 -0
  866. package/dist/sandbox/admin-firestore/remote/query.js +186 -0
  867. package/dist/sandbox/admin-firestore/remote/query.js.map +1 -0
  868. package/dist/sandbox/admin-firestore/remote/remote-firestore.d.ts +55 -0
  869. package/dist/sandbox/admin-firestore/remote/remote-firestore.d.ts.map +1 -0
  870. package/dist/sandbox/admin-firestore/remote/remote-firestore.js +111 -0
  871. package/dist/sandbox/admin-firestore/remote/remote-firestore.js.map +1 -0
  872. package/dist/sandbox/admin-firestore/remote/snapshots.d.ts +10 -0
  873. package/dist/sandbox/admin-firestore/remote/snapshots.d.ts.map +1 -0
  874. package/dist/sandbox/admin-firestore/remote/snapshots.js +37 -0
  875. package/dist/sandbox/admin-firestore/remote/snapshots.js.map +1 -0
  876. package/dist/sandbox/admin-firestore/remote/transaction.d.ts +19 -0
  877. package/dist/sandbox/admin-firestore/remote/transaction.d.ts.map +1 -0
  878. package/dist/sandbox/admin-firestore/remote/transaction.js +105 -0
  879. package/dist/sandbox/admin-firestore/remote/transaction.js.map +1 -0
  880. package/dist/sandbox/admin-firestore/remote/value-codec.d.ts +52 -0
  881. package/dist/sandbox/admin-firestore/remote/value-codec.d.ts.map +1 -0
  882. package/dist/sandbox/admin-firestore/remote/value-codec.js +120 -0
  883. package/dist/sandbox/admin-firestore/remote/value-codec.js.map +1 -0
  884. package/dist/sandbox/admin-firestore/remote/wire-types.d.ts +111 -0
  885. package/dist/sandbox/admin-firestore/remote/wire-types.d.ts.map +1 -0
  886. package/dist/sandbox/admin-firestore/remote/wire-types.js +8 -0
  887. package/dist/sandbox/admin-firestore/remote/wire-types.js.map +1 -0
  888. package/dist/sandbox/admin-firestore/types.d.ts +59 -0
  889. package/dist/sandbox/admin-firestore/types.d.ts.map +1 -0
  890. package/dist/sandbox/admin-firestore/types.js +6 -0
  891. package/dist/sandbox/admin-firestore/types.js.map +1 -0
  892. package/dist/sandbox/branches/index.d.ts +141 -0
  893. package/dist/sandbox/branches/index.d.ts.map +1 -0
  894. package/dist/sandbox/branches/index.js +327 -0
  895. package/dist/sandbox/branches/index.js.map +1 -0
  896. package/dist/sandbox/firestore/admin-compat/batch.d.ts +34 -0
  897. package/dist/sandbox/firestore/admin-compat/batch.d.ts.map +1 -0
  898. package/dist/sandbox/firestore/admin-compat/batch.js +73 -0
  899. package/dist/sandbox/firestore/admin-compat/batch.js.map +1 -0
  900. package/dist/sandbox/firestore/admin-compat/doc-ref.d.ts +38 -0
  901. package/dist/sandbox/firestore/admin-compat/doc-ref.d.ts.map +1 -0
  902. package/dist/sandbox/firestore/admin-compat/doc-ref.js +154 -0
  903. package/dist/sandbox/firestore/admin-compat/doc-ref.js.map +1 -0
  904. package/dist/sandbox/firestore/admin-compat/firestore.d.ts +47 -0
  905. package/dist/sandbox/firestore/admin-compat/firestore.d.ts.map +1 -0
  906. package/dist/sandbox/firestore/admin-compat/firestore.js +117 -0
  907. package/dist/sandbox/firestore/admin-compat/firestore.js.map +1 -0
  908. package/dist/sandbox/firestore/admin-compat/index.d.ts +49 -0
  909. package/dist/sandbox/firestore/admin-compat/index.d.ts.map +1 -0
  910. package/dist/sandbox/firestore/admin-compat/index.js +27 -0
  911. package/dist/sandbox/firestore/admin-compat/index.js.map +1 -0
  912. package/dist/sandbox/firestore/admin-compat/paths.d.ts +37 -0
  913. package/dist/sandbox/firestore/admin-compat/paths.d.ts.map +1 -0
  914. package/dist/sandbox/firestore/admin-compat/paths.js +49 -0
  915. package/dist/sandbox/firestore/admin-compat/paths.js.map +1 -0
  916. package/dist/sandbox/firestore/admin-compat/query.d.ts +261 -0
  917. package/dist/sandbox/firestore/admin-compat/query.d.ts.map +1 -0
  918. package/dist/sandbox/firestore/admin-compat/query.js +758 -0
  919. package/dist/sandbox/firestore/admin-compat/query.js.map +1 -0
  920. package/dist/sandbox/firestore/admin-compat/read-translation.d.ts +8 -0
  921. package/dist/sandbox/firestore/admin-compat/read-translation.d.ts.map +1 -0
  922. package/dist/sandbox/firestore/admin-compat/read-translation.js +59 -0
  923. package/dist/sandbox/firestore/admin-compat/read-translation.js.map +1 -0
  924. package/dist/sandbox/firestore/admin-compat/snapshots.d.ts +39 -0
  925. package/dist/sandbox/firestore/admin-compat/snapshots.d.ts.map +1 -0
  926. package/dist/sandbox/firestore/admin-compat/snapshots.js +50 -0
  927. package/dist/sandbox/firestore/admin-compat/snapshots.js.map +1 -0
  928. package/dist/sandbox/firestore/admin-compat/transaction.d.ts +35 -0
  929. package/dist/sandbox/firestore/admin-compat/transaction.d.ts.map +1 -0
  930. package/dist/sandbox/firestore/admin-compat/transaction.js +88 -0
  931. package/dist/sandbox/firestore/admin-compat/transaction.js.map +1 -0
  932. package/dist/sandbox/firestore/admin-compat/types.d.ts +297 -0
  933. package/dist/sandbox/firestore/admin-compat/types.d.ts.map +1 -0
  934. package/dist/sandbox/firestore/admin-compat/types.js +127 -0
  935. package/dist/sandbox/firestore/admin-compat/types.js.map +1 -0
  936. package/dist/sandbox/firestore/admin-compat/value-order.d.ts +49 -0
  937. package/dist/sandbox/firestore/admin-compat/value-order.d.ts.map +1 -0
  938. package/dist/sandbox/firestore/admin-compat/value-order.js +172 -0
  939. package/dist/sandbox/firestore/admin-compat/value-order.js.map +1 -0
  940. package/dist/sandbox/firestore/auto-id.d.ts +26 -0
  941. package/dist/sandbox/firestore/auto-id.d.ts.map +1 -0
  942. package/dist/sandbox/firestore/auto-id.js +36 -0
  943. package/dist/sandbox/firestore/auto-id.js.map +1 -0
  944. package/dist/sandbox/firestore/converters/bytes-geopoint.d.ts +48 -0
  945. package/dist/sandbox/firestore/converters/bytes-geopoint.d.ts.map +1 -0
  946. package/dist/sandbox/firestore/converters/bytes-geopoint.js +85 -0
  947. package/dist/sandbox/firestore/converters/bytes-geopoint.js.map +1 -0
  948. package/dist/sandbox/firestore/converters/fieldvalue.d.ts +69 -0
  949. package/dist/sandbox/firestore/converters/fieldvalue.d.ts.map +1 -0
  950. package/dist/sandbox/firestore/converters/fieldvalue.js +166 -0
  951. package/dist/sandbox/firestore/converters/fieldvalue.js.map +1 -0
  952. package/dist/sandbox/firestore/converters/reference.d.ts +31 -0
  953. package/dist/sandbox/firestore/converters/reference.d.ts.map +1 -0
  954. package/dist/sandbox/firestore/converters/reference.js +51 -0
  955. package/dist/sandbox/firestore/converters/reference.js.map +1 -0
  956. package/dist/sandbox/firestore/converters/timestamp.d.ts +32 -0
  957. package/dist/sandbox/firestore/converters/timestamp.d.ts.map +1 -0
  958. package/dist/sandbox/firestore/converters/timestamp.js +63 -0
  959. package/dist/sandbox/firestore/converters/timestamp.js.map +1 -0
  960. package/dist/sandbox/firestore/converters/user-timestamp.d.ts +46 -0
  961. package/dist/sandbox/firestore/converters/user-timestamp.d.ts.map +1 -0
  962. package/dist/sandbox/firestore/converters/user-timestamp.js +65 -0
  963. package/dist/sandbox/firestore/converters/user-timestamp.js.map +1 -0
  964. package/dist/sandbox/firestore/converters/vector.d.ts +24 -0
  965. package/dist/sandbox/firestore/converters/vector.d.ts.map +1 -0
  966. package/dist/sandbox/firestore/converters/vector.js +53 -0
  967. package/dist/sandbox/firestore/converters/vector.js.map +1 -0
  968. package/dist/sandbox/firestore/errors.d.ts +82 -0
  969. package/dist/sandbox/firestore/errors.d.ts.map +1 -0
  970. package/dist/sandbox/firestore/errors.js +54 -0
  971. package/dist/sandbox/firestore/errors.js.map +1 -0
  972. package/dist/sandbox/firestore/event-log.d.ts +99 -0
  973. package/dist/sandbox/firestore/event-log.d.ts.map +1 -0
  974. package/dist/sandbox/firestore/event-log.js +67 -0
  975. package/dist/sandbox/firestore/event-log.js.map +1 -0
  976. package/dist/sandbox/firestore/field-merge.d.ts +64 -0
  977. package/dist/sandbox/firestore/field-merge.d.ts.map +1 -0
  978. package/dist/sandbox/firestore/field-merge.js +221 -0
  979. package/dist/sandbox/firestore/field-merge.js.map +1 -0
  980. package/dist/sandbox/firestore/list-query-proof.d.ts +77 -0
  981. package/dist/sandbox/firestore/list-query-proof.d.ts.map +1 -0
  982. package/dist/sandbox/firestore/list-query-proof.js +170 -0
  983. package/dist/sandbox/firestore/list-query-proof.js.map +1 -0
  984. package/dist/sandbox/firestore/local-environment.d.ts +825 -0
  985. package/dist/sandbox/firestore/local-environment.d.ts.map +1 -0
  986. package/dist/sandbox/firestore/local-environment.js +3129 -0
  987. package/dist/sandbox/firestore/local-environment.js.map +1 -0
  988. package/dist/sandbox/firestore/local-state.d.ts +196 -0
  989. package/dist/sandbox/firestore/local-state.d.ts.map +1 -0
  990. package/dist/sandbox/firestore/local-state.js +413 -0
  991. package/dist/sandbox/firestore/local-state.js.map +1 -0
  992. package/dist/sandbox/firestore/overlay-backing.d.ts +44 -0
  993. package/dist/sandbox/firestore/overlay-backing.d.ts.map +1 -0
  994. package/dist/sandbox/firestore/overlay-backing.js +82 -0
  995. package/dist/sandbox/firestore/overlay-backing.js.map +1 -0
  996. package/dist/sandbox/firestore/sentinel-capture.d.ts +30 -0
  997. package/dist/sandbox/firestore/sentinel-capture.d.ts.map +1 -0
  998. package/dist/sandbox/firestore/sentinel-capture.js +61 -0
  999. package/dist/sandbox/firestore/sentinel-capture.js.map +1 -0
  1000. package/dist/sandbox/firestore/snapshot-listeners.d.ts +290 -0
  1001. package/dist/sandbox/firestore/snapshot-listeners.d.ts.map +1 -0
  1002. package/dist/sandbox/firestore/snapshot-listeners.js +194 -0
  1003. package/dist/sandbox/firestore/snapshot-listeners.js.map +1 -0
  1004. package/dist/sandbox/firestore/topk.d.ts +12 -0
  1005. package/dist/sandbox/firestore/topk.d.ts.map +1 -0
  1006. package/dist/sandbox/firestore/topk.js +42 -0
  1007. package/dist/sandbox/firestore/topk.js.map +1 -0
  1008. package/dist/sandbox/firestore/transaction-merge.d.ts +55 -0
  1009. package/dist/sandbox/firestore/transaction-merge.d.ts.map +1 -0
  1010. package/dist/sandbox/firestore/transaction-merge.js +107 -0
  1011. package/dist/sandbox/firestore/transaction-merge.js.map +1 -0
  1012. package/dist/sandbox/firestore/transaction-types.d.ts +155 -0
  1013. package/dist/sandbox/firestore/transaction-types.d.ts.map +1 -0
  1014. package/dist/sandbox/firestore/transaction-types.js +10 -0
  1015. package/dist/sandbox/firestore/transaction-types.js.map +1 -0
  1016. package/dist/sandbox/firestore/transaction.d.ts +79 -0
  1017. package/dist/sandbox/firestore/transaction.d.ts.map +1 -0
  1018. package/dist/sandbox/firestore/transaction.js +95 -0
  1019. package/dist/sandbox/firestore/transaction.js.map +1 -0
  1020. package/dist/sandbox/firestore/value-equality.d.ts +2 -0
  1021. package/dist/sandbox/firestore/value-equality.d.ts.map +1 -0
  1022. package/dist/sandbox/firestore/value-equality.js +35 -0
  1023. package/dist/sandbox/firestore/value-equality.js.map +1 -0
  1024. package/dist/sandbox/firestore/value-resolver.d.ts +172 -0
  1025. package/dist/sandbox/firestore/value-resolver.d.ts.map +1 -0
  1026. package/dist/sandbox/firestore/value-resolver.js +221 -0
  1027. package/dist/sandbox/firestore/value-resolver.js.map +1 -0
  1028. package/dist/sandbox/firestore/wire-encoder.d.ts +14 -0
  1029. package/dist/sandbox/firestore/wire-encoder.d.ts.map +1 -0
  1030. package/dist/sandbox/firestore/wire-encoder.js +130 -0
  1031. package/dist/sandbox/firestore/wire-encoder.js.map +1 -0
  1032. package/dist/sandbox/index.d.ts +53 -0
  1033. package/dist/sandbox/index.d.ts.map +1 -0
  1034. package/dist/sandbox/index.js +65 -0
  1035. package/dist/sandbox/index.js.map +1 -0
  1036. package/dist/sandbox/internal/client-app.d.ts +29 -0
  1037. package/dist/sandbox/internal/client-app.d.ts.map +1 -0
  1038. package/dist/sandbox/internal/client-app.js +18 -0
  1039. package/dist/sandbox/internal/client-app.js.map +1 -0
  1040. package/dist/sandbox/internal/firebase-error.d.ts +14 -0
  1041. package/dist/sandbox/internal/firebase-error.d.ts.map +1 -0
  1042. package/dist/sandbox/internal/firebase-error.js +22 -0
  1043. package/dist/sandbox/internal/firebase-error.js.map +1 -0
  1044. package/dist/sandbox/internal/index.d.ts +39 -0
  1045. package/dist/sandbox/internal/index.d.ts.map +1 -0
  1046. package/dist/sandbox/internal/index.js +75 -0
  1047. package/dist/sandbox/internal/index.js.map +1 -0
  1048. package/dist/sandbox/internal/local-brand.d.ts +3 -0
  1049. package/dist/sandbox/internal/local-brand.d.ts.map +1 -0
  1050. package/dist/sandbox/internal/local-brand.js +3 -0
  1051. package/dist/sandbox/internal/local-brand.js.map +1 -0
  1052. package/dist/sandbox/internal/provenance.d.ts +16 -0
  1053. package/dist/sandbox/internal/provenance.d.ts.map +1 -0
  1054. package/dist/sandbox/internal/provenance.js +139 -0
  1055. package/dist/sandbox/internal/provenance.js.map +1 -0
  1056. package/dist/sandbox/internal/sandbox-impl.d.ts +328 -0
  1057. package/dist/sandbox/internal/sandbox-impl.d.ts.map +1 -0
  1058. package/dist/sandbox/internal/sandbox-impl.js +695 -0
  1059. package/dist/sandbox/internal/sandbox-impl.js.map +1 -0
  1060. package/dist/sandbox/operation-record.d.ts +48 -0
  1061. package/dist/sandbox/operation-record.d.ts.map +1 -0
  1062. package/dist/sandbox/operation-record.js +143 -0
  1063. package/dist/sandbox/operation-record.js.map +1 -0
  1064. package/dist/sandbox/persistence/backends.d.ts +37 -0
  1065. package/dist/sandbox/persistence/backends.d.ts.map +1 -0
  1066. package/dist/sandbox/persistence/backends.js +202 -0
  1067. package/dist/sandbox/persistence/backends.js.map +1 -0
  1068. package/dist/sandbox/persistence/chunk-format.d.ts +58 -0
  1069. package/dist/sandbox/persistence/chunk-format.d.ts.map +1 -0
  1070. package/dist/sandbox/persistence/chunk-format.js +163 -0
  1071. package/dist/sandbox/persistence/chunk-format.js.map +1 -0
  1072. package/dist/sandbox/persistence/controller.d.ts +39 -0
  1073. package/dist/sandbox/persistence/controller.d.ts.map +1 -0
  1074. package/dist/sandbox/persistence/controller.js +505 -0
  1075. package/dist/sandbox/persistence/controller.js.map +1 -0
  1076. package/dist/sandbox/persistence/index.d.ts +13 -0
  1077. package/dist/sandbox/persistence/index.d.ts.map +1 -0
  1078. package/dist/sandbox/persistence/index.js +5 -0
  1079. package/dist/sandbox/persistence/index.js.map +1 -0
  1080. package/dist/sandbox/persistence/serialize.d.ts +53 -0
  1081. package/dist/sandbox/persistence/serialize.d.ts.map +1 -0
  1082. package/dist/sandbox/persistence/serialize.js +98 -0
  1083. package/dist/sandbox/persistence/serialize.js.map +1 -0
  1084. package/dist/sandbox/persistence/types.d.ts +118 -0
  1085. package/dist/sandbox/persistence/types.d.ts.map +1 -0
  1086. package/dist/sandbox/persistence/types.js +15 -0
  1087. package/dist/sandbox/persistence/types.js.map +1 -0
  1088. package/dist/sandbox/remote.d.ts +118 -0
  1089. package/dist/sandbox/remote.d.ts.map +1 -0
  1090. package/dist/sandbox/remote.js +60 -0
  1091. package/dist/sandbox/remote.js.map +1 -0
  1092. package/dist/sandbox/replay/index.d.ts +106 -0
  1093. package/dist/sandbox/replay/index.d.ts.map +1 -0
  1094. package/dist/sandbox/replay/index.js +246 -0
  1095. package/dist/sandbox/replay/index.js.map +1 -0
  1096. package/dist/sandbox/sandbox-context.d.ts +48 -0
  1097. package/dist/sandbox/sandbox-context.d.ts.map +1 -0
  1098. package/dist/sandbox/sandbox-context.js +97 -0
  1099. package/dist/sandbox/sandbox-context.js.map +1 -0
  1100. package/dist/sandbox/tab-sync/index.d.ts +120 -0
  1101. package/dist/sandbox/tab-sync/index.d.ts.map +1 -0
  1102. package/dist/sandbox/tab-sync/index.js +273 -0
  1103. package/dist/sandbox/tab-sync/index.js.map +1 -0
  1104. package/dist/sandbox/types/auth-state.d.ts +23 -0
  1105. package/dist/sandbox/types/auth-state.d.ts.map +1 -0
  1106. package/dist/sandbox/types/auth-state.js +8 -0
  1107. package/dist/sandbox/types/auth-state.js.map +1 -0
  1108. package/dist/sandbox/types/context.d.ts +33 -0
  1109. package/dist/sandbox/types/context.d.ts.map +1 -0
  1110. package/dist/sandbox/types/context.js +5 -0
  1111. package/dist/sandbox/types/context.js.map +1 -0
  1112. package/dist/sandbox/types/errors.d.ts +109 -0
  1113. package/dist/sandbox/types/errors.d.ts.map +1 -0
  1114. package/dist/sandbox/types/errors.js +41 -0
  1115. package/dist/sandbox/types/errors.js.map +1 -0
  1116. package/dist/sandbox/types/events.d.ts +577 -0
  1117. package/dist/sandbox/types/events.d.ts.map +1 -0
  1118. package/dist/sandbox/types/events.js +7 -0
  1119. package/dist/sandbox/types/events.js.map +1 -0
  1120. package/dist/sandbox/types/index.d.ts +24 -0
  1121. package/dist/sandbox/types/index.d.ts.map +1 -0
  1122. package/dist/sandbox/types/index.js +17 -0
  1123. package/dist/sandbox/types/index.js.map +1 -0
  1124. package/dist/sandbox/types/operation.d.ts +60 -0
  1125. package/dist/sandbox/types/operation.d.ts.map +1 -0
  1126. package/dist/sandbox/types/operation.js +3 -0
  1127. package/dist/sandbox/types/operation.js.map +1 -0
  1128. package/dist/sandbox/types/persistence.d.ts +130 -0
  1129. package/dist/sandbox/types/persistence.d.ts.map +1 -0
  1130. package/dist/sandbox/types/persistence.js +7 -0
  1131. package/dist/sandbox/types/persistence.js.map +1 -0
  1132. package/dist/sandbox/types/service.d.ts +357 -0
  1133. package/dist/sandbox/types/service.d.ts.map +1 -0
  1134. package/dist/sandbox/types/service.js +6 -0
  1135. package/dist/sandbox/types/service.js.map +1 -0
  1136. package/dist/storage/admin/api.d.ts +206 -0
  1137. package/dist/storage/admin/api.d.ts.map +1 -0
  1138. package/dist/storage/admin/api.js +349 -0
  1139. package/dist/storage/admin/api.js.map +1 -0
  1140. package/dist/storage/admin/handler.d.ts +28 -0
  1141. package/dist/storage/admin/handler.d.ts.map +1 -0
  1142. package/dist/storage/admin/handler.js +82 -0
  1143. package/dist/storage/admin/handler.js.map +1 -0
  1144. package/dist/storage/admin/spec.d.ts +64 -0
  1145. package/dist/storage/admin/spec.d.ts.map +1 -0
  1146. package/dist/storage/admin/spec.js +8 -0
  1147. package/dist/storage/admin/spec.js.map +1 -0
  1148. package/dist/storage/admin/tools.d.ts +22 -0
  1149. package/dist/storage/admin/tools.d.ts.map +1 -0
  1150. package/dist/storage/admin/tools.js +90 -0
  1151. package/dist/storage/admin/tools.js.map +1 -0
  1152. package/dist/storage/download.d.ts +41 -0
  1153. package/dist/storage/download.d.ts.map +1 -0
  1154. package/dist/storage/download.js +137 -0
  1155. package/dist/storage/download.js.map +1 -0
  1156. package/dist/storage/enforce.d.ts +5 -0
  1157. package/dist/storage/enforce.d.ts.map +1 -0
  1158. package/dist/storage/enforce.js +147 -0
  1159. package/dist/storage/enforce.js.map +1 -0
  1160. package/dist/storage/errors.d.ts +44 -0
  1161. package/dist/storage/errors.d.ts.map +1 -0
  1162. package/dist/storage/errors.js +64 -0
  1163. package/dist/storage/errors.js.map +1 -0
  1164. package/dist/storage/index.d.ts +45 -0
  1165. package/dist/storage/index.d.ts.map +1 -0
  1166. package/dist/storage/index.js +39 -0
  1167. package/dist/storage/index.js.map +1 -0
  1168. package/dist/storage/instances.d.ts +9 -0
  1169. package/dist/storage/instances.d.ts.map +1 -0
  1170. package/dist/storage/instances.js +24 -0
  1171. package/dist/storage/instances.js.map +1 -0
  1172. package/dist/storage/internal.d.ts +18 -0
  1173. package/dist/storage/internal.d.ts.map +1 -0
  1174. package/dist/storage/internal.js +18 -0
  1175. package/dist/storage/internal.js.map +1 -0
  1176. package/dist/storage/list.d.ts +42 -0
  1177. package/dist/storage/list.d.ts.map +1 -0
  1178. package/dist/storage/list.js +83 -0
  1179. package/dist/storage/list.js.map +1 -0
  1180. package/dist/storage/metadata.d.ts +92 -0
  1181. package/dist/storage/metadata.d.ts.map +1 -0
  1182. package/dist/storage/metadata.js +164 -0
  1183. package/dist/storage/metadata.js.map +1 -0
  1184. package/dist/storage/persistence.d.ts +134 -0
  1185. package/dist/storage/persistence.d.ts.map +1 -0
  1186. package/dist/storage/persistence.js +132 -0
  1187. package/dist/storage/persistence.js.map +1 -0
  1188. package/dist/storage/reference.d.ts +57 -0
  1189. package/dist/storage/reference.d.ts.map +1 -0
  1190. package/dist/storage/reference.js +105 -0
  1191. package/dist/storage/reference.js.map +1 -0
  1192. package/dist/storage/rules.d.ts +339 -0
  1193. package/dist/storage/rules.d.ts.map +1 -0
  1194. package/dist/storage/rules.js +1334 -0
  1195. package/dist/storage/rules.js.map +1 -0
  1196. package/dist/storage/service.d.ts +122 -0
  1197. package/dist/storage/service.d.ts.map +1 -0
  1198. package/dist/storage/service.js +247 -0
  1199. package/dist/storage/service.js.map +1 -0
  1200. package/dist/storage/upload.d.ts +50 -0
  1201. package/dist/storage/upload.d.ts.map +1 -0
  1202. package/dist/storage/upload.js +246 -0
  1203. package/dist/storage/upload.js.map +1 -0
  1204. package/package.json +156 -3
@@ -0,0 +1,1251 @@
1
+ import { assembleExpression } from '../grammar/FirestoreAssembler.js';
2
+ import { MapDiff } from './mapdiff.js';
3
+ import { FirestoreSet } from './firestore-set.js';
4
+ import { rulesValuesEqual } from './value-equality.js';
5
+ import { RulesValue, NO_OP } from './wrappers/base.js';
6
+ import { LatLng } from './wrappers/latlng.js';
7
+ import { Duration } from './wrappers/duration.js';
8
+ import { Timestamp } from './wrappers/timestamp.js';
9
+ import { Bytes } from './wrappers/bytes.js';
10
+ import { Path } from './wrappers/path.js';
11
+ import { RulesFloat } from './wrappers/float.js';
12
+ import { md5 as md5Bytes } from 'js-md5';
13
+ import { sha256 as sha256Bytes } from 'js-sha256';
14
+ // ═══ Evaluation errors ═══
15
+ export class EvalError extends Error {
16
+ expr;
17
+ constructor(message, expr) {
18
+ super(message);
19
+ this.expr = expr;
20
+ this.name = 'EvalError';
21
+ }
22
+ }
23
+ /**
24
+ * Thrown when the simulator encounters a feature it doesn't yet implement
25
+ * (an unknown built-in function, namespace method, or method on a wrapper
26
+ * type we haven't added). Distinct from EvalError so the handler can map it
27
+ * to TestResult.state = 'UNSUPPORTED' instead of a silent DENY — that way
28
+ * agents see "sim abstained" rather than "your rule is wrong" when the gap
29
+ * is on our side. See REBUILD_PLAN.md Item 0.A.
30
+ */
31
+ export class UnsupportedError extends EvalError {
32
+ constructor(message, expr) {
33
+ super(message, expr);
34
+ this.name = 'UnsupportedError';
35
+ }
36
+ }
37
+ /**
38
+ * Records every sub-expression evaluation. Attach to a
39
+ * `SimulationContext.trace` to enable; the evaluator no-ops when absent
40
+ * so unsentinel'd callers pay zero cost.
41
+ *
42
+ * Recording strategy: each call to `evaluate(expr, ...)` is wrapped via
43
+ * `capture(expr, fn)`, which reserves a slot in `entries` (assigning
44
+ * `parent` from the current stack), pushes the slot index, invokes
45
+ * `fn`, then unwinds. This keeps recursion in the existing evaluator
46
+ * paths working unchanged — the wrapper sits on top.
47
+ */
48
+ export class TraceRecorder {
49
+ entries = [];
50
+ parents = [];
51
+ /** Stack of enclosing user-defined function names. The top of stack is
52
+ * stamped onto each pushed entry as `inlinedFrom`. Independent of the
53
+ * `parents` stack because parameter expressions evaluate inside the
54
+ * capture stack but *outside* the function frame. */
55
+ frames = [];
56
+ capture(expr, fn) {
57
+ const index = this.entries.length;
58
+ const parent = this.parents.length > 0 ? this.parents[this.parents.length - 1] : null;
59
+ // Reserve the slot first so any child evaluations point at us as
60
+ // their parent. The `value` field is filled in after `fn()` runs.
61
+ const entry = { source: assembleExpression(expr), kind: expr.type, parent };
62
+ this.stampFrame(entry);
63
+ this.entries.push(entry);
64
+ this.parents.push(index);
65
+ try {
66
+ const value = fn();
67
+ this.entries[index].value = value;
68
+ return value;
69
+ }
70
+ catch (e) {
71
+ this.entries[index].error = e instanceof Error ? e.message : String(e);
72
+ throw e;
73
+ }
74
+ finally {
75
+ this.parents.pop();
76
+ }
77
+ }
78
+ /** Record an operand the evaluator skipped because the LHS short-circuited.
79
+ * Emits an entry under the *current* parent so the trace tree mirrors
80
+ * the source AST (skip placeholder is a sibling of the LHS, not nested). */
81
+ skip(expr) {
82
+ const parent = this.parents.length > 0 ? this.parents[this.parents.length - 1] : null;
83
+ const entry = {
84
+ source: assembleExpression(expr),
85
+ kind: expr.type,
86
+ parent,
87
+ skipped: true,
88
+ };
89
+ this.stampFrame(entry);
90
+ this.entries.push(entry);
91
+ }
92
+ /** Push a user-defined function frame onto the inlinedFrom stack.
93
+ * Returns the popped value of the previous top (currently unused —
94
+ * callers pair `enterFrame` with `exitFrame()` via the stack, not a
95
+ * saved token — but keeping a return value lets future code switch
96
+ * to a save/restore idiom without API churn). */
97
+ enterFrame(name) {
98
+ this.frames.push(name);
99
+ }
100
+ /** Pop the topmost frame. Safe to call on an empty stack — no-ops. */
101
+ exitFrame() {
102
+ this.frames.pop();
103
+ }
104
+ stampFrame(entry) {
105
+ if (this.frames.length === 0)
106
+ return;
107
+ entry.inlinedFrom = { name: this.frames[this.frames.length - 1] };
108
+ }
109
+ /** Annotate the entry at `index` as a `let` binding — the value was
110
+ * bound to `name` in scope. Called from `evaluateFunctionCall` after
111
+ * each `let <name> = <expr>` line; the index is the binding root's
112
+ * position in the trace (`entries.length` captured BEFORE the call).
113
+ * Using a stable index instead of "last entry" is necessary because
114
+ * the binding's expression may have recursive children — the most
115
+ * recently pushed entry is the deepest leaf, not the root. */
116
+ markEntryAsLetBinding(index, name) {
117
+ if (index < 0 || index >= this.entries.length)
118
+ return;
119
+ this.entries[index].letBinding = { name };
120
+ }
121
+ }
122
+ // ═══ Evaluator ═══
123
+ /**
124
+ * Evaluate an expression against the simulation context. The public
125
+ * entry point — recursive calls inside the evaluator come back through
126
+ * here, so the optional trace wrapping naturally applies to every
127
+ * sub-expression.
128
+ */
129
+ export function evaluate(expr, ctx, scope = {}) {
130
+ if (!ctx.trace)
131
+ return evaluateExpr(expr, ctx, scope);
132
+ return ctx.trace.capture(expr, () => evaluateExpr(expr, ctx, scope));
133
+ }
134
+ function evaluateExpr(expr, ctx, scope) {
135
+ switch (expr.type) {
136
+ // ═══ Layer 1: Literals, identifiers, binary ops ═══
137
+ case 'literal':
138
+ // RULES-B5: a source literal written with a decimal point is a FLOAT
139
+ // (`1.0`, `1.5`), even when its value is integral. The grammar's
140
+ // `number_float` rule preserves the original text in `raw`, so a `.`
141
+ // there is the float signal. Bare integer literals (`1`) stay raw
142
+ // numbers (= int). Non-numeric literals (string/bool/null) pass through.
143
+ if (typeof expr.value === 'number' && expr.raw.includes('.')) {
144
+ return new RulesFloat(expr.value);
145
+ }
146
+ return expr.value;
147
+ case 'identifier':
148
+ return resolveIdentifier(expr.name, ctx, scope);
149
+ case 'binaryOp':
150
+ return evaluateBinaryOp(expr.op, expr.left, expr.right, ctx, scope);
151
+ case 'unaryOp': {
152
+ if (expr.op === '!')
153
+ return !evaluate(expr.operand, ctx, scope);
154
+ if (expr.op === '-') {
155
+ const v = evaluate(expr.operand, ctx, scope);
156
+ // RULES-B5: negating a float stays a float (`-1.5 is float`); negating
157
+ // an int stays an int. Preserve the operand's type tag.
158
+ if (v instanceof RulesFloat)
159
+ return new RulesFloat(-v.value);
160
+ return -v;
161
+ }
162
+ throw new EvalError(`Unknown unary op: ${expr.op}`, expr);
163
+ }
164
+ case 'ternary': {
165
+ const cond = evaluate(expr.condition, ctx, scope);
166
+ return cond ? evaluate(expr.consequent, ctx, scope) : evaluate(expr.alternate, ctx, scope);
167
+ }
168
+ // ═══ Layer 2: Member access, bracket access, `in` ═══
169
+ case 'memberAccess': {
170
+ const obj = evaluate(expr.object, ctx, scope);
171
+ // RULES-B2: field access on null/undefined is a runtime ERROR in
172
+ // Firestore rules (CEL field selection has no overload for null),
173
+ // not a silent null. Production denies the request. The common
174
+ // guard `request.auth != null && request.auth.uid == ...` stays
175
+ // safe because `&&` absorbs this error commutatively (RULES-B3) —
176
+ // the `false` LHS uniquely determines the result.
177
+ if (obj === null || obj === undefined) {
178
+ throw new EvalError(`Property '${expr.property}' accessed on ${obj === null ? 'null' : 'undefined'} value`, expr);
179
+ }
180
+ // Wrapper-owned property dispatch (Item 0.B hook 2). Wrappers like
181
+ // Timestamp expose no readable properties — `t.year` returns null,
182
+ // `t.year()` goes through callMethod. The base default returns null
183
+ // so unknown properties stay consistent with Firestore's "missing
184
+ // map key reads as null" semantics.
185
+ if (obj instanceof RulesValue)
186
+ return obj.field(expr.property);
187
+ if (obj instanceof MapDiff) {
188
+ // MapDiff methods that return FirestoreSet
189
+ switch (expr.property) {
190
+ case 'addedKeys': return () => obj.addedKeys();
191
+ case 'removedKeys': return () => obj.removedKeys();
192
+ case 'changedKeys': return () => obj.changedKeys();
193
+ case 'affectedKeys': return () => obj.affectedKeys();
194
+ case 'unchangedKeys': return () => obj.unchangedKeys();
195
+ }
196
+ }
197
+ if (obj instanceof FirestoreSet) {
198
+ switch (expr.property) {
199
+ case 'size': return () => obj.size();
200
+ }
201
+ }
202
+ // RULES-B2: reading a key that does not exist on a map is a runtime
203
+ // ERROR in Firestore rules (`resource.data.typo` denies the request),
204
+ // not the silent null this path used to return — that inversion made
205
+ // `resource.data.typo == null` ALLOW where production DENYs. A key
206
+ // present with an explicit null value still returns null (the key
207
+ // exists). Guard with the `in` operator (`'f' in resource.data`) or
208
+ // `resource.data.get('f', default)` to read a possibly-absent field.
209
+ if (Object.hasOwn(obj, expr.property)) {
210
+ return obj[expr.property];
211
+ }
212
+ throw new EvalError(`No field '${expr.property}' on map (use 'in' or .get() to read a possibly-absent field)`, expr);
213
+ }
214
+ case 'bracketAccess': {
215
+ const obj = evaluate(expr.object, ctx, scope);
216
+ const idx = evaluate(expr.index, ctx, scope);
217
+ // RULES-B2: index/key access on null/undefined errors in production
218
+ // (no CEL index overload for null), absorbed by &&/|| where guarded.
219
+ if (obj === null || obj === undefined) {
220
+ throw new EvalError(`Index access on ${obj === null ? 'null' : 'undefined'} value`, expr);
221
+ }
222
+ // Wrapper-owned bracket dispatch (Item 0.B hook 2, bracket variant).
223
+ // Path is the only wrapper that uses bracket access semantically
224
+ // (`/users/$(uid)`-style binding), but routing every wrapper through
225
+ // `field()` here keeps the contract uniform — wrappers that don't
226
+ // implement bracket access return null.
227
+ if (obj instanceof RulesValue)
228
+ return obj.field(String(idx));
229
+ // RULES-B2 scope note: DYNAMIC bracket/index access (`data[expr]`) is the
230
+ // documented idiom for "look up a key that may be absent" (e.g. a chess
231
+ // rule's `cfg().paths[from][to]`, `resource.data[squareVar]`). The
232
+ // Firebase docs explicitly confirm the ERROR semantics for DOTTED field
233
+ // access (`resource.data.typo`) — handled in `memberAccess` above — but
234
+ // NOT for dynamic index access, and flagship rules rely on null-on-miss
235
+ // here. Without an emulator to confirm bracket-vs-field divergence, we
236
+ // keep dynamic index access returning null on a missing key (the
237
+ // conservative, non-bug-laundering choice — the disputed-edge STOP).
238
+ // Present-with-null still returns null.
239
+ const key = String(idx);
240
+ return Object.hasOwn(obj, key) ? obj[key] : null;
241
+ }
242
+ case 'sliceAccess': {
243
+ // Range slice `obj[start:end]` — Item 4 (REBUILD_PLAN.md).
244
+ // Per type table:
245
+ // List: `[i:j]` returns sub-list, j exclusive.
246
+ // String: `[i:j]` returns substring, j exclusive.
247
+ // Indices must be integers; production rejects non-integer (incl.
248
+ // booleans coerced) so we surface as EvalError → DENY.
249
+ // Out-of-bounds: clamp to [0, length] (matches JS Array.slice and
250
+ // is the standard CEL-style semantics — locked in by parity scenario).
251
+ // Negative indices: rejected (CEL doesn't support Python negatives).
252
+ const obj = evaluate(expr.object, ctx, scope);
253
+ const start = evaluate(expr.start, ctx, scope);
254
+ const end = evaluate(expr.end, ctx, scope);
255
+ if (obj === null || obj === undefined)
256
+ return null;
257
+ if (typeof start !== 'number' || !Number.isInteger(start)) {
258
+ throw new EvalError(`Slice start must be an integer, got ${typeof start}`);
259
+ }
260
+ if (typeof end !== 'number' || !Number.isInteger(end)) {
261
+ throw new EvalError(`Slice end must be an integer, got ${typeof end}`);
262
+ }
263
+ if (start < 0 || end < 0) {
264
+ throw new EvalError(`Slice indices must be non-negative, got [${start}:${end}]`);
265
+ }
266
+ if (typeof obj === 'string')
267
+ return obj.slice(start, end);
268
+ if (Array.isArray(obj))
269
+ return obj.slice(start, end);
270
+ throw new EvalError(`Slice not supported on ${typeof obj}`);
271
+ }
272
+ case 'inExpr': {
273
+ const element = evaluate(expr.element, ctx, scope);
274
+ const collection = evaluate(expr.collection, ctx, scope);
275
+ if (collection === null || collection === undefined)
276
+ return false;
277
+ // Use Rules value equality instead of Array.includes so wrapper
278
+ // value-equality applies (Item 0.B hook 6). Without this,
279
+ // `someTimestamp in [t1, t2]` is always false because `===`
280
+ // doesn't see the wrappers as equal even when their contents
281
+ // match. Map-key membership stays as a String() check — keys
282
+ // are always strings in Firestore rules.
283
+ if (Array.isArray(collection)) {
284
+ return collection.some(v => rulesValuesEqual(v, element));
285
+ }
286
+ // RULES-B7: map-key membership must use OWN keys only. `in` walks the JS
287
+ // prototype chain, so `'toString' in resource.data` wrongly returned
288
+ // true (and an `in`-guarded access then leaked the Object method).
289
+ // Object.hasOwn ignores inherited keys, matching Firestore's "the map
290
+ // has no inherited keys" model.
291
+ if (typeof collection === 'object')
292
+ return Object.hasOwn(collection, String(element));
293
+ return false;
294
+ }
295
+ case 'isExpr': {
296
+ const value = evaluate(expr.value, ctx, scope);
297
+ switch (expr.typeName) {
298
+ case 'string': return typeof value === 'string';
299
+ // RULES-B5: int and float are DISTINCT types. A bare JS number is an
300
+ // int; a RulesFloat wrapper is a float. `number` matches either.
301
+ // `1.5 is int` → false, `1 is float` → false, `1.0 is float` → true.
302
+ case 'int':
303
+ if (value instanceof RulesValue)
304
+ return false;
305
+ return typeof value === 'number';
306
+ case 'float':
307
+ return value instanceof RulesFloat;
308
+ case 'number':
309
+ // Reject wrappers that coerce to NaN (LatLng/Path) — they're
310
+ // not numbers even though valueOf() returns a Number. A RulesFloat
311
+ // IS a number, so it must pass here.
312
+ if (value instanceof RulesFloat)
313
+ return true;
314
+ if (value instanceof RulesValue)
315
+ return false;
316
+ return typeof value === 'number';
317
+ case 'bool': return typeof value === 'boolean';
318
+ case 'null': return value === null;
319
+ case 'list': return Array.isArray(value);
320
+ case 'map':
321
+ // Wrappers are objects but `is map` should be false for them —
322
+ // a Timestamp is not a Map. Filter via instanceof RulesValue.
323
+ if (value instanceof RulesValue)
324
+ return false;
325
+ // RULES-B12: MapDiff and FirestoreSet are internal types, not user
326
+ // maps — `someDiff is map` / `someSet is map` must be false.
327
+ if (value instanceof MapDiff || value instanceof FirestoreSet)
328
+ return false;
329
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
330
+ default:
331
+ // Wrapper type tags ('timestamp', 'duration', 'bytes', 'latlng',
332
+ // 'path') match via typeName. Item 0.B hook 5.
333
+ if (value instanceof RulesValue)
334
+ return value.typeName === expr.typeName;
335
+ return false;
336
+ }
337
+ }
338
+ case 'listLiteral':
339
+ return expr.elements.map(e => evaluate(e, ctx, scope));
340
+ case 'mapLiteral': {
341
+ const map = {};
342
+ for (const entry of expr.entries) {
343
+ const key = String(evaluate(entry.key, ctx, scope));
344
+ map[key] = evaluate(entry.value, ctx, scope);
345
+ }
346
+ return map;
347
+ }
348
+ // ═══ Layer 3: Function calls ═══
349
+ case 'functionCall':
350
+ return evaluateFunctionCall(expr.name, expr.args, ctx, scope);
351
+ // ═══ Layer 4: Method calls ═══
352
+ case 'methodCall':
353
+ return evaluateMethodCall(expr.object, expr.method, expr.args, ctx, scope);
354
+ // ═══ Layer 5: Path literals ═══
355
+ case 'pathLiteral': {
356
+ // Resolve segments — string literals pass through, embedded
357
+ // expressions (`$(uid)`) get evaluated and stringified.
358
+ // Item 5.4: returns Path wrapper instead of raw string so `is path`
359
+ // works. get/exists already String()-coerce, so resolveGet/Exists
360
+ // see the same '/foo/bar' shape via Path.toString().
361
+ const parts = [];
362
+ for (const seg of expr.segments) {
363
+ if (typeof seg === 'string') {
364
+ parts.push(seg);
365
+ }
366
+ else {
367
+ parts.push(String(evaluate(seg, ctx, scope)));
368
+ }
369
+ }
370
+ return new Path(parts);
371
+ }
372
+ default:
373
+ throw new EvalError(`Unknown expression type: ${expr.type}`, expr);
374
+ }
375
+ }
376
+ // ═══ Identifier resolution ═══
377
+ function resolveIdentifier(name, ctx, scope) {
378
+ // Local scope first (let bindings, function parameters)
379
+ if (name in scope)
380
+ return scope[name];
381
+ // Path variables
382
+ if (name in ctx.pathVariables)
383
+ return ctx.pathVariables[name];
384
+ // Built-in globals
385
+ switch (name) {
386
+ case 'request': return ctx.request;
387
+ case 'resource':
388
+ if (ctx.resource === null)
389
+ throw new EvalError('Null value error.');
390
+ return ctx.resource;
391
+ case 'true': return true;
392
+ case 'false': return false;
393
+ case 'null': return null;
394
+ }
395
+ // RULES-B2: an unbound identifier (typo'd variable, undeclared name) is a
396
+ // compile/runtime error in production rules, not a silent `undefined` that
397
+ // later reads as null. Surface it as an EvalError so the handler DENYs and
398
+ // &&/|| can absorb it where guarded.
399
+ throw new EvalError(`Undefined variable '${name}'`);
400
+ }
401
+ /** True for the built-in top-level globals resolvable as values. Used to
402
+ * decide whether an unknown method-call target is a possible (unimplemented)
403
+ * namespace vs a real resolvable identifier. */
404
+ function isKnownGlobal(name) {
405
+ return name === 'request' || name === 'resource'
406
+ || name === 'true' || name === 'false' || name === 'null';
407
+ }
408
+ // ═══ Binary operations with short-circuit ═══
409
+ function evaluateBinaryOp(op, left, right, ctx, scope) {
410
+ // RULES-B3: && and || are COMMUTATIVE error-absorbing operators in CEL,
411
+ // not plain left-to-right short-circuit. Per the CEL spec: "if any of
412
+ // their operands uniquely determines the result (false for &&, true for
413
+ // ||) the other operand may or may not be evaluated, and if that
414
+ // evaluation produces a runtime error, it will be ignored." So
415
+ // `error && false` → false and `error || true` → true — the error is
416
+ // absorbed by the determining operand regardless of position.
417
+ //
418
+ // We preserve laziness in the no-error path (the determining LHS skips
419
+ // the RHS), and only evaluate the RHS to attempt absorption when the LHS
420
+ // either errored or did not determine the result. If neither operand
421
+ // determines the result and one errored, the error propagates (re-thrown)
422
+ // so the handler DENYs.
423
+ if (op === '&&') {
424
+ let lv, lErr;
425
+ try {
426
+ lv = evaluate(left, ctx, scope);
427
+ }
428
+ catch (e) {
429
+ lErr = e;
430
+ }
431
+ if (lErr === undefined && !lv) {
432
+ // LHS is false → determines the result; RHS need not be evaluated.
433
+ ctx.trace?.skip(right);
434
+ return false;
435
+ }
436
+ // LHS errored or was true — RHS may absorb the error (if RHS is false)
437
+ // or determine the truthy result.
438
+ let rv, rErr;
439
+ try {
440
+ rv = evaluate(right, ctx, scope);
441
+ }
442
+ catch (e) {
443
+ rErr = e;
444
+ }
445
+ if (rErr === undefined && !rv)
446
+ return false; // RHS false absorbs any LHS error
447
+ if (lErr !== undefined)
448
+ throw lErr; // LHS error not absorbed
449
+ if (rErr !== undefined)
450
+ throw rErr; // RHS error, LHS was true
451
+ return !!rv;
452
+ }
453
+ if (op === '||') {
454
+ let lv, lErr;
455
+ try {
456
+ lv = evaluate(left, ctx, scope);
457
+ }
458
+ catch (e) {
459
+ lErr = e;
460
+ }
461
+ if (lErr === undefined && lv) {
462
+ // LHS is true → determines the result; RHS need not be evaluated.
463
+ ctx.trace?.skip(right);
464
+ return true;
465
+ }
466
+ let rv, rErr;
467
+ try {
468
+ rv = evaluate(right, ctx, scope);
469
+ }
470
+ catch (e) {
471
+ rErr = e;
472
+ }
473
+ if (rErr === undefined && rv)
474
+ return true; // RHS true absorbs any LHS error
475
+ if (lErr !== undefined)
476
+ throw lErr; // LHS error not absorbed
477
+ if (rErr !== undefined)
478
+ throw rErr; // RHS error, LHS was false
479
+ return !!rv;
480
+ }
481
+ const lv = evaluate(left, ctx, scope);
482
+ const rv = evaluate(right, ctx, scope);
483
+ // Wrapper-aware binary op dispatch (Item 0.B hook 4). Cross-type
484
+ // arithmetic like `Timestamp + Duration → Timestamp` and lexicographic
485
+ // `Bytes < Bytes` are handled here via the wrapper's own `binaryOp`
486
+ // method. NO_OP means the wrapper doesn't claim this op — fall through
487
+ // to the generic numeric switch below.
488
+ //
489
+ // == and != intentionally bypass this hook — they route through
490
+ // rulesValuesEqual above, which already calls the wrapper's
491
+ // `equals()`. Splitting "value equality" from "operator dispatch"
492
+ // keeps each wrapper's contract clean.
493
+ if (op !== '==' && op !== '!=') {
494
+ if (lv instanceof RulesValue) {
495
+ const r = lv.binaryOp(op, rv);
496
+ if (r !== NO_OP)
497
+ return r;
498
+ }
499
+ // RULES-B5: `int OP float` (bare-number LHS, RulesFloat RHS) must yield a
500
+ // float and preserve operand ORDER (unlike Duration/Timestamp this is a
501
+ // genuinely ordered numeric op for `-`/`/`/`%` and the comparisons). Route
502
+ // it through `RulesFloat(lv).binaryOp(op, rv)` so the result re-tags as a
503
+ // float and `5 / 2.0` does float division (2.5), not int truncation.
504
+ if (typeof lv === 'number' && rv instanceof RulesFloat) {
505
+ const r = new RulesFloat(lv).binaryOp(op, rv);
506
+ if (r !== NO_OP)
507
+ return r;
508
+ }
509
+ // Right-side dispatch for symmetric/commutative ops only. Avoids
510
+ // surprises like `1 - duration` accidentally reversing semantics.
511
+ if (rv instanceof RulesValue && (op === '+' || op === '*')) {
512
+ const r = rv.binaryOp(op, lv);
513
+ if (r !== NO_OP)
514
+ return r;
515
+ }
516
+ // Risk 2 (REBUILD_PLAN Item 1.2): if either operand is still a
517
+ // RulesValue at this point, the only remaining path is generic
518
+ // numeric coercion via valueOf(). For LatLng that yields NaN
519
+ // (silent DENY); for Duration/Timestamp/Bytes it would silently
520
+ // drop the type. Both are real type errors in the rule (e.g.
521
+ // `latlng + 1`, `duration > 60`), not sim gaps — surface as
522
+ // EvalError so handler.ts maps to DENY-with-error instead of a
523
+ // misleading "passed but came out false" or "UNSUPPORTED".
524
+ //
525
+ // Exception: `string + wrapper` is documented coercion that flows
526
+ // through `String(rv)` concat in the switch below.
527
+ if (op !== '+' || (typeof lv !== 'string' && typeof rv !== 'string')) {
528
+ if (lv instanceof RulesValue || rv instanceof RulesValue) {
529
+ const lhsType = lv instanceof RulesValue ? lv.typeName : typeof lv;
530
+ const rhsType = rv instanceof RulesValue ? rv.typeName : typeof rv;
531
+ throw new EvalError(`Operator '${op}' is not defined between ${lhsType} and ${rhsType}`);
532
+ }
533
+ }
534
+ }
535
+ // RULES-B12: ordered comparisons (`< > <= >=`) require both operands to be the
536
+ // SAME comparable type. CEL has no cross-type ordering overload, so `'a' < 1`
537
+ // is an error, not the JS-coerced `false` the bare `as number` casts produced.
538
+ // (Comparable wrappers — Bytes, Timestamp, Duration — were already dispatched
539
+ // via binaryOp above; anything reaching here is a raw number or string.)
540
+ if (op === '<' || op === '>' || op === '<=' || op === '>=') {
541
+ const sameComparable = (typeof lv === 'number' && typeof rv === 'number') ||
542
+ (typeof lv === 'string' && typeof rv === 'string');
543
+ if (!sameComparable) {
544
+ throw new EvalError(`Operator '${op}' is not defined between ${typeof lv} and ${typeof rv}`);
545
+ }
546
+ }
547
+ switch (op) {
548
+ case '==': return lv === rv || rulesValuesEqual(lv, rv);
549
+ case '!=': return !(lv === rv || rulesValuesEqual(lv, rv));
550
+ case '<': return lv < rv;
551
+ case '>': return lv > rv;
552
+ case '<=': return lv <= rv;
553
+ case '>=': return lv >= rv;
554
+ case '+': {
555
+ // RULES-B6: CEL `+` has no mixed-type overloads — both operands must be
556
+ // the same type. Allowed: string+string, number+number, list+list (concat).
557
+ // `'a' + 1` is an error (no string+int overload), not the silent
558
+ // `String(rv)` coercion the old impl did. (Wrapper `+` like
559
+ // Timestamp+Duration was already handled above via binaryOp dispatch;
560
+ // the documented `string + wrapper` affordance also flows above this.)
561
+ if (Array.isArray(lv) && Array.isArray(rv))
562
+ return [...lv, ...rv];
563
+ if (typeof lv === 'string' && typeof rv === 'string')
564
+ return lv + rv;
565
+ if (typeof lv === 'number' && typeof rv === 'number')
566
+ return lv + rv;
567
+ // Documented sim affordance (see the `op !== '+'` guard above): a
568
+ // `string + wrapper` (e.g. `'at ' + request.time`) concatenates the
569
+ // wrapper's string form. Preserved here for back-compat with that path.
570
+ if (typeof lv === 'string' && rv instanceof RulesValue)
571
+ return lv + String(rv);
572
+ throw new EvalError(`Operator '+' is not defined between ${Array.isArray(lv) ? 'list' : typeof lv} and ${Array.isArray(rv) ? 'list' : typeof rv}`);
573
+ }
574
+ case '-': return lv - rv;
575
+ case '*': return lv * rv;
576
+ case '/':
577
+ // RULES-B5: both operands are bare numbers here (= int ÷ int; any float
578
+ // operand was already handled by RulesFloat.binaryOp above). CEL INT64
579
+ // division TRUNCATES toward zero (`10 / 4 == 2`) and ERRORS on a zero
580
+ // divisor (it does NOT yield ±Infinity the way JS / float division does).
581
+ // The EvalError propagates via the tri-state so the rule DENYs.
582
+ if (rv === 0) {
583
+ throw new EvalError('Division by zero');
584
+ }
585
+ return Math.trunc(lv / rv);
586
+ case '%':
587
+ // CEL INT64 modulo likewise errors on a zero divisor (JS would give NaN).
588
+ if (rv === 0) {
589
+ throw new EvalError('Modulo by zero');
590
+ }
591
+ return lv % rv;
592
+ default: throw new EvalError(`Unknown binary op: ${op}`);
593
+ }
594
+ }
595
+ // ═══ Type-conversion builtins (RULES-B5 / RULES-B6) ═══
596
+ //
597
+ // CEL's int()/float()/bool() conversions are STRICT — they error on inputs
598
+ // that JS would silently coerce. The pre-fix impl used `parseInt` (which
599
+ // grabs a leading numeric prefix, so `int('12abc')` → 12) and `Boolean`
600
+ // (truthiness, so `bool('false')` → true). Both diverge from prod, which
601
+ // rejects a malformed string outright. Docs: rules.Integer / rules.Float /
602
+ // rules.Boolean (string converters require a fully-valid literal).
603
+ /** `int(x)` — truncate a number/float, parse a strict-integer string, or 0/1 a bool. */
604
+ function rulesInt(v) {
605
+ if (typeof v === 'number')
606
+ return Math.trunc(v);
607
+ if (v instanceof RulesFloat)
608
+ return Math.trunc(v.value);
609
+ if (typeof v === 'boolean')
610
+ return v ? 1 : 0;
611
+ if (typeof v === 'string') {
612
+ // CEL parses the WHOLE string as an integer; a trailing non-digit (or any
613
+ // float/garbage) is an error, not a salvaged prefix like parseInt gives.
614
+ if (/^[+-]?\d+$/.test(v.trim()))
615
+ return parseInt(v.trim(), 10);
616
+ throw new EvalError(`int() cannot convert string '${v}' to an integer`);
617
+ }
618
+ throw new EvalError(`int() cannot convert ${typeof v} to an integer`);
619
+ }
620
+ /** `float(x)` — produce a FLOAT (tagged) from a number, float, or numeric string. */
621
+ function rulesFloatBuiltin(v) {
622
+ if (v instanceof RulesFloat)
623
+ return v;
624
+ if (typeof v === 'number')
625
+ return new RulesFloat(v);
626
+ if (typeof v === 'string') {
627
+ const trimmed = v.trim();
628
+ // Strict numeric form (optional sign, digits, optional fraction). Rejects
629
+ // `'1.2.3'`, `'abc'`, trailing junk — all errors in prod.
630
+ if (/^[+-]?(\d+\.?\d*|\.\d+)$/.test(trimmed))
631
+ return new RulesFloat(parseFloat(trimmed));
632
+ throw new EvalError(`float() cannot convert string '${v}' to a float`);
633
+ }
634
+ throw new EvalError(`float() cannot convert ${typeof v} to a float`);
635
+ }
636
+ /** `bool(x)` — pass a bool through; parse only the exact strings 'true'/'false'. */
637
+ function rulesBool(v) {
638
+ if (typeof v === 'boolean')
639
+ return v;
640
+ if (typeof v === 'string') {
641
+ if (v === 'true')
642
+ return true;
643
+ if (v === 'false')
644
+ return false;
645
+ throw new EvalError(`bool() cannot convert string '${v}' to a boolean`);
646
+ }
647
+ throw new EvalError(`bool() cannot convert ${typeof v} to a boolean`);
648
+ }
649
+ // ═══ Function calls ═══
650
+ function evaluateFunctionCall(name, args, ctx, scope) {
651
+ // Built-in functions
652
+ switch (name) {
653
+ case 'get': {
654
+ const path = String(evaluate(args[0], ctx, scope));
655
+ return resolveGet(path, ctx);
656
+ }
657
+ case 'exists': {
658
+ const path = String(evaluate(args[0], ctx, scope));
659
+ return resolveExists(path, ctx);
660
+ }
661
+ case 'getAfter': {
662
+ // Item 7 — projected post-write state.
663
+ // For the document being written (matches request.path), return the
664
+ // afterState. getafter-batch fix: for a SIBLING doc written earlier
665
+ // (or later) in the same atomic batch/transaction, consult the
666
+ // shared batchProjection map so the rule sees that write too — matches
667
+ // production, where getAfter() reflects the whole batch's post-commit
668
+ // state, not just the current op. Only once neither applies do we
669
+ // fall through to get() (current committed data) for a doc the batch
670
+ // doesn't touch.
671
+ const argVal = evaluate(args[0], ctx, scope);
672
+ const pathStr = String(argVal);
673
+ if (pathStr === ctx.afterStatePath.toString()) {
674
+ // RULES-B8: getAfter() of a doc that won't exist post-write (delete,
675
+ // or projected-null) ERRORS like get() — guard with existsAfter().
676
+ if (ctx.afterState === null) {
677
+ throw new EvalError(`getAfter() of non-existent document '${pathStr}' (guard with existsAfter() first)`);
678
+ }
679
+ return makeGetResource(normalizePath(pathStr, ctx), ctx.afterState);
680
+ }
681
+ const normalized = normalizePath(pathStr, ctx);
682
+ if (ctx.batchProjection?.has(normalized)) {
683
+ const projected = ctx.batchProjection.get(normalized);
684
+ if (projected === null) {
685
+ throw new EvalError(`getAfter() of non-existent document '${pathStr}' (guard with existsAfter() first)`);
686
+ }
687
+ return makeGetResource(normalized, projected);
688
+ }
689
+ return resolveGet(pathStr, ctx);
690
+ }
691
+ case 'existsAfter': {
692
+ // Item 7 — projected existence after the write.
693
+ // Same dispatch shape as getAfter: target path uses ctx.existsAfter,
694
+ // sibling batch writes consult batchProjection, other paths fall
695
+ // through to exists().
696
+ const argVal = evaluate(args[0], ctx, scope);
697
+ const pathStr = String(argVal);
698
+ if (pathStr === ctx.afterStatePath.toString()) {
699
+ return ctx.existsAfter;
700
+ }
701
+ const normalized = normalizePath(pathStr, ctx);
702
+ if (ctx.batchProjection?.has(normalized)) {
703
+ return ctx.batchProjection.get(normalized) !== null;
704
+ }
705
+ return resolveExists(pathStr, ctx);
706
+ }
707
+ case 'debug': {
708
+ const val = evaluate(args[0], ctx, scope);
709
+ return val; // debug() returns its argument
710
+ }
711
+ // RULES-B5 / RULES-B6: type-conversion builtins follow CEL's strict
712
+ // semantics, not JS coercion. `String()` routes a RulesFloat through its
713
+ // `.toString()` so `string(1.0)` → "1.0" (decimal preserved); bare ints
714
+ // and other types stringify normally.
715
+ case 'string': return String(evaluate(args[0], ctx, scope));
716
+ case 'int': return rulesInt(evaluate(args[0], ctx, scope));
717
+ case 'float': return rulesFloatBuiltin(evaluate(args[0], ctx, scope));
718
+ case 'bool': return rulesBool(evaluate(args[0], ctx, scope));
719
+ case 'path': {
720
+ // Item 5.4 — `path('users/alice')` returns a Path wrapper. Accepts
721
+ // strings or existing Paths (idempotent). Other inputs throw —
722
+ // mismatched argument is a real type error in the rule.
723
+ const arg = evaluate(args[0], ctx, scope);
724
+ if (arg instanceof Path)
725
+ return arg;
726
+ if (typeof arg === 'string')
727
+ return Path.fromString(arg);
728
+ throw new EvalError(`path() requires a string argument, got ${typeof arg}`);
729
+ }
730
+ }
731
+ // User-defined functions
732
+ const fn = ctx.functions.get(name);
733
+ if (!fn)
734
+ throw new UnsupportedError(`Unknown function: ${name}`);
735
+ // Bind parameters — parameter expressions evaluate in the CALLER's
736
+ // scope and frame. We push the inlinedFrom frame *after* this loop
737
+ // so parameter traces stay attributed to the caller (where the
738
+ // argument expression literally lives in source).
739
+ const fnScope = { ...scope };
740
+ for (let i = 0; i < fn.parameters.length; i++) {
741
+ fnScope[fn.parameters[i]] = evaluate(args[i], ctx, scope);
742
+ }
743
+ // Push frame for let bindings + body so their trace entries get
744
+ // tagged `inlinedFrom: { name }`. try/finally so an evaluation
745
+ // error still pops the frame and doesn't pollute sibling rules.
746
+ ctx.trace?.enterFrame(name);
747
+ try {
748
+ // Evaluate let bindings. Capture the trace entries' next-write
749
+ // position BEFORE the binding's expression evaluates — that slot
750
+ // will be the binding-root entry (recursive children land below
751
+ // it). After the evaluate returns, tag that root slot with the
752
+ // bound name so the agent can attribute "this subtree was the
753
+ // value of `<name>`" without re-walking the function AST.
754
+ for (const binding of fn.lets) {
755
+ const bindingRootIdx = ctx.trace ? ctx.trace.entries.length : -1;
756
+ fnScope[binding.name] = evaluate(binding.value, ctx, fnScope);
757
+ if (bindingRootIdx >= 0) {
758
+ ctx.trace?.markEntryAsLetBinding(bindingRootIdx, binding.name);
759
+ }
760
+ }
761
+ // Evaluate body
762
+ return evaluate(fn.body, ctx, fnScope);
763
+ }
764
+ finally {
765
+ ctx.trace?.exitFrame();
766
+ }
767
+ }
768
+ // ═══ Method calls ═══
769
+ function evaluateMethodCall(objectExpr, method, args, ctx, scope) {
770
+ // Built-in namespaces (math, timestamp, duration) are not first-class
771
+ // values — they exist only as method-call targets. Dispatch them before
772
+ // calling evaluate(objectExpr), which would resolve the identifier to
773
+ // undefined and fall through to "Unknown method on undefined".
774
+ // Skip the dispatch if the namespace name is shadowed by a local binding
775
+ // or path variable.
776
+ if (objectExpr.type === 'identifier') {
777
+ const name = objectExpr.name;
778
+ if (isBuiltinNamespace(name) && !(name in scope) && !(name in ctx.pathVariables)) {
779
+ const argValues = args.map(a => evaluate(a, ctx, scope));
780
+ return evaluateNamespaceMethod(name, method, argValues);
781
+ }
782
+ // RULES-B2 interaction: an UNKNOWN bare identifier used as a method-call
783
+ // target (e.g. `foo.bar()`) is most likely a namespace the simulator
784
+ // hasn't implemented, not a typo'd value. Resolving it as a value now
785
+ // throws "Undefined variable" (RULES-B2), but we want the agent-facing
786
+ // UNSUPPORTED signal ("sim gap") here rather than a hard ERROR — that's
787
+ // the deliberate affordance the old `undefined.method()` path provided.
788
+ // (Bare `foo` used as a VALUE still errors via resolveIdentifier; only the
789
+ // method-call-target case is lifted to UNSUPPORTED.)
790
+ if (!isBuiltinNamespace(name)
791
+ && !(name in scope)
792
+ && !(name in ctx.pathVariables)
793
+ && !isKnownGlobal(name)) {
794
+ throw new UnsupportedError(`Unknown namespace or method '${name}.${method}()'`);
795
+ }
796
+ }
797
+ const obj = evaluate(objectExpr, ctx, scope);
798
+ const argValues = args.map(a => evaluate(a, ctx, scope));
799
+ // RulesValue method dispatch (Item 0.B hook 3). Placed above MapDiff /
800
+ // FirestoreSet / Map / Array / String branches because every wrapper
801
+ // is also `typeof === 'object'` — without this short-circuit, a
802
+ // Timestamp would fall into the Map branch and dispatch `.size()` on
803
+ // its private `{seconds, nanos}` shape. NO_OP from the wrapper means
804
+ // "I don't have this method" → UnsupportedError, which the handler
805
+ // maps to TestResult.state = 'UNSUPPORTED' (Item 0.A) so agents see
806
+ // a sim gap rather than a silent DENY.
807
+ if (obj instanceof RulesValue) {
808
+ const result = obj.callMethod(method, argValues);
809
+ if (result === NO_OP) {
810
+ throw new UnsupportedError(`Unknown method '${method}' on ${obj.typeName}`);
811
+ }
812
+ return result;
813
+ }
814
+ // MapDiff: obj.diff(other) → MapDiff
815
+ if (method === 'diff' && typeof obj === 'object' && obj !== null && !Array.isArray(obj)) {
816
+ const other = argValues[0];
817
+ if (typeof other === 'object' && other !== null) {
818
+ return new MapDiff(other, obj);
819
+ }
820
+ throw new EvalError('diff() requires a map argument');
821
+ }
822
+ // Callable methods (from memberAccess returning a function)
823
+ if (typeof obj === 'function') {
824
+ return obj(...argValues);
825
+ }
826
+ // FirestoreSet methods
827
+ if (obj instanceof FirestoreSet) {
828
+ switch (method) {
829
+ case 'hasOnly': return obj.hasOnly(argValues[0]);
830
+ case 'hasAll': return obj.hasAll(argValues[0]);
831
+ case 'hasAny': return obj.hasAny(argValues[0]);
832
+ case 'size': return obj.size();
833
+ // Set.difference/union/intersection: the sim CAN compute these (see
834
+ // FirestoreSet.difference/union/intersection), but oracle capture
835
+ // shows production denies every call that reaches them — these
836
+ // methods don't behave as modeled in the real Firestore Rules CEL
837
+ // dialect (see triage: set-algebra-difference-union-intersection /
838
+ // list-methods-concat-removeall-toset scenarios, both false-ALLOW
839
+ // against a prod DENY). Abstain rather than emit a confident wrong
840
+ // verdict; do not "fix" this by re-deriving semantics without a
841
+ // fresh oracle capture that actually isolates correct behavior.
842
+ case 'difference':
843
+ case 'union':
844
+ case 'intersection':
845
+ throw new UnsupportedError(`Set.${method}() is not faithfully modeled by the simulator (oracle capture shows production denies calls that reach it) — abstaining rather than guessing`);
846
+ }
847
+ }
848
+ // MapDiff methods (when called directly, not via memberAccess)
849
+ if (obj instanceof MapDiff) {
850
+ switch (method) {
851
+ case 'addedKeys': return obj.addedKeys();
852
+ case 'removedKeys': return obj.removedKeys();
853
+ case 'changedKeys': return obj.changedKeys();
854
+ case 'affectedKeys': return obj.affectedKeys();
855
+ case 'unchangedKeys': return obj.unchangedKeys();
856
+ }
857
+ }
858
+ // Map/object methods
859
+ if (typeof obj === 'object' && obj !== null && !Array.isArray(obj)) {
860
+ const map = obj;
861
+ switch (method) {
862
+ case 'keys': return new FirestoreSet(Object.keys(map));
863
+ case 'values': return Object.values(map);
864
+ case 'size': return Object.keys(map).length;
865
+ // RULES-B7: key checks use OWN keys only (no prototype-chain leak).
866
+ case 'hasAll': return argValues[0].every(k => Object.hasOwn(map, k));
867
+ case 'hasAny': return argValues[0].some(k => Object.hasOwn(map, k));
868
+ case 'hasOnly': return Object.keys(map).every(k => argValues[0].includes(k));
869
+ case 'diff': {
870
+ const other = argValues[0];
871
+ return new MapDiff(other, map);
872
+ }
873
+ case 'get': {
874
+ // Map.get(key, default) — Item 3 (REBUILD_PLAN.md).
875
+ // Two forms (production behavior locked in by 0.H parity probe):
876
+ // m.get('a', default) → m.a if present, else default
877
+ // m.get(['a','b','c'], default) → m.a.b.c if full walk succeeds, else default
878
+ // Production *always* returns default on any walk failure (missing
879
+ // key, non-map intermediate, etc.). It does NOT distinguish "key
880
+ // missing" from "intermediate missing" — both collapse to default.
881
+ // An explicit `null` value at the leaf is returned as null (not
882
+ // default), since the key is present.
883
+ const keyArg = argValues[0];
884
+ const def = argValues[1];
885
+ if (Array.isArray(keyArg)) {
886
+ // List-form nested traversal
887
+ let cur = map;
888
+ for (const seg of keyArg) {
889
+ if (cur === null || cur === undefined)
890
+ return def;
891
+ // Cannot descend into non-maps (string, number, list, wrapper).
892
+ // Probe scenarios list_form_mid_is_string / list_form_mid_is_int
893
+ // confirmed prod returns default in these cases.
894
+ if (typeof cur !== 'object' || Array.isArray(cur) || cur instanceof RulesValue)
895
+ return def;
896
+ const k = String(seg);
897
+ if (!Object.hasOwn(cur, k))
898
+ return def; // RULES-B7: own keys only
899
+ cur = cur[k];
900
+ }
901
+ return cur;
902
+ }
903
+ // Single-key form
904
+ const k = String(keyArg);
905
+ return Object.hasOwn(map, k) ? map[k] : def; // RULES-B7: own keys only
906
+ }
907
+ }
908
+ }
909
+ // List methods
910
+ if (Array.isArray(obj)) {
911
+ switch (method) {
912
+ case 'size': return obj.length;
913
+ // RULES-B9: list membership uses VALUE equality, not JS identity, so it
914
+ // is consistent with `in` / `removeAll` (which already use
915
+ // rulesValuesEqual). Without this, `[t1].hasAll([t2])` for equal-valued
916
+ // Timestamp/Bytes/Path wrappers wrongly returned false because the two
917
+ // instances aren't `===`.
918
+ case 'hasAll': return argValues[0].every(v => obj.some(o => rulesValuesEqual(o, v)));
919
+ case 'hasAny': return argValues[0].some(v => obj.some(o => rulesValuesEqual(o, v)));
920
+ case 'hasOnly': {
921
+ const allowed = argValues[0];
922
+ return obj.every(v => allowed.some(o => rulesValuesEqual(o, v)));
923
+ }
924
+ case 'join': return obj.join(String(argValues[0] ?? ','));
925
+ // ─── Item 5.2: List.concat / removeAll / toSet ─────────────────────
926
+ case 'concat': {
927
+ const other = argValues[0];
928
+ if (!Array.isArray(other)) {
929
+ throw new EvalError(`List.concat requires a list argument, got ${typeof other}`);
930
+ }
931
+ return [...obj, ...other];
932
+ }
933
+ case 'removeAll': {
934
+ // Returns a new list with all items from `other` removed (by value
935
+ // equality). Uses rulesValuesEqual so wrapper instances (Timestamp,
936
+ // Duration, etc.) compare by value, not by JS identity — without
937
+ // this, `[t1].removeAll([t2])` where t1 and t2 are equal Timestamp
938
+ // wrappers would not remove t1.
939
+ const other = argValues[0];
940
+ if (!Array.isArray(other)) {
941
+ throw new EvalError(`List.removeAll requires a list argument, got ${typeof other}`);
942
+ }
943
+ return obj.filter(v => !other.some(o => rulesValuesEqual(v, o)));
944
+ }
945
+ case 'toSet': {
946
+ // Convert to FirestoreSet. The class stores strings only — coerce
947
+ // via String() on each element. This is sufficient for the common
948
+ // case of `[]Doc.tags.toSet()`-style usage where the source list
949
+ // is already strings. Non-string elements (numbers, booleans) get
950
+ // String()-coerced and may collapse onto each other (1 and '1'
951
+ // become the same set member). Locked-in behavior is whatever the
952
+ // parity scenario confirms; if prod diverges we revisit.
953
+ return new FirestoreSet(obj.map(v => String(v)));
954
+ }
955
+ }
956
+ }
957
+ // String methods
958
+ if (typeof obj === 'string') {
959
+ switch (method) {
960
+ case 'size': return obj.length;
961
+ case 'lower': return obj.toLowerCase();
962
+ case 'upper': return obj.toUpperCase();
963
+ case 'trim': return obj.trim();
964
+ // RULES-B4: split()/matches()/replace() take RE2 *regular expressions*
965
+ // and matches() is a FULL-STRING (anchored) test — production: "returns
966
+ // true if the whole string matches the regex". The previous impl used a
967
+ // partial JS `.test()`, a literal-string `split`, and a first-only
968
+ // `replace`. We compile via the JS RegExp engine (RE2 and JS share the
969
+ // common subset used by rules; exotic RE2-only constructs are a noted
970
+ // limitation, not a behavior divergence for the documented cases) and
971
+ // anchor matches() with `^(?:…)$`, apply `g` to replace/split.
972
+ case 'split': return obj.split(compileRulesRegex(String(argValues[0]), 'g'));
973
+ case 'matches':
974
+ return compileRulesRegex(`^(?:${String(argValues[0])})$`).test(obj);
975
+ case 'replace':
976
+ return obj.replace(compileRulesRegex(String(argValues[0]), 'g'), String(argValues[1]));
977
+ case 'toUtf8': return Bytes.fromUtf8(obj); // Item 5.3 — only producer of Bytes from a literal.
978
+ }
979
+ }
980
+ throw new UnsupportedError(`Unknown method '${method}' on ${typeof obj}`);
981
+ }
982
+ /**
983
+ * Compile a Firestore-rules regex (RULES-B4). Rules regexes follow RE2
984
+ * syntax; we use the JS RegExp engine, which shares the common subset rules
985
+ * actually use. A pattern the engine can't compile is a real type error in
986
+ * the rule (not a sim gap) → EvalError so the handler DENYs, matching
987
+ * production's "invalid regex → error" behavior.
988
+ */
989
+ function compileRulesRegex(pattern, flags = '') {
990
+ try {
991
+ return new RegExp(pattern, flags);
992
+ }
993
+ catch (e) {
994
+ throw new EvalError(`Invalid regex '${pattern}': ${e.message}`);
995
+ }
996
+ }
997
+ // ═══ Built-in namespaces (math, timestamp, duration) ═══
998
+ //
999
+ // Production parity: these used to throw via the "Unknown method on
1000
+ // undefined" path because the identifiers `math` / `timestamp` / `duration`
1001
+ // resolve to undefined. The throw was caught by handler.ts and counted as
1002
+ // deny — silently denying every ALLOW case that touched a math/time
1003
+ // built-in. Confirmed by parity-stress-integration.test.ts (Scenario 1).
1004
+ //
1005
+ // We model timestamp values and duration values as plain numbers
1006
+ // (milliseconds since epoch and milliseconds, respectively). That lets
1007
+ // JavaScript's `<`, `>`, `<=`, `>=`, `+`, `-` work without a wrapper
1008
+ // class. This is sufficient for any rule whose timestamp/duration values
1009
+ // originate from the namespace built-ins themselves.
1010
+ const BUILTIN_NAMESPACES = new Set(['math', 'timestamp', 'duration', 'latlng', 'hashing']);
1011
+ function isBuiltinNamespace(name) {
1012
+ return BUILTIN_NAMESPACES.has(name);
1013
+ }
1014
+ function evaluateNamespaceMethod(ns, method, args) {
1015
+ // RULES-B5: the numeric namespaces (math/latlng/timestamp/duration) operate
1016
+ // on the underlying double — `latlng.value(37.7, ...)` or `math.ceil(1.5)`
1017
+ // doesn't care whether the arg was written as an int or a float literal, and
1018
+ // the constructors store bare numbers. Unwrap RulesFloat args to their raw
1019
+ // value so `args[0] as number` casts inside each handler stay valid (a
1020
+ // RulesFloat is otherwise an object, breaking `latlng.value` equality etc.).
1021
+ // hashing.* takes Bytes/String — no numeric args — so it's left untouched.
1022
+ const a = ns === 'hashing' ? args : args.map(unwrapFloat);
1023
+ switch (ns) {
1024
+ case 'math': return evaluateMathMethod(method, a);
1025
+ case 'timestamp': return evaluateTimestampMethod(method, a);
1026
+ case 'duration': return evaluateDurationMethod(method, a);
1027
+ case 'latlng': return evaluateLatLngMethod(method, a);
1028
+ case 'hashing': return evaluateHashingMethod(method, args);
1029
+ }
1030
+ throw new UnsupportedError(`Unknown namespace '${ns}'`);
1031
+ }
1032
+ /** RULES-B5: collapse a RulesFloat to its raw double; pass everything else through. */
1033
+ function unwrapFloat(v) {
1034
+ return v instanceof RulesFloat ? v.value : v;
1035
+ }
1036
+ // ─── hashing.* (Item 5.3) ───────────────────────────────────────────────
1037
+ //
1038
+ // Per docs (rules.hashing): crc32, crc32c, md5, sha256.
1039
+ // All accept Bytes | String; strings are hashed as UTF-8 bytes.
1040
+ // All return Bytes (round-trips with Bytes.toBase64() / .toHexString()).
1041
+ //
1042
+ // md5 / sha256 use node:crypto (CLAUDE.md: dev tools must use node:* APIs).
1043
+ // crc32 (IEEE 802.3) and crc32c (Castagnoli) are implemented inline via
1044
+ // table lookup since no crc dep is in the SDK.
1045
+ function coerceToBytes(arg) {
1046
+ if (arg instanceof Bytes)
1047
+ return arg;
1048
+ if (typeof arg === 'string')
1049
+ return Bytes.fromUtf8(arg);
1050
+ throw new EvalError(`hashing.* requires Bytes or String, got ${typeof arg}`);
1051
+ }
1052
+ function evaluateHashingMethod(method, args) {
1053
+ const input = coerceToBytes(args[0]);
1054
+ switch (method) {
1055
+ case 'md5': {
1056
+ // js-md5 / js-sha256 keep this path browser-safe (no node:crypto).
1057
+ // Both libs return ArrayBuffer with `.arrayBuffer()`, identical
1058
+ // bytes to the previous createHash() output — pinned by the
1059
+ // hashing.* receipt corpus.
1060
+ return new Bytes(new Uint8Array(md5Bytes.arrayBuffer(input.data)));
1061
+ }
1062
+ case 'sha256': {
1063
+ return new Bytes(new Uint8Array(sha256Bytes.arrayBuffer(input.data)));
1064
+ }
1065
+ case 'crc32': {
1066
+ const u32 = crc32(input.data);
1067
+ return new Bytes(u32ToBeBytes(u32));
1068
+ }
1069
+ case 'crc32c': {
1070
+ const u32 = crc32c(input.data);
1071
+ return new Bytes(u32ToBeBytes(u32));
1072
+ }
1073
+ }
1074
+ throw new UnsupportedError(`Unknown hashing method '${method}'`);
1075
+ }
1076
+ function u32ToBeBytes(n) {
1077
+ // Big-endian 4 bytes — matches how Firestore returns CRC results.
1078
+ return new Uint8Array([
1079
+ (n >>> 24) & 0xff,
1080
+ (n >>> 16) & 0xff,
1081
+ (n >>> 8) & 0xff,
1082
+ n & 0xff,
1083
+ ]);
1084
+ }
1085
+ // CRC32 IEEE 802.3 (polynomial 0xEDB88320, reflected).
1086
+ const CRC32_TABLE = (() => {
1087
+ const t = new Uint32Array(256);
1088
+ for (let i = 0; i < 256; i++) {
1089
+ let c = i;
1090
+ for (let k = 0; k < 8; k++) {
1091
+ c = (c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1);
1092
+ }
1093
+ t[i] = c >>> 0;
1094
+ }
1095
+ return t;
1096
+ })();
1097
+ function crc32(data) {
1098
+ let c = 0xFFFFFFFF;
1099
+ for (let i = 0; i < data.length; i++) {
1100
+ c = CRC32_TABLE[(c ^ data[i]) & 0xff] ^ (c >>> 8);
1101
+ }
1102
+ return (c ^ 0xFFFFFFFF) >>> 0;
1103
+ }
1104
+ // CRC32C Castagnoli (polynomial 0x82F63B78, reflected).
1105
+ const CRC32C_TABLE = (() => {
1106
+ const t = new Uint32Array(256);
1107
+ for (let i = 0; i < 256; i++) {
1108
+ let c = i;
1109
+ for (let k = 0; k < 8; k++) {
1110
+ c = (c & 1) ? (0x82F63B78 ^ (c >>> 1)) : (c >>> 1);
1111
+ }
1112
+ t[i] = c >>> 0;
1113
+ }
1114
+ return t;
1115
+ })();
1116
+ function crc32c(data) {
1117
+ let c = 0xFFFFFFFF;
1118
+ for (let i = 0; i < data.length; i++) {
1119
+ c = CRC32C_TABLE[(c ^ data[i]) & 0xff] ^ (c >>> 8);
1120
+ }
1121
+ return (c ^ 0xFFFFFFFF) >>> 0;
1122
+ }
1123
+ function evaluateLatLngMethod(method, args) {
1124
+ switch (method) {
1125
+ case 'value': {
1126
+ // latlng.value(lat, lng) → LatLng wrapper. Item 1.1 closes the
1127
+ // entire `latlng` namespace gap (was throwing UnsupportedError).
1128
+ const [lat, lng] = args;
1129
+ return new LatLng(lat, lng);
1130
+ }
1131
+ }
1132
+ throw new UnsupportedError(`Unknown latlng method '${method}'`);
1133
+ }
1134
+ function evaluateMathMethod(method, args) {
1135
+ switch (method) {
1136
+ case 'abs': return Math.abs(args[0]);
1137
+ case 'ceil': return Math.ceil(args[0]);
1138
+ case 'floor': return Math.floor(args[0]);
1139
+ case 'round': return Math.round(args[0]);
1140
+ case 'sqrt': return Math.sqrt(args[0]);
1141
+ case 'pow': return Math.pow(args[0], args[1]);
1142
+ case 'isInfinite': {
1143
+ const n = args[0];
1144
+ return Number.isFinite(n) === false && Number.isNaN(n) === false;
1145
+ }
1146
+ case 'isNaN': return Number.isNaN(args[0]);
1147
+ }
1148
+ throw new UnsupportedError(`Unknown math method '${method}'`);
1149
+ }
1150
+ function evaluateTimestampMethod(method, args) {
1151
+ switch (method) {
1152
+ case 'date': {
1153
+ // timestamp.date(year, month, day) → Timestamp at midnight UTC.
1154
+ // Item 1.3 flip: was returning epoch-ms Number which broke
1155
+ // `is timestamp` and dropped sub-second precision under arithmetic.
1156
+ const [y, m, d] = args;
1157
+ return Timestamp.fromYMD(y, m, d);
1158
+ }
1159
+ case 'value': {
1160
+ // timestamp.value(epochMillis) → Timestamp wrapper. Item 1.3 flip.
1161
+ return Timestamp.fromMillis(args[0]);
1162
+ }
1163
+ }
1164
+ throw new UnsupportedError(`Unknown timestamp method '${method}'`);
1165
+ }
1166
+ function evaluateDurationMethod(method, args) {
1167
+ switch (method) {
1168
+ case 'value': {
1169
+ // duration.value(magnitude, unit) → Duration wrapper. Item 1.2 flip:
1170
+ // was returning a millis Number, which silently lost sub-ms precision
1171
+ // and made `is duration` always false. Item 1.0 dispatch hooks +
1172
+ // Duration.binaryOp keep arithmetic and comparison working without
1173
+ // numeric coercion.
1174
+ try {
1175
+ return Duration.fromValue(args[0], args[1]);
1176
+ }
1177
+ catch (e) {
1178
+ // Bad unit string is a real type error in the rule, not a sim gap.
1179
+ throw new EvalError(e.message);
1180
+ }
1181
+ }
1182
+ case 'time': {
1183
+ const [h, m, s, ns] = args;
1184
+ return Duration.fromTime(h, m, s, ns);
1185
+ }
1186
+ case 'abs': {
1187
+ const d = args[0];
1188
+ if (!(d instanceof Duration)) {
1189
+ throw new EvalError(`duration.abs() requires a Duration argument, got ${typeof d}`);
1190
+ }
1191
+ return Duration.abs(d);
1192
+ }
1193
+ }
1194
+ throw new UnsupportedError(`Unknown duration method '${method}'`);
1195
+ }
1196
+ // ═══ get()/exists() mock resolution ═══
1197
+ function normalizePath(rawPath, ctx) {
1198
+ // Path format: /databases/(default)/documents/collection/docId
1199
+ // or /databases/$(database)/documents/collection/docId
1200
+ return rawPath
1201
+ .replace(/\$\(database\)/g, '(default)')
1202
+ .replace(/^\/databases\/\(default\)\/documents\//, '');
1203
+ }
1204
+ /**
1205
+ * Build the resource value `get()` / `getAfter()` return for an existing
1206
+ * document. RULES-B8: production exposes the document identity alongside
1207
+ * `data` — `get(path).id` is the last path segment and `get(path).__name__`
1208
+ * is the full Path. These were never populated, so rules reading them
1209
+ * silently denied (the access returned undefined → now, post-B2, would
1210
+ * even error). Mirrors the top-level `resource` shape (SimResource).
1211
+ */
1212
+ function makeGetResource(relPath, data) {
1213
+ const segs = relPath.split('/').filter(Boolean);
1214
+ const id = segs.length > 0 ? segs[segs.length - 1] : '';
1215
+ const fullSegs = ['databases', '(default)', 'documents', ...segs];
1216
+ return { data, id, __name__: new Path(fullSegs) };
1217
+ }
1218
+ function resolveGet(rawPath, ctx) {
1219
+ const path = normalizePath(rawPath, ctx);
1220
+ let doc = ctx.mockDocuments.get(path);
1221
+ if (!doc && ctx.getDoc) {
1222
+ const faulted = ctx.getDoc(path);
1223
+ if (faulted) {
1224
+ ctx.mockDocuments.set(path, faulted); // memoize for repeat reads in this eval
1225
+ doc = faulted;
1226
+ }
1227
+ }
1228
+ if (doc)
1229
+ return makeGetResource(path, doc);
1230
+ // RULES-B8: get() of a missing document is a runtime ERROR in production
1231
+ // (it performs a real read; a non-existent doc denies the request), NOT
1232
+ // the silent null this used to return. The safe pattern is
1233
+ // `exists(path) && get(path).data...` — the false exists() absorbs this
1234
+ // error commutatively (RULES-B3). Throwing here makes that guard behave
1235
+ // exactly as prod, and makes an UNguarded get() of a missing doc DENY.
1236
+ throw new EvalError(`get() of non-existent document '${path}' (guard with exists() first)`);
1237
+ }
1238
+ function resolveExists(rawPath, ctx) {
1239
+ const path = normalizePath(rawPath, ctx);
1240
+ if (ctx.mockDocuments.has(path))
1241
+ return true;
1242
+ if (ctx.getDoc) {
1243
+ const faulted = ctx.getDoc(path);
1244
+ if (faulted) {
1245
+ ctx.mockDocuments.set(path, faulted); // memoize so a later get() is consistent
1246
+ return true;
1247
+ }
1248
+ }
1249
+ return false;
1250
+ }
1251
+ //# sourceMappingURL=evaluator.js.map