@pyric/cli 0.1.0-alpha.26 → 0.1.0-alpha.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (340) hide show
  1. package/README.md +1 -1
  2. package/dist/assurance/.generated/conformance-verdicts.d.ts +5 -0
  3. package/dist/assurance/.generated/conformance-verdicts.d.ts.map +1 -1
  4. package/dist/assurance/.generated/conformance-verdicts.js +5 -0
  5. package/dist/assurance/.generated/conformance-verdicts.js.map +1 -1
  6. package/dist/assurance/capabilities.d.ts.map +1 -1
  7. package/dist/assurance/capabilities.js +24 -5
  8. package/dist/assurance/capabilities.js.map +1 -1
  9. package/dist/assurance/runner.d.ts.map +1 -1
  10. package/dist/assurance/runner.js +37 -50
  11. package/dist/assurance/runner.js.map +1 -1
  12. package/dist/assurance/types.d.ts +5 -0
  13. package/dist/assurance/types.d.ts.map +1 -1
  14. package/dist/assurance/types.js.map +1 -1
  15. package/dist/assurance/validation.d.ts +2 -16
  16. package/dist/assurance/validation.d.ts.map +1 -1
  17. package/dist/assurance/validation.js +121 -1
  18. package/dist/assurance/validation.js.map +1 -1
  19. package/dist/bridge/surface/arguments/assurance.d.ts +31 -6
  20. package/dist/bridge/surface/arguments/assurance.d.ts.map +1 -1
  21. package/dist/bridge/surface/arguments/assurance.js +1 -0
  22. package/dist/bridge/surface/arguments/assurance.js.map +1 -1
  23. package/dist/bridge/surface/arguments/messaging.d.ts +2 -2
  24. package/dist/bridge/surface/methods/assurance/define.d.ts +2 -2
  25. package/dist/bridge/surface/methods/assurance/map.d.ts +29 -6
  26. package/dist/bridge/surface/methods/assurance/map.d.ts.map +1 -1
  27. package/dist/bridge/surface/methods/assurance/propose.d.ts +7 -0
  28. package/dist/bridge/surface/methods/assurance/propose.d.ts.map +1 -1
  29. package/dist/bridge/surface/methods/messaging/send.d.ts +4 -4
  30. package/dist/bridge/surface/render/discriminator-schemas.d.ts +6 -6
  31. package/dist/cli/database-rules.js +1 -1
  32. package/dist/cli/database-rules.js.map +1 -1
  33. package/dist/cli/index.d.ts +1 -0
  34. package/dist/cli/index.d.ts.map +1 -1
  35. package/dist/cli/index.js +28 -3
  36. package/dist/cli/index.js.map +1 -1
  37. package/dist/cli/pyric-config.d.ts +8 -0
  38. package/dist/cli/pyric-config.d.ts.map +1 -1
  39. package/dist/cli/pyric-config.js.map +1 -1
  40. package/dist/cli/run.d.ts +42 -0
  41. package/dist/cli/run.d.ts.map +1 -0
  42. package/dist/cli/run.js +115 -0
  43. package/dist/cli/run.js.map +1 -0
  44. package/dist/cli/serve.d.ts.map +1 -1
  45. package/dist/cli/serve.js +5 -3
  46. package/dist/cli/serve.js.map +1 -1
  47. package/dist/cli/verify.d.ts +6 -0
  48. package/dist/cli/verify.d.ts.map +1 -1
  49. package/dist/cli/verify.js +240 -15
  50. package/dist/cli/verify.js.map +1 -1
  51. package/dist/conformance/.generated/can-i-use.d.ts.map +1 -1
  52. package/dist/conformance/.generated/can-i-use.js +1 -1
  53. package/dist/conformance/.generated/can-i-use.js.map +1 -1
  54. package/dist/conformance/.generated/conformance-docs.d.ts.map +1 -1
  55. package/dist/conformance/.generated/conformance-docs.js +1 -1
  56. package/dist/conformance/.generated/conformance-docs.js.map +1 -1
  57. package/dist/remote/local-storage-url.d.ts +2 -15
  58. package/dist/remote/local-storage-url.d.ts.map +1 -1
  59. package/dist/remote/local-storage-url.js +1 -60
  60. package/dist/remote/local-storage-url.js.map +1 -1
  61. package/dist/serve/assets/avatar-route.d.ts.map +1 -1
  62. package/dist/serve/assets/avatar-route.js +6 -6
  63. package/dist/serve/assets/avatar-route.js.map +1 -1
  64. package/dist/serve/assets/resolver.d.ts +3 -0
  65. package/dist/serve/assets/resolver.d.ts.map +1 -1
  66. package/dist/serve/assets/resolver.js +1 -1
  67. package/dist/serve/assets/resolver.js.map +1 -1
  68. package/dist/serve/entries/app-client.d.ts.map +1 -1
  69. package/dist/serve/entries/app-client.js +6 -0
  70. package/dist/serve/entries/app-client.js.map +1 -1
  71. package/dist/serve/repro/denials.d.ts.map +1 -1
  72. package/dist/serve/repro/denials.js +2 -1
  73. package/dist/serve/repro/denials.js.map +1 -1
  74. package/dist/serve/site-ui/_astro/{app.DFdWhpVY.js → app.BCNb6gMq.js} +1 -1
  75. package/dist/serve/site-ui/_astro/app.DhoRPDdN.js +147 -0
  76. package/dist/serve/site-ui/_astro/{seed.vvXV1ioI.js → seed.BO5CXcqE.js} +1 -1
  77. package/dist/serve/site-ui/auth/index.html +1 -1
  78. package/dist/serve/site-ui/docs/_rhythm/index.html +1 -1
  79. package/dist/serve/site-ui/docs/agent/set-up-your-agent/index.html +1 -1
  80. package/dist/serve/site-ui/docs/agent/watch-and-review/index.html +1 -1
  81. package/dist/serve/site-ui/docs/agent/work-with-an-agent/index.html +1 -1
  82. package/dist/serve/site-ui/docs/ai-compat/index.html +1 -1
  83. package/dist/serve/site-ui/docs/api-reference/index.html +2 -1
  84. package/dist/serve/site-ui/docs/api-reference.md +1 -0
  85. package/dist/serve/site-ui/docs/app-compat/index.html +1 -1
  86. package/dist/serve/site-ui/docs/auth-compat/index.html +2 -2
  87. package/dist/serve/site-ui/docs/auth-compat.md +1 -1
  88. package/dist/serve/site-ui/docs/auth-flutter-compat/index.html +1 -1
  89. package/dist/serve/site-ui/docs/auth-kotlin-compat/index.html +1 -1
  90. package/dist/serve/site-ui/docs/auth-swift-compat/index.html +1 -1
  91. package/dist/serve/site-ui/docs/build/ai-logic/index.html +1 -1
  92. package/dist/serve/site-ui/docs/build/authentication/index.html +1 -1
  93. package/dist/serve/site-ui/docs/build/cloud-firestore/index.html +1 -1
  94. package/dist/serve/site-ui/docs/build/cloud-messaging/index.html +1 -1
  95. package/dist/serve/site-ui/docs/build/cloud-storage/index.html +13 -2
  96. package/dist/serve/site-ui/docs/build/cloud-storage.md +23 -0
  97. package/dist/serve/site-ui/docs/build/default-avatars/index.html +1 -1
  98. package/dist/serve/site-ui/docs/build/inspect-activity/index.html +1 -1
  99. package/dist/serve/site-ui/docs/build/realtime-database/index.html +1 -1
  100. package/dist/serve/site-ui/docs/conformance-scores/index.html +1 -1
  101. package/dist/serve/site-ui/docs/create-pyric-reference-api/index.html +1 -1
  102. package/dist/serve/site-ui/docs/database-compat/index.html +5 -1
  103. package/dist/serve/site-ui/docs/database-compat.md +4 -0
  104. package/dist/serve/site-ui/docs/examples/chess/index.html +1 -1
  105. package/dist/serve/site-ui/docs/examples/index.html +1 -1
  106. package/dist/serve/site-ui/docs/firestore-compat/index.html +1 -1
  107. package/dist/serve/site-ui/docs/firestore-flutter-compat/index.html +1 -1
  108. package/dist/serve/site-ui/docs/firestore-kotlin-compat/index.html +1 -1
  109. package/dist/serve/site-ui/docs/firestore-swift-compat/index.html +1 -1
  110. package/dist/serve/site-ui/docs/functions-rtdb-compat/index.html +1 -1
  111. package/dist/serve/site-ui/docs/get-started/backend-bundlers/index.html +1 -1
  112. package/dist/serve/site-ui/docs/get-started/flutter/index.html +1 -1
  113. package/dist/serve/site-ui/docs/get-started/how-the-swap-works/index.html +1 -1
  114. package/dist/serve/site-ui/docs/get-started/nextjs/index.html +1 -1
  115. package/dist/serve/site-ui/docs/get-started/node-host/index.html +1 -1
  116. package/dist/serve/site-ui/docs/get-started/start-building/index.html +2 -1
  117. package/dist/serve/site-ui/docs/get-started/start-building.md +2 -0
  118. package/dist/serve/site-ui/docs/get-started/vite/index.html +4 -2
  119. package/dist/serve/site-ui/docs/get-started/vite.md +4 -0
  120. package/dist/serve/site-ui/docs/index.json +50 -0
  121. package/dist/serve/site-ui/docs/messaging-compat/index.html +1 -1
  122. package/dist/serve/site-ui/docs/observe/resolve-runtime-status/index.html +1 -1
  123. package/dist/serve/site-ui/docs/observe/see-whats-happening/index.html +1 -1
  124. package/dist/serve/site-ui/docs/observe/shape-your-data/index.html +1 -1
  125. package/dist/serve/site-ui/docs/observe/switch-and-impersonate-identities/index.html +1 -1
  126. package/dist/serve/site-ui/docs/overview/index.html +1 -1
  127. package/dist/serve/site-ui/docs/pyric-admin-app-check-reference-api/index.html +1 -1
  128. package/dist/serve/site-ui/docs/pyric-admin-app-reference-api/index.html +1 -1
  129. package/dist/serve/site-ui/docs/pyric-admin-auth-reference-api/index.html +1 -1
  130. package/dist/serve/site-ui/docs/pyric-admin-data-connect-reference-api/index.html +1 -1
  131. package/dist/serve/site-ui/docs/pyric-admin-database-reference-api/index.html +1 -1
  132. package/dist/serve/site-ui/docs/pyric-admin-eventarc-reference-api/index.html +1 -1
  133. package/dist/serve/site-ui/docs/pyric-admin-extensions-reference-api/index.html +1 -1
  134. package/dist/serve/site-ui/docs/pyric-admin-firestore-reference-api/index.html +1 -1
  135. package/dist/serve/site-ui/docs/pyric-admin-functions-reference-api/index.html +1 -1
  136. package/dist/serve/site-ui/docs/pyric-admin-installations-reference-api/index.html +1 -1
  137. package/dist/serve/site-ui/docs/pyric-admin-instance-id-reference-api/index.html +1 -1
  138. package/dist/serve/site-ui/docs/pyric-admin-machine-learning-reference-api/index.html +1 -1
  139. package/dist/serve/site-ui/docs/pyric-admin-messaging-reference-api/index.html +1 -1
  140. package/dist/serve/site-ui/docs/pyric-admin-phone-number-verification-reference-api/index.html +1 -1
  141. package/dist/serve/site-ui/docs/pyric-admin-project-management-reference-api/index.html +1 -1
  142. package/dist/serve/site-ui/docs/pyric-admin-reference-api/index.html +1 -1
  143. package/dist/serve/site-ui/docs/pyric-admin-remote-config-reference-api/index.html +1 -1
  144. package/dist/serve/site-ui/docs/pyric-admin-security-rules-reference-api/index.html +1 -1
  145. package/dist/serve/site-ui/docs/pyric-admin-storage-reference-api/index.html +1 -1
  146. package/dist/serve/site-ui/docs/pyric-ai-reference-api/index.html +1 -1
  147. package/dist/serve/site-ui/docs/pyric-ai-scripting-reference-api/index.html +1 -1
  148. package/dist/serve/site-ui/docs/pyric-analytics-reference-api/index.html +1 -1
  149. package/dist/serve/site-ui/docs/pyric-app-check-reference-api/index.html +1 -1
  150. package/dist/serve/site-ui/docs/pyric-app-reference-api/index.html +1 -1
  151. package/dist/serve/site-ui/docs/pyric-auth-reference-api/index.html +2 -2
  152. package/dist/serve/site-ui/docs/pyric-auth-reference-api.md +1 -1
  153. package/dist/serve/site-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +1 -1
  154. package/dist/serve/site-ui/docs/pyric-cli-assurance-reference-api/index.html +24 -5
  155. package/dist/serve/site-ui/docs/pyric-cli-assurance-reference-api.md +11 -4
  156. package/dist/serve/site-ui/docs/pyric-cli-bridge-client-reference-api/index.html +1 -1
  157. package/dist/serve/site-ui/docs/pyric-cli-bridge-reference-api/index.html +1 -1
  158. package/dist/serve/site-ui/docs/pyric-cli-bundler-reference-api/index.html +1 -1
  159. package/dist/serve/site-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +1 -1
  160. package/dist/serve/site-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +1 -1
  161. package/dist/serve/site-ui/docs/pyric-cli-conformance-reference-api/index.html +1 -1
  162. package/dist/serve/site-ui/docs/pyric-cli-credentials-node-reference-api/index.html +1 -1
  163. package/dist/serve/site-ui/docs/pyric-cli-discover-reference-api/index.html +1 -1
  164. package/dist/serve/site-ui/docs/pyric-cli-flow-reference-api/index.html +1 -1
  165. package/dist/serve/site-ui/docs/pyric-cli-next-reference-api/index.html +1 -1
  166. package/dist/serve/site-ui/docs/pyric-cli-register-app-bridge-reference-api/index.html +1 -1
  167. package/dist/serve/site-ui/docs/pyric-cli-register-client-app-bridge-reference-api/index.html +1 -1
  168. package/dist/serve/site-ui/docs/pyric-cli-register-client-app-reference-api/index.html +1 -1
  169. package/dist/serve/site-ui/docs/pyric-cli-register-client-auth-reference-api/index.html +1 -1
  170. package/dist/serve/site-ui/docs/pyric-cli-register-client-database-reference-api/index.html +1 -1
  171. package/dist/serve/site-ui/docs/pyric-cli-register-client-firestore-reference-api/index.html +1 -1
  172. package/dist/serve/site-ui/docs/pyric-cli-register-client-storage-reference-api/index.html +1 -1
  173. package/dist/serve/site-ui/docs/pyric-cli-register-reference-api/index.html +1 -1
  174. package/dist/serve/site-ui/docs/pyric-cli-remote-reference-api/index.html +1 -1
  175. package/dist/serve/site-ui/docs/pyric-cli-repro-reference-api/index.html +1 -1
  176. package/dist/serve/site-ui/docs/pyric-cli-serve-worker-reference-api/index.html +1 -1
  177. package/dist/serve/site-ui/docs/pyric-cli-verify-reference-api/index.html +16 -3
  178. package/dist/serve/site-ui/docs/pyric-cli-verify-reference-api.md +11 -10
  179. package/dist/serve/site-ui/docs/pyric-cli-vite-reference-api/index.html +17 -3
  180. package/dist/serve/site-ui/docs/pyric-cli-vite-reference-api.md +7 -5
  181. package/dist/serve/site-ui/docs/pyric-cli-vite-ssr-loader-reference-api/index.html +1 -1
  182. package/dist/serve/site-ui/docs/pyric-database-reference-api/index.html +1 -1
  183. package/dist/serve/site-ui/docs/pyric-firestore-lite-reference-api/index.html +1 -1
  184. package/dist/serve/site-ui/docs/pyric-firestore-reference-api/index.html +1 -1
  185. package/dist/serve/site-ui/docs/pyric-functions-reference-api/index.html +1 -1
  186. package/dist/serve/site-ui/docs/pyric-messaging-reference-api/index.html +1 -1
  187. package/dist/serve/site-ui/docs/pyric-messaging-sw-reference-api/index.html +1 -1
  188. package/dist/serve/site-ui/docs/pyric-performance-reference-api/index.html +1 -1
  189. package/dist/serve/site-ui/docs/pyric-remote-config-reference-api/index.html +1 -1
  190. package/dist/serve/site-ui/docs/pyric-rules-reference-api/index.html +1 -1
  191. package/dist/serve/site-ui/docs/pyric-sandbox-branches-store-reference-api/index.html +1 -1
  192. package/dist/serve/site-ui/docs/pyric-sandbox-checkpoints-directory-reference-api/index.html +1 -1
  193. package/dist/serve/site-ui/docs/pyric-sandbox-checkpoints-reference-api/index.html +1 -1
  194. package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api/index.html +1 -1
  195. package/dist/serve/site-ui/docs/pyric-sandbox-firestore-reference-api/index.html +1 -1
  196. package/dist/serve/site-ui/docs/pyric-sandbox-reference-api/index.html +1 -1
  197. package/dist/serve/site-ui/docs/pyric-storage-reference-api/index.html +1 -1
  198. package/dist/serve/site-ui/docs/pyric-storage-sw-reference-api/index.html +102 -0
  199. package/dist/serve/site-ui/docs/pyric-storage-sw-reference-api.md +76 -0
  200. package/dist/serve/site-ui/docs/pyric-ui-agents-reference-api/index.html +1 -1
  201. package/dist/serve/site-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +1 -1
  202. package/dist/serve/site-ui/docs/pyric-ui-auth-reference-api/index.html +1 -1
  203. package/dist/serve/site-ui/docs/pyric-ui-events-hooks-reference-api/index.html +1 -1
  204. package/dist/serve/site-ui/docs/pyric-ui-events-reference-api/index.html +1 -1
  205. package/dist/serve/site-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +1 -1
  206. package/dist/serve/site-ui/docs/pyric-ui-firestore-reference-api/index.html +1 -1
  207. package/dist/serve/site-ui/docs/pyric-ui-listener-owner-reference-api/index.html +1 -1
  208. package/dist/serve/site-ui/docs/pyric-ui-primitives-reference-api/index.html +1 -1
  209. package/dist/serve/site-ui/docs/pyric-ui-rtdb-reference-api/index.html +1 -1
  210. package/dist/serve/site-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +1 -1
  211. package/dist/serve/site-ui/docs/pyric-ui-rules-reference-api/index.html +1 -1
  212. package/dist/serve/site-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +1 -1
  213. package/dist/serve/site-ui/docs/pyric-ui-storage-reference-api/index.html +1 -1
  214. package/dist/serve/site-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +1 -1
  215. package/dist/serve/site-ui/docs/pyric-ui-traffic-reference-api/index.html +1 -1
  216. package/dist/serve/site-ui/docs/reference/cli/index.html +12 -2
  217. package/dist/serve/site-ui/docs/reference/cli.md +24 -0
  218. package/dist/serve/site-ui/docs/rtdb-flutter-compat/index.html +1 -1
  219. package/dist/serve/site-ui/docs/rtdb-kotlin-compat/index.html +1 -1
  220. package/dist/serve/site-ui/docs/rtdb-swift-compat/index.html +1 -1
  221. package/dist/serve/site-ui/docs/rules-compat/index.html +1 -1
  222. package/dist/serve/site-ui/docs/secure/audit-your-rules/index.html +1 -1
  223. package/dist/serve/site-ui/docs/secure/firestore-rules-limits/index.html +1 -1
  224. package/dist/serve/site-ui/docs/secure/read-a-denial/index.html +1 -1
  225. package/dist/serve/site-ui/docs/secure/rtdb-rules-in-typescript/index.html +1 -1
  226. package/dist/serve/site-ui/docs/secure/rtdb-rules-standard-library/index.html +1 -1
  227. package/dist/serve/site-ui/docs/secure/rules-standard-library/index.html +1 -1
  228. package/dist/serve/site-ui/docs/secure/secure-it-with-rules/index.html +1 -1
  229. package/dist/serve/site-ui/docs/secure/simulate-and-lint/index.html +1 -1
  230. package/dist/serve/site-ui/docs/secure/write-a-rules-test-suite/index.html +2 -2
  231. package/dist/serve/site-ui/docs/secure/write-a-rules-test-suite.md +1 -1
  232. package/dist/serve/site-ui/docs/ship/ship-to-production/index.html +5 -2
  233. package/dist/serve/site-ui/docs/ship/ship-to-production.md +7 -1
  234. package/dist/serve/site-ui/docs/ship/test-in-node/index.html +1 -1
  235. package/dist/serve/site-ui/docs/storage-compat/index.html +1 -1
  236. package/dist/serve/site-ui/docs/trust/how-we-know-it-matches-firebase/index.html +1 -1
  237. package/dist/serve/site-ui/docs/trust/rules-standard-library/index.html +1 -1
  238. package/dist/serve/site-ui/docs/trust/versioning-and-compatibility/index.html +1 -1
  239. package/dist/serve/site-ui/docs/tutorial/index.html +1 -1
  240. package/dist/serve/site-ui/examples/chess/index.html +1 -1
  241. package/dist/serve/site-ui/firestore/index.html +1 -1
  242. package/dist/serve/site-ui/llms.txt +1 -0
  243. package/dist/serve/site-ui/rtdb/index.html +1 -1
  244. package/dist/serve/site-ui/settings/index.html +1 -1
  245. package/dist/serve/site-ui/storage/index.html +1 -1
  246. package/dist/serve/site-ui/studio/index.html +1 -1
  247. package/dist/serve/site-ui/traffic/index.html +1 -1
  248. package/dist/serve/verify-hint.d.ts +2 -0
  249. package/dist/serve/verify-hint.d.ts.map +1 -0
  250. package/dist/serve/verify-hint.js +10 -0
  251. package/dist/serve/verify-hint.js.map +1 -0
  252. package/dist/serve/vite-generation-rules-watch.d.ts.map +1 -1
  253. package/dist/serve/vite-generation-rules-watch.js +5 -3
  254. package/dist/serve/vite-generation-rules-watch.js.map +1 -1
  255. package/dist/serve/vite-plugin.d.ts +6 -0
  256. package/dist/serve/vite-plugin.d.ts.map +1 -1
  257. package/dist/serve/vite-plugin.js +11 -1
  258. package/dist/serve/vite-plugin.js.map +1 -1
  259. package/dist/serve/vite-service-worker.d.ts +12 -0
  260. package/dist/serve/vite-service-worker.d.ts.map +1 -0
  261. package/dist/serve/vite-service-worker.js +33 -0
  262. package/dist/serve/vite-service-worker.js.map +1 -0
  263. package/dist/serve/worker/client/auth.d.ts.map +1 -1
  264. package/dist/serve/worker/client/auth.js +4 -3
  265. package/dist/serve/worker/client/auth.js.map +1 -1
  266. package/dist/serve/worker/host/auth-action-codes.js +2 -2
  267. package/dist/serve/worker/host/auth-action-codes.js.map +1 -1
  268. package/dist/serve/worker/host/auth-custom-token.d.ts.map +1 -1
  269. package/dist/serve/worker/host/auth-custom-token.js +4 -2
  270. package/dist/serve/worker/host/auth-custom-token.js.map +1 -1
  271. package/dist/serve/worker/host/dispatch.d.ts.map +1 -1
  272. package/dist/serve/worker/host/dispatch.js +3 -1
  273. package/dist/serve/worker/host/dispatch.js.map +1 -1
  274. package/dist/serve/worker/host-auth.d.ts +6 -0
  275. package/dist/serve/worker/host-auth.d.ts.map +1 -1
  276. package/dist/serve/worker/host-auth.js +16 -5
  277. package/dist/serve/worker/host-auth.js.map +1 -1
  278. package/dist/serve/worker/inbound-validation.d.ts.map +1 -1
  279. package/dist/serve/worker/inbound-validation.js +1 -0
  280. package/dist/serve/worker/inbound-validation.js.map +1 -1
  281. package/dist/serve/worker/protocol/storage.d.ts +1 -8
  282. package/dist/serve/worker/protocol/storage.d.ts.map +1 -1
  283. package/dist/serve/worker/protocol/storage.js +2 -14
  284. package/dist/serve/worker/protocol/storage.js.map +1 -1
  285. package/dist/serve/worker/protocol.d.ts +2 -0
  286. package/dist/serve/worker/protocol.d.ts.map +1 -1
  287. package/dist/serve/worker/protocol.js.map +1 -1
  288. package/dist/verify/index.d.ts +16 -2
  289. package/dist/verify/index.d.ts.map +1 -1
  290. package/dist/verify/index.js +100 -18
  291. package/dist/verify/index.js.map +1 -1
  292. package/dist/verify/staging/engine.d.ts +102 -0
  293. package/dist/verify/staging/engine.d.ts.map +1 -0
  294. package/dist/verify/staging/engine.js +371 -0
  295. package/dist/verify/staging/engine.js.map +1 -0
  296. package/dist/verify/staging/rest.d.ts +68 -0
  297. package/dist/verify/staging/rest.d.ts.map +1 -0
  298. package/dist/verify/staging/rest.js +93 -0
  299. package/dist/verify/staging/rest.js.map +1 -0
  300. package/dist/verify/staging/target.d.ts +39 -0
  301. package/dist/verify/staging/target.d.ts.map +1 -0
  302. package/dist/verify/staging/target.js +117 -0
  303. package/dist/verify/staging/target.js.map +1 -0
  304. package/package.json +12 -8
  305. package/src/assurance/.generated/conformance-verdicts.ts +5 -0
  306. package/src/assurance/capabilities.ts +22 -4
  307. package/src/assurance/runner.ts +40 -58
  308. package/src/assurance/types.ts +3 -0
  309. package/src/assurance/validation.ts +137 -0
  310. package/src/bridge/surface/arguments/assurance.ts +1 -0
  311. package/src/cli/database-rules.ts +1 -1
  312. package/src/cli/index.ts +28 -3
  313. package/src/cli/pyric-config.ts +5 -0
  314. package/src/cli/run.ts +139 -0
  315. package/src/cli/serve.ts +6 -3
  316. package/src/cli/verify.ts +244 -18
  317. package/src/conformance/.generated/can-i-use.ts +1 -1
  318. package/src/conformance/.generated/conformance-docs.ts +1 -1
  319. package/src/remote/local-storage-url.ts +1 -58
  320. package/src/serve/assets/avatar-route.ts +6 -7
  321. package/src/serve/assets/resolver.ts +4 -1
  322. package/src/serve/entries/app-client.ts +7 -0
  323. package/src/serve/repro/denials.ts +2 -1
  324. package/src/serve/verify-hint.ts +8 -0
  325. package/src/serve/vite-generation-rules-watch.ts +6 -3
  326. package/src/serve/vite-plugin.ts +15 -1
  327. package/src/serve/vite-service-worker.ts +44 -0
  328. package/src/serve/worker/client/auth.ts +4 -3
  329. package/src/serve/worker/host/auth-action-codes.ts +2 -2
  330. package/src/serve/worker/host/auth-custom-token.ts +4 -2
  331. package/src/serve/worker/host/dispatch.ts +2 -0
  332. package/src/serve/worker/host-auth.ts +18 -5
  333. package/src/serve/worker/inbound-validation.ts +1 -0
  334. package/src/serve/worker/protocol/storage.ts +2 -14
  335. package/src/serve/worker/protocol.ts +2 -0
  336. package/src/verify/index.ts +119 -19
  337. package/src/verify/staging/engine.ts +455 -0
  338. package/src/verify/staging/rest.ts +129 -0
  339. package/src/verify/staging/target.ts +137 -0
  340. package/dist/serve/site-ui/_astro/app.BpEphDR7.js +0 -147
@@ -0,0 +1,371 @@
1
+ import { rewoundRtdbTree, rtdbAuthVariable, rtdbReplaySteps, rtdbStateDrift, } from 'pyric/rules/internal/rtdb';
2
+ import { isRestDenial } from './rest.js';
3
+ /** The comment `pyric verify staging init` puts at the top of the instance's rules. */
4
+ export const STAGING_MARKER_PREFIX = '/* pyric verify staging:';
5
+ export function stagingMarker(projectId, at = new Date()) {
6
+ return `${STAGING_MARKER_PREFIX} this instance is dedicated to \`pyric verify --engine staging\` for project ${projectId}, enrolled ${at.toISOString()}. Its rules and data are replaced while a verification runs. */`;
7
+ }
8
+ /** The project an enrollment marker names, or undefined when the rules carry no marker. */
9
+ export function markedProject(rulesText) {
10
+ const trimmed = rulesText.trimStart();
11
+ if (!trimmed.startsWith(STAGING_MARKER_PREFIX))
12
+ return undefined;
13
+ return /for project ([^\s,]+),/.exec(trimmed.slice(0, trimmed.indexOf('*/') + 2))?.[1];
14
+ }
15
+ export class StagingSafetyError extends Error {
16
+ constructor(message) {
17
+ super(message);
18
+ this.name = 'StagingSafetyError';
19
+ }
20
+ }
21
+ /** Production refused to deploy the candidate rules; its message is the reason. */
22
+ export class StagingDeployRefusedError extends Error {
23
+ instanceLabel;
24
+ production;
25
+ constructor(instanceLabel, production) {
26
+ super(`production refused to deploy the candidate rules for ${instanceLabel}: ${production}`);
27
+ this.instanceLabel = instanceLabel;
28
+ this.production = production;
29
+ this.name = 'StagingDeployRefusedError';
30
+ }
31
+ }
32
+ /** The data node a run holds while it runs; written with a conditional request, so only one run gets it. */
33
+ export const STAGING_LEASE_KEY = '__pyric_verify_lease__';
34
+ /**
35
+ * Run `fn` against the staging instance behind `client`, guarded: refuse an
36
+ * instance without the marker for `projectId`, with data, or with another
37
+ * run's lease; on every exit restore its rules and delete its data, each step
38
+ * attempted on its own and retried, then read both back.
39
+ */
40
+ export async function withStagingInstance(client, projectId, fn, hooks = {}) {
41
+ const priorRules = await client.getRulesText();
42
+ const marked = markedProject(priorRules);
43
+ if (marked === undefined) {
44
+ throw new StagingSafetyError(`${client.databaseUrl} is not enrolled for staging verification (its rules do not start with the enrollment marker). ` +
45
+ 'Run `pyric verify staging init` once to enroll a dedicated, empty instance. If a verification was interrupted, run `pyric verify staging restore`.');
46
+ }
47
+ if (marked !== projectId) {
48
+ throw new StagingSafetyError(`${client.databaseUrl} is enrolled for project ${marked}, not ${projectId}.`);
49
+ }
50
+ const root = await client.get('/', { shallow: true });
51
+ if (root.status !== 200)
52
+ throw new StagingSafetyError(`reading ${client.databaseUrl} failed: HTTP ${root.status} ${root.text.slice(0, 200)}`);
53
+ if (root.body !== null) {
54
+ const leased = typeof root.body === 'object' && root.body !== null && STAGING_LEASE_KEY in root.body;
55
+ throw new StagingSafetyError(leased
56
+ ? `another verification holds ${client.databaseUrl} (its lease is set). Wait for it to finish; if none is running, run \`pyric verify staging restore\`.`
57
+ : `${client.databaseUrl} holds data, so it is not a dedicated staging instance. Refusing to replace it.`);
58
+ }
59
+ const lease = { run: `${process.pid}-${Date.now().toString(36)}`, at: new Date().toISOString() };
60
+ const empty = await client.get(STAGING_LEASE_KEY, { etag: true });
61
+ const taken = empty.etag === undefined
62
+ ? { status: 0, text: 'no ETag', body: null }
63
+ : await client.put(STAGING_LEASE_KEY, lease, { ifMatch: empty.etag });
64
+ if (taken.status !== 200) {
65
+ throw new StagingSafetyError(taken.status === 412
66
+ ? `another verification took ${client.databaseUrl} first. Run one verification at a time per staging instance.`
67
+ : `taking the lease on ${client.databaseUrl} failed: HTTP ${taken.status} ${String(taken.text).slice(0, 200)}`);
68
+ }
69
+ hooks.onBeforeChange?.(priorRules);
70
+ let outcome;
71
+ try {
72
+ outcome = { ok: true, value: await fn() };
73
+ }
74
+ catch (error) {
75
+ outcome = { ok: false, error };
76
+ }
77
+ const invariants = await restoreStagingInstance(client, priorRules);
78
+ if (!invariants.rulesRestored || !invariants.dataRemoved) {
79
+ throw new StagingSafetyError(`${client.databaseUrl} was not left as it was found (rules restored: ${invariants.rulesRestored}, data removed: ${invariants.dataRemoved}${invariants.errors.length > 0 ? `; ${invariants.errors.join('; ')}` : ''}). ` +
80
+ 'Run `pyric verify staging restore` to put it back.');
81
+ }
82
+ hooks.onRestored?.();
83
+ if (!outcome.ok)
84
+ throw outcome.error;
85
+ return { result: outcome.value, invariants: { rulesRestored: true, dataRemoved: true } };
86
+ }
87
+ /**
88
+ * Put a staging instance back: deploy `rulesText` first, since candidate
89
+ * rules may be open, then delete the data; each step on its own, retried,
90
+ * and read back. Never throws: the result says what holds.
91
+ */
92
+ export async function restoreStagingInstance(client, rulesText) {
93
+ const errors = [];
94
+ const attempt = async (what, step) => {
95
+ let last = '';
96
+ for (let tries = 0; tries < 3; tries += 1) {
97
+ try {
98
+ if (await step())
99
+ return true;
100
+ last = 'did not read back';
101
+ }
102
+ catch (error) {
103
+ last = error instanceof Error ? error.message : String(error);
104
+ }
105
+ await new Promise((resolve) => setTimeout(resolve, 250 * (tries + 1)));
106
+ }
107
+ errors.push(`${what}: ${last}`);
108
+ return false;
109
+ };
110
+ const rulesRestored = await attempt('restoring the rules', async () => {
111
+ const put = await client.putRules(rulesText);
112
+ return put.status === 200 && (await client.getRulesText()) === rulesText;
113
+ });
114
+ const dataRemoved = await attempt('deleting the data', async () => {
115
+ const removed = await client.delete('/');
116
+ const back = await client.get('/', { shallow: true });
117
+ return removed.status === 200 && back.status === 200 && back.body === null;
118
+ });
119
+ return { rulesRestored, dataRemoved, errors };
120
+ }
121
+ /**
122
+ * Replay one captured instance's steps against the staging instance under
123
+ * `rules`. Call inside `withStagingInstance`; the instance must be empty.
124
+ */
125
+ export async function runStagingInstance(input) {
126
+ const { client, events } = input;
127
+ const label = input.instance === undefined ? 'the default instance' : `instance "${input.instance}"`;
128
+ const source = JSON.stringify(input.rules, null, 2);
129
+ const dry = await client.putRules(source, { dryRun: true });
130
+ if (dry.status !== 200)
131
+ throw new StagingDeployRefusedError(label, productionMessage(dry));
132
+ const deployed = await client.putRules(source);
133
+ if (deployed.status !== 200)
134
+ throw new StagingDeployRefusedError(label, productionMessage(deployed));
135
+ const lease = (await expectOk(client.get(STAGING_LEASE_KEY), 'reading the lease')).body;
136
+ if (input.capturedState !== undefined) {
137
+ const initial = await rewoundRtdbTree(events, input.capturedState, input.instance);
138
+ if (initial !== null)
139
+ await expectOk(client.put('/', withLease(initial, lease)), 'seeding the session\'s starting tree');
140
+ }
141
+ const divergences = [];
142
+ let checkedEvents = 0;
143
+ const steps = rtdbReplaySteps(events, input.instance);
144
+ for (const [index, step] of steps.entries()) {
145
+ input.signal?.throwIfAborted();
146
+ const before = divergences.length;
147
+ if (step.kind === 'admin-commit') {
148
+ const res = await writeCommit(client, step.event, undefined, lease);
149
+ if (typeof res === 'string')
150
+ divergences.push({ kind: 'unsupported', path: pathOf(step.event), method: step.event.method, reason: res });
151
+ else
152
+ await expectOk(Promise.resolve(res), `the admin ${step.event.method} at ${step.event.path}`);
153
+ }
154
+ else if (step.kind === 'app-commit') {
155
+ checkedEvents += 1;
156
+ const res = await writeCommit(client, step.event, authOverride(step.event), lease);
157
+ if (typeof res === 'string')
158
+ divergences.push({ kind: 'unsupported', path: pathOf(step.event), method: step.event.method, reason: res });
159
+ else if (isRestDenial(res.status))
160
+ divergences.push(denied(step.event, res));
161
+ else if (res.status !== 200)
162
+ divergences.push(unsupported(step.event, res));
163
+ }
164
+ else if (step.kind === 'allowed-read') {
165
+ checkedEvents += 1;
166
+ const query = restQuery(step.event);
167
+ if (typeof query === 'string') {
168
+ divergences.push({ kind: 'unsupported', path: pathOf(step.event), method: step.event.method, reason: query });
169
+ }
170
+ else {
171
+ const res = await client.get(pathOf(step.event), { auth: authOverride(step.event), query });
172
+ if (isRestDenial(res.status))
173
+ divergences.push(denied(step.event, res));
174
+ else if (res.status !== 200)
175
+ divergences.push(unsupported(step.event, res));
176
+ }
177
+ }
178
+ else {
179
+ checkedEvents += 1;
180
+ await decide(client, step.event, step.kind === 'denial' ? 'deny' : 'allow', divergences, lease);
181
+ }
182
+ // Each divergence names the replay step it came from, so engines compare step for step.
183
+ for (const divergence of divergences.slice(before))
184
+ divergence.step = index;
185
+ }
186
+ if (input.capturedState !== undefined) {
187
+ const finalTree = await expectOk(client.get('/'), 'reading the replayed tree');
188
+ divergences.push(...rtdbStateDrift(input.capturedState, withoutLease(finalTree.body)));
189
+ }
190
+ return { checkedEvents, divergences };
191
+ }
192
+ /** A tree with the run's lease kept at the root, so a root write does not release it. */
193
+ function withLease(tree, lease) {
194
+ if (lease === null || lease === undefined)
195
+ return tree;
196
+ if (tree === null || tree === undefined)
197
+ return { [STAGING_LEASE_KEY]: lease };
198
+ if (!isObject(tree))
199
+ return tree;
200
+ return { ...tree, [STAGING_LEASE_KEY]: lease };
201
+ }
202
+ function withoutLease(tree) {
203
+ if (!isObject(tree) || !(STAGING_LEASE_KEY in tree))
204
+ return tree;
205
+ const { [STAGING_LEASE_KEY]: _lease, ...rest } = tree;
206
+ return Object.keys(rest).length === 0 ? null : rest;
207
+ }
208
+ /**
209
+ * Attempt a captured denial or registration as its user. A write that lands
210
+ * is put back as admin from the subtree read before it.
211
+ */
212
+ async function decide(client, event, captured, divergences, lease) {
213
+ const path = pathOf(event);
214
+ const auth = authOverride(event);
215
+ let res;
216
+ if (event.method === 'get' || event.method === 'listen') {
217
+ const query = restQuery(event);
218
+ if (typeof query === 'string') {
219
+ divergences.push({ kind: 'unsupported', path, method: event.method, reason: query });
220
+ return;
221
+ }
222
+ res = await client.get(path, { auth, query });
223
+ }
224
+ else {
225
+ const write = attemptedWrite(event);
226
+ if (typeof write === 'string') {
227
+ divergences.push({ kind: 'unsupported', path, method: event.method, reason: write });
228
+ return;
229
+ }
230
+ const before = await expectOk(client.get(write.restorePath, { format: 'export' }), `reading ${write.restorePath} before the attempt`);
231
+ res = await write.send(client, auth);
232
+ if (res.status === 200) {
233
+ const restored = write.restorePath === '/' ? withLease(before.body, lease) : before.body;
234
+ await expectOk(client.put(write.restorePath, restored), `putting ${write.restorePath} back after the attempt`);
235
+ }
236
+ }
237
+ if (res.status === 200) {
238
+ if (captured === 'deny') {
239
+ divergences.push({
240
+ kind: 'now-allowed',
241
+ path,
242
+ method: event.method,
243
+ reason: 'the captured rules denied this operation; production allows it under the candidate rules.',
244
+ });
245
+ }
246
+ }
247
+ else if (isRestDenial(res.status)) {
248
+ if (captured === 'allow')
249
+ divergences.push(denied(event, res));
250
+ }
251
+ else {
252
+ divergences.push(unsupported(event, res));
253
+ }
254
+ }
255
+ function attemptedWrite(event) {
256
+ const path = pathOf(event);
257
+ const data = event.request?.data;
258
+ const detail = (event.detail ?? {});
259
+ switch (event.method) {
260
+ case 'set':
261
+ case 'transaction':
262
+ return { restorePath: path, send: (client, auth) => client.put(path, withPriority(data ?? null, detail.priority), { auth }) };
263
+ case 'onDisconnect.set':
264
+ return { restorePath: path, send: (client, auth) => client.put(path, withPriority(data ?? null, detail.priority), { auth }) };
265
+ case 'remove':
266
+ case 'onDisconnect.remove':
267
+ return { restorePath: path, send: (client, auth) => client.delete(path, { auth }) };
268
+ case 'update':
269
+ if (!isObject(detail.patch) || typeof detail.rootPath !== 'string') {
270
+ return 'the capture records only the denied path of this update, not the paths written with it, so the update cannot be rebuilt.';
271
+ }
272
+ return { restorePath: detail.rootPath, send: (client, auth) => client.patch(detail.rootPath, detail.patch, { auth }) };
273
+ case 'onDisconnect.update':
274
+ if (!isObject(data))
275
+ return 'the captured onDisconnect update did not contain an object patch.';
276
+ return { restorePath: path, send: (client, auth) => client.patch(path, data, { auth }) };
277
+ case 'setPriority':
278
+ return { restorePath: path, send: (client, auth) => client.put(`${path}/.priority`, data ?? null, { auth }) };
279
+ default:
280
+ return `the staging engine does not check '${event.method}' operations.`;
281
+ }
282
+ }
283
+ /** Perform a captured commit; the reason it cannot be performed when its method is not one replay handles. */
284
+ async function writeCommit(client, commit, auth, lease) {
285
+ const path = commit.path ?? '/';
286
+ const atRoot = path === '/';
287
+ const request = auth === undefined ? {} : { auth };
288
+ const detail = commit.detail ?? {};
289
+ switch (commit.method) {
290
+ case 'update':
291
+ return client.patch(path, commit.data, request);
292
+ case 'remove':
293
+ // Removing the root as admin keeps the lease; a user's removal is decided as a write of nothing.
294
+ return atRoot ? client.put(path, withLease(null, lease), request) : client.delete(path, request);
295
+ case 'setPriority':
296
+ return client.put(`${path}/.priority`, commit.data ?? null, request);
297
+ case 'transaction':
298
+ return client.put(path, atRoot ? withLease(commit.data ?? null, lease) : commit.data ?? null, request);
299
+ case 'set': {
300
+ const value = withPriority(commit.data ?? null, Object.hasOwn(detail, 'priority') ? detail.priority : undefined);
301
+ return client.put(path, atRoot ? withLease(value, lease) : value, request);
302
+ }
303
+ default:
304
+ return `the staging engine does not replay '${commit.method}' commits.`;
305
+ }
306
+ }
307
+ /** A value with a `.priority`, in the shape the REST API reads it; the value itself when there is none. */
308
+ function withPriority(value, priority) {
309
+ if (priority === undefined || priority === null)
310
+ return value;
311
+ if (isObject(value))
312
+ return { ...value, '.priority': priority };
313
+ return { '.value': value, '.priority': priority };
314
+ }
315
+ /** The REST query parameters for a captured query, or the reason REST cannot express it. */
316
+ function restQuery(event) {
317
+ const spec = event.request?.query;
318
+ if (spec === undefined)
319
+ return undefined;
320
+ const query = {};
321
+ const order = spec.orderBy;
322
+ if (order === null) {
323
+ if (spec.bounds.length > 0 || spec.limit !== null)
324
+ query.orderBy = JSON.stringify('$priority');
325
+ }
326
+ else if (order.kind === 'child') {
327
+ query.orderBy = JSON.stringify(order.path);
328
+ }
329
+ else {
330
+ query.orderBy = JSON.stringify(`$${order.kind}`);
331
+ }
332
+ for (const bound of spec.bounds) {
333
+ if (bound.key !== undefined)
334
+ return `the REST API cannot express a ${bound.kind} bound with a key.`;
335
+ if (bound.kind !== 'startAt' && bound.kind !== 'endAt' && bound.kind !== 'equalTo') {
336
+ return `the REST API has no ${bound.kind} parameter.`;
337
+ }
338
+ query[bound.kind] = JSON.stringify(bound.value);
339
+ }
340
+ if (spec.limit !== null)
341
+ query[spec.limit.kind] = String(spec.limit.n);
342
+ return query;
343
+ }
344
+ function authOverride(event) {
345
+ if (event.auth === null)
346
+ return null;
347
+ return rtdbAuthVariable(event.auth, typeof event.at === 'number' ? event.at : Date.now());
348
+ }
349
+ function pathOf(event) {
350
+ return event.path ?? '/';
351
+ }
352
+ function denied(event, res) {
353
+ return { kind: 'now-denied', path: pathOf(event), method: event.method, reason: `production denied it under the candidate rules (HTTP ${res.status}).` };
354
+ }
355
+ function unsupported(event, res) {
356
+ return { kind: 'unsupported', path: pathOf(event), method: event.method, reason: `production answered HTTP ${res.status}: ${productionMessage(res)}` };
357
+ }
358
+ function productionMessage(res) {
359
+ const error = isObject(res.body) ? res.body.error : undefined;
360
+ return (typeof error === 'string' ? error : res.text).slice(0, 500);
361
+ }
362
+ async function expectOk(pending, what) {
363
+ const res = await pending;
364
+ if (res.status !== 200)
365
+ throw new Error(`staging engine: ${what} failed: HTTP ${res.status} ${productionMessage(res)}`);
366
+ return res;
367
+ }
368
+ function isObject(value) {
369
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
370
+ }
371
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/verify/staging/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * A minimal Realtime Database REST client for the staging engine: data reads
3
+ * and writes as admin or as an application user (`auth_variable_override`),
4
+ * and the rules endpoint (`/.settings/rules.json`).
5
+ *
6
+ * Production applies an `auth_variable_override` object as the rules `auth`
7
+ * variable, `auth.token` claims included; the identity capture recorded in
8
+ * `packages/conformance/observations/rtdb-staging/rtdb-staging-auth-override.json`
9
+ * pins that for every field the engine passes.
10
+ */
11
+ /** The rules `auth` variable a request runs as; `null` is signed out. Absent is admin. */
12
+ export type RtdbAuthOverride = Record<string, unknown> | null;
13
+ export interface RtdbRestResponse {
14
+ status: number;
15
+ /** Parsed JSON body, or the raw text when it is not JSON. */
16
+ body: unknown;
17
+ text: string;
18
+ /** The `ETag` of the location, when the request asked for it (`etag: true`). */
19
+ etag?: string;
20
+ }
21
+ export interface RtdbRestRequest {
22
+ /** Run as this `auth`; absent runs as admin. */
23
+ auth?: RtdbAuthOverride;
24
+ /** REST query parameters (`orderBy`, `startAt`, ...), already JSON-encoded where REST requires it. */
25
+ query?: Record<string, string>;
26
+ /** `export` returns priorities as `.priority` keys. */
27
+ format?: 'export';
28
+ shallow?: boolean;
29
+ /** Ask for the location's `ETag` (a read), for a later conditional write. */
30
+ etag?: boolean;
31
+ /** Write only if the location's `ETag` is still this one; production answers 412 otherwise. */
32
+ ifMatch?: string;
33
+ }
34
+ export type FetchLike = (url: string, init: {
35
+ method: string;
36
+ headers: Record<string, string>;
37
+ body?: string;
38
+ }) => Promise<{
39
+ status: number;
40
+ text(): Promise<string>;
41
+ headers?: {
42
+ get(name: string): string | null;
43
+ };
44
+ }>;
45
+ export declare class RtdbRestClient {
46
+ private readonly token;
47
+ private readonly fetchImpl;
48
+ readonly databaseUrl: string;
49
+ constructor(databaseUrl: string, token: () => Promise<string>, fetchImpl?: FetchLike);
50
+ get(path: string, request?: RtdbRestRequest): Promise<RtdbRestResponse>;
51
+ put(path: string, value: unknown, request?: RtdbRestRequest): Promise<RtdbRestResponse>;
52
+ patch(path: string, value: unknown, request?: RtdbRestRequest): Promise<RtdbRestResponse>;
53
+ delete(path: string, request?: RtdbRestRequest): Promise<RtdbRestResponse>;
54
+ /** The deployed rules as stored, comments included. */
55
+ getRulesText(): Promise<string>;
56
+ /** Deploy `source` as the rules, or validate it without deploying (`dryRun`). */
57
+ putRules(source: string, options?: {
58
+ dryRun?: boolean;
59
+ }): Promise<RtdbRestResponse>;
60
+ private rules;
61
+ private send;
62
+ private fetchResponse;
63
+ }
64
+ /** `/a/b` for any of `a/b`, `/a/b/`, `a//b`; the root is the empty string. */
65
+ export declare function restPath(path: string): string;
66
+ /** Whether a REST status is the rules denying the request. */
67
+ export declare function isRestDenial(status: number): boolean;
68
+ //# sourceMappingURL=rest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest.d.ts","sourceRoot":"","sources":["../../../src/verify/staging/rest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,0FAA0F;AAC1F,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;AAE9D,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,gFAAgF;IAChF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,gDAAgD;IAChD,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,sGAAsG;IACtG,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,uDAAuD;IACvD,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6EAA6E;IAC7E,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,+FAA+F;IAC/F,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,OAAO,CAAC;IACzH,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACxB,OAAO,CAAC,EAAE;QAAE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;CAChD,CAAC,CAAC;AAEH,qBAAa,cAAc;IAKvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAL5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAG3B,WAAW,EAAE,MAAM,EACF,KAAK,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,EAC5B,SAAS,GAAE,SAA2C;IAKzE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAI3E,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAI3F,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAI7F,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAI9E,uDAAuD;IACjD,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAMrC,iFAAiF;IACjF,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC;YAIzE,KAAK;YAKL,IAAI;YAcJ,aAAa;CAgB5B;AAED,8EAA8E;AAC9E,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG7C;AAED,8DAA8D;AAC9D,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEpD"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * A minimal Realtime Database REST client for the staging engine: data reads
3
+ * and writes as admin or as an application user (`auth_variable_override`),
4
+ * and the rules endpoint (`/.settings/rules.json`).
5
+ *
6
+ * Production applies an `auth_variable_override` object as the rules `auth`
7
+ * variable, `auth.token` claims included; the identity capture recorded in
8
+ * `packages/conformance/observations/rtdb-staging/rtdb-staging-auth-override.json`
9
+ * pins that for every field the engine passes.
10
+ */
11
+ export class RtdbRestClient {
12
+ token;
13
+ fetchImpl;
14
+ databaseUrl;
15
+ constructor(databaseUrl, token, fetchImpl = (url, init) => fetch(url, init)) {
16
+ this.token = token;
17
+ this.fetchImpl = fetchImpl;
18
+ this.databaseUrl = databaseUrl.replace(/\/+$/, '');
19
+ }
20
+ get(path, request = {}) {
21
+ return this.send('GET', path, undefined, request);
22
+ }
23
+ put(path, value, request = {}) {
24
+ return this.send('PUT', path, JSON.stringify(value), request);
25
+ }
26
+ patch(path, value, request = {}) {
27
+ return this.send('PATCH', path, JSON.stringify(value), request);
28
+ }
29
+ delete(path, request = {}) {
30
+ return this.send('DELETE', path, undefined, request);
31
+ }
32
+ /** The deployed rules as stored, comments included. */
33
+ async getRulesText() {
34
+ const res = await this.rules('GET');
35
+ if (res.status !== 200)
36
+ throw new Error(`reading the rules of ${this.databaseUrl} failed: HTTP ${res.status} ${res.text.slice(0, 200)}`);
37
+ return res.text;
38
+ }
39
+ /** Deploy `source` as the rules, or validate it without deploying (`dryRun`). */
40
+ putRules(source, options = {}) {
41
+ return this.rules('PUT', source, options.dryRun === true);
42
+ }
43
+ async rules(method, body, dryRun = false) {
44
+ const url = `${this.databaseUrl}/.settings/rules.json${dryRun ? '?dryRun=true' : ''}`;
45
+ return this.fetchResponse(url, method, body);
46
+ }
47
+ async send(method, path, body, request) {
48
+ const params = new URLSearchParams();
49
+ if (request.auth !== undefined)
50
+ params.set('auth_variable_override', JSON.stringify(request.auth));
51
+ if (request.format)
52
+ params.set('format', request.format);
53
+ if (request.shallow)
54
+ params.set('shallow', 'true');
55
+ for (const [key, value] of Object.entries(request.query ?? {}))
56
+ params.set(key, value);
57
+ const query = params.toString();
58
+ const url = `${this.databaseUrl}${restPath(path) || '/'}.json${query ? `?${query}` : ''}`;
59
+ const headers = {};
60
+ if (request.etag)
61
+ headers['X-Firebase-ETag'] = 'true';
62
+ if (request.ifMatch !== undefined)
63
+ headers['if-match'] = request.ifMatch;
64
+ return this.fetchResponse(url, method, body, headers);
65
+ }
66
+ async fetchResponse(url, method, body, extra = {}) {
67
+ const res = await this.fetchImpl(url, {
68
+ method,
69
+ headers: { Authorization: `Bearer ${await this.token()}`, 'Content-Type': 'application/json', ...extra },
70
+ ...(body === undefined ? {} : { body }),
71
+ });
72
+ const text = await res.text();
73
+ let parsed = text;
74
+ try {
75
+ parsed = JSON.parse(text);
76
+ }
77
+ catch {
78
+ // Not JSON: keep the text.
79
+ }
80
+ const etag = res.headers?.get('etag') ?? undefined;
81
+ return { status: res.status, body: parsed, text, ...(etag ? { etag } : {}) };
82
+ }
83
+ }
84
+ /** `/a/b` for any of `a/b`, `/a/b/`, `a//b`; the root is the empty string. */
85
+ export function restPath(path) {
86
+ const segments = path.split('/').filter(Boolean).map(encodeURIComponent);
87
+ return segments.length === 0 ? '' : `/${segments.join('/')}`;
88
+ }
89
+ /** Whether a REST status is the rules denying the request. */
90
+ export function isRestDenial(status) {
91
+ return status === 401 || status === 403;
92
+ }
93
+ //# sourceMappingURL=rest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest.js","sourceRoot":"","sources":["../../../src/verify/staging/rest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAkCH,MAAM,OAAO,cAAc;IAKN;IACA;IALV,WAAW,CAAS;IAE7B,YACE,WAAmB,EACF,KAA4B,EAC5B,YAAuB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC;QADtD,UAAK,GAAL,KAAK,CAAuB;QAC5B,cAAS,GAAT,SAAS,CAA6C;QAEvE,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,GAAG,CAAC,IAAY,EAAE,UAA2B,EAAE;QAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,GAAG,CAAC,IAAY,EAAE,KAAc,EAAE,UAA2B,EAAE;QAC7D,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,IAAY,EAAE,KAAc,EAAE,UAA2B,EAAE;QAC/D,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,CAAC,IAAY,EAAE,UAA2B,EAAE;QAChD,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAED,uDAAuD;IACvD,KAAK,CAAC,YAAY;QAChB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,CAAC,WAAW,iBAAiB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACzI,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC;IAED,iFAAiF;IACjF,QAAQ,CAAC,MAAc,EAAE,UAAgC,EAAE;QACzD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;IAC5D,CAAC;IAEO,KAAK,CAAC,KAAK,CAAC,MAAqB,EAAE,IAAa,EAAE,MAAM,GAAG,KAAK;QACtE,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,WAAW,wBAAwB,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACtF,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC;IAEO,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,IAAY,EAAE,IAAwB,EAAE,OAAwB;QACjG,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;YAAE,MAAM,CAAC,GAAG,CAAC,wBAAwB,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACnG,IAAI,OAAO,CAAC,MAAM;YAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,OAAO,CAAC,OAAO;YAAE,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACnD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACvF,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC1F,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,IAAI,OAAO,CAAC,IAAI;YAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,MAAM,CAAC;QACtD,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS;YAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;QACzE,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,GAAW,EAAE,MAAc,EAAE,IAAa,EAAE,QAAgC,EAAE;QACxG,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE;YACpC,MAAM;YACN,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,KAAK,EAAE;YACxG,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;SACxC,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,MAAM,GAAY,IAAI,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,2BAA2B;QAC7B,CAAC;QACD,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC;QACnD,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC/E,CAAC;CACF;AAED,8EAA8E;AAC9E,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACzE,OAAO,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAC/D,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,OAAO,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,39 @@
1
+ import type { FirebaseJson } from '../../cli/firebase-json.js';
2
+ import { resolveScope } from '../../credentials/node/scope.js';
3
+ export interface StagingTarget {
4
+ projectId: string;
5
+ databaseUrl: string;
6
+ /** The instance name the URL names. */
7
+ instance: string;
8
+ }
9
+ export declare class StagingConfigError extends Error {
10
+ constructor(message: string);
11
+ }
12
+ /** The staging target in a parsed `pyric.json`, or a config error naming what is missing. */
13
+ export declare function stagingTargetFrom(config: unknown): StagingTarget;
14
+ /**
15
+ * Refuse a staging instance the app uses: one `firebase.json` deploys rules
16
+ * to (by instance or by a `.firebaserc` target), or the default instance of
17
+ * the app's project.
18
+ */
19
+ export declare function assertNotAppInstance(target: StagingTarget, app: {
20
+ firebaseJson: FirebaseJson | null;
21
+ appProjectId?: string;
22
+ targetInstances?: string[];
23
+ }): void;
24
+ /**
25
+ * An OAuth token for the staging project: a service account or Application
26
+ * Default Credentials (`resolveScope`), else the Firebase CLI's login
27
+ * (`firebase login`) while its access token is fresh.
28
+ */
29
+ export declare function stagingToken(projectId: string, deps?: {
30
+ resolve?: typeof resolveScope;
31
+ env?: NodeJS.ProcessEnv;
32
+ now?: () => number;
33
+ }): Promise<{
34
+ token: () => Promise<string>;
35
+ source: string;
36
+ }>;
37
+ /** How long a CLI token must stay valid for a run to start with it; it cannot be refreshed mid-run. */
38
+ export declare const CLI_TOKEN_MARGIN_MS: number;
39
+ //# sourceMappingURL=target.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"target.d.ts","sourceRoot":"","sources":["../../../src/verify/staging/target.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAgE,MAAM,iCAAiC,CAAC;AAE7H,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAI5B;AAID,6FAA6F;AAC7F,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,aAAa,CAwBhE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE;IAAE,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAC5F,IAAI,CAcN;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,YAAY,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CAAO,GACxF,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAgB3D;AAOD,uGAAuG;AACvG,eAAO,MAAM,mBAAmB,QAAc,CAAC"}