@pyric/cli 0.1.0-alpha.16 → 0.1.0-alpha.18
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 +42 -12
- package/dist/assurance/.generated/conformance-verdicts.d.ts +80 -72
- package/dist/assurance/.generated/conformance-verdicts.d.ts.map +1 -1
- package/dist/assurance/.generated/conformance-verdicts.js +80 -72
- package/dist/assurance/.generated/conformance-verdicts.js.map +1 -1
- package/dist/bridge/server/bridge.d.ts.map +1 -1
- package/dist/bridge/server/bridge.js +4 -2
- package/dist/bridge/server/bridge.js.map +1 -1
- package/dist/bridge/server/peer.d.ts.map +1 -1
- package/dist/bridge/server/peer.js +1 -0
- package/dist/bridge/server/peer.js.map +1 -1
- package/dist/cli/database-rules.d.ts.map +1 -1
- package/dist/cli/database-rules.js +6 -4
- package/dist/cli/database-rules.js.map +1 -1
- package/dist/cli/dev-runner.d.ts +9 -0
- package/dist/cli/dev-runner.d.ts.map +1 -1
- package/dist/cli/dev-runner.js +18 -0
- package/dist/cli/dev-runner.js.map +1 -1
- package/dist/cli/serve.d.ts.map +1 -1
- package/dist/cli/serve.js +62 -6
- package/dist/cli/serve.js.map +1 -1
- package/dist/cli/verify.js +2 -2
- package/dist/cli/verify.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/child.d.ts +1 -0
- package/dist/functions-rtdb/child.d.ts.map +1 -1
- package/dist/functions-rtdb/child.js +11 -1
- package/dist/functions-rtdb/child.js.map +1 -1
- package/dist/functions-rtdb/development-runtime.d.ts +1 -0
- package/dist/functions-rtdb/development-runtime.d.ts.map +1 -1
- package/dist/functions-rtdb/development-runtime.js +1 -0
- package/dist/functions-rtdb/development-runtime.js.map +1 -1
- package/dist/next/client-aliases.d.ts +11 -0
- package/dist/next/client-aliases.d.ts.map +1 -0
- package/dist/next/client-aliases.js +38 -0
- package/dist/next/client-aliases.js.map +1 -0
- package/dist/next/dev-rewrites.d.ts +9 -0
- package/dist/next/dev-rewrites.d.ts.map +1 -0
- package/dist/next/dev-rewrites.js +53 -0
- package/dist/next/dev-rewrites.js.map +1 -0
- package/dist/next/guard.d.ts +15 -0
- package/dist/next/guard.d.ts.map +1 -0
- package/dist/next/guard.js +52 -0
- package/dist/next/guard.js.map +1 -0
- package/dist/next/index.d.ts +12 -0
- package/dist/next/index.d.ts.map +1 -0
- package/dist/next/index.js +11 -0
- package/dist/next/index.js.map +1 -0
- package/dist/next/runtime-env.d.ts +7 -0
- package/dist/next/runtime-env.d.ts.map +1 -0
- package/dist/next/runtime-env.js +13 -0
- package/dist/next/runtime-env.js.map +1 -0
- package/dist/next/server-external-packages.d.ts +10 -0
- package/dist/next/server-external-packages.d.ts.map +1 -0
- package/dist/next/server-external-packages.js +34 -0
- package/dist/next/server-external-packages.js.map +1 -0
- package/dist/next/target-url.d.ts +11 -0
- package/dist/next/target-url.d.ts.map +1 -0
- package/dist/next/target-url.js +36 -0
- package/dist/next/target-url.js.map +1 -0
- package/dist/next/turbopack-config.d.ts +9 -0
- package/dist/next/turbopack-config.d.ts.map +1 -0
- package/dist/next/turbopack-config.js +39 -0
- package/dist/next/turbopack-config.js.map +1 -0
- package/dist/next/types.d.ts +40 -0
- package/dist/next/types.d.ts.map +1 -0
- package/dist/next/types.js +5 -0
- package/dist/next/types.js.map +1 -0
- package/dist/next/webpack-config.d.ts +11 -0
- package/dist/next/webpack-config.d.ts.map +1 -0
- package/dist/next/webpack-config.js +51 -0
- package/dist/next/webpack-config.js.map +1 -0
- package/dist/next/with-pyric.d.ts +22 -0
- package/dist/next/with-pyric.d.ts.map +1 -0
- package/dist/next/with-pyric.js +49 -0
- package/dist/next/with-pyric.js.map +1 -0
- package/dist/register/app-bridge.d.ts +9 -0
- package/dist/register/app-bridge.d.ts.map +1 -0
- package/dist/register/app-bridge.js +56 -0
- package/dist/register/app-bridge.js.map +1 -0
- package/dist/register/hooks.d.ts.map +1 -1
- package/dist/register/hooks.js +6 -1
- package/dist/register/hooks.js.map +1 -1
- package/dist/register/index.js +1 -1
- package/dist/register/index.js.map +1 -1
- package/dist/register/mapping.d.ts +3 -1
- package/dist/register/mapping.d.ts.map +1 -1
- package/dist/register/mapping.js +41 -5
- package/dist/register/mapping.js.map +1 -1
- package/dist/remote/index.d.ts.map +1 -1
- package/dist/remote/index.js +5 -3
- package/dist/remote/index.js.map +1 -1
- package/dist/rtdb/rules-json.d.ts +12 -0
- package/dist/rtdb/rules-json.d.ts.map +1 -1
- package/dist/rtdb/rules-json.js +98 -0
- package/dist/rtdb/rules-json.js.map +1 -1
- package/dist/serve/bundler.d.ts.map +1 -1
- package/dist/serve/bundler.js +2 -0
- package/dist/serve/bundler.js.map +1 -1
- package/dist/serve/discovery.d.ts +4 -4
- package/dist/serve/discovery.d.ts.map +1 -1
- package/dist/serve/discovery.js +59 -38
- package/dist/serve/discovery.js.map +1 -1
- package/dist/serve/entries/app-ai-passthrough.d.ts +8 -0
- package/dist/serve/entries/app-ai-passthrough.d.ts.map +1 -0
- package/dist/serve/entries/app-ai-passthrough.js +59 -0
- package/dist/serve/entries/app-ai-passthrough.js.map +1 -0
- package/dist/serve/entries/auth-helper-core.js +9 -7
- package/dist/serve/entries/auth-helper-core.js.map +1 -1
- package/dist/serve/entries/auth.d.ts +1 -0
- package/dist/serve/entries/auth.d.ts.map +1 -1
- package/dist/serve/entries/auth.js +1 -0
- package/dist/serve/entries/auth.js.map +1 -1
- package/dist/serve/entries/bridge-url.d.ts.map +1 -1
- package/dist/serve/entries/bridge-url.js +7 -2
- package/dist/serve/entries/bridge-url.js.map +1 -1
- package/dist/serve/entries/database.d.ts +1 -0
- package/dist/serve/entries/database.d.ts.map +1 -1
- package/dist/serve/entries/database.js +1 -0
- package/dist/serve/entries/database.js.map +1 -1
- package/dist/serve/entries/firestore.d.ts +1 -0
- package/dist/serve/entries/firestore.d.ts.map +1 -1
- package/dist/serve/entries/firestore.js +1 -0
- package/dist/serve/entries/firestore.js.map +1 -1
- package/dist/serve/entries/init.d.ts.map +1 -1
- package/dist/serve/entries/init.js +4 -2
- package/dist/serve/entries/init.js.map +1 -1
- package/dist/serve/entries/runtime.js +23 -0
- package/dist/serve/entries/runtime.js.map +1 -1
- package/dist/serve/entries/storage.d.ts +2 -0
- package/dist/serve/entries/storage.d.ts.map +1 -1
- package/dist/serve/entries/storage.js +9 -2
- package/dist/serve/entries/storage.js.map +1 -1
- package/dist/serve/html-injection.d.ts +3 -1
- package/dist/serve/html-injection.d.ts.map +1 -1
- package/dist/serve/html-injection.js +27 -1
- package/dist/serve/html-injection.js.map +1 -1
- package/dist/serve/rules.js +2 -2
- package/dist/serve/rules.js.map +1 -1
- package/dist/serve/runtime/chip-config.d.ts +1 -1
- package/dist/serve/runtime/chip-config.d.ts.map +1 -1
- package/dist/serve/runtime/chip-config.js +16 -8
- package/dist/serve/runtime/chip-config.js.map +1 -1
- package/dist/serve/runtime/chip.d.ts.map +1 -1
- package/dist/serve/runtime/chip.js +24 -3
- package/dist/serve/runtime/chip.js.map +1 -1
- package/dist/serve/runtime/status.d.ts +1 -0
- package/dist/serve/runtime/status.d.ts.map +1 -1
- package/dist/serve/runtime/status.js +71 -13
- package/dist/serve/runtime/status.js.map +1 -1
- package/dist/serve/sandbox-session.d.ts +1 -0
- package/dist/serve/sandbox-session.d.ts.map +1 -1
- package/dist/serve/sandbox-session.js +30 -2
- package/dist/serve/sandbox-session.js.map +1 -1
- package/dist/serve/site-ui/_astro/_slug_.C6QfVOxJ.css +1 -0
- package/dist/serve/site-ui/_astro/_studio_.B6b_G1ev.css +1 -0
- package/dist/serve/site-ui/_astro/app.B7pBzz5N.js +11 -0
- package/dist/serve/site-ui/_astro/app.boex5SnQ.js +1 -0
- package/dist/serve/site-ui/_astro/{chess-showcase.CnoxIle5.js → chess-showcase.DDqE-QGe.js} +1 -1
- package/dist/serve/site-ui/_astro/{example-runtime.R1d96L6-.js → example-runtime.B0byNQOl.js} +1 -1
- package/dist/serve/site-ui/_astro/index.uwPvjH_1.js +1 -0
- package/dist/serve/site-ui/_astro/reads.Dh3z0fJy.js +1 -0
- package/dist/serve/site-ui/_astro/sandbox-controls.C2IqtoSw.js +1252 -0
- package/dist/serve/site-ui/_astro/{seed.EyI3VYEu.js → seed.CCmj00su.js} +1 -1
- package/dist/serve/site-ui/auth/index.html +2 -2
- package/dist/serve/site-ui/docs/_rhythm/index.html +1 -1
- package/dist/serve/site-ui/docs/agent/set-up-your-agent/index.html +48 -13
- package/dist/serve/site-ui/docs/agent/set-up-your-agent.md +74 -11
- package/dist/serve/site-ui/docs/agent/watch-and-review/index.html +1 -1
- package/dist/serve/site-ui/docs/agent/work-with-an-agent/index.html +1 -1
- package/dist/serve/site-ui/docs/ai-compat/index.html +85 -85
- package/dist/serve/site-ui/docs/ai-compat.md +84 -84
- package/dist/serve/site-ui/docs/api-reference/index.html +3 -1
- package/dist/serve/site-ui/docs/api-reference.md +2 -0
- package/dist/serve/site-ui/docs/app-compat/index.html +28 -28
- package/dist/serve/site-ui/docs/app-compat.md +27 -27
- package/dist/serve/site-ui/docs/auth-compat/index.html +122 -122
- package/dist/serve/site-ui/docs/auth-compat.md +121 -121
- package/dist/serve/site-ui/docs/build/ai-logic/index.html +19 -2
- package/dist/serve/site-ui/docs/build/ai-logic.md +28 -0
- package/dist/serve/site-ui/docs/build/authentication/index.html +1 -1
- package/dist/serve/site-ui/docs/build/cloud-firestore/index.html +1 -1
- package/dist/serve/site-ui/docs/build/cloud-messaging/index.html +1 -1
- package/dist/serve/site-ui/docs/build/cloud-storage/index.html +1 -1
- package/dist/serve/site-ui/docs/build/realtime-database/index.html +1 -1
- package/dist/serve/site-ui/docs/conformance-scores/index.html +25 -10
- package/dist/serve/site-ui/docs/conformance-scores.md +23 -8
- package/dist/serve/site-ui/docs/create-pyric-reference-api/index.html +6 -6
- package/dist/serve/site-ui/docs/create-pyric-reference-api.md +5 -5
- package/dist/serve/site-ui/docs/database-compat/index.html +200 -448
- package/dist/serve/site-ui/docs/database-compat.md +198 -461
- package/dist/serve/site-ui/docs/examples/chess/index.html +2 -2
- package/dist/serve/site-ui/docs/examples/index.html +1 -1
- package/dist/serve/site-ui/docs/firestore-compat/index.html +186 -195
- package/dist/serve/site-ui/docs/firestore-compat.md +184 -195
- package/dist/serve/site-ui/docs/functions-rtdb-compat/index.html +15 -15
- package/dist/serve/site-ui/docs/functions-rtdb-compat.md +14 -14
- package/dist/serve/site-ui/docs/get-started/how-the-swap-works/index.html +1 -1
- package/dist/serve/site-ui/docs/get-started/nextjs/index.html +57 -0
- package/dist/serve/site-ui/docs/get-started/nextjs.md +86 -0
- package/dist/serve/site-ui/docs/get-started/start-building/index.html +38 -9
- package/dist/serve/site-ui/docs/get-started/start-building.md +62 -7
- package/dist/serve/site-ui/docs/get-started/vite/index.html +26 -0
- package/dist/serve/site-ui/docs/get-started/vite.md +45 -0
- package/dist/serve/site-ui/docs/index.json +711 -111
- package/dist/serve/site-ui/docs/messaging-compat/index.html +56 -56
- package/dist/serve/site-ui/docs/messaging-compat.md +55 -55
- package/dist/serve/site-ui/docs/observe/resolve-runtime-status/index.html +1 -1
- package/dist/serve/site-ui/docs/observe/see-whats-happening/index.html +1 -1
- package/dist/serve/site-ui/docs/observe/shape-your-data/index.html +1 -1
- package/dist/serve/site-ui/docs/overview/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-admin-app-reference-api/index.html +39 -13
- package/dist/serve/site-ui/docs/pyric-admin-app-reference-api.md +28 -2
- package/dist/serve/site-ui/docs/pyric-admin-auth-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-admin-database-reference-api/index.html +38 -6
- package/dist/serve/site-ui/docs/pyric-admin-database-reference-api.md +43 -0
- package/dist/serve/site-ui/docs/pyric-admin-firestore-reference-api/index.html +9 -1
- package/dist/serve/site-ui/docs/pyric-admin-firestore-reference-api.md +8 -0
- package/dist/serve/site-ui/docs/pyric-admin-messaging-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-admin-storage-reference-api/index.html +27 -4
- package/dist/serve/site-ui/docs/pyric-admin-storage-reference-api.md +23 -0
- package/dist/serve/site-ui/docs/pyric-ai-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ai-scripting-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-app-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-auth-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-assurance-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-bridge-client-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-bridge-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-conformance-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-credentials-node-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-discover-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-next-reference-api/index.html +123 -0
- package/dist/serve/site-ui/docs/pyric-cli-next-reference-api.md +99 -0
- package/dist/serve/site-ui/docs/pyric-cli-register-app-bridge-reference-api/index.html +127 -0
- package/dist/serve/site-ui/docs/pyric-cli-register-app-bridge-reference-api.md +174 -0
- package/dist/serve/site-ui/docs/pyric-cli-register-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-remote-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-serve-worker-reference-api/index.html +570 -326
- package/dist/serve/site-ui/docs/pyric-cli-serve-worker-reference-api.md +198 -6
- package/dist/serve/site-ui/docs/pyric-cli-verify-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-vite-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-database-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-firestore-reference-api/index.html +2971 -627
- package/dist/serve/site-ui/docs/pyric-firestore-reference-api.md +2873 -517
- package/dist/serve/site-ui/docs/pyric-messaging-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-messaging-sw-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-rules-reference-api/index.html +43 -3
- package/dist/serve/site-ui/docs/pyric-rules-reference-api.md +8 -0
- package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api/index.html +26 -2
- package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api.md +24 -0
- package/dist/serve/site-ui/docs/pyric-sandbox-firestore-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-sandbox-reference-api/index.html +77 -9
- package/dist/serve/site-ui/docs/pyric-sandbox-reference-api.md +28 -13
- package/dist/serve/site-ui/docs/pyric-storage-reference-api/index.html +240 -63
- package/dist/serve/site-ui/docs/pyric-storage-reference-api.md +164 -5
- package/dist/serve/site-ui/docs/pyric-ui-agents-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-auth-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-events-hooks-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-events-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-firestore-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-primitives-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-rtdb-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-rules-reference-api/index.html +1 -10
- package/dist/serve/site-ui/docs/pyric-ui-rules-reference-api.md +0 -9
- package/dist/serve/site-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-storage-reference-api/index.html +2 -1
- package/dist/serve/site-ui/docs/pyric-ui-storage-reference-api.md +1 -0
- package/dist/serve/site-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-traffic-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/rules-compat/index.html +87 -79
- package/dist/serve/site-ui/docs/rules-compat.md +86 -78
- package/dist/serve/site-ui/docs/secure/audit-your-rules/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/firestore-rules-limits/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/read-a-denial/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/rtdb-rules-in-typescript/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/rules-standard-library/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/secure-it-with-rules/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/simulate-and-lint/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/write-a-rules-test-suite/index.html +1 -1
- package/dist/serve/site-ui/docs/ship/ship-to-production/index.html +1 -1
- package/dist/serve/site-ui/docs/ship/test-in-node/index.html +1 -1
- package/dist/serve/site-ui/docs/storage-compat/index.html +119 -125
- package/dist/serve/site-ui/docs/storage-compat.md +118 -124
- package/dist/serve/site-ui/docs/trust/how-we-know-it-matches-firebase/index.html +1 -1
- package/dist/serve/site-ui/docs/trust/rules-standard-library/index.html +1 -1
- package/dist/serve/site-ui/docs/trust/storage-rules-stdlib-research/index.html +1 -1
- package/dist/serve/site-ui/docs/trust/versioning-and-compatibility/index.html +1 -1
- package/dist/serve/site-ui/docs/tutorial/index.html +2 -1
- package/dist/serve/site-ui/docs/tutorial.md +2 -0
- package/dist/serve/site-ui/examples/chess/index.html +1 -1
- package/dist/serve/site-ui/examples/firestore-first-write/index.html +1 -1
- package/dist/serve/site-ui/firestore/index.html +2 -2
- package/dist/serve/site-ui/index.html +2 -2
- package/dist/serve/site-ui/llms.txt +8 -4
- package/dist/serve/site-ui/rtdb/index.html +2 -2
- package/dist/serve/site-ui/settings/index.html +2 -2
- package/dist/serve/site-ui/storage/index.html +2 -2
- package/dist/serve/site-ui/traffic/index.html +2 -2
- package/dist/serve/vite-ai-config.d.ts +4 -1
- package/dist/serve/vite-ai-config.d.ts.map +1 -1
- package/dist/serve/vite-ai-config.js +83 -19
- package/dist/serve/vite-ai-config.js.map +1 -1
- package/dist/serve/vite-functions-development.d.ts.map +1 -1
- package/dist/serve/vite-functions-development.js +1 -0
- package/dist/serve/vite-functions-development.js.map +1 -1
- package/dist/serve/vite-generation-rules-watch.d.ts.map +1 -1
- package/dist/serve/vite-generation-rules-watch.js +61 -14
- package/dist/serve/vite-generation-rules-watch.js.map +1 -1
- package/dist/serve/vite-module-swap.d.ts +4 -1
- package/dist/serve/vite-module-swap.d.ts.map +1 -1
- package/dist/serve/vite-module-swap.js +106 -21
- package/dist/serve/vite-module-swap.js.map +1 -1
- package/dist/serve/vite-plugin.d.ts.map +1 -1
- package/dist/serve/vite-plugin.js +45 -5
- package/dist/serve/vite-plugin.js.map +1 -1
- package/dist/serve/vite-sandbox-generation.js +1 -1
- package/dist/serve/vite-sandbox-generation.js.map +1 -1
- package/dist/serve/worker/client/resumable.d.ts +30 -0
- package/dist/serve/worker/client/resumable.d.ts.map +1 -0
- package/dist/serve/worker/client/resumable.js +416 -0
- package/dist/serve/worker/client/resumable.js.map +1 -0
- package/dist/serve/worker/client/rtdb-references.d.ts.map +1 -1
- package/dist/serve/worker/client/rtdb-references.js +4 -1
- package/dist/serve/worker/client/rtdb-references.js.map +1 -1
- package/dist/serve/worker/client/storage.d.ts +16 -2
- package/dist/serve/worker/client/storage.d.ts.map +1 -1
- package/dist/serve/worker/client/storage.js +57 -6
- package/dist/serve/worker/client/storage.js.map +1 -1
- package/dist/serve/worker/host/rules.d.ts.map +1 -1
- package/dist/serve/worker/host/rules.js +2 -1
- package/dist/serve/worker/host/rules.js.map +1 -1
- package/dist/serve/worker/index.d.ts +1 -1
- package/dist/serve/worker/index.d.ts.map +1 -1
- package/dist/serve/worker/index.js +1 -1
- package/dist/serve/worker/index.js.map +1 -1
- package/dist/serve/worker/serve-init.d.ts.map +1 -1
- package/dist/serve/worker/serve-init.js +31 -0
- package/dist/serve/worker/serve-init.js.map +1 -1
- package/package.json +15 -4
- package/src/assurance/.generated/conformance-verdicts.ts +80 -72
- package/src/bridge/server/bridge.ts +5 -2
- package/src/bridge/server/peer.ts +2 -1
- package/src/cli/cli.test.ts +14 -0
- package/src/cli/database-rules.ts +6 -4
- package/src/cli/dev-runner.ts +21 -0
- package/src/cli/serve.ts +63 -5
- package/src/cli/verify.ts +2 -2
- 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/child.ts +12 -1
- package/src/functions-rtdb/development-runtime.ts +2 -0
- package/src/next/client-aliases.ts +39 -0
- package/src/next/dev-rewrites.ts +77 -0
- package/src/next/guard.ts +61 -0
- package/src/next/index.ts +16 -0
- package/src/next/runtime-env.ts +18 -0
- package/src/next/server-external-packages.ts +43 -0
- package/src/next/target-url.ts +46 -0
- package/src/next/turbopack-config.ts +54 -0
- package/src/next/types.ts +47 -0
- package/src/next/webpack-config.ts +71 -0
- package/src/next/with-pyric.ts +58 -0
- package/src/register/app-bridge.ts +79 -0
- package/src/register/hooks.ts +6 -1
- package/src/register/index.ts +1 -1
- package/src/register/mapping.ts +50 -4
- package/src/remote/index.ts +7 -5
- package/src/rtdb/rules-json.ts +110 -0
- package/src/serve/bundler.ts +2 -0
- package/src/serve/discovery.ts +65 -44
- package/src/serve/entries/app-ai-passthrough.ts +83 -0
- package/src/serve/entries/auth-helper-core.ts +9 -7
- package/src/serve/entries/auth.ts +1 -0
- package/src/serve/entries/bridge-url.ts +9 -2
- package/src/serve/entries/database.ts +1 -0
- package/src/serve/entries/firestore.ts +1 -0
- package/src/serve/entries/init.ts +5 -2
- package/src/serve/entries/runtime.ts +25 -0
- package/src/serve/entries/storage.ts +12 -1
- package/src/serve/html-injection.ts +26 -1
- package/src/serve/rules.ts +2 -2
- package/src/serve/runtime/chip-config.ts +19 -6
- package/src/serve/runtime/chip.ts +24 -3
- package/src/serve/runtime/status.ts +76 -13
- package/src/serve/sandbox-session.ts +31 -2
- package/src/serve/vite-ai-config.ts +86 -19
- package/src/serve/vite-functions-development.ts +1 -0
- package/src/serve/vite-generation-rules-watch.ts +67 -15
- package/src/serve/vite-module-swap.ts +121 -21
- package/src/serve/vite-plugin.ts +44 -6
- package/src/serve/vite-sandbox-generation.ts +1 -1
- package/src/serve/worker/client/resumable.ts +506 -0
- package/src/serve/worker/client/rtdb-references.ts +4 -1
- package/src/serve/worker/client/storage.ts +77 -7
- package/src/serve/worker/host/rules.ts +2 -1
- package/src/serve/worker/index.ts +4 -0
- package/src/serve/worker/serve-init.ts +30 -0
- package/dist/serve/site-ui/_astro/_slug_.BoKXYrnu.css +0 -1
- package/dist/serve/site-ui/_astro/_studio_.BtYpqe1A.css +0 -1
- package/dist/serve/site-ui/_astro/app.4HeLP_FA.js +0 -109
- package/dist/serve/site-ui/_astro/app.BgSnCR5G.js +0 -1
- package/dist/serve/site-ui/_astro/index.BJiOemMX.js +0 -1
- package/dist/serve/site-ui/_astro/reads.BrKNdKAa.js +0 -1
- package/dist/serve/site-ui/_astro/sandbox-controls.BTb3EbQp.js +0 -1153
|
@@ -289,7 +289,13 @@ export const CONFORMANCE_VERDICTS = {
|
|
|
289
289
|
"firestore#149": "qualified",
|
|
290
290
|
"firestore#15": "supported",
|
|
291
291
|
"firestore#150": "supported",
|
|
292
|
+
"firestore#151": "supported",
|
|
292
293
|
"firestore#152": "supported",
|
|
294
|
+
"firestore#153": "supported",
|
|
295
|
+
"firestore#154": "supported",
|
|
296
|
+
"firestore#155": "supported",
|
|
297
|
+
"firestore#156": "supported",
|
|
298
|
+
"firestore#157": "supported",
|
|
293
299
|
"firestore#16": "supported",
|
|
294
300
|
"firestore#17": "supported",
|
|
295
301
|
"firestore#18": "supported",
|
|
@@ -421,6 +427,8 @@ export const CONFORMANCE_VERDICTS = {
|
|
|
421
427
|
"firestore-rules#187": "supported",
|
|
422
428
|
"firestore-rules#188": "supported",
|
|
423
429
|
"firestore-rules#189": "supported",
|
|
430
|
+
"firestore-rules#190": "supported",
|
|
431
|
+
"firestore-rules#191": "supported",
|
|
424
432
|
"firestore.binding.path-variable": "supported",
|
|
425
433
|
"firestore.binding.request": "supported",
|
|
426
434
|
"firestore.binding.request.auth": "supported",
|
|
@@ -437,7 +445,7 @@ export const CONFORMANCE_VERDICTS = {
|
|
|
437
445
|
"firestore.binding.resource.__name__": "supported",
|
|
438
446
|
"firestore.binding.resource.data": "supported",
|
|
439
447
|
"firestore.binding.resource.id": "supported",
|
|
440
|
-
"firestore.function.cast.bool": "
|
|
448
|
+
"firestore.function.cast.bool": "supported",
|
|
441
449
|
"firestore.function.cast.float": "supported",
|
|
442
450
|
"firestore.function.cast.int": "supported",
|
|
443
451
|
"firestore.function.cast.path": "supported",
|
|
@@ -458,7 +466,7 @@ export const CONFORMANCE_VERDICTS = {
|
|
|
458
466
|
"firestore.function.math.abs": "supported",
|
|
459
467
|
"firestore.function.math.ceil": "supported",
|
|
460
468
|
"firestore.function.math.floor": "supported",
|
|
461
|
-
"firestore.function.math.isInfinite": "
|
|
469
|
+
"firestore.function.math.isInfinite": "supported",
|
|
462
470
|
"firestore.function.math.isNaN": "supported",
|
|
463
471
|
"firestore.function.math.pow": "supported",
|
|
464
472
|
"firestore.function.math.round": "supported",
|
|
@@ -483,9 +491,9 @@ export const CONFORMANCE_VERDICTS = {
|
|
|
483
491
|
"firestore.method.list.toSet": "supported",
|
|
484
492
|
"firestore.method.map.diff": "supported",
|
|
485
493
|
"firestore.method.map.get": "supported",
|
|
486
|
-
"firestore.method.map.hasAll": "
|
|
487
|
-
"firestore.method.map.hasAny": "
|
|
488
|
-
"firestore.method.map.hasOnly": "
|
|
494
|
+
"firestore.method.map.hasAll": "supported",
|
|
495
|
+
"firestore.method.map.hasAny": "supported",
|
|
496
|
+
"firestore.method.map.hasOnly": "supported",
|
|
489
497
|
"firestore.method.map.keys": "supported",
|
|
490
498
|
"firestore.method.map.size": "supported",
|
|
491
499
|
"firestore.method.map.values": "supported",
|
|
@@ -875,62 +883,62 @@ export const CONFORMANCE_VERDICTS = {
|
|
|
875
883
|
"rtdb-rules#7": "supported",
|
|
876
884
|
"rtdb-rules#8": "supported",
|
|
877
885
|
"rtdb-rules#9": "supported",
|
|
878
|
-
"rtdb.binding.auth": "
|
|
879
|
-
"rtdb.binding.auth.token": "
|
|
880
|
-
"rtdb.binding.auth.uid": "
|
|
881
|
-
"rtdb.binding.data": "
|
|
882
|
-
"rtdb.binding.newData": "
|
|
883
|
-
"rtdb.binding.now": "
|
|
884
|
-
"rtdb.binding.path-variable": "
|
|
885
|
-
"rtdb.binding.root": "
|
|
886
|
-
"rtdb.method.snapshot.child": "
|
|
887
|
-
"rtdb.method.snapshot.exists": "
|
|
888
|
-
"rtdb.method.snapshot.getPriority": "
|
|
889
|
-
"rtdb.method.snapshot.hasChild": "
|
|
890
|
-
"rtdb.method.snapshot.hasChildren": "
|
|
891
|
-
"rtdb.method.snapshot.isBoolean": "
|
|
892
|
-
"rtdb.method.snapshot.isNumber": "
|
|
893
|
-
"rtdb.method.snapshot.isString": "
|
|
894
|
-
"rtdb.method.snapshot.parent": "
|
|
895
|
-
"rtdb.method.snapshot.val": "
|
|
896
|
-
"rtdb.method.string.beginsWith": "
|
|
897
|
-
"rtdb.method.string.contains": "
|
|
898
|
-
"rtdb.method.string.endsWith": "
|
|
899
|
-
"rtdb.method.string.length": "
|
|
900
|
-
"rtdb.method.string.matches": "
|
|
901
|
-
"rtdb.method.string.replace": "
|
|
902
|
-
"rtdb.method.string.toLowerCase": "
|
|
903
|
-
"rtdb.method.string.toUpperCase": "
|
|
904
|
-
"rtdb.operator.add": "
|
|
905
|
-
"rtdb.operator.and": "
|
|
906
|
-
"rtdb.operator.div": "
|
|
907
|
-
"rtdb.operator.gt": "
|
|
908
|
-
"rtdb.operator.gte": "
|
|
909
|
-
"rtdb.operator.index": "
|
|
910
|
-
"rtdb.operator.looseEq": "
|
|
911
|
-
"rtdb.operator.looseNeq": "
|
|
912
|
-
"rtdb.operator.lt": "
|
|
913
|
-
"rtdb.operator.lte": "
|
|
914
|
-
"rtdb.operator.member": "
|
|
915
|
-
"rtdb.operator.mod": "
|
|
916
|
-
"rtdb.operator.mul": "
|
|
917
|
-
"rtdb.operator.neg": "
|
|
918
|
-
"rtdb.operator.not": "
|
|
919
|
-
"rtdb.operator.or": "
|
|
920
|
-
"rtdb.operator.strictEq": "
|
|
921
|
-
"rtdb.operator.strictNeq": "
|
|
922
|
-
"rtdb.operator.sub": "
|
|
923
|
-
"rtdb.operator.ternary": "
|
|
924
|
-
"rtdb.rule-kind.indexOn": "
|
|
925
|
-
"rtdb.rule-kind.location-wildcard": "
|
|
926
|
-
"rtdb.rule-kind.read": "
|
|
927
|
-
"rtdb.rule-kind.validate": "
|
|
928
|
-
"rtdb.rule-kind.write": "
|
|
886
|
+
"rtdb.binding.auth": "supported",
|
|
887
|
+
"rtdb.binding.auth.token": "supported",
|
|
888
|
+
"rtdb.binding.auth.uid": "supported",
|
|
889
|
+
"rtdb.binding.data": "supported",
|
|
890
|
+
"rtdb.binding.newData": "supported",
|
|
891
|
+
"rtdb.binding.now": "supported",
|
|
892
|
+
"rtdb.binding.path-variable": "supported",
|
|
893
|
+
"rtdb.binding.root": "supported",
|
|
894
|
+
"rtdb.method.snapshot.child": "supported",
|
|
895
|
+
"rtdb.method.snapshot.exists": "supported",
|
|
896
|
+
"rtdb.method.snapshot.getPriority": "supported",
|
|
897
|
+
"rtdb.method.snapshot.hasChild": "supported",
|
|
898
|
+
"rtdb.method.snapshot.hasChildren": "supported",
|
|
899
|
+
"rtdb.method.snapshot.isBoolean": "supported",
|
|
900
|
+
"rtdb.method.snapshot.isNumber": "supported",
|
|
901
|
+
"rtdb.method.snapshot.isString": "supported",
|
|
902
|
+
"rtdb.method.snapshot.parent": "supported",
|
|
903
|
+
"rtdb.method.snapshot.val": "supported",
|
|
904
|
+
"rtdb.method.string.beginsWith": "supported",
|
|
905
|
+
"rtdb.method.string.contains": "supported",
|
|
906
|
+
"rtdb.method.string.endsWith": "supported",
|
|
907
|
+
"rtdb.method.string.length": "supported",
|
|
908
|
+
"rtdb.method.string.matches": "supported",
|
|
909
|
+
"rtdb.method.string.replace": "supported",
|
|
910
|
+
"rtdb.method.string.toLowerCase": "supported",
|
|
911
|
+
"rtdb.method.string.toUpperCase": "supported",
|
|
912
|
+
"rtdb.operator.add": "supported",
|
|
913
|
+
"rtdb.operator.and": "supported",
|
|
914
|
+
"rtdb.operator.div": "supported",
|
|
915
|
+
"rtdb.operator.gt": "supported",
|
|
916
|
+
"rtdb.operator.gte": "supported",
|
|
917
|
+
"rtdb.operator.index": "supported",
|
|
918
|
+
"rtdb.operator.looseEq": "supported",
|
|
919
|
+
"rtdb.operator.looseNeq": "supported",
|
|
920
|
+
"rtdb.operator.lt": "supported",
|
|
921
|
+
"rtdb.operator.lte": "supported",
|
|
922
|
+
"rtdb.operator.member": "supported",
|
|
923
|
+
"rtdb.operator.mod": "supported",
|
|
924
|
+
"rtdb.operator.mul": "supported",
|
|
925
|
+
"rtdb.operator.neg": "supported",
|
|
926
|
+
"rtdb.operator.not": "supported",
|
|
927
|
+
"rtdb.operator.or": "supported",
|
|
928
|
+
"rtdb.operator.strictEq": "supported",
|
|
929
|
+
"rtdb.operator.strictNeq": "supported",
|
|
930
|
+
"rtdb.operator.sub": "supported",
|
|
931
|
+
"rtdb.operator.ternary": "supported",
|
|
932
|
+
"rtdb.rule-kind.indexOn": "supported",
|
|
933
|
+
"rtdb.rule-kind.location-wildcard": "supported",
|
|
934
|
+
"rtdb.rule-kind.read": "supported",
|
|
935
|
+
"rtdb.rule-kind.validate": "supported",
|
|
936
|
+
"rtdb.rule-kind.write": "supported",
|
|
929
937
|
"rtdb.semantic.deny-by-default": "qualified",
|
|
930
|
-
"rtdb.semantic.read-cascade": "
|
|
931
|
-
"rtdb.semantic.regex-literal": "
|
|
932
|
-
"rtdb.semantic.validate-non-cascade": "
|
|
933
|
-
"rtdb.semantic.write-cascade": "
|
|
938
|
+
"rtdb.semantic.read-cascade": "supported",
|
|
939
|
+
"rtdb.semantic.regex-literal": "supported",
|
|
940
|
+
"rtdb.semantic.validate-non-cascade": "supported",
|
|
941
|
+
"rtdb.semantic.write-cascade": "supported",
|
|
934
942
|
"storage#1": "supported",
|
|
935
943
|
"storage#10": "supported",
|
|
936
944
|
"storage#105": "supported",
|
|
@@ -977,12 +985,12 @@ export const CONFORMANCE_VERDICTS = {
|
|
|
977
985
|
"storage#44": "supported",
|
|
978
986
|
"storage#45": "supported",
|
|
979
987
|
"storage#46": "supported",
|
|
980
|
-
"storage#47": "
|
|
981
|
-
"storage#48": "
|
|
982
|
-
"storage#49": "
|
|
988
|
+
"storage#47": "qualified",
|
|
989
|
+
"storage#48": "qualified",
|
|
990
|
+
"storage#49": "qualified",
|
|
983
991
|
"storage#4a": "supported",
|
|
984
992
|
"storage#5": "supported",
|
|
985
|
-
"storage#50": "
|
|
993
|
+
"storage#50": "qualified",
|
|
986
994
|
"storage#51": "qualified",
|
|
987
995
|
"storage#52": "supported",
|
|
988
996
|
"storage#53": "supported",
|
|
@@ -1093,30 +1101,30 @@ export const CONFORMANCE_VERDICTS = {
|
|
|
1093
1101
|
"storage.method.map.get": "supported",
|
|
1094
1102
|
"storage.method.map.keys": "supported",
|
|
1095
1103
|
"storage.method.set.hasAll": "supported",
|
|
1096
|
-
"storage.method.size": "
|
|
1104
|
+
"storage.method.size": "supported",
|
|
1097
1105
|
"storage.method.string.matches": "supported",
|
|
1098
|
-
"storage.method.string.split": "
|
|
1106
|
+
"storage.method.string.split": "supported",
|
|
1099
1107
|
"storage.operator.add": "supported",
|
|
1100
1108
|
"storage.operator.and": "supported",
|
|
1101
1109
|
"storage.operator.div": "supported",
|
|
1102
1110
|
"storage.operator.eq": "supported",
|
|
1103
1111
|
"storage.operator.gt": "supported",
|
|
1104
1112
|
"storage.operator.gte": "supported",
|
|
1105
|
-
"storage.operator.in": "
|
|
1113
|
+
"storage.operator.in": "supported",
|
|
1106
1114
|
"storage.operator.index": "supported",
|
|
1107
|
-
"storage.operator.is": "
|
|
1115
|
+
"storage.operator.is": "supported",
|
|
1108
1116
|
"storage.operator.lt": "supported",
|
|
1109
1117
|
"storage.operator.lte": "supported",
|
|
1110
1118
|
"storage.operator.member": "supported",
|
|
1111
|
-
"storage.operator.mod": "
|
|
1119
|
+
"storage.operator.mod": "supported",
|
|
1112
1120
|
"storage.operator.mul": "supported",
|
|
1113
1121
|
"storage.operator.neq": "supported",
|
|
1114
1122
|
"storage.operator.not": "supported",
|
|
1115
1123
|
"storage.operator.or": "supported",
|
|
1116
|
-
"storage.operator.slice": "
|
|
1124
|
+
"storage.operator.slice": "supported",
|
|
1117
1125
|
"storage.operator.sub": "supported",
|
|
1118
|
-
"storage.operator.ternary": "
|
|
1119
|
-
"storage.operator.unary-minus": "
|
|
1126
|
+
"storage.operator.ternary": "supported",
|
|
1127
|
+
"storage.operator.unary-minus": "supported",
|
|
1120
1128
|
"storage.rule-kind.allow-create": "supported",
|
|
1121
1129
|
"storage.rule-kind.allow-delete": "supported",
|
|
1122
1130
|
"storage.rule-kind.allow-get": "supported",
|
|
@@ -206,10 +206,12 @@ function workerOpError(
|
|
|
206
206
|
code: string,
|
|
207
207
|
message: string,
|
|
208
208
|
denialContext?: unknown,
|
|
209
|
-
|
|
210
|
-
|
|
209
|
+
envelope?: unknown,
|
|
210
|
+
): Error & { code: string; denialContext?: unknown; envelope?: unknown } {
|
|
211
|
+
const err = new Error(message) as Error & { code: string; denialContext?: unknown; envelope?: unknown };
|
|
211
212
|
err.code = code;
|
|
212
213
|
if (denialContext !== undefined) err.denialContext = denialContext;
|
|
214
|
+
if (envelope !== undefined) err.envelope = envelope;
|
|
213
215
|
return err;
|
|
214
216
|
}
|
|
215
217
|
|
|
@@ -481,6 +483,7 @@ export function createBridge(opts: BridgeOptions): Bridge {
|
|
|
481
483
|
res.error?.code ?? 'unknown',
|
|
482
484
|
res.error?.message ?? 'unknown sandbox error',
|
|
483
485
|
res.error?.denialContext,
|
|
486
|
+
(res.error as any)?.envelope,
|
|
484
487
|
),
|
|
485
488
|
);
|
|
486
489
|
}
|
|
@@ -162,7 +162,7 @@ export function createConsumerSession(
|
|
|
162
162
|
case 'worker-op': {
|
|
163
163
|
bridge.dispatchWorkerOp(msg.op).then(
|
|
164
164
|
(value) => send({ type: 'worker-res', id: msg.id, ok: true, value }),
|
|
165
|
-
(err: Error & { code?: string; denialContext?: unknown }) =>
|
|
165
|
+
(err: Error & { code?: string; denialContext?: unknown; envelope?: unknown }) =>
|
|
166
166
|
send({
|
|
167
167
|
type: 'worker-res',
|
|
168
168
|
id: msg.id,
|
|
@@ -173,6 +173,7 @@ export function createConsumerSession(
|
|
|
173
173
|
// Structured denial context (spike gap 6) — plain JSON,
|
|
174
174
|
// relayed verbatim so the Node side re-attaches it.
|
|
175
175
|
...(err.denialContext !== undefined ? { denialContext: err.denialContext } : {}),
|
|
176
|
+
...(err.envelope !== undefined ? { envelope: err.envelope } : {}),
|
|
176
177
|
},
|
|
177
178
|
}),
|
|
178
179
|
);
|
package/src/cli/cli.test.ts
CHANGED
|
@@ -490,4 +490,18 @@ describe('scanForInlinedFirebase', () => {
|
|
|
490
490
|
);
|
|
491
491
|
expect(scanForInlinedFirebase(dir)).toEqual([]);
|
|
492
492
|
});
|
|
493
|
+
|
|
494
|
+
it('ignores hidden frameworks and build cache directories like .next and .git', async () => {
|
|
495
|
+
const { scanForInlinedFirebase } = await import('./serve.js');
|
|
496
|
+
const { mkdtempSync, mkdirSync, writeFileSync } = await import('node:fs');
|
|
497
|
+
const { tmpdir } = await import('node:os');
|
|
498
|
+
const { join } = await import('node:path');
|
|
499
|
+
const dir = mkdtempSync(join(tmpdir(), 'pyric-inline-ignore-'));
|
|
500
|
+
mkdirSync(join(dir, '.next'));
|
|
501
|
+
writeFileSync(
|
|
502
|
+
join(dir, '.next', 'bundle.js'),
|
|
503
|
+
'fetch("https://identitytoolkit.googleapis.com/v1/projects?key="+k)',
|
|
504
|
+
);
|
|
505
|
+
expect(scanForInlinedFirebase(dir)).toEqual([]);
|
|
506
|
+
});
|
|
493
507
|
});
|
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
loadRtdbRulesDocument,
|
|
20
20
|
type LoadRtdbRulesDocumentResult,
|
|
21
21
|
} from '../rtdb/load-rules-document.js';
|
|
22
|
+
import { stripJsonComments } from '../rtdb/rules-json.js';
|
|
22
23
|
|
|
23
24
|
export interface DatabaseRulesDeps {
|
|
24
25
|
readFile?: typeof readFile;
|
|
@@ -53,7 +54,7 @@ function defaultReadStdin(): Promise<string> {
|
|
|
53
54
|
}
|
|
54
55
|
|
|
55
56
|
function parseRulesJson(raw: string): CompiledRtdbRules {
|
|
56
|
-
return compileRtdbRules(JSON.parse(raw));
|
|
57
|
+
return compileRtdbRules(JSON.parse(stripJsonComments(raw)));
|
|
57
58
|
}
|
|
58
59
|
|
|
59
60
|
function collectFindings(node: RtdbNode, kind: 'errors' | 'warnings'): RuleFinding[] {
|
|
@@ -215,7 +216,8 @@ export async function runDatabaseRulesSimulate(
|
|
|
215
216
|
rulesJson = payload.rulesJson ?? payload.rules;
|
|
216
217
|
} else if (payload.rulesPath) {
|
|
217
218
|
try {
|
|
218
|
-
|
|
219
|
+
const rawContent = await readFileFn(resolvePath(deps.cwd ?? process.cwd(), payload.rulesPath), 'utf-8');
|
|
220
|
+
rulesJson = JSON.parse(stripJsonComments(rawContent));
|
|
219
221
|
} catch (e) {
|
|
220
222
|
err.write(`pyric database rules simulate: ${e instanceof Error ? e.message : String(e)}\n`);
|
|
221
223
|
return 1;
|
|
@@ -227,7 +229,7 @@ export async function runDatabaseRulesSimulate(
|
|
|
227
229
|
return 1;
|
|
228
230
|
}
|
|
229
231
|
try {
|
|
230
|
-
rulesJson = JSON.parse(file.raw);
|
|
232
|
+
rulesJson = JSON.parse(stripJsonComments(file.raw));
|
|
231
233
|
} catch (e) {
|
|
232
234
|
err.write(`pyric database rules simulate: ${e instanceof Error ? e.message : String(e)}\n`);
|
|
233
235
|
return 2;
|
|
@@ -247,7 +249,7 @@ export async function runDatabaseRulesSimulate(
|
|
|
247
249
|
return 1;
|
|
248
250
|
}
|
|
249
251
|
try {
|
|
250
|
-
rulesJson = JSON.parse(file.raw);
|
|
252
|
+
rulesJson = JSON.parse(stripJsonComments(file.raw));
|
|
251
253
|
} catch (e) {
|
|
252
254
|
err.write(`pyric database rules simulate: ${e instanceof Error ? e.message : String(e)}\n`);
|
|
253
255
|
return 2;
|
package/src/cli/dev-runner.ts
CHANGED
|
@@ -163,6 +163,27 @@ export function buildChildEnv(
|
|
|
163
163
|
};
|
|
164
164
|
}
|
|
165
165
|
|
|
166
|
+
/**
|
|
167
|
+
* Format copy-pasteable POSIX export statements for host-only startup.
|
|
168
|
+
* Grouped in a cleanly formatted console block for easy selection and copying
|
|
169
|
+
* into a separate terminal (for example, when running Next.js independently).
|
|
170
|
+
*/
|
|
171
|
+
export function formatStartupEnvExport(opts: { serveUrl: string; registerUrl: string }): string {
|
|
172
|
+
const pyricSandbox = `remote:${opts.serveUrl}`;
|
|
173
|
+
const nodeOptions = `--import ${opts.registerUrl}`;
|
|
174
|
+
const line1 = `export PYRIC_SANDBOX="${pyricSandbox}"`;
|
|
175
|
+
const line2 = `export NODE_OPTIONS="${nodeOptions}"`;
|
|
176
|
+
const divider = '─'.repeat(Math.max(line1.length, line2.length) + 4);
|
|
177
|
+
return (
|
|
178
|
+
'\n' +
|
|
179
|
+
' To run external commands against this sandbox, paste in another terminal:\n' +
|
|
180
|
+
` ${divider}\n` +
|
|
181
|
+
` ${line1}\n` +
|
|
182
|
+
` ${line2}\n` +
|
|
183
|
+
` ${divider}\n`
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
|
|
166
187
|
// ─── Line prefixing (pure core) ────────────────────────────────────────────
|
|
167
188
|
|
|
168
189
|
/**
|
package/src/cli/serve.ts
CHANGED
|
@@ -31,6 +31,7 @@ import { openBrowser, shouldAutoOpen } from '../serve/open-browser.js';
|
|
|
31
31
|
import {
|
|
32
32
|
buildChildEnv,
|
|
33
33
|
detectPackageManager,
|
|
34
|
+
formatStartupEnvExport,
|
|
34
35
|
readDevScript,
|
|
35
36
|
registerModuleUrl,
|
|
36
37
|
resolveDevChild,
|
|
@@ -404,6 +405,47 @@ export async function startServe(opts: {
|
|
|
404
405
|
watcher.close();
|
|
405
406
|
});
|
|
406
407
|
}
|
|
408
|
+
const dbRulesSourcePath = session.summary.rules.database.sourcePath;
|
|
409
|
+
const isWatchEnabled = opts.watch !== false;
|
|
410
|
+
const hasDbRulesPath = dbRulesSourcePath !== null;
|
|
411
|
+
const watchingDb = isWatchEnabled && hasDbRulesPath;
|
|
412
|
+
if (watchingDb) {
|
|
413
|
+
let debounceDb: ReturnType<typeof setTimeout> | null = null;
|
|
414
|
+
const dbWatcher = watchFile(dbRulesSourcePath as string, () => {
|
|
415
|
+
const hasDebounceDb = debounceDb !== null;
|
|
416
|
+
if (hasDebounceDb) {
|
|
417
|
+
clearTimeout(debounceDb as ReturnType<typeof setTimeout>);
|
|
418
|
+
}
|
|
419
|
+
debounceDb = setTimeout(() => {
|
|
420
|
+
void session.reloadDatabaseRules().then((result) => {
|
|
421
|
+
const isReloaded = result.kind === 'reloaded';
|
|
422
|
+
if (isReloaded) {
|
|
423
|
+
logger.note(` ↻ rtdb rules reloaded (hash ${result.rulesHash}) → ${result.clients} page(s)`);
|
|
424
|
+
} else {
|
|
425
|
+
const isRejected = result.kind === 'rejected';
|
|
426
|
+
if (isRejected) {
|
|
427
|
+
logger.note(` ⚠ rtdb rules NOT reloaded (last-good stays live): ${result.error.message}`);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
});
|
|
431
|
+
}, 150);
|
|
432
|
+
});
|
|
433
|
+
dbWatcher.on('error', (error) => {
|
|
434
|
+
const isErrorInstance = error instanceof Error;
|
|
435
|
+
let errorMsg = String(error);
|
|
436
|
+
if (isErrorInstance) {
|
|
437
|
+
errorMsg = (error as Error).message;
|
|
438
|
+
}
|
|
439
|
+
logger.note(` ⚠ rtdb rules watcher failed (hot reload off): ${errorMsg}`);
|
|
440
|
+
});
|
|
441
|
+
handle.server.once('close', () => {
|
|
442
|
+
const hasDebounceDb = debounceDb !== null;
|
|
443
|
+
if (hasDebounceDb) {
|
|
444
|
+
clearTimeout(debounceDb as ReturnType<typeof setTimeout>);
|
|
445
|
+
}
|
|
446
|
+
dbWatcher.close();
|
|
447
|
+
});
|
|
448
|
+
}
|
|
407
449
|
|
|
408
450
|
logger.info(`=== Serving from '${opts.cwd}'...`);
|
|
409
451
|
logger.info('');
|
|
@@ -476,7 +518,12 @@ export async function startServe(opts: {
|
|
|
476
518
|
if (session.summary.capturePath) {
|
|
477
519
|
logger.info(`✔ capture session → ${session.summary.capturePath} (run \`pyric verify\` to replay it)`);
|
|
478
520
|
}
|
|
479
|
-
if (watching)
|
|
521
|
+
if (watching) {
|
|
522
|
+
logger.info(`✔ watch hot-reloading ${rulesSourcePath} over /__pyric/events`);
|
|
523
|
+
}
|
|
524
|
+
if (watchingDb) {
|
|
525
|
+
logger.info(`✔ watch hot-reloading ${dbRulesSourcePath} over /__pyric/events`);
|
|
526
|
+
}
|
|
480
527
|
// Browser-honesty: the sandbox is browser-resident — firestore/auth and
|
|
481
528
|
// persistence run IN the served page. With no page open, data ops silently
|
|
482
529
|
// no-op. This warning (paired with auto-open in runServe) is the fix for the
|
|
@@ -570,7 +617,8 @@ export async function runServe(parsed: ParsedArgs): Promise<number> {
|
|
|
570
617
|
|
|
571
618
|
const json = Boolean(parsed.flags.get('json'));
|
|
572
619
|
|
|
573
|
-
const
|
|
620
|
+
const explicitUi = Boolean(parsed.flags.get('ui'));
|
|
621
|
+
const uiOn = !parsed.flags.get('no-ui');
|
|
574
622
|
|
|
575
623
|
// Resolve the child plan BEFORE the server starts: a planned child implies
|
|
576
624
|
// the bridge (see bridgeEnabledFor) — the child's injected PYRIC_SANDBOX
|
|
@@ -661,8 +709,9 @@ export async function runServe(parsed: ParsedArgs): Promise<number> {
|
|
|
661
709
|
env: process.env,
|
|
662
710
|
});
|
|
663
711
|
if (opened) {
|
|
664
|
-
//
|
|
665
|
-
|
|
712
|
+
// When explicit --ui is passed, open Studio directly; otherwise open the served page.
|
|
713
|
+
const targetUrl = explicitUi && runtime.uiUrl !== null ? runtime.uiUrl : runtime.handle.url;
|
|
714
|
+
void openBrowser(targetUrl);
|
|
666
715
|
}
|
|
667
716
|
|
|
668
717
|
let devChild: DevChildHandle | null = null;
|
|
@@ -734,6 +783,7 @@ export async function runServe(parsed: ParsedArgs): Promise<number> {
|
|
|
734
783
|
registerUrl: registerModuleUrl(),
|
|
735
784
|
instance: `${functionsProjectId}-default-rtdb`,
|
|
736
785
|
location: process.env.PYRIC_FUNCTIONS_RTDB_REGION ?? 'us-central1',
|
|
786
|
+
projectId: functionsProjectId ?? 'demo-project',
|
|
737
787
|
readiness: createHttpFunctionsPeerReadiness(runtime.handle.url),
|
|
738
788
|
onEvent: reportFunctionsEvent,
|
|
739
789
|
});
|
|
@@ -800,6 +850,13 @@ export async function runServe(parsed: ParsedArgs): Promise<number> {
|
|
|
800
850
|
registerUrl: registerModuleUrl(),
|
|
801
851
|
}),
|
|
802
852
|
});
|
|
853
|
+
} else if (!json) {
|
|
854
|
+
process.stdout.write(
|
|
855
|
+
formatStartupEnvExport({
|
|
856
|
+
serveUrl: runtime.handle.url,
|
|
857
|
+
registerUrl: registerModuleUrl(),
|
|
858
|
+
}),
|
|
859
|
+
);
|
|
803
860
|
}
|
|
804
861
|
|
|
805
862
|
return await new Promise<number>((resolveExit) => {
|
|
@@ -886,7 +943,8 @@ export function scanForInlinedFirebase(dir: string): string[] {
|
|
|
886
943
|
if (st.isDirectory()) {
|
|
887
944
|
// The pyric namespace itself never lands in hosting.public, but a
|
|
888
945
|
// node_modules inside a served dir would be a scan-cost trap.
|
|
889
|
-
|
|
946
|
+
// Dot-directories (.next, .git, .pyric) are internal caches and must be ignored.
|
|
947
|
+
if (name === 'node_modules' || name.startsWith('.')) continue;
|
|
890
948
|
walk(p, r, depth + 1);
|
|
891
949
|
} else if (/\.(js|mjs)$/.test(name)) {
|
|
892
950
|
scanned++;
|
package/src/cli/verify.ts
CHANGED
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
import { readFirebaseJson, type FirebaseJson } from './firebase-json.js';
|
|
19
19
|
import type { FlagValue, ParsedArgs } from './parse-args.js';
|
|
20
20
|
import { resolveScope } from './scope.js';
|
|
21
|
-
import { parseRtdbRulesJson } from '../rtdb/rules-json.js';
|
|
21
|
+
import { parseRtdbRulesJson, stripJsonComments } from '../rtdb/rules-json.js';
|
|
22
22
|
|
|
23
23
|
export type Fixture = PyricVerifyFixture;
|
|
24
24
|
|
|
@@ -358,7 +358,7 @@ async function readFirebaseJsonOrNull(cwd: string): Promise<FirebaseJson | null>
|
|
|
358
358
|
function parseRtdbRulesFile(path: string): { rules: Record<string, unknown> } {
|
|
359
359
|
let parsed: unknown;
|
|
360
360
|
try {
|
|
361
|
-
parsed = JSON.parse(readFileSync(path, 'utf8'));
|
|
361
|
+
parsed = JSON.parse(stripJsonComments(readFileSync(path, 'utf8')));
|
|
362
362
|
} catch (e) {
|
|
363
363
|
throw new Error(`failed to parse RTDB rules JSON at ${path}: ${messageOf(e)}`);
|
|
364
364
|
}
|