@pyric/cli 0.1.0-alpha.15 → 0.1.0-alpha.17

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 (384) hide show
  1. package/README.md +13 -9
  2. package/dist/assurance/.generated/conformance-verdicts.d.ts +80 -72
  3. package/dist/assurance/.generated/conformance-verdicts.d.ts.map +1 -1
  4. package/dist/assurance/.generated/conformance-verdicts.js +80 -72
  5. package/dist/assurance/.generated/conformance-verdicts.js.map +1 -1
  6. package/dist/bridge/client/dispatch.js +1 -1
  7. package/dist/bridge/client/dispatch.js.map +1 -1
  8. package/dist/cli/database-rules.d.ts.map +1 -1
  9. package/dist/cli/database-rules.js +6 -4
  10. package/dist/cli/database-rules.js.map +1 -1
  11. package/dist/cli/dev-runner.d.ts +9 -0
  12. package/dist/cli/dev-runner.d.ts.map +1 -1
  13. package/dist/cli/dev-runner.js +18 -0
  14. package/dist/cli/dev-runner.js.map +1 -1
  15. package/dist/cli/serve.d.ts.map +1 -1
  16. package/dist/cli/serve.js +61 -6
  17. package/dist/cli/serve.js.map +1 -1
  18. package/dist/cli/verify.js +2 -2
  19. package/dist/cli/verify.js.map +1 -1
  20. package/dist/conformance/.generated/can-i-use-browser.d.ts.map +1 -1
  21. package/dist/conformance/.generated/can-i-use-browser.js +1 -1
  22. package/dist/conformance/.generated/can-i-use-browser.js.map +1 -1
  23. package/dist/conformance/.generated/can-i-use.d.ts.map +1 -1
  24. package/dist/conformance/.generated/can-i-use.js +1 -1
  25. package/dist/conformance/.generated/can-i-use.js.map +1 -1
  26. package/dist/conformance/.generated/conformance-docs.d.ts.map +1 -1
  27. package/dist/conformance/.generated/conformance-docs.js +1 -1
  28. package/dist/conformance/.generated/conformance-docs.js.map +1 -1
  29. package/dist/next/client-aliases.d.ts +11 -0
  30. package/dist/next/client-aliases.d.ts.map +1 -0
  31. package/dist/next/client-aliases.js +38 -0
  32. package/dist/next/client-aliases.js.map +1 -0
  33. package/dist/next/dev-rewrites.d.ts +9 -0
  34. package/dist/next/dev-rewrites.d.ts.map +1 -0
  35. package/dist/next/dev-rewrites.js +53 -0
  36. package/dist/next/dev-rewrites.js.map +1 -0
  37. package/dist/next/guard.d.ts +15 -0
  38. package/dist/next/guard.d.ts.map +1 -0
  39. package/dist/next/guard.js +52 -0
  40. package/dist/next/guard.js.map +1 -0
  41. package/dist/next/index.d.ts +12 -0
  42. package/dist/next/index.d.ts.map +1 -0
  43. package/dist/next/index.js +11 -0
  44. package/dist/next/index.js.map +1 -0
  45. package/dist/next/runtime-env.d.ts +7 -0
  46. package/dist/next/runtime-env.d.ts.map +1 -0
  47. package/dist/next/runtime-env.js +13 -0
  48. package/dist/next/runtime-env.js.map +1 -0
  49. package/dist/next/server-external-packages.d.ts +10 -0
  50. package/dist/next/server-external-packages.d.ts.map +1 -0
  51. package/dist/next/server-external-packages.js +34 -0
  52. package/dist/next/server-external-packages.js.map +1 -0
  53. package/dist/next/target-url.d.ts +11 -0
  54. package/dist/next/target-url.d.ts.map +1 -0
  55. package/dist/next/target-url.js +36 -0
  56. package/dist/next/target-url.js.map +1 -0
  57. package/dist/next/turbopack-config.d.ts +9 -0
  58. package/dist/next/turbopack-config.d.ts.map +1 -0
  59. package/dist/next/turbopack-config.js +39 -0
  60. package/dist/next/turbopack-config.js.map +1 -0
  61. package/dist/next/types.d.ts +40 -0
  62. package/dist/next/types.d.ts.map +1 -0
  63. package/dist/next/types.js +5 -0
  64. package/dist/next/types.js.map +1 -0
  65. package/dist/next/webpack-config.d.ts +11 -0
  66. package/dist/next/webpack-config.d.ts.map +1 -0
  67. package/dist/next/webpack-config.js +51 -0
  68. package/dist/next/webpack-config.js.map +1 -0
  69. package/dist/next/with-pyric.d.ts +22 -0
  70. package/dist/next/with-pyric.d.ts.map +1 -0
  71. package/dist/next/with-pyric.js +49 -0
  72. package/dist/next/with-pyric.js.map +1 -0
  73. package/dist/register/app-bridge.d.ts +9 -0
  74. package/dist/register/app-bridge.d.ts.map +1 -0
  75. package/dist/register/app-bridge.js +56 -0
  76. package/dist/register/app-bridge.js.map +1 -0
  77. package/dist/register/hooks.d.ts.map +1 -1
  78. package/dist/register/hooks.js +6 -1
  79. package/dist/register/hooks.js.map +1 -1
  80. package/dist/register/index.js +1 -1
  81. package/dist/register/index.js.map +1 -1
  82. package/dist/register/mapping.d.ts +3 -1
  83. package/dist/register/mapping.d.ts.map +1 -1
  84. package/dist/register/mapping.js +41 -5
  85. package/dist/register/mapping.js.map +1 -1
  86. package/dist/rtdb/rules-json.d.ts +12 -0
  87. package/dist/rtdb/rules-json.d.ts.map +1 -1
  88. package/dist/rtdb/rules-json.js +98 -0
  89. package/dist/rtdb/rules-json.js.map +1 -1
  90. package/dist/serve/bundler.d.ts.map +1 -1
  91. package/dist/serve/bundler.js +2 -0
  92. package/dist/serve/bundler.js.map +1 -1
  93. package/dist/serve/discovery.d.ts +4 -4
  94. package/dist/serve/discovery.d.ts.map +1 -1
  95. package/dist/serve/discovery.js +59 -38
  96. package/dist/serve/discovery.js.map +1 -1
  97. package/dist/serve/entries/app-ai-passthrough.d.ts +8 -0
  98. package/dist/serve/entries/app-ai-passthrough.d.ts.map +1 -0
  99. package/dist/serve/entries/app-ai-passthrough.js +59 -0
  100. package/dist/serve/entries/app-ai-passthrough.js.map +1 -0
  101. package/dist/serve/entries/auth-helper-core.d.ts +9 -0
  102. package/dist/serve/entries/auth-helper-core.d.ts.map +1 -1
  103. package/dist/serve/entries/auth-helper-core.js +37 -8
  104. package/dist/serve/entries/auth-helper-core.js.map +1 -1
  105. package/dist/serve/entries/auth.d.ts +1 -0
  106. package/dist/serve/entries/auth.d.ts.map +1 -1
  107. package/dist/serve/entries/auth.js +7 -4
  108. package/dist/serve/entries/auth.js.map +1 -1
  109. package/dist/serve/entries/bridge-url.d.ts.map +1 -1
  110. package/dist/serve/entries/bridge-url.js +7 -2
  111. package/dist/serve/entries/bridge-url.js.map +1 -1
  112. package/dist/serve/entries/database.d.ts +1 -0
  113. package/dist/serve/entries/database.d.ts.map +1 -1
  114. package/dist/serve/entries/database.js +1 -0
  115. package/dist/serve/entries/database.js.map +1 -1
  116. package/dist/serve/entries/firestore.d.ts +1 -0
  117. package/dist/serve/entries/firestore.d.ts.map +1 -1
  118. package/dist/serve/entries/firestore.js +1 -0
  119. package/dist/serve/entries/firestore.js.map +1 -1
  120. package/dist/serve/entries/init.d.ts.map +1 -1
  121. package/dist/serve/entries/init.js +4 -2
  122. package/dist/serve/entries/init.js.map +1 -1
  123. package/dist/serve/entries/runtime.js +23 -0
  124. package/dist/serve/entries/runtime.js.map +1 -1
  125. package/dist/serve/entries/storage.d.ts +2 -0
  126. package/dist/serve/entries/storage.d.ts.map +1 -1
  127. package/dist/serve/entries/storage.js +9 -2
  128. package/dist/serve/entries/storage.js.map +1 -1
  129. package/dist/serve/html-injection.d.ts +3 -1
  130. package/dist/serve/html-injection.d.ts.map +1 -1
  131. package/dist/serve/html-injection.js +27 -1
  132. package/dist/serve/html-injection.js.map +1 -1
  133. package/dist/serve/rules.js +2 -2
  134. package/dist/serve/rules.js.map +1 -1
  135. package/dist/serve/runtime/chip-config.d.ts +1 -1
  136. package/dist/serve/runtime/chip-config.d.ts.map +1 -1
  137. package/dist/serve/runtime/chip-config.js +16 -8
  138. package/dist/serve/runtime/chip-config.js.map +1 -1
  139. package/dist/serve/sandbox-session.d.ts +1 -0
  140. package/dist/serve/sandbox-session.d.ts.map +1 -1
  141. package/dist/serve/sandbox-session.js +30 -2
  142. package/dist/serve/sandbox-session.js.map +1 -1
  143. package/dist/serve/site-ui/_astro/_studio_.B6b_G1ev.css +1 -0
  144. package/dist/serve/site-ui/_astro/app.bnmVTkIY.js +11 -0
  145. package/dist/serve/site-ui/_astro/app.t6u-adB_.js +1 -0
  146. package/dist/serve/site-ui/_astro/{chess-showcase.DzPO6kz0.js → chess-showcase.kC8dXLKY.js} +1 -1
  147. package/dist/serve/site-ui/_astro/{example-runtime.CM0H02rx.js → example-runtime.D79PnoSk.js} +1 -1
  148. package/dist/serve/site-ui/_astro/index.DzVde04M.js +1 -0
  149. package/dist/serve/site-ui/_astro/reads.BYBRLbsE.js +1 -0
  150. package/dist/serve/site-ui/_astro/sandbox-controls.C9Aaazt8.js +1252 -0
  151. package/dist/serve/site-ui/_astro/{seed.BCn5DhHS.js → seed.DANAIyRw.js} +1 -1
  152. package/dist/serve/site-ui/auth/index.html +2 -2
  153. package/dist/serve/site-ui/docs/_rhythm/index.html +1 -1
  154. package/dist/serve/site-ui/docs/agent/set-up-your-agent/index.html +1 -1
  155. package/dist/serve/site-ui/docs/agent/watch-and-review/index.html +1 -1
  156. package/dist/serve/site-ui/docs/agent/work-with-an-agent/index.html +1 -1
  157. package/dist/serve/site-ui/docs/ai-compat/index.html +85 -85
  158. package/dist/serve/site-ui/docs/ai-compat.md +84 -84
  159. package/dist/serve/site-ui/docs/api-reference/index.html +3 -1
  160. package/dist/serve/site-ui/docs/api-reference.md +2 -0
  161. package/dist/serve/site-ui/docs/app-compat/index.html +28 -28
  162. package/dist/serve/site-ui/docs/app-compat.md +27 -27
  163. package/dist/serve/site-ui/docs/auth-compat/index.html +122 -122
  164. package/dist/serve/site-ui/docs/auth-compat.md +121 -121
  165. package/dist/serve/site-ui/docs/build/ai-logic/index.html +1 -1
  166. package/dist/serve/site-ui/docs/build/authentication/index.html +1 -1
  167. package/dist/serve/site-ui/docs/build/cloud-firestore/index.html +1 -1
  168. package/dist/serve/site-ui/docs/build/cloud-messaging/index.html +1 -1
  169. package/dist/serve/site-ui/docs/build/cloud-storage/index.html +1 -1
  170. package/dist/serve/site-ui/docs/build/realtime-database/index.html +1 -1
  171. package/dist/serve/site-ui/docs/conformance-scores/index.html +4 -4
  172. package/dist/serve/site-ui/docs/conformance-scores.md +3 -3
  173. package/dist/serve/site-ui/docs/create-pyric-reference-api/index.html +6 -6
  174. package/dist/serve/site-ui/docs/create-pyric-reference-api.md +5 -5
  175. package/dist/serve/site-ui/docs/database-compat/index.html +200 -448
  176. package/dist/serve/site-ui/docs/database-compat.md +198 -461
  177. package/dist/serve/site-ui/docs/examples/chess/index.html +2 -2
  178. package/dist/serve/site-ui/docs/examples/index.html +1 -1
  179. package/dist/serve/site-ui/docs/firestore-compat/index.html +186 -195
  180. package/dist/serve/site-ui/docs/firestore-compat.md +184 -195
  181. package/dist/serve/site-ui/docs/functions-rtdb-compat/index.html +15 -15
  182. package/dist/serve/site-ui/docs/functions-rtdb-compat.md +14 -14
  183. package/dist/serve/site-ui/docs/get-started/how-the-swap-works/index.html +1 -1
  184. package/dist/serve/site-ui/docs/get-started/nextjs/index.html +57 -0
  185. package/dist/serve/site-ui/docs/get-started/nextjs.md +86 -0
  186. package/dist/serve/site-ui/docs/get-started/start-building/index.html +25 -8
  187. package/dist/serve/site-ui/docs/get-started/start-building.md +34 -5
  188. package/dist/serve/site-ui/docs/get-started/vite/index.html +26 -0
  189. package/dist/serve/site-ui/docs/get-started/vite.md +45 -0
  190. package/dist/serve/site-ui/docs/index.json +668 -103
  191. package/dist/serve/site-ui/docs/messaging-compat/index.html +56 -56
  192. package/dist/serve/site-ui/docs/messaging-compat.md +55 -55
  193. package/dist/serve/site-ui/docs/observe/resolve-runtime-status/index.html +1 -1
  194. package/dist/serve/site-ui/docs/observe/see-whats-happening/index.html +1 -1
  195. package/dist/serve/site-ui/docs/observe/shape-your-data/index.html +1 -1
  196. package/dist/serve/site-ui/docs/overview/index.html +1 -1
  197. package/dist/serve/site-ui/docs/pyric-admin-app-reference-api/index.html +39 -13
  198. package/dist/serve/site-ui/docs/pyric-admin-app-reference-api.md +28 -2
  199. package/dist/serve/site-ui/docs/pyric-admin-auth-reference-api/index.html +1 -1
  200. package/dist/serve/site-ui/docs/pyric-admin-database-reference-api/index.html +38 -6
  201. package/dist/serve/site-ui/docs/pyric-admin-database-reference-api.md +43 -0
  202. package/dist/serve/site-ui/docs/pyric-admin-firestore-reference-api/index.html +9 -1
  203. package/dist/serve/site-ui/docs/pyric-admin-firestore-reference-api.md +8 -0
  204. package/dist/serve/site-ui/docs/pyric-admin-messaging-reference-api/index.html +1 -1
  205. package/dist/serve/site-ui/docs/pyric-admin-storage-reference-api/index.html +27 -4
  206. package/dist/serve/site-ui/docs/pyric-admin-storage-reference-api.md +23 -0
  207. package/dist/serve/site-ui/docs/pyric-ai-reference-api/index.html +1 -1
  208. package/dist/serve/site-ui/docs/pyric-ai-scripting-reference-api/index.html +1 -1
  209. package/dist/serve/site-ui/docs/pyric-app-reference-api/index.html +1 -1
  210. package/dist/serve/site-ui/docs/pyric-auth-reference-api/index.html +2 -2
  211. package/dist/serve/site-ui/docs/pyric-auth-reference-api.md +1 -1
  212. package/dist/serve/site-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +1 -1
  213. package/dist/serve/site-ui/docs/pyric-cli-assurance-reference-api/index.html +1 -1
  214. package/dist/serve/site-ui/docs/pyric-cli-bridge-client-reference-api/index.html +1 -1
  215. package/dist/serve/site-ui/docs/pyric-cli-bridge-reference-api/index.html +1 -1
  216. package/dist/serve/site-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +1 -1
  217. package/dist/serve/site-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +1 -1
  218. package/dist/serve/site-ui/docs/pyric-cli-conformance-reference-api/index.html +1 -1
  219. package/dist/serve/site-ui/docs/pyric-cli-credentials-node-reference-api/index.html +1 -1
  220. package/dist/serve/site-ui/docs/pyric-cli-discover-reference-api/index.html +1 -1
  221. package/dist/serve/site-ui/docs/pyric-cli-next-reference-api/index.html +123 -0
  222. package/dist/serve/site-ui/docs/pyric-cli-next-reference-api.md +99 -0
  223. package/dist/serve/site-ui/docs/pyric-cli-register-app-bridge-reference-api/index.html +127 -0
  224. package/dist/serve/site-ui/docs/pyric-cli-register-app-bridge-reference-api.md +174 -0
  225. package/dist/serve/site-ui/docs/pyric-cli-register-reference-api/index.html +1 -1
  226. package/dist/serve/site-ui/docs/pyric-cli-remote-reference-api/index.html +1 -1
  227. package/dist/serve/site-ui/docs/pyric-cli-serve-worker-reference-api/index.html +570 -326
  228. package/dist/serve/site-ui/docs/pyric-cli-serve-worker-reference-api.md +198 -6
  229. package/dist/serve/site-ui/docs/pyric-cli-verify-reference-api/index.html +1 -1
  230. package/dist/serve/site-ui/docs/pyric-cli-vite-reference-api/index.html +1 -1
  231. package/dist/serve/site-ui/docs/pyric-database-reference-api/index.html +1 -1
  232. package/dist/serve/site-ui/docs/pyric-firestore-reference-api/index.html +2971 -627
  233. package/dist/serve/site-ui/docs/pyric-firestore-reference-api.md +2873 -517
  234. package/dist/serve/site-ui/docs/pyric-messaging-reference-api/index.html +1 -1
  235. package/dist/serve/site-ui/docs/pyric-messaging-sw-reference-api/index.html +1 -1
  236. package/dist/serve/site-ui/docs/pyric-rules-reference-api/index.html +43 -3
  237. package/dist/serve/site-ui/docs/pyric-rules-reference-api.md +8 -0
  238. package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api/index.html +26 -2
  239. package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api.md +24 -0
  240. package/dist/serve/site-ui/docs/pyric-sandbox-firestore-reference-api/index.html +1 -1
  241. package/dist/serve/site-ui/docs/pyric-sandbox-reference-api/index.html +77 -9
  242. package/dist/serve/site-ui/docs/pyric-sandbox-reference-api.md +28 -13
  243. package/dist/serve/site-ui/docs/pyric-storage-reference-api/index.html +240 -63
  244. package/dist/serve/site-ui/docs/pyric-storage-reference-api.md +164 -5
  245. package/dist/serve/site-ui/docs/pyric-ui-agents-reference-api/index.html +1 -1
  246. package/dist/serve/site-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +1 -1
  247. package/dist/serve/site-ui/docs/pyric-ui-auth-reference-api/index.html +1 -1
  248. package/dist/serve/site-ui/docs/pyric-ui-events-hooks-reference-api/index.html +1 -1
  249. package/dist/serve/site-ui/docs/pyric-ui-events-reference-api/index.html +1 -1
  250. package/dist/serve/site-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +1 -1
  251. package/dist/serve/site-ui/docs/pyric-ui-firestore-reference-api/index.html +1 -1
  252. package/dist/serve/site-ui/docs/pyric-ui-primitives-reference-api/index.html +1 -1
  253. package/dist/serve/site-ui/docs/pyric-ui-rtdb-reference-api/index.html +1 -1
  254. package/dist/serve/site-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +1 -1
  255. package/dist/serve/site-ui/docs/pyric-ui-rules-reference-api/index.html +1 -1
  256. package/dist/serve/site-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +1 -1
  257. package/dist/serve/site-ui/docs/pyric-ui-storage-reference-api/index.html +2 -1
  258. package/dist/serve/site-ui/docs/pyric-ui-storage-reference-api.md +1 -0
  259. package/dist/serve/site-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +1 -1
  260. package/dist/serve/site-ui/docs/pyric-ui-traffic-reference-api/index.html +1 -1
  261. package/dist/serve/site-ui/docs/rules-compat/index.html +87 -79
  262. package/dist/serve/site-ui/docs/rules-compat.md +86 -78
  263. package/dist/serve/site-ui/docs/secure/audit-your-rules/index.html +1 -1
  264. package/dist/serve/site-ui/docs/secure/firestore-rules-limits/index.html +1 -1
  265. package/dist/serve/site-ui/docs/secure/read-a-denial/index.html +1 -1
  266. package/dist/serve/site-ui/docs/secure/rtdb-rules-in-typescript/index.html +1 -1
  267. package/dist/serve/site-ui/docs/secure/rules-standard-library/index.html +1 -1
  268. package/dist/serve/site-ui/docs/secure/secure-it-with-rules/index.html +1 -1
  269. package/dist/serve/site-ui/docs/secure/simulate-and-lint/index.html +1 -1
  270. package/dist/serve/site-ui/docs/secure/write-a-rules-test-suite/index.html +1 -1
  271. package/dist/serve/site-ui/docs/ship/ship-to-production/index.html +1 -1
  272. package/dist/serve/site-ui/docs/ship/test-in-node/index.html +1 -1
  273. package/dist/serve/site-ui/docs/storage-compat/index.html +119 -125
  274. package/dist/serve/site-ui/docs/storage-compat.md +118 -124
  275. package/dist/serve/site-ui/docs/trust/how-we-know-it-matches-firebase/index.html +1 -1
  276. package/dist/serve/site-ui/docs/trust/rules-standard-library/index.html +1 -1
  277. package/dist/serve/site-ui/docs/trust/storage-rules-stdlib-research/index.html +1 -1
  278. package/dist/serve/site-ui/docs/trust/versioning-and-compatibility/index.html +1 -1
  279. package/dist/serve/site-ui/docs/tutorial/index.html +1 -1
  280. package/dist/serve/site-ui/examples/chess/index.html +1 -1
  281. package/dist/serve/site-ui/examples/firestore-first-write/index.html +1 -1
  282. package/dist/serve/site-ui/firestore/index.html +2 -2
  283. package/dist/serve/site-ui/index.html +2 -2
  284. package/dist/serve/site-ui/llms.txt +6 -2
  285. package/dist/serve/site-ui/rtdb/index.html +2 -2
  286. package/dist/serve/site-ui/settings/index.html +2 -2
  287. package/dist/serve/site-ui/storage/index.html +2 -2
  288. package/dist/serve/site-ui/traffic/index.html +2 -2
  289. package/dist/serve/vite-ai-config.d.ts +4 -1
  290. package/dist/serve/vite-ai-config.d.ts.map +1 -1
  291. package/dist/serve/vite-ai-config.js +83 -19
  292. package/dist/serve/vite-ai-config.js.map +1 -1
  293. package/dist/serve/vite-generation-rules-watch.d.ts.map +1 -1
  294. package/dist/serve/vite-generation-rules-watch.js +61 -14
  295. package/dist/serve/vite-generation-rules-watch.js.map +1 -1
  296. package/dist/serve/vite-module-swap.d.ts +4 -1
  297. package/dist/serve/vite-module-swap.d.ts.map +1 -1
  298. package/dist/serve/vite-module-swap.js +106 -21
  299. package/dist/serve/vite-module-swap.js.map +1 -1
  300. package/dist/serve/vite-plugin.d.ts.map +1 -1
  301. package/dist/serve/vite-plugin.js +45 -5
  302. package/dist/serve/vite-plugin.js.map +1 -1
  303. package/dist/serve/vite-sandbox-generation.js +1 -1
  304. package/dist/serve/vite-sandbox-generation.js.map +1 -1
  305. package/dist/serve/worker/client/resumable.d.ts +30 -0
  306. package/dist/serve/worker/client/resumable.d.ts.map +1 -0
  307. package/dist/serve/worker/client/resumable.js +416 -0
  308. package/dist/serve/worker/client/resumable.js.map +1 -0
  309. package/dist/serve/worker/client/rtdb-references.d.ts.map +1 -1
  310. package/dist/serve/worker/client/rtdb-references.js +4 -1
  311. package/dist/serve/worker/client/rtdb-references.js.map +1 -1
  312. package/dist/serve/worker/client/storage.d.ts +16 -2
  313. package/dist/serve/worker/client/storage.d.ts.map +1 -1
  314. package/dist/serve/worker/client/storage.js +57 -6
  315. package/dist/serve/worker/client/storage.js.map +1 -1
  316. package/dist/serve/worker/host/rules.d.ts.map +1 -1
  317. package/dist/serve/worker/host/rules.js +2 -1
  318. package/dist/serve/worker/host/rules.js.map +1 -1
  319. package/dist/serve/worker/index.d.ts +1 -1
  320. package/dist/serve/worker/index.d.ts.map +1 -1
  321. package/dist/serve/worker/index.js +1 -1
  322. package/dist/serve/worker/index.js.map +1 -1
  323. package/dist/serve/worker/serve-init.d.ts.map +1 -1
  324. package/dist/serve/worker/serve-init.js +31 -0
  325. package/dist/serve/worker/serve-init.js.map +1 -1
  326. package/package.json +15 -4
  327. package/src/assurance/.generated/conformance-verdicts.ts +80 -72
  328. package/src/bridge/client/dispatch.ts +1 -1
  329. package/src/cli/cli.test.ts +14 -0
  330. package/src/cli/database-rules.ts +6 -4
  331. package/src/cli/dev-runner.ts +21 -0
  332. package/src/cli/serve.ts +62 -5
  333. package/src/cli/verify.ts +2 -2
  334. package/src/conformance/.generated/can-i-use-browser.ts +1 -1
  335. package/src/conformance/.generated/can-i-use.ts +1 -1
  336. package/src/conformance/.generated/conformance-docs.ts +1 -1
  337. package/src/next/client-aliases.ts +39 -0
  338. package/src/next/dev-rewrites.ts +77 -0
  339. package/src/next/guard.ts +61 -0
  340. package/src/next/index.ts +16 -0
  341. package/src/next/runtime-env.ts +18 -0
  342. package/src/next/server-external-packages.ts +43 -0
  343. package/src/next/target-url.ts +46 -0
  344. package/src/next/turbopack-config.ts +54 -0
  345. package/src/next/types.ts +47 -0
  346. package/src/next/webpack-config.ts +71 -0
  347. package/src/next/with-pyric.ts +58 -0
  348. package/src/register/app-bridge.ts +79 -0
  349. package/src/register/hooks.ts +6 -1
  350. package/src/register/index.ts +1 -1
  351. package/src/register/mapping.ts +50 -4
  352. package/src/rtdb/rules-json.ts +110 -0
  353. package/src/serve/bundler.ts +2 -0
  354. package/src/serve/discovery.ts +65 -44
  355. package/src/serve/entries/app-ai-passthrough.ts +83 -0
  356. package/src/serve/entries/auth-helper-core.ts +44 -8
  357. package/src/serve/entries/auth.ts +9 -4
  358. package/src/serve/entries/bridge-url.ts +9 -2
  359. package/src/serve/entries/database.ts +1 -0
  360. package/src/serve/entries/firestore.ts +1 -0
  361. package/src/serve/entries/init.ts +5 -2
  362. package/src/serve/entries/runtime.ts +25 -0
  363. package/src/serve/entries/storage.ts +12 -1
  364. package/src/serve/html-injection.ts +26 -1
  365. package/src/serve/rules.ts +2 -2
  366. package/src/serve/runtime/chip-config.ts +19 -6
  367. package/src/serve/sandbox-session.ts +31 -2
  368. package/src/serve/vite-ai-config.ts +86 -19
  369. package/src/serve/vite-generation-rules-watch.ts +67 -15
  370. package/src/serve/vite-module-swap.ts +121 -21
  371. package/src/serve/vite-plugin.ts +44 -6
  372. package/src/serve/vite-sandbox-generation.ts +1 -1
  373. package/src/serve/worker/client/resumable.ts +506 -0
  374. package/src/serve/worker/client/rtdb-references.ts +4 -1
  375. package/src/serve/worker/client/storage.ts +77 -7
  376. package/src/serve/worker/host/rules.ts +2 -1
  377. package/src/serve/worker/index.ts +4 -0
  378. package/src/serve/worker/serve-init.ts +30 -0
  379. package/dist/serve/site-ui/_astro/_studio_.BtYpqe1A.css +0 -1
  380. package/dist/serve/site-ui/_astro/app.BnMC0ywl.js +0 -109
  381. package/dist/serve/site-ui/_astro/app.DVXXR-WI.js +0 -1
  382. package/dist/serve/site-ui/_astro/index.B4Kh80he.js +0 -1
  383. package/dist/serve/site-ui/_astro/reads.D1exkX1-.js +0 -1
  384. package/dist/serve/site-ui/_astro/sandbox-controls.BqMePr5V.js +0 -1153
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Client-side module aliasing definitions for Firebase Web SDKs.
3
+ */
4
+ import { defaultSdkEntries } from '../serve/bundler.js';
5
+
6
+ /**
7
+ * Retrieve the explicit map of canonical Firebase import specifiers to their
8
+ * standalone Pyric browser wrapper entries.
9
+ */
10
+ export function getClientAliases(): Record<string, string> {
11
+ const entries = defaultSdkEntries();
12
+ const aliases: Record<string, string> = {
13
+ 'firebase/ai': entries.ai,
14
+ 'firebase/app': entries.app,
15
+ 'firebase/auth': entries.auth,
16
+ 'firebase/firestore': entries.firestore,
17
+ 'firebase/database': entries.database,
18
+ 'firebase/messaging': entries.messaging,
19
+ 'firebase/messaging/sw': entries['messaging-sw'],
20
+ 'firebase/storage': entries.storage,
21
+ };
22
+ return aliases;
23
+ }
24
+
25
+ /**
26
+ * Retrieve benign boolean fallback replacements for Node built-in modules
27
+ * accessible in browser packaging bundles.
28
+ */
29
+ export function getNodeBuiltinFallbacks(): Record<string, boolean> {
30
+ const fallbacks: Record<string, boolean> = {
31
+ fs: false,
32
+ path: false,
33
+ url: false,
34
+ 'node:fs': false,
35
+ 'node:path': false,
36
+ 'node:url': false,
37
+ };
38
+ return fallbacks;
39
+ }
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Next.js dev-time rewrite rules for routing Pyric bridge and socket traffic.
3
+ */
4
+ import type { NextConfigObject, PyricNextOptions } from './types.js';
5
+ import { resolveSandboxTargetUrl } from './target-url.js';
6
+
7
+ const PYRIC_PROXY_SOURCE = '/__pyric/:path*';
8
+ const PYRIC_PROXY_PATH = '/__pyric/:path*';
9
+
10
+ interface RewriteRule {
11
+ source: string;
12
+ destination: string;
13
+ }
14
+
15
+ interface RewritesObject {
16
+ beforeFiles?: RewriteRule[];
17
+ afterFiles?: RewriteRule[];
18
+ fallback?: RewriteRule[];
19
+ [key: string]: unknown;
20
+ }
21
+
22
+ function shouldSkipRewrites(options?: PyricNextOptions): boolean {
23
+ if (options === undefined) {
24
+ return false;
25
+ }
26
+ return options.rewrites === false;
27
+ }
28
+
29
+ function assembleRewriteRule(options?: PyricNextOptions): RewriteRule {
30
+ const targetUrl = resolveSandboxTargetUrl(options);
31
+ const destinationUrl = `${targetUrl}${PYRIC_PROXY_PATH}`;
32
+ const rule: RewriteRule = {
33
+ source: PYRIC_PROXY_SOURCE,
34
+ destination: destinationUrl,
35
+ };
36
+ return rule;
37
+ }
38
+
39
+ function prependToArrayRewrites(existing: RewriteRule[], pyricRule: RewriteRule): RewriteRule[] {
40
+ const combinedRules = [pyricRule, ...existing];
41
+ return combinedRules;
42
+ }
43
+
44
+ function prependToObjectRewrites(existing: RewritesObject, pyricRule: RewriteRule): RewritesObject {
45
+ const beforeFilesList = Array.isArray(existing.beforeFiles) ? existing.beforeFiles : [];
46
+ const updatedBeforeFiles = [pyricRule, ...beforeFilesList];
47
+ const updatedObject: RewritesObject = Object.assign({}, existing, { beforeFiles: updatedBeforeFiles });
48
+ return updatedObject;
49
+ }
50
+
51
+ /**
52
+ * Attach Pyric dev-time rewrites to ensure zero-CORS browser runtime communication.
53
+ */
54
+ export function augmentDevRewrites(config: NextConfigObject, options?: PyricNextOptions): NextConfigObject {
55
+ if (shouldSkipRewrites(options)) {
56
+ return config;
57
+ }
58
+
59
+ const updatedConfig: NextConfigObject = Object.assign({}, config);
60
+ const pyricRule = assembleRewriteRule(options);
61
+ const originalRewrites = updatedConfig.rewrites;
62
+
63
+ updatedConfig.rewrites = async () => {
64
+ if (typeof originalRewrites === 'function') {
65
+ const existingRewrites = await originalRewrites();
66
+ if (Array.isArray(existingRewrites)) {
67
+ return prependToArrayRewrites(existingRewrites, pyricRule);
68
+ }
69
+ if (typeof existingRewrites === 'object' && existingRewrites !== null) {
70
+ return prependToObjectRewrites(existingRewrites as RewritesObject, pyricRule);
71
+ }
72
+ }
73
+ return [pyricRule];
74
+ };
75
+
76
+ return updatedConfig;
77
+ }
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Execution policies and safety interlocks for Next.js configuration loading.
3
+ */
4
+ import type { PyricNextOptions } from './types.js';
5
+
6
+ const PRODUCTION_ENVIRONMENT = 'production';
7
+ const FORCED_SANDBOX_FLAG = '1';
8
+
9
+ /**
10
+ * Check whether the active environment requires production build passthrough
11
+ * without Pyric sandbox module substitution.
12
+ */
13
+ export function isProductionPassthrough(): boolean {
14
+ const isProductionEnv = process.env.NODE_ENV === PRODUCTION_ENVIRONMENT;
15
+ const isForcedOverride = process.env.PYRIC_SANDBOX_FORCE === FORCED_SANDBOX_FLAG;
16
+ if (!isProductionEnv) {
17
+ return false;
18
+ }
19
+ return !isForcedOverride;
20
+ }
21
+
22
+ /**
23
+ * Check whether the developer opted out of the sandbox environment guard.
24
+ */
25
+ function isGuardExplicitlyDisabled(options?: PyricNextOptions): boolean {
26
+ if (options === undefined) {
27
+ return false;
28
+ }
29
+ return options.guard === false;
30
+ }
31
+
32
+ /**
33
+ * Check whether an active Pyric sandbox environment variable is present in the process.
34
+ */
35
+ function hasActiveSandboxEnvironment(): boolean {
36
+ const sandboxValue = process.env.PYRIC_SANDBOX;
37
+ if (sandboxValue === undefined) {
38
+ return false;
39
+ }
40
+ return sandboxValue.length > 0;
41
+ }
42
+
43
+ /**
44
+ * Verify whether the Next.js development server is booting under a secure,
45
+ * activated sandbox environment. Throws a protective terminal error if un-sandboxed.
46
+ */
47
+ export function enforceSandboxGuard(options?: PyricNextOptions): void {
48
+ if (isGuardExplicitlyDisabled(options)) {
49
+ return;
50
+ }
51
+ if (hasActiveSandboxEnvironment()) {
52
+ return;
53
+ }
54
+ const errorMessage =
55
+ '[Pyric] Next.js development server started without active Pyric sandbox environment variables.\n' +
56
+ 'To prevent accidental connections to production Firebase databases, launch this server using:\n' +
57
+ ' pyric dev -- next dev\n' +
58
+ 'or source environment keys via `pyric env`.\n' +
59
+ 'To disable this guard, pass { guard: false } to withPyric(config, options).';
60
+ throw new Error(errorMessage);
61
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * `@pyric/cli/next` — the dev-only Next.js configuration wrapper (`withPyric`)
3
+ * that configures module aliasing for Webpack & Turbopack, externalizes server
4
+ * SDKs for Node runtime loader interception, and establishes dev-time rewrites
5
+ * for Pyric sandbox socket & bridge communication.
6
+ *
7
+ * import { withPyric } from '@pyric/cli/next';
8
+ * export default withPyric({ /* your next config * / });
9
+ */
10
+ export { withPyric } from './with-pyric.js';
11
+ export type {
12
+ PyricNextOptions,
13
+ NextConfig,
14
+ NextConfigObject,
15
+ NextConfigFunction,
16
+ } from './types.js';
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Augment Next.js configuration environment variables to pass Pyric runtime
3
+ * options (such as chip state) down into browser client builds.
4
+ */
5
+ import type { NextConfigObject, PyricNextOptions } from './types.js';
6
+ import { runtimeChipMetaValue } from '../serve/runtime/chip-config.js';
7
+
8
+ export function augmentRuntimeEnv(config: NextConfigObject, options?: PyricNextOptions): NextConfigObject {
9
+ if (options === undefined || options.runtimeChip === undefined) {
10
+ return config;
11
+ }
12
+ const updatedConfig: NextConfigObject = Object.assign({}, config);
13
+ const existingEnv = updatedConfig.env !== undefined ? Object.assign({}, updatedConfig.env) : {};
14
+ const chipValue = runtimeChipMetaValue(options.runtimeChip);
15
+ existingEnv.PYRIC_RUNTIME_CHIP = chipValue;
16
+ updatedConfig.env = existingEnv;
17
+ return updatedConfig;
18
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Server module externalization logic for Next.js runtime loader interception.
3
+ */
4
+ import type { NextConfigObject } from './types.js';
5
+
6
+ const TARGET_SERVER_PACKAGES = ['firebase', 'firebase-admin'];
7
+
8
+ function appendExternalPackages(existingPackages?: unknown): string[] {
9
+ const packageSet = new Set<string>();
10
+ if (Array.isArray(existingPackages)) {
11
+ for (const pkg of existingPackages) {
12
+ if (typeof pkg === 'string') {
13
+ packageSet.add(pkg);
14
+ }
15
+ }
16
+ }
17
+ for (const pkg of TARGET_SERVER_PACKAGES) {
18
+ packageSet.add(pkg);
19
+ }
20
+ return Array.from(packageSet);
21
+ }
22
+
23
+ /**
24
+ * Inject Pyric backend target packages into `serverExternalPackages` so Next.js
25
+ * avoids inlining them during Server Component and API Route bundling.
26
+ */
27
+ export function augmentServerExternalPackages(config: NextConfigObject): NextConfigObject {
28
+ const updatedConfig: NextConfigObject = Object.assign({}, config);
29
+
30
+ const currentExternalPackages = updatedConfig.serverExternalPackages;
31
+ updatedConfig.serverExternalPackages = appendExternalPackages(currentExternalPackages);
32
+
33
+ const hasExperimentalSection = typeof updatedConfig.experimental === 'object' && updatedConfig.experimental !== null;
34
+ const shouldAugmentLegacySection = hasExperimentalSection || updatedConfig.serverExternalPackages === undefined;
35
+ if (shouldAugmentLegacySection) {
36
+ const experimentalSection = hasExperimentalSection ? Object.assign({}, updatedConfig.experimental) : {};
37
+ const legacyPackages = experimentalSection.serverComponentsExternalPackages;
38
+ experimentalSection.serverComponentsExternalPackages = appendExternalPackages(legacyPackages);
39
+ updatedConfig.experimental = experimentalSection;
40
+ }
41
+
42
+ return updatedConfig;
43
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Resolution logic for determining the local Pyric dev server URL.
3
+ */
4
+ import type { PyricNextOptions } from './types.js';
5
+
6
+ const DEFAULT_LOOPBACK_HOST = 'http://127.0.0.1';
7
+ const DEFAULT_SANDBOX_PORT = 4000;
8
+ const REMOTE_PREFIX = 'remote:';
9
+
10
+ function stripTrailingSlash(url: string): string {
11
+ if (url.endsWith('/')) {
12
+ return url.slice(0, -1);
13
+ }
14
+ return url;
15
+ }
16
+
17
+ /**
18
+ * Resolve the destination URL for Next.js dev-time rewrites using explicit
19
+ * fallback precedence: option URL → option port → PYRIC_SANDBOX remote URL →
20
+ * PYRIC_SANDBOX_PORT → default port 4000.
21
+ */
22
+ export function resolveSandboxTargetUrl(options?: PyricNextOptions): string {
23
+ if (options !== undefined && options.url !== undefined) {
24
+ return stripTrailingSlash(options.url);
25
+ }
26
+
27
+ if (options !== undefined && options.port !== undefined) {
28
+ return `${DEFAULT_LOOPBACK_HOST}:${options.port}`;
29
+ }
30
+
31
+ const envSandbox = process.env.PYRIC_SANDBOX;
32
+ if (envSandbox !== undefined && envSandbox.startsWith(REMOTE_PREFIX)) {
33
+ const rawRemoteUrl = envSandbox.slice(REMOTE_PREFIX.length);
34
+ return stripTrailingSlash(rawRemoteUrl);
35
+ }
36
+
37
+ const envPort = process.env.PYRIC_SANDBOX_PORT;
38
+ if (envPort !== undefined) {
39
+ const parsedPort = Number(envPort);
40
+ if (!Number.isNaN(parsedPort)) {
41
+ return `${DEFAULT_LOOPBACK_HOST}:${parsedPort}`;
42
+ }
43
+ }
44
+
45
+ return `${DEFAULT_LOOPBACK_HOST}:${DEFAULT_SANDBOX_PORT}`;
46
+ }
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Turbopack configuration augmentation for Next.js client SDK aliases.
3
+ */
4
+ import type { NextConfigObject } from './types.js';
5
+ import { getClientAliases } from './client-aliases.js';
6
+
7
+ function assembleTurbopackAliases(existingTurbo: Record<string, any> | undefined): Record<string, any> {
8
+ const turboSection = existingTurbo !== undefined ? Object.assign({}, existingTurbo) : {};
9
+ const currentAliases = turboSection.resolveAlias !== undefined ? Object.assign({}, turboSection.resolveAlias) : {};
10
+ const pyricAliases = getClientAliases();
11
+ turboSection.resolveAlias = Object.assign(currentAliases, pyricAliases);
12
+ return turboSection;
13
+ }
14
+
15
+ /**
16
+ * Configure Turbopack module aliases across standard and experimental sections.
17
+ */
18
+ export function augmentTurbopackConfig(config: NextConfigObject): NextConfigObject {
19
+ const updatedConfig: NextConfigObject = Object.assign({}, config);
20
+ const hasModernTurbopack = typeof updatedConfig.turbopack === 'object' && updatedConfig.turbopack !== null;
21
+ const hasLegacyTopLevelTurbo = typeof updatedConfig.turbo === 'object' && updatedConfig.turbo !== null;
22
+ const hasExperimentalTurbo =
23
+ typeof updatedConfig.experimental === 'object' &&
24
+ updatedConfig.experimental !== null &&
25
+ typeof updatedConfig.experimental.turbo === 'object' &&
26
+ updatedConfig.experimental.turbo !== null;
27
+
28
+ const shouldDefaultToModernTurbopack =
29
+ !hasModernTurbopack && !hasLegacyTopLevelTurbo && !hasExperimentalTurbo;
30
+
31
+ if (hasModernTurbopack || shouldDefaultToModernTurbopack) {
32
+ const currentTurbopack = updatedConfig.turbopack;
33
+ updatedConfig.turbopack = assembleTurbopackAliases(currentTurbopack);
34
+ }
35
+
36
+ if (hasLegacyTopLevelTurbo) {
37
+ const currentTurbo = updatedConfig.turbo;
38
+ updatedConfig.turbo = assembleTurbopackAliases(currentTurbo);
39
+ }
40
+
41
+ if (hasExperimentalTurbo) {
42
+ const existingExperimental =
43
+ typeof updatedConfig.experimental === 'object' && updatedConfig.experimental !== null
44
+ ? Object.assign({}, updatedConfig.experimental)
45
+ : {};
46
+ const currentTurbo = existingExperimental.turbo;
47
+ existingExperimental.turbo = assembleTurbopackAliases(currentTurbo);
48
+ updatedConfig.experimental = existingExperimental;
49
+ }
50
+
51
+ return updatedConfig;
52
+ }
53
+
54
+
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Public configuration types for the `@pyric/cli/next` integration.
3
+ */
4
+
5
+ import type { PyricRuntimeChipOption } from '../serve/runtime/chip-config.js';
6
+ export type { PyricRuntimeChipOption };
7
+
8
+ export interface PyricNextOptions {
9
+ /**
10
+ * Guard against starting Next.js dev server directly (`next dev`) without
11
+ * active Pyric sandbox environment variables. When `true` (default), throws
12
+ * an early error if `PYRIC_SANDBOX` is missing during development builds.
13
+ * Pass `false` to opt out of safety checking.
14
+ */
15
+ guard?: boolean;
16
+ /**
17
+ * Port override for the local Pyric sandbox server when configuring dev-time
18
+ * rewrites (`/__pyric/:path*`). By default, resolves from `PYRIC_SANDBOX`
19
+ * or `PYRIC_SANDBOX_PORT`, falling back to `4000`.
20
+ */
21
+ port?: number;
22
+ /**
23
+ * Explicit URL override for the local Pyric sandbox server when configuring
24
+ * dev-time rewrites (e.g., `http://localhost:4000`).
25
+ */
26
+ url?: string;
27
+ /**
28
+ * Whether to configure Next.js dev-time rewrites to proxy `/__pyric/:path*`
29
+ * traffic to the local Pyric dev server. Default `true`.
30
+ */
31
+ rewrites?: boolean;
32
+ /**
33
+ * Display the floating Pyric runtime chip in browser client pages during
34
+ * local development. On by default. Pass `false` to hide it, or
35
+ * `{ initiallyOpen: true }` when actively debugging runtime errors.
36
+ */
37
+ runtimeChip?: PyricRuntimeChipOption;
38
+ }
39
+
40
+ export type NextConfigObject = Record<string, any>;
41
+
42
+ export type NextConfigFunction = (
43
+ phase: string,
44
+ defaults: Record<string, any>,
45
+ ) => NextConfigObject | Promise<NextConfigObject>;
46
+
47
+ export type NextConfig = NextConfigObject | NextConfigFunction;
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Webpack configuration augmentation for Next.js client component builds.
3
+ */
4
+ import type { NextConfigObject } from './types.js';
5
+ import { getClientAliases, getNodeBuiltinFallbacks } from './client-aliases.js';
6
+
7
+ interface WebpackOptions {
8
+ isServer: boolean;
9
+ [key: string]: unknown;
10
+ }
11
+
12
+ function isClientSideBuild(options: WebpackOptions): boolean {
13
+ return options.isServer === false;
14
+ }
15
+
16
+ function assembleClientResolveSection(existingResolve: Record<string, any> | undefined): Record<string, any> {
17
+ const resolveSection = existingResolve !== undefined ? Object.assign({}, existingResolve) : {};
18
+
19
+ const currentAliases = resolveSection.alias !== undefined ? Object.assign({}, resolveSection.alias) : {};
20
+ const newAliases = getClientAliases();
21
+ resolveSection.alias = Object.assign(currentAliases, newAliases);
22
+
23
+ const currentFallbacks = resolveSection.fallback !== undefined ? Object.assign({}, resolveSection.fallback) : {};
24
+ const newFallbacks = getNodeBuiltinFallbacks();
25
+ resolveSection.fallback = Object.assign(currentFallbacks, newFallbacks);
26
+
27
+ return resolveSection;
28
+ }
29
+
30
+ function assembleClientExperimentsSection(existingExperiments: Record<string, any> | undefined): Record<string, any> {
31
+ const experimentsSection = existingExperiments !== undefined ? Object.assign({}, existingExperiments) : {};
32
+ experimentsSection.topLevelAwait = true;
33
+ return experimentsSection;
34
+ }
35
+
36
+ function assembleClientOutputSection(existingOutput: Record<string, any> | undefined): Record<string, any> {
37
+ const outputSection = existingOutput !== undefined ? Object.assign({}, existingOutput) : {};
38
+ const environmentSection = outputSection.environment !== undefined ? Object.assign({}, outputSection.environment) : {};
39
+ environmentSection.asyncFunction = true;
40
+ outputSection.environment = environmentSection;
41
+ return outputSection;
42
+ }
43
+
44
+ /**
45
+ * Wrap the existing Next.js Webpack configuration builder to inject client-side
46
+ * Firebase module aliases and modern async runtime compatibility settings when
47
+ * bundling for browser execution.
48
+ */
49
+ export function augmentWebpackConfig(config: NextConfigObject): NextConfigObject {
50
+ const updatedConfig: NextConfigObject = Object.assign({}, config);
51
+ const originalWebpack = updatedConfig.webpack;
52
+
53
+ updatedConfig.webpack = (webpackConfig: any, webpackOptions: WebpackOptions) => {
54
+ if (isClientSideBuild(webpackOptions)) {
55
+ const currentResolve = webpackConfig.resolve;
56
+ webpackConfig.resolve = assembleClientResolveSection(currentResolve);
57
+
58
+ const currentExperiments = webpackConfig.experiments;
59
+ webpackConfig.experiments = assembleClientExperimentsSection(currentExperiments);
60
+
61
+ const currentOutput = webpackConfig.output;
62
+ webpackConfig.output = assembleClientOutputSection(currentOutput);
63
+ }
64
+ if (typeof originalWebpack === 'function') {
65
+ return originalWebpack(webpackConfig, webpackOptions);
66
+ }
67
+ return webpackConfig;
68
+ };
69
+
70
+ return updatedConfig;
71
+ }
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Core execution coordinator for the Next.js `withPyric` configuration wrapper.
3
+ */
4
+ import type { NextConfig, NextConfigFunction, NextConfigObject, PyricNextOptions } from './types.js';
5
+ import { enforceSandboxGuard, isProductionPassthrough } from './guard.js';
6
+ import { augmentServerExternalPackages } from './server-external-packages.js';
7
+ import { augmentWebpackConfig } from './webpack-config.js';
8
+ import { augmentTurbopackConfig } from './turbopack-config.js';
9
+ import { augmentDevRewrites } from './dev-rewrites.js';
10
+ import { augmentRuntimeEnv } from './runtime-env.js';
11
+
12
+ function isFunctionConfig(config: NextConfig): config is NextConfigFunction {
13
+ return typeof config === 'function';
14
+ }
15
+
16
+ function applyPyricEnhancements(config: NextConfigObject, options?: PyricNextOptions): NextConfigObject {
17
+ let enhancedConfig = augmentServerExternalPackages(config);
18
+ enhancedConfig = augmentWebpackConfig(enhancedConfig);
19
+ enhancedConfig = augmentTurbopackConfig(enhancedConfig);
20
+ enhancedConfig = augmentDevRewrites(enhancedConfig, options);
21
+ enhancedConfig = augmentRuntimeEnv(enhancedConfig, options);
22
+ return enhancedConfig;
23
+ }
24
+
25
+ /**
26
+ * Higher-order configuration wrapper for Next.js (`next.config.js` or `next.config.mjs`).
27
+ *
28
+ * During development mode (`pyric dev` or non-production NODE_ENV):
29
+ * - Applies Webpack and Turbopack alias mappings to swap `firebase/*` imports
30
+ * for Pyric local sandbox mirrors on client components.
31
+ * - Adds `firebase` and `firebase-admin` to `serverExternalPackages` to prevent
32
+ * inlining in Server Components and API routes, preserving `@pyric/cli/register` hooks.
33
+ * - Configures dev-time rewrites (`/__pyric/*`) to proxy socket and bridge traffic
34
+ * to the local Pyric server without CORS errors.
35
+ * - Enforces a bundler safety interlock (guard) to prevent accidental connections to
36
+ * production databases when `PYRIC_SANDBOX` is inactive.
37
+ *
38
+ * In production (`NODE_ENV === 'production'` without `PYRIC_SANDBOX_FORCE=1`):
39
+ * - Functions as a zero-overhead identity passthrough, leaving standard builds untouched.
40
+ */
41
+ export function withPyric(config: NextConfig = {}, options?: PyricNextOptions): NextConfig {
42
+ if (isProductionPassthrough()) {
43
+ return config;
44
+ }
45
+
46
+ enforceSandboxGuard(options);
47
+
48
+ if (isFunctionConfig(config)) {
49
+ const asyncConfigWrapper: NextConfigFunction = async (phase, defaults) => {
50
+ const resolvedConfig = await config(phase, defaults);
51
+ const augmentedConfig = applyPyricEnhancements(resolvedConfig, options);
52
+ return augmentedConfig;
53
+ };
54
+ return asyncConfigWrapper;
55
+ }
56
+
57
+ return applyPyricEnhancements(config, options);
58
+ }
@@ -0,0 +1,79 @@
1
+ /** Node register adapter for canonical `firebase/app` imports when production AI pass-through is active. */
2
+ import * as pyricApp from 'pyric/app/register';
3
+ import * as realApp from 'firebase/app';
4
+
5
+ function decorateApp(
6
+ app: pyricApp.FirebaseApp,
7
+ options?: pyricApp.FirebaseOptions,
8
+ rawSettings?: string | pyricApp.FirebaseAppSettings,
9
+ ): pyricApp.FirebaseApp {
10
+ try {
11
+ let shadow: { container?: unknown };
12
+ try {
13
+ shadow = realApp.getApp(app.name) as { container?: unknown };
14
+ } catch {
15
+ const initOptions = (options ?? app.options) as realApp.FirebaseOptions;
16
+ const initSettings = rawSettings ?? app.name;
17
+ const isStringSettings = typeof initSettings === 'string';
18
+ if (isStringSettings) {
19
+ shadow = realApp.initializeApp(initOptions, initSettings) as { container?: unknown };
20
+ } else {
21
+ const objectSettings = initSettings as realApp.FirebaseAppSettings;
22
+ shadow = realApp.initializeApp(initOptions, objectSettings) as { container?: unknown };
23
+ }
24
+ }
25
+ const hasShadowContainer = shadow.container !== undefined && shadow.container !== null;
26
+ if (hasShadowContainer) {
27
+ Object.defineProperty(app, 'container', { value: shadow.container, configurable: true });
28
+ }
29
+ } catch {
30
+ // Observational/best-effort: do not break Pyric initialization if shadow initialization fails.
31
+ }
32
+ return app;
33
+ }
34
+
35
+ export function initializeApp(
36
+ options?: pyricApp.FirebaseOptions,
37
+ rawSettings?: string | pyricApp.FirebaseAppSettings,
38
+ ): pyricApp.FirebaseApp {
39
+ const app = pyricApp.initializeApp(options, rawSettings);
40
+ return decorateApp(app, options, rawSettings);
41
+ }
42
+
43
+ export function getApp(name?: string): pyricApp.FirebaseApp {
44
+ return decorateApp(pyricApp.getApp(name));
45
+ }
46
+
47
+ export function getApps(): pyricApp.FirebaseApp[] {
48
+ return pyricApp.getApps().map((app) => decorateApp(app));
49
+ }
50
+
51
+ export async function deleteApp(app: pyricApp.FirebaseApp): Promise<void> {
52
+ try {
53
+ const shadow = realApp.getApp(app.name);
54
+ const hasShadow = shadow !== undefined && shadow !== null;
55
+ if (hasShadow) {
56
+ await realApp.deleteApp(shadow);
57
+ }
58
+ } catch {
59
+ // Ignore if shadow app was not initialized or already deleted.
60
+ }
61
+ return pyricApp.deleteApp(app);
62
+ }
63
+
64
+ export {
65
+ FirebaseError,
66
+ SDK_VERSION,
67
+ onLog,
68
+ registerVersion,
69
+ setLogLevel,
70
+ } from 'pyric/app/register';
71
+ export type {
72
+ FirebaseApp,
73
+ FirebaseAppSettings,
74
+ FirebaseOptions,
75
+ LogCallback,
76
+ LogEntry,
77
+ LogLevel,
78
+ LogOptions,
79
+ } from 'pyric/app/register';
@@ -26,5 +26,10 @@ export function resolve(
26
26
  context: ResolveContext,
27
27
  nextResolve: (specifier: string, context?: ResolveContext) => Promise<ResolveResult>,
28
28
  ): Promise<ResolveResult> {
29
- return nextResolve(mapFirebaseSpecifier(specifier) ?? specifier, context);
29
+ const mappedSpecifier = mapFirebaseSpecifier(specifier, context.parentURL);
30
+ const hasMappedSpecifier = mappedSpecifier !== null && mappedSpecifier !== undefined;
31
+ if (hasMappedSpecifier) {
32
+ return nextResolve(mappedSpecifier, context);
33
+ }
34
+ return nextResolve(specifier, context);
30
35
  }
@@ -92,7 +92,7 @@ function activate(): void {
92
92
  if (typeof moduleApi.registerHooks === 'function') {
93
93
  moduleApi.registerHooks({
94
94
  resolve(specifier, context, nextResolve) {
95
- const mapped = mapFirebaseSpecifier(specifier);
95
+ const mapped = mapFirebaseSpecifier(specifier, context.parentURL);
96
96
  if (mapped === null) return nextResolve(specifier, context);
97
97
  try {
98
98
  return nextResolve(mapped, { ...context, parentURL: import.meta.url });