pyric 0.0.1 → 0.1.0-alpha.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -1
- package/dist/app/index.d.ts +81 -0
- package/dist/app/index.d.ts.map +1 -0
- package/dist/app/index.js +78 -0
- package/dist/app/index.js.map +1 -0
- package/dist/auth/index.d.ts +346 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +701 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/prod-backend.d.ts +39 -0
- package/dist/auth/prod-backend.d.ts.map +1 -0
- package/dist/auth/prod-backend.js +179 -0
- package/dist/auth/prod-backend.js.map +1 -0
- package/dist/auth/providers.d.ts +107 -0
- package/dist/auth/providers.d.ts.map +1 -0
- package/dist/auth/providers.js +138 -0
- package/dist/auth/providers.js.map +1 -0
- package/dist/auth/sandbox-backend.d.ts +769 -0
- package/dist/auth/sandbox-backend.d.ts.map +1 -0
- package/dist/auth/sandbox-backend.js +1598 -0
- package/dist/auth/sandbox-backend.js.map +1 -0
- package/dist/auth/target.d.ts +40 -0
- package/dist/auth/target.d.ts.map +1 -0
- package/dist/auth/target.js +28 -0
- package/dist/auth/target.js.map +1 -0
- package/dist/auth/types.d.ts +252 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +26 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/database/constraints/atoms.d.ts +29 -0
- package/dist/database/constraints/atoms.d.ts.map +1 -0
- package/dist/database/constraints/atoms.js +43 -0
- package/dist/database/constraints/atoms.js.map +1 -0
- package/dist/database/constraints/compose.d.ts +16 -0
- package/dist/database/constraints/compose.d.ts.map +1 -0
- package/dist/database/constraints/compose.js +15 -0
- package/dist/database/constraints/compose.js.map +1 -0
- package/dist/database/constraints/data.d.ts +30 -0
- package/dist/database/constraints/data.d.ts.map +1 -0
- package/dist/database/constraints/data.js +46 -0
- package/dist/database/constraints/data.js.map +1 -0
- package/dist/database/constraints/document.d.ts +42 -0
- package/dist/database/constraints/document.d.ts.map +1 -0
- package/dist/database/constraints/document.js +86 -0
- package/dist/database/constraints/document.js.map +1 -0
- package/dist/database/constraints/game.d.ts +30 -0
- package/dist/database/constraints/game.d.ts.map +1 -0
- package/dist/database/constraints/game.js +49 -0
- package/dist/database/constraints/game.js.map +1 -0
- package/dist/database/constraints/index.d.ts +12 -0
- package/dist/database/constraints/index.d.ts.map +1 -0
- package/dist/database/constraints/index.js +9 -0
- package/dist/database/constraints/index.js.map +1 -0
- package/dist/database/constraints/policies.d.ts +16 -0
- package/dist/database/constraints/policies.d.ts.map +1 -0
- package/dist/database/constraints/policies.js +17 -0
- package/dist/database/constraints/policies.js.map +1 -0
- package/dist/database/constraints/ruleset.d.ts +5 -0
- package/dist/database/constraints/ruleset.d.ts.map +1 -0
- package/dist/database/constraints/ruleset.js +132 -0
- package/dist/database/constraints/ruleset.js.map +1 -0
- package/dist/database/constraints/schema.d.ts +17 -0
- package/dist/database/constraints/schema.d.ts.map +1 -0
- package/dist/database/constraints/schema.js +74 -0
- package/dist/database/constraints/schema.js.map +1 -0
- package/dist/database/constraints/types.d.ts +22 -0
- package/dist/database/constraints/types.d.ts.map +1 -0
- package/dist/database/constraints/types.js +2 -0
- package/dist/database/constraints/types.js.map +1 -0
- package/dist/database/crawl/handler.d.ts +7 -0
- package/dist/database/crawl/handler.d.ts.map +1 -0
- package/dist/database/crawl/handler.js +91 -0
- package/dist/database/crawl/handler.js.map +1 -0
- package/dist/database/crawl/semaphore.d.ts +9 -0
- package/dist/database/crawl/semaphore.d.ts.map +1 -0
- package/dist/database/crawl/semaphore.js +27 -0
- package/dist/database/crawl/semaphore.js.map +1 -0
- package/dist/database/crawl/spec.d.ts +33 -0
- package/dist/database/crawl/spec.d.ts.map +1 -0
- package/dist/database/crawl/spec.js +12 -0
- package/dist/database/crawl/spec.js.map +1 -0
- package/dist/database/data/handler.d.ts +9 -0
- package/dist/database/data/handler.d.ts.map +1 -0
- package/dist/database/data/handler.js +96 -0
- package/dist/database/data/handler.js.map +1 -0
- package/dist/database/data/spec.d.ts +77 -0
- package/dist/database/data/spec.d.ts.map +1 -0
- package/dist/database/data/spec.js +17 -0
- package/dist/database/data/spec.js.map +1 -0
- package/dist/database/data/validated.d.ts +8 -0
- package/dist/database/data/validated.d.ts.map +1 -0
- package/dist/database/data/validated.js +99 -0
- package/dist/database/data/validated.js.map +1 -0
- package/dist/database/grammar/RtdbExpr.ohm +98 -0
- package/dist/database/grammar/RtdbExpr.ohm.generated.d.ts +2 -0
- package/dist/database/grammar/RtdbExpr.ohm.generated.d.ts.map +1 -0
- package/dist/database/grammar/RtdbExpr.ohm.generated.js +103 -0
- package/dist/database/grammar/RtdbExpr.ohm.generated.js.map +1 -0
- package/dist/database/grammar/RtdbExprParser.d.ts +5 -0
- package/dist/database/grammar/RtdbExprParser.d.ts.map +1 -0
- package/dist/database/grammar/RtdbExprParser.js +53 -0
- package/dist/database/grammar/RtdbExprParser.js.map +1 -0
- package/dist/database/grammar/linter.d.ts +3 -0
- package/dist/database/grammar/linter.d.ts.map +1 -0
- package/dist/database/grammar/linter.js +66 -0
- package/dist/database/grammar/linter.js.map +1 -0
- package/dist/database/grammar/simulator.d.ts +31 -0
- package/dist/database/grammar/simulator.d.ts.map +1 -0
- package/dist/database/grammar/simulator.js +255 -0
- package/dist/database/grammar/simulator.js.map +1 -0
- package/dist/database/grammar/validator.d.ts +3 -0
- package/dist/database/grammar/validator.d.ts.map +1 -0
- package/dist/database/grammar/validator.js +84 -0
- package/dist/database/grammar/validator.js.map +1 -0
- package/dist/database/host.d.ts +50 -0
- package/dist/database/host.d.ts.map +1 -0
- package/dist/database/host.js +41 -0
- package/dist/database/host.js.map +1 -0
- package/dist/database/index.d.ts +40 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +47 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/initialize-from-app.d.ts +28 -0
- package/dist/database/initialize-from-app.d.ts.map +1 -0
- package/dist/database/initialize-from-app.js +23 -0
- package/dist/database/initialize-from-app.js.map +1 -0
- package/dist/database/ir/handler.d.ts +6 -0
- package/dist/database/ir/handler.d.ts.map +1 -0
- package/dist/database/ir/handler.js +52 -0
- package/dist/database/ir/handler.js.map +1 -0
- package/dist/database/ir/spec.d.ts +25 -0
- package/dist/database/ir/spec.d.ts.map +1 -0
- package/dist/database/ir/spec.js +11 -0
- package/dist/database/ir/spec.js.map +1 -0
- package/dist/database/mapper.d.ts +9 -0
- package/dist/database/mapper.d.ts.map +1 -0
- package/dist/database/mapper.js +115 -0
- package/dist/database/mapper.js.map +1 -0
- package/dist/database/modular.d.ts +604 -0
- package/dist/database/modular.d.ts.map +1 -0
- package/dist/database/modular.js +1226 -0
- package/dist/database/modular.js.map +1 -0
- package/dist/database/replay.d.ts +33 -0
- package/dist/database/replay.d.ts.map +1 -0
- package/dist/database/replay.js +124 -0
- package/dist/database/replay.js.map +1 -0
- package/dist/database/resolver.d.ts +4 -0
- package/dist/database/resolver.d.ts.map +1 -0
- package/dist/database/resolver.js +66 -0
- package/dist/database/resolver.js.map +1 -0
- package/dist/database/sandbox/backend.d.ts +403 -0
- package/dist/database/sandbox/backend.d.ts.map +1 -0
- package/dist/database/sandbox/backend.js +1467 -0
- package/dist/database/sandbox/backend.js.map +1 -0
- package/dist/database/sandbox/data-tree.d.ts +123 -0
- package/dist/database/sandbox/data-tree.d.ts.map +1 -0
- package/dist/database/sandbox/data-tree.js +310 -0
- package/dist/database/sandbox/data-tree.js.map +1 -0
- package/dist/database/sandbox/normalize.d.ts +77 -0
- package/dist/database/sandbox/normalize.d.ts.map +1 -0
- package/dist/database/sandbox/normalize.js +165 -0
- package/dist/database/sandbox/normalize.js.map +1 -0
- package/dist/database/sandbox/push-id.d.ts +32 -0
- package/dist/database/sandbox/push-id.d.ts.map +1 -0
- package/dist/database/sandbox/push-id.js +82 -0
- package/dist/database/sandbox/push-id.js.map +1 -0
- package/dist/database/sandbox/query.d.ts +175 -0
- package/dist/database/sandbox/query.d.ts.map +1 -0
- package/dist/database/sandbox/query.js +269 -0
- package/dist/database/sandbox/query.js.map +1 -0
- package/dist/database/sandbox/rules-eval.d.ts +69 -0
- package/dist/database/sandbox/rules-eval.d.ts.map +1 -0
- package/dist/database/sandbox/rules-eval.js +124 -0
- package/dist/database/sandbox/rules-eval.js.map +1 -0
- package/dist/database/sandbox/sentinels.d.ts +71 -0
- package/dist/database/sandbox/sentinels.d.ts.map +1 -0
- package/dist/database/sandbox/sentinels.js +92 -0
- package/dist/database/sandbox/sentinels.js.map +1 -0
- package/dist/database/simulation/handler.d.ts +6 -0
- package/dist/database/simulation/handler.d.ts.map +1 -0
- package/dist/database/simulation/handler.js +236 -0
- package/dist/database/simulation/handler.js.map +1 -0
- package/dist/database/simulation/spec.d.ts +69 -0
- package/dist/database/simulation/spec.d.ts.map +1 -0
- package/dist/database/simulation/spec.js +25 -0
- package/dist/database/simulation/spec.js.map +1 -0
- package/dist/database/tools.d.ts +22 -0
- package/dist/database/tools.d.ts.map +1 -0
- package/dist/database/tools.js +272 -0
- package/dist/database/tools.js.map +1 -0
- package/dist/database/types.d.ts +210 -0
- package/dist/database/types.d.ts.map +1 -0
- package/dist/database/types.js +26 -0
- package/dist/database/types.js.map +1 -0
- package/dist/database/write/handler.d.ts +7 -0
- package/dist/database/write/handler.d.ts.map +1 -0
- package/dist/database/write/handler.js +42 -0
- package/dist/database/write/handler.js.map +1 -0
- package/dist/database/write/spec.d.ts +18 -0
- package/dist/database/write/spec.d.ts.map +1 -0
- package/dist/database/write/spec.js +7 -0
- package/dist/database/write/spec.js.map +1 -0
- package/dist/firestore/index.d.ts +533 -0
- package/dist/firestore/index.d.ts.map +1 -0
- package/dist/firestore/index.js +1536 -0
- package/dist/firestore/index.js.map +1 -0
- package/dist/firestore/tools.d.ts +67 -0
- package/dist/firestore/tools.d.ts.map +1 -0
- package/dist/firestore/tools.js +318 -0
- package/dist/firestore/tools.js.map +1 -0
- package/dist/firestore-values/index.d.ts +63 -0
- package/dist/firestore-values/index.d.ts.map +1 -0
- package/dist/firestore-values/index.js +148 -0
- package/dist/firestore-values/index.js.map +1 -0
- package/dist/project-scope.d.ts +5 -0
- package/dist/project-scope.d.ts.map +1 -0
- package/dist/project-scope.js +2 -0
- package/dist/project-scope.js.map +1 -0
- package/dist/rules/extract.d.ts +28 -0
- package/dist/rules/extract.d.ts.map +1 -0
- package/dist/rules/extract.js +25 -0
- package/dist/rules/extract.js.map +1 -0
- package/dist/rules/generators/assembler.d.ts +19 -0
- package/dist/rules/generators/assembler.d.ts.map +1 -0
- package/dist/rules/generators/assembler.js +292 -0
- package/dist/rules/generators/assembler.js.map +1 -0
- package/dist/rules/generators/expressions.d.ts +52 -0
- package/dist/rules/generators/expressions.d.ts.map +1 -0
- package/dist/rules/generators/expressions.js +117 -0
- package/dist/rules/generators/expressions.js.map +1 -0
- package/dist/rules/generators/grid.d.ts +22 -0
- package/dist/rules/generators/grid.d.ts.map +1 -0
- package/dist/rules/generators/grid.js +52 -0
- package/dist/rules/generators/grid.js.map +1 -0
- package/dist/rules/grammar/FirestoreAST.d.ts +129 -0
- package/dist/rules/grammar/FirestoreAST.d.ts.map +1 -0
- package/dist/rules/grammar/FirestoreAST.js +3 -0
- package/dist/rules/grammar/FirestoreAST.js.map +1 -0
- package/dist/rules/grammar/FirestoreAssembler.d.ts +5 -0
- package/dist/rules/grammar/FirestoreAssembler.d.ts.map +1 -0
- package/dist/rules/grammar/FirestoreAssembler.js +158 -0
- package/dist/rules/grammar/FirestoreAssembler.js.map +1 -0
- package/dist/rules/grammar/FirestoreParser.d.ts +46 -0
- package/dist/rules/grammar/FirestoreParser.d.ts.map +1 -0
- package/dist/rules/grammar/FirestoreParser.js +409 -0
- package/dist/rules/grammar/FirestoreParser.js.map +1 -0
- package/dist/rules/grammar/FirestoreRules.ohm +229 -0
- package/dist/rules/grammar/FirestoreRules.ohm.generated.d.ts +2 -0
- package/dist/rules/grammar/FirestoreRules.ohm.generated.d.ts.map +1 -0
- package/dist/rules/grammar/FirestoreRules.ohm.generated.js +234 -0
- package/dist/rules/grammar/FirestoreRules.ohm.generated.js.map +1 -0
- package/dist/rules/grammar/FirestoreValidator.d.ts +10 -0
- package/dist/rules/grammar/FirestoreValidator.d.ts.map +1 -0
- package/dist/rules/grammar/FirestoreValidator.js +482 -0
- package/dist/rules/grammar/FirestoreValidator.js.map +1 -0
- package/dist/rules/index.d.ts +67 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +80 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/indexes/extract/annotation-collect.d.ts +42 -0
- package/dist/rules/indexes/extract/annotation-collect.d.ts.map +1 -0
- package/dist/rules/indexes/extract/annotation-collect.js +69 -0
- package/dist/rules/indexes/extract/annotation-collect.js.map +1 -0
- package/dist/rules/indexes/extract/annotations.d.ts +50 -0
- package/dist/rules/indexes/extract/annotations.d.ts.map +1 -0
- package/dist/rules/indexes/extract/annotations.js +144 -0
- package/dist/rules/indexes/extract/annotations.js.map +1 -0
- package/dist/rules/indexes/extract/ast.d.ts +54 -0
- package/dist/rules/indexes/extract/ast.d.ts.map +1 -0
- package/dist/rules/indexes/extract/ast.js +119 -0
- package/dist/rules/indexes/extract/ast.js.map +1 -0
- package/dist/rules/indexes/extract/classify.d.ts +41 -0
- package/dist/rules/indexes/extract/classify.d.ts.map +1 -0
- package/dist/rules/indexes/extract/classify.js +138 -0
- package/dist/rules/indexes/extract/classify.js.map +1 -0
- package/dist/rules/indexes/extract/composite.d.ts +38 -0
- package/dist/rules/indexes/extract/composite.d.ts.map +1 -0
- package/dist/rules/indexes/extract/composite.js +85 -0
- package/dist/rules/indexes/extract/composite.js.map +1 -0
- package/dist/rules/indexes/extract/dataflow.d.ts +45 -0
- package/dist/rules/indexes/extract/dataflow.d.ts.map +1 -0
- package/dist/rules/indexes/extract/dataflow.js +200 -0
- package/dist/rules/indexes/extract/dataflow.js.map +1 -0
- package/dist/rules/indexes/extract/enumerate.d.ts +41 -0
- package/dist/rules/indexes/extract/enumerate.d.ts.map +1 -0
- package/dist/rules/indexes/extract/enumerate.js +163 -0
- package/dist/rules/indexes/extract/enumerate.js.map +1 -0
- package/dist/rules/indexes/extract/extractor.d.ts +3 -0
- package/dist/rules/indexes/extract/extractor.d.ts.map +1 -0
- package/dist/rules/indexes/extract/extractor.js +274 -0
- package/dist/rules/indexes/extract/extractor.js.map +1 -0
- package/dist/rules/indexes/extract/types.d.ts +211 -0
- package/dist/rules/indexes/extract/types.d.ts.map +1 -0
- package/dist/rules/indexes/extract/types.js +14 -0
- package/dist/rules/indexes/extract/types.js.map +1 -0
- package/dist/rules/indexes/extractHandler.d.ts +16 -0
- package/dist/rules/indexes/extractHandler.d.ts.map +1 -0
- package/dist/rules/indexes/extractHandler.js +100 -0
- package/dist/rules/indexes/extractHandler.js.map +1 -0
- package/dist/rules/indexes/extractTool.d.ts +15 -0
- package/dist/rules/indexes/extractTool.d.ts.map +1 -0
- package/dist/rules/indexes/extractTool.js +55 -0
- package/dist/rules/indexes/extractTool.js.map +1 -0
- package/dist/rules/indexes/types.d.ts +71 -0
- package/dist/rules/indexes/types.d.ts.map +1 -0
- package/dist/rules/indexes/types.js +15 -0
- package/dist/rules/indexes/types.js.map +1 -0
- package/dist/rules/inspect/handler.d.ts +6 -0
- package/dist/rules/inspect/handler.d.ts.map +1 -0
- package/dist/rules/inspect/handler.js +144 -0
- package/dist/rules/inspect/handler.js.map +1 -0
- package/dist/rules/inspect/spec.d.ts +37 -0
- package/dist/rules/inspect/spec.d.ts.map +1 -0
- package/dist/rules/inspect/spec.js +2 -0
- package/dist/rules/inspect/spec.js.map +1 -0
- package/dist/rules/inspect/tools.d.ts +21 -0
- package/dist/rules/inspect/tools.d.ts.map +1 -0
- package/dist/rules/inspect/tools.js +21 -0
- package/dist/rules/inspect/tools.js.map +1 -0
- package/dist/rules/linter/ast-utils.d.ts +97 -0
- package/dist/rules/linter/ast-utils.d.ts.map +1 -0
- package/dist/rules/linter/ast-utils.js +491 -0
- package/dist/rules/linter/ast-utils.js.map +1 -0
- package/dist/rules/linter/hallucinations.d.ts +34 -0
- package/dist/rules/linter/hallucinations.d.ts.map +1 -0
- package/dist/rules/linter/hallucinations.js +334 -0
- package/dist/rules/linter/hallucinations.js.map +1 -0
- package/dist/rules/linter/linter.d.ts +84 -0
- package/dist/rules/linter/linter.d.ts.map +1 -0
- package/dist/rules/linter/linter.js +784 -0
- package/dist/rules/linter/linter.js.map +1 -0
- package/dist/rules/modules/resolver-browser.d.ts +41 -0
- package/dist/rules/modules/resolver-browser.d.ts.map +1 -0
- package/dist/rules/modules/resolver-browser.js +63 -0
- package/dist/rules/modules/resolver-browser.js.map +1 -0
- package/dist/rules/modules/resolver-core.d.ts +51 -0
- package/dist/rules/modules/resolver-core.d.ts.map +1 -0
- package/dist/rules/modules/resolver-core.js +338 -0
- package/dist/rules/modules/resolver-core.js.map +1 -0
- package/dist/rules/modules/resolver.d.ts +17 -0
- package/dist/rules/modules/resolver.d.ts.map +1 -0
- package/dist/rules/modules/resolver.js +49 -0
- package/dist/rules/modules/resolver.js.map +1 -0
- package/dist/rules/modules/stdlib/atomic.rules +52 -0
- package/dist/rules/modules/stdlib/atomic.test.json +152 -0
- package/dist/rules/modules/stdlib/auth.rules +7 -0
- package/dist/rules/modules/stdlib/auth.test.json +53 -0
- package/dist/rules/modules/stdlib/content.rules +50 -0
- package/dist/rules/modules/stdlib/content.test.json +238 -0
- package/dist/rules/modules/stdlib/counters.rules +41 -0
- package/dist/rules/modules/stdlib/counters.test.json +254 -0
- package/dist/rules/modules/stdlib/geometry.rules +43 -0
- package/dist/rules/modules/stdlib/geometry.test.json +200 -0
- package/dist/rules/modules/stdlib/joining.rules +49 -0
- package/dist/rules/modules/stdlib/joining.test.json +287 -0
- package/dist/rules/modules/stdlib/lifecycle.rules +51 -0
- package/dist/rules/modules/stdlib/lifecycle.test.json +288 -0
- package/dist/rules/modules/stdlib/lobby.rules +44 -0
- package/dist/rules/modules/stdlib/lobby.test.json +32 -0
- package/dist/rules/modules/stdlib/membership.rules +40 -0
- package/dist/rules/modules/stdlib/membership.test.json +107 -0
- package/dist/rules/modules/stdlib/spaces.rules +46 -0
- package/dist/rules/modules/stdlib/spaces.test.json +392 -0
- package/dist/rules/modules/stdlib/state.rules +28 -0
- package/dist/rules/modules/stdlib/state.test.json +55 -0
- package/dist/rules/modules/stdlib/timing.rules +20 -0
- package/dist/rules/modules/stdlib/timing.test.json +106 -0
- package/dist/rules/modules/stdlib/transitions.rules +34 -0
- package/dist/rules/modules/stdlib/transitions.test.json +86 -0
- package/dist/rules/modules/stdlib/turns.rules +27 -0
- package/dist/rules/modules/stdlib/turns.test.json +64 -0
- package/dist/rules/modules/stdlib/validation.rules +31 -0
- package/dist/rules/modules/stdlib/validation.test.json +184 -0
- package/dist/rules/modules/stdlib-content.d.ts +11 -0
- package/dist/rules/modules/stdlib-content.d.ts.map +1 -0
- package/dist/rules/modules/stdlib-content.js +590 -0
- package/dist/rules/modules/stdlib-content.js.map +1 -0
- package/dist/rules/node.d.ts +17 -0
- package/dist/rules/node.d.ts.map +1 -0
- package/dist/rules/node.js +21 -0
- package/dist/rules/node.js.map +1 -0
- package/dist/rules/rtdb.d.ts +28 -0
- package/dist/rules/rtdb.d.ts.map +1 -0
- package/dist/rules/rtdb.js +15 -0
- package/dist/rules/rtdb.js.map +1 -0
- package/dist/rules/simulator/evaluator.d.ts +179 -0
- package/dist/rules/simulator/evaluator.d.ts.map +1 -0
- package/dist/rules/simulator/evaluator.js +1221 -0
- package/dist/rules/simulator/evaluator.js.map +1 -0
- package/dist/rules/simulator/expression/eval-errors.d.ts +86 -0
- package/dist/rules/simulator/expression/eval-errors.d.ts.map +1 -0
- package/dist/rules/simulator/expression/eval-errors.js +68 -0
- package/dist/rules/simulator/expression/eval-errors.js.map +1 -0
- package/dist/rules/simulator/expression/evaluator.d.ts +43 -0
- package/dist/rules/simulator/expression/evaluator.d.ts.map +1 -0
- package/dist/rules/simulator/expression/evaluator.js +298 -0
- package/dist/rules/simulator/expression/evaluator.js.map +1 -0
- package/dist/rules/simulator/expression/lexer.d.ts +36 -0
- package/dist/rules/simulator/expression/lexer.d.ts.map +1 -0
- package/dist/rules/simulator/expression/lexer.js +318 -0
- package/dist/rules/simulator/expression/lexer.js.map +1 -0
- package/dist/rules/simulator/expression/parser.d.ts +39 -0
- package/dist/rules/simulator/expression/parser.d.ts.map +1 -0
- package/dist/rules/simulator/expression/parser.js +329 -0
- package/dist/rules/simulator/expression/parser.js.map +1 -0
- package/dist/rules/simulator/expression/types.d.ts +137 -0
- package/dist/rules/simulator/expression/types.d.ts.map +1 -0
- package/dist/rules/simulator/expression/types.js +90 -0
- package/dist/rules/simulator/expression/types.js.map +1 -0
- package/dist/rules/simulator/expression/walk-data.d.ts +52 -0
- package/dist/rules/simulator/expression/walk-data.d.ts.map +1 -0
- package/dist/rules/simulator/expression/walk-data.js +167 -0
- package/dist/rules/simulator/expression/walk-data.js.map +1 -0
- package/dist/rules/simulator/firestore-set.d.ts +25 -0
- package/dist/rules/simulator/firestore-set.d.ts.map +1 -0
- package/dist/rules/simulator/firestore-set.js +89 -0
- package/dist/rules/simulator/firestore-set.js.map +1 -0
- package/dist/rules/simulator/handler.d.ts +36 -0
- package/dist/rules/simulator/handler.d.ts.map +1 -0
- package/dist/rules/simulator/handler.js +583 -0
- package/dist/rules/simulator/handler.js.map +1 -0
- package/dist/rules/simulator/mapdiff.d.ts +29 -0
- package/dist/rules/simulator/mapdiff.d.ts.map +1 -0
- package/dist/rules/simulator/mapdiff.js +72 -0
- package/dist/rules/simulator/mapdiff.js.map +1 -0
- package/dist/rules/simulator/project-after-state.d.ts +33 -0
- package/dist/rules/simulator/project-after-state.d.ts.map +1 -0
- package/dist/rules/simulator/project-after-state.js +88 -0
- package/dist/rules/simulator/project-after-state.js.map +1 -0
- package/dist/rules/simulator/query-proof.d.ts +80 -0
- package/dist/rules/simulator/query-proof.d.ts.map +1 -0
- package/dist/rules/simulator/query-proof.js +142 -0
- package/dist/rules/simulator/query-proof.js.map +1 -0
- package/dist/rules/simulator/value-equality.d.ts +8 -0
- package/dist/rules/simulator/value-equality.d.ts.map +1 -0
- package/dist/rules/simulator/value-equality.js +40 -0
- package/dist/rules/simulator/value-equality.js.map +1 -0
- package/dist/rules/simulator/wrappers/base.d.ts +129 -0
- package/dist/rules/simulator/wrappers/base.d.ts.map +1 -0
- package/dist/rules/simulator/wrappers/base.js +90 -0
- package/dist/rules/simulator/wrappers/base.js.map +1 -0
- package/dist/rules/simulator/wrappers/bytes.d.ts +45 -0
- package/dist/rules/simulator/wrappers/bytes.d.ts.map +1 -0
- package/dist/rules/simulator/wrappers/bytes.js +130 -0
- package/dist/rules/simulator/wrappers/bytes.js.map +1 -0
- package/dist/rules/simulator/wrappers/duration.d.ts +76 -0
- package/dist/rules/simulator/wrappers/duration.d.ts.map +1 -0
- package/dist/rules/simulator/wrappers/duration.js +176 -0
- package/dist/rules/simulator/wrappers/duration.js.map +1 -0
- package/dist/rules/simulator/wrappers/float.d.ts +52 -0
- package/dist/rules/simulator/wrappers/float.d.ts.map +1 -0
- package/dist/rules/simulator/wrappers/float.js +88 -0
- package/dist/rules/simulator/wrappers/float.js.map +1 -0
- package/dist/rules/simulator/wrappers/latlng.d.ts +40 -0
- package/dist/rules/simulator/wrappers/latlng.d.ts.map +1 -0
- package/dist/rules/simulator/wrappers/latlng.js +100 -0
- package/dist/rules/simulator/wrappers/latlng.js.map +1 -0
- package/dist/rules/simulator/wrappers/path.d.ts +75 -0
- package/dist/rules/simulator/wrappers/path.d.ts.map +1 -0
- package/dist/rules/simulator/wrappers/path.js +158 -0
- package/dist/rules/simulator/wrappers/path.js.map +1 -0
- package/dist/rules/simulator/wrappers/reference.d.ts +82 -0
- package/dist/rules/simulator/wrappers/reference.d.ts.map +1 -0
- package/dist/rules/simulator/wrappers/reference.js +145 -0
- package/dist/rules/simulator/wrappers/reference.js.map +1 -0
- package/dist/rules/simulator/wrappers/timestamp.d.ts +86 -0
- package/dist/rules/simulator/wrappers/timestamp.d.ts.map +1 -0
- package/dist/rules/simulator/wrappers/timestamp.js +207 -0
- package/dist/rules/simulator/wrappers/timestamp.js.map +1 -0
- package/dist/rules/simulator/wrappers/vector.d.ts +43 -0
- package/dist/rules/simulator/wrappers/vector.d.ts.map +1 -0
- package/dist/rules/simulator/wrappers/vector.js +80 -0
- package/dist/rules/simulator/wrappers/vector.js.map +1 -0
- package/dist/rules/simulator-tools-impl.d.ts +64 -0
- package/dist/rules/simulator-tools-impl.d.ts.map +1 -0
- package/dist/rules/simulator-tools-impl.js +462 -0
- package/dist/rules/simulator-tools-impl.js.map +1 -0
- package/dist/rules/simulator.d.ts +20 -0
- package/dist/rules/simulator.d.ts.map +1 -0
- package/dist/rules/simulator.js +24 -0
- package/dist/rules/simulator.js.map +1 -0
- package/dist/rules/stdlib-modules.d.ts +73 -0
- package/dist/rules/stdlib-modules.d.ts.map +1 -0
- package/dist/rules/stdlib-modules.js +849 -0
- package/dist/rules/stdlib-modules.js.map +1 -0
- package/dist/rules/stdlib-tools.d.ts +19 -0
- package/dist/rules/stdlib-tools.d.ts.map +1 -0
- package/dist/rules/stdlib-tools.js +164 -0
- package/dist/rules/stdlib-tools.js.map +1 -0
- package/dist/rules/test/handler.d.ts +9 -0
- package/dist/rules/test/handler.d.ts.map +1 -0
- package/dist/rules/test/handler.js +124 -0
- package/dist/rules/test/handler.js.map +1 -0
- package/dist/rules/test/spec.d.ts +517 -0
- package/dist/rules/test/spec.d.ts.map +1 -0
- package/dist/rules/test/spec.js +227 -0
- package/dist/rules/test/spec.js.map +1 -0
- package/dist/rules/tools.d.ts +41 -0
- package/dist/rules/tools.d.ts.map +1 -0
- package/dist/rules/tools.js +124 -0
- package/dist/rules/tools.js.map +1 -0
- package/dist/rules/write/handler.d.ts +6 -0
- package/dist/rules/write/handler.d.ts.map +1 -0
- package/dist/rules/write/handler.js +126 -0
- package/dist/rules/write/handler.js.map +1 -0
- package/dist/rules/write/spec.d.ts +28 -0
- package/dist/rules/write/spec.d.ts.map +1 -0
- package/dist/rules/write/spec.js +2 -0
- package/dist/rules/write/spec.js.map +1 -0
- package/dist/sandbox/admin-compat.d.ts +20 -0
- package/dist/sandbox/admin-compat.d.ts.map +1 -0
- package/dist/sandbox/admin-compat.js +19 -0
- package/dist/sandbox/admin-compat.js.map +1 -0
- package/dist/sandbox/admin-firestore/error-translation.d.ts +86 -0
- package/dist/sandbox/admin-firestore/error-translation.d.ts.map +1 -0
- package/dist/sandbox/admin-firestore/error-translation.js +204 -0
- package/dist/sandbox/admin-firestore/error-translation.js.map +1 -0
- package/dist/sandbox/admin-firestore/index.d.ts +169 -0
- package/dist/sandbox/admin-firestore/index.d.ts.map +1 -0
- package/dist/sandbox/admin-firestore/index.js +456 -0
- package/dist/sandbox/admin-firestore/index.js.map +1 -0
- package/dist/sandbox/admin-firestore/remote.d.ts +97 -0
- package/dist/sandbox/admin-firestore/remote.d.ts.map +1 -0
- package/dist/sandbox/admin-firestore/remote.js +735 -0
- package/dist/sandbox/admin-firestore/remote.js.map +1 -0
- package/dist/sandbox/branches/index.d.ts +141 -0
- package/dist/sandbox/branches/index.d.ts.map +1 -0
- package/dist/sandbox/branches/index.js +327 -0
- package/dist/sandbox/branches/index.js.map +1 -0
- package/dist/sandbox/firestore/admin-compat/batch.d.ts +34 -0
- package/dist/sandbox/firestore/admin-compat/batch.d.ts.map +1 -0
- package/dist/sandbox/firestore/admin-compat/batch.js +73 -0
- package/dist/sandbox/firestore/admin-compat/batch.js.map +1 -0
- package/dist/sandbox/firestore/admin-compat/doc-ref.d.ts +38 -0
- package/dist/sandbox/firestore/admin-compat/doc-ref.d.ts.map +1 -0
- package/dist/sandbox/firestore/admin-compat/doc-ref.js +154 -0
- package/dist/sandbox/firestore/admin-compat/doc-ref.js.map +1 -0
- package/dist/sandbox/firestore/admin-compat/firestore.d.ts +45 -0
- package/dist/sandbox/firestore/admin-compat/firestore.d.ts.map +1 -0
- package/dist/sandbox/firestore/admin-compat/firestore.js +114 -0
- package/dist/sandbox/firestore/admin-compat/firestore.js.map +1 -0
- package/dist/sandbox/firestore/admin-compat/index.d.ts +45 -0
- package/dist/sandbox/firestore/admin-compat/index.d.ts.map +1 -0
- package/dist/sandbox/firestore/admin-compat/index.js +27 -0
- package/dist/sandbox/firestore/admin-compat/index.js.map +1 -0
- package/dist/sandbox/firestore/admin-compat/paths.d.ts +37 -0
- package/dist/sandbox/firestore/admin-compat/paths.d.ts.map +1 -0
- package/dist/sandbox/firestore/admin-compat/paths.js +49 -0
- package/dist/sandbox/firestore/admin-compat/paths.js.map +1 -0
- package/dist/sandbox/firestore/admin-compat/query.d.ts +261 -0
- package/dist/sandbox/firestore/admin-compat/query.d.ts.map +1 -0
- package/dist/sandbox/firestore/admin-compat/query.js +704 -0
- package/dist/sandbox/firestore/admin-compat/query.js.map +1 -0
- package/dist/sandbox/firestore/admin-compat/read-translation.d.ts +8 -0
- package/dist/sandbox/firestore/admin-compat/read-translation.d.ts.map +1 -0
- package/dist/sandbox/firestore/admin-compat/read-translation.js +59 -0
- package/dist/sandbox/firestore/admin-compat/read-translation.js.map +1 -0
- package/dist/sandbox/firestore/admin-compat/snapshots.d.ts +39 -0
- package/dist/sandbox/firestore/admin-compat/snapshots.d.ts.map +1 -0
- package/dist/sandbox/firestore/admin-compat/snapshots.js +50 -0
- package/dist/sandbox/firestore/admin-compat/snapshots.js.map +1 -0
- package/dist/sandbox/firestore/admin-compat/transaction.d.ts +35 -0
- package/dist/sandbox/firestore/admin-compat/transaction.d.ts.map +1 -0
- package/dist/sandbox/firestore/admin-compat/transaction.js +88 -0
- package/dist/sandbox/firestore/admin-compat/transaction.js.map +1 -0
- package/dist/sandbox/firestore/admin-compat/types.d.ts +297 -0
- package/dist/sandbox/firestore/admin-compat/types.d.ts.map +1 -0
- package/dist/sandbox/firestore/admin-compat/types.js +127 -0
- package/dist/sandbox/firestore/admin-compat/types.js.map +1 -0
- package/dist/sandbox/firestore/admin-compat/value-order.d.ts +49 -0
- package/dist/sandbox/firestore/admin-compat/value-order.d.ts.map +1 -0
- package/dist/sandbox/firestore/admin-compat/value-order.js +172 -0
- package/dist/sandbox/firestore/admin-compat/value-order.js.map +1 -0
- package/dist/sandbox/firestore/auto-id.d.ts +26 -0
- package/dist/sandbox/firestore/auto-id.d.ts.map +1 -0
- package/dist/sandbox/firestore/auto-id.js +36 -0
- package/dist/sandbox/firestore/auto-id.js.map +1 -0
- package/dist/sandbox/firestore/converters/bytes-geopoint.d.ts +48 -0
- package/dist/sandbox/firestore/converters/bytes-geopoint.d.ts.map +1 -0
- package/dist/sandbox/firestore/converters/bytes-geopoint.js +85 -0
- package/dist/sandbox/firestore/converters/bytes-geopoint.js.map +1 -0
- package/dist/sandbox/firestore/converters/fieldvalue.d.ts +69 -0
- package/dist/sandbox/firestore/converters/fieldvalue.d.ts.map +1 -0
- package/dist/sandbox/firestore/converters/fieldvalue.js +166 -0
- package/dist/sandbox/firestore/converters/fieldvalue.js.map +1 -0
- package/dist/sandbox/firestore/converters/reference.d.ts +31 -0
- package/dist/sandbox/firestore/converters/reference.d.ts.map +1 -0
- package/dist/sandbox/firestore/converters/reference.js +51 -0
- package/dist/sandbox/firestore/converters/reference.js.map +1 -0
- package/dist/sandbox/firestore/converters/timestamp.d.ts +32 -0
- package/dist/sandbox/firestore/converters/timestamp.d.ts.map +1 -0
- package/dist/sandbox/firestore/converters/timestamp.js +63 -0
- package/dist/sandbox/firestore/converters/timestamp.js.map +1 -0
- package/dist/sandbox/firestore/converters/user-timestamp.d.ts +46 -0
- package/dist/sandbox/firestore/converters/user-timestamp.d.ts.map +1 -0
- package/dist/sandbox/firestore/converters/user-timestamp.js +65 -0
- package/dist/sandbox/firestore/converters/user-timestamp.js.map +1 -0
- package/dist/sandbox/firestore/converters/vector.d.ts +24 -0
- package/dist/sandbox/firestore/converters/vector.d.ts.map +1 -0
- package/dist/sandbox/firestore/converters/vector.js +53 -0
- package/dist/sandbox/firestore/converters/vector.js.map +1 -0
- package/dist/sandbox/firestore/errors.d.ts +82 -0
- package/dist/sandbox/firestore/errors.d.ts.map +1 -0
- package/dist/sandbox/firestore/errors.js +54 -0
- package/dist/sandbox/firestore/errors.js.map +1 -0
- package/dist/sandbox/firestore/event-log.d.ts +99 -0
- package/dist/sandbox/firestore/event-log.d.ts.map +1 -0
- package/dist/sandbox/firestore/event-log.js +67 -0
- package/dist/sandbox/firestore/event-log.js.map +1 -0
- package/dist/sandbox/firestore/field-merge.d.ts +64 -0
- package/dist/sandbox/firestore/field-merge.d.ts.map +1 -0
- package/dist/sandbox/firestore/field-merge.js +221 -0
- package/dist/sandbox/firestore/field-merge.js.map +1 -0
- package/dist/sandbox/firestore/list-query-proof.d.ts +77 -0
- package/dist/sandbox/firestore/list-query-proof.d.ts.map +1 -0
- package/dist/sandbox/firestore/list-query-proof.js +170 -0
- package/dist/sandbox/firestore/list-query-proof.js.map +1 -0
- package/dist/sandbox/firestore/local-environment.d.ts +806 -0
- package/dist/sandbox/firestore/local-environment.d.ts.map +1 -0
- package/dist/sandbox/firestore/local-environment.js +3028 -0
- package/dist/sandbox/firestore/local-environment.js.map +1 -0
- package/dist/sandbox/firestore/local-state.d.ts +196 -0
- package/dist/sandbox/firestore/local-state.d.ts.map +1 -0
- package/dist/sandbox/firestore/local-state.js +413 -0
- package/dist/sandbox/firestore/local-state.js.map +1 -0
- package/dist/sandbox/firestore/overlay-backing.d.ts +44 -0
- package/dist/sandbox/firestore/overlay-backing.d.ts.map +1 -0
- package/dist/sandbox/firestore/overlay-backing.js +82 -0
- package/dist/sandbox/firestore/overlay-backing.js.map +1 -0
- package/dist/sandbox/firestore/sentinel-capture.d.ts +30 -0
- package/dist/sandbox/firestore/sentinel-capture.d.ts.map +1 -0
- package/dist/sandbox/firestore/sentinel-capture.js +61 -0
- package/dist/sandbox/firestore/sentinel-capture.js.map +1 -0
- package/dist/sandbox/firestore/snapshot-listeners.d.ts +284 -0
- package/dist/sandbox/firestore/snapshot-listeners.d.ts.map +1 -0
- package/dist/sandbox/firestore/snapshot-listeners.js +194 -0
- package/dist/sandbox/firestore/snapshot-listeners.js.map +1 -0
- package/dist/sandbox/firestore/topk.d.ts +12 -0
- package/dist/sandbox/firestore/topk.d.ts.map +1 -0
- package/dist/sandbox/firestore/topk.js +42 -0
- package/dist/sandbox/firestore/topk.js.map +1 -0
- package/dist/sandbox/firestore/transaction-merge.d.ts +55 -0
- package/dist/sandbox/firestore/transaction-merge.d.ts.map +1 -0
- package/dist/sandbox/firestore/transaction-merge.js +107 -0
- package/dist/sandbox/firestore/transaction-merge.js.map +1 -0
- package/dist/sandbox/firestore/transaction-types.d.ts +152 -0
- package/dist/sandbox/firestore/transaction-types.d.ts.map +1 -0
- package/dist/sandbox/firestore/transaction-types.js +10 -0
- package/dist/sandbox/firestore/transaction-types.js.map +1 -0
- package/dist/sandbox/firestore/transaction.d.ts +79 -0
- package/dist/sandbox/firestore/transaction.d.ts.map +1 -0
- package/dist/sandbox/firestore/transaction.js +95 -0
- package/dist/sandbox/firestore/transaction.js.map +1 -0
- package/dist/sandbox/firestore/value-equality.d.ts +2 -0
- package/dist/sandbox/firestore/value-equality.d.ts.map +1 -0
- package/dist/sandbox/firestore/value-equality.js +35 -0
- package/dist/sandbox/firestore/value-equality.js.map +1 -0
- package/dist/sandbox/firestore/value-resolver.d.ts +172 -0
- package/dist/sandbox/firestore/value-resolver.d.ts.map +1 -0
- package/dist/sandbox/firestore/value-resolver.js +221 -0
- package/dist/sandbox/firestore/value-resolver.js.map +1 -0
- package/dist/sandbox/firestore/wire-encoder.d.ts +14 -0
- package/dist/sandbox/firestore/wire-encoder.d.ts.map +1 -0
- package/dist/sandbox/firestore/wire-encoder.js +130 -0
- package/dist/sandbox/firestore/wire-encoder.js.map +1 -0
- package/dist/sandbox/index.d.ts +50 -0
- package/dist/sandbox/index.d.ts.map +1 -0
- package/dist/sandbox/index.js +63 -0
- package/dist/sandbox/index.js.map +1 -0
- package/dist/sandbox/internal/index.d.ts +36 -0
- package/dist/sandbox/internal/index.d.ts.map +1 -0
- package/dist/sandbox/internal/index.js +72 -0
- package/dist/sandbox/internal/index.js.map +1 -0
- package/dist/sandbox/internal/sandbox-impl.d.ts +343 -0
- package/dist/sandbox/internal/sandbox-impl.d.ts.map +1 -0
- package/dist/sandbox/internal/sandbox-impl.js +718 -0
- package/dist/sandbox/internal/sandbox-impl.js.map +1 -0
- package/dist/sandbox/persistence/backends.d.ts +37 -0
- package/dist/sandbox/persistence/backends.d.ts.map +1 -0
- package/dist/sandbox/persistence/backends.js +202 -0
- package/dist/sandbox/persistence/backends.js.map +1 -0
- package/dist/sandbox/persistence/chunk-format.d.ts +58 -0
- package/dist/sandbox/persistence/chunk-format.d.ts.map +1 -0
- package/dist/sandbox/persistence/chunk-format.js +163 -0
- package/dist/sandbox/persistence/chunk-format.js.map +1 -0
- package/dist/sandbox/persistence/controller.d.ts +39 -0
- package/dist/sandbox/persistence/controller.d.ts.map +1 -0
- package/dist/sandbox/persistence/controller.js +605 -0
- package/dist/sandbox/persistence/controller.js.map +1 -0
- package/dist/sandbox/persistence/index.d.ts +13 -0
- package/dist/sandbox/persistence/index.d.ts.map +1 -0
- package/dist/sandbox/persistence/index.js +5 -0
- package/dist/sandbox/persistence/index.js.map +1 -0
- package/dist/sandbox/persistence/serialize.d.ts +53 -0
- package/dist/sandbox/persistence/serialize.d.ts.map +1 -0
- package/dist/sandbox/persistence/serialize.js +98 -0
- package/dist/sandbox/persistence/serialize.js.map +1 -0
- package/dist/sandbox/persistence/types.d.ts +118 -0
- package/dist/sandbox/persistence/types.d.ts.map +1 -0
- package/dist/sandbox/persistence/types.js +15 -0
- package/dist/sandbox/persistence/types.js.map +1 -0
- package/dist/sandbox/remote.d.ts +118 -0
- package/dist/sandbox/remote.d.ts.map +1 -0
- package/dist/sandbox/remote.js +60 -0
- package/dist/sandbox/remote.js.map +1 -0
- package/dist/sandbox/replay/index.d.ts +106 -0
- package/dist/sandbox/replay/index.d.ts.map +1 -0
- package/dist/sandbox/replay/index.js +246 -0
- package/dist/sandbox/replay/index.js.map +1 -0
- package/dist/sandbox/sandbox-context.d.ts +40 -0
- package/dist/sandbox/sandbox-context.d.ts.map +1 -0
- package/dist/sandbox/sandbox-context.js +72 -0
- package/dist/sandbox/sandbox-context.js.map +1 -0
- package/dist/sandbox/tab-sync/index.d.ts +120 -0
- package/dist/sandbox/tab-sync/index.d.ts.map +1 -0
- package/dist/sandbox/tab-sync/index.js +272 -0
- package/dist/sandbox/tab-sync/index.js.map +1 -0
- package/dist/sandbox/types.d.ts +1235 -0
- package/dist/sandbox/types.d.ts.map +1 -0
- package/dist/sandbox/types.js +46 -0
- package/dist/sandbox/types.js.map +1 -0
- package/dist/storage/admin/api.d.ts +206 -0
- package/dist/storage/admin/api.d.ts.map +1 -0
- package/dist/storage/admin/api.js +349 -0
- package/dist/storage/admin/api.js.map +1 -0
- package/dist/storage/admin/handler.d.ts +29 -0
- package/dist/storage/admin/handler.d.ts.map +1 -0
- package/dist/storage/admin/handler.js +82 -0
- package/dist/storage/admin/handler.js.map +1 -0
- package/dist/storage/admin/spec.d.ts +64 -0
- package/dist/storage/admin/spec.d.ts.map +1 -0
- package/dist/storage/admin/spec.js +8 -0
- package/dist/storage/admin/spec.js.map +1 -0
- package/dist/storage/admin/tools.d.ts +23 -0
- package/dist/storage/admin/tools.d.ts.map +1 -0
- package/dist/storage/admin/tools.js +90 -0
- package/dist/storage/admin/tools.js.map +1 -0
- package/dist/storage/download.d.ts +27 -0
- package/dist/storage/download.d.ts.map +1 -0
- package/dist/storage/download.js +136 -0
- package/dist/storage/download.js.map +1 -0
- package/dist/storage/enforce.d.ts +26 -0
- package/dist/storage/enforce.d.ts.map +1 -0
- package/dist/storage/enforce.js +16 -0
- package/dist/storage/enforce.js.map +1 -0
- package/dist/storage/errors.d.ts +46 -0
- package/dist/storage/errors.d.ts.map +1 -0
- package/dist/storage/errors.js +62 -0
- package/dist/storage/errors.js.map +1 -0
- package/dist/storage/index.d.ts +49 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +60 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/internal.d.ts +18 -0
- package/dist/storage/internal.d.ts.map +1 -0
- package/dist/storage/internal.js +18 -0
- package/dist/storage/internal.js.map +1 -0
- package/dist/storage/list.d.ts +17 -0
- package/dist/storage/list.d.ts.map +1 -0
- package/dist/storage/list.js +91 -0
- package/dist/storage/list.js.map +1 -0
- package/dist/storage/metadata.d.ts +86 -0
- package/dist/storage/metadata.d.ts.map +1 -0
- package/dist/storage/metadata.js +167 -0
- package/dist/storage/metadata.js.map +1 -0
- package/dist/storage/persistence.d.ts +134 -0
- package/dist/storage/persistence.d.ts.map +1 -0
- package/dist/storage/persistence.js +132 -0
- package/dist/storage/persistence.js.map +1 -0
- package/dist/storage/reference.d.ts +63 -0
- package/dist/storage/reference.d.ts.map +1 -0
- package/dist/storage/reference.js +156 -0
- package/dist/storage/reference.js.map +1 -0
- package/dist/storage/rules.d.ts +176 -0
- package/dist/storage/rules.d.ts.map +1 -0
- package/dist/storage/rules.js +621 -0
- package/dist/storage/rules.js.map +1 -0
- package/dist/storage/service.d.ts +139 -0
- package/dist/storage/service.d.ts.map +1 -0
- package/dist/storage/service.js +241 -0
- package/dist/storage/service.js.map +1 -0
- package/dist/storage/upload.d.ts +43 -0
- package/dist/storage/upload.d.ts.map +1 -0
- package/dist/storage/upload.js +235 -0
- package/dist/storage/upload.js.map +1 -0
- package/package.json +109 -3
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MapDiff implementation for Firestore rules simulation.
|
|
3
|
+
*
|
|
4
|
+
* Implements request.resource.data.diff(resource.data) which returns
|
|
5
|
+
* a MapDiff object with methods for comparing two document states.
|
|
6
|
+
*
|
|
7
|
+
* Semantics derived from production Firestore behavior:
|
|
8
|
+
* - Only compares top-level keys (nested map diff is unreliable in production)
|
|
9
|
+
* - Values are compared with Firestore Rules value equality
|
|
10
|
+
* - Returns Set-like objects with hasOnly(), hasAll(), hasAny(), size()
|
|
11
|
+
*/
|
|
12
|
+
import { FirestoreSet } from './firestore-set.js';
|
|
13
|
+
import { rulesValuesEqual } from './value-equality.js';
|
|
14
|
+
export { FirestoreSet } from './firestore-set.js';
|
|
15
|
+
export class MapDiff {
|
|
16
|
+
before;
|
|
17
|
+
after;
|
|
18
|
+
constructor(before, after) {
|
|
19
|
+
this.before = before;
|
|
20
|
+
this.after = after;
|
|
21
|
+
}
|
|
22
|
+
/** Keys present in `after` but not in `before`. */
|
|
23
|
+
addedKeys() {
|
|
24
|
+
const added = [];
|
|
25
|
+
for (const key of Object.keys(this.after)) {
|
|
26
|
+
if (!(key in this.before))
|
|
27
|
+
added.push(key);
|
|
28
|
+
}
|
|
29
|
+
return new FirestoreSet(added);
|
|
30
|
+
}
|
|
31
|
+
/** Keys present in `before` but not in `after`. */
|
|
32
|
+
removedKeys() {
|
|
33
|
+
const removed = [];
|
|
34
|
+
for (const key of Object.keys(this.before)) {
|
|
35
|
+
if (!(key in this.after))
|
|
36
|
+
removed.push(key);
|
|
37
|
+
}
|
|
38
|
+
return new FirestoreSet(removed);
|
|
39
|
+
}
|
|
40
|
+
/** Keys present in both but with different values. */
|
|
41
|
+
changedKeys() {
|
|
42
|
+
const changed = [];
|
|
43
|
+
for (const key of Object.keys(this.after)) {
|
|
44
|
+
if (key in this.before && !rulesValuesEqual(this.before[key], this.after[key])) {
|
|
45
|
+
changed.push(key);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return new FirestoreSet(changed);
|
|
49
|
+
}
|
|
50
|
+
/** Keys that were added, removed, or changed. Union of added + removed + changed. */
|
|
51
|
+
affectedKeys() {
|
|
52
|
+
const affected = [];
|
|
53
|
+
const allKeys = new Set([...Object.keys(this.before), ...Object.keys(this.after)]);
|
|
54
|
+
for (const key of allKeys) {
|
|
55
|
+
if (!(key in this.before) || !(key in this.after) || !rulesValuesEqual(this.before[key], this.after[key])) {
|
|
56
|
+
affected.push(key);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return new FirestoreSet(affected);
|
|
60
|
+
}
|
|
61
|
+
/** Keys present in both with identical values. */
|
|
62
|
+
unchangedKeys() {
|
|
63
|
+
const unchanged = [];
|
|
64
|
+
for (const key of Object.keys(this.before)) {
|
|
65
|
+
if (key in this.after && rulesValuesEqual(this.before[key], this.after[key])) {
|
|
66
|
+
unchanged.push(key);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return new FirestoreSet(unchanged);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=mapdiff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapdiff.js","sourceRoot":"","sources":["../../../src/rules/simulator/mapdiff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Item 0.D / Item 7 — single source of truth for the post-write document
|
|
3
|
+
* state under each WriteMode.
|
|
4
|
+
*
|
|
5
|
+
* Both `request.resource.data` (the data the rule sees) and
|
|
6
|
+
* `getAfter(path)` (the projected post-write doc) MUST agree. Routing
|
|
7
|
+
* everything through one function is the only way to make sure they
|
|
8
|
+
* never diverge as the merge semantics evolve.
|
|
9
|
+
*
|
|
10
|
+
* Per-mode semantics (matches admin SDK):
|
|
11
|
+
* create → after = payload (pre-state irrelevant; create
|
|
12
|
+
* fails if doc exists, but that's enforced by
|
|
13
|
+
* the test runner, not by this projection)
|
|
14
|
+
* set { merge: false } → after = payload (full replace)
|
|
15
|
+
* set { merge: true } → after = recursive merge of pre and payload
|
|
16
|
+
* update → for each top-level key in payload:
|
|
17
|
+
* - if key contains '.', treat as field path:
|
|
18
|
+
* setNested(result, key.split('.'), value)
|
|
19
|
+
* - else: result[key] = value (entire replacement
|
|
20
|
+
* at that key, NOT recursive merge — this is
|
|
21
|
+
* the trap the 0.D hindsight describes)
|
|
22
|
+
* delete → after = null (doc is gone)
|
|
23
|
+
*/
|
|
24
|
+
import type { WriteMode } from '../test/spec.js';
|
|
25
|
+
export type DocState = Record<string, unknown>;
|
|
26
|
+
/**
|
|
27
|
+
* Project the after-state of a write. Returns null for `delete`.
|
|
28
|
+
*
|
|
29
|
+
* `existing` is the pre-write document state (typically `tc.resource`).
|
|
30
|
+
* `payload` is the write payload (typically `tc.data`).
|
|
31
|
+
*/
|
|
32
|
+
export declare function projectAfterState(mode: WriteMode, existing: DocState | null, payload: DocState): DocState | null;
|
|
33
|
+
//# sourceMappingURL=project-after-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-after-state.d.ts","sourceRoot":"","sources":["../../../src/rules/simulator/project-after-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AA8E/C;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,SAAS,EACf,QAAQ,EAAE,QAAQ,GAAG,IAAI,EACzB,OAAO,EAAE,QAAQ,GAChB,QAAQ,GAAG,IAAI,CAWjB"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/** Field-path segments that must never be walked or written. Because the
|
|
2
|
+
* projected doc is a plain JS object, a segment named `__proto__` (or, as
|
|
3
|
+
* defence-in-depth, `constructor`/`prototype`) would reach the shared
|
|
4
|
+
* `Object.prototype` and let a rule-permitted `update`/`set` payload
|
|
5
|
+
* pollute it process-wide (a field name arrives via JSON transports that
|
|
6
|
+
* preserve `__proto__` as a genuine own key). These are never valid
|
|
7
|
+
* Firestore-map segments in this projection, so rejecting them is a
|
|
8
|
+
* sandbox-only safety constraint, not a parity regression. */
|
|
9
|
+
const UNSAFE_SEGMENTS = new Set(['__proto__', 'prototype', 'constructor']);
|
|
10
|
+
function assertSafeSegment(seg) {
|
|
11
|
+
if (UNSAFE_SEGMENTS.has(seg)) {
|
|
12
|
+
throw new Error(`Invalid field-path segment '${seg}': the keys __proto__, prototype, ` +
|
|
13
|
+
'and constructor are reserved and cannot appear in a field path.');
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/** Recursive merge for set({merge: true}) — payload wins on leaf collisions. */
|
|
17
|
+
function recursiveMerge(existing, payload) {
|
|
18
|
+
const out = { ...existing };
|
|
19
|
+
for (const [k, v] of Object.entries(payload)) {
|
|
20
|
+
assertSafeSegment(k);
|
|
21
|
+
const cur = Object.hasOwn(out, k) ? out[k] : undefined;
|
|
22
|
+
if (v !== null && typeof v === 'object' && !Array.isArray(v) &&
|
|
23
|
+
cur !== null && typeof cur === 'object' && !Array.isArray(cur)) {
|
|
24
|
+
out[k] = recursiveMerge(cur, v);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
out[k] = v;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return out;
|
|
31
|
+
}
|
|
32
|
+
/** Set a value at a nested path (mutates `obj`). Used by update dot-paths.
|
|
33
|
+
*
|
|
34
|
+
* A field path that traverses a non-map intermediate REPLACES that prefix with
|
|
35
|
+
* a fresh map — this matches Firestore's updateDoc field-path semantics, where
|
|
36
|
+
* `updateDoc(ref, {'a.b': 1})` on a string `a` overwrites `a` with `{b:1}`
|
|
37
|
+
* (last-write-wins on the path prefix). (We intentionally do NOT throw here;
|
|
38
|
+
* the RULES-B10 fix is the update *merge* in handler.ts, not this projection.) */
|
|
39
|
+
function setNested(obj, path, value) {
|
|
40
|
+
let cur = obj;
|
|
41
|
+
for (let i = 0; i < path.length - 1; i++) {
|
|
42
|
+
const seg = path[i];
|
|
43
|
+
assertSafeSegment(seg);
|
|
44
|
+
// Own-property read only: bare `cur[seg]` would resolve an unvalidated
|
|
45
|
+
// segment to the shared object prototype.
|
|
46
|
+
const next = Object.hasOwn(cur, seg) ? cur[seg] : undefined;
|
|
47
|
+
if (next === null || typeof next !== 'object' || Array.isArray(next)) {
|
|
48
|
+
cur[seg] = {};
|
|
49
|
+
}
|
|
50
|
+
cur = cur[seg];
|
|
51
|
+
}
|
|
52
|
+
const leaf = path[path.length - 1];
|
|
53
|
+
assertSafeSegment(leaf);
|
|
54
|
+
cur[leaf] = value;
|
|
55
|
+
}
|
|
56
|
+
/** Update mode: top-level keys replace; dot-paths patch nested maps. */
|
|
57
|
+
function updateMerge(existing, payload) {
|
|
58
|
+
const out = { ...existing };
|
|
59
|
+
for (const [k, v] of Object.entries(payload)) {
|
|
60
|
+
if (k.includes('.')) {
|
|
61
|
+
setNested(out, k.split('.'), v);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
assertSafeSegment(k);
|
|
65
|
+
out[k] = v;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return out;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Project the after-state of a write. Returns null for `delete`.
|
|
72
|
+
*
|
|
73
|
+
* `existing` is the pre-write document state (typically `tc.resource`).
|
|
74
|
+
* `payload` is the write payload (typically `tc.data`).
|
|
75
|
+
*/
|
|
76
|
+
export function projectAfterState(mode, existing, payload) {
|
|
77
|
+
switch (mode.kind) {
|
|
78
|
+
case 'create':
|
|
79
|
+
return payload;
|
|
80
|
+
case 'set':
|
|
81
|
+
return mode.merge ? recursiveMerge(existing ?? {}, payload) : payload;
|
|
82
|
+
case 'update':
|
|
83
|
+
return updateMerge(existing ?? {}, payload);
|
|
84
|
+
case 'delete':
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=project-after-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-after-state.js","sourceRoot":"","sources":["../../../src/rules/simulator/project-after-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RULES-B11 (rules-side) — query-proof evaluation for `list` operations.
|
|
3
|
+
*
|
|
4
|
+
* Production Firestore enforces "rules are NOT filters." For a query (`list`),
|
|
5
|
+
* the engine does not run the rule per-document and silently drop the docs that
|
|
6
|
+
* fail — it evaluates the rule ONCE against the query itself, and rejects the
|
|
7
|
+
* WHOLE query unless the rules can PROVE that every document the query could
|
|
8
|
+
* return is readable. A query the rules can't prove safe is denied outright (a
|
|
9
|
+
* `permission-denied` error), never silently truncated.
|
|
10
|
+
*
|
|
11
|
+
* docs: https://firebase.google.com/docs/firestore/security/rules-query
|
|
12
|
+
* "Rules are not filters … the query must be guaranteed to return only
|
|
13
|
+
* documents that the rules allow the client to read. Otherwise the request
|
|
14
|
+
* fails — even if the actual result set would have been allowed."
|
|
15
|
+
*
|
|
16
|
+
* THIS MODULE is the pure rules-side decision: given a collection's `list`
|
|
17
|
+
* allow-rule condition and the query's constraints, decide PROVABLE or REJECT.
|
|
18
|
+
* It is the function the firestore-track listener/read path
|
|
19
|
+
* (`sandbox/firestore/local-environment.ts:silentReadCollection`) should call
|
|
20
|
+
* INSTEAD of the current per-doc "rules-as-filters" loop — wiring that lives in
|
|
21
|
+
* T2's carve-out and is STOP-documented for hand-off (see the round-2 step doc).
|
|
22
|
+
*
|
|
23
|
+
* Scope of the proof here (the well-documented, decidable core):
|
|
24
|
+
* - A `list` rule that does NOT depend on per-document data
|
|
25
|
+
* (`resource.data.*`) — only `request.auth`, `request.query`, constants,
|
|
26
|
+
* path variables — is doc-independent: if it evaluates ALLOW, EVERY doc is
|
|
27
|
+
* equally allowed, so any query shape is provable.
|
|
28
|
+
* - A rule that REQUIRES a per-document predicate (`resource.data.<field> ==
|
|
29
|
+
* <const>`, conjoined into the condition) is provable ONLY IF the query
|
|
30
|
+
* carries a `where(<field>, <op>, <const>)` constraint that guarantees the
|
|
31
|
+
* same predicate. Otherwise the query could return a non-matching doc, so
|
|
32
|
+
* prod rejects it — we return `provable: false`.
|
|
33
|
+
*
|
|
34
|
+
* Out of scope (documented as conservative REJECT, never a false ALLOW): rules
|
|
35
|
+
* with disjunctions over doc data, inequality/range proofs, function-inlined
|
|
36
|
+
* data predicates. When the rule's doc-dependence can't be discharged by a
|
|
37
|
+
* direct `where` equality match, we reject — the safe direction (prod also
|
|
38
|
+
* rejects an unprovable query).
|
|
39
|
+
*/
|
|
40
|
+
import type { Expression, FunctionDef } from '../grammar/FirestoreAST.js';
|
|
41
|
+
/** A single `where(field, op, value)` constraint carried by the query. */
|
|
42
|
+
export interface QueryWhereConstraint {
|
|
43
|
+
field: string;
|
|
44
|
+
op: string;
|
|
45
|
+
value: string | number | boolean | null;
|
|
46
|
+
}
|
|
47
|
+
/** The query constraints relevant to the proof. `where` is the load-bearing
|
|
48
|
+
* one; limit/offset/orderBy are carried for completeness + future range
|
|
49
|
+
* proofs (and already populate `request.query`). */
|
|
50
|
+
export interface QueryConstraints {
|
|
51
|
+
where?: QueryWhereConstraint[];
|
|
52
|
+
limit?: number | null;
|
|
53
|
+
offset?: number | null;
|
|
54
|
+
orderBy?: string | null;
|
|
55
|
+
}
|
|
56
|
+
export type QueryProofResult = {
|
|
57
|
+
provable: true;
|
|
58
|
+
reason: string;
|
|
59
|
+
} | {
|
|
60
|
+
provable: false;
|
|
61
|
+
reason: string;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Decide whether `listCondition` is PROVABLE for every doc the query could
|
|
65
|
+
* return, given its `constraints`. Pure — no evaluation context, no I/O.
|
|
66
|
+
*
|
|
67
|
+
* @param listCondition the `allow list/read` rule's condition AST (already the
|
|
68
|
+
* specific list rule; OR-of-rules is the caller's concern — it asks per rule).
|
|
69
|
+
* @param constraints the query's where/limit/offset/orderBy.
|
|
70
|
+
* @param fnMap user-defined functions, for inlining doc-dependence checks.
|
|
71
|
+
*/
|
|
72
|
+
export declare function evaluateQueryProof(listCondition: Expression, constraints: QueryConstraints, fnMap?: Map<string, FunctionDef>): QueryProofResult;
|
|
73
|
+
/**
|
|
74
|
+
* True if the expression depends on `resource.data` (the per-document data of
|
|
75
|
+
* the candidate doc) — directly or via an inlined user function. Mirrors the
|
|
76
|
+
* shape of `referencesRequestTime` in linter/ast-utils. `request.resource.data`
|
|
77
|
+
* (the WRITE payload) is NOT per-doc-read data, so it's intentionally excluded.
|
|
78
|
+
*/
|
|
79
|
+
export declare function referencesResourceData(expr: Expression, fnMap?: Map<string, FunctionDef>, visited?: Set<string>): boolean;
|
|
80
|
+
//# sourceMappingURL=query-proof.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-proof.d.ts","sourceRoot":"","sources":["../../../src/rules/simulator/query-proof.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE1E,0EAA0E;AAC1E,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;CACzC;AAED;;qDAEqD;AACrD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,MAAM,gBAAgB,GACxB;IAAE,QAAQ,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,QAAQ,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,UAAU,EACzB,WAAW,EAAE,gBAAgB,EAC7B,KAAK,GAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAa,GAC1C,gBAAgB,CA6ClB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,UAAU,EAChB,KAAK,GAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAa,EAC3C,OAAO,cAAoB,GAC1B,OAAO,CA+BT"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decide whether `listCondition` is PROVABLE for every doc the query could
|
|
3
|
+
* return, given its `constraints`. Pure — no evaluation context, no I/O.
|
|
4
|
+
*
|
|
5
|
+
* @param listCondition the `allow list/read` rule's condition AST (already the
|
|
6
|
+
* specific list rule; OR-of-rules is the caller's concern — it asks per rule).
|
|
7
|
+
* @param constraints the query's where/limit/offset/orderBy.
|
|
8
|
+
* @param fnMap user-defined functions, for inlining doc-dependence checks.
|
|
9
|
+
*/
|
|
10
|
+
export function evaluateQueryProof(listCondition, constraints, fnMap = new Map()) {
|
|
11
|
+
// 1. Doc-independent rule → any query is provable. This is the common
|
|
12
|
+
// `allow list: if request.auth != null` / `if true` case.
|
|
13
|
+
if (!referencesResourceData(listCondition, fnMap)) {
|
|
14
|
+
return {
|
|
15
|
+
provable: true,
|
|
16
|
+
reason: 'list rule does not depend on per-document data; every doc is equally readable',
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
// 2. Doc-dependent rule. Extract the per-doc equality predicates the rule
|
|
20
|
+
// REQUIRES (top-level `&&` conjuncts of the form `resource.data.F == V`),
|
|
21
|
+
// and check each is guaranteed by a matching `where` equality constraint.
|
|
22
|
+
const required = extractRequiredDataEqualities(listCondition);
|
|
23
|
+
if (required.length === 0) {
|
|
24
|
+
// The rule touches resource.data but not via a discharge-able top-level
|
|
25
|
+
// equality (e.g. inequality, disjunction, function-wrapped). Conservatively
|
|
26
|
+
// reject — prod also rejects a query it can't prove.
|
|
27
|
+
return {
|
|
28
|
+
provable: false,
|
|
29
|
+
reason: 'list rule depends on per-document data through a predicate the query cannot discharge ' +
|
|
30
|
+
'(only top-level `resource.data.field == value` conjunctions are provable here) — ' +
|
|
31
|
+
'prod rejects the whole query rather than filtering',
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const wheres = constraints.where ?? [];
|
|
35
|
+
const unproven = required.filter(req => !wheres.some(w => w.field === req.field && w.op === '==' && valuesEqual(w.value, req.value)));
|
|
36
|
+
if (unproven.length > 0) {
|
|
37
|
+
const list = unproven.map(r => `resource.data.${r.field} == ${JSON.stringify(r.value)}`).join(', ');
|
|
38
|
+
return {
|
|
39
|
+
provable: false,
|
|
40
|
+
reason: `list rule requires [${list}] but the query has no matching where(...) ` +
|
|
41
|
+
`equality to guarantee it — prod rejects the query ("rules are not filters")`,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
provable: true,
|
|
46
|
+
reason: 'every per-document predicate the rule requires is guaranteed by a query where(...) constraint',
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* True if the expression depends on `resource.data` (the per-document data of
|
|
51
|
+
* the candidate doc) — directly or via an inlined user function. Mirrors the
|
|
52
|
+
* shape of `referencesRequestTime` in linter/ast-utils. `request.resource.data`
|
|
53
|
+
* (the WRITE payload) is NOT per-doc-read data, so it's intentionally excluded.
|
|
54
|
+
*/
|
|
55
|
+
export function referencesResourceData(expr, fnMap = new Map(), visited = new Set()) {
|
|
56
|
+
const check = (e) => {
|
|
57
|
+
switch (e.type) {
|
|
58
|
+
case 'memberAccess':
|
|
59
|
+
// `resource.data` (the bare `resource` identifier, not `request.resource`).
|
|
60
|
+
if (e.property === 'data' && e.object.type === 'identifier' && e.object.name === 'resource') {
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
return check(e.object);
|
|
64
|
+
case 'bracketAccess':
|
|
65
|
+
return check(e.object) || check(e.index);
|
|
66
|
+
case 'functionCall':
|
|
67
|
+
if (fnMap.has(e.name) && !visited.has(e.name)) {
|
|
68
|
+
visited.add(e.name);
|
|
69
|
+
const fn = fnMap.get(e.name);
|
|
70
|
+
if (referencesResourceData(fn.body, fnMap, visited))
|
|
71
|
+
return true;
|
|
72
|
+
if (fn.lets.some(b => referencesResourceData(b.value, fnMap, visited)))
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
return e.args.some(check);
|
|
76
|
+
case 'binaryOp': return check(e.left) || check(e.right);
|
|
77
|
+
case 'unaryOp': return check(e.operand);
|
|
78
|
+
case 'methodCall': return check(e.object) || e.args.some(check);
|
|
79
|
+
case 'ternary': return check(e.condition) || check(e.consequent) || check(e.alternate);
|
|
80
|
+
case 'inExpr': return check(e.element) || check(e.collection);
|
|
81
|
+
case 'isExpr': return check(e.value);
|
|
82
|
+
case 'listLiteral': return e.elements.some(check);
|
|
83
|
+
case 'mapLiteral': return e.entries.some(en => check(en.key) || check(en.value));
|
|
84
|
+
default: return false;
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
return check(expr);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Pull out the per-doc EQUALITY predicates the rule requires: top-level `&&`
|
|
91
|
+
* conjuncts shaped `resource.data.<field> == <literal>` (either operand order).
|
|
92
|
+
* Only the conjunctive (AND) spine is walked — a disjunction (`||`) anywhere
|
|
93
|
+
* means the predicate isn't unconditionally required, so we don't extract from
|
|
94
|
+
* under it (the caller then conservatively rejects).
|
|
95
|
+
*/
|
|
96
|
+
function extractRequiredDataEqualities(expr) {
|
|
97
|
+
const out = [];
|
|
98
|
+
const walkAnd = (e) => {
|
|
99
|
+
if (e.type === 'binaryOp' && e.op === '&&') {
|
|
100
|
+
walkAnd(e.left);
|
|
101
|
+
walkAnd(e.right);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const eq = asDataEquality(e);
|
|
105
|
+
if (eq)
|
|
106
|
+
out.push(eq);
|
|
107
|
+
};
|
|
108
|
+
walkAnd(expr);
|
|
109
|
+
return out;
|
|
110
|
+
}
|
|
111
|
+
/** Match `resource.data.<field> == <literal>` (either operand order) → constraint. */
|
|
112
|
+
function asDataEquality(e) {
|
|
113
|
+
if (e.type !== 'binaryOp' || e.op !== '==')
|
|
114
|
+
return null;
|
|
115
|
+
const fromSide = (data, lit) => {
|
|
116
|
+
const field = dataFieldPath(data);
|
|
117
|
+
if (field !== null && lit.type === 'literal') {
|
|
118
|
+
return { field, op: '==', value: lit.value };
|
|
119
|
+
}
|
|
120
|
+
return null;
|
|
121
|
+
};
|
|
122
|
+
return fromSide(e.left, e.right) ?? fromSide(e.right, e.left);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* If `e` is a single-segment `resource.data.<field>` access, return `<field>`;
|
|
126
|
+
* otherwise null. Nested paths (`resource.data.a.b`) aren't dischargeable by a
|
|
127
|
+
* flat `where('a.b', ...)` equality here, so they return null → reject.
|
|
128
|
+
*/
|
|
129
|
+
function dataFieldPath(e) {
|
|
130
|
+
if (e.type === 'memberAccess' &&
|
|
131
|
+
e.object.type === 'memberAccess' &&
|
|
132
|
+
e.object.property === 'data' &&
|
|
133
|
+
e.object.object.type === 'identifier' &&
|
|
134
|
+
e.object.object.name === 'resource') {
|
|
135
|
+
return e.property;
|
|
136
|
+
}
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
function valuesEqual(a, b) {
|
|
140
|
+
return a === b;
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=query-proof.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-proof.js","sourceRoot":"","sources":["../../../src/rules/simulator/query-proof.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Firestore Rules value equality.
|
|
3
|
+
*
|
|
4
|
+
* Rules wrappers and FirestoreSet own equality; lists and maps compare
|
|
5
|
+
* structurally, with map key order ignored.
|
|
6
|
+
*/
|
|
7
|
+
export declare function rulesValuesEqual(a: unknown, b: unknown): boolean;
|
|
8
|
+
//# sourceMappingURL=value-equality.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"value-equality.d.ts","sourceRoot":"","sources":["../../../src/rules/simulator/value-equality.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAiBhE"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { FirestoreSet } from './firestore-set.js';
|
|
2
|
+
import { RulesValue } from './wrappers/base.js';
|
|
3
|
+
/**
|
|
4
|
+
* Firestore Rules value equality.
|
|
5
|
+
*
|
|
6
|
+
* Rules wrappers and FirestoreSet own equality; lists and maps compare
|
|
7
|
+
* structurally, with map key order ignored.
|
|
8
|
+
*/
|
|
9
|
+
export function rulesValuesEqual(a, b) {
|
|
10
|
+
if (Object.is(a, b))
|
|
11
|
+
return true;
|
|
12
|
+
if (a instanceof RulesValue)
|
|
13
|
+
return a.equals(b);
|
|
14
|
+
if (b instanceof RulesValue)
|
|
15
|
+
return b.equals(a);
|
|
16
|
+
if (a instanceof FirestoreSet || b instanceof FirestoreSet) {
|
|
17
|
+
return a instanceof FirestoreSet && a.equals(b);
|
|
18
|
+
}
|
|
19
|
+
if (Array.isArray(a) || Array.isArray(b)) {
|
|
20
|
+
if (!Array.isArray(a) || !Array.isArray(b))
|
|
21
|
+
return false;
|
|
22
|
+
if (a.length !== b.length)
|
|
23
|
+
return false;
|
|
24
|
+
return a.every((value, index) => rulesValuesEqual(value, b[index]));
|
|
25
|
+
}
|
|
26
|
+
if (!isRulesMapValue(a) || !isRulesMapValue(b))
|
|
27
|
+
return false;
|
|
28
|
+
const aKeys = Object.keys(a);
|
|
29
|
+
const bKeys = Object.keys(b);
|
|
30
|
+
if (aKeys.length !== bKeys.length)
|
|
31
|
+
return false;
|
|
32
|
+
return aKeys.every((key) => key in b && rulesValuesEqual(a[key], b[key]));
|
|
33
|
+
}
|
|
34
|
+
function isRulesMapValue(value) {
|
|
35
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
36
|
+
return false;
|
|
37
|
+
const prototype = Object.getPrototypeOf(value);
|
|
38
|
+
return prototype === Object.prototype || prototype === null;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=value-equality.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"value-equality.js","sourceRoot":"","sources":["../../../src/rules/simulator/value-equality.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAU,EAAE,CAAU;IACrD,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACjC,IAAI,CAAC,YAAY,UAAU;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAChD,IAAI,CAAC,YAAY,UAAU;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAChD,IAAI,CAAC,YAAY,YAAY,IAAI,CAAC,YAAY,YAAY,EAAE,CAAC;QAC3D,OAAO,CAAC,YAAY,YAAY,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QACzD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QACxC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAChD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtF,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC/C,OAAO,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wrapper class contract for Firestore Rules value types — see
|
|
3
|
+
* REBUILD_PLAN.md Item 0.B + Item 1.
|
|
4
|
+
*
|
|
5
|
+
* Why an abstract base instead of duck typing: the evaluator dispatches
|
|
6
|
+
* through six different code paths (rulesValuesEqual, memberAccess,
|
|
7
|
+
* bracketAccess, evaluateMethodCall, evaluateBinaryOp, isExpr, inExpr).
|
|
8
|
+
* Without a single base class, every new wrapper would have to be
|
|
9
|
+
* registered at six sites — and forgetting one is the exact failure mode
|
|
10
|
+
* 0.B is designed to prevent ("two `Timestamp` instances wrapping the
|
|
11
|
+
* same millis weren't `===`, so `request.time == otherTime` always
|
|
12
|
+
* denied in sim"). With this base class, every wrapper inherits all six
|
|
13
|
+
* dispatch hooks for free.
|
|
14
|
+
*
|
|
15
|
+
* Concrete subclasses (Timestamp, Duration, Bytes, LatLng) land in
|
|
16
|
+
* Item 1.1–1.4. Path lands in Item 5. This file is intentionally
|
|
17
|
+
* dead code until 1.1 — landing it first makes each wrapper sub-task
|
|
18
|
+
* a "fill in the blanks" exercise instead of a structural change.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Sentinel returned by `binaryOp` / `callMethod` when the wrapper does
|
|
22
|
+
* not handle the requested operation/method. The evaluator interprets
|
|
23
|
+
* NO_OP as "fall through" — for `binaryOp` that means try the generic
|
|
24
|
+
* numeric path; for `callMethod` it means throw `UnsupportedError`.
|
|
25
|
+
*
|
|
26
|
+
* `Symbol.for` (registered symbol) survives module duplication that
|
|
27
|
+
* can happen across bun + esbuild + node test runners — `===` checks
|
|
28
|
+
* stay reliable even if `base.ts` is loaded under two different module
|
|
29
|
+
* specifiers.
|
|
30
|
+
*/
|
|
31
|
+
export declare const NO_OP: unique symbol;
|
|
32
|
+
export type NoOp = typeof NO_OP;
|
|
33
|
+
export declare abstract class RulesValue {
|
|
34
|
+
/**
|
|
35
|
+
* Stable type tag for `isExpr` dispatch — must match the names emitted
|
|
36
|
+
* by the parser for `is timestamp`, `is duration`, `is bytes`,
|
|
37
|
+
* `is latlng`, `is path`. Lowercase, single token.
|
|
38
|
+
*/
|
|
39
|
+
abstract readonly typeName: string;
|
|
40
|
+
/**
|
|
41
|
+
* Numeric coercion for any code path that bypasses `binaryOp` and
|
|
42
|
+
* casts to number (legacy `as number` sites in evaluator.ts and any
|
|
43
|
+
* future `String(x)` / `Number(x)` calls). The 0.B per-wrapper table
|
|
44
|
+
* documents what each type returns:
|
|
45
|
+
* Timestamp / Duration → seconds*1000 + Math.round(nanos/1e6) (millis)
|
|
46
|
+
* Bytes → data.length (byte count)
|
|
47
|
+
* LatLng / Path → NaN (no meaningful numeric coercion)
|
|
48
|
+
*
|
|
49
|
+
* Returning NaN for LatLng/Path is intentional — any rule that does
|
|
50
|
+
* arithmetic on them is buggy, and NaN propagation makes the failure
|
|
51
|
+
* loud rather than silent. The binary op hook (`binaryOp`) catches
|
|
52
|
+
* the supported cases above this fallback.
|
|
53
|
+
*/
|
|
54
|
+
abstract valueOf(): number;
|
|
55
|
+
/**
|
|
56
|
+
* String coercion for map keys, regex args, path segments, the
|
|
57
|
+
* `string()` builtin, and template-style concatenation. Must
|
|
58
|
+
* round-trip through value-equality where the wrapper has a literal
|
|
59
|
+
* form: `parseRules(toString(x)).equals(x)` for Timestamp/Duration/
|
|
60
|
+
* LatLng/Path. Bytes is exempt (literal form is the base64 string,
|
|
61
|
+
* but the parser side will land with hashing.* in Item 5).
|
|
62
|
+
*/
|
|
63
|
+
abstract toString(): string;
|
|
64
|
+
/**
|
|
65
|
+
* JSON-serializable form for debug output and any consumer that
|
|
66
|
+
* runs `JSON.stringify` on a TestResult. Returns a plain object with
|
|
67
|
+
* a `__type` discriminator so the serialized form is stable across
|
|
68
|
+
* releases — crucial for the parity stress harness's debugMessages.
|
|
69
|
+
*/
|
|
70
|
+
abstract toJSON(): unknown;
|
|
71
|
+
/**
|
|
72
|
+
* Value equality. THE single source of truth for `==` / `!=` /
|
|
73
|
+
* `rulesValuesEqual`. `===` reference equality is intentionally
|
|
74
|
+
* insufficient (the 0.B failure: two `timestamp.value(1234)` calls
|
|
75
|
+
* produce two distinct instances; `===` is false; rule denies).
|
|
76
|
+
*/
|
|
77
|
+
abstract equals(other: unknown): boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Property access for `x.field` and `x[field]`. Default returns null
|
|
80
|
+
* (no such field) — the same shape Firestore rules use for missing
|
|
81
|
+
* map keys, so denial behavior is consistent.
|
|
82
|
+
*
|
|
83
|
+
* Wrappers override only for named properties they expose. Methods
|
|
84
|
+
* are NOT exposed via `field` — `x.size` evaluates the property to
|
|
85
|
+
* `null`, and `x.size()` goes through `callMethod` instead.
|
|
86
|
+
*/
|
|
87
|
+
field(_name: string): unknown;
|
|
88
|
+
/**
|
|
89
|
+
* Method dispatch for `x.method(args)`. Default returns NO_OP — the
|
|
90
|
+
* evaluator turns NO_OP into `UnsupportedError`, which the handler
|
|
91
|
+
* maps to TestResult.state = 'UNSUPPORTED' (Item 0.A). That gives
|
|
92
|
+
* agents a clear "sim gap" signal rather than a silent DENY when a
|
|
93
|
+
* wrapper hasn't implemented a method yet.
|
|
94
|
+
*
|
|
95
|
+
* Wrappers override with a switch on `method` and dispatch to their
|
|
96
|
+
* own private methods. The dispatch table is intentionally not a
|
|
97
|
+
* `Record<string, Function>` — keeping it as a switch lets each
|
|
98
|
+
* wrapper apply its own arg validation and return-type promises
|
|
99
|
+
* inline rather than forcing a uniform signature.
|
|
100
|
+
*/
|
|
101
|
+
callMethod(_method: string, _args: unknown[]): unknown | NoOp;
|
|
102
|
+
/**
|
|
103
|
+
* Cross-type binary operator dispatch. Default returns NO_OP — the
|
|
104
|
+
* evaluator falls through to generic numeric ops via `valueOf()`.
|
|
105
|
+
*
|
|
106
|
+
* Wrappers override for the operators they support. The 0.B
|
|
107
|
+
* "Required dispatch changes" table specifies the cross-type
|
|
108
|
+
* arithmetic each wrapper claims:
|
|
109
|
+
* Timestamp + Duration → Timestamp
|
|
110
|
+
* Timestamp - Timestamp → Duration
|
|
111
|
+
* Timestamp - Duration → Timestamp
|
|
112
|
+
* Duration ± Duration → Duration
|
|
113
|
+
* Bytes < <= > >= Bytes → lexicographic byte compare
|
|
114
|
+
*
|
|
115
|
+
* `==` and `!=` do NOT route through this hook — they go through
|
|
116
|
+
* `rulesValuesEqual` which calls `equals()`. This split keeps the
|
|
117
|
+
* "is this the same value?" question separate from "what does
|
|
118
|
+
* `lhs OP rhs` evaluate to?".
|
|
119
|
+
*
|
|
120
|
+
* Dispatch is left-operand-only. For commutative ops where the
|
|
121
|
+
* right operand is a wrapper but the left isn't (e.g. `1 + duration`),
|
|
122
|
+
* the wrapper is responsible for handling reversed arguments via
|
|
123
|
+
* its own `binaryOp` when called from the right — the evaluator
|
|
124
|
+
* detects this by re-dispatching when `lv` isn't a wrapper but
|
|
125
|
+
* `rv` is, for the symmetric ops `==`, `!=`, `+`, `*`.
|
|
126
|
+
*/
|
|
127
|
+
binaryOp(_op: string, _other: unknown): unknown | NoOp;
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../src/rules/simulator/wrappers/base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH;;;;;;;;;;GAUG;AACH,eAAO,MAAM,KAAK,EAAE,OAAO,MAAsD,CAAC;AAClF,MAAM,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC;AAEhC,8BAAsB,UAAU;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAEnC;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,OAAO,IAAI,MAAM;IAE1B;;;;;;;OAOG;IACH,QAAQ,CAAC,QAAQ,IAAI,MAAM;IAE3B;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,IAAI,OAAO;IAE1B;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAExC;;;;;;;;OAQG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI7B;;;;;;;;;;;;OAYG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,GAAG,IAAI;IAI7D;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI;CAGvD"}
|