permdock 0.3.1 → 0.5.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.
- package/README.md +37 -35
- package/dist/{openapi-schema--ARjyfQr.js → 2020-C9VN-x8c.js} +5 -132
- package/dist/a2a/index.d.ts +8 -6
- package/dist/a2a/index.js +21 -31
- package/dist/{adapter-context-mlWsVGGg.js → adapter-context-CRhqyzCk.js} +1 -1
- package/dist/adoption-scan-B4R5fnMU.js +107 -0
- package/dist/agent/index.d.ts +3 -0
- package/dist/agent/index.js +1 -0
- package/dist/ai-sdk/index.d.ts +18 -23
- package/dist/ai-sdk/index.js +38 -21
- package/dist/app-data-MuyzVqX8.js +60 -0
- package/dist/approval-header-CJACtHkv.js +23 -0
- package/dist/approval-prompt-Dg5LeAcT.js +62 -0
- package/dist/approval-prompt-Djo_PyZc.d.ts +57 -0
- package/dist/approvals/index.d.ts +5 -3
- package/dist/approvals/index.js +8 -5
- package/dist/approvals-DJ6Yd5z1.js +995 -0
- package/dist/{approvers-DT4AVyIg.js → approvers-CqPOLD-o.js} +1 -1
- package/dist/arazzo-B6lebmiQ.js +36 -0
- package/dist/{arazzo-BAgw9ap6.js → arazzo-BWhNF-k0.js} +24 -17
- package/dist/args-IIolxxKA.js +197 -0
- package/dist/astro/index.d.ts +43 -0
- package/dist/astro/index.js +27 -0
- package/dist/audience-Dg8XsRaO.js +55 -0
- package/dist/auth-DRLEizbL.js +178 -0
- package/dist/authzen/index.d.ts +26 -6
- package/dist/authzen/index.js +228 -75
- package/dist/automation-BMZPIVUM.d.ts +114 -0
- package/dist/automation-DVjOckjV.js +157 -0
- package/dist/better-auth/index.d.ts +8 -6
- package/dist/better-auth/index.js +11 -23
- package/dist/better-supabase/index.d.ts +438 -86
- package/dist/better-supabase/index.js +1027 -184
- package/dist/bind--9EFVYWF.d.ts +38 -0
- package/dist/{bind-CuzGytRf.js → bind-CZzhx-Vj.js} +22 -10
- package/dist/body-CH5of8Ne.js +10 -0
- package/dist/body-text-QcXok_SI.js +52 -0
- package/dist/build-instance-BMnAudHn.js +52 -0
- package/dist/{canonical-json-DemiK4Vp.js → canonical-json-BC8_nMTw.js} +6 -6
- package/dist/{capability-2kYTMWDv.d.ts → capability-BSslw1QV.d.ts} +44 -25
- package/dist/{capability-4qPdO9gk.js → capability-N1K9IpqS.js} +69 -42
- package/dist/casbin-Cr7RLtA3.js +30 -0
- package/dist/casbin-Dyu2gnUD.js +234 -0
- package/dist/casl-64gpT-8x.js +24 -0
- package/dist/casl-DjEDhTCP.js +299 -0
- package/dist/catalog/index.d.ts +74 -2
- package/dist/catalog/index.js +51 -2
- package/dist/catalog-BECMPrwc.js +100 -0
- package/dist/catalog-DjhMYYCq.js +1 -0
- package/dist/catalog-R_A__RsH.js +52 -0
- package/dist/{catalog-doc-DdGm82XT.js → catalog-doc-C9wjsfNY.js} +54 -25
- package/dist/catalog-fingerprint-CCP0-yQS.js +153 -0
- package/dist/chat/index.d.ts +2 -0
- package/dist/chat/index.js +224 -0
- package/dist/chat-sdk/index.d.ts +87 -0
- package/dist/chat-sdk/index.js +197 -0
- package/dist/claims-map-7oQ3ue4X.js +13 -0
- package/dist/claims-map-Ca-QX8C6.d.ts +32 -0
- package/dist/claude-agent/index.d.ts +7 -14
- package/dist/claude-agent/index.js +26 -30
- package/dist/clerk/index.d.ts +9 -8
- package/dist/clerk/index.js +15 -45
- package/dist/cli/bin.js +36 -17
- package/dist/cli/index.d.ts +20 -6
- package/dist/cli/index.js +164 -4
- package/dist/cloud/index.d.ts +102 -63
- package/dist/cloud/index.js +240 -347
- package/dist/cloud-CIoHNevm.js +87 -0
- package/dist/codemod-Bmj9dWMH.js +37 -0
- package/dist/codemod-Cxvvc70T.js +2084 -0
- package/dist/{collect-DSTE3ml9.js → collect-CrZJJnEF.js} +79 -17
- package/dist/collect-DloHbDVa.js +55 -0
- package/dist/collect-FlXJlhus.js +1 -0
- package/dist/command-L8EstFNm.js +6 -0
- package/dist/{compact-y6vfu2_f.js → compact-CAf557ZB.js} +11 -1
- package/dist/compile/index.d.ts +1 -1
- package/dist/compile/index.js +1 -2
- package/dist/{compile-Ba4blROR.js → compile-CMqMx_IN.js} +13 -9
- package/dist/{compile-BkRyBDBw.d.ts → compile-Ckm2HqBZ.d.ts} +5 -3
- package/dist/completion-BqhRBJD8.js +143 -0
- package/dist/config-B46rm9sc.js +26 -0
- package/dist/{config-BJiM-xAm.js → config-bs_kZeYq.js} +15 -10
- package/dist/{config-report-CdCgbRnV.js → config-report-DUgj62Ai.js} +17 -8
- package/dist/{connection-CU8MQxRi.js → connection-DjhIJSs2.js} +8 -6
- package/dist/constants-DcJABbLW.js +20 -0
- package/dist/{context-Bcy85rGi.js → context-bbFHR-0D.js} +16 -5
- package/dist/convex/index.d.ts +11 -10
- package/dist/convex/index.js +18 -18
- package/dist/create-0VZ7Pdiu.d.ts +107 -0
- package/dist/create-BDS7wc3y.d.ts +138 -0
- package/dist/create-BFfm17UA.d.ts +110 -0
- package/dist/create-BWRSXgOF.js +403 -0
- package/dist/create-C3b4B5eF.js +130 -0
- package/dist/create-DnrmLnLW.js +323 -0
- package/dist/{credential-8P81ff4u.js → credential-DM2um3ha.js} +153 -32
- package/dist/credentials-DPyHmYz5.js +74 -0
- package/dist/deciding-columns-Sq12mEA6.js +123 -0
- package/dist/delegation-DaXVdDhM.js +286 -0
- package/dist/delegation-input-FTxMK3ji.js +19 -0
- package/dist/delivery/index.d.ts +5 -0
- package/dist/delivery/index.js +5 -0
- package/dist/delivery-DCAgNyCn.js +499 -0
- package/dist/delivery-event-xX4obB8F.js +40 -0
- package/dist/denied-text-D8jDHgsl.d.ts +19 -0
- package/dist/{describe-DMYiCjJV.d.ts → describe-BZUsixiL.d.ts} +11 -2
- package/dist/{describe-B_gVZEVi.js → describe-BybMRY7A.js} +10 -5
- package/dist/device-BARQ8eYG.js +193 -0
- package/dist/diff-CxZo9pTq.js +37 -0
- package/dist/{diff-2VaeChzX.js → diff-DCePiN6M.js} +61 -55
- package/dist/doctor-CxiwSfqH.js +44 -0
- package/dist/doctor-DFjUxf2f.js +2361 -0
- package/dist/drizzle/index.d.ts +5 -3
- package/dist/drizzle/index.js +6 -14
- package/dist/elysia/index.d.ts +16 -13
- package/dist/elysia/index.js +14 -13
- package/dist/env-DJZrPjRi.js +8 -0
- package/dist/errors-BDUwg2qC.js +27 -0
- package/dist/{errors-Cz5zn0mW.js → errors-BKy0EfhN.js} +6 -10
- package/dist/errors-BWXBMaKK.d.ts +11 -0
- package/dist/{errors-DPdqI50v.d.ts → errors-C2PXIv4c.d.ts} +2 -2
- package/dist/errors-CWTY6uih.js +143 -0
- package/dist/evaluate-_R8QkWaf.js +1732 -0
- package/dist/evaluations-16UqqQ6W.d.ts +32 -0
- package/dist/{evaluations-tz6D9A2G.js → evaluations-DZ2CbV5k.js} +181 -32
- package/dist/eve/index.d.ts +12 -16
- package/dist/eve/index.js +23 -29
- package/dist/event-time-CsegxXxB.js +23 -0
- package/dist/expiry-D4_YKRKD.js +52 -0
- package/dist/express/index.d.ts +13 -10
- package/dist/express/index.js +14 -12
- package/dist/fastify/index.d.ts +26 -13
- package/dist/fastify/index.js +17 -36
- package/dist/fetch-adapter-g0ypLkID.js +120 -0
- package/dist/fetch-adapter-qKJBuRqy.d.ts +31 -0
- package/dist/fields-D9tPVUUS.js +203 -0
- package/dist/files-C5ZI27eV.js +124 -0
- package/dist/{files-DWUN9PzI.js → files-D_JIzUrP.js} +12 -3
- package/dist/{fixtures-ht28Cplr.js → fixtures-B7XrLeY7.js} +12 -12
- package/dist/flags-C3DktBDY.js +86 -0
- package/dist/{from-snapshot-CTLijvdm.js → from-snapshot-D2lZt4Dd.js} +78 -65
- package/dist/{generate-CH7ThJ14.js → generate-CNU1pIOo.js} +1 -3
- package/dist/grantee-Cn1HyUsI.js +254 -0
- package/dist/grantee-conditions-CcXf8hMM.js +271 -0
- package/dist/grantee-match-DHArqY82.js +142 -0
- package/dist/h3/index.d.ts +37 -0
- package/dist/h3/index.js +35 -0
- package/dist/headers-BIjfMaoC.js +8 -0
- package/dist/headers-CIbDTUTK.d.ts +7 -0
- package/dist/{helpers-H_KARDVC.js → helpers-DTcZOzhF.js} +47 -39
- package/dist/hono/index.d.ts +12 -9
- package/dist/hono/index.js +14 -13
- package/dist/{hosted-DJQw46hn.js → hosted-BZIAYvon.js} +64 -15
- package/dist/hosted-DBDX0M-P.d.ts +78 -0
- package/dist/{http-SO7qGttf.js → http-BBoKefeS.js} +35 -2
- package/dist/{http-DPuDaChb.d.ts → http-B_LphE5Y.d.ts} +1 -2
- package/dist/http-DXJ37RDA.js +46 -0
- package/dist/{http-BIhmLfCc.js → http-ujKm0JXE.js} +3 -26
- package/dist/{openapi-import-cmwetbzw.js → import-CNV7I2Dw.js} +30 -26
- package/dist/{rls-import-4lLW_pbb.js → import-DMmOG27O.js} +271 -128
- package/dist/index-BcHcPyIo.d.ts +110 -0
- package/dist/index-CaxrMD1A.d.ts +1 -0
- package/dist/index-Chrs5fQ-.d.ts +210 -0
- package/dist/index-CxGUswIC.d.ts +431 -0
- package/dist/index-D8EovfsP.d.ts +91 -0
- package/dist/index-DOVf7RJv.d.ts +900 -0
- package/dist/{index-C8z4RjQV.d.ts → index-SGdIQyzc.d.ts} +34 -16
- package/dist/index.d.ts +20 -14
- package/dist/index.js +33 -23
- package/dist/init-DeMYsnYJ.js +96 -0
- package/dist/init-GG6Jh8HD.js +95 -0
- package/dist/{instance-options-jARdwfPN.d.ts → instance-options-Omfd793B.d.ts} +2 -2
- package/dist/instance-snapshot-Cxq4ygFc.js +600 -0
- package/dist/instant-BluqDvyS.js +19 -0
- package/dist/internals-Dk8A8fX3.js +17 -0
- package/dist/{json-schema-BsAflUGW.js → json-schema-B-vAwlde.js} +46 -9
- package/dist/json-schema-CN_iLFH2.d.ts +40 -0
- package/dist/jwt/index.d.ts +18 -11
- package/dist/jwt/index.js +166 -145
- package/dist/{kernel-_RRHmnMY.js → kernel-5JatXyND.js} +120 -43
- package/dist/kysely/index.d.ts +5 -3
- package/dist/kysely/index.js +6 -14
- package/dist/{live-options-H2eG8dfJ.js → live-options-BaAFCIiu.js} +16 -3
- package/dist/load-BxEtwlBS.js +1 -0
- package/dist/{load-DhWEB9P1.js → load-DFS_ry0W.js} +31 -7
- package/dist/{load-jose-BL6LH4bL.js → load-jose-DZ4dnjri.js} +1 -4
- package/dist/login-Dfe5RlYk.js +68 -0
- package/dist/login-imhuwvn3.js +254 -0
- package/dist/manifest-C8IzW3Do.js +42 -0
- package/dist/manifest-CtKR3GXL.js +370 -0
- package/dist/manifest-json-CAGzls-C.js +9 -0
- package/dist/{manifest-uDS9y5de.d.ts → manifest-mx5ghSFM.d.ts} +9 -2
- package/dist/manifest-schema-C0kK_8V0.js +399 -0
- package/dist/{map-claims-Z4QZOiFF.js → map-claims-D3oRmTk0.js} +19 -25
- package/dist/{map-error-pgUWNNtG.js → map-error-TCAdw-eW.js} +5 -5
- package/dist/{markers-B0hYLvMD.js → markers-C6joDI3o.js} +8 -3
- package/dist/mcp/index.d.ts +36 -9
- package/dist/mcp/index.js +476 -448
- package/dist/{rls-migrate-CN4TlJTO.js → migrate-BShP7Vf4.js} +119 -20
- package/dist/nest/index.d.ts +12 -9
- package/dist/nest/index.js +20 -20
- package/dist/next/index.d.ts +40 -20
- package/dist/next/index.js +37 -39
- package/dist/next/plugin.d.ts +1 -1
- package/dist/next/plugin.js +2 -2
- package/dist/node/index.d.ts +10 -10
- package/dist/node/index.js +7 -9
- package/dist/ocsf-BFp-PZZA.js +126 -0
- package/dist/openai/index.d.ts +9 -16
- package/dist/openai/index.js +18 -25
- package/dist/openapi/index.d.ts +3 -3
- package/dist/openapi/index.js +1 -1
- package/dist/{openapi-BqRBvAng.js → openapi-B7HZ0f-r.js} +9 -12
- package/dist/{openapi-CqqEbHsL.js → openapi-DTaEmTSW.js} +23 -26
- package/dist/openapi-ahr8rHu3.js +138 -0
- package/dist/operation-findings-DgATDpvh.js +36 -0
- package/dist/operations-CxybZErY.d.ts +59 -0
- package/dist/orpc/index.d.ts +13 -10
- package/dist/orpc/index.js +23 -20
- package/dist/otel/index.d.ts +3 -2
- package/dist/otel/index.js +53 -27
- package/dist/output-Dyw8fyPF.js +88 -0
- package/dist/output-files-B3IZJksC.js +1 -0
- package/dist/output-files-DhRBBE4n.js +138 -0
- package/dist/{rls-fields-CZOMlwHl.js → ownership-BatFgAA4.js} +2393 -2349
- package/dist/{package-root-zGkxO3oN.js → package-root-Dk_ETdkp.js} +4 -3
- package/dist/{parse-BuyjxhZV.js → parse-Cxq0WxrA.js} +3 -3
- package/dist/{parse-local-manifest-BrMozJCo.js → parse-local-manifest-CVSs6J9I.js} +2 -4
- package/dist/{parse-local-manifest-JLnaBH0S.d.ts → parse-local-manifest-DgqtruPn.d.ts} +1 -1
- package/dist/parse-request-D_tUXG6M.js +26 -0
- package/dist/paths-DXSHAMIa.js +42 -0
- package/dist/pdp/index.d.ts +7 -3
- package/dist/pdp/index.js +47 -29
- package/dist/{peer-BOr_kJE1.js → peer-C8swJ2GH.js} +23 -4
- package/dist/peer-CRvC7Hg1.js +1 -0
- package/dist/permdock-B9JxkBwC.js +868 -0
- package/dist/permdock-D7eeLJER.d.ts +502 -0
- package/dist/permission-registry-Br4jSNVi.js +385 -0
- package/dist/permissions-B-wCP5ZC.js +30 -0
- package/dist/{permissions-RJrovw98.js → permissions-CZKiUfFM.js} +4 -3
- package/dist/{permissions-CDgvKG5L.d.ts → permissions-oEWfl-kl.d.ts} +1 -2
- package/dist/policies-CO1oOymN.js +295 -0
- package/dist/{policy-D2W7uv19.d.ts → policy-Czo4n3Hs.d.ts} +2 -2
- package/dist/policy-DLZJ5gAp.js +399 -0
- package/dist/policy-from-catalog-DzhEc3Y9.js +450 -0
- package/dist/policy-module-CTlwMvLI.js +89 -0
- package/dist/{policy-IB6yxpC3.d.ts → policy-types-DzwivBgR.d.ts} +939 -1057
- package/dist/postgrest-CW0IqC-U.js +566 -0
- package/dist/postgrest-NUqZT-RB.d.ts +100 -0
- package/dist/powersync-BHfuehf3.js +62 -0
- package/dist/powersync-CbzkqL_M.js +1 -0
- package/dist/{powersync-Dv1_aWF7.js → powersync-bYUDLOAO.js} +30 -32
- package/dist/preset/index.d.ts +146 -0
- package/dist/preset/index.js +1 -0
- package/dist/preset-DZdU0tne.js +1768 -0
- package/dist/principal-source-pHneukrx.js +103 -0
- package/dist/prisma/index.d.ts +6 -3
- package/dist/prisma/index.js +6 -12
- package/dist/{problem-B43ztKIm.js → problem-CTviyH5L.js} +18 -27
- package/dist/{problem-details-DX075l9V.d.ts → problem-details-DXlt-vks.d.ts} +1 -1
- package/dist/{problem-details-_AMOYz-w.js → problem-details-cn5X30gZ.js} +45 -42
- package/dist/problem-types-CJ2325SZ.js +5 -0
- package/dist/{prompt-CXYhLfsS.js → prompt-DfZLJLIn.js} +2 -2
- package/dist/protected-DEPHc2xV.d.ts +38 -0
- package/dist/{protected-utU-SLuy.js → protected-DfjY5mLA.js} +37 -8
- package/dist/{provider-CSQd7m92.js → provider-CC-u3bYP.js} +23 -10
- package/dist/{provider-DZY281jO.d.ts → provider-DMVt6yYn.d.ts} +1 -1
- package/dist/{provider-store-Cfbvo4DE.js → provider-store-B5Yrkhzr.js} +6 -3
- package/dist/pull-BgIfno6w.js +256 -0
- package/dist/pull-ByOks_Tg.js +1 -0
- package/dist/push-CmFVBOeI.js +116 -0
- package/dist/pushed-policy-BImMTTIM.d.ts +57 -0
- package/dist/pushed-policy-DobP7AHI.js +238 -0
- package/dist/react/index.d.ts +8 -8
- package/dist/react/index.js +6 -6
- package/dist/react/provider-client.d.ts +1 -1
- package/dist/react/provider-client.js +1 -2
- package/dist/react-native/index.d.ts +24 -63
- package/dist/react-native/index.js +45 -27
- package/dist/{refs-KYb4ntaz.js → refs-K6eWUJ0H.js} +1 -1
- package/dist/relation-walk-3OyDBF0S.js +186 -0
- package/dist/relations-BnCWnJGI.js +163 -0
- package/dist/renames-CGj7YwcQ.js +175 -0
- package/dist/{replay-CYyiLiwO.d.ts → replay-D7iKcLFe.d.ts} +1 -1
- package/dist/{replay-BsOyTrdV.js → replay-Du1tJjG7.js} +2 -1
- package/dist/request-context-BTRTG7OT.js +71 -0
- package/dist/request-context-C2_1lchh.d.ts +5 -0
- package/dist/request-schema-CMreVuFM.js +148 -0
- package/dist/resend/index.d.ts +126 -0
- package/dist/resend/index.js +379 -0
- package/dist/resource-relations-D_jw0BFx.js +243 -0
- package/dist/retire-CALjIQ7e.js +240 -0
- package/dist/{revocations-Cy06JNx2.d.ts → revocations-R07lFBnX.d.ts} +2 -0
- package/dist/rls-BA8an5Ap.js +336 -0
- package/dist/{rls-DiinlRML.js → rls-j6t43t7n.js} +1066 -1068
- package/dist/role-builder-CXbis5-X.js +623 -0
- package/dist/{rpc-DL9Sqvb1.js → rpc-aPyNi6tA.js} +18 -8
- package/dist/run-CNsApDpd.js +1 -0
- package/dist/run-DOfMtc9V.js +723 -0
- package/dist/run-ticket-BjhTOi6u.d.ts +124 -0
- package/dist/run-ticket-sxFI6LAk.js +337 -0
- package/dist/{runtime-CB8gQFvS.js → runtime-D3VTAiCA.js} +1 -1
- package/dist/{saas-DhpJjnBA.js → saas-FO-Q8oj0.js} +18 -15
- package/dist/scan-BOI5tJ-6.js +29 -0
- package/dist/{schema-D3MnDMxa.js → schema-B4v0Qrac.js} +106 -10
- package/dist/schema-yLuBWWsh.js +130 -0
- package/dist/scim/index.d.ts +2 -2
- package/dist/scim/index.js +1 -2
- package/dist/{scim-BFGBBAqR.js → scim-ClHtpyV3.js} +213 -87
- package/dist/{scopes-CVdPrWN-.js → scopes-CUPSjo9q.js} +20 -7
- package/dist/server/index.d.ts +13 -134
- package/dist/server/index.js +13 -10
- package/dist/server-DqCT4CgZ.js +453 -0
- package/dist/{create-B1d519XK.d.ts → server-types-BLd4MnBX.d.ts} +89 -70
- package/dist/{sha256-BO0swRXL.js → sha256-D9ihqmvd.js} +8 -1
- package/dist/shared-CD11nBbC.js +304 -0
- package/dist/{shared-DRu8VFVM.js → shared-DvvFzYXe.js} +8 -9
- package/dist/signals-D3NcTKUS.js +32 -0
- package/dist/sink-BEZSlMS_.js +957 -0
- package/dist/sink-Bj_lDUDq.d.ts +225 -0
- package/dist/{skills-Biq5uup3.js → skills-B6lVdD_W.js} +16 -8
- package/dist/skills-CTYwkl44.js +51 -0
- package/dist/snapshot-CXUWfsNy.js +269 -0
- package/dist/{snapshot-cache-D6jLelln.js → snapshot-cache-DZHQ0KF6.js} +11 -5
- package/dist/{snapshot-cache-B-LxUahj.d.ts → snapshot-cache-DqK9eDmM.d.ts} +7 -5
- package/dist/solid/index.d.ts +24 -25
- package/dist/solid/index.js +41 -11
- package/dist/solid-start/index.d.ts +52 -0
- package/dist/solid-start/index.js +49 -0
- package/dist/{sources-BdOYLw9j.d.ts → sources-BV9j0DeZ.d.ts} +11 -13
- package/dist/{sources-4p0-4xQm.js → sources-vs5dGOsS.js} +147 -142
- package/dist/sql-B5T1IL83.js +55 -0
- package/dist/src-DLfUWFAI.js +1851 -0
- package/dist/ssf/index.d.ts +4 -4
- package/dist/ssf/index.js +440 -106
- package/dist/standard-webhooks-6lg8v_is.d.ts +88 -0
- package/dist/standard-webhooks-DgFFD-Ga.js +228 -0
- package/dist/storage-C2bWdvJH.js +132 -0
- package/dist/{store-DMAWwAJV.js → store-4u_hxjWa.js} +42 -55
- package/dist/{store-options-ByhZq1jV.js → store-options-BqEakYRa.js} +38 -24
- package/dist/{stores-BT2pSCub.js → stores-BbsD4fAR.js} +7 -3
- package/dist/stores-ClZUgeoP.d.ts +30 -0
- package/dist/{stream-D1RXubw2.d.ts → stream-7-xmnf3U.d.ts} +2 -2
- package/dist/{stream-DDpvynSB.js → stream-CvdUS9V1.js} +10 -2
- package/dist/style-DiKWnAvn.js +1 -0
- package/dist/{style-CTm1AXDT.js → style-Uao76wO7.js} +3 -2
- package/dist/subject-BGoM5o8B.js +17 -0
- package/dist/{subject-settings-BwBmCdTR.js → subject-settings-CkEwrw3W.js} +23 -5
- package/dist/supabase/index.d.ts +23 -106
- package/dist/supabase/index.js +5 -4
- package/dist/supabase/middleware.d.ts +13 -6
- package/dist/supabase/middleware.js +16 -11
- package/dist/supabase-9pqI57pW.js +92 -0
- package/dist/{supabase-C0qESOa-.js → supabase-Dxlp8A94.js} +124 -247
- package/dist/supabase-hook-CXcGpHqq.js +1 -0
- package/dist/{supabase-hook-ntETYCQu.js → supabase-hook-DdDQhMlw.js} +1659 -819
- package/dist/{supautils-u8jXTGrt.js → supautils-B6HYL9eL.js} +2 -2
- package/dist/support-session-C6xJQYut.js +158 -0
- package/dist/svelte/Protected.svelte +11 -4
- package/dist/svelte/index.d.ts +7 -7
- package/dist/svelte/index.js +26 -12
- package/dist/svelte/runtime.d.ts +10 -3
- package/dist/svelte/runtime.js +4 -3
- package/dist/svelte/source.d.ts +7 -7
- package/dist/svelte/source.js +5 -5
- package/dist/sveltekit/index.d.ts +51 -0
- package/dist/sveltekit/index.js +27 -0
- package/dist/tanstack-start/index.d.ts +51 -0
- package/dist/tanstack-start/index.js +40 -0
- package/dist/target-Bw37TFNA.js +51 -0
- package/dist/{validity-uOp8UpYn.js → tenancy-DN2QAx9z.js} +6 -42
- package/dist/terminal/index.d.ts +11 -9
- package/dist/terminal/index.js +36 -316
- package/dist/testing/index.d.ts +391 -106
- package/dist/testing/index.js +4574 -1286
- package/dist/testing/saas/index.d.ts +9 -8
- package/dist/testing/saas/index.js +2 -2
- package/dist/testing/saas/permissions.d.ts +1 -1
- package/dist/testing/saas/permissions.js +1 -2
- package/dist/text-BMFRfBqc.js +8 -0
- package/dist/{text-diff-BdkkYSbi.js → text-diff-BQcUapOb.js} +1 -1
- package/dist/thenable-yD7SabqG.js +31 -0
- package/dist/time-DkWjdL98.js +71 -0
- package/dist/{token-CIWxJOCh.js → token-BLZcjQgt.js} +15 -6
- package/dist/tool-refusal-CMLN5xhn.js +41 -0
- package/dist/trpc/index.d.ts +12 -9
- package/dist/trpc/index.js +18 -17
- package/dist/{types-DbjRN55U.d.ts → types-5Ut_pbKy.d.ts} +141 -13
- package/dist/types-BNORmDM8.d.ts +172 -0
- package/dist/types-BjV-fqcA.d.ts +57 -0
- package/dist/{types-QCuYJh4q.d.ts → types-BqAKcRNW.d.ts} +2 -1
- package/dist/types-C8-KNsFf.d.ts +107 -0
- package/dist/{types-aqOHTHcp.d.ts → types-CCpc2Dcv.d.ts} +77 -17
- package/dist/{types-Dnemwd77.d.ts → types-CZTnPFzM.d.ts} +50 -11
- package/dist/{types-C97IskBw.d.ts → types-CdlxsYQh.d.ts} +23 -11
- package/dist/{types-DxiCGmmd.d.ts → types-ClZaWzfb.d.ts} +9 -6
- package/dist/types-DX0LaKTb.d.ts +157 -0
- package/dist/types-DiQjupG2.d.ts +332 -0
- package/dist/types-DqzsnlSA.js +67 -0
- package/dist/types-_sHy8BQf.d.ts +65 -0
- package/dist/types-fbZ7JEXr.d.ts +89 -0
- package/dist/types-tIgIeIKJ.d.ts +66 -0
- package/dist/unplugin/index.d.ts +1 -1
- package/dist/unplugin/index.js +2 -2
- package/dist/usage-CHOtwL19.js +1 -0
- package/dist/usage-DHtE8j4E.js +32 -0
- package/dist/{usage-ItS7nLcl.js → usage-T5mXq98v.js} +56 -13
- package/dist/{validation-error-Ba264OaJ.d.ts → validation-error-Bg5Tpluk.d.ts} +1 -1
- package/dist/{validation-error-CnjZ4t92.js → validation-error-ZfUHbKvf.js} +1 -1
- package/dist/validity-CZ7-y0Cj.js +79 -0
- package/dist/{verifier-BxBo6I44.js → verifier-DHuh-okk.js} +68 -21
- package/dist/verify-DbCL9bnB.js +1770 -0
- package/dist/{version-BvacVTZR.js → version-CEbQ5UeM.js} +4 -3
- package/dist/version-DXkYUISx.js +1 -0
- package/dist/{views-Soe7bGSC.js → views-DTIIO-oQ.js} +41 -2
- package/dist/{permissions-DttnqqxC.d.ts → vocabulary-D6lPdb4Z.d.ts} +120 -29
- package/dist/vue/index.d.ts +25 -21
- package/dist/vue/index.js +25 -9
- package/dist/waiter-BGUtGYoU.js +67 -0
- package/dist/waiter-CKy4MQSY.d.ts +36 -0
- package/dist/watch-Cb-NcaUw.js +1 -0
- package/dist/{watch-DVBJ9cBq.js → watch-CszoTJMq.js} +47 -8
- package/dist/webmcp/index.d.ts +2 -2
- package/dist/webmcp/index.js +13 -37
- package/dist/where-scope-Dv-WTP-w.js +306 -0
- package/dist/who-can-D0QoYbEb.js +364 -0
- package/dist/wire-delegation-Cv3W2eaM.js +36 -0
- package/dist/wire-denial-C7PaVYEM.js +27 -0
- package/dist/workflow/index.d.ts +5 -0
- package/dist/workflow/index.js +223 -0
- package/dist/workflow-sdk/index.d.ts +56 -0
- package/dist/workflow-sdk/index.js +78 -0
- package/dist/wrap-Bd1Tejur.d.ts +15 -0
- package/dist/wrap-gX61EtpB.js +27 -0
- package/package.json +140 -41
- package/schemas/access-event-v1.json +118 -0
- package/schemas/approval-request-v1.json +34 -1
- package/schemas/approval-signature-v1.json +94 -0
- package/schemas/automation-event-v1.json +113 -0
- package/schemas/capability-v1.json +84 -0
- package/schemas/catalog-event-v1.json +87 -0
- package/schemas/catalog-v1.json +129 -12
- package/schemas/cli-commands-v1.json +164 -0
- package/schemas/cli-result-v1.json +96 -0
- package/schemas/cloud-api-v1.json +5407 -0
- package/schemas/connector-v1.json +408 -0
- package/schemas/credential-event-v1.json +81 -0
- package/schemas/credential-v1.json +134 -0
- package/schemas/decision-event-v1.json +288 -0
- package/schemas/delivery-event-v1.json +117 -0
- package/schemas/directory-event-v1.json +85 -0
- package/schemas/evidence-export-v1.json +54 -0
- package/schemas/membership-event-v1.json +93 -0
- package/schemas/policy-v1.json +68 -0
- package/schemas/pushed-policy-v1.json +236 -0
- package/schemas/run-v1.json +162 -0
- package/schemas/snapshot-v1.json +138 -0
- package/schemas/supabase-claims-v1.json +4 -4
- package/schemas/supabase-manifest-v1.json +5 -1
- package/schemas/support-session-v1.json +111 -0
- package/skills/permdock/SKILL.md +16 -12
- package/skills/permdock-agents/SKILL.md +40 -23
- package/skills/permdock-agents/references/operations-automations-chat.md +221 -0
- package/skills/permdock-agents/references/runtimes.md +22 -18
- package/skills/permdock-approvals/SKILL.md +29 -13
- package/skills/permdock-approvals/references/delivery-and-waiters.md +172 -0
- package/skills/permdock-approvals/references/stores-and-resume.md +21 -7
- package/skills/permdock-audit/SKILL.md +3 -3
- package/skills/permdock-credentials/SKILL.md +5 -5
- package/skills/permdock-credentials/references/tokens-keys-links.md +19 -10
- package/skills/permdock-data/SKILL.md +6 -6
- package/skills/permdock-data/references/queries-and-rls.md +13 -8
- package/skills/permdock-data/references/relationships.md +3 -3
- package/skills/permdock-tenancy/SKILL.md +20 -7
- package/skills/permdock-tenancy/references/contacts-and-support-sessions.md +122 -0
- package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +6 -4
- package/skills/permdock-wire/SKILL.md +18 -12
- package/skills/permdock-wire/references/adapters.md +146 -50
- package/skills/permdock-wire/references/policy-options.md +15 -6
- package/skills/permdock-wire/references/presets-and-recipes.md +58 -0
- package/dist/approvals-DbYAuNkG.js +0 -224
- package/dist/arazzo-C9chp3ST.js +0 -54
- package/dist/bind-C_ob3LKa.d.ts +0 -25
- package/dist/catalog-CRW5Mx_B.js +0 -2
- package/dist/catalog-CYj-mX2O.js +0 -48
- package/dist/catalog-DWF5cYqB.js +0 -55
- package/dist/cloud-CfwZ39Rl.js +0 -50
- package/dist/cloud-DWLXO2af.js +0 -118
- package/dist/collect-CHB22Sx4.js +0 -83
- package/dist/collect-DSWOk19R.js +0 -2
- package/dist/commands-BeaGNj_o.js +0 -97
- package/dist/config-ir40y8m0.js +0 -36
- package/dist/create-CMwIl-w2.js +0 -253
- package/dist/delegation-D8pUEuce.js +0 -103
- package/dist/diff-C9RDjjhs.js +0 -48
- package/dist/doctor-Djh6JDEk.js +0 -53
- package/dist/doctor-DvH0IQff.js +0 -1194
- package/dist/doctor-collect-CjdO0wQX.js +0 -665
- package/dist/duration-xK2jGFVc.js +0 -25
- package/dist/errors-CWfoNg9N.js +0 -47
- package/dist/errors-DRnGZHzF.js +0 -30
- package/dist/evaluation-items-CfCCejQd.js +0 -40
- package/dist/expiry-BoBJ8Tvc.js +0 -7
- package/dist/fields-BMl1RxoX.js +0 -26
- package/dist/grantee-Cv5Sogfv.js +0 -602
- package/dist/headers-BZSDieNT.js +0 -6
- package/dist/headers-Cf-zWvsO.d.ts +0 -6
- package/dist/ids-DC4V4CFu.js +0 -18
- package/dist/index-0nNqHspG.d.ts +0 -6
- package/dist/index-BNc7Wer_.d.ts +0 -483
- package/dist/index-C7Tw7MaW.d.ts +0 -201
- package/dist/instance-options-Dhhcnm3y.js +0 -22
- package/dist/load-DwJUafYN.js +0 -2
- package/dist/manifest-iaoBXHKc.js +0 -783
- package/dist/map-AcxK9o_D.js +0 -147
- package/dist/may-use-DndQ5tQ-.js +0 -77
- package/dist/openapi-CQTsgKoB.js +0 -164
- package/dist/permdock-CbgvLnuo.js +0 -3479
- package/dist/permissions-DVoF6dMt.js +0 -662
- package/dist/policy-xyWg7QdR.js +0 -1122
- package/dist/powersync-CrBX8hY6.js +0 -2
- package/dist/powersync-DE19b9dT.js +0 -62
- package/dist/protected-BdnIEFkY.d.ts +0 -27
- package/dist/protected-xAr24FEC.d.ts +0 -40
- package/dist/relations-cjOL01hZ.js +0 -505
- package/dist/rls-P-BeBx0n.js +0 -238
- package/dist/rls-graph-CHwx0V8q.js +0 -435
- package/dist/rls-ownership-DcYlZ09B.js +0 -843
- package/dist/rls-shared-Cewd_-zI.js +0 -495
- package/dist/rls-verify-CMv9H3wV.js +0 -746
- package/dist/run-BWc9qqvE.js +0 -174
- package/dist/server-DlZ28Oz5.js +0 -268
- package/dist/sink-B1fZzIMf.d.ts +0 -104
- package/dist/sink-Bd9PSyfq.js +0 -141
- package/dist/skills-C5CbhhpG.js +0 -56
- package/dist/snapshot-Enxd0n-s.js +0 -975
- package/dist/sql-xdg5f4Fi.js +0 -27
- package/dist/src-BDwEZWrZ.js +0 -568
- package/dist/store-jOBYpiXC.d.ts +0 -36
- package/dist/stores-C0IMQrGI.d.ts +0 -52
- package/dist/subject-C6dLxqHU.js +0 -24
- package/dist/supabase-config-Bj3iDH2I.js +0 -472
- package/dist/supabase-hook-gd3s8bxB.js +0 -2
- package/dist/supabase-s4o9s1O1.js +0 -83
- package/dist/thenable-okc2xDsj.js +0 -10
- package/dist/types-BnIEz1sU.d.ts +0 -48
- package/dist/types-Bvc4oWT6.d.ts +0 -9
- package/dist/types-CKNSyIf_.d.ts +0 -52
- package/dist/types-Cq_H8N_X.d.ts +0 -197
- package/dist/usage-B0YuTQRO.js +0 -42
- package/dist/usage-DorAJiU_.js +0 -2
- package/dist/vocabulary-DA8a8zif.d.ts +0 -56
- package/dist/watch-BwxLTYMZ.js +0 -2
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { t as compact } from "./compact-
|
|
2
|
-
import {
|
|
1
|
+
import { r as isRecord, t as compact } from "./compact-CAf557ZB.js";
|
|
2
|
+
import { i as readAppData } from "./app-data-MuyzVqX8.js";
|
|
3
|
+
import { a as quoteQualifiedTable, c as quoteSqlTable, i as qualifySqlTable, o as quoteSqlIdent, s as quoteSqlLiteral, u as sqlTextArray } from "./sql-B5T1IL83.js";
|
|
3
4
|
//#region src/supabase/keep.ts
|
|
4
5
|
/** The permission keys of a suspended scope's `keep`, references read by `key`, sorted and unique. */
|
|
5
6
|
function keptKeys(row) {
|
|
@@ -11,123 +12,22 @@ function keptKeys(row) {
|
|
|
11
12
|
return [...new Set(valid)].toSorted();
|
|
12
13
|
}
|
|
13
14
|
//#endregion
|
|
14
|
-
//#region src/supabase/
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Resolves the role sources of `table` (`schema.table`, or `public`). An
|
|
20
|
-
* unqualified `through` table is in `table`'s schema. `label` names the
|
|
21
|
-
* option in the error for an `on` that is not exactly one column; `prefix`
|
|
22
|
-
* starts every error. A row with several sources holds the union of their
|
|
23
|
-
* non-null keys.
|
|
24
|
-
*/
|
|
25
|
-
function roleColumn(role, table, alias, options) {
|
|
26
|
-
if (!isRoleList(role)) return singleRole(role, table, alias, options);
|
|
27
|
-
const prefix = options.prefix ?? "PermDock";
|
|
28
|
-
const parts = role.map((part, index) => singleRole(part, table, alias, {
|
|
29
|
-
...options,
|
|
30
|
-
label: `${options.label}[${String(index)}]`
|
|
31
|
-
}));
|
|
32
|
-
const [first] = parts;
|
|
33
|
-
if (first === void 0) throw new TypeError(`${prefix}: ${options.label} needs at least one role source`);
|
|
34
|
-
if (parts.length === 1) return first;
|
|
35
|
-
const rows = quoteSqlIdent(`${alias}r`, prefix);
|
|
36
|
-
const values = quoteSqlIdent(`${alias}v`, prefix);
|
|
37
|
-
const sql = `${rows}.permdock_role`;
|
|
38
|
-
return {
|
|
39
|
-
column: first.column,
|
|
40
|
-
sql,
|
|
41
|
-
join: `${options.indent === void 0 ? " " : `\n${options.indent}`}cross join lateral (select ${values}.role from (values ${parts.map((part) => `(${part.lookup})`).join(", ")}) ${values}(role) where ${values}.role is not null) ${rows}(permdock_role)`,
|
|
42
|
-
lookup: sql,
|
|
43
|
-
columns: [...new Set(parts.map((part) => part.column))],
|
|
44
|
-
throughs: parts.flatMap((part) => part.throughs),
|
|
45
|
-
lateral: true
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
function singleRole(role, table, alias, options) {
|
|
49
|
-
const prefix = options.prefix ?? "PermDock";
|
|
50
|
-
const q = (name) => quoteSqlIdent(name, prefix);
|
|
51
|
-
if (typeof role === "string") return {
|
|
52
|
-
column: role,
|
|
53
|
-
sql: `${alias}.${q(role)}::text`,
|
|
54
|
-
join: "",
|
|
55
|
-
lookup: `${alias}.${q(role)}::text`,
|
|
56
|
-
columns: [role],
|
|
57
|
-
throughs: [],
|
|
58
|
-
lateral: false
|
|
59
|
-
};
|
|
60
|
-
const pairs = Object.entries(role.on);
|
|
61
|
-
const [pair] = pairs;
|
|
62
|
-
if (pair === void 0 || pairs.length !== 1) throw new TypeError(`${prefix}: ${options.label}.on must map exactly one column of ${table} to ${role.through}, for example ${options.example ?? "{ role_id: 'id' }"}`);
|
|
63
|
-
const [ref, id] = pair;
|
|
64
|
-
const schema = table.includes(".") ? table.split(".")[0] ?? "public" : "public";
|
|
65
|
-
const through = role.through.includes(".") ? role.through : `${schema}.${role.through}`;
|
|
66
|
-
const keys = options.joined ?? `${alias}k`;
|
|
67
|
-
const target = quoteSqlTable(through, prefix);
|
|
68
|
-
const keyed = {
|
|
69
|
-
table: through,
|
|
70
|
-
id,
|
|
71
|
-
key: role.column,
|
|
72
|
-
ref
|
|
73
|
-
};
|
|
74
|
-
return {
|
|
75
|
-
column: ref,
|
|
76
|
-
sql: `${keys}.${q(role.column)}::text`,
|
|
77
|
-
join: `${options.indent === void 0 ? " " : `\n${options.indent}`}join ${target} ${keys} on ${keys}.${q(id)} = ${alias}.${q(ref)}`,
|
|
78
|
-
lookup: `(select ${keys}.${q(role.column)}::text from ${target} ${keys} where ${keys}.${q(id)} = ${alias}.${q(ref)})`,
|
|
79
|
-
through: keyed,
|
|
80
|
-
columns: [ref],
|
|
81
|
-
throughs: [keyed],
|
|
82
|
-
lateral: false
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
/** The manifest entry of one role source: the column, and the roles table it references. */
|
|
86
|
-
function sourceManifest(column, through) {
|
|
87
|
-
return through === void 0 ? { column } : {
|
|
88
|
-
column,
|
|
89
|
-
through: {
|
|
90
|
-
table: through.table,
|
|
91
|
-
id: through.id,
|
|
92
|
-
column: through.key
|
|
93
|
-
}
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
/** The manifest entry of a single-source column, such as a membership's user. */
|
|
97
|
-
function columnManifest(role) {
|
|
98
|
-
return sourceManifest(role.column, role.through);
|
|
99
|
-
}
|
|
100
|
-
/** The manifest entry of a role column, or one entry per source of a row with several. */
|
|
101
|
-
function roleManifest(role) {
|
|
102
|
-
if (!role.lateral) return sourceManifest(role.column, role.through);
|
|
103
|
-
return role.columns.map((column) => sourceManifest(column, role.throughs.find((through) => through.ref === column)));
|
|
104
|
-
}
|
|
105
|
-
//#endregion
|
|
106
|
-
//#region src/supabase/sources.ts
|
|
107
|
-
const ident = (name) => quoteSqlIdent(name);
|
|
108
|
-
const literal = quoteSqlLiteral;
|
|
109
|
-
function qualifiedName(name) {
|
|
110
|
-
return name.includes(".") ? name : `public.${name}`;
|
|
111
|
-
}
|
|
112
|
-
function qualified(name) {
|
|
113
|
-
return quoteSqlTable(qualifiedName(name));
|
|
114
|
-
}
|
|
15
|
+
//#region src/supabase/membership-sql.ts
|
|
16
|
+
const ident$1 = (name) => quoteSqlIdent(name);
|
|
17
|
+
const literal$1 = quoteSqlLiteral;
|
|
115
18
|
function col(name) {
|
|
116
|
-
return `m.${ident(name)}`;
|
|
19
|
+
return `m.${ident$1(name)}`;
|
|
117
20
|
}
|
|
118
21
|
function activeRow(row, id) {
|
|
119
|
-
const parts = [`s.${ident(row.id)}::text = (${id})::text`];
|
|
120
|
-
if (row.disabledAt !== void 0) parts.push(`s.${ident(row.disabledAt)} is null`);
|
|
22
|
+
const parts = [`s.${ident$1(row.id)}::text = (${id})::text`];
|
|
23
|
+
if (row.disabledAt !== void 0) parts.push(`s.${ident$1(row.disabledAt)} is null`);
|
|
121
24
|
if (row.status !== void 0) {
|
|
122
25
|
const values = row.active ?? [];
|
|
123
26
|
if (values.length === 0) throw new TypeError("PermDock: a suspension status column needs its active values");
|
|
124
|
-
parts.push(`s.${ident(row.status)}::text = any(array[${values.map(literal).join(", ")}]::text[])`);
|
|
27
|
+
parts.push(`s.${ident$1(row.status)}::text = any(array[${values.map(literal$1).join(", ")}]::text[])`);
|
|
125
28
|
}
|
|
126
29
|
if (row.disabledAt === void 0 && row.status === void 0) throw new TypeError("PermDock: a suspension table needs disabledAt or status");
|
|
127
|
-
return `exists (select 1 from ${
|
|
128
|
-
}
|
|
129
|
-
function textArray(values) {
|
|
130
|
-
return `array[${values.map(literal).join(", ")}]::text[]`;
|
|
30
|
+
return `exists (select 1 from ${quoteQualifiedTable(row.table)} s where ${parts.join(" and ")})`;
|
|
131
31
|
}
|
|
132
32
|
/**
|
|
133
33
|
* The suspendable instances on the row's chain whose scope keeps
|
|
@@ -163,8 +63,8 @@ function keptSql(shape) {
|
|
|
163
63
|
const list = keeping(shape);
|
|
164
64
|
if (list.length === 0) return;
|
|
165
65
|
const keys = [...new Set(list.flatMap((item) => item.keep))].toSorted();
|
|
166
|
-
const each = list.map((item) => `(${item.active} or k = any(${
|
|
167
|
-
return `(select jsonb_agg(k order by k) from unnest(${
|
|
66
|
+
const each = list.map((item) => `(${item.active} or k = any(${sqlTextArray(item.keep)}))`).join(" and ");
|
|
67
|
+
return `(select jsonb_agg(k order by k) from unnest(${sqlTextArray(keys)}) k where ${each})`;
|
|
168
68
|
}
|
|
169
69
|
function allActive(shape) {
|
|
170
70
|
return keeping(shape).map((item) => item.active).join(" and ");
|
|
@@ -204,6 +104,7 @@ function selectOf(shape, where, user, keep) {
|
|
|
204
104
|
`${shape.memberGroup} as member_group`,
|
|
205
105
|
`${shape.managed} as managed_by`,
|
|
206
106
|
`${shape.seats} as seats`,
|
|
107
|
+
...shape.x === void 0 ? [] : [`${col(shape.x)} as x`],
|
|
207
108
|
...keep ? [`${keepColumn(shape)} as keep`] : []
|
|
208
109
|
];
|
|
209
110
|
const group = [
|
|
@@ -212,14 +113,14 @@ function selectOf(shape, where, user, keep) {
|
|
|
212
113
|
...keepsDisabled(shape) && shape.disabledAt !== void 0 ? [`(${enabled(shape.disabledAt)})`] : []
|
|
213
114
|
];
|
|
214
115
|
return `select ${fields.join(", ")}
|
|
215
|
-
from ${
|
|
116
|
+
from ${quoteQualifiedTable(shape.table)} m${shape.join}
|
|
216
117
|
where ${where.join("\n and ")}
|
|
217
118
|
group by ${group.join(", ")}`;
|
|
218
119
|
}
|
|
219
120
|
function holdersOf(shape) {
|
|
220
|
-
const id = ident(shape.idColumn);
|
|
121
|
+
const id = ident$1(shape.idColumn);
|
|
221
122
|
return {
|
|
222
|
-
idType: `${
|
|
123
|
+
idType: `${quoteQualifiedTable(shape.table)}.${id}%type`,
|
|
223
124
|
id: (scope, row) => {
|
|
224
125
|
const filter = shape.holds(scope, row);
|
|
225
126
|
return filter === void 0 ? "null::text" : filter === "true" ? `${row}.${id}::text` : `case when ${filter} then ${row}.${id}::text end`;
|
|
@@ -231,7 +132,7 @@ function holdersOf(shape) {
|
|
|
231
132
|
const live = conditions.length === 0 ? "true" : conditions.length === 1 ? conditions.join("") : `(${conditions.join(" and ")})`;
|
|
232
133
|
const kept = where.filter((part) => part !== "true");
|
|
233
134
|
return `select m.${id}::text as id, ${shape.userSql}::text as user_id, ${shape.roleKey} as role, ${shape.via} as via, ${live} as live
|
|
234
|
-
from ${options.from ??
|
|
135
|
+
from ${options.from ?? quoteQualifiedTable(shape.table)} m${shape.join}${shape.roleJoin}${kept.length === 0 ? "" : `\nwhere ${kept.join(" and ")}`}`;
|
|
235
136
|
}
|
|
236
137
|
};
|
|
237
138
|
}
|
|
@@ -242,14 +143,14 @@ function sqlOf(shape) {
|
|
|
242
143
|
table: shape.table,
|
|
243
144
|
user: shape.user,
|
|
244
145
|
userThrough: shape.userThrough,
|
|
245
|
-
userType: shape.userThrough === void 0 ? `${
|
|
146
|
+
userType: shape.userThrough === void 0 ? `${quoteQualifiedTable(shape.table)}.${ident$1(shape.user)}%type` : `${quoteSqlTable(shape.userThrough.table)}.${ident$1(shape.userThrough.key)}%type`,
|
|
246
147
|
reads: [...new Set([suspension?.users, ...Object.values(suspension?.scopes ?? {})].flatMap((row) => row === void 0 ? [] : [row.table]))],
|
|
247
148
|
managed: shape.managedColumn,
|
|
248
149
|
through: shape.through,
|
|
249
150
|
throughs: shape.throughs,
|
|
250
151
|
columns: [...new Set(shape.columns)],
|
|
251
152
|
manifest: {
|
|
252
|
-
table:
|
|
153
|
+
table: qualifySqlTable(shape.table),
|
|
253
154
|
...shape.manifest,
|
|
254
155
|
columns: [...new Set(shape.columns)]
|
|
255
156
|
},
|
|
@@ -258,19 +159,115 @@ function sqlOf(shape) {
|
|
|
258
159
|
list: (keep = keptSql(shape) !== void 0) => selectOf(shape, filters(shape, `${shape.scope} = $1::text and ${shape.id} = $2::text`), true, keep)
|
|
259
160
|
});
|
|
260
161
|
}
|
|
162
|
+
//#endregion
|
|
163
|
+
//#region src/supabase/roles.ts
|
|
164
|
+
function isRoleList(role) {
|
|
165
|
+
return Array.isArray(role);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Resolves the role sources of `table` (`schema.table`, or `public`). An
|
|
169
|
+
* unqualified `through` table is in `table`'s schema. `label` names the
|
|
170
|
+
* option in the error for an `on` that is not exactly one column; `prefix`
|
|
171
|
+
* starts every error. A row with several sources holds the union of their
|
|
172
|
+
* non-null keys.
|
|
173
|
+
*/
|
|
174
|
+
function roleColumn(role, table, alias, options) {
|
|
175
|
+
if (!isRoleList(role)) return singleRole(role, table, alias, options);
|
|
176
|
+
const prefix = options.prefix ?? "PermDock";
|
|
177
|
+
const parts = role.map((part, index) => singleRole(part, table, alias, {
|
|
178
|
+
...options,
|
|
179
|
+
label: `${options.label}[${String(index)}]`
|
|
180
|
+
}));
|
|
181
|
+
const [first] = parts;
|
|
182
|
+
if (first === void 0) throw new TypeError(`${prefix}: ${options.label} needs at least one role source`);
|
|
183
|
+
if (parts.length === 1) return first;
|
|
184
|
+
const rows = quoteSqlIdent(`${alias}r`, prefix);
|
|
185
|
+
const values = quoteSqlIdent(`${alias}v`, prefix);
|
|
186
|
+
const sql = `${rows}.permdock_role`;
|
|
187
|
+
return {
|
|
188
|
+
column: first.column,
|
|
189
|
+
sql,
|
|
190
|
+
join: `${options.indent === void 0 ? " " : `\n${options.indent}`}cross join lateral (select ${values}.role from (values ${parts.map((part) => `(${part.lookup})`).join(", ")}) ${values}(role) where ${values}.role is not null) ${rows}(permdock_role)`,
|
|
191
|
+
lookup: sql,
|
|
192
|
+
columns: [...new Set(parts.map((part) => part.column))],
|
|
193
|
+
throughs: parts.flatMap((part) => part.throughs),
|
|
194
|
+
lateral: true
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
function singleRole(role, table, alias, options) {
|
|
198
|
+
const prefix = options.prefix ?? "PermDock";
|
|
199
|
+
const q = (name) => quoteSqlIdent(name, prefix);
|
|
200
|
+
if (typeof role === "string") return {
|
|
201
|
+
column: role,
|
|
202
|
+
sql: `${alias}.${q(role)}::text`,
|
|
203
|
+
join: "",
|
|
204
|
+
lookup: `${alias}.${q(role)}::text`,
|
|
205
|
+
columns: [role],
|
|
206
|
+
throughs: [],
|
|
207
|
+
lateral: false
|
|
208
|
+
};
|
|
209
|
+
const pairs = Object.entries(role.on);
|
|
210
|
+
const [pair] = pairs;
|
|
211
|
+
if (pair === void 0 || pairs.length !== 1) throw new TypeError(`${prefix}: ${options.label}.on must map exactly one column of ${table} to ${role.through}, for example ${options.example ?? "{ role_id: 'id' }"}`);
|
|
212
|
+
const [ref, id] = pair;
|
|
213
|
+
const schema = table.includes(".") ? table.split(".")[0] ?? "public" : "public";
|
|
214
|
+
const through = role.through.includes(".") ? role.through : `${schema}.${role.through}`;
|
|
215
|
+
const keys = options.joined ?? `${alias}k`;
|
|
216
|
+
const target = quoteSqlTable(through, prefix);
|
|
217
|
+
const keyed = {
|
|
218
|
+
table: through,
|
|
219
|
+
id,
|
|
220
|
+
key: role.column,
|
|
221
|
+
ref
|
|
222
|
+
};
|
|
223
|
+
return {
|
|
224
|
+
column: ref,
|
|
225
|
+
sql: `${keys}.${q(role.column)}::text`,
|
|
226
|
+
join: `${options.indent === void 0 ? " " : `\n${options.indent}`}join ${target} ${keys} on ${keys}.${q(id)} = ${alias}.${q(ref)}`,
|
|
227
|
+
lookup: `(select ${keys}.${q(role.column)}::text from ${target} ${keys} where ${keys}.${q(id)} = ${alias}.${q(ref)})`,
|
|
228
|
+
through: keyed,
|
|
229
|
+
columns: [ref],
|
|
230
|
+
throughs: [keyed],
|
|
231
|
+
lateral: false
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
/** The manifest entry of one role source: the column, and the roles table it references. */
|
|
235
|
+
function sourceManifest(column, through) {
|
|
236
|
+
return through === void 0 ? { column } : {
|
|
237
|
+
column,
|
|
238
|
+
through: {
|
|
239
|
+
table: through.table,
|
|
240
|
+
id: through.id,
|
|
241
|
+
column: through.key
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
/** The manifest entry of a single-source column, such as a membership's user. */
|
|
246
|
+
function columnManifest(role) {
|
|
247
|
+
return sourceManifest(role.column, role.through);
|
|
248
|
+
}
|
|
249
|
+
/** The manifest entry of a role column, or one entry per source of a row with several. */
|
|
250
|
+
function roleManifest(role) {
|
|
251
|
+
if (!role.lateral) return sourceManifest(role.column, role.through);
|
|
252
|
+
return role.columns.map((column) => sourceManifest(column, role.throughs.find((through) => through.ref === column)));
|
|
253
|
+
}
|
|
254
|
+
//#endregion
|
|
255
|
+
//#region src/supabase/sources.ts
|
|
256
|
+
const ident = (name) => quoteSqlIdent(name);
|
|
257
|
+
const literal = quoteSqlLiteral;
|
|
261
258
|
function isFixed(roles) {
|
|
262
259
|
return Array.isArray(roles);
|
|
263
260
|
}
|
|
264
261
|
/** A role column of the membership table, aliased `m`; a `through` column joins its roles table as `mk`. */
|
|
265
262
|
function memberRole(role, table, label) {
|
|
266
|
-
return roleColumn(role,
|
|
263
|
+
return roleColumn(role, qualifySqlTable(table), "m", {
|
|
267
264
|
label,
|
|
268
265
|
indent: ""
|
|
269
266
|
});
|
|
270
267
|
}
|
|
271
268
|
/** The user of the membership table, aliased `m`; a `through` user joins its table as `mu`. */
|
|
272
269
|
function memberUser(user, table, label) {
|
|
273
|
-
const column = roleColumn(user,
|
|
270
|
+
const column = roleColumn(user, qualifySqlTable(table), "m", {
|
|
274
271
|
label,
|
|
275
272
|
indent: "",
|
|
276
273
|
joined: "mu",
|
|
@@ -294,7 +291,8 @@ function membershipOf(row) {
|
|
|
294
291
|
const roles = strings(row["roles"]);
|
|
295
292
|
if (typeof row["scope"] !== "string" || typeof row["id"] !== "string") return;
|
|
296
293
|
if (roles.length === 0) return;
|
|
297
|
-
const
|
|
294
|
+
const rawWithin = row["within"];
|
|
295
|
+
const within = isRecord(rawWithin) ? Object.fromEntries(Object.entries(rawWithin).filter((entry) => typeof entry[1] === "string")) : void 0;
|
|
298
296
|
const expires = typeof row["expires_at"] === "number" ? row["expires_at"] : typeof row["expires_at"] === "string" && row["expires_at"] !== "" ? Number(row["expires_at"]) : void 0;
|
|
299
297
|
const seats = strings(row["seats"]);
|
|
300
298
|
const keep = row["keep"];
|
|
@@ -311,7 +309,8 @@ function membershipOf(row) {
|
|
|
311
309
|
member: typeof row["member_group"] === "string" && row["member_group"] !== "" ? { group: row["member_group"] } : void 0,
|
|
312
310
|
managedBy: row["managed_by"] === "idp" ? "idp" : void 0,
|
|
313
311
|
entitlements: seats.length === 0 ? void 0 : seats,
|
|
314
|
-
keep: keep === null || keep === void 0 ? void 0 : strings(keep)
|
|
312
|
+
keep: keep === null || keep === void 0 ? void 0 : strings(keep),
|
|
313
|
+
x: row["x"] === null ? void 0 : readAppData(void 0, row["x"])
|
|
315
314
|
});
|
|
316
315
|
}
|
|
317
316
|
function sourceOf(sql, query) {
|
|
@@ -340,11 +339,14 @@ function sourceOf(sql, query) {
|
|
|
340
339
|
}
|
|
341
340
|
/**
|
|
342
341
|
* `ctx.postgres` (from `withPostgresClient`) or `ctx.postgresAdmin` as a
|
|
343
|
-
* `SqlQuery` for `
|
|
342
|
+
* `SqlQuery` for `tableMembershipSource`, `junctionMembershipSource` and `supabaseApprovalStore`.
|
|
344
343
|
* `ctx.postgres` runs as the caller under RLS, so the membership tables must
|
|
345
344
|
* be readable by `authenticated`; `ctx.postgresAdmin` bypasses RLS.
|
|
346
345
|
*/
|
|
347
|
-
function
|
|
346
|
+
function optionalColumn(name, cast) {
|
|
347
|
+
return name === void 0 ? `null::${cast}` : `${col(name)}::${cast}`;
|
|
348
|
+
}
|
|
349
|
+
function supabasePostgresQuery(postgres) {
|
|
348
350
|
return (text, values) => postgres.queryRaw(text, [...values]);
|
|
349
351
|
}
|
|
350
352
|
/**
|
|
@@ -353,14 +355,13 @@ function fromSupabasePostgres(postgres) {
|
|
|
353
355
|
* `within`, `via`, expiry, owner and seat columns. Rows of the same instance
|
|
354
356
|
* merge into one membership.
|
|
355
357
|
*/
|
|
356
|
-
function
|
|
358
|
+
function tableMembershipSource(options) {
|
|
357
359
|
const c = options.columns ?? {};
|
|
358
360
|
const scope = `${col(c.scope ?? "scope")}::text`;
|
|
359
361
|
const id = `${col(c.id ?? "scope_id")}::text`;
|
|
360
362
|
const within = c.within === void 0 ? "null::jsonb" : col(c.within);
|
|
361
|
-
const
|
|
362
|
-
const
|
|
363
|
-
const role = memberRole(c.role ?? "role", options.table, "fromTable columns.role");
|
|
363
|
+
const user = memberUser(c.user ?? "user_id", options.table, "tableMembershipSource columns.user");
|
|
364
|
+
const role = memberRole(c.role ?? "role", options.table, "tableMembershipSource columns.role");
|
|
364
365
|
return sourceOf(sqlOf({
|
|
365
366
|
table: options.table,
|
|
366
367
|
join: `${user.column.join}${role.join}`,
|
|
@@ -373,15 +374,16 @@ function fromTable(options) {
|
|
|
373
374
|
id,
|
|
374
375
|
within,
|
|
375
376
|
roles: roleAgg(role),
|
|
376
|
-
via:
|
|
377
|
+
via: optionalColumn(c.via, "text"),
|
|
377
378
|
expiresAt: c.expiresAt,
|
|
378
379
|
disabledAt: c.disabledAt,
|
|
379
|
-
grantedBy:
|
|
380
|
-
reason:
|
|
381
|
-
memberGroup:
|
|
382
|
-
managed:
|
|
380
|
+
grantedBy: optionalColumn(c.grantedBy, "text"),
|
|
381
|
+
reason: optionalColumn(c.reason, "text"),
|
|
382
|
+
memberGroup: optionalColumn(c.group, "text"),
|
|
383
|
+
managed: optionalColumn(c.managedBy, "text"),
|
|
383
384
|
managedColumn: c.managedBy,
|
|
384
385
|
seats: c.seats === void 0 ? "null::jsonb" : `to_jsonb(${col(c.seats)})`,
|
|
386
|
+
x: c.x,
|
|
385
387
|
idOf: (name) => `coalesce(case when ${scope} = ${literal(name)} then ${id} end${c.within === void 0 ? "" : `, ${within} ->> ${literal(name)}`})`,
|
|
386
388
|
idColumn: c.id ?? "scope_id",
|
|
387
389
|
holds: (name, alias) => `${alias}.${ident(c.scope ?? "scope")}::text = ${literal(name)}`,
|
|
@@ -398,7 +400,8 @@ function fromTable(options) {
|
|
|
398
400
|
c.reason,
|
|
399
401
|
c.group,
|
|
400
402
|
c.managedBy,
|
|
401
|
-
c.seats
|
|
403
|
+
c.seats,
|
|
404
|
+
c.x
|
|
402
405
|
].filter((name) => name !== void 0).map(col)
|
|
403
406
|
],
|
|
404
407
|
suspension: options.suspension,
|
|
@@ -431,15 +434,15 @@ function fromTable(options) {
|
|
|
431
434
|
* membership of `scope`, with roles from a column or fixed (`['contact']`), a
|
|
432
435
|
* fixed `via`, and ancestor ids from `within` columns.
|
|
433
436
|
*/
|
|
434
|
-
function
|
|
437
|
+
function junctionMembershipSource(options) {
|
|
435
438
|
if (!/^[a-z][a-z0-9_]*$/u.test(options.scope)) throw new TypeError(`PermDock: unsafe scope name '${options.scope}'`);
|
|
436
439
|
const idColumn = options.id ?? `${options.scope}_id`;
|
|
437
440
|
const withinEntries = Object.entries(options.within ?? {});
|
|
438
441
|
const roles = options.roles;
|
|
439
442
|
const fixed = isFixed(roles) ? roles : void 0;
|
|
440
|
-
if (fixed?.length === 0) throw new TypeError("PermDock:
|
|
441
|
-
const role = isFixed(roles) ? void 0 : memberRole(typeof roles === "object" && "sources" in roles ? roles.sources : roles, options.table, "
|
|
442
|
-
const user = memberUser(options.user ?? "user_id", options.table, "
|
|
443
|
+
if (fixed?.length === 0) throw new TypeError("PermDock: junctionMembershipSource needs at least one role");
|
|
444
|
+
const role = isFixed(roles) ? void 0 : memberRole(typeof roles === "object" && "sources" in roles ? roles.sources : roles, options.table, "junctionMembershipSource roles");
|
|
445
|
+
const user = memberUser(options.user ?? "user_id", options.table, "junctionMembershipSource user");
|
|
443
446
|
const managedColumn = options.managedBy === void 0 ? void 0 : options.managedBy === "idp" ? "" : options.managedBy.column;
|
|
444
447
|
const groupColumn = options.group === void 0 || typeof options.group === "string" ? void 0 : options.group.column;
|
|
445
448
|
const shape = {
|
|
@@ -463,6 +466,7 @@ function fromJunction(options) {
|
|
|
463
466
|
managed: managedColumn === void 0 ? "null::text" : managedColumn === "" ? `'idp'::text` : `${col(managedColumn)}::text`,
|
|
464
467
|
managedColumn,
|
|
465
468
|
seats: options.seats === void 0 ? "null::jsonb" : `to_jsonb(${col(options.seats)})`,
|
|
469
|
+
x: options.x,
|
|
466
470
|
idColumn,
|
|
467
471
|
holds: (name) => name === options.scope ? "true" : void 0,
|
|
468
472
|
roleKey: role === void 0 ? "mf.role" : role.sql,
|
|
@@ -481,7 +485,8 @@ function fromJunction(options) {
|
|
|
481
485
|
options.reason,
|
|
482
486
|
groupColumn,
|
|
483
487
|
managedColumn === "" ? void 0 : managedColumn,
|
|
484
|
-
options.seats
|
|
488
|
+
options.seats,
|
|
489
|
+
options.x
|
|
485
490
|
].filter((name) => name !== void 0).map(col)
|
|
486
491
|
],
|
|
487
492
|
suspension: options.suspension,
|
|
@@ -534,7 +539,7 @@ function hookApiNames(prefix = HOOK_API_PREFIX) {
|
|
|
534
539
|
* `<schema>.permdock_authz_version`: pass it to `claimsFirst(sources, { version })`.
|
|
535
540
|
*/
|
|
536
541
|
function authzVersion(options) {
|
|
537
|
-
const table =
|
|
542
|
+
const table = quoteQualifiedTable(`${options.schema ?? "permdock"}.${AUTHZ_VERSION_TABLE}`);
|
|
538
543
|
return async (principal) => {
|
|
539
544
|
const value = rowsOf(await options.query(`select version from ${table} where user_id = $1`, [principal.id]))[0]?.["version"];
|
|
540
545
|
const version = typeof value === "number" ? value : value === void 0 ? 0 : Number(value);
|
|
@@ -542,4 +547,4 @@ function authzVersion(options) {
|
|
|
542
547
|
};
|
|
543
548
|
}
|
|
544
549
|
//#endregion
|
|
545
|
-
export {
|
|
550
|
+
export { hookApiNames as a, tableMembershipSource as c, keptKeys as d, authzVersion as i, roleColumn as l, HOOK_API_SCHEMA as n, junctionMembershipSource as o, PERMDOCK_SCHEMA as r, supabasePostgresQuery as s, AUTHZ_VERSION_TABLE as t, roleManifest as u };
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
//#region src/core/sql.ts
|
|
2
|
+
/** A bare Postgres identifier PermDock emits unquoted-safe: letters, digits and `_`, not starting with a digit. */
|
|
3
|
+
const SQL_IDENT = /^[A-Za-z_][A-Za-z0-9_]*$/u;
|
|
4
|
+
/** A validated, double-quoted identifier; anything outside `SQL_IDENT` throws. */
|
|
5
|
+
function quoteSqlIdent(name, prefix = "PermDock") {
|
|
6
|
+
return `"${assertSqlIdent(name, prefix)}"`;
|
|
7
|
+
}
|
|
8
|
+
/** A schema-qualified name, each part validated by `quoteSqlIdent`. */
|
|
9
|
+
function quoteSqlTable(name, prefix = "PermDock") {
|
|
10
|
+
return name.split(".").map((part) => quoteSqlIdent(part, prefix)).join(".");
|
|
11
|
+
}
|
|
12
|
+
/** A single-quoted string literal with embedded quotes doubled. */
|
|
13
|
+
function quoteSqlLiteral(value) {
|
|
14
|
+
return `'${value.replaceAll("'", "''")}'`;
|
|
15
|
+
}
|
|
16
|
+
/** A double-quoted identifier read back from a database, embedded quotes doubled rather than refused. */
|
|
17
|
+
function escapeSqlIdent(name) {
|
|
18
|
+
return `"${name.replaceAll("\"", "\"\"")}"`;
|
|
19
|
+
}
|
|
20
|
+
const PLAIN_IDENT = /^[a-z_][a-z0-9_]*$/u;
|
|
21
|
+
/** An identifier left bare when it is already lower snake case, otherwise quoted by `escapeSqlIdent`. */
|
|
22
|
+
function sqlIdent(name) {
|
|
23
|
+
return PLAIN_IDENT.test(name) ? name : escapeSqlIdent(name);
|
|
24
|
+
}
|
|
25
|
+
/** The plain-identifier check behind `quoteSqlIdent`, returning the name unquoted. */
|
|
26
|
+
function assertSqlIdent(name, prefix = "PermDock") {
|
|
27
|
+
if (!SQL_IDENT.test(name)) throw new TypeError(`${prefix}: unsafe SQL identifier '${name}'`);
|
|
28
|
+
return name;
|
|
29
|
+
}
|
|
30
|
+
/** `name` with `public.` added when it names no schema; generated functions run with `search_path = ''`. */
|
|
31
|
+
function qualifySqlTable(name) {
|
|
32
|
+
return name.includes(".") ? name : `public.${name}`;
|
|
33
|
+
}
|
|
34
|
+
/** `qualifySqlTable`, then each part quoted by `quoteSqlIdent`. */
|
|
35
|
+
function quoteQualifiedTable(name, prefix = "PermDock") {
|
|
36
|
+
return quoteSqlTable(qualifySqlTable(name), prefix);
|
|
37
|
+
}
|
|
38
|
+
/** A `text[]` literal of `values`, each quoted by `quoteSqlLiteral`. */
|
|
39
|
+
function sqlTextArray(values) {
|
|
40
|
+
return values.length === 0 ? `'{}'::text[]` : `array[${values.map(quoteSqlLiteral).join(", ")}]::text[]`;
|
|
41
|
+
}
|
|
42
|
+
/** The SQL command a default verb runs: `read`, `list` and `get` select, `create` inserts, `update` and `delete` keep their name. */
|
|
43
|
+
function defaultSqlCommand(action) {
|
|
44
|
+
switch (action) {
|
|
45
|
+
case "read":
|
|
46
|
+
case "list":
|
|
47
|
+
case "get": return "select";
|
|
48
|
+
case "create": return "insert";
|
|
49
|
+
case "update": return "update";
|
|
50
|
+
case "delete": return "delete";
|
|
51
|
+
default: return;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//#endregion
|
|
55
|
+
export { quoteQualifiedTable as a, quoteSqlTable as c, qualifySqlTable as i, sqlIdent as l, defaultSqlCommand as n, quoteSqlIdent as o, escapeSqlIdent as r, quoteSqlLiteral as s, SQL_IDENT as t, sqlTextArray as u };
|