@pyric/cli 0.1.0-alpha.14 → 0.1.0-alpha.16
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/dist/assurance/.generated/conformance-verdicts.d.ts +120 -75
- package/dist/assurance/.generated/conformance-verdicts.d.ts.map +1 -1
- package/dist/assurance/.generated/conformance-verdicts.js +120 -75
- package/dist/assurance/.generated/conformance-verdicts.js.map +1 -1
- package/dist/bridge/client/dispatch.js +1 -1
- package/dist/bridge/client/dispatch.js.map +1 -1
- package/dist/cli/serve.d.ts +1 -1
- package/dist/cli/serve.d.ts.map +1 -1
- package/dist/cli/serve.js +207 -284
- package/dist/cli/serve.js.map +1 -1
- package/dist/cli/service-command-records/database-rules-generate.d.ts +4 -0
- package/dist/cli/service-command-records/database-rules-generate.d.ts.map +1 -0
- package/dist/cli/service-command-records/database-rules-generate.js +3 -0
- package/dist/cli/service-command-records/database-rules-generate.js.map +1 -0
- package/dist/cli/service-command-records/database-rules-lint.d.ts +4 -0
- package/dist/cli/service-command-records/database-rules-lint.d.ts.map +1 -0
- package/dist/cli/service-command-records/database-rules-lint.js +3 -0
- package/dist/cli/service-command-records/database-rules-lint.js.map +1 -0
- package/dist/cli/service-command-records/database-rules-simulate.d.ts +4 -0
- package/dist/cli/service-command-records/database-rules-simulate.d.ts.map +1 -0
- package/dist/cli/service-command-records/database-rules-simulate.js +3 -0
- package/dist/cli/service-command-records/database-rules-simulate.js.map +1 -0
- package/dist/cli/service-command-records/database-rules-validate.d.ts +4 -0
- package/dist/cli/service-command-records/database-rules-validate.d.ts.map +1 -0
- package/dist/cli/service-command-records/database-rules-validate.js +3 -0
- package/dist/cli/service-command-records/database-rules-validate.js.map +1 -0
- package/dist/cli/service-command-records/firestore-indexes-generate.d.ts +4 -0
- package/dist/cli/service-command-records/firestore-indexes-generate.d.ts.map +1 -0
- package/dist/cli/service-command-records/firestore-indexes-generate.js +3 -0
- package/dist/cli/service-command-records/firestore-indexes-generate.js.map +1 -0
- package/dist/cli/service-command-records/firestore-rules-lint.d.ts +4 -0
- package/dist/cli/service-command-records/firestore-rules-lint.d.ts.map +1 -0
- package/dist/cli/service-command-records/firestore-rules-lint.js +3 -0
- package/dist/cli/service-command-records/firestore-rules-lint.js.map +1 -0
- package/dist/cli/service-command-records/firestore-rules-resolve.d.ts +4 -0
- package/dist/cli/service-command-records/firestore-rules-resolve.d.ts.map +1 -0
- package/dist/cli/service-command-records/firestore-rules-resolve.js +3 -0
- package/dist/cli/service-command-records/firestore-rules-resolve.js.map +1 -0
- package/dist/cli/service-command-records/firestore-rules-simulate.d.ts +4 -0
- package/dist/cli/service-command-records/firestore-rules-simulate.d.ts.map +1 -0
- package/dist/cli/service-command-records/firestore-rules-simulate.js +3 -0
- package/dist/cli/service-command-records/firestore-rules-simulate.js.map +1 -0
- package/dist/cli/service-command-records/firestore-rules-validate.d.ts +4 -0
- package/dist/cli/service-command-records/firestore-rules-validate.d.ts.map +1 -0
- package/dist/cli/service-command-records/firestore-rules-validate.js +3 -0
- package/dist/cli/service-command-records/firestore-rules-validate.js.map +1 -0
- package/dist/cli/service-command-records/storage-rules-lint.d.ts +4 -0
- package/dist/cli/service-command-records/storage-rules-lint.d.ts.map +1 -0
- package/dist/cli/service-command-records/storage-rules-lint.js +3 -0
- package/dist/cli/service-command-records/storage-rules-lint.js.map +1 -0
- package/dist/cli/service-command-records/storage-rules-simulate.d.ts +4 -0
- package/dist/cli/service-command-records/storage-rules-simulate.d.ts.map +1 -0
- package/dist/cli/service-command-records/storage-rules-simulate.js +3 -0
- package/dist/cli/service-command-records/storage-rules-simulate.js.map +1 -0
- package/dist/cli/service-commands.d.ts +7 -0
- package/dist/cli/service-commands.d.ts.map +1 -1
- package/dist/cli/service-commands.generated.d.ts +35 -0
- package/dist/cli/service-commands.generated.d.ts.map +1 -0
- package/dist/cli/service-commands.generated.js +25 -0
- package/dist/cli/service-commands.generated.js.map +1 -0
- package/dist/cli/service-commands.js +23 -40
- package/dist/cli/service-commands.js.map +1 -1
- package/dist/conformance/.generated/can-i-use-browser.d.ts.map +1 -1
- package/dist/conformance/.generated/can-i-use-browser.js +1 -1
- package/dist/conformance/.generated/can-i-use-browser.js.map +1 -1
- package/dist/conformance/.generated/can-i-use.d.ts.map +1 -1
- package/dist/conformance/.generated/can-i-use.js +1 -1
- package/dist/conformance/.generated/can-i-use.js.map +1 -1
- package/dist/conformance/.generated/conformance-docs.d.ts.map +1 -1
- package/dist/conformance/.generated/conformance-docs.js +1 -1
- package/dist/conformance/.generated/conformance-docs.js.map +1 -1
- package/dist/functions-rtdb/development-runtime.d.ts +63 -0
- package/dist/functions-rtdb/development-runtime.d.ts.map +1 -0
- package/dist/functions-rtdb/development-runtime.js +244 -0
- package/dist/functions-rtdb/development-runtime.js.map +1 -0
- package/dist/serve/bridge-mount.d.ts +32 -2
- package/dist/serve/bridge-mount.d.ts.map +1 -1
- package/dist/serve/bridge-mount.js +232 -18
- package/dist/serve/bridge-mount.js.map +1 -1
- package/dist/serve/bundler.d.ts +2 -18
- package/dist/serve/bundler.d.ts.map +1 -1
- package/dist/serve/bundler.js +7 -35
- package/dist/serve/bundler.js.map +1 -1
- package/dist/serve/entries/app-client.d.ts.map +1 -1
- package/dist/serve/entries/app-client.js +5 -5
- package/dist/serve/entries/app-client.js.map +1 -1
- package/dist/serve/entries/auth-helper-core.d.ts +32 -6
- package/dist/serve/entries/auth-helper-core.d.ts.map +1 -1
- package/dist/serve/entries/auth-helper-core.js +82 -24
- package/dist/serve/entries/auth-helper-core.js.map +1 -1
- package/dist/serve/entries/auth.d.ts.map +1 -1
- package/dist/serve/entries/auth.js +6 -4
- package/dist/serve/entries/auth.js.map +1 -1
- package/dist/serve/entries/database.d.ts +28 -0
- package/dist/serve/entries/database.d.ts.map +1 -1
- package/dist/serve/entries/database.js +95 -26
- package/dist/serve/entries/database.js.map +1 -1
- package/dist/serve/entries/init.d.ts.map +1 -1
- package/dist/serve/entries/init.js +21 -12
- package/dist/serve/entries/init.js.map +1 -1
- package/dist/serve/html-injection.d.ts +5 -0
- package/dist/serve/html-injection.d.ts.map +1 -0
- package/dist/serve/html-injection.js +59 -0
- package/dist/serve/html-injection.js.map +1 -0
- package/dist/serve/namespace.d.ts +6 -22
- package/dist/serve/namespace.d.ts.map +1 -1
- package/dist/serve/namespace.js +23 -145
- package/dist/serve/namespace.js.map +1 -1
- package/dist/serve/runtime/worker-replacement.d.ts +1 -2
- package/dist/serve/runtime/worker-replacement.d.ts.map +1 -1
- package/dist/serve/sandbox-session.d.ts +78 -0
- package/dist/serve/sandbox-session.d.ts.map +1 -0
- package/dist/serve/sandbox-session.js +171 -0
- package/dist/serve/sandbox-session.js.map +1 -0
- package/dist/serve/server.d.ts +5 -2
- package/dist/serve/server.d.ts.map +1 -1
- package/dist/serve/server.js +21 -5
- package/dist/serve/server.js.map +1 -1
- package/dist/serve/site-tree.d.ts +8 -0
- package/dist/serve/site-tree.d.ts.map +1 -0
- package/dist/serve/site-tree.js +113 -0
- package/dist/serve/site-tree.js.map +1 -0
- package/dist/serve/site-ui/_astro/RulesCodeEditor.CzwHdCi9.js +23 -0
- package/dist/serve/site-ui/_astro/_example_.jevZ7OdV.css +1 -0
- package/dist/serve/site-ui/_astro/_slug_.BoKXYrnu.css +1 -0
- package/dist/serve/site-ui/_astro/_studio_.BtYpqe1A.css +1 -0
- package/dist/serve/site-ui/_astro/app.4HeLP_FA.js +109 -0
- package/dist/serve/site-ui/_astro/app.BgSnCR5G.js +1 -0
- package/dist/serve/site-ui/_astro/app.BsFsMjn0.css +1 -0
- package/dist/serve/site-ui/_astro/chess-showcase.CnoxIle5.js +1 -0
- package/dist/serve/site-ui/_astro/chess-source-explorer.C5k9c5yK.js +1 -0
- package/dist/serve/site-ui/_astro/chess-v2.CFHmd3UL.js +354 -0
- package/dist/serve/site-ui/_astro/client.D2ORs4B-.js +25 -0
- package/dist/serve/site-ui/_astro/example-runtime.R1d96L6-.js +291 -0
- package/dist/serve/site-ui/_astro/index.BJiOemMX.js +1 -0
- package/dist/serve/site-ui/_astro/index.DBy5LfQW.js +9 -0
- package/dist/serve/site-ui/_astro/index.DNyk7q8W.js +9 -0
- package/dist/serve/site-ui/_astro/jsx-runtime.D_zvdyIk.js +9 -0
- package/dist/serve/site-ui/_astro/reads.BrKNdKAa.js +1 -0
- package/dist/serve/site-ui/_astro/sandbox-controls.BTb3EbQp.js +1153 -0
- package/dist/serve/site-ui/_astro/seed.EyI3VYEu.js +20 -0
- package/dist/serve/site-ui/auth/index.html +11 -0
- package/dist/serve/site-ui/docs/_rhythm/index.html +100 -0
- package/dist/serve/site-ui/docs/agent/set-up-your-agent/index.html +43 -0
- package/dist/serve/site-ui/docs/agent/watch-and-review/index.html +26 -0
- package/dist/serve/site-ui/docs/agent/work-with-an-agent/index.html +70 -0
- package/dist/serve/{docs-ui → site-ui}/docs/ai-compat/index.html +3 -3
- package/dist/serve/site-ui/docs/api-reference/index.html +68 -0
- package/dist/serve/{docs-ui → site-ui}/docs/app-compat/index.html +3 -3
- package/dist/serve/{docs-ui → site-ui}/docs/auth-compat/index.html +3 -3
- package/dist/serve/site-ui/docs/build/ai-logic/index.html +64 -0
- package/dist/serve/site-ui/docs/build/authentication/index.html +66 -0
- package/dist/serve/site-ui/docs/build/cloud-firestore/index.html +84 -0
- package/dist/serve/site-ui/docs/build/cloud-messaging/index.html +71 -0
- package/dist/serve/site-ui/docs/build/cloud-storage/index.html +66 -0
- package/dist/serve/{docs-ui → site-ui}/docs/build/cloud-storage.md +2 -2
- package/dist/serve/site-ui/docs/build/realtime-database/index.html +67 -0
- package/dist/serve/site-ui/docs/conformance-scores/index.html +50 -0
- package/dist/serve/{docs-ui → site-ui}/docs/conformance-scores.md +3 -3
- package/dist/serve/site-ui/docs/create-pyric-reference-api/index.html +531 -0
- package/dist/serve/{docs-ui → site-ui}/docs/database-compat/index.html +211 -168
- package/dist/serve/{docs-ui → site-ui}/docs/database-compat.md +208 -170
- package/dist/serve/site-ui/docs/examples/chess/index.html +384 -0
- package/dist/serve/site-ui/docs/examples/chess.md +57 -0
- package/dist/serve/site-ui/docs/examples/index.html +3 -0
- package/dist/serve/site-ui/docs/examples.md +4 -0
- package/dist/serve/{docs-ui → site-ui}/docs/firestore-compat/index.html +55 -91
- package/dist/serve/{docs-ui → site-ui}/docs/firestore-compat.md +52 -88
- package/dist/serve/site-ui/docs/functions-rtdb-compat/index.html +73 -0
- package/dist/serve/site-ui/docs/get-started/how-the-swap-works/index.html +29 -0
- package/dist/serve/site-ui/docs/get-started/start-building/index.html +33 -0
- package/dist/serve/{docs-ui → site-ui}/docs/index.json +595 -26
- package/dist/serve/site-ui/docs/messaging-compat/index.html +324 -0
- package/dist/serve/{docs-ui → site-ui}/docs/messaging-compat.md +71 -1
- package/dist/serve/site-ui/docs/observe/resolve-runtime-status/index.html +28 -0
- package/dist/serve/site-ui/docs/observe/see-whats-happening/index.html +74 -0
- package/dist/serve/site-ui/docs/observe/shape-your-data/index.html +45 -0
- package/dist/serve/site-ui/docs/overview/index.html +17 -0
- package/dist/serve/site-ui/docs/pyric-admin-app-reference-api/index.html +186 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-auth-reference-api/index.html +4 -4
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-database-reference-api/index.html +4 -4
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-firestore-reference-api/index.html +318 -202
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-firestore-reference-api.md +154 -27
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-messaging-reference-api/index.html +5 -5
- package/dist/serve/site-ui/docs/pyric-admin-storage-reference-api/index.html +318 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-ai-reference-api/index.html +5 -5
- package/dist/serve/site-ui/docs/pyric-ai-scripting-reference-api/index.html +160 -0
- package/dist/serve/site-ui/docs/pyric-app-reference-api/index.html +425 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-auth-reference-api/index.html +6 -6
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-auth-reference-api.md +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +60 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-assurance-reference-api/index.html +4 -4
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-bridge-client-reference-api/index.html +4 -4
- package/dist/serve/site-ui/docs/pyric-cli-bridge-reference-api/index.html +507 -0
- package/dist/serve/site-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +258 -0
- package/dist/serve/site-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +51 -0
- package/dist/serve/site-ui/docs/pyric-cli-conformance-reference-api/index.html +308 -0
- package/dist/serve/site-ui/docs/pyric-cli-credentials-node-reference-api/index.html +68 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-discover-reference-api/index.html +4 -4
- package/dist/serve/site-ui/docs/pyric-cli-register-reference-api/index.html +11 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-remote-reference-api/index.html +4 -4
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-serve-worker-reference-api/index.html +1186 -1384
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-serve-worker-reference-api.md +817 -1291
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-verify-reference-api/index.html +4 -4
- package/dist/serve/site-ui/docs/pyric-cli-vite-reference-api/index.html +126 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-vite-reference-api.md +1 -1
- package/dist/serve/site-ui/docs/pyric-database-reference-api/index.html +2641 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-database-reference-api.md +1055 -158
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-firestore-reference-api/index.html +311 -249
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-firestore-reference-api.md +72 -54
- package/dist/serve/site-ui/docs/pyric-messaging-reference-api/index.html +509 -0
- package/dist/serve/site-ui/docs/pyric-messaging-sw-reference-api/index.html +182 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-rules-reference-api/index.html +7 -26
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-rules-reference-api.md +13 -23
- package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api/index.html +121 -0
- package/dist/serve/site-ui/docs/pyric-sandbox-firestore-reference-api/index.html +203 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-sandbox-reference-api/index.html +26 -5
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-sandbox-reference-api.md +22 -22
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-storage-reference-api/index.html +5 -15
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-storage-reference-api.md +0 -13
- package/dist/serve/site-ui/docs/pyric-ui-agents-reference-api/index.html +639 -0
- package/dist/serve/site-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +100 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-auth-reference-api/index.html +4 -4
- package/dist/serve/site-ui/docs/pyric-ui-events-hooks-reference-api/index.html +24 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-events-reference-api/index.html +4 -4
- package/dist/serve/site-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +136 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-firestore-reference-api/index.html +7 -7
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-firestore-reference-api.md +4 -4
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-primitives-reference-api/index.html +4 -4
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-rtdb-reference-api/index.html +4 -4
- package/dist/serve/site-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +16 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-rules-reference-api/index.html +4 -4
- package/dist/serve/site-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +176 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-storage-reference-api/index.html +10 -11
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-storage-reference-api.md +7 -8
- package/dist/serve/site-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +188 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-traffic-reference-api/index.html +4 -4
- package/dist/serve/{docs-ui → site-ui}/docs/rules-compat/index.html +87 -57
- package/dist/serve/{docs-ui → site-ui}/docs/rules-compat.md +84 -54
- package/dist/serve/site-ui/docs/secure/audit-your-rules/index.html +51 -0
- package/dist/serve/site-ui/docs/secure/firestore-rules-limits/index.html +106 -0
- package/dist/serve/site-ui/docs/secure/read-a-denial/index.html +41 -0
- package/dist/serve/site-ui/docs/secure/rtdb-rules-in-typescript/index.html +67 -0
- package/dist/serve/site-ui/docs/secure/rules-standard-library/index.html +159 -0
- package/dist/serve/{docs-ui → site-ui}/docs/secure/rules-standard-library.md +2 -2
- package/dist/serve/site-ui/docs/secure/secure-it-with-rules/index.html +47 -0
- package/dist/serve/site-ui/docs/secure/simulate-and-lint/index.html +95 -0
- package/dist/serve/site-ui/docs/secure/write-a-rules-test-suite/index.html +82 -0
- package/dist/serve/site-ui/docs/ship/ship-to-production/index.html +37 -0
- package/dist/serve/site-ui/docs/ship/test-in-node/index.html +75 -0
- package/dist/serve/{docs-ui → site-ui}/docs/storage-compat/index.html +8 -8
- package/dist/serve/{docs-ui → site-ui}/docs/storage-compat.md +5 -5
- package/dist/serve/site-ui/docs/trust/how-we-know-it-matches-firebase/index.html +132 -0
- package/dist/serve/site-ui/docs/trust/rules-standard-library/index.html +861 -0
- package/dist/serve/site-ui/docs/trust/rules-standard-library.md +344 -0
- package/dist/serve/site-ui/docs/trust/storage-rules-stdlib-research/index.html +582 -0
- package/dist/serve/site-ui/docs/trust/storage-rules-stdlib-research.md +448 -0
- package/dist/serve/site-ui/docs/trust/versioning-and-compatibility/index.html +14 -0
- package/dist/serve/{docs-ui → site-ui}/docs/tutorial/index.html +4 -4
- package/dist/serve/{docs-ui → site-ui}/docs/tutorial.md +1 -1
- package/dist/serve/site-ui/examples/chess/index.html +2 -0
- package/dist/serve/site-ui/examples/firestore-first-write/index.html +2 -0
- package/dist/serve/site-ui/firestore/index.html +11 -0
- package/dist/serve/site-ui/index.html +11 -0
- package/dist/serve/{docs-ui → site-ui}/llms.txt +6 -2
- package/dist/serve/site-ui/rtdb/index.html +11 -0
- package/dist/serve/site-ui/settings/index.html +11 -0
- package/dist/serve/site-ui/storage/index.html +11 -0
- package/dist/serve/site-ui/studio-routes.json +1 -0
- package/dist/serve/site-ui/traffic/index.html +11 -0
- package/dist/serve/standalone-assets.d.ts +4 -10
- package/dist/serve/standalone-assets.d.ts.map +1 -1
- package/dist/serve/standalone-assets.js +8 -21
- package/dist/serve/standalone-assets.js.map +1 -1
- package/dist/serve/vite-functions-development.d.ts +29 -0
- package/dist/serve/vite-functions-development.d.ts.map +1 -0
- package/dist/serve/vite-functions-development.js +150 -0
- package/dist/serve/vite-functions-development.js.map +1 -0
- package/dist/serve/vite-generation-bridge.d.ts +17 -0
- package/dist/serve/vite-generation-bridge.d.ts.map +1 -0
- package/dist/serve/vite-generation-bridge.js +47 -0
- package/dist/serve/vite-generation-bridge.js.map +1 -0
- package/dist/serve/vite-generation-functions.d.ts +35 -0
- package/dist/serve/vite-generation-functions.d.ts.map +1 -0
- package/dist/serve/vite-generation-functions.js +46 -0
- package/dist/serve/vite-generation-functions.js.map +1 -0
- package/dist/serve/vite-generation-middleware.d.ts +10 -0
- package/dist/serve/vite-generation-middleware.d.ts.map +1 -0
- package/dist/serve/vite-generation-middleware.js +40 -0
- package/dist/serve/vite-generation-middleware.js.map +1 -0
- package/dist/serve/vite-generation-rules-watch.d.ts +8 -0
- package/dist/serve/vite-generation-rules-watch.d.ts.map +1 -0
- package/dist/serve/vite-generation-rules-watch.js +33 -0
- package/dist/serve/vite-generation-rules-watch.js.map +1 -0
- package/dist/serve/vite-module-swap.d.ts +16 -0
- package/dist/serve/vite-module-swap.d.ts.map +1 -0
- package/dist/serve/vite-module-swap.js +96 -0
- package/dist/serve/vite-module-swap.js.map +1 -0
- package/dist/serve/vite-page-runtime.d.ts +29 -0
- package/dist/serve/vite-page-runtime.d.ts.map +1 -0
- package/dist/serve/vite-page-runtime.js +71 -0
- package/dist/serve/vite-page-runtime.js.map +1 -0
- package/dist/serve/vite-plugin.d.ts +44 -4
- package/dist/serve/vite-plugin.d.ts.map +1 -1
- package/dist/serve/vite-plugin.js +62 -864
- package/dist/serve/vite-plugin.js.map +1 -1
- package/dist/serve/vite-sandbox-generation.d.ts +57 -0
- package/dist/serve/vite-sandbox-generation.d.ts.map +1 -0
- package/dist/serve/vite-sandbox-generation.js +178 -0
- package/dist/serve/vite-sandbox-generation.js.map +1 -0
- package/dist/serve/worker/client/disconnect.d.ts.map +1 -1
- package/dist/serve/worker/client/disconnect.js +2 -0
- package/dist/serve/worker/client/disconnect.js.map +1 -1
- package/dist/serve/worker/client/handles.d.ts +5 -0
- package/dist/serve/worker/client/handles.d.ts.map +1 -1
- package/dist/serve/worker/client/handles.js.map +1 -1
- package/dist/serve/worker/client/pagehide.d.ts +13 -0
- package/dist/serve/worker/client/pagehide.d.ts.map +1 -0
- package/dist/serve/worker/client/pagehide.js +19 -0
- package/dist/serve/worker/client/pagehide.js.map +1 -0
- package/dist/serve/worker/client/rtdb-admin.d.ts +8 -0
- package/dist/serve/worker/client/rtdb-admin.d.ts.map +1 -0
- package/dist/serve/worker/client/rtdb-admin.js +39 -0
- package/dist/serve/worker/client/rtdb-admin.js.map +1 -0
- package/dist/serve/worker/client/rtdb-connection-lifecycle.d.ts +15 -0
- package/dist/serve/worker/client/rtdb-connection-lifecycle.d.ts.map +1 -0
- package/dist/serve/worker/client/rtdb-connection-lifecycle.js +45 -0
- package/dist/serve/worker/client/rtdb-connection-lifecycle.js.map +1 -0
- package/dist/serve/worker/client/rtdb-controls.d.ts +6 -0
- package/dist/serve/worker/client/rtdb-controls.d.ts.map +1 -0
- package/dist/serve/worker/client/rtdb-controls.js +8 -0
- package/dist/serve/worker/client/rtdb-controls.js.map +1 -0
- package/dist/serve/worker/client/rtdb-listeners.d.ts +24 -0
- package/dist/serve/worker/client/rtdb-listeners.d.ts.map +1 -0
- package/dist/serve/worker/client/rtdb-listeners.js +262 -0
- package/dist/serve/worker/client/rtdb-listeners.js.map +1 -0
- package/dist/serve/worker/client/rtdb-reads.d.ts +4 -0
- package/dist/serve/worker/client/rtdb-reads.d.ts.map +1 -0
- package/dist/serve/worker/client/rtdb-reads.js +11 -0
- package/dist/serve/worker/client/rtdb-reads.js.map +1 -0
- package/dist/serve/worker/client/rtdb-references.d.ts +19 -0
- package/dist/serve/worker/client/rtdb-references.d.ts.map +1 -0
- package/dist/serve/worker/client/rtdb-references.js +63 -0
- package/dist/serve/worker/client/rtdb-references.js.map +1 -0
- package/dist/serve/worker/client/rtdb-snapshots.d.ts +20 -0
- package/dist/serve/worker/client/rtdb-snapshots.d.ts.map +1 -0
- package/dist/serve/worker/client/rtdb-snapshots.js +64 -0
- package/dist/serve/worker/client/rtdb-snapshots.js.map +1 -0
- package/dist/serve/worker/client/rtdb-transactions.d.ts +14 -0
- package/dist/serve/worker/client/rtdb-transactions.d.ts.map +1 -0
- package/dist/serve/worker/client/rtdb-transactions.js +34 -0
- package/dist/serve/worker/client/rtdb-transactions.js.map +1 -0
- package/dist/serve/worker/client/rtdb-writes.d.ts +8 -0
- package/dist/serve/worker/client/rtdb-writes.d.ts.map +1 -0
- package/dist/serve/worker/client/rtdb-writes.js +65 -0
- package/dist/serve/worker/client/rtdb-writes.js.map +1 -0
- package/dist/serve/worker/client.d.ts +0 -2
- package/dist/serve/worker/client.d.ts.map +1 -1
- package/dist/serve/worker/client.js +0 -2
- package/dist/serve/worker/client.js.map +1 -1
- package/dist/serve/worker/entry.js +2 -2
- package/dist/serve/worker/entry.js.map +1 -1
- package/dist/serve/worker/host/dispatch.d.ts +2 -0
- package/dist/serve/worker/host/dispatch.d.ts.map +1 -1
- package/dist/serve/worker/host/dispatch.js +24 -2
- package/dist/serve/worker/host/dispatch.js.map +1 -1
- package/dist/serve/worker/host/rtdb.d.ts +6 -2
- package/dist/serve/worker/host/rtdb.d.ts.map +1 -1
- package/dist/serve/worker/host/rtdb.js +224 -2
- package/dist/serve/worker/host/rtdb.js.map +1 -1
- package/dist/serve/worker/host/studio.d.ts.map +1 -1
- package/dist/serve/worker/host/studio.js +2 -0
- package/dist/serve/worker/host/studio.js.map +1 -1
- package/dist/serve/worker/host/subscriptions.d.ts.map +1 -1
- package/dist/serve/worker/host/subscriptions.js +3 -3
- package/dist/serve/worker/host/subscriptions.js.map +1 -1
- package/dist/serve/worker/host.d.ts +1 -1
- package/dist/serve/worker/host.d.ts.map +1 -1
- package/dist/serve/worker/host.js +1 -1
- package/dist/serve/worker/host.js.map +1 -1
- package/dist/serve/worker/index.d.ts +16 -1
- package/dist/serve/worker/index.d.ts.map +1 -1
- package/dist/serve/worker/index.js +17 -4
- package/dist/serve/worker/index.js.map +1 -1
- package/dist/serve/worker/protocol.d.ts +57 -0
- package/dist/serve/worker/protocol.d.ts.map +1 -1
- package/dist/serve/worker/protocol.js.map +1 -1
- package/dist/serve/worker/rtdb-value-equality.d.ts +3 -0
- package/dist/serve/worker/rtdb-value-equality.d.ts.map +1 -0
- package/dist/serve/worker/rtdb-value-equality.js +18 -0
- package/dist/serve/worker/rtdb-value-equality.js.map +1 -0
- package/dist/serve/worker/serve-init.js +2 -2
- package/dist/serve/worker/serve-init.js.map +1 -1
- package/dist/serve/worker/service-worker-relay.js +2 -2
- package/dist/serve/worker/service-worker-relay.js.map +1 -1
- package/package.json +7 -5
- package/src/assurance/.generated/conformance-verdicts.ts +120 -75
- package/src/bridge/client/dispatch.ts +1 -1
- package/src/cli/serve.ts +215 -307
- package/src/cli/service-command-records/database-rules-generate.ts +3 -0
- package/src/cli/service-command-records/database-rules-lint.ts +3 -0
- package/src/cli/service-command-records/database-rules-simulate.ts +3 -0
- package/src/cli/service-command-records/database-rules-validate.ts +3 -0
- package/src/cli/service-command-records/firestore-indexes-generate.ts +3 -0
- package/src/cli/service-command-records/firestore-rules-lint.ts +3 -0
- package/src/cli/service-command-records/firestore-rules-resolve.ts +3 -0
- package/src/cli/service-command-records/firestore-rules-simulate.ts +3 -0
- package/src/cli/service-command-records/firestore-rules-validate.ts +3 -0
- package/src/cli/service-command-records/storage-rules-lint.ts +3 -0
- package/src/cli/service-command-records/storage-rules-simulate.ts +3 -0
- package/src/cli/service-commands.generated.ts +27 -0
- package/src/cli/service-commands.test.ts +43 -0
- package/src/cli/service-commands.ts +36 -51
- package/src/conformance/.generated/can-i-use-browser.ts +1 -1
- package/src/conformance/.generated/can-i-use.ts +1 -1
- package/src/conformance/.generated/conformance-docs.ts +1 -1
- package/src/functions-rtdb/development-runtime.ts +299 -0
- package/src/serve/bridge-mount.ts +253 -19
- package/src/serve/bundler.ts +8 -34
- package/src/serve/entries/app-client.ts +5 -4
- package/src/serve/entries/auth-helper-core.ts +117 -30
- package/src/serve/entries/auth.ts +8 -4
- package/src/serve/entries/database.ts +180 -57
- package/src/serve/entries/init.ts +30 -20
- package/src/serve/html-injection.ts +65 -0
- package/src/serve/namespace.ts +26 -169
- package/src/serve/runtime/worker-replacement.ts +1 -1
- package/src/serve/sandbox-session.ts +233 -0
- package/src/serve/server.ts +20 -5
- package/src/serve/site-tree.ts +146 -0
- package/src/serve/standalone-assets.ts +9 -26
- package/src/serve/vite-functions-development.ts +201 -0
- package/src/serve/vite-generation-bridge.ts +66 -0
- package/src/serve/vite-generation-functions.ts +78 -0
- package/src/serve/vite-generation-middleware.ts +56 -0
- package/src/serve/vite-generation-rules-watch.ts +37 -0
- package/src/serve/vite-module-swap.ts +119 -0
- package/src/serve/vite-page-runtime.ts +100 -0
- package/src/serve/vite-plugin.ts +78 -883
- package/src/serve/vite-sandbox-generation.ts +255 -0
- package/src/serve/worker/client/disconnect.ts +3 -1
- package/src/serve/worker/client/handles.ts +5 -0
- package/src/serve/worker/client/pagehide.ts +31 -0
- package/src/serve/worker/client/rtdb-admin.ts +74 -0
- package/src/serve/worker/client/rtdb-connection-lifecycle.ts +52 -0
- package/src/serve/worker/client/rtdb-controls.ts +8 -0
- package/src/serve/worker/client/rtdb-listeners.ts +337 -0
- package/src/serve/worker/client/rtdb-reads.ts +12 -0
- package/src/serve/worker/client/rtdb-references.ts +85 -0
- package/src/serve/worker/client/rtdb-snapshots.ts +118 -0
- package/src/serve/worker/client/rtdb-transactions.ts +51 -0
- package/src/serve/worker/client/rtdb-writes.ts +74 -0
- package/src/serve/worker/client.ts +0 -2
- package/src/serve/worker/entry.ts +2 -2
- package/src/serve/worker/host/dispatch.ts +22 -2
- package/src/serve/worker/host/rtdb.ts +243 -2
- package/src/serve/worker/host/studio.ts +2 -0
- package/src/serve/worker/host/subscriptions.ts +8 -4
- package/src/serve/worker/host.ts +1 -1
- package/src/serve/worker/index.ts +58 -10
- package/src/serve/worker/protocol.ts +23 -2
- package/src/serve/worker/rtdb-value-equality.ts +17 -0
- package/src/serve/worker/serve-init.ts +2 -2
- package/src/serve/worker/service-worker-relay.ts +2 -2
- package/dist/serve/docs-ui/_astro/_slug_.DUci-duz.css +0 -1
- package/dist/serve/docs-ui/docs/_rhythm/index.html +0 -100
- package/dist/serve/docs-ui/docs/agent/set-up-your-agent/index.html +0 -43
- package/dist/serve/docs-ui/docs/agent/watch-and-review/index.html +0 -26
- package/dist/serve/docs-ui/docs/agent/work-with-an-agent/index.html +0 -70
- package/dist/serve/docs-ui/docs/api-reference/index.html +0 -68
- package/dist/serve/docs-ui/docs/build/ai-logic/index.html +0 -64
- package/dist/serve/docs-ui/docs/build/authentication/index.html +0 -66
- package/dist/serve/docs-ui/docs/build/cloud-firestore/index.html +0 -70
- package/dist/serve/docs-ui/docs/build/cloud-messaging/index.html +0 -71
- package/dist/serve/docs-ui/docs/build/cloud-storage/index.html +0 -66
- package/dist/serve/docs-ui/docs/build/realtime-database/index.html +0 -67
- package/dist/serve/docs-ui/docs/conformance-scores/index.html +0 -50
- package/dist/serve/docs-ui/docs/create-pyric-reference-api/index.html +0 -531
- package/dist/serve/docs-ui/docs/functions-rtdb-compat/index.html +0 -73
- package/dist/serve/docs-ui/docs/get-started/how-the-swap-works/index.html +0 -29
- package/dist/serve/docs-ui/docs/get-started/start-building/index.html +0 -33
- package/dist/serve/docs-ui/docs/messaging-compat/index.html +0 -265
- package/dist/serve/docs-ui/docs/observe/resolve-runtime-status/index.html +0 -28
- package/dist/serve/docs-ui/docs/observe/see-whats-happening/index.html +0 -74
- package/dist/serve/docs-ui/docs/observe/shape-your-data/index.html +0 -45
- package/dist/serve/docs-ui/docs/overview/index.html +0 -17
- package/dist/serve/docs-ui/docs/pyric-admin-app-reference-api/index.html +0 -186
- package/dist/serve/docs-ui/docs/pyric-admin-storage-reference-api/index.html +0 -318
- package/dist/serve/docs-ui/docs/pyric-ai-scripting-reference-api/index.html +0 -160
- package/dist/serve/docs-ui/docs/pyric-app-reference-api/index.html +0 -425
- package/dist/serve/docs-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +0 -60
- package/dist/serve/docs-ui/docs/pyric-cli-bridge-reference-api/index.html +0 -507
- package/dist/serve/docs-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +0 -258
- package/dist/serve/docs-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +0 -51
- package/dist/serve/docs-ui/docs/pyric-cli-conformance-reference-api/index.html +0 -308
- package/dist/serve/docs-ui/docs/pyric-cli-credentials-node-reference-api/index.html +0 -68
- package/dist/serve/docs-ui/docs/pyric-cli-register-reference-api/index.html +0 -11
- package/dist/serve/docs-ui/docs/pyric-cli-vite-reference-api/index.html +0 -126
- package/dist/serve/docs-ui/docs/pyric-database-reference-api/index.html +0 -1852
- package/dist/serve/docs-ui/docs/pyric-messaging-reference-api/index.html +0 -509
- package/dist/serve/docs-ui/docs/pyric-messaging-sw-reference-api/index.html +0 -182
- package/dist/serve/docs-ui/docs/pyric-sandbox-database-reference-api/index.html +0 -121
- package/dist/serve/docs-ui/docs/pyric-sandbox-firestore-reference-api/index.html +0 -203
- package/dist/serve/docs-ui/docs/pyric-ui-agents-reference-api/index.html +0 -639
- package/dist/serve/docs-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +0 -100
- package/dist/serve/docs-ui/docs/pyric-ui-events-hooks-reference-api/index.html +0 -24
- package/dist/serve/docs-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +0 -136
- package/dist/serve/docs-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +0 -16
- package/dist/serve/docs-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +0 -176
- package/dist/serve/docs-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +0 -188
- package/dist/serve/docs-ui/docs/secure/audit-your-rules/index.html +0 -51
- package/dist/serve/docs-ui/docs/secure/firestore-rules-limits/index.html +0 -106
- package/dist/serve/docs-ui/docs/secure/read-a-denial/index.html +0 -41
- package/dist/serve/docs-ui/docs/secure/rtdb-rules-in-typescript/index.html +0 -67
- package/dist/serve/docs-ui/docs/secure/rules-standard-library/index.html +0 -159
- package/dist/serve/docs-ui/docs/secure/secure-it-with-rules/index.html +0 -47
- package/dist/serve/docs-ui/docs/secure/simulate-and-lint/index.html +0 -95
- package/dist/serve/docs-ui/docs/secure/write-a-rules-test-suite/index.html +0 -82
- package/dist/serve/docs-ui/docs/ship/ship-to-production/index.html +0 -37
- package/dist/serve/docs-ui/docs/ship/test-in-node/index.html +0 -75
- package/dist/serve/docs-ui/docs/trust/how-we-know-it-matches-firebase/index.html +0 -132
- package/dist/serve/docs-ui/docs/trust/versioning-and-compatibility/index.html +0 -14
- package/dist/serve/docs-ui/index.html +0 -1
- package/dist/serve/studio-ui/assets/RulesCodeEditor-BDlH-5lp.js +0 -23
- package/dist/serve/studio-ui/assets/index-Bf9SSE8L.js +0 -1218
- package/dist/serve/studio-ui/assets/index-BlSGru_r.css +0 -1
- package/dist/serve/studio-ui/assets/seed-D_UjxfOU.js +0 -20
- package/dist/serve/studio-ui/index.html +0 -32
- package/dist/serve/worker/client/rtdb.d.ts +0 -36
- package/dist/serve/worker/client/rtdb.d.ts.map +0 -1
- package/dist/serve/worker/client/rtdb.js +0 -241
- package/dist/serve/worker/client/rtdb.js.map +0 -1
- package/src/serve/worker/client/rtdb.ts +0 -311
- /package/dist/serve/{docs-ui → site-ui}/404.html +0 -0
- /package/dist/serve/{docs-ui → site-ui}/_astro/_slug_.CXh9yTP1.css +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/_rhythm.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/agent/set-up-your-agent.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/agent/watch-and-review.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/agent/work-with-an-agent.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/ai-compat.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/api-reference.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/app-compat.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/auth-compat.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/build/ai-logic.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/build/authentication.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/build/cloud-firestore.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/build/cloud-messaging.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/build/realtime-database.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/create-pyric-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/functions-rtdb-compat.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/get-started/how-the-swap-works.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/get-started/start-building.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/index.html +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/observe/resolve-runtime-status.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/observe/see-whats-happening.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/observe/shape-your-data.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/overview.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-app-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-auth-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-database-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-messaging-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-storage-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ai-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ai-scripting-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-app-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-assurance-browser-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-assurance-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-bridge-client-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-bridge-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-conformance-browser-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-conformance-docs-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-conformance-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-credentials-node-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-discover-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-register-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-remote-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-verify-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-messaging-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-messaging-sw-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-sandbox-database-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-sandbox-firestore-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-agents-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-auth-hooks-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-auth-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-events-hooks-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-events-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-firestore-hooks-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-primitives-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-rtdb-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-rules-hooks-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-rules-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-storage-hooks-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-traffic-hooks-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-traffic-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/secure/audit-your-rules.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/secure/firestore-rules-limits.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/secure/read-a-denial.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/secure/rtdb-rules-in-typescript.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/secure/secure-it-with-rules.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/secure/simulate-and-lint.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/secure/write-a-rules-test-suite.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/ship/ship-to-production.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/ship/test-in-node.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/trust/how-we-know-it-matches-firebase.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/trust/versioning-and-compatibility.md +0 -0
- /package/dist/serve/{studio-ui → site-ui}/pyric-logo.svg +0 -0
package/dist/cli/serve.js
CHANGED
|
@@ -10,24 +10,21 @@
|
|
|
10
10
|
* rules load (fail fast on broken rules) → SDK bundle (cached per pyric
|
|
11
11
|
* version) → static server with the `/__pyric/` namespace + HTML injection.
|
|
12
12
|
*/
|
|
13
|
-
import {
|
|
14
|
-
import { existsSync,
|
|
13
|
+
import { join, relative, resolve } from 'node:path';
|
|
14
|
+
import { existsSync, readdirSync, readFileSync, statSync, watch as watchFile } from 'node:fs';
|
|
15
15
|
import { readFirebaseJson, readFirebaseRc } from './firebase-json.js';
|
|
16
|
-
import { bundleSdk, bundleWorker, defaultSdkEntries,
|
|
17
|
-
import { isStandalone,
|
|
18
|
-
import { loadProjectDatabaseRules, loadProjectRules, loadProjectStorageRules, watchProjectRules } from '../serve/rules.js';
|
|
16
|
+
import { bundleSdk, bundleWorker, defaultSdkEntries, resolveSiteUiDir } from '../serve/bundler.js';
|
|
17
|
+
import { isStandalone, materializeServeAssets, materializeSiteUi, embeddedWorkerVersion, } from '../serve/standalone-assets.js';
|
|
19
18
|
import { hasSandboxBuildMarker } from '../serve/sandbox-marker.js';
|
|
20
|
-
import {
|
|
19
|
+
import { injectServeTags } from '../serve/html-injection.js';
|
|
21
20
|
import { formatActivityWarning } from '../serve/activity-warning.js';
|
|
22
|
-
import { createStateStore, STATE_FILE_VERSION } from '../serve/state-store.js';
|
|
23
|
-
import { diskProjectStore, diskWorkspace } from '../serve/studio/index.js';
|
|
24
|
-
import { createCaptureStore } from '../serve/capture-store.js';
|
|
25
21
|
import { consoleServeLogger, startStaticServer, stderrServeLogger } from '../serve/server.js';
|
|
26
22
|
import { createBridgeMount } from '../serve/bridge-mount.js';
|
|
27
23
|
import { openBrowser, shouldAutoOpen } from '../serve/open-browser.js';
|
|
28
|
-
import { buildChildEnv,
|
|
29
|
-
import {
|
|
24
|
+
import { buildChildEnv, detectPackageManager, readDevScript, registerModuleUrl, resolveDevChild, spawnDevChild, waitForSandboxPeer, } from './dev-runner.js';
|
|
25
|
+
import { createFunctionsDevelopmentRuntime, createHttpFunctionsPeerReadiness, } from '../functions-rtdb/development-runtime.js';
|
|
30
26
|
import { discoverFunctionsRtdbProject, } from '../functions-rtdb/project.js';
|
|
27
|
+
import { createSandboxSession, SandboxSeedError, } from '../serve/sandbox-session.js';
|
|
31
28
|
/** Extract the single hosting config `pyric dev` v1 supports. Arrays
|
|
32
29
|
* (multi-site) take the first entry with a warning — multi-site is out of
|
|
33
30
|
* scope (plan section 6). */
|
|
@@ -122,99 +119,6 @@ export async function startServe(opts) {
|
|
|
122
119
|
`A plain \`vite build\` is your production build — deploy it, don't sandbox it.`);
|
|
123
120
|
}
|
|
124
121
|
}
|
|
125
|
-
// Rules: fail fast on broken rules; serve rule-less only when genuinely absent.
|
|
126
|
-
// Held in a mutable box — the watcher swaps it and the payload producer
|
|
127
|
-
// always serves the live version.
|
|
128
|
-
const loaded = await loadProjectRules(opts.cwd, config);
|
|
129
|
-
const loadedDatabase = await loadProjectDatabaseRules(opts.cwd, config);
|
|
130
|
-
// Storage rules deploy ONCE at boot — see the `storageRules` doc on
|
|
131
|
-
// `InitPayload`: `pyric/storage` only honors rules on the FIRST storage
|
|
132
|
-
// call per Sandbox, so unlike firestore/database rules there is no live
|
|
133
|
-
// "live" box to swap here; a storage.rules edit needs a restart.
|
|
134
|
-
const loadedStorage = await loadProjectStorageRules(opts.cwd, config);
|
|
135
|
-
const live = {
|
|
136
|
-
rules: loaded.rules,
|
|
137
|
-
rulesHash: loaded.rulesHash,
|
|
138
|
-
databaseRules: loadedDatabase.rules,
|
|
139
|
-
databaseRulesHash: loadedDatabase.rulesHash,
|
|
140
|
-
databaseUrl: loadedDatabase.databaseUrl,
|
|
141
|
-
};
|
|
142
|
-
// --capture (default on): the capture store writes .pyric/last-session.json
|
|
143
|
-
// whenever the page pushes its session fixture via POST /__pyric/capture.
|
|
144
|
-
// pyric verify (no-arg) reads that file. Independent of --persist — capture
|
|
145
|
-
// records for the verify loop, persist is for cross-reload durability.
|
|
146
|
-
const capture = (opts.capture ?? true) ? createCaptureStore(opts.cwd) : null;
|
|
147
|
-
// --persist: the state store IS the durable sandbox (section 3c). Load eagerly so
|
|
148
|
-
// a corrupt/mismatched file fails the start (inspect-or-delete message)
|
|
149
|
-
// instead of silently serving ephemeral.
|
|
150
|
-
const state = opts.persist ? createStateStore(opts.cwd) : null;
|
|
151
|
-
// --fresh: the escape hatch from "state wins after the first run" — drop
|
|
152
|
-
// the existing state (+ its backup) so this run re-seeds from scratch.
|
|
153
|
-
if (state && opts.fresh) {
|
|
154
|
-
for (const p of [state.path, state.backupPath])
|
|
155
|
-
if (existsSync(p))
|
|
156
|
-
rmSync(p);
|
|
157
|
-
logger.note(' ⓘ --fresh: discarded the existing state file; re-seeding');
|
|
158
|
-
// Half-reset warning: --fresh only deletes the SERVER file. The worker's
|
|
159
|
-
// durable store is browser IndexedDB, and prime-once only fills an EMPTY
|
|
160
|
-
// IDB (createWorkerDurableBackend) — a browser that already holds sandbox
|
|
161
|
-
// data KEEPS it and its next flush repopulates the supposedly-fresh file.
|
|
162
|
-
// The reset handshake (making --fresh actually clear the browser store) is
|
|
163
|
-
// future work; until then, say so loudly rather than let the file quietly
|
|
164
|
-
// refill.
|
|
165
|
-
logger.note(' ⚠ --fresh only resets the server-side state file — a browser tab that already has ' +
|
|
166
|
-
'sandbox data in IndexedDB keeps it and will write it straight back on its next flush. ' +
|
|
167
|
-
'For a full reset, also clear the browser store: Studio → Settings → Reset, or open an ' +
|
|
168
|
-
'incognito/private window.');
|
|
169
|
-
}
|
|
170
|
-
let persistedEnvelope = state?.load() ?? null;
|
|
171
|
-
// --seed accepts BOTH shapes: a bare path→fields map, or a PyricStateFile
|
|
172
|
-
// envelope (detected by its `version` key — what `pyric snapshot` emits).
|
|
173
|
-
let seed = null;
|
|
174
|
-
/** Ephemeral fixture restore: the controller blob from a state-file seed,
|
|
175
|
-
* restored in-page through the persistence deserializer (wrapper
|
|
176
|
-
* re-hydration) via a read-only backend. */
|
|
177
|
-
let seedState = null;
|
|
178
|
-
let seedUsers = null;
|
|
179
|
-
let seedLabel = '';
|
|
180
|
-
if (opts.seed) {
|
|
181
|
-
const seedPath = resolve(opts.cwd, opts.seed);
|
|
182
|
-
let parsed;
|
|
183
|
-
try {
|
|
184
|
-
parsed = JSON.parse(readFileSync(seedPath, 'utf8'));
|
|
185
|
-
}
|
|
186
|
-
catch (e) {
|
|
187
|
-
throw new Error(`pyric dev: failed to read --seed ${seedPath}: ${e instanceof Error ? e.message : String(e)}`);
|
|
188
|
-
}
|
|
189
|
-
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
190
|
-
throw new Error(`pyric dev: --seed must be a JSON object of "collection/doc" → fields, got ${Array.isArray(parsed) ? 'array' : typeof parsed}`);
|
|
191
|
-
}
|
|
192
|
-
const obj = parsed;
|
|
193
|
-
if (obj.version === STATE_FILE_VERSION && ('firestore' in obj || 'auth' in obj)) {
|
|
194
|
-
const fixture = obj;
|
|
195
|
-
const docCount = Object.keys((fixture.firestore?.firestore) ?? {}).length;
|
|
196
|
-
const userCount = fixture.auth?.users?.length ?? 0;
|
|
197
|
-
seedLabel = `${docCount} doc(s) + ${userCount} user(s) from state fixture`;
|
|
198
|
-
if (state && !state.exists()) {
|
|
199
|
-
// Persist first run seeded from a fixture: prime the store, then the
|
|
200
|
-
// normal persist path restores it like any lived state.
|
|
201
|
-
if (fixture.firestore != null)
|
|
202
|
-
state.writeSection('firestore', fixture.firestore);
|
|
203
|
-
if (fixture.auth != null)
|
|
204
|
-
state.writeSection('auth', fixture.auth);
|
|
205
|
-
persistedEnvelope = state.load();
|
|
206
|
-
}
|
|
207
|
-
else if (!state) {
|
|
208
|
-
seedState = fixture.firestore ?? null;
|
|
209
|
-
seedUsers = fixture.auth?.users ?? null;
|
|
210
|
-
}
|
|
211
|
-
// persist + existing state: the lived state wins; the fixture is inert.
|
|
212
|
-
}
|
|
213
|
-
else {
|
|
214
|
-
seed = parsed;
|
|
215
|
-
seedLabel = `${Object.keys(seed).length} document(s)`;
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
122
|
// SDK bundles (cached per pyric version + entry hash). In a standalone
|
|
219
123
|
// binary the runtime esbuild bundler is unavailable, so the deterministic
|
|
220
124
|
// bundles were built at compile time and embedded; materialize them to a
|
|
@@ -259,78 +163,53 @@ export async function startServe(opts) {
|
|
|
259
163
|
: null;
|
|
260
164
|
// bridgeUrl needs the BOUND port; resolved after listen via this box.
|
|
261
165
|
const origin = { host: opts.host ?? 'localhost', port: 0 };
|
|
262
|
-
|
|
263
|
-
rules: live.rules,
|
|
264
|
-
rulesHash: live.rulesHash,
|
|
265
|
-
databaseRules: live.databaseRules,
|
|
266
|
-
databaseRulesHash: live.databaseRulesHash,
|
|
267
|
-
databaseUrl: live.databaseUrl,
|
|
268
|
-
storageRules: loadedStorage.rules,
|
|
269
|
-
storageRulesHash: loadedStorage.rulesHash,
|
|
270
|
-
// Project identity: scopes the storage IDB name per served project
|
|
271
|
-
// (issue #359). Local-only — a dev path never leaves the machine.
|
|
272
|
-
projectKey: opts.cwd,
|
|
273
|
-
bridgeUrl: mount && origin.port > 0 ? mount.wsUrl(origin) : null,
|
|
274
|
-
// Precedence: once a state file exists, the lived state is the truth —
|
|
275
|
-
// --seed applies only on the first (state-less) run.
|
|
276
|
-
seed: state?.exists() ? null : seed,
|
|
277
|
-
seedState,
|
|
278
|
-
persist: Boolean(state),
|
|
279
|
-
capture: Boolean(capture),
|
|
280
|
-
authUsers: state
|
|
281
|
-
? (state.readSection('auth')?.users ?? null)
|
|
282
|
-
: seedUsers,
|
|
283
|
-
// Served firebase/messaging is part of the canonical swap, so the worker
|
|
284
|
-
// broker must be available whenever the SDK entries are served.
|
|
285
|
-
messaging: true,
|
|
286
|
-
});
|
|
287
|
-
const events = createEventHub();
|
|
288
|
-
// --ui (Pyric Studio): serve the disk-backed workspace + project routes.
|
|
289
|
-
// Single-project mode: the served `cwd` IS the one project's file tree; the
|
|
290
|
-
// project store roots at `.pyric/projects` (multi-project ready) but the
|
|
291
|
-
// current served tree is also reachable directly via /__pyric/workspace.
|
|
292
|
-
const studio = opts.ui
|
|
293
|
-
? {
|
|
294
|
-
workspace: diskWorkspace(opts.cwd),
|
|
295
|
-
projects: diskProjectStore(join(opts.cwd, '.pyric', 'projects')),
|
|
296
|
-
}
|
|
297
|
-
: undefined;
|
|
298
|
-
// --ui also serves the BUILT Studio app under /__pyric/ui/. The dir is
|
|
166
|
+
// --ui also serves the unified Astro site under /__pyric/ui/. The dir is
|
|
299
167
|
// resolved by file path (never imported), so a missing build is a clear
|
|
300
168
|
// warning rather than a crash; the data routes still mount.
|
|
301
|
-
let
|
|
302
|
-
let docsUiDir;
|
|
169
|
+
let siteUiDir;
|
|
303
170
|
if (opts.ui) {
|
|
304
|
-
|
|
305
|
-
const dir = isStandalone() ? await materializeStudioUi() : resolveStudioUiDir();
|
|
306
|
-
const docsDir = isStandalone() ? await materializeDocsUi() : resolveDocsUiDir();
|
|
171
|
+
const dir = isStandalone() ? await materializeSiteUi() : resolveSiteUiDir();
|
|
307
172
|
if (dir) {
|
|
308
|
-
|
|
173
|
+
siteUiDir = dir;
|
|
309
174
|
}
|
|
310
175
|
else {
|
|
311
|
-
logger.note(' ⚠ --ui: built
|
|
176
|
+
logger.note(' ⚠ --ui: built Astro site not found (run the full build first). ' +
|
|
312
177
|
'The data routes are mounted, but /__pyric/ui/ will 404.');
|
|
313
178
|
}
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
179
|
+
}
|
|
180
|
+
let session;
|
|
181
|
+
try {
|
|
182
|
+
session = await createSandboxSession({
|
|
183
|
+
projectDir: opts.cwd,
|
|
184
|
+
firebaseConfig: config,
|
|
185
|
+
sdk: { dir: bundle.outDir, workerVersion },
|
|
186
|
+
seedFile: opts.seed,
|
|
187
|
+
persistence: opts.persist ? { fresh: opts.fresh } : undefined,
|
|
188
|
+
capture: opts.capture,
|
|
189
|
+
studio: opts.ui ? { siteUiDir } : false,
|
|
190
|
+
bridgeUrl: () => mount && origin.port > 0 ? mount.wsUrl(origin) : null,
|
|
191
|
+
activity: (incident) => logger.note(formatActivityWarning(incident)),
|
|
192
|
+
logger,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
bundle.dispose?.();
|
|
197
|
+
if (error instanceof SandboxSeedError) {
|
|
198
|
+
if (error.kind === 'read') {
|
|
199
|
+
throw new Error(`pyric dev: failed to read --seed ${error.path}: ${error.detail}`);
|
|
200
|
+
}
|
|
201
|
+
throw new Error(`pyric dev: --seed must be a JSON object of "collection/doc" → fields, ${error.detail}`);
|
|
320
202
|
}
|
|
203
|
+
throw error;
|
|
321
204
|
}
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
studioUiDir,
|
|
331
|
-
docsUiDir,
|
|
332
|
-
logger,
|
|
333
|
-
});
|
|
205
|
+
if (opts.persist && opts.fresh) {
|
|
206
|
+
logger.note(' ⓘ --fresh: discarded the existing state file; re-seeding');
|
|
207
|
+
logger.note(' ⚠ --fresh only resets the server-side state file — a browser tab that already has ' +
|
|
208
|
+
'sandbox data in IndexedDB keeps it and will write it straight back on its next flush. ' +
|
|
209
|
+
'For a full reset, also clear the browser store: Studio → Settings → Reset, or open an ' +
|
|
210
|
+
'incognito/private window.');
|
|
211
|
+
}
|
|
212
|
+
const payload = session.payload;
|
|
334
213
|
let handle;
|
|
335
214
|
try {
|
|
336
215
|
handle = await startStaticServer({
|
|
@@ -339,8 +218,8 @@ export async function startServe(opts) {
|
|
|
339
218
|
host: opts.host ?? 'localhost',
|
|
340
219
|
spaRewrite: wantsSpaRewrite(hosting),
|
|
341
220
|
namespaceHandler: mount
|
|
342
|
-
? async (req, res, url) => (await mount.handler(req, res, url)) ||
|
|
343
|
-
:
|
|
221
|
+
? async (req, res, url) => (await mount.handler(req, res, url)) || session.handle(req, res, url)
|
|
222
|
+
: session.handle,
|
|
344
223
|
// Never force in-page: serve always serves the worker, and the bridge peer
|
|
345
224
|
// routes agent tool-calls THROUGH the worker (see connectBridgePeer), so app
|
|
346
225
|
// + Studio + agent share the one sandbox even under --bridge.
|
|
@@ -350,44 +229,90 @@ export async function startServe(opts) {
|
|
|
350
229
|
});
|
|
351
230
|
}
|
|
352
231
|
catch (error) {
|
|
232
|
+
await mount?.close();
|
|
233
|
+
await session.close();
|
|
353
234
|
bundle.dispose?.();
|
|
354
235
|
throw error;
|
|
355
236
|
}
|
|
356
|
-
if (bundle.dispose)
|
|
357
|
-
handle.server.once('close', bundle.dispose);
|
|
358
237
|
origin.port = handle.port;
|
|
359
|
-
//
|
|
360
|
-
//
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
const pointer = join(opts.cwd, '.pyric', 'serve.json');
|
|
371
|
-
try {
|
|
372
|
-
mkdirSync(dirname(pointer), { recursive: true });
|
|
373
|
-
writeFileSync(pointer, JSON.stringify({ url: handle.url, mcpUrl: mount.mcpUrl(origin), port: handle.port, pid: process.pid, instanceId: mount.instanceId, project: opts.project ?? 'sandbox' }, null, 2) + '\n');
|
|
374
|
-
handle.server.once('close', () => { try {
|
|
375
|
-
rmSync(pointer);
|
|
376
|
-
}
|
|
377
|
-
catch { /* gone already */ } });
|
|
378
|
-
}
|
|
379
|
-
catch { /* best-effort: discovery falls back to a port scan */ }
|
|
238
|
+
// The bridge attachment owns upgrades on every bound family plus discovery.
|
|
239
|
+
// Its explicit close handle is also folded into stop() below, before the
|
|
240
|
+
// sandbox session is released.
|
|
241
|
+
let bridgeAttachment;
|
|
242
|
+
try {
|
|
243
|
+
bridgeAttachment = mount?.attachHost({
|
|
244
|
+
servers: handle.servers,
|
|
245
|
+
lifecycleServer: handle.server,
|
|
246
|
+
projectDir: opts.cwd,
|
|
247
|
+
origin: () => origin.port > 0 ? origin : null,
|
|
248
|
+
});
|
|
380
249
|
}
|
|
381
|
-
|
|
382
|
-
|
|
250
|
+
catch (error) {
|
|
251
|
+
await mount?.close();
|
|
252
|
+
await session.close();
|
|
253
|
+
await handle.stop().catch(() => undefined);
|
|
254
|
+
bundle.dispose?.();
|
|
255
|
+
throw error;
|
|
256
|
+
}
|
|
257
|
+
const stopServer = handle.stop.bind(handle);
|
|
258
|
+
let closeResources = null;
|
|
259
|
+
const closeOwnedResources = () => {
|
|
260
|
+
closeResources ??= (async () => {
|
|
261
|
+
await bridgeAttachment?.close();
|
|
262
|
+
await mount?.close();
|
|
263
|
+
await session.close();
|
|
264
|
+
})();
|
|
265
|
+
return closeResources;
|
|
266
|
+
};
|
|
267
|
+
handle = {
|
|
268
|
+
...handle,
|
|
269
|
+
async stop() {
|
|
270
|
+
// Initiate listener shutdown before terminating upgraded sockets. Bun's
|
|
271
|
+
// node:http compatibility layer can strand close callbacks when an
|
|
272
|
+
// upgraded socket is destroyed first. Resource teardown remains ordered
|
|
273
|
+
// bridge → sandbox, and the server close is awaited last.
|
|
274
|
+
const serverStop = stopServer();
|
|
275
|
+
try {
|
|
276
|
+
await closeOwnedResources();
|
|
277
|
+
}
|
|
278
|
+
finally {
|
|
279
|
+
await serverStop;
|
|
280
|
+
}
|
|
281
|
+
},
|
|
282
|
+
};
|
|
283
|
+
if (bundle.dispose)
|
|
284
|
+
handle.server.once('close', bundle.dispose);
|
|
285
|
+
handle.server.once('close', () => void closeOwnedResources());
|
|
286
|
+
const uiUrl = siteUiDir ? `${handle.url}/__pyric/ui/` : null;
|
|
287
|
+
const docsUrl = siteUiDir ? `${handle.url}/__pyric/ui/docs/` : null;
|
|
288
|
+
// Hot-reload: the static adapter observes the filesystem; the session owns
|
|
289
|
+
// read/prepare/last-good replacement and event broadcast.
|
|
290
|
+
const rulesSourcePath = session.summary.rules.firestore.sourcePath;
|
|
291
|
+
const watching = (opts.watch ?? true) && rulesSourcePath !== null;
|
|
383
292
|
if (watching) {
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
293
|
+
let debounce = null;
|
|
294
|
+
const watcher = watchFile(rulesSourcePath, () => {
|
|
295
|
+
if (debounce)
|
|
296
|
+
clearTimeout(debounce);
|
|
297
|
+
debounce = setTimeout(() => {
|
|
298
|
+
void session.reloadFirestoreRules().then((result) => {
|
|
299
|
+
if (result.kind === 'reloaded') {
|
|
300
|
+
logger.note(` ↻ rules reloaded (hash ${result.rulesHash}) → ${result.clients} page(s)`);
|
|
301
|
+
}
|
|
302
|
+
else if (result.kind === 'rejected') {
|
|
303
|
+
logger.note(` ⚠ rules NOT reloaded (last-good stays live): ${result.error.message}`);
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
}, 150);
|
|
307
|
+
});
|
|
308
|
+
watcher.on('error', (error) => {
|
|
309
|
+
logger.note(` ⚠ rules watcher failed (hot reload off): ${error instanceof Error ? error.message : String(error)}`);
|
|
310
|
+
});
|
|
311
|
+
handle.server.once('close', () => {
|
|
312
|
+
if (debounce)
|
|
313
|
+
clearTimeout(debounce);
|
|
314
|
+
watcher.close();
|
|
315
|
+
});
|
|
391
316
|
}
|
|
392
317
|
logger.info(`=== Serving from '${opts.cwd}'...`);
|
|
393
318
|
logger.info('');
|
|
@@ -398,14 +323,14 @@ export async function startServe(opts) {
|
|
|
398
323
|
: bundle.cached
|
|
399
324
|
? `✔ sandbox pyric SDK bundles ready (cache)`
|
|
400
325
|
: `✔ sandbox pyric SDK bundles built in ${bundleMs}ms`);
|
|
401
|
-
logger.info(
|
|
402
|
-
? `✔ rules ${
|
|
326
|
+
logger.info(session.payload().rules
|
|
327
|
+
? `✔ rules ${session.summary.rules.firestore.sourcePath} → deployed to the in-page sandbox (hash ${session.summary.rules.firestore.hash})`
|
|
403
328
|
: `• rules no firestore.rules — sandbox runs with default rules`);
|
|
404
|
-
logger.info(
|
|
405
|
-
? `✔ rules ${
|
|
329
|
+
logger.info(session.payload().databaseRules
|
|
330
|
+
? `✔ rules ${session.summary.rules.database.sourcePath} → deployed to the RTDB sandbox (hash ${session.summary.rules.database.hash})`
|
|
406
331
|
: `• rules no database.rules — RTDB sandbox runs with default rules`);
|
|
407
|
-
logger.info(
|
|
408
|
-
? `✔ rules ${
|
|
332
|
+
logger.info(session.payload().storageRules
|
|
333
|
+
? `✔ rules ${session.summary.rules.storage.sourcePath} → deployed to the storage sandbox (hash ${session.summary.rules.storage.hash}; ` +
|
|
409
334
|
`edits require a restart — storage rules do not hot-reload)`
|
|
410
335
|
: `• rules no storage.rules — storage sandbox runs open (no rules configured)`);
|
|
411
336
|
if (uiUrl) {
|
|
@@ -418,17 +343,16 @@ export async function startServe(opts) {
|
|
|
418
343
|
logger.info(`✔ bridge MCP endpoint: ${mount.mcpUrl(origin)} (sandbox peers over ws at /__pyric/sandbox)`);
|
|
419
344
|
}
|
|
420
345
|
let persistSummary = null;
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
const users = persistedEnvelope?.auth?.users?.length ?? 0;
|
|
346
|
+
const persistence = session.summary.persistence;
|
|
347
|
+
if (persistence) {
|
|
348
|
+
const fsDocs = persistence.restoredDocs;
|
|
349
|
+
const users = persistence.restoredUsers;
|
|
426
350
|
persistSummary = { restoredDocs: fsDocs, restoredUsers: users };
|
|
427
|
-
logger.info(
|
|
428
|
-
? `✔ persist ${
|
|
429
|
-
: `✔ persist new state file at ${
|
|
430
|
-
if (existsSync(
|
|
431
|
-
logger.note(` ⓘ a recovery backup exists at ${
|
|
351
|
+
logger.info(persistence.restored
|
|
352
|
+
? `✔ persist ${persistence.path} (${fsDocs} doc(s), ${users} user(s) restored; --seed skipped)`
|
|
353
|
+
: `✔ persist new state file at ${persistence.path} (first run — seed applies)`);
|
|
354
|
+
if (existsSync(persistence.backupPath)) {
|
|
355
|
+
logger.note(` ⓘ a recovery backup exists at ${persistence.backupPath} (prior non-empty state was ` +
|
|
432
356
|
'replaced by an empty one — e.g. a reset). Restore: mv it back over state.json.');
|
|
433
357
|
}
|
|
434
358
|
}
|
|
@@ -442,14 +366,14 @@ export async function startServe(opts) {
|
|
|
442
366
|
// (A fixture that primed the persist store is reported by the persist
|
|
443
367
|
// line; a fixture ignored because lived state exists is intentionally
|
|
444
368
|
// silent about staging.)
|
|
445
|
-
if (
|
|
446
|
-
logger.info(`✔ seed ${seedLabel} staged for page init`);
|
|
369
|
+
if (session.summary.seedStaged) {
|
|
370
|
+
logger.info(`✔ seed ${session.summary.seedLabel} staged for page init`);
|
|
447
371
|
}
|
|
448
|
-
if (
|
|
449
|
-
logger.info(`✔ capture session → ${
|
|
372
|
+
if (session.summary.capturePath) {
|
|
373
|
+
logger.info(`✔ capture session → ${session.summary.capturePath} (run \`pyric verify\` to replay it)`);
|
|
450
374
|
}
|
|
451
375
|
if (watching)
|
|
452
|
-
logger.info(`✔ watch hot-reloading ${
|
|
376
|
+
logger.info(`✔ watch hot-reloading ${rulesSourcePath} over /__pyric/events`);
|
|
453
377
|
// Browser-honesty: the sandbox is browser-resident — firestore/auth and
|
|
454
378
|
// persistence run IN the served page. With no page open, data ops silently
|
|
455
379
|
// no-op. This warning (paired with auto-open in runServe) is the fix for the
|
|
@@ -610,7 +534,9 @@ export async function runServe(parsed) {
|
|
|
610
534
|
void openBrowser(runtime.uiUrl ?? runtime.handle.url);
|
|
611
535
|
}
|
|
612
536
|
let devChild = null;
|
|
613
|
-
let
|
|
537
|
+
let functionsRuntime = null;
|
|
538
|
+
let resolveFunctionsExit;
|
|
539
|
+
const functionsExited = new Promise((resolve) => { resolveFunctionsExit = resolve; });
|
|
614
540
|
let resolveSignal;
|
|
615
541
|
const signal = new Promise((resolve) => {
|
|
616
542
|
resolveSignal = resolve;
|
|
@@ -631,7 +557,7 @@ export async function runServe(parsed) {
|
|
|
631
557
|
(json ? process.stderr : process.stdout).write('\nShutting down...\n');
|
|
632
558
|
if (devChild && devChild.child.exitCode === null)
|
|
633
559
|
devChild.signal(await signal);
|
|
634
|
-
await
|
|
560
|
+
await functionsRuntime?.close().catch(() => undefined);
|
|
635
561
|
await runtime.handle.stop().catch(() => undefined);
|
|
636
562
|
removeSignalHandlers();
|
|
637
563
|
return 0;
|
|
@@ -639,68 +565,65 @@ export async function runServe(parsed) {
|
|
|
639
565
|
if (functionsProject && functionsProjectId) {
|
|
640
566
|
const info = json ? process.stderr : process.stdout;
|
|
641
567
|
info.write('• functions waiting for the browser tab to connect the sandbox…\n');
|
|
642
|
-
const
|
|
643
|
-
|
|
568
|
+
const reportFunctionsEvent = (event) => {
|
|
569
|
+
if (event.type === 'output') {
|
|
570
|
+
(event.stream === 'stdout' ? info : process.stderr).write(event.line);
|
|
571
|
+
return;
|
|
572
|
+
}
|
|
573
|
+
if (event.type === 'unexpected-exit') {
|
|
574
|
+
resolveFunctionsExit(event.code);
|
|
575
|
+
return;
|
|
576
|
+
}
|
|
577
|
+
const childEvent = event.event;
|
|
578
|
+
if (childEvent.type === 'execution') {
|
|
579
|
+
const params = Object.entries(childEvent.params)
|
|
580
|
+
.map(([name, value]) => `${name}=${value}`)
|
|
581
|
+
.join(', ');
|
|
582
|
+
const paramsSuffix = params ? ` (${params})` : '';
|
|
583
|
+
if (childEvent.status === 'fulfilled') {
|
|
584
|
+
info.write(`✔ function ${childEvent.exportName} ← /${childEvent.ref}${paramsSuffix}\n`);
|
|
585
|
+
}
|
|
586
|
+
else {
|
|
587
|
+
process.stderr.write(`✖ function ${childEvent.exportName} ← /${childEvent.ref}${paramsSuffix}: ${childEvent.error.message}\n`);
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
else {
|
|
591
|
+
process.stderr.write(`✖ functions delivery for ${childEvent.exportName}: ${childEvent.error.message}\n`);
|
|
592
|
+
}
|
|
593
|
+
};
|
|
594
|
+
functionsRuntime = createFunctionsDevelopmentRuntime({
|
|
595
|
+
sourceDir: functionsProject.sourceDir,
|
|
596
|
+
entry: functionsProject.entry,
|
|
597
|
+
baseEnv: process.env,
|
|
598
|
+
serveUrl: runtime.handle.url,
|
|
599
|
+
registerUrl: registerModuleUrl(),
|
|
600
|
+
instance: `${functionsProjectId}-default-rtdb`,
|
|
601
|
+
location: process.env.PYRIC_FUNCTIONS_RTDB_REGION ?? 'us-central1',
|
|
602
|
+
readiness: createHttpFunctionsPeerReadiness(runtime.handle.url),
|
|
603
|
+
onEvent: reportFunctionsEvent,
|
|
604
|
+
});
|
|
605
|
+
const startOutcome = await waitOrSignal(functionsRuntime.start());
|
|
606
|
+
if ('signal' in startOutcome)
|
|
644
607
|
return stopAfterSignal();
|
|
645
|
-
const
|
|
646
|
-
if (
|
|
608
|
+
const result = startOutcome.value;
|
|
609
|
+
if (result.kind === 'no-peer') {
|
|
647
610
|
process.stderr.write(` ⚠ functions not started — no browser tab connected after 30s. ` +
|
|
648
611
|
`Open ${runtime.handle.url} and restart pyric dev.\n`);
|
|
649
612
|
}
|
|
613
|
+
else if (result.kind === 'failed') {
|
|
614
|
+
process.stderr.write(`${result.error.message}\n`);
|
|
615
|
+
await functionsRuntime.close();
|
|
616
|
+
await runtime.handle.stop();
|
|
617
|
+
removeSignalHandlers();
|
|
618
|
+
return 2;
|
|
619
|
+
}
|
|
650
620
|
else {
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
}),
|
|
658
|
-
instance: `${functionsProjectId}-default-rtdb`,
|
|
659
|
-
location: process.env.PYRIC_FUNCTIONS_RTDB_REGION ?? 'us-central1',
|
|
660
|
-
onEvent(event) {
|
|
661
|
-
if (event.type === 'execution') {
|
|
662
|
-
const params = Object.entries(event.params)
|
|
663
|
-
.map(([name, value]) => `${name}=${value}`)
|
|
664
|
-
.join(', ');
|
|
665
|
-
const paramsSuffix = params ? ` (${params})` : '';
|
|
666
|
-
if (event.status === 'fulfilled') {
|
|
667
|
-
info.write(`✔ function ${event.exportName} ← /${event.ref}${paramsSuffix}\n`);
|
|
668
|
-
}
|
|
669
|
-
else {
|
|
670
|
-
process.stderr.write(`✖ function ${event.exportName} ← /${event.ref}${paramsSuffix}: ${event.error.message}\n`);
|
|
671
|
-
}
|
|
672
|
-
}
|
|
673
|
-
else {
|
|
674
|
-
process.stderr.write(`✖ functions delivery for ${event.exportName}: ${event.error.message}\n`);
|
|
675
|
-
}
|
|
676
|
-
},
|
|
677
|
-
});
|
|
678
|
-
const stdout = createLinePrefixer('[functions] ', (line) => (json ? process.stderr : process.stdout).write(line));
|
|
679
|
-
const stderr = createLinePrefixer('[functions] ', (line) => process.stderr.write(line));
|
|
680
|
-
functionsChild.child.stdout?.setEncoding('utf8');
|
|
681
|
-
functionsChild.child.stderr?.setEncoding('utf8');
|
|
682
|
-
functionsChild.child.stdout?.on('data', (chunk) => stdout.push(chunk));
|
|
683
|
-
functionsChild.child.stderr?.on('data', (chunk) => stderr.push(chunk));
|
|
684
|
-
functionsChild.child.stdout?.once('end', () => stdout.flush());
|
|
685
|
-
functionsChild.child.stderr?.once('end', () => stderr.flush());
|
|
686
|
-
try {
|
|
687
|
-
const readyOutcome = await waitOrSignal(functionsChild.ready);
|
|
688
|
-
if ('signal' in readyOutcome)
|
|
689
|
-
return stopAfterSignal();
|
|
690
|
-
const ready = readyOutcome.value;
|
|
691
|
-
info.write(`✔ functions ${ready.triggerCount} onValueCreated trigger${ready.triggerCount === 1 ? '' : 's'} ` +
|
|
692
|
-
`from ${relative(cwd, functionsProject.entry)}\n`);
|
|
693
|
-
for (const unsupported of ready.unsupportedTriggers) {
|
|
694
|
-
process.stderr.write(` ⚠ functions export ${unsupported.exportName} uses unsupported trigger ` +
|
|
695
|
-
`${unsupported.eventType}; it will not run in pyric dev.\n`);
|
|
696
|
-
}
|
|
697
|
-
}
|
|
698
|
-
catch (error) {
|
|
699
|
-
process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
700
|
-
await functionsChild.stop();
|
|
701
|
-
await runtime.handle.stop();
|
|
702
|
-
removeSignalHandlers();
|
|
703
|
-
return 2;
|
|
621
|
+
const ready = result.ready;
|
|
622
|
+
info.write(`✔ functions ${ready.triggerCount} onValueCreated trigger${ready.triggerCount === 1 ? '' : 's'} ` +
|
|
623
|
+
`from ${relative(cwd, functionsProject.entry)}\n`);
|
|
624
|
+
for (const unsupported of ready.unsupportedTriggers) {
|
|
625
|
+
process.stderr.write(` ⚠ functions export ${unsupported.exportName} uses unsupported trigger ` +
|
|
626
|
+
`${unsupported.eventType}; it will not run in pyric dev.\n`);
|
|
704
627
|
}
|
|
705
628
|
}
|
|
706
629
|
}
|
|
@@ -744,7 +667,7 @@ export async function runServe(parsed) {
|
|
|
744
667
|
return;
|
|
745
668
|
settled = true;
|
|
746
669
|
void (async () => {
|
|
747
|
-
await
|
|
670
|
+
await functionsRuntime?.close().catch(() => undefined);
|
|
748
671
|
if (devChild && devChild.child.exitCode === null) {
|
|
749
672
|
devChild.signal('SIGTERM');
|
|
750
673
|
await devChild.exited.catch(() => undefined);
|
|
@@ -759,7 +682,7 @@ export async function runServe(parsed) {
|
|
|
759
682
|
return;
|
|
760
683
|
shuttingDown = true;
|
|
761
684
|
(json ? process.stderr : process.stdout).write('\nShutting down...\n');
|
|
762
|
-
void
|
|
685
|
+
void functionsRuntime?.close();
|
|
763
686
|
if (devChild && devChild.child.exitCode === null) {
|
|
764
687
|
// Forward the signal; the child's exit (below) closes the host.
|
|
765
688
|
// (The terminal delivers Ctrl-C to the whole group too — the
|
|
@@ -773,8 +696,8 @@ export async function runServe(parsed) {
|
|
|
773
696
|
// Child exits → close the host and propagate its code (Ctrl-C → 0).
|
|
774
697
|
if (devChild)
|
|
775
698
|
void devChild.exited.then((code) => finish(code));
|
|
776
|
-
if (
|
|
777
|
-
void
|
|
699
|
+
if (functionsRuntime) {
|
|
700
|
+
void functionsExited.then((code) => {
|
|
778
701
|
if (!settled && !shuttingDown) {
|
|
779
702
|
process.stderr.write(`pyric dev: Functions child exited unexpectedly (code ${code}).\n`);
|
|
780
703
|
finish(code === 0 ? 1 : code);
|