permdock 0.4.0 → 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/{schema-Bol6gqXA.js → 2020-C9VN-x8c.js} +5 -130
- package/dist/a2a/index.d.ts +6 -6
- package/dist/a2a/index.js +14 -17
- 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 -35
- package/dist/ai-sdk/index.js +37 -23
- package/dist/{app-data-CV8pqqMi.js → app-data-MuyzVqX8.js} +2 -1
- 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/arazzo-B6lebmiQ.js +36 -0
- package/dist/{arazzo-C4BcskbX.js → arazzo-BWhNF-k0.js} +20 -14
- 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 +94 -79
- 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 +9 -8
- package/dist/better-supabase/index.d.ts +357 -30
- package/dist/better-supabase/index.js +936 -194
- package/dist/{bind-BzqG8SMb.d.ts → bind--9EFVYWF.d.ts} +12 -10
- package/dist/{bind-kk-uyCwH.js → bind-CZzhx-Vj.js} +14 -10
- package/dist/body-CH5of8Ne.js +10 -0
- package/dist/body-text-QcXok_SI.js +52 -0
- package/dist/{build-instance-DIIV9DbC.js → build-instance-BMnAudHn.js} +4 -3
- package/dist/{canonical-json-CFKyFOke.js → canonical-json-BC8_nMTw.js} +5 -3
- package/dist/{capability-CksyCWDH.d.ts → capability-BSslw1QV.d.ts} +44 -25
- package/dist/{capability-txATtKV4.js → capability-N1K9IpqS.js} +68 -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-tZUyOfOv.js → catalog-BECMPrwc.js} +51 -6
- package/dist/catalog-DjhMYYCq.js +1 -0
- package/dist/catalog-R_A__RsH.js +52 -0
- package/dist/{catalog-doc-DWtg0gGR.js → catalog-doc-C9wjsfNY.js} +45 -23
- 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 +24 -27
- package/dist/clerk/index.d.ts +9 -8
- package/dist/clerk/index.js +9 -14
- package/dist/cli/bin.js +36 -17
- package/dist/cli/index.d.ts +19 -5
- package/dist/cli/index.js +164 -4
- package/dist/cloud/index.d.ts +102 -63
- package/dist/cloud/index.js +239 -340
- package/dist/cloud-CIoHNevm.js +87 -0
- package/dist/codemod-Bmj9dWMH.js +37 -0
- package/dist/codemod-Cxvvc70T.js +2084 -0
- package/dist/{collect-2SrB7lfk.js → collect-CrZJJnEF.js} +75 -11
- package/dist/collect-DloHbDVa.js +55 -0
- package/dist/collect-FlXJlhus.js +1 -0
- package/dist/command-L8EstFNm.js +6 -0
- package/dist/compile/index.d.ts +1 -1
- package/dist/compile/index.js +1 -2
- package/dist/{compile-CcEu2ZQ1.js → compile-CMqMx_IN.js} +11 -8
- package/dist/{compile-CtTP7eur.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-BIjREpyE.js → config-bs_kZeYq.js} +12 -7
- package/dist/{config-report--Xb9APJS.js → config-report-DUgj62Ai.js} +15 -5
- package/dist/{connection-DUsczpB5.js → connection-DjhIJSs2.js} +6 -5
- package/dist/{context-DieZVJXu.js → context-bbFHR-0D.js} +2 -2
- package/dist/convex/index.d.ts +11 -10
- package/dist/convex/index.js +6 -4
- 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-BBO24vj6.js → create-DnrmLnLW.js} +31 -32
- package/dist/{credential-kue0qpbm.js → credential-DM2um3ha.js} +152 -31
- package/dist/credentials-DPyHmYz5.js +74 -0
- package/dist/delegation-DaXVdDhM.js +286 -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-DfRk15uw.d.ts → denied-text-D8jDHgsl.d.ts} +5 -5
- package/dist/{describe-C3ldA9os.d.ts → describe-BZUsixiL.d.ts} +2 -2
- package/dist/{describe-Cgkp7eP0.js → describe-BybMRY7A.js} +6 -2
- package/dist/device-BARQ8eYG.js +193 -0
- package/dist/diff-CxZo9pTq.js +37 -0
- package/dist/{diff-rpqoe7Ag.js → diff-DCePiN6M.js} +60 -54
- package/dist/doctor-CxiwSfqH.js +44 -0
- package/dist/{doctor-owlv6ddh.js → doctor-DFjUxf2f.js} +245 -50
- package/dist/drizzle/index.d.ts +5 -3
- package/dist/drizzle/index.js +2 -2
- package/dist/elysia/index.d.ts +16 -13
- package/dist/elysia/index.js +13 -12
- package/dist/env-DJZrPjRi.js +8 -0
- package/dist/errors-BDUwg2qC.js +27 -0
- package/dist/{errors-drnfxYtm.js → errors-BKy0EfhN.js} +5 -9
- package/dist/errors-BWXBMaKK.d.ts +11 -0
- package/dist/{errors-OD_4c__H.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-C9YJsv3H.js → evaluations-DZ2CbV5k.js} +145 -34
- package/dist/eve/index.d.ts +12 -16
- package/dist/eve/index.js +22 -28
- 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 +12 -11
- package/dist/fastify/index.d.ts +25 -22
- package/dist/fastify/index.js +13 -12
- 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/{fixtures-h2eG2OZV.js → fixtures-B7XrLeY7.js} +8 -7
- package/dist/flags-C3DktBDY.js +86 -0
- package/dist/{from-snapshot-7REQZe0H.js → from-snapshot-D2lZt4Dd.js} +55 -52
- package/dist/{grantee-CXY-0C87.js → grantee-Cn1HyUsI.js} +3 -3
- package/dist/{grantee-conditions-MQs5NIuX.js → grantee-conditions-CcXf8hMM.js} +4 -3
- package/dist/{grantee-match-fxYp9Nmt.js → grantee-match-DHArqY82.js} +5 -4
- 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-C9YmyBIa.js → helpers-DTcZOzhF.js} +45 -38
- package/dist/hono/index.d.ts +12 -9
- package/dist/hono/index.js +13 -12
- package/dist/hosted-BZIAYvon.js +315 -0
- package/dist/hosted-DBDX0M-P.d.ts +78 -0
- package/dist/{http-DPuDaChb.d.ts → http-B_LphE5Y.d.ts} +1 -2
- package/dist/http-DXJ37RDA.js +46 -0
- package/dist/{http-BEbdMZ05.js → http-ujKm0JXE.js} +1 -2
- package/dist/{import-UHk1N7vH.js → import-CNV7I2Dw.js} +25 -20
- package/dist/{import-BFIlhetD.js → import-DMmOG27O.js} +190 -53
- 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-UdVQgq48.d.ts → index-DOVf7RJv.d.ts} +431 -81
- package/dist/{index-BwMe94Xq.d.ts → index-SGdIQyzc.d.ts} +34 -16
- package/dist/index.d.ts +19 -15
- package/dist/index.js +31 -21
- package/dist/init-DeMYsnYJ.js +96 -0
- package/dist/init-GG6Jh8HD.js +95 -0
- package/dist/{instance-options-plkrsAog.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-DBkdUuCO.js → json-schema-B-vAwlde.js} +45 -6
- package/dist/json-schema-CN_iLFH2.d.ts +40 -0
- package/dist/jwt/index.d.ts +18 -11
- package/dist/jwt/index.js +156 -135
- package/dist/{kernel-CB3LrIJM.js → kernel-5JatXyND.js} +52 -24
- package/dist/kysely/index.d.ts +5 -3
- package/dist/kysely/index.js +2 -2
- package/dist/load-BxEtwlBS.js +1 -0
- package/dist/{load-C3_oTHyO.js → load-DFS_ry0W.js} +22 -6
- 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-AVlBaJoa.js → map-claims-D3oRmTk0.js} +13 -10
- package/dist/{map-error-BE27PYkE.js → map-error-TCAdw-eW.js} +3 -3
- package/dist/{markers-CiwAOZtO.js → markers-C6joDI3o.js} +2 -1
- package/dist/mcp/index.d.ts +22 -12
- package/dist/mcp/index.js +57 -39
- package/dist/{migrate-BwlB5-Wk.js → migrate-BShP7Vf4.js} +53 -14
- package/dist/nest/index.d.ts +12 -9
- package/dist/nest/index.js +15 -14
- package/dist/next/index.d.ts +18 -21
- package/dist/next/index.js +13 -11
- 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-uYFXGVw2.js → ocsf-BFp-PZZA.js} +22 -11
- package/dist/openai/index.d.ts +9 -16
- package/dist/openai/index.js +17 -24
- package/dist/openapi/index.d.ts +3 -3
- package/dist/openapi/index.js +1 -1
- package/dist/{openapi-DBzHQbov.js → openapi-B7HZ0f-r.js} +8 -8
- package/dist/{openapi-BJdBmYDG.js → openapi-DTaEmTSW.js} +10 -9
- 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 +20 -15
- package/dist/otel/index.d.ts +3 -2
- package/dist/otel/index.js +30 -7
- package/dist/output-Dyw8fyPF.js +88 -0
- package/dist/output-files-B3IZJksC.js +1 -0
- package/dist/{output-files-CgIsvdSa.js → output-files-DhRBBE4n.js} +24 -26
- package/dist/{permission-keys-B26jeyUv.js → ownership-BatFgAA4.js} +1698 -869
- package/dist/{package-root-DtNnpmUd.js → package-root-Dk_ETdkp.js} +1 -1
- package/dist/{parse-CVFQHk6c.js → parse-Cxq0WxrA.js} +2 -2
- package/dist/{parse-local-manifest-C-q02Pal.js → parse-local-manifest-CVSs6J9I.js} +1 -1
- package/dist/{parse-local-manifest-DvYUR0QL.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 +45 -26
- 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-BsblpB-z.js → permission-registry-Br4jSNVi.js} +3 -3
- package/dist/permissions-B-wCP5ZC.js +30 -0
- package/dist/{permissions-CCJ6lmxB.js → permissions-CZKiUfFM.js} +4 -3
- package/dist/{permissions-COH-KRgT.d.ts → permissions-oEWfl-kl.d.ts} +1 -2
- package/dist/policies-CO1oOymN.js +295 -0
- package/dist/{policy-ur0BBK_e.d.ts → policy-Czo4n3Hs.d.ts} +2 -2
- package/dist/{hosted-CBHgkzDl.js → policy-DLZJ5gAp.js} +17 -273
- package/dist/policy-from-catalog-DzhEc3Y9.js +450 -0
- package/dist/policy-module-CTlwMvLI.js +89 -0
- package/dist/{policy-types-sp9P1iIV.d.ts → policy-types-DzwivBgR.d.ts} +434 -631
- 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-cZe4kzhL.js → powersync-bYUDLOAO.js} +23 -24
- 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 +2 -2
- package/dist/{problem-CnWraVhC.js → problem-CTviyH5L.js} +13 -23
- package/dist/{problem-details-rIIo8B2C.d.ts → problem-details-DXlt-vks.d.ts} +1 -1
- package/dist/{problem-details-DECUnXAn.js → problem-details-cn5X30gZ.js} +43 -40
- package/dist/problem-types-CJ2325SZ.js +5 -0
- package/dist/{prompt-CXYhLfsS.js → prompt-DfZLJLIn.js} +2 -2
- package/dist/{protected-B3_P7xuw.d.ts → protected-DEPHc2xV.d.ts} +16 -8
- package/dist/{protected-BN7BUdY1.js → protected-DfjY5mLA.js} +21 -4
- package/dist/{provider-Bi-0HNL3.js → provider-CC-u3bYP.js} +2 -2
- package/dist/{provider-kwHC9CZD.d.ts → provider-DMVt6yYn.d.ts} +1 -1
- package/dist/{provider-store-Ctt-81Ni.js → provider-store-B5Yrkhzr.js} +2 -2
- 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 -72
- package/dist/react-native/index.js +24 -22
- package/dist/{refs-f3imMjNW.js → refs-K6eWUJ0H.js} +1 -1
- package/dist/{relation-walk-BXnlLtg2.js → relation-walk-3OyDBF0S.js} +2 -2
- package/dist/{relations-CvmSpG67.js → relations-BnCWnJGI.js} +3 -3
- package/dist/renames-CGj7YwcQ.js +175 -0
- package/dist/{replay-COpmZUfx.d.ts → replay-D7iKcLFe.d.ts} +1 -1
- package/dist/{replay-BsOyTrdV.js → replay-Du1tJjG7.js} +2 -1
- package/dist/{request-context-BVM7aWNs.js → request-context-BTRTG7OT.js} +3 -3
- 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-D1Un3pcz.js → resource-relations-D_jw0BFx.js} +1 -1
- package/dist/{retire-BFcxL6un.js → retire-CALjIQ7e.js} +2 -2
- package/dist/{revocations-Cy06JNx2.d.ts → revocations-R07lFBnX.d.ts} +2 -0
- package/dist/rls-BA8an5Ap.js +336 -0
- package/dist/{rls-BEktUaqg.js → rls-j6t43t7n.js} +287 -689
- package/dist/{role-builder-B4GbKM-i.js → role-builder-CXbis5-X.js} +14 -207
- package/dist/{rpc-nYC3cR_u.js → rpc-aPyNi6tA.js} +7 -7
- 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-D_tMXnsq.js → runtime-D3VTAiCA.js} +1 -1
- package/dist/{saas-DtaA4JuW.js → saas-FO-Q8oj0.js} +16 -14
- package/dist/scan-BOI5tJ-6.js +29 -0
- package/dist/{schema-DjQBcAP9.js → schema-B4v0Qrac.js} +102 -8
- 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-vFR1O5oG.js → scim-ClHtpyV3.js} +208 -76
- package/dist/{scopes-tvpa34ep.js → scopes-CUPSjo9q.js} +12 -7
- package/dist/server/index.d.ts +12 -143
- package/dist/server/index.js +12 -9
- package/dist/server-DqCT4CgZ.js +453 -0
- package/dist/{server-types-DdqBwZN_.d.ts → server-types-BLd4MnBX.d.ts} +51 -68
- package/dist/{sha256-BO0swRXL.js → sha256-D9ihqmvd.js} +8 -1
- package/dist/{shared-1uhI-e-b.js → shared-CD11nBbC.js} +18 -8
- package/dist/{shared-JhMeOsDF.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-BZdRQkxs.js → skills-B6lVdD_W.js} +13 -6
- package/dist/skills-CTYwkl44.js +51 -0
- package/dist/snapshot-CXUWfsNy.js +269 -0
- package/dist/{snapshot-cache-Cod40D-X.js → snapshot-cache-DZHQ0KF6.js} +11 -5
- package/dist/{snapshot-cache-J5T7t_vD.d.ts → snapshot-cache-DqK9eDmM.d.ts} +7 -5
- package/dist/solid/index.d.ts +11 -12
- package/dist/solid/index.js +7 -7
- package/dist/solid-start/index.d.ts +52 -0
- package/dist/solid-start/index.js +49 -0
- package/dist/{sources-Dljy06zL.d.ts → sources-BV9j0DeZ.d.ts} +7 -13
- package/dist/{sources-B1-b-R0t.js → sources-vs5dGOsS.js} +125 -119
- package/dist/{sql-t8teWOfo.js → sql-B5T1IL83.js} +13 -1
- package/dist/src-DLfUWFAI.js +1851 -0
- package/dist/ssf/index.d.ts +4 -4
- package/dist/ssf/index.js +384 -47
- 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-ILkLUj_o.js → store-4u_hxjWa.js} +40 -53
- package/dist/{store-options-CbUHDoSe.js → store-options-BqEakYRa.js} +26 -21
- package/dist/{stores-BHXdSbw9.js → stores-BbsD4fAR.js} +2 -2
- package/dist/{stores-Cxz_80g-.d.ts → stores-ClZUgeoP.d.ts} +7 -8
- package/dist/{stream-Dwsg6WwE.d.ts → stream-7-xmnf3U.d.ts} +2 -2
- package/dist/{stream-BMui98KK.js → stream-CvdUS9V1.js} +9 -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/supabase/index.d.ts +23 -106
- package/dist/supabase/index.js +5 -4
- package/dist/supabase/middleware.d.ts +7 -6
- package/dist/supabase/middleware.js +13 -11
- package/dist/supabase-9pqI57pW.js +92 -0
- package/dist/{supabase-C1TWlnYt.js → supabase-Dxlp8A94.js} +98 -205
- package/dist/supabase-hook-CXcGpHqq.js +1 -0
- package/dist/{supabase-hook-Cva3ikXz.js → supabase-hook-DdDQhMlw.js} +951 -60
- package/dist/support-session-C6xJQYut.js +158 -0
- package/dist/svelte/Protected.svelte +4 -4
- package/dist/svelte/index.d.ts +7 -7
- package/dist/svelte/index.js +10 -10
- package/dist/svelte/runtime.d.ts +3 -3
- package/dist/svelte/runtime.js +3 -3
- package/dist/svelte/source.d.ts +7 -7
- package/dist/svelte/source.js +4 -4
- 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/{tenancy-DshjqY0n.js → tenancy-DN2QAx9z.js} +5 -5
- package/dist/terminal/index.d.ts +11 -9
- package/dist/terminal/index.js +23 -287
- package/dist/testing/index.d.ts +311 -38
- package/dist/testing/index.js +3475 -201
- 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-Bx9qy30p.js → token-BLZcjQgt.js} +15 -6
- package/dist/{tool-refusal-CQ7OEia9.js → tool-refusal-CMLN5xhn.js} +2 -2
- package/dist/trpc/index.d.ts +12 -9
- package/dist/trpc/index.js +16 -14
- package/dist/{types-7rJVLWe5.d.ts → types-5Ut_pbKy.d.ts} +61 -11
- package/dist/{store-9KO4BlkB.d.ts → types-BNORmDM8.d.ts} +100 -75
- package/dist/types-BjV-fqcA.d.ts +57 -0
- package/dist/{types-CUcFZfpU.d.ts → types-BqAKcRNW.d.ts} +2 -1
- package/dist/types-C8-KNsFf.d.ts +107 -0
- package/dist/{types-Br9IXUBG.d.ts → types-CCpc2Dcv.d.ts} +77 -17
- package/dist/{types-DpWfQdSh.d.ts → types-CZTnPFzM.d.ts} +46 -11
- package/dist/{types-CqrjB9o6.d.ts → types-CdlxsYQh.d.ts} +23 -11
- package/dist/{types-CIlTojhq.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-ByUo56un.d.ts → types-fbZ7JEXr.d.ts} +23 -22
- package/dist/{types-DHrmBJLH.d.ts → types-tIgIeIKJ.d.ts} +7 -7
- 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-CG9nOYZw.js → usage-T5mXq98v.js} +54 -11
- package/dist/{validation-error-BSSw0l_8.d.ts → validation-error-Bg5Tpluk.d.ts} +1 -1
- package/dist/{validity-dVrUEPJt.js → validity-CZ7-y0Cj.js} +32 -15
- package/dist/{verifier-DMr_Zmb_.js → verifier-DHuh-okk.js} +18 -7
- package/dist/{verify-BztUB3GX.js → verify-DbCL9bnB.js} +645 -50
- package/dist/{version-BEogC-rB.js → version-CEbQ5UeM.js} +4 -3
- package/dist/version-DXkYUISx.js +1 -0
- package/dist/{views-CJsrBS1f.js → views-DTIIO-oQ.js} +22 -5
- package/dist/{permission-types-Dg39z9Kv.d.ts → vocabulary-D6lPdb4Z.d.ts} +65 -2
- package/dist/vue/index.d.ts +9 -10
- package/dist/vue/index.js +8 -8
- 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-zeucB7eF.js → watch-CszoTJMq.js} +44 -5
- package/dist/webmcp/index.d.ts +2 -2
- package/dist/webmcp/index.js +3 -3
- 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-Cr93qqdP.d.ts → wrap-Bd1Tejur.d.ts} +2 -1
- package/dist/{wrap-DWsU_5Bd.js → wrap-gX61EtpB.js} +7 -6
- package/package.json +136 -37
- 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 +123 -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 +14 -10
- package/skills/permdock-data/SKILL.md +6 -6
- package/skills/permdock-data/references/queries-and-rls.md +9 -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 +5 -4
- package/skills/permdock-wire/SKILL.md +17 -11
- package/skills/permdock-wire/references/adapters.md +139 -51
- package/skills/permdock-wire/references/policy-options.md +5 -5
- package/skills/permdock-wire/references/presets-and-recipes.md +58 -0
- package/dist/approvals-DZL76lKW.js +0 -240
- package/dist/arazzo-CD8d0WLb.js +0 -54
- package/dist/catalog-6yWAX6Ps.js +0 -2
- package/dist/catalog-WHG4kBq7.js +0 -48
- package/dist/cloud-C7bSDgX4.js +0 -50
- package/dist/cloud-PeBN3IEn.js +0 -118
- package/dist/collect-Bw2Jdq1q.js +0 -2
- package/dist/collect-CQx4hX4N.js +0 -83
- package/dist/commands-Cpip4ULx.js +0 -97
- package/dist/config-DLt6BvV7.js +0 -36
- package/dist/diff-Cnghh_Ip.js +0 -48
- package/dist/doctor-CuVJvhV_.js +0 -53
- package/dist/duration-xK2jGFVc.js +0 -25
- package/dist/errors-CWfoNg9N.js +0 -47
- package/dist/errors-DRnGZHzF.js +0 -30
- package/dist/expiry-BoBJ8Tvc.js +0 -7
- package/dist/fields-fwfXN01n.js +0 -1016
- 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-DgM7w96K.d.ts +0 -6
- package/dist/index-Dz7didpC.d.ts +0 -201
- package/dist/load-B_shHrmd.js +0 -2
- package/dist/manifest-BngWKryL.js +0 -770
- package/dist/may-use-BOn_dR_w.js +0 -78
- package/dist/openapi-DcQ1Kg40.js +0 -164
- package/dist/ownership-BgnbOJFT.js +0 -851
- package/dist/permdock-L26udHSk.js +0 -3646
- package/dist/powersync-BFSbSElQ.js +0 -62
- package/dist/powersync-DCDgZgfZ.js +0 -2
- package/dist/rls-55DQTuf5.js +0 -250
- package/dist/run-DMcNW_8T.js +0 -174
- package/dist/server-ZYEHtNHS.js +0 -268
- package/dist/sink-BTtmfPnE.js +0 -141
- package/dist/sink-CPN4zLfs.d.ts +0 -104
- package/dist/skills-Dle4ZoLF.js +0 -56
- package/dist/snapshot-Dc9CHPME.js +0 -1078
- package/dist/src-Bb7no-hS.js +0 -639
- package/dist/subject-C6dLxqHU.js +0 -24
- package/dist/supabase-Dbqr141s.js +0 -83
- package/dist/supabase-hook-BULg7Ut_.js +0 -2
- package/dist/thenable-QSmvt-vZ.js +0 -65
- package/dist/types-C0dee0Qf.d.ts +0 -197
- package/dist/types-DvupZE0w.d.ts +0 -9
- package/dist/usage-4G6t643F.js +0 -42
- package/dist/usage-iFLJ0-rr.js +0 -2
- package/dist/vocabulary-hhEFLFoL.d.ts +0 -65
- package/dist/watch-C8TpsAl4.js +0 -2
package/dist/express/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { r as hasCredentials } from "../http-BBoKefeS.js";
|
|
2
|
-
import {
|
|
3
|
-
import { t as problemFromError } from "../map-error-
|
|
4
|
-
import { i as decorate, r as bindKernel } from "../bind-
|
|
5
|
-
import {
|
|
2
|
+
import { d as discoverViaSignatureAgent, m as webBotAuthVerifier, u as InvalidSignatureError } from "../evaluations-DZ2CbV5k.js";
|
|
3
|
+
import { t as problemFromError } from "../map-error-TCAdw-eW.js";
|
|
4
|
+
import { i as decorate, r as bindKernel } from "../bind-CZzhx-Vj.js";
|
|
5
|
+
import { n as sendResponse, r as toRequest } from "../http-ujKm0JXE.js";
|
|
6
6
|
import express from "express";
|
|
7
7
|
//#region src/express/create.ts
|
|
8
8
|
function run(work, next) {
|
|
@@ -33,16 +33,16 @@ const withPermDock = (fn) => (req, res, next) => {
|
|
|
33
33
|
}, next);
|
|
34
34
|
};
|
|
35
35
|
function createPermDock(policy, options) {
|
|
36
|
-
const { kernel, bind, rebind, scopeOf, handlerScope, guard: runGuard } = bindKernel(policy, options, "express", toRequest);
|
|
37
|
-
const
|
|
36
|
+
const { kernel, bind, rebind, scopeOf, handlerScope, getPermDock, guard: runGuard } = bindKernel(policy, options, "express", toRequest);
|
|
37
|
+
const middleware = () => (req, res, next) => {
|
|
38
38
|
respond(req, res, next, async () => {
|
|
39
|
-
decorate(req, await kernel.
|
|
39
|
+
decorate(req, await kernel.getPermDock(bind(req), await scopeOf(req)));
|
|
40
40
|
next();
|
|
41
41
|
});
|
|
42
42
|
};
|
|
43
|
-
const protect = (permission,
|
|
43
|
+
const protect = (permission, data, protectOptions) => (req, res, next) => {
|
|
44
44
|
respond(req, res, next, async () => {
|
|
45
|
-
const guard = await runGuard(permission,
|
|
45
|
+
const guard = await runGuard(permission, data, req, protectOptions);
|
|
46
46
|
if (!guard.ok) {
|
|
47
47
|
await sendResponse(res, guard.response);
|
|
48
48
|
return;
|
|
@@ -67,7 +67,8 @@ function createPermDock(policy, options) {
|
|
|
67
67
|
return router;
|
|
68
68
|
};
|
|
69
69
|
return {
|
|
70
|
-
|
|
70
|
+
getPermDock,
|
|
71
|
+
middleware,
|
|
71
72
|
protect,
|
|
72
73
|
errorHandler,
|
|
73
74
|
permdockHandler,
|
|
@@ -76,4 +77,4 @@ function createPermDock(policy, options) {
|
|
|
76
77
|
};
|
|
77
78
|
}
|
|
78
79
|
//#endregion
|
|
79
|
-
export { InvalidSignatureError, createPermDock, discoverViaSignatureAgent, sendResponse, toRequest,
|
|
80
|
+
export { InvalidSignatureError, createPermDock, discoverViaSignatureAgent, sendResponse, toRequest, webBotAuthVerifier };
|
package/dist/fastify/index.d.ts
CHANGED
|
@@ -1,11 +1,22 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import { T as Policy, j as PolicyVocabulary, rr as Principal } from "../policy-types-DzwivBgR.js";
|
|
2
|
+
import { w as Permission } from "../vocabulary-D6lPdb4Z.js";
|
|
3
|
+
import { r as PermDock } from "../permdock-D7eeLJER.js";
|
|
4
|
+
import { f as InvalidSignatureError, i as OpenApiHooks, o as ProtectOptions, v as discoverViaSignatureAgent, x as webBotAuthVerifier } from "../server-types-BLd4MnBX.js";
|
|
5
|
+
import { t as ServerAdapterOptions } from "../bind--9EFVYWF.js";
|
|
5
6
|
import { FastifyPluginAsync, FastifyReply, FastifyRequest, FastifySchema, FastifyTypeProvider, FastifyTypeProviderDefault, RawRequestDefaultExpression, RawServerDefault, RouteGenericInterface } from "fastify";
|
|
7
|
+
//#region src/server/http.d.ts
|
|
8
|
+
/** A Fastify-style reply: `code`, `header` and `send`. */
|
|
9
|
+
type ReplyLike = {
|
|
10
|
+
code(status: number): unknown;
|
|
11
|
+
header(key: string, value: string): unknown;
|
|
12
|
+
send(body: string): unknown;
|
|
13
|
+
};
|
|
14
|
+
/** Writes `response` to a Fastify-style reply. */
|
|
15
|
+
declare function writeReply(reply: ReplyLike, response: Response): Promise<void>;
|
|
16
|
+
//#endregion
|
|
6
17
|
//#region src/fastify/create.d.ts
|
|
7
18
|
type FastifyPermDockOptions<TUser = unknown> = ServerAdapterOptions<FastifyRequest, TUser>;
|
|
8
|
-
type
|
|
19
|
+
type FastifyPermDockRequest<Route extends RouteGenericInterface = RouteGenericInterface, V extends PolicyVocabulary = PolicyVocabulary> = FastifyRequest<Route> & {
|
|
9
20
|
permdock: PermDock<V>;
|
|
10
21
|
permdockData?: unknown;
|
|
11
22
|
};
|
|
@@ -13,31 +24,23 @@ type PermDockRequest<Route extends RouteGenericInterface = RouteGenericInterface
|
|
|
13
24
|
type ProtectRequest<Route extends RouteGenericInterface = RouteGenericInterface, Schema extends FastifySchema = FastifySchema, Provider extends FastifyTypeProvider = FastifyTypeProviderDefault> = FastifyRequest<Route, RawServerDefault, RawRequestDefaultExpression, Schema, Provider>;
|
|
14
25
|
/**
|
|
15
26
|
* Generic over the route, schema and type provider so a `preHandler` slot
|
|
16
|
-
* infers them: `
|
|
27
|
+
* infers them: `data` sees the same typed `request.body` as the handler.
|
|
17
28
|
*/
|
|
18
|
-
type FastifyProtect = <Route extends RouteGenericInterface = RouteGenericInterface, Schema extends FastifySchema = FastifySchema, Provider extends FastifyTypeProvider = FastifyTypeProviderDefault>(permission: Permission | null,
|
|
29
|
+
type FastifyProtect = <Route extends RouteGenericInterface = RouteGenericInterface, Schema extends FastifySchema = FastifySchema, Provider extends FastifyTypeProvider = FastifyTypeProviderDefault>(permission: Permission | null, data?: (request: ProtectRequest<Route, Schema, Provider>) => unknown, protectOptions?: ProtectOptions) => (request: ProtectRequest<Route, Schema, Provider>, reply: FastifyReply) => Promise<void>;
|
|
19
30
|
type FastifyPermDock<V extends PolicyVocabulary = PolicyVocabulary> = {
|
|
20
|
-
|
|
31
|
+
/** The `PermDock` for one request, for code the middleware does not run before. */
|
|
32
|
+
readonly getPermDock: (request: FastifyRequest) => Promise<PermDock<V>>;
|
|
33
|
+
readonly middleware: () => FastifyPluginAsync;
|
|
21
34
|
readonly protect: FastifyProtect;
|
|
22
|
-
readonly permdockHandler: FastifyPluginAsync;
|
|
23
|
-
/** Types `request.permdock` for a route registered after `
|
|
24
|
-
readonly withPermDock: <Route extends RouteGenericInterface = RouteGenericInterface>(fn: (request:
|
|
35
|
+
readonly permdockHandler: () => FastifyPluginAsync;
|
|
36
|
+
/** Types `request.permdock` for a route registered after `middleware()` or `protect`. */
|
|
37
|
+
readonly withPermDock: <Route extends RouteGenericInterface = RouteGenericInterface>(fn: (request: FastifyPermDockRequest<Route, V>, reply: FastifyReply) => unknown) => (request: FastifyRequest<Route>, reply: FastifyReply) => unknown;
|
|
25
38
|
readonly openapi: OpenApiHooks;
|
|
26
39
|
};
|
|
27
40
|
export declare function createPermDock<TUser, TPrincipal extends Principal = Principal, V extends PolicyVocabulary = PolicyVocabulary>(policy: Policy<TUser, TPrincipal, V>, options: FastifyPermDockOptions<TUser>): FastifyPermDock<V>;
|
|
28
41
|
//#endregion
|
|
29
|
-
//#region src/server/http.d.ts
|
|
30
|
-
/** A Fastify-style reply: `code`, `header` and `send`. */
|
|
31
|
-
type ReplyLike = {
|
|
32
|
-
code(status: number): unknown;
|
|
33
|
-
header(key: string, value: string): unknown;
|
|
34
|
-
send(body: string): unknown;
|
|
35
|
-
};
|
|
36
|
-
/** Writes `response` to a Fastify-style reply. */
|
|
37
|
-
declare function writeReply(reply: ReplyLike, response: Response): Promise<void>;
|
|
38
|
-
//#endregion
|
|
39
42
|
//#region src/fastify/http.d.ts
|
|
40
43
|
export declare function toRequest(request: FastifyRequest): Request;
|
|
41
44
|
export declare const sendReply: typeof writeReply;
|
|
42
45
|
//#endregion
|
|
43
|
-
export { type FastifyPermDock, type FastifyPermDockOptions, type FastifyProtect, InvalidSignatureError,
|
|
46
|
+
export { type FastifyPermDock, type FastifyPermDockOptions, type FastifyPermDockRequest, type FastifyProtect, InvalidSignatureError, discoverViaSignatureAgent, webBotAuthVerifier };
|
package/dist/fastify/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { c as writeReply, i as headersFrom, n as firstHeader, r as hasCredentials, t as fetchRequest } from "../http-BBoKefeS.js";
|
|
2
|
-
import {
|
|
3
|
-
import { t as problemFromError } from "../map-error-
|
|
4
|
-
import { i as decorate, r as bindKernel } from "../bind-
|
|
2
|
+
import { d as discoverViaSignatureAgent, m as webBotAuthVerifier, u as InvalidSignatureError } from "../evaluations-DZ2CbV5k.js";
|
|
3
|
+
import { t as problemFromError } from "../map-error-TCAdw-eW.js";
|
|
4
|
+
import { i as decorate, r as bindKernel } from "../bind-CZzhx-Vj.js";
|
|
5
5
|
//#region src/fastify/http.ts
|
|
6
6
|
function toRequest(request) {
|
|
7
7
|
const host = firstHeader(request.headers.host) ?? "localhost";
|
|
@@ -21,13 +21,13 @@ function skipped(request) {
|
|
|
21
21
|
return typeof config === "object" && config !== null && Reflect.get(config, "permdock") === false;
|
|
22
22
|
}
|
|
23
23
|
function createPermDock(policy, options) {
|
|
24
|
-
const { kernel, bind, rebind, scopeOf, handlerScope, guard: runGuard } = bindKernel(policy, options, "fastify", toRequest);
|
|
25
|
-
const
|
|
24
|
+
const { kernel, bind, rebind, scopeOf, handlerScope, getPermDock, guard: runGuard } = bindKernel(policy, options, "fastify", toRequest);
|
|
25
|
+
const plugin = breakEncapsulation((app) => {
|
|
26
26
|
app.decorateRequest("permdock", null);
|
|
27
27
|
app.decorateRequest("permdockData", null);
|
|
28
28
|
app.addHook("onRequest", async (request) => {
|
|
29
29
|
if (skipped(request)) return;
|
|
30
|
-
decorate(request, await kernel.
|
|
30
|
+
decorate(request, await kernel.getPermDock(bind(request), await scopeOf(request)));
|
|
31
31
|
});
|
|
32
32
|
const previous = app.errorHandler;
|
|
33
33
|
app.setErrorHandler(async function permdockErrors(err, request, reply) {
|
|
@@ -40,16 +40,16 @@ function createPermDock(policy, options) {
|
|
|
40
40
|
});
|
|
41
41
|
return Promise.resolve();
|
|
42
42
|
});
|
|
43
|
-
const protect = (permission,
|
|
43
|
+
const protect = (permission, data, protectOptions) => async (request, reply) => {
|
|
44
44
|
const plain = request;
|
|
45
|
-
const guard = await runGuard(permission,
|
|
45
|
+
const guard = await runGuard(permission, data === void 0 ? void 0 : () => data(request), plain, protectOptions);
|
|
46
46
|
if (!guard.ok) {
|
|
47
47
|
await sendReply(reply, guard.response);
|
|
48
48
|
return;
|
|
49
49
|
}
|
|
50
50
|
decorate(plain, guard.permdock, guard.data);
|
|
51
51
|
};
|
|
52
|
-
const
|
|
52
|
+
const handler = (app) => {
|
|
53
53
|
const { POST, GET } = kernel.permdockHandler(handlerScope);
|
|
54
54
|
app.post("/", async (request, reply) => {
|
|
55
55
|
await sendReply(reply, await POST(rebind(request)));
|
|
@@ -61,12 +61,13 @@ function createPermDock(policy, options) {
|
|
|
61
61
|
};
|
|
62
62
|
const withPermDock = (fn) => (request, reply) => fn(request, reply);
|
|
63
63
|
return {
|
|
64
|
-
|
|
64
|
+
getPermDock,
|
|
65
|
+
middleware: () => plugin,
|
|
65
66
|
protect,
|
|
66
|
-
permdockHandler,
|
|
67
|
+
permdockHandler: () => handler,
|
|
67
68
|
withPermDock,
|
|
68
69
|
openapi: kernel.openapi
|
|
69
70
|
};
|
|
70
71
|
}
|
|
71
72
|
//#endregion
|
|
72
|
-
export { InvalidSignatureError, createPermDock, discoverViaSignatureAgent, sendReply, toRequest,
|
|
73
|
+
export { InvalidSignatureError, createPermDock, discoverViaSignatureAgent, sendReply, toRequest, webBotAuthVerifier };
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { t as compact } from "./compact-CAf557ZB.js";
|
|
2
|
+
import { o as isPermission } from "./permission-registry-Br4jSNVi.js";
|
|
3
|
+
import { r as hasCredentials } from "./http-BBoKefeS.js";
|
|
4
|
+
import { a as methodNotAllowed } from "./problem-CTviyH5L.js";
|
|
5
|
+
import { t as problemFromError } from "./map-error-TCAdw-eW.js";
|
|
6
|
+
import { i as decorate, r as bindKernel } from "./bind-CZzhx-Vj.js";
|
|
7
|
+
//#region src/server/fetch-adapter.ts
|
|
8
|
+
/**
|
|
9
|
+
* `protect(target, data, options)(handler)` for a framework whose routes are
|
|
10
|
+
* plain handlers: a refusal is the response, a grant sets `permdock` and
|
|
11
|
+
* `permdockData` on the event's locals before `handler` runs.
|
|
12
|
+
*/
|
|
13
|
+
function guardedRoute(adapter, route, target, data, protectOptions) {
|
|
14
|
+
return (handler) => async (event) => {
|
|
15
|
+
const context = route.context(event);
|
|
16
|
+
const guard = await adapter.guard(target, data === void 0 ? void 0 : () => data(event), context, protectOptions);
|
|
17
|
+
if (!guard.ok) return guard.response;
|
|
18
|
+
decorate(route.locals(event), guard.permdock, guard.data);
|
|
19
|
+
return adapter.mapErrors(context, () => handler(event));
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/** `withPermDock(handler)`: the instance on the event's locals, built when no middleware set it. */
|
|
23
|
+
function instanceRoute(adapter, route) {
|
|
24
|
+
return (handler) => async (event) => {
|
|
25
|
+
const context = route.context(event);
|
|
26
|
+
const attached = await adapter.ensure(route.locals(event), context);
|
|
27
|
+
if (!attached.ok) return attached.response;
|
|
28
|
+
return adapter.mapErrors(context, () => handler(event));
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
const ALLOW = "GET, HEAD, POST";
|
|
32
|
+
/**
|
|
33
|
+
* The permission and row loader behind a `protect` target. For an operation,
|
|
34
|
+
* `input` reads its input from the request and the operation's `data` loads
|
|
35
|
+
* the row; an operation without `data` checks the permission with no row.
|
|
36
|
+
*/
|
|
37
|
+
function protectTarget(target, input) {
|
|
38
|
+
if (target === null || isPermission(target)) return {
|
|
39
|
+
permission: target,
|
|
40
|
+
data: input
|
|
41
|
+
};
|
|
42
|
+
const load = target.data;
|
|
43
|
+
return {
|
|
44
|
+
permission: target.permission,
|
|
45
|
+
data: load === void 0 ? void 0 : async (context) => load(input === void 0 ? void 0 : await input(context))
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function held(target) {
|
|
49
|
+
const value = Reflect.get(target, "permdock");
|
|
50
|
+
return value === void 0 || value === null ? void 0 : value;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* The kernel of an adapter whose framework hands its handlers a Fetch
|
|
54
|
+
* `Request` inside its own context object (SvelteKit, Astro, h3, SolidStart,
|
|
55
|
+
* TanStack Start).
|
|
56
|
+
*/
|
|
57
|
+
function fetchAdapter(policy, options, adapter, requestOf) {
|
|
58
|
+
const { kernel, bind, scopeOf, handlerScope, attach, guard } = bindKernel(policy, options, adapter, requestOf);
|
|
59
|
+
const getPermDock = async (context) => kernel.getPermDock(bind(context), await scopeOf(context));
|
|
60
|
+
const getSnapshot = async (context, query = {}) => {
|
|
61
|
+
return (await kernel.getPermDock(bind(context), query.tenant === void 0 ? await scopeOf(context) : { tenant: query.tenant })).snapshot(compact({
|
|
62
|
+
include: query.include,
|
|
63
|
+
tenants: query.tenants
|
|
64
|
+
}));
|
|
65
|
+
};
|
|
66
|
+
const ensure = async (target, context) => {
|
|
67
|
+
const existing = held(target);
|
|
68
|
+
if (existing !== void 0) return {
|
|
69
|
+
ok: true,
|
|
70
|
+
permdock: existing
|
|
71
|
+
};
|
|
72
|
+
const result = await attach(context);
|
|
73
|
+
if (result.ok) decorate(target, result.permdock);
|
|
74
|
+
return result;
|
|
75
|
+
};
|
|
76
|
+
const mapErrors = async (context, work) => {
|
|
77
|
+
try {
|
|
78
|
+
return await work();
|
|
79
|
+
} catch (error) {
|
|
80
|
+
const problem = problemFromError(error, { credentials: hasCredentials(requestOf(context)) });
|
|
81
|
+
if (problem === void 0) throw error;
|
|
82
|
+
return problem;
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
const handlers = () => {
|
|
86
|
+
const { GET, POST } = kernel.permdockHandler(handlerScope);
|
|
87
|
+
return {
|
|
88
|
+
GET: (context) => GET(bind(context)),
|
|
89
|
+
POST: (context) => POST(bind(context))
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
const handler = () => {
|
|
93
|
+
const { GET, POST } = handlers();
|
|
94
|
+
return (context) => {
|
|
95
|
+
switch (requestOf(context).method) {
|
|
96
|
+
case "GET":
|
|
97
|
+
case "HEAD": return GET(context);
|
|
98
|
+
case "POST": return POST(context);
|
|
99
|
+
default: return Promise.resolve(methodNotAllowed(ALLOW));
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
return {
|
|
104
|
+
kernel,
|
|
105
|
+
getPermDock,
|
|
106
|
+
getSnapshot,
|
|
107
|
+
attach,
|
|
108
|
+
guard: (target, data, context, protectOptions) => {
|
|
109
|
+
const resolved = protectTarget(target, data);
|
|
110
|
+
return guard(resolved.permission, resolved.data, context, protectOptions);
|
|
111
|
+
},
|
|
112
|
+
ensure,
|
|
113
|
+
connection: async (context, connectionOptions) => kernel.connection(bind(context), connectionOptions, await scopeOf(context)),
|
|
114
|
+
mapErrors,
|
|
115
|
+
handlers,
|
|
116
|
+
handler
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
//#endregion
|
|
120
|
+
export { guardedRoute as n, instanceRoute as r, fetchAdapter as t };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { w as Permission } from "./vocabulary-D6lPdb4Z.js";
|
|
2
|
+
import { a as OperationInput, t as Operation } from "./operations-CxybZErY.js";
|
|
3
|
+
import { n as RevocationFeed } from "./revocations-R07lFBnX.js";
|
|
4
|
+
import { o as ProtectOptions } from "./server-types-BLd4MnBX.js";
|
|
5
|
+
import { t as ServerAdapterOptions } from "./bind--9EFVYWF.js";
|
|
6
|
+
//#region src/server/fetch-adapter.d.ts
|
|
7
|
+
/** What `protect` checks: a permission, an operation from `defineOperations`, or `null` for a route that needs only OAuth scopes. */
|
|
8
|
+
type ProtectTarget = Permission | Operation | null;
|
|
9
|
+
/** Reads a value from the framework context; may be async. */
|
|
10
|
+
type ContextReader<TContext, T> = (context: TContext) => T | Promise<T>;
|
|
11
|
+
/**
|
|
12
|
+
* `protect`'s overloads: a permission takes the row loader, an operation the
|
|
13
|
+
* reader of its input, which the operation's `data` turns into the row.
|
|
14
|
+
*/
|
|
15
|
+
type FetchProtect<TContext, TResult> = {
|
|
16
|
+
<T = unknown>(permission: Permission | null, data?: ContextReader<TContext, T | null | undefined>, protectOptions?: ProtectOptions): TResult;
|
|
17
|
+
<TOperation extends Operation>(operation: TOperation, input?: ContextReader<TContext, OperationInput<TOperation>>, protectOptions?: ProtectOptions): TResult;
|
|
18
|
+
};
|
|
19
|
+
type FetchAdapterOptions<TContext, TUser = unknown> = ServerAdapterOptions<TContext, TUser> & {
|
|
20
|
+
/** Ends or revalidates open streams and sockets; never a decision input. */
|
|
21
|
+
readonly revocations?: RevocationFeed;
|
|
22
|
+
};
|
|
23
|
+
/** The decision endpoint, one handler per method. */
|
|
24
|
+
type PermDockHandlers<TContext> = {
|
|
25
|
+
/** The snapshot for `permdock/react` and the other client entries. */
|
|
26
|
+
readonly GET: (context: TContext) => Promise<Response>;
|
|
27
|
+
/** AuthZEN-shaped evaluations. */
|
|
28
|
+
readonly POST: (context: TContext) => Promise<Response>;
|
|
29
|
+
};
|
|
30
|
+
//#endregion
|
|
31
|
+
export { ProtectTarget as a, PermDockHandlers as i, FetchAdapterOptions as n, FetchProtect as r, ContextReader as t };
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { i as configError } from "./errors-CWTY6uih.js";
|
|
2
|
+
import { s as jsonSchemaOf } from "./catalog-doc-C9wjsfNY.js";
|
|
3
|
+
import { F as quoteQualified, N as quoteIdent, P as quoteLiteral, j as helperSchema, s as signedIn } from "./shared-CD11nBbC.js";
|
|
4
|
+
import { c as branchClauses, i as orSql, s as andSql, u as wrapSql } from "./policies-CO1oOymN.js";
|
|
5
|
+
//#region src/cli/rls/fields.ts
|
|
6
|
+
/** Names of the field-view objects. Part of the SQL contract. */
|
|
7
|
+
const FIELD_VIEWS = {
|
|
8
|
+
/** `<table>_visible`: the `security_invoker` view clients read. */
|
|
9
|
+
view: "_visible",
|
|
10
|
+
/** `<table>_visible_fields`: the owner-rights companion `--revoke-columns` adds. */
|
|
11
|
+
companion: "_visible_fields",
|
|
12
|
+
/** The companion's row-key column, joined to the base table's key. */
|
|
13
|
+
key: "permdock_key",
|
|
14
|
+
/** Marks the companion so doctor PD022 knows it reads as its owner on purpose. */
|
|
15
|
+
comment: "permdock:field-companion"
|
|
16
|
+
};
|
|
17
|
+
function covers(branch, column) {
|
|
18
|
+
return branch.fields === void 0 || branch.fields.includes(column);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* A read grant that only shapes columns: a field-limited deny (it never
|
|
22
|
+
* denies the row) or an allow with an empty list (it grants nothing). With
|
|
23
|
+
* field views it leaves the row policy and lives in the view's masks.
|
|
24
|
+
*/
|
|
25
|
+
function fieldOnly(branch) {
|
|
26
|
+
if (branch.command !== "select" || branch.fields === void 0) return false;
|
|
27
|
+
return branch.effect === "deny" || branch.fields.length === 0;
|
|
28
|
+
}
|
|
29
|
+
/** Branches the row policies keep when field views compile. */
|
|
30
|
+
function rowBranches(branches) {
|
|
31
|
+
return branches.filter((branch) => !fieldOnly(branch));
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Whether the reader is signed in, for branches with no helper call: a grant
|
|
35
|
+
* to any signed-in user relies on `to authenticated` in its policy, which a
|
|
36
|
+
* view does not have.
|
|
37
|
+
*/
|
|
38
|
+
function audience(ctx, branch) {
|
|
39
|
+
if (branch.access !== void 0 || branch.roles.length !== 1) return;
|
|
40
|
+
if (branch.roles[0] === "authenticated") return signedIn(ctx);
|
|
41
|
+
return branch.roles[0] === "anon" ? `not (${signedIn(ctx)})` : void 0;
|
|
42
|
+
}
|
|
43
|
+
function clause(ctx, branch) {
|
|
44
|
+
return andSql(audience(ctx, branch), branchClauses(branch).using) ?? "true";
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* `can(permission, row, { field })` in SQL: an allow that covers the column
|
|
48
|
+
* holds for the row and no covering deny does. Every access term is the
|
|
49
|
+
* uncorrelated helper call the row policy uses, so it runs once per statement.
|
|
50
|
+
*/
|
|
51
|
+
function maskSql(ctx, allows, denies, column) {
|
|
52
|
+
const allowed = allows.filter((branch) => covers(branch, column)).map((branch) => clause(ctx, branch));
|
|
53
|
+
if (allowed.length === 0) return "false";
|
|
54
|
+
const denied = denies.filter((branch) => covers(branch, column)).map((branch) => clause(ctx, branch));
|
|
55
|
+
const allow = orSql(allowed);
|
|
56
|
+
if (denied.length === 0) return allow;
|
|
57
|
+
const deny = orSql(denied);
|
|
58
|
+
return allow === "true" ? `not ${wrapSql(deny)}` : `${wrapSql(allow)} and not ${wrapSql(deny)}`;
|
|
59
|
+
}
|
|
60
|
+
function schemaColumns(policy, resource) {
|
|
61
|
+
const node = policy.resources.get(resource);
|
|
62
|
+
const schema = node === void 0 ? null : jsonSchemaOf(node);
|
|
63
|
+
const properties = schema !== null && typeof schema === "object" ? schema.properties : void 0;
|
|
64
|
+
return properties !== null && typeof properties === "object" ? Object.keys(properties) : void 0;
|
|
65
|
+
}
|
|
66
|
+
function viewName(table, suffix) {
|
|
67
|
+
return `${table}${suffix}`;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* `<helper schema>.<table>_visible_fields`: outside the Data API's schemas,
|
|
71
|
+
* so its owner rights reach clients only through the `_visible` join.
|
|
72
|
+
*/
|
|
73
|
+
function companionName(ctx, table) {
|
|
74
|
+
const base = table.startsWith("public.") ? table.slice(7) : table.replaceAll(".", "_");
|
|
75
|
+
return `${helperSchema(ctx)}.${viewName(base, FIELD_VIEWS.companion)}`;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* One view per table whose read grants limit fields. A column is restricted
|
|
79
|
+
* when some read allow lists fields without it or some read deny lists it;
|
|
80
|
+
* every other column, and the row key, passes through unchanged.
|
|
81
|
+
*/
|
|
82
|
+
function fieldViews(policy, ctx, branches, options, warnings) {
|
|
83
|
+
const byTable = /* @__PURE__ */ new Map();
|
|
84
|
+
for (const branch of branches) {
|
|
85
|
+
if (branch.command !== "select" || branch.coverage === true) continue;
|
|
86
|
+
byTable.set(branch.table, [...byTable.get(branch.table) ?? [], branch]);
|
|
87
|
+
}
|
|
88
|
+
const views = [];
|
|
89
|
+
for (const [table, reads] of byTable) {
|
|
90
|
+
const allows = reads.filter((branch) => branch.effect === "allow" && branch.fields?.length !== 0);
|
|
91
|
+
const denies = reads.filter((branch) => branch.effect === "deny");
|
|
92
|
+
const limited = reads.some((branch) => branch.fields !== void 0);
|
|
93
|
+
const resource = reads.find((branch) => branch.resource !== void 0)?.resource;
|
|
94
|
+
if (!limited || allows.length === 0 || resource === void 0) continue;
|
|
95
|
+
const names = schemaColumns(policy, resource);
|
|
96
|
+
if (names === void 0) throw configError(`PermDock CLI: --fields views needs the ${resource} schema's JSON Schema (Standard JSON Schema) to list the columns of ${table}`);
|
|
97
|
+
const key = policy.resources.get(resource)?.id ?? "id";
|
|
98
|
+
const restricted = (column) => column !== key && (allows.some((branch) => branch.fields !== void 0 && !branch.fields.includes(column)) || denies.some((branch) => branch.fields?.includes(column) === true));
|
|
99
|
+
const columns = names.map((name) => {
|
|
100
|
+
quoteIdent(name);
|
|
101
|
+
return restricted(name) ? {
|
|
102
|
+
name,
|
|
103
|
+
mask: maskSql(ctx, allows, denies, name)
|
|
104
|
+
} : { name };
|
|
105
|
+
});
|
|
106
|
+
if (columns.every((column) => column.mask === void 0)) continue;
|
|
107
|
+
const view = viewName(table, FIELD_VIEWS.view);
|
|
108
|
+
if (allows.some((branch) => branch.fields !== void 0 && !branch.fields.includes(key))) warnings.push(`field view ${view}: the key ${key} passes through, although a read grant on ${resource} omits it`);
|
|
109
|
+
const hidden = columns.filter((column) => column.mask !== void 0).map((column) => column.name);
|
|
110
|
+
if (options.helpersOnly === true) warnings.push(`field view ${view}: ${table} still returns ${hidden.join(", ")} to direct reads; revoke select on those columns from client roles in your own grants, or read them through a function`);
|
|
111
|
+
else if (!options.revokeColumns) warnings.push(`field view ${view}: ${table} still returns ${hidden.join(", ")} to direct reads; add --revoke-columns so clients read through the view`);
|
|
112
|
+
views.push({
|
|
113
|
+
resource,
|
|
114
|
+
table,
|
|
115
|
+
view,
|
|
116
|
+
key,
|
|
117
|
+
columns,
|
|
118
|
+
roles: reads.some((branch) => branch.roles.includes("anon")) ? ["anon", "authenticated"] : ["authenticated"],
|
|
119
|
+
...options.revokeColumns ? { companion: companionName(ctx, table) } : {}
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
return views;
|
|
123
|
+
}
|
|
124
|
+
/** Columns of `view`'s table that `anon` and `authenticated` keep on the base table with `--revoke-columns`. */
|
|
125
|
+
function readableColumns(view) {
|
|
126
|
+
return view.columns.filter((column) => column.mask === void 0).map((column) => column.name);
|
|
127
|
+
}
|
|
128
|
+
function restrictedColumns(view) {
|
|
129
|
+
return view.columns.filter((column) => column.mask !== void 0).map((column) => column.name);
|
|
130
|
+
}
|
|
131
|
+
function columnList(names) {
|
|
132
|
+
return names.map(quoteIdent).join(", ");
|
|
133
|
+
}
|
|
134
|
+
function selectList(lines) {
|
|
135
|
+
return lines.map((line) => ` ${line}`).join(",\n");
|
|
136
|
+
}
|
|
137
|
+
function grantView(name, roles) {
|
|
138
|
+
return [`revoke all on table ${quoteQualified(name)} from anon, authenticated, public;`, `grant select on table ${quoteQualified(name)} to ${roles.join(", ")};`].join("\n");
|
|
139
|
+
}
|
|
140
|
+
function inlineViewSql(view) {
|
|
141
|
+
const targets = view.columns.map((column) => column.mask === void 0 ? quoteIdent(column.name) : `case when ${column.mask} then ${quoteIdent(column.name)} end as ${quoteIdent(column.name)}`);
|
|
142
|
+
return `create or replace view ${quoteQualified(view.view)} with (security_invoker = true) as
|
|
143
|
+
select
|
|
144
|
+
${selectList(targets)}
|
|
145
|
+
from ${quoteQualified(view.table)};`;
|
|
146
|
+
}
|
|
147
|
+
function companionSql(view, companion) {
|
|
148
|
+
const restricted = view.columns.filter((column) => column.mask !== void 0);
|
|
149
|
+
const targets = [`${quoteIdent(view.key)} as ${quoteIdent(FIELD_VIEWS.key)}`, ...restricted.map((column) => `case when ${column.mask} then ${quoteIdent(column.name)} end as ${quoteIdent(column.name)}`)];
|
|
150
|
+
const any = orSql(restricted.map((column) => column.mask ?? "false"));
|
|
151
|
+
const name = companion.slice(0, companion.indexOf("."));
|
|
152
|
+
const schema = quoteIdent(name);
|
|
153
|
+
return `${name === "public" ? "" : `create schema if not exists ${schema};
|
|
154
|
+
revoke all on schema ${schema} from public;
|
|
155
|
+
grant usage on schema ${schema} to ${view.roles.join(", ")};
|
|
156
|
+
`}create or replace view ${quoteQualified(companion)} with (security_barrier = true) as
|
|
157
|
+
select
|
|
158
|
+
${selectList(targets)}
|
|
159
|
+
from ${quoteQualified(view.table)}
|
|
160
|
+
where ${any};
|
|
161
|
+
comment on view ${quoteQualified(companion)} is ${quoteLiteral(`${FIELD_VIEWS.comment} ${view.view}`)};`;
|
|
162
|
+
}
|
|
163
|
+
function joinedViewSql(view, companion) {
|
|
164
|
+
const targets = view.columns.map((column) => column.mask === void 0 ? `t.${quoteIdent(column.name)}` : `f.${quoteIdent(column.name)}`);
|
|
165
|
+
return `create or replace view ${quoteQualified(view.view)} with (security_invoker = true) as
|
|
166
|
+
select
|
|
167
|
+
${selectList(targets)}
|
|
168
|
+
from ${quoteQualified(view.table)} t
|
|
169
|
+
left join ${quoteQualified(companion)} f on f.${quoteIdent(FIELD_VIEWS.key)} = t.${quoteIdent(view.key)};`;
|
|
170
|
+
}
|
|
171
|
+
/** `select` on only the unrestricted columns (and the key) of the base table, for `--revoke-columns`. */
|
|
172
|
+
function columnGrantSql(view, role) {
|
|
173
|
+
return `grant select (${columnList(readableColumns(view))}) on table ${quoteQualified(view.table)} to ${role};`;
|
|
174
|
+
}
|
|
175
|
+
function columnRevokeSql(view) {
|
|
176
|
+
return `revoke select (${columnList(restrictedColumns(view))}) on table ${quoteQualified(view.table)} from anon, authenticated;`;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* The view SQL: the `security_invoker` view, and with `--revoke-columns` the
|
|
180
|
+
* owner-rights companion it joins for the restricted columns. The companion
|
|
181
|
+
* masks every column with the full field decision and keeps only rows where
|
|
182
|
+
* one is readable, so reading it directly shows nothing `pick` would not.
|
|
183
|
+
*/
|
|
184
|
+
function fieldViewsSql(views) {
|
|
185
|
+
return views.map((view) => {
|
|
186
|
+
const head = `-- field view over ${view.table}: ${restrictedColumns(view).join(", ")} read as null unless a read grant covers the column for the row`;
|
|
187
|
+
if (view.companion === void 0) return [
|
|
188
|
+
head,
|
|
189
|
+
inlineViewSql(view),
|
|
190
|
+
grantView(view.view, view.roles)
|
|
191
|
+
].join("\n");
|
|
192
|
+
return [
|
|
193
|
+
head,
|
|
194
|
+
`-- ${view.companion} reads ${view.table} as its owner; ${view.view} reads the rows as the caller and joins it`,
|
|
195
|
+
companionSql(view, view.companion),
|
|
196
|
+
grantView(view.companion, view.roles),
|
|
197
|
+
joinedViewSql(view, view.companion),
|
|
198
|
+
grantView(view.view, view.roles)
|
|
199
|
+
].join("\n");
|
|
200
|
+
}).join("\n\n");
|
|
201
|
+
}
|
|
202
|
+
//#endregion
|
|
203
|
+
export { fieldViewsSql as a, fieldViews as i, columnGrantSql as n, rowBranches as o, columnRevokeSql as r, viewName as s, FIELD_VIEWS as t };
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { n as CliError } from "./errors-CWTY6uih.js";
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, realpathSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { dirname, relative, resolve } from "node:path";
|
|
4
|
+
import { execFileSync } from "node:child_process";
|
|
5
|
+
//#region src/cli/core/files.ts
|
|
6
|
+
function outcomeOf(abs, text) {
|
|
7
|
+
if (!existsSync(abs)) return "created";
|
|
8
|
+
return readFileSync(abs, "utf8") === text ? "unchanged" : "updated";
|
|
9
|
+
}
|
|
10
|
+
/** What writing `files` would do, without writing. */
|
|
11
|
+
function planFiles(cwd, files) {
|
|
12
|
+
return files.map((file) => ({
|
|
13
|
+
path: file.path,
|
|
14
|
+
outcome: outcomeOf(resolve(cwd, file.path), file.text)
|
|
15
|
+
}));
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Writes every created or updated file, all or nothing: each one is staged
|
|
19
|
+
* beside its target first, and a failed stage removes the others before
|
|
20
|
+
* anything is replaced. `dryRun` only plans.
|
|
21
|
+
*/
|
|
22
|
+
function applyFiles(cwd, files, options = {}) {
|
|
23
|
+
const planned = planFiles(cwd, files);
|
|
24
|
+
if (options.dryRun === true) return planned;
|
|
25
|
+
const staged = [];
|
|
26
|
+
try {
|
|
27
|
+
for (const [index, file] of files.entries()) {
|
|
28
|
+
if (planned[index]?.outcome === "unchanged") continue;
|
|
29
|
+
const target = resolve(cwd, file.path);
|
|
30
|
+
const temp = `${target}.permdock-${String(process.pid)}.tmp`;
|
|
31
|
+
mkdirSync(dirname(target), { recursive: true });
|
|
32
|
+
writeFileSync(temp, file.text);
|
|
33
|
+
staged.push({
|
|
34
|
+
temp,
|
|
35
|
+
target
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
} catch (error) {
|
|
39
|
+
for (const { temp } of staged) rmSync(temp, { force: true });
|
|
40
|
+
throw new CliError("failed", `could not write ${describe(error)}; wrote nothing`, {
|
|
41
|
+
code: "write_failed",
|
|
42
|
+
cause: error
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
for (const { temp, target } of staged) renameSync(temp, target);
|
|
46
|
+
return planned;
|
|
47
|
+
}
|
|
48
|
+
function describe(error) {
|
|
49
|
+
return error instanceof Error ? error.message : String(error);
|
|
50
|
+
}
|
|
51
|
+
const VERBS = {
|
|
52
|
+
created: ["Created", "Would create"],
|
|
53
|
+
updated: ["Updated", "Would update"],
|
|
54
|
+
unchanged: ["Unchanged", "Unchanged"]
|
|
55
|
+
};
|
|
56
|
+
/** One line per file: `Created x`, or `Would create x` under `--dry-run`. */
|
|
57
|
+
function fileSummary(applied, dryRun) {
|
|
58
|
+
return applied.map((file) => `${VERBS[file.outcome][dryRun ? 1 : 0]} ${file.path}`).join("\n");
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* The files among `paths` with uncommitted changes in git. Outside a git
|
|
62
|
+
* work tree, or without git, nothing counts as dirty.
|
|
63
|
+
*/
|
|
64
|
+
function dirtyFiles(cwd, paths) {
|
|
65
|
+
if (paths.length === 0) return [];
|
|
66
|
+
let status;
|
|
67
|
+
try {
|
|
68
|
+
status = execFileSync("git", [
|
|
69
|
+
"status",
|
|
70
|
+
"--porcelain",
|
|
71
|
+
"-z",
|
|
72
|
+
"--",
|
|
73
|
+
...paths.map((path) => resolve(cwd, path))
|
|
74
|
+
], {
|
|
75
|
+
cwd,
|
|
76
|
+
encoding: "utf8",
|
|
77
|
+
stdio: [
|
|
78
|
+
"ignore",
|
|
79
|
+
"pipe",
|
|
80
|
+
"ignore"
|
|
81
|
+
]
|
|
82
|
+
});
|
|
83
|
+
} catch {
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
let root;
|
|
87
|
+
try {
|
|
88
|
+
root = execFileSync("git", ["rev-parse", "--show-toplevel"], {
|
|
89
|
+
cwd,
|
|
90
|
+
encoding: "utf8",
|
|
91
|
+
stdio: [
|
|
92
|
+
"ignore",
|
|
93
|
+
"pipe",
|
|
94
|
+
"ignore"
|
|
95
|
+
]
|
|
96
|
+
}).trim();
|
|
97
|
+
} catch {
|
|
98
|
+
return [];
|
|
99
|
+
}
|
|
100
|
+
return status.split("\0").filter((entry) => entry.length > 3).map((entry) => relative(realpathSync(cwd), resolve(root, entry.slice(3))));
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* A rewrite of hand-written files stops when one of them has uncommitted
|
|
104
|
+
* changes, so `git diff` shows only what the command changed. `--force`
|
|
105
|
+
* rewrites anyway.
|
|
106
|
+
*/
|
|
107
|
+
function refuseDirty(input) {
|
|
108
|
+
if (input.force) return;
|
|
109
|
+
const dirty = dirtyFiles(input.cwd, input.paths);
|
|
110
|
+
if (dirty.length === 0) return;
|
|
111
|
+
throw new CliError("action", `${input.command} rewrites files with uncommitted changes: ${dirty.join(", ")}. Commit or stash them first, so git diff shows only the rewrite.`, {
|
|
112
|
+
code: "dirty_worktree",
|
|
113
|
+
extensions: { files: dirty },
|
|
114
|
+
next: [{
|
|
115
|
+
when: "to see the changes first",
|
|
116
|
+
command: `permdock ${input.invocation} --dry-run`
|
|
117
|
+
}, {
|
|
118
|
+
when: "to rewrite anyway",
|
|
119
|
+
command: `permdock ${input.invocation} --force`
|
|
120
|
+
}]
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
//#endregion
|
|
124
|
+
export { fileSummary as n, refuseDirty as r, applyFiles as t };
|