permdock 0.0.0 → 0.2.0

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 (344) hide show
  1. package/README.md +327 -1
  2. package/dist/a2a/index.d.ts +169 -0
  3. package/dist/a2a/index.js +232 -0
  4. package/dist/adapter-context-mlWsVGGg.js +23 -0
  5. package/dist/ai-sdk/index.d.ts +95 -0
  6. package/dist/ai-sdk/index.js +154 -0
  7. package/dist/approval-required-TzNB9oQA.js +6 -0
  8. package/dist/approvals/index.d.ts +3 -0
  9. package/dist/approvals/index.js +5 -0
  10. package/dist/approvals-DbYAuNkG.js +224 -0
  11. package/dist/approvers-DT4AVyIg.js +52 -0
  12. package/dist/arazzo-BAgw9ap6.js +70 -0
  13. package/dist/arazzo-cmvX2jDe.js +54 -0
  14. package/dist/authzen/index.d.ts +39 -0
  15. package/dist/authzen/index.js +302 -0
  16. package/dist/better-auth/index.d.ts +109 -0
  17. package/dist/better-auth/index.js +344 -0
  18. package/dist/better-supabase/index.d.ts +206 -0
  19. package/dist/better-supabase/index.js +620 -0
  20. package/dist/bind-CVy3Espv.d.ts +25 -0
  21. package/dist/bind-VnYn2HKq.js +97 -0
  22. package/dist/boundary-BM8a_P6E.js +13 -0
  23. package/dist/boundary-BmHxVH1J.d.ts +15 -0
  24. package/dist/budget-JqcRqyhK.d.ts +11 -0
  25. package/dist/budget-NbEtbJC_.js +11 -0
  26. package/dist/canonical-json-DemiK4Vp.js +26 -0
  27. package/dist/capability-4qPdO9gk.js +173 -0
  28. package/dist/capability-Dq43tT1u.d.ts +99 -0
  29. package/dist/catalog/index.d.ts +12 -0
  30. package/dist/catalog/index.js +2 -0
  31. package/dist/catalog-BjZSovXQ.js +2 -0
  32. package/dist/catalog-doc-Dsc9y7sd.js +309 -0
  33. package/dist/catalog-h2tlKFkq.js +48 -0
  34. package/dist/catalog-path-CnI0XTFK.js +12 -0
  35. package/dist/catalog-z8q6bi_r.js +55 -0
  36. package/dist/claude-agent/index.d.ts +72 -0
  37. package/dist/claude-agent/index.js +77 -0
  38. package/dist/clerk/index.d.ts +65 -0
  39. package/dist/clerk/index.js +301 -0
  40. package/dist/cli/bin.d.ts +1 -0
  41. package/dist/cli/bin.js +20 -0
  42. package/dist/cli/index.d.ts +46 -0
  43. package/dist/cli/index.js +5 -0
  44. package/dist/clients-C7zLFuWT.d.ts +12 -0
  45. package/dist/clients-DjU5ABMy.js +23 -0
  46. package/dist/cloud/index.d.ts +90 -0
  47. package/dist/cloud/index.js +404 -0
  48. package/dist/cloud-BGhHS-lY.js +50 -0
  49. package/dist/cloud-Bo3e9Ak3.js +118 -0
  50. package/dist/collect-DDDv_ESs.js +502 -0
  51. package/dist/collect-DLlujdHC.js +83 -0
  52. package/dist/collect-rG2IQ3t0.js +2 -0
  53. package/dist/commands-DWOrSQic.js +97 -0
  54. package/dist/compact-y6vfu2_f.js +19 -0
  55. package/dist/compare-pfyVnBjE.js +12 -0
  56. package/dist/compile/index.d.ts +3 -0
  57. package/dist/compile/index.js +2 -0
  58. package/dist/compile-Ba4blROR.js +613 -0
  59. package/dist/compile-CNnl6uIt.d.ts +94 -0
  60. package/dist/config-BJiM-xAm.js +157 -0
  61. package/dist/config-Bn00Z3ks.js +36 -0
  62. package/dist/config-report-Dw_JcUqT.js +44 -0
  63. package/dist/connection-CU8MQxRi.js +194 -0
  64. package/dist/context-Ttp0ekMT.js +82 -0
  65. package/dist/convex/index.d.ts +45 -0
  66. package/dist/convex/index.js +65 -0
  67. package/dist/create-BWyx3jua.d.ts +245 -0
  68. package/dist/create-CPhDL6qx.js +253 -0
  69. package/dist/credential-8P81ff4u.js +306 -0
  70. package/dist/delegation-D8pUEuce.js +103 -0
  71. package/dist/describe-B_gVZEVi.js +94 -0
  72. package/dist/describe-PdoqESvg.d.ts +36 -0
  73. package/dist/diff-B8Tunc3o.js +451 -0
  74. package/dist/diff-CzqLxZ77.js +48 -0
  75. package/dist/digest-B3kc_PgQ.d.ts +19 -0
  76. package/dist/digest-BI-6aa6d.js +27 -0
  77. package/dist/doctor-WpvG6p4k.js +1194 -0
  78. package/dist/doctor-collect-ByfYlNv1.js +664 -0
  79. package/dist/doctor-rOr-4ZfS.js +53 -0
  80. package/dist/drizzle/index.d.ts +73 -0
  81. package/dist/drizzle/index.js +160 -0
  82. package/dist/duration-xK2jGFVc.js +25 -0
  83. package/dist/elysia/index.d.ts +49 -0
  84. package/dist/elysia/index.js +59 -0
  85. package/dist/errors-CWfoNg9N.js +47 -0
  86. package/dist/errors-Cz5zn0mW.js +123 -0
  87. package/dist/errors-DAqevpNk.d.ts +125 -0
  88. package/dist/errors-DRnGZHzF.js +30 -0
  89. package/dist/evaluation-items-CfCCejQd.js +40 -0
  90. package/dist/evaluations-tz6D9A2G.js +461 -0
  91. package/dist/eve/index.d.ts +86 -0
  92. package/dist/eve/index.js +176 -0
  93. package/dist/expiry-BoBJ8Tvc.js +7 -0
  94. package/dist/express/index.d.ts +23 -0
  95. package/dist/express/index.js +78 -0
  96. package/dist/fastify/index.d.ts +33 -0
  97. package/dist/fastify/index.js +92 -0
  98. package/dist/fields-BMl1RxoX.js +26 -0
  99. package/dist/files-DWUN9PzI.js +125 -0
  100. package/dist/fixtures-ht28Cplr.js +67 -0
  101. package/dist/freeze-CrU8nQeX.js +60 -0
  102. package/dist/from-snapshot-C3sHpZNS.js +569 -0
  103. package/dist/generate-CH7ThJ14.js +173 -0
  104. package/dist/grantee-Cv5Sogfv.js +602 -0
  105. package/dist/graph-sql-B-dsAT6j.d.ts +29 -0
  106. package/dist/headers-BZSDieNT.js +6 -0
  107. package/dist/headers-Cf-zWvsO.d.ts +6 -0
  108. package/dist/helpers-H_KARDVC.js +421 -0
  109. package/dist/hono/index.d.ts +48 -0
  110. package/dist/hono/index.js +99 -0
  111. package/dist/hosted-DJQw46hn.js +266 -0
  112. package/dist/http-BIhmLfCc.js +95 -0
  113. package/dist/http-DPuDaChb.d.ts +13 -0
  114. package/dist/http-SO7qGttf.js +44 -0
  115. package/dist/ids-DC4V4CFu.js +18 -0
  116. package/dist/index-A0YNL8jZ.d.ts +177 -0
  117. package/dist/index-CtE07CBF.d.ts +6 -0
  118. package/dist/index-D3vbkoSI.d.ts +483 -0
  119. package/dist/index-D6_cSa1z.d.ts +201 -0
  120. package/dist/index.d.ts +16 -0
  121. package/dist/index.js +26 -0
  122. package/dist/instance-options-BK_rNOSC.d.ts +11 -0
  123. package/dist/instance-options-Dhhcnm3y.js +22 -0
  124. package/dist/json-schema-BsAflUGW.js +106 -0
  125. package/dist/jwt/index.d.ts +91 -0
  126. package/dist/jwt/index.js +590 -0
  127. package/dist/kernel-GSQnMz3O.js +208 -0
  128. package/dist/kysely/index.d.ts +78 -0
  129. package/dist/kysely/index.js +129 -0
  130. package/dist/live-options-H2eG8dfJ.js +60 -0
  131. package/dist/load-DhWEB9P1.js +75 -0
  132. package/dist/load-DwJUafYN.js +2 -0
  133. package/dist/load-jose-BL6LH4bL.js +11 -0
  134. package/dist/lru-8q4WZjBV.js +28 -0
  135. package/dist/manifest-iaoBXHKc.js +783 -0
  136. package/dist/manifest-uDS9y5de.d.ts +206 -0
  137. package/dist/map-AcxK9o_D.js +147 -0
  138. package/dist/map-claims-Z4QZOiFF.js +369 -0
  139. package/dist/map-error-pgUWNNtG.js +23 -0
  140. package/dist/markers-B0hYLvMD.js +60 -0
  141. package/dist/may-use-DndQ5tQ-.js +77 -0
  142. package/dist/mcp/index.d.ts +159 -0
  143. package/dist/mcp/index.js +603 -0
  144. package/dist/nest/index.d.ts +75 -0
  145. package/dist/nest/index.js +261 -0
  146. package/dist/next/client.d.ts +23 -0
  147. package/dist/next/client.js +33 -0
  148. package/dist/next/index.d.ts +93 -0
  149. package/dist/next/index.js +180 -0
  150. package/dist/next/plugin.d.ts +14 -0
  151. package/dist/next/plugin.js +33 -0
  152. package/dist/node/index.d.ts +24 -0
  153. package/dist/node/index.js +34 -0
  154. package/dist/openai/index.d.ts +62 -0
  155. package/dist/openai/index.js +92 -0
  156. package/dist/openapi/index.d.ts +176 -0
  157. package/dist/openapi/index.js +3 -0
  158. package/dist/openapi-Bbg4wGVL.js +164 -0
  159. package/dist/openapi-BqRBvAng.js +538 -0
  160. package/dist/openapi-CqqEbHsL.js +250 -0
  161. package/dist/openapi-import-cmwetbzw.js +5959 -0
  162. package/dist/openapi-schema--ARjyfQr.js +6902 -0
  163. package/dist/orpc/index.d.ts +51 -0
  164. package/dist/orpc/index.js +145 -0
  165. package/dist/otel/index.d.ts +13 -0
  166. package/dist/otel/index.js +202 -0
  167. package/dist/package-root-zGkxO3oN.js +30 -0
  168. package/dist/parse-BuyjxhZV.js +53 -0
  169. package/dist/parse-local-manifest-BkGQNzAh.d.ts +10 -0
  170. package/dist/parse-local-manifest-BrMozJCo.js +36 -0
  171. package/dist/pdp/index.d.ts +22 -0
  172. package/dist/pdp/index.js +682 -0
  173. package/dist/peer-BOr_kJE1.js +31 -0
  174. package/dist/permdock-CzqXjCpU.js +3471 -0
  175. package/dist/permissions-CDgvKG5L.d.ts +52 -0
  176. package/dist/permissions-CpZrivYv.js +142 -0
  177. package/dist/permissions-DVoF6dMt.js +662 -0
  178. package/dist/permissions-DttnqqxC.d.ts +214 -0
  179. package/dist/pins-8ILTftC9.js +12 -0
  180. package/dist/policy-CFZAr_Al.d.ts +2252 -0
  181. package/dist/policy-D8UFyERw.d.ts +20 -0
  182. package/dist/policy-xyWg7QdR.js +1122 -0
  183. package/dist/powersync-A8x_Yyvh.js +2 -0
  184. package/dist/powersync-C7kLglqX.js +540 -0
  185. package/dist/powersync-yW1UUFzp.js +62 -0
  186. package/dist/prisma/index.d.ts +136 -0
  187. package/dist/prisma/index.js +455 -0
  188. package/dist/problem-B43ztKIm.js +191 -0
  189. package/dist/problem-details-CkL50EEf.d.ts +7 -0
  190. package/dist/problem-details-_AMOYz-w.js +144 -0
  191. package/dist/prompt-CXYhLfsS.js +32 -0
  192. package/dist/protected-CNsMzrVd.d.ts +27 -0
  193. package/dist/protected-Cs6kTaHo.js +100 -0
  194. package/dist/protected-bZs6rbT1.d.ts +40 -0
  195. package/dist/provider-Cjr62YMV.d.ts +6 -0
  196. package/dist/provider-DLzpb2Xz.js +52 -0
  197. package/dist/provider-store-DNyC1y48.js +43 -0
  198. package/dist/react/index.d.ts +8 -0
  199. package/dist/react/index.js +7 -0
  200. package/dist/react/provider-client.d.ts +2 -0
  201. package/dist/react/provider-client.js +3 -0
  202. package/dist/react-native/index.d.ts +198 -0
  203. package/dist/react-native/index.js +696 -0
  204. package/dist/refs-KYb4ntaz.js +91 -0
  205. package/dist/relations-cjOL01hZ.js +505 -0
  206. package/dist/replay-BsOyTrdV.js +28 -0
  207. package/dist/replay-sqBGMnNs.d.ts +5 -0
  208. package/dist/resource-ref-CaS9yVPi.js +20 -0
  209. package/dist/revocations-Bhr0aMIC.js +27 -0
  210. package/dist/revocations-Cy06JNx2.d.ts +21 -0
  211. package/dist/rls-BMNydpHk.js +2521 -0
  212. package/dist/rls-CEvs64Kj.js +238 -0
  213. package/dist/rls-fields-BMasREhR.js +3502 -0
  214. package/dist/rls-graph-pc9fuXYm.js +435 -0
  215. package/dist/rls-import-D8F7j35Q.js +943 -0
  216. package/dist/rls-migrate-7wikfrVI.js +367 -0
  217. package/dist/rls-ownership-B5Lkq62W.js +843 -0
  218. package/dist/rls-shared-aOQ4hGTO.js +493 -0
  219. package/dist/rls-verify-D8B7dOTh.js +745 -0
  220. package/dist/row-check-Dt35czLy.d.ts +40 -0
  221. package/dist/rpc-DOK54_CS.js +89 -0
  222. package/dist/run-YXCJDNYk.js +174 -0
  223. package/dist/runtime-CB8gQFvS.js +11 -0
  224. package/dist/saas-Bj_FFkjN.js +1203 -0
  225. package/dist/schema-D3MnDMxa.js +300 -0
  226. package/dist/scim/index.d.ts +2 -0
  227. package/dist/scim/index.js +2 -0
  228. package/dist/scim-BFGBBAqR.js +1445 -0
  229. package/dist/scopes-CVdPrWN-.js +239 -0
  230. package/dist/server/index.d.ts +134 -0
  231. package/dist/server/index.js +11 -0
  232. package/dist/server-DlZ28Oz5.js +268 -0
  233. package/dist/sha256-BO0swRXL.js +150 -0
  234. package/dist/shared-DRu8VFVM.js +123 -0
  235. package/dist/sink-Bd9PSyfq.js +141 -0
  236. package/dist/sink-Gs6TTVa-.d.ts +104 -0
  237. package/dist/skills-Biq5uup3.js +192 -0
  238. package/dist/skills-JaymNCdK.js +56 -0
  239. package/dist/snapshot-Enxd0n-s.js +975 -0
  240. package/dist/snapshot-cache-D6jLelln.js +44 -0
  241. package/dist/snapshot-cache-DwQH8ufx.d.ts +45 -0
  242. package/dist/solid/index.d.ts +93 -0
  243. package/dist/solid/index.js +188 -0
  244. package/dist/sources-B0UvrJ21.js +534 -0
  245. package/dist/sources-BcJgw0lt.d.ts +192 -0
  246. package/dist/sql-xdg5f4Fi.js +27 -0
  247. package/dist/src-CSbUiozF.js +568 -0
  248. package/dist/ssf/index.d.ts +4 -0
  249. package/dist/ssf/index.js +596 -0
  250. package/dist/store-DMAWwAJV.js +371 -0
  251. package/dist/store-D_pjn91-.d.ts +36 -0
  252. package/dist/store-options-yO0V6gRn.js +716 -0
  253. package/dist/stores-4_sqiOA1.js +87 -0
  254. package/dist/stores-DVR5NHLE.d.ts +52 -0
  255. package/dist/stream-DDpvynSB.js +66 -0
  256. package/dist/stream-DlvG2hs-.d.ts +12 -0
  257. package/dist/style-CTm1AXDT.js +22 -0
  258. package/dist/subject-C6dLxqHU.js +24 -0
  259. package/dist/subject-settings-BwBmCdTR.js +128 -0
  260. package/dist/supabase/index.d.ts +183 -0
  261. package/dist/supabase/index.js +5 -0
  262. package/dist/supabase/middleware.d.ts +82 -0
  263. package/dist/supabase/middleware.js +102 -0
  264. package/dist/supabase-CwafwxxF.js +83 -0
  265. package/dist/supabase-DTBaC20O.js +774 -0
  266. package/dist/supabase-config-Bs44dare.js +472 -0
  267. package/dist/supabase-hook-BuxLQLpU.js +1814 -0
  268. package/dist/supabase-hook-D5qVd_D8.js +2 -0
  269. package/dist/supautils-DYZnzRWV.js +91 -0
  270. package/dist/svelte/PermissionBoundary.svelte +37 -0
  271. package/dist/svelte/Protected.svelte +40 -0
  272. package/dist/svelte/index.d.ts +13 -0
  273. package/dist/svelte/index.js +107 -0
  274. package/dist/svelte/runtime.d.ts +7 -0
  275. package/dist/svelte/runtime.js +4 -0
  276. package/dist/svelte/source.d.ts +13 -0
  277. package/dist/svelte/source.js +11 -0
  278. package/dist/terminal/index.d.ts +163 -0
  279. package/dist/terminal/index.js +833 -0
  280. package/dist/testing/index.d.ts +745 -0
  281. package/dist/testing/index.js +3672 -0
  282. package/dist/testing/saas/index.d.ts +194 -0
  283. package/dist/testing/saas/index.js +3 -0
  284. package/dist/testing/saas/permissions.d.ts +2 -0
  285. package/dist/testing/saas/permissions.js +2 -0
  286. package/dist/text-diff-BdkkYSbi.js +15 -0
  287. package/dist/thenable-okc2xDsj.js +10 -0
  288. package/dist/timeout-D51niuQP.js +8 -0
  289. package/dist/token-CIWxJOCh.js +50 -0
  290. package/dist/trpc/index.d.ts +61 -0
  291. package/dist/trpc/index.js +122 -0
  292. package/dist/types-9AWO9EGt.d.ts +197 -0
  293. package/dist/types-BPxgszlT.d.ts +550 -0
  294. package/dist/types-BVyImy5I.d.ts +120 -0
  295. package/dist/types-Bvc4oWT6.d.ts +9 -0
  296. package/dist/types-C3s9xVJG.d.ts +48 -0
  297. package/dist/types-Dnemwd77.d.ts +183 -0
  298. package/dist/types-kxznc7cn.d.ts +52 -0
  299. package/dist/types-vKyAMtcX.d.ts +157 -0
  300. package/dist/types-vNSDF7Dq.d.ts +66 -0
  301. package/dist/types-yF5LmQVD.d.ts +306 -0
  302. package/dist/unplugin/index.d.ts +7 -0
  303. package/dist/unplugin/index.js +31 -0
  304. package/dist/usage-D07N9QJ3.js +42 -0
  305. package/dist/usage-D82l1CwK.js +2 -0
  306. package/dist/usage-DG1oeCca.js +693 -0
  307. package/dist/validation-error-CnjZ4t92.js +33 -0
  308. package/dist/validation-error-CtF23SrC.d.ts +26 -0
  309. package/dist/validity-uOp8UpYn.js +245 -0
  310. package/dist/verifier-BxBo6I44.js +466 -0
  311. package/dist/version-BvacVTZR.js +17 -0
  312. package/dist/views-Soe7bGSC.js +95 -0
  313. package/dist/vocabulary-DA8a8zif.d.ts +56 -0
  314. package/dist/vue/index.d.ts +79 -0
  315. package/dist/vue/index.js +196 -0
  316. package/dist/watch-Etoa_Mvr.js +2 -0
  317. package/dist/watch-UihESpsJ.js +128 -0
  318. package/dist/webmcp/index.d.ts +75 -0
  319. package/dist/webmcp/index.js +307 -0
  320. package/package.json +450 -5
  321. package/rulesets/permdock.yaml +29 -0
  322. package/schemas/approval-request-v1.json +175 -0
  323. package/schemas/catalog-v1.json +535 -0
  324. package/schemas/openapi/oas-3.1.json +1298 -0
  325. package/schemas/openapi/oas-3.2.json +1516 -0
  326. package/schemas/openapi/overlay-1.1.json +79 -0
  327. package/schemas/supabase-claims-v1.json +144 -0
  328. package/schemas/supabase-manifest-v1.json +361 -0
  329. package/skills/permdock/SKILL.md +66 -0
  330. package/skills/permdock-agents/SKILL.md +77 -0
  331. package/skills/permdock-agents/references/runtimes.md +213 -0
  332. package/skills/permdock-approvals/SKILL.md +80 -0
  333. package/skills/permdock-approvals/references/stores-and-resume.md +94 -0
  334. package/skills/permdock-audit/SKILL.md +67 -0
  335. package/skills/permdock-credentials/SKILL.md +55 -0
  336. package/skills/permdock-credentials/references/tokens-keys-links.md +132 -0
  337. package/skills/permdock-data/SKILL.md +57 -0
  338. package/skills/permdock-data/references/queries-and-rls.md +62 -0
  339. package/skills/permdock-data/references/relationships.md +67 -0
  340. package/skills/permdock-tenancy/SKILL.md +80 -0
  341. package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +89 -0
  342. package/skills/permdock-wire/SKILL.md +116 -0
  343. package/skills/permdock-wire/references/adapters.md +492 -0
  344. package/skills/permdock-wire/references/policy-options.md +45 -0
@@ -0,0 +1,696 @@
1
+ "use client";
2
+ import { t as compact } from "../compact-y6vfu2_f.js";
3
+ import { n as freezeDeep } from "../freeze-CrU8nQeX.js";
4
+ import { r as requiredPlans } from "../problem-details-_AMOYz-w.js";
5
+ import { t as describe } from "../describe-B_gVZEVi.js";
6
+ import { a as normalizeMemberships, d as scopeList, m as tenantOf$1, o as resolveScope } from "../scopes-CVdPrWN-.js";
7
+ import { n as parseSnapshot, o as bindConditionRefs } from "../snapshot-Enxd0n-s.js";
8
+ import { s as flattenGrantee } from "../grantee-Cv5Sogfv.js";
9
+ import { p as resolveActiveTenant, u as nowSeconds } from "../validity-uOp8UpYn.js";
10
+ import { n as isThenable } from "../thenable-okc2xDsj.js";
11
+ import { r as heldRoleNames, t as emptySnapshot } from "../from-snapshot-C3sHpZNS.js";
12
+ import { t as parseLocalSnapshotManifest } from "../parse-local-manifest-BrMozJCo.js";
13
+ import { t as approvalHeaders } from "../headers-BZSDieNT.js";
14
+ import { n as storeOf, r as isJws, t as adapterStore } from "../store-options-yO0V6gRn.js";
15
+ import { i as PermDockStoreContext, n as useKeyed, t as useLiveOptions } from "../live-options-H2eG8dfJ.js";
16
+ import { a as useFilter, c as usePermission, d as useSubject, f as useTenant, i as useAssignableRoles, l as usePermissions, n as useApproval, o as useMemberships, r as useAssignablePermissions, s as usePermDock, t as Protected, u as useRoles } from "../protected-Cs6kTaHo.js";
17
+ import { useEffect, useMemo, useRef } from "react";
18
+ import { jsx } from "react/jsx-runtime";
19
+ //#region src/react-native/guards.ts
20
+ /** `true` once the provider has a snapshot to answer from: storage was read or a seed was given. Hide the splash screen on it. */
21
+ function useSnapshotReady() {
22
+ return usePermDock().status() !== "pending";
23
+ }
24
+ /**
25
+ * A boolean for `Stack.Protected` and `Tabs.Protected`: `false` while the
26
+ * snapshot is pending, `true` only when every permission is allowed for
27
+ * `data`.
28
+ */
29
+ function usePermissionGuard(permission, data) {
30
+ const permdock = usePermDock();
31
+ return useMemo(() => {
32
+ if (permdock.status() === "pending") return false;
33
+ const store = storeOf(permdock);
34
+ const list = Array.isArray(permission) ? permission : [permission];
35
+ return list.length > 0 && list.every((item) => store.permissionState(item, data).allowed);
36
+ }, [
37
+ permdock,
38
+ permission,
39
+ data
40
+ ]);
41
+ }
42
+ //#endregion
43
+ //#region src/react-native/local.ts
44
+ const CARRIED = /* @__PURE__ */ new Set([
45
+ "id",
46
+ "roles",
47
+ "plans",
48
+ "tenant",
49
+ "memberships"
50
+ ]);
51
+ function isClaimRef(ref) {
52
+ const [root, head] = ref.split(".", 2);
53
+ return root === "principal" && !CARRIED.has(String(head));
54
+ }
55
+ function bindGrant(grant, subject) {
56
+ const bind = (condition) => condition === void 0 ? void 0 : bindConditionRefs(condition, subject, isClaimRef);
57
+ return grant.where === void 0 && grant.check === void 0 ? grant : compact({
58
+ ...grant,
59
+ where: bind(grant.where),
60
+ check: bind(grant.check)
61
+ });
62
+ }
63
+ function renamed(grant, name) {
64
+ const to = [];
65
+ for (const item of flattenGrantee(grant.to)) to.push(item.kind === "role" && item.role === "\0custom" ? {
66
+ kind: "role",
67
+ role: name,
68
+ scope: item.scope
69
+ } : item);
70
+ return {
71
+ ...grant,
72
+ role: name,
73
+ to
74
+ };
75
+ }
76
+ /**
77
+ * The grants a custom role holds, from the entries the server resolved one
78
+ * by one: an entry the table does not know grants nothing.
79
+ */
80
+ function customGrants(table, role) {
81
+ const entries = Array.isArray(role.grants) ? role.grants : [];
82
+ const removed = /* @__PURE__ */ new Set();
83
+ const allows = [];
84
+ for (const item of entries) {
85
+ if (item === null || typeof item !== "object") continue;
86
+ const entry = new Map(Object.entries(item));
87
+ const key = entry.get("permission");
88
+ if (typeof key !== "string") continue;
89
+ const effect = entry.get("effect") ?? "allow";
90
+ const level = entry.get("level");
91
+ const known = [...entry.keys()].every((name) => name === "permission" || name === "effect" || name === "level");
92
+ const row = Object.hasOwn(table.permissions, key) ? table.permissions[key] : void 0;
93
+ const unknownLevel = level !== void 0 && (typeof level !== "string" || row?.levels === void 0 || !Object.hasOwn(row.levels, level));
94
+ if (!known || effect !== "allow" || unknownLevel && row !== void 0) {
95
+ removed.add(key);
96
+ continue;
97
+ }
98
+ allows.push({
99
+ key,
100
+ level
101
+ });
102
+ }
103
+ const out = [];
104
+ const included = /* @__PURE__ */ new Set();
105
+ const names = Array.isArray(role.includes) ? role.includes : [];
106
+ for (const name of names) {
107
+ const list = typeof name === "string" && Object.hasOwn(table.includes, name) ? table.includes[name] : void 0;
108
+ for (const grant of list ?? []) {
109
+ if (grant.effect === "deny" || !removed.has(grant.permission)) out.push(grant);
110
+ if (grant.effect === "allow") included.add(grant.permission);
111
+ }
112
+ }
113
+ for (const { key, level } of allows) {
114
+ if (removed.has(key) || included.has(key)) continue;
115
+ const row = Object.hasOwn(table.permissions, key) ? table.permissions[key] : void 0;
116
+ const grants = typeof level === "string" ? row?.levels?.[level] : row?.all;
117
+ out.push(...grants ?? []);
118
+ }
119
+ return out.map((grant) => renamed(grant, role.name));
120
+ }
121
+ function isList(value) {
122
+ return Array.isArray(value);
123
+ }
124
+ function customScope(role, scopes) {
125
+ if (role.scope === "global") return "global";
126
+ if (role.scope !== void 0) return resolveScope(scopes, role.scope);
127
+ return role.team === void 0 ? scopes[0]?.name : scopes[1]?.name;
128
+ }
129
+ /**
130
+ * The snapshot a server would send for `data`, built from the manifest. It
131
+ * drives UI guards only: the server still decides every request.
132
+ */
133
+ function buildLocalSnapshot(manifest, data, now = Math.floor(nowSeconds())) {
134
+ if (manifest === null || typeof manifest !== "object" || manifest.v !== 1 || !isList(manifest.grants)) throw new Error("PermDock: unsupported local snapshot manifest");
135
+ const scopes = scopeList(manifest.scopes);
136
+ const input = data.principal;
137
+ const memberships = input === null ? [] : normalizeMemberships(input.memberships, scopes);
138
+ const tenant = input === null ? void 0 : resolveActiveTenant({
139
+ id: input.id,
140
+ memberships
141
+ }, input.tenant, scopes, now);
142
+ const principal = input === null ? null : compact({
143
+ id: input.id,
144
+ roles: input.roles ?? [],
145
+ plans: input.plans,
146
+ tenant,
147
+ memberships
148
+ });
149
+ const subject = {
150
+ principal: principal === null ? null : {
151
+ ...input?.attributes,
152
+ ...principal
153
+ },
154
+ context: {}
155
+ };
156
+ const declared = new Set(manifest.roles);
157
+ const globalRoles = new Set(input?.roles ?? []);
158
+ const grants = [];
159
+ const attach = (grant, membership) => {
160
+ grants.push(bindGrant(membership === void 0 ? grant : {
161
+ ...grant,
162
+ membership
163
+ }, subject));
164
+ };
165
+ for (const grant of manifest.grants) {
166
+ const roleItems = flattenGrantee(grant.to).filter((item) => item.kind === "role");
167
+ if (roleItems.length > 0 && principal === null) continue;
168
+ if (!roleItems.every((item) => item.scope !== "global" || declared.has(item.role) && globalRoles.has(item.role))) continue;
169
+ const scoped = roleItems.filter((item) => item.scope !== "global");
170
+ if (scoped.length === 0) {
171
+ attach(grant);
172
+ continue;
173
+ }
174
+ for (const membership of memberships) if (scoped.every((item) => declared.has(item.role) && membership.roles.includes(item.role) && (typeof item.scope === "string" ? membership.scope === item.scope : membership.on !== void 0))) attach(grant, membership);
175
+ }
176
+ const custom = (data.customRoles ?? []).filter((role) => role !== null && typeof role === "object" && typeof role.name === "string" && !declared.has(role.name));
177
+ for (const role of custom) {
178
+ const scope = customScope(role, scopes);
179
+ const table = scope !== void 0 && Object.hasOwn(manifest.custom, scope) ? manifest.custom[scope] : void 0;
180
+ if (scope === void 0 || table === void 0) continue;
181
+ const resolved = customGrants(table, role);
182
+ if (scope === "global") {
183
+ if (role.tenant === void 0 && globalRoles.has(role.name)) for (const grant of resolved) attach(grant);
184
+ continue;
185
+ }
186
+ const id = role.team ?? role.id;
187
+ for (const membership of memberships) if (membership.scope === scope && typeof role.tenant === "string" && tenantOf$1(membership, scopes) === role.tenant && (id === void 0 || membership.id === id) && membership.roles.includes(role.name)) for (const grant of resolved) attach(grant, membership);
188
+ }
189
+ const roles = subject.principal === null ? [] : heldRoleNames(subject, tenant, scopes, { rank: manifest.rank ?? [] }, now);
190
+ return freezeDeep(compact({
191
+ v: 1,
192
+ issuedAt: now,
193
+ subject: {
194
+ principal,
195
+ context: {}
196
+ },
197
+ roles,
198
+ grants,
199
+ tenants: tenant === void 0 ? [] : [tenant],
200
+ scopes: manifest.scopes,
201
+ vocabulary: manifest.vocabulary
202
+ }));
203
+ }
204
+ /**
205
+ * A snapshot source over the device's own membership rows (SQLite, a
206
+ * PowerSync or Electric replica): offline, the UI guards answer from them.
207
+ */
208
+ function localSnapshot(options) {
209
+ return compact({
210
+ get: async () => buildLocalSnapshot(options.manifest, await options.read()),
211
+ subscribe: options.subscribe
212
+ });
213
+ }
214
+ //#endregion
215
+ //#region src/react-native/powersync.ts
216
+ /**
217
+ * A `localSnapshot` source over a PowerSync database: `get` runs every query
218
+ * with `db.getAll`, and a `db.watch` per query reports changes. A watch
219
+ * result with unchanged content re-renders nothing (`connectSource`). The source
220
+ * takes the database as an argument; `permdock/react-native` never imports
221
+ * `@powersync/*`.
222
+ */
223
+ function powersyncSource(db, options) {
224
+ const names = Object.keys(options.queries);
225
+ return localSnapshot({
226
+ manifest: options.manifest,
227
+ read: async () => {
228
+ const results = await Promise.all(names.map(async (name) => {
229
+ const query = options.queries[name];
230
+ return [name, await db.getAll(query.sql, [...query.parameters ?? []])];
231
+ }));
232
+ const rows = {};
233
+ for (const [name, list] of results) rows[name] = list;
234
+ return options.read(rows);
235
+ },
236
+ subscribe: (listener) => {
237
+ const controller = new AbortController();
238
+ for (const name of names) {
239
+ const query = options.queries[name];
240
+ db.watch(query.sql, [...query.parameters ?? []], { onResult: listener }, { signal: controller.signal });
241
+ }
242
+ return () => {
243
+ controller.abort();
244
+ };
245
+ }
246
+ });
247
+ }
248
+ //#endregion
249
+ //#region src/react-native/storage.ts
250
+ const SNAPSHOT_KEY = "permdock.snapshot";
251
+ const TENANT_KEY = "permdock.tenant";
252
+ function memoryStorage(initial = {}) {
253
+ const map = new Map(Object.entries(initial));
254
+ return {
255
+ getItem(key) {
256
+ return map.get(key) ?? null;
257
+ },
258
+ setItem(key, value) {
259
+ map.set(key, value);
260
+ },
261
+ removeItem(key) {
262
+ map.delete(key);
263
+ }
264
+ };
265
+ }
266
+ const NOTHING = {
267
+ stored: void 0,
268
+ tenant: void 0
269
+ };
270
+ /**
271
+ * A persisted snapshot the device may use: `subjectId`'s own, and signed
272
+ * whenever a verifier is configured, so a copy edited on the device never
273
+ * stands in for a signed one. `null` reads nothing.
274
+ */
275
+ function acceptStored(raw, subjectId, signed) {
276
+ if (raw === null || raw.length === 0 || subjectId === null) return;
277
+ if (isJws(raw)) return signed ? {
278
+ kind: "signed",
279
+ jws: raw
280
+ } : void 0;
281
+ if (signed) return;
282
+ try {
283
+ const snapshot = parseSnapshot(JSON.parse(raw));
284
+ return snapshot.subject.principal?.id === subjectId ? {
285
+ kind: "snapshot",
286
+ snapshot
287
+ } : void 0;
288
+ } catch {
289
+ return;
290
+ }
291
+ }
292
+ function tenantOf(raw) {
293
+ return raw === null || raw.length === 0 ? void 0 : raw;
294
+ }
295
+ /** The tenant is read only alongside an accepted snapshot. */
296
+ function storedRead(raw, tenantRaw, subjectId, signed) {
297
+ const stored = acceptStored(raw, subjectId, signed);
298
+ return {
299
+ stored,
300
+ tenant: stored === void 0 ? void 0 : tenantOf(tenantRaw)
301
+ };
302
+ }
303
+ function guardStorage(storage) {
304
+ let warned = false;
305
+ const fail = (error) => {
306
+ if (!(Reflect.get(globalThis, "__DEV__") === true) || warned) return;
307
+ warned = true;
308
+ console.warn("PermDock: the snapshot storage failed; guards answer from memory until it works again.", error);
309
+ };
310
+ const settle = (run) => {
311
+ try {
312
+ const result = run();
313
+ if (isThenable(result)) Promise.resolve(result).catch(fail);
314
+ } catch (error) {
315
+ fail(error);
316
+ }
317
+ };
318
+ return {
319
+ read(key) {
320
+ try {
321
+ return storage.getItem(key);
322
+ } catch (error) {
323
+ fail(error);
324
+ return null;
325
+ }
326
+ },
327
+ write(key, value) {
328
+ settle(() => storage.setItem(key, value));
329
+ },
330
+ remove(key) {
331
+ settle(() => storage.removeItem(key));
332
+ },
333
+ fail
334
+ };
335
+ }
336
+ /** `undefined` when the storage answers asynchronously; any failure reads as empty. */
337
+ function readStoredSync(storage, subjectId, signed) {
338
+ if (subjectId === null) return NOTHING;
339
+ const raw = storage.read(SNAPSHOT_KEY);
340
+ const tenantRaw = storage.read(TENANT_KEY);
341
+ if (isThenable(raw) || isThenable(tenantRaw)) return;
342
+ return storedRead(raw, tenantRaw, subjectId, signed);
343
+ }
344
+ async function readStored(storage, subjectId, signed) {
345
+ if (subjectId === null) return NOTHING;
346
+ try {
347
+ const [raw, tenantRaw] = await Promise.all([Promise.resolve(storage.read(SNAPSHOT_KEY)), Promise.resolve(storage.read(TENANT_KEY))]);
348
+ return storedRead(raw, tenantRaw, subjectId, signed);
349
+ } catch (error) {
350
+ storage.fail(error);
351
+ return NOTHING;
352
+ }
353
+ }
354
+ /** Writes `raw` (the snapshot JSON or its JWS) and the tenant. */
355
+ function persistSnapshot(storage, raw, tenant) {
356
+ storage.write(SNAPSHOT_KEY, raw);
357
+ if (tenant !== void 0) storage.write(TENANT_KEY, tenant);
358
+ }
359
+ function clearStorage(storage) {
360
+ storage.remove(SNAPSHOT_KEY);
361
+ storage.remove(TENANT_KEY);
362
+ }
363
+ //#endregion
364
+ //#region src/react-native/store.ts
365
+ /** The snapshot's content without `issuedAt`, which every local rebuild changes. */
366
+ function contentKey(snapshot) {
367
+ return JSON.stringify({
368
+ ...snapshot,
369
+ issuedAt: 0
370
+ });
371
+ }
372
+ /**
373
+ * Whether a source read changes nothing: same content as the snapshot the
374
+ * store holds, and the store already settled on it.
375
+ */
376
+ function unchanged(store, next) {
377
+ if (typeof next === "string" || store.get().status() === "stale") return false;
378
+ try {
379
+ return contentKey(parseSnapshot(next)) === contentKey(store.snapshot());
380
+ } catch {
381
+ return false;
382
+ }
383
+ }
384
+ /**
385
+ * Hydrates `store` from `source` now, on every change it reports and on each
386
+ * return to the foreground. Only the latest read applies; a read with
387
+ * unchanged content re-renders nothing, and a failed read keeps the current
388
+ * snapshot. Returns the unsubscribe.
389
+ */
390
+ function connectSource(store, source, subscribeForeground) {
391
+ let active = true;
392
+ let seq = 0;
393
+ const pull = () => {
394
+ seq += 1;
395
+ const mine = seq;
396
+ Promise.resolve().then(() => source.get()).then((next) => {
397
+ if (active && mine === seq && !unchanged(store, next)) store.replace(next);
398
+ }, () => void 0);
399
+ };
400
+ pull();
401
+ const unsubscribe = source.subscribe?.(pull);
402
+ const offForeground = subscribeForeground?.((next) => {
403
+ if (next !== false) pull();
404
+ });
405
+ return () => {
406
+ active = false;
407
+ unsubscribe?.();
408
+ offForeground?.();
409
+ };
410
+ }
411
+ function seedOf(stored) {
412
+ if (stored === void 0) return;
413
+ return stored.kind === "signed" ? stored.jws : stored.snapshot;
414
+ }
415
+ function belongsTo(snapshot, subjectId) {
416
+ return subjectId !== null && snapshot.subject.principal?.id === subjectId;
417
+ }
418
+ /** A JWS stays a string for the verifier; anything else parses or is dropped. */
419
+ function parseSeed(given) {
420
+ if (given === void 0) return;
421
+ if (typeof given === "string" && isJws(given)) return given;
422
+ try {
423
+ return parseSnapshot(typeof given === "string" ? JSON.parse(given) : given);
424
+ } catch {
425
+ return;
426
+ }
427
+ }
428
+ function createNativeStore(options) {
429
+ const storage = guardStorage(options.storage);
430
+ const signed = options.verifier !== void 0;
431
+ const revalidates = options.snapshotUrl !== void 0 || options.source !== void 0;
432
+ const seeded = parseSeed(options.snapshot);
433
+ const carried = options.previous !== void 0 && belongsTo(options.previous.snapshot(), options.subjectId) ? options.previous : void 0;
434
+ const sync = seeded === void 0 && carried === void 0 ? readStoredSync(storage, options.subjectId, signed) : void 0;
435
+ const waiting = seeded === void 0 && carried === void 0 && sync === void 0;
436
+ const fromStorage = seedOf(sync?.stored);
437
+ const snapshot = seeded ?? carried?.snapshot() ?? fromStorage ?? emptySnapshot();
438
+ const tenant = options.tenant ?? carried?.tenant() ?? sync?.tenant ?? void 0;
439
+ let booted = false;
440
+ const store = adapterStore(compact({
441
+ endpoint: options.endpoint,
442
+ snapshotUrl: options.snapshotUrl,
443
+ approvals: options.approvals,
444
+ tenant,
445
+ fetch: options.fetch,
446
+ headers: options.headers,
447
+ maxAge: options.maxAge,
448
+ verifier: options.verifier,
449
+ awaiting: waiting,
450
+ passCache: true
451
+ }), snapshot, {
452
+ server: false,
453
+ stale: revalidates && (fromStorage !== void 0 || waiting),
454
+ onSnapshot: (next, nextTenant, raw) => {
455
+ if (!booted || !belongsTo(next, options.subjectId)) return;
456
+ if (signed && raw === void 0) return;
457
+ persistSnapshot(storage, raw ?? JSON.stringify(next), nextTenant);
458
+ },
459
+ onClear: () => {
460
+ clearStorage(storage);
461
+ }
462
+ });
463
+ booted = true;
464
+ if (seeded !== void 0 && typeof seeded !== "string") {
465
+ if (belongsTo(seeded, options.subjectId)) persistSnapshot(storage, JSON.stringify(seeded), tenant);
466
+ } else if (seeded !== void 0 && signed) persistSnapshot(storage, seeded, tenant);
467
+ if (options.subjectId === null) clearStorage(storage);
468
+ if (waiting) {
469
+ let storedTenant;
470
+ const read = readStored(storage, options.subjectId, signed).then(({ stored, tenant: persisted }) => {
471
+ const value = seedOf(stored);
472
+ if (value === void 0) throw new Error("nothing stored");
473
+ storedTenant = persisted;
474
+ return value;
475
+ });
476
+ store.track(read);
477
+ read.then(() => {
478
+ if (options.tenant === void 0 && storedTenant !== void 0 && store.tenant() !== storedTenant && store.snapshot().tenants.includes(storedTenant)) store.get().refresh({ tenant: storedTenant });
479
+ }, () => void 0);
480
+ }
481
+ return store;
482
+ }
483
+ //#endregion
484
+ //#region src/react-native/provider.tsx
485
+ function PermDockProvider(props) {
486
+ const live = useLiveOptions(props, false);
487
+ const shown = useRef(null);
488
+ const store = useKeyed(() => createNativeStore(compact({
489
+ storage: props.storage,
490
+ subjectId: props.subjectId,
491
+ snapshot: props.snapshot,
492
+ snapshotUrl: props.snapshotUrl,
493
+ source: props.source,
494
+ endpoint: props.endpoint,
495
+ approvals: props.approvals,
496
+ tenant: props.tenant,
497
+ fetch: live.fetch,
498
+ headers: live.readHeaders,
499
+ maxAge: props.maxAge,
500
+ verifier: live.verifier,
501
+ previous: shown.current ?? void 0
502
+ })), [
503
+ props.storage,
504
+ props.subjectId,
505
+ props.snapshot,
506
+ props.snapshotUrl,
507
+ props.source,
508
+ props.endpoint,
509
+ props.approvals,
510
+ props.tenant,
511
+ live.fetch,
512
+ props.maxAge,
513
+ live.verifier
514
+ ]);
515
+ useEffect(() => {
516
+ const previous = shown.current;
517
+ shown.current = store;
518
+ if (previous !== null && previous !== store) previous.dispose();
519
+ }, [store]);
520
+ useEffect(() => props.source === void 0 ? void 0 : connectSource(store, props.source, props.subscribeForeground), [
521
+ store,
522
+ props.source,
523
+ props.subscribeForeground
524
+ ]);
525
+ useEffect(() => {
526
+ if (props.snapshotUrl === void 0) return;
527
+ const mode = props.revalidate ?? "launch";
528
+ let inFlight = false;
529
+ let online = true;
530
+ let active = true;
531
+ let timer;
532
+ const refresh = () => {
533
+ if (inFlight || !online) return;
534
+ inFlight = true;
535
+ store.get().refresh().catch(() => void 0).finally(() => {
536
+ inFlight = false;
537
+ });
538
+ };
539
+ const startTimer = () => {
540
+ if (typeof mode === "number" && timer === void 0) timer = setInterval(refresh, mode * 1e3);
541
+ };
542
+ const stopTimer = () => {
543
+ if (timer !== void 0) {
544
+ clearInterval(timer);
545
+ timer = void 0;
546
+ }
547
+ };
548
+ refresh();
549
+ startTimer();
550
+ const offForeground = props.subscribeForeground?.((next) => {
551
+ const now = next !== false;
552
+ if (now === active) {
553
+ if (now && mode === "focus") refresh();
554
+ return;
555
+ }
556
+ active = now;
557
+ if (!active) {
558
+ stopTimer();
559
+ return;
560
+ }
561
+ startTimer();
562
+ if (mode === "focus" || typeof mode === "number") refresh();
563
+ });
564
+ const offOnline = props.subscribeOnline?.((next) => {
565
+ const back = next && !online;
566
+ online = next;
567
+ if (back && active) refresh();
568
+ });
569
+ return () => {
570
+ stopTimer();
571
+ offForeground?.();
572
+ offOnline?.();
573
+ };
574
+ }, [
575
+ store,
576
+ props.revalidate,
577
+ props.snapshotUrl,
578
+ props.subscribeForeground,
579
+ props.subscribeOnline
580
+ ]);
581
+ return /* @__PURE__ */ jsx(PermDockStoreContext, {
582
+ value: store,
583
+ children: props.children
584
+ });
585
+ }
586
+ //#endregion
587
+ //#region src/react-native/storage-adapters.ts
588
+ /** SecureStore warns above 2048 bytes and may refuse larger values on some devices. */
589
+ const SECURE_STORE_CHUNK_BYTES = 2048;
590
+ const INDEX_PREFIX = "permdock-chunks:";
591
+ function utf8Length(char) {
592
+ const point = char.codePointAt(0) ?? 0;
593
+ if (point < 128) return 1;
594
+ if (point < 2048) return 2;
595
+ return point < 65536 ? 3 : 4;
596
+ }
597
+ function split(value, max) {
598
+ const out = [];
599
+ let current = "";
600
+ let bytes = 0;
601
+ for (const char of value) {
602
+ const size = utf8Length(char);
603
+ if (bytes + size > max) {
604
+ out.push(current);
605
+ current = "";
606
+ bytes = 0;
607
+ }
608
+ current += char;
609
+ bytes += size;
610
+ }
611
+ out.push(current);
612
+ return out;
613
+ }
614
+ function chunkCount(index) {
615
+ if (index?.startsWith(INDEX_PREFIX) !== true) return;
616
+ const count = Number(index.slice(16));
617
+ return Number.isSafeInteger(count) && count > 0 ? count : void 0;
618
+ }
619
+ function chunkKey(key, index) {
620
+ return `${key}.${index}`;
621
+ }
622
+ /**
623
+ * A `PermDockStorage` over `expo-secure-store`. Values are split into chunks
624
+ * of at most 2048 bytes under `<key>.<n>`; `<key>` holds the chunk count and
625
+ * is written last, so an interrupted write reads as absent.
626
+ */
627
+ function secureStoreStorage(store, options) {
628
+ const removeChunks = async (key, from, to) => {
629
+ for (let index = from; index < to; index += 1) await store.deleteItemAsync(chunkKey(key, index), options);
630
+ };
631
+ return {
632
+ getItem: (key) => {
633
+ const count = chunkCount(store.getItem(key, options));
634
+ if (count === void 0) return null;
635
+ let value = "";
636
+ for (let index = 0; index < count; index += 1) {
637
+ const part = store.getItem(chunkKey(key, index), options);
638
+ if (part === null) return null;
639
+ value += part;
640
+ }
641
+ return value;
642
+ },
643
+ setItem: async (key, value) => {
644
+ const before = chunkCount(store.getItem(key, options)) ?? 0;
645
+ await store.deleteItemAsync(key, options);
646
+ const parts = split(value, SECURE_STORE_CHUNK_BYTES);
647
+ for (const [index, part] of parts.entries()) store.setItem(chunkKey(key, index), part, options);
648
+ store.setItem(key, `${INDEX_PREFIX}${parts.length}`, options);
649
+ await removeChunks(key, parts.length, before);
650
+ },
651
+ removeItem: async (key) => {
652
+ const before = chunkCount(store.getItem(key, options)) ?? 0;
653
+ await store.deleteItemAsync(key, options);
654
+ await removeChunks(key, 0, before);
655
+ }
656
+ };
657
+ }
658
+ /** A synchronous `PermDockStorage` over a `react-native-mmkv` instance: the first frame already has the snapshot. */
659
+ function mmkvStorage(mmkv) {
660
+ return {
661
+ getItem: (key) => mmkv.getString(key) ?? null,
662
+ setItem: (key, value) => {
663
+ mmkv.set(key, value);
664
+ },
665
+ removeItem: (key) => {
666
+ if ("remove" in mmkv) mmkv.remove(key);
667
+ else mmkv.delete(key);
668
+ }
669
+ };
670
+ }
671
+ //#endregion
672
+ //#region src/react-native/subscriptions.ts
673
+ /**
674
+ * `subscribeForeground` over `AppState`: `active` returns to the foreground
675
+ * and `background` leaves it. iOS `inactive` (a system sheet over the app) is
676
+ * neither.
677
+ */
678
+ function appStateForeground(appState) {
679
+ return (listener) => {
680
+ const subscription = appState.addEventListener("change", (state) => {
681
+ if (state === "active") listener(true);
682
+ else if (state === "background") listener(false);
683
+ });
684
+ return () => {
685
+ subscription.remove();
686
+ };
687
+ };
688
+ }
689
+ /** `subscribeOnline` over NetInfo. An unknown (`null`) connection counts as online. */
690
+ function netInfoOnline(netInfo) {
691
+ return (listener) => netInfo.addEventListener((state) => {
692
+ listener(state.isConnected !== false && state.isInternetReachable !== false);
693
+ });
694
+ }
695
+ //#endregion
696
+ export { PermDockProvider, Protected, appStateForeground, approvalHeaders, buildLocalSnapshot, connectSource, createNativeStore, describe, localSnapshot, memoryStorage, mmkvStorage, netInfoOnline, parseLocalSnapshotManifest, powersyncSource, requiredPlans, secureStoreStorage, useApproval, useAssignablePermissions, useAssignableRoles, useFilter, useMemberships, usePermDock, usePermission, usePermissionGuard, usePermissions, useRoles, useSnapshotReady, useSubject, useTenant };