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