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
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { n as OPERATION_RISKS } from "./permissions-B-wCP5ZC.js";
|
|
2
|
+
//#region src/catalog/operation-findings.ts
|
|
3
|
+
function rank(risk) {
|
|
4
|
+
return OPERATION_RISKS.indexOf(risk ?? "low");
|
|
5
|
+
}
|
|
6
|
+
function requiresApproval(catalog, permission) {
|
|
7
|
+
return (catalog.permissions.find((entry) => entry.key === permission)?.approvals?.length ?? 0) > 0;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Operations, matched by name, whose `meta.risk` rose or whose permission
|
|
11
|
+
* stopped requiring approval between two catalogs. A new or removed
|
|
12
|
+
* operation is not a finding.
|
|
13
|
+
*/
|
|
14
|
+
function operationFindings(previous, next) {
|
|
15
|
+
const before = new Map((previous.operations ?? []).map((operation) => [operation.name, operation]));
|
|
16
|
+
const findings = [];
|
|
17
|
+
for (const operation of next.operations ?? []) {
|
|
18
|
+
const old = before.get(operation.name);
|
|
19
|
+
if (old === void 0) continue;
|
|
20
|
+
if (rank(operation.meta.risk) > rank(old.meta.risk)) findings.push({
|
|
21
|
+
code: "operation-risk-raised",
|
|
22
|
+
operation: operation.name,
|
|
23
|
+
permission: operation.permission,
|
|
24
|
+
previous: old.meta.risk ?? "low",
|
|
25
|
+
risk: operation.meta.risk ?? "low"
|
|
26
|
+
});
|
|
27
|
+
if (requiresApproval(previous, old.permission) && !requiresApproval(next, operation.permission)) findings.push({
|
|
28
|
+
code: "operation-approval-removed",
|
|
29
|
+
operation: operation.name,
|
|
30
|
+
permission: operation.permission
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return findings;
|
|
34
|
+
}
|
|
35
|
+
//#endregion
|
|
36
|
+
export { operationFindings as t };
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { E as PermissionTree, w as Permission } from "./vocabulary-D6lPdb4Z.js";
|
|
2
|
+
//#region src/core/operation-risks.d.ts
|
|
3
|
+
type OperationRisk = "low" | "medium" | "high" | "critical";
|
|
4
|
+
/** Every `meta.risk` level, lowest first. */
|
|
5
|
+
declare const OPERATION_RISKS: readonly OperationRisk[];
|
|
6
|
+
declare function isOperationRisk(value: unknown): value is OperationRisk;
|
|
7
|
+
//#endregion
|
|
8
|
+
//#region src/core/operations.d.ts
|
|
9
|
+
type OperationEffect = "read" | "write" | "delete" | "send" | "spend" | "external";
|
|
10
|
+
/** Plain JSON a host reads to label, confirm or gate an operation; PermDock never decides on it. */
|
|
11
|
+
type OperationMeta = {
|
|
12
|
+
readonly risk?: OperationRisk;
|
|
13
|
+
/** What running the operation does, each effect at most once. */
|
|
14
|
+
readonly effects?: readonly OperationEffect[];
|
|
15
|
+
readonly title?: string;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Loads the row the check runs on from the operation's input, the binding
|
|
19
|
+
* every surface shares. The row is validated against the permission's
|
|
20
|
+
* resource schema like any request-derived data (invariant 9).
|
|
21
|
+
*/
|
|
22
|
+
type OperationData<TInput = never> = {
|
|
23
|
+
load(input: TInput): unknown;
|
|
24
|
+
}["load"];
|
|
25
|
+
/** One entry of the object passed to `defineOperations`. */
|
|
26
|
+
type OperationDefinition = {
|
|
27
|
+
readonly permission: Permission;
|
|
28
|
+
readonly data?: OperationData<unknown>;
|
|
29
|
+
/** The permission each result row is filtered by. */
|
|
30
|
+
readonly results?: Permission;
|
|
31
|
+
readonly meta?: OperationMeta;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* A permission-bound action that agent tools, workflow nodes, MCP operations,
|
|
35
|
+
* HTTP routes and chat commands read by name. `TInput` is the parameter type
|
|
36
|
+
* of `data`; an operation without `data` takes `undefined`.
|
|
37
|
+
*/
|
|
38
|
+
type Operation<TInput = unknown, TName extends string = string, TPermission extends Permission = Permission> = {
|
|
39
|
+
readonly name: TName;
|
|
40
|
+
readonly permission: TPermission;
|
|
41
|
+
readonly data?: OperationData<TInput>;
|
|
42
|
+
readonly results?: Permission;
|
|
43
|
+
readonly meta: OperationMeta;
|
|
44
|
+
};
|
|
45
|
+
/** The input type of an operation: the parameter type of its `data` loader. */
|
|
46
|
+
type OperationInput<TOperation> = TOperation extends Operation<infer TInput> ? TInput : never;
|
|
47
|
+
type InputOf<TDefinition> = TDefinition extends {
|
|
48
|
+
readonly data: (input: infer TInput) => unknown;
|
|
49
|
+
} ? TInput : undefined;
|
|
50
|
+
type OperationMap<TDefinitions extends Record<string, OperationDefinition> = Record<string, OperationDefinition>> = { readonly [TName in keyof TDefinitions & string]: Operation<InputOf<TDefinitions[TName]>, TName, TDefinitions[TName]["permission"]>; };
|
|
51
|
+
/**
|
|
52
|
+
* Binds each named operation to a permission of `permissions`. Throws at
|
|
53
|
+
* definition time for a permission or `results` outside the tree, a name that
|
|
54
|
+
* is not 1 to 128 of `A-Z a-z 0-9 _ . -` or repeats another case-insensitively,
|
|
55
|
+
* a `data` that is not a function, or meta outside the closed lists.
|
|
56
|
+
*/
|
|
57
|
+
declare function defineOperations<const TDefinitions extends Record<string, OperationDefinition>>(permissions: PermissionTree, definitions: TDefinitions): OperationMap<TDefinitions>;
|
|
58
|
+
//#endregion
|
|
59
|
+
export { OperationInput as a, defineOperations as c, isOperationRisk as d, OperationEffect as i, OPERATION_RISKS as l, OperationData as n, OperationMap as o, OperationDefinition as r, OperationMeta as s, Operation as t, OperationRisk as u };
|
package/dist/orpc/index.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { t as
|
|
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 { n as RevocationFeed } from "../revocations-R07lFBnX.js";
|
|
5
|
+
import { D as ConnectionOptions, T as Connection, i as OpenApiHooks } from "../server-types-BLd4MnBX.js";
|
|
6
|
+
import { t as ServerAdapterOptions } from "../bind--9EFVYWF.js";
|
|
7
|
+
import { t as StreamProtectOptions } from "../stream-7-xmnf3U.js";
|
|
7
8
|
import { Middleware } from "@orpc/server";
|
|
8
9
|
//#region src/orpc/create.d.ts
|
|
9
10
|
type OrpcMiddlewareOpts<TCtx extends object = object, TInput = unknown> = {
|
|
@@ -25,7 +26,7 @@ type OrpcPermDockOptions<TCtx extends object = object, TUser = unknown> = Server
|
|
|
25
26
|
readonly revocations?: RevocationFeed;
|
|
26
27
|
};
|
|
27
28
|
type OrpcOpenApiHooks<TCtx extends object = object, V extends PolicyVocabulary = PolicyVocabulary> = {
|
|
28
|
-
readonly protect: (permission: Permission | null,
|
|
29
|
+
readonly protect: (permission: Permission | null, data?: (opts: OrpcMiddlewareOpts<TCtx>) => unknown, protectOptions?: StreamProtectOptions) => OrpcMiddleware<TCtx, unknown, V>;
|
|
29
30
|
readonly security: (permission: Permission) => {
|
|
30
31
|
readonly security: readonly Record<string, readonly string[]>[];
|
|
31
32
|
readonly "x-permdock-permissions": readonly string[];
|
|
@@ -33,11 +34,13 @@ type OrpcOpenApiHooks<TCtx extends object = object, V extends PolicyVocabulary =
|
|
|
33
34
|
readonly securitySchemes: OpenApiHooks["securitySchemes"];
|
|
34
35
|
};
|
|
35
36
|
type OrpcPermDock<TCtx extends object = object, V extends PolicyVocabulary = PolicyVocabulary> = {
|
|
36
|
-
|
|
37
|
-
readonly
|
|
37
|
+
/** The `PermDock` for one procedure call, for code the middleware does not run before. */
|
|
38
|
+
readonly getPermDock: (opts: OrpcMiddlewareOpts<TCtx>) => Promise<PermDock<V>>;
|
|
39
|
+
readonly middleware: () => OrpcMiddleware<TCtx, unknown, V>;
|
|
40
|
+
readonly protect: (permission: Permission | null, data?: (opts: OrpcMiddlewareOpts<TCtx>) => unknown, protectOptions?: StreamProtectOptions) => OrpcMiddleware<TCtx, unknown, V>;
|
|
38
41
|
/** A long-lived connection for the request behind `context`. */
|
|
39
42
|
readonly connection: (opts: OrpcMiddlewareOpts<TCtx>, connectionOptions?: ConnectionOptions) => Promise<Connection>;
|
|
40
|
-
readonly permdockHandler: (request: Request) => Promise<Response>;
|
|
43
|
+
readonly permdockHandler: () => (request: Request) => Promise<Response>;
|
|
41
44
|
readonly openapi: OrpcOpenApiHooks<TCtx, V>;
|
|
42
45
|
};
|
|
43
46
|
/**
|
package/dist/orpc/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { t as compact } from "../compact-
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { t as problemFromError } from "../map-error-
|
|
5
|
-
import { n as attached } from "../bind-
|
|
6
|
-
import {
|
|
7
|
-
import { i as rpcCode, n as guardStream, r as problemBody, t as bindRpcKernel } from "../rpc-
|
|
1
|
+
import { t as compact } from "../compact-CAf557ZB.js";
|
|
2
|
+
import { o as isPermission } from "../permission-registry-Br4jSNVi.js";
|
|
3
|
+
import { o as problemMessage } from "../http-BBoKefeS.js";
|
|
4
|
+
import { t as problemFromError } from "../map-error-TCAdw-eW.js";
|
|
5
|
+
import { n as attached } from "../bind-CZzhx-Vj.js";
|
|
6
|
+
import { i as isAsyncIterable, o as reloadAfter } from "../stream-CvdUS9V1.js";
|
|
7
|
+
import { i as rpcCode, n as guardStream, r as problemBody, t as bindRpcKernel } from "../rpc-aPyNi6tA.js";
|
|
8
8
|
import { ORPCError } from "@orpc/server";
|
|
9
9
|
//#region src/orpc/create.ts
|
|
10
10
|
function toOpts(mw, input, next) {
|
|
@@ -71,7 +71,7 @@ function permissionOf(procedure) {
|
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
73
|
function createPermDock(policy, options) {
|
|
74
|
-
const { kernel, bind, attach, scopeOf, connection, evaluate } = bindRpcKernel(policy, options, "orpc", (opts) => opts.context, (opts) => opts.path?.join(".") ?? "orpc");
|
|
74
|
+
const { kernel, bind, attach, scopeOf, connection, evaluate, guard: runGuard } = bindRpcKernel(policy, options, "orpc", (opts) => opts.context, (opts) => opts.path?.join(".") ?? "orpc");
|
|
75
75
|
/** Instances this factory built, with the tenant each was built for. */
|
|
76
76
|
const issued = /* @__PURE__ */ new WeakMap();
|
|
77
77
|
const issue = (instance, scope) => {
|
|
@@ -83,10 +83,14 @@ function createPermDock(policy, options) {
|
|
|
83
83
|
if (typeof bound !== "object" || bound === null || !issued.has(bound) || issued.get(bound) !== scope.tenant) return;
|
|
84
84
|
return bound;
|
|
85
85
|
};
|
|
86
|
-
const
|
|
86
|
+
const getPermDock = async (opts) => {
|
|
87
|
+
const scope = await scopeOf(opts);
|
|
88
|
+
return boundFor(opts.context, scope) ?? issue(await kernel.getPermDock(bind(opts), scope), scope);
|
|
89
|
+
};
|
|
90
|
+
const middleware = () => ((mwOptions, input) => {
|
|
87
91
|
const opts = toOpts(mwOptions, input, mwOptions.next);
|
|
88
92
|
const request = bind(opts);
|
|
89
|
-
return scopeOf(opts).then((scope) => attached(async () => boundFor(opts.context, scope) ?? issue(await kernel.
|
|
93
|
+
return scopeOf(opts).then((scope) => attached(async () => boundFor(opts.context, scope) ?? issue(await kernel.getPermDock(request, scope), scope))).then((instance) => {
|
|
90
94
|
if (!instance.ok) return throwOrpcError(instance.response, mwOptions.errors);
|
|
91
95
|
const nextCtx = {
|
|
92
96
|
...opts.context,
|
|
@@ -97,19 +101,17 @@ function createPermDock(policy, options) {
|
|
|
97
101
|
});
|
|
98
102
|
});
|
|
99
103
|
/** Wraps an event iterator so revocation ends it and unreadable items drop. */
|
|
100
|
-
const guardOutput = async (result, opts, permission,
|
|
104
|
+
const guardOutput = async (result, opts, permission, data, protectOptions, errors) => {
|
|
101
105
|
const output = result !== null && typeof result === "object" && "output" in result ? result.output : void 0;
|
|
102
106
|
if (!isAsyncIterable(output)) return result;
|
|
103
107
|
return {
|
|
104
108
|
...result,
|
|
105
|
-
output: await guardStream(output, (connectionOptions) => connection(opts, connectionOptions), permission,
|
|
109
|
+
output: await guardStream(output, (connectionOptions) => connection(opts, connectionOptions), permission, data, protectOptions, { onRevoked: (error) => orpcErrorFrom(error, errors) })
|
|
106
110
|
};
|
|
107
111
|
};
|
|
108
|
-
const protect = (permission,
|
|
112
|
+
const protect = (permission, data, protectOptions) => tagged(permission, (async (mwOptions, input) => {
|
|
109
113
|
const opts = toOpts(mwOptions, input, mwOptions.next);
|
|
110
|
-
const request =
|
|
111
|
-
const scope = await scopeOf(opts);
|
|
112
|
-
const guard = await kernel.protect(permission, loadData === void 0 ? void 0 : () => loadData(opts), protectOptions)(request, scope);
|
|
114
|
+
const { request, scope, guard } = await runGuard(permission, data, opts, protectOptions);
|
|
113
115
|
if (guard.ok) {
|
|
114
116
|
const nextCtx = {
|
|
115
117
|
...opts.context,
|
|
@@ -117,11 +119,11 @@ function createPermDock(policy, options) {
|
|
|
117
119
|
permdockData: guard.data
|
|
118
120
|
};
|
|
119
121
|
attach(nextCtx, request);
|
|
120
|
-
return guardOutput(await mapDownstream(() => mwOptions.next({ context: nextCtx }), mwOptions.errors), opts, permission,
|
|
122
|
+
return guardOutput(await mapDownstream(() => mwOptions.next({ context: nextCtx }), mwOptions.errors), opts, permission, data === void 0 ? void 0 : reloadAfter(guard.data, () => data(opts)), protectOptions, mwOptions.errors);
|
|
121
123
|
}
|
|
122
124
|
return throwOrpcError(guard.response, mwOptions.errors);
|
|
123
125
|
}));
|
|
124
|
-
const
|
|
126
|
+
const handler = (request) => {
|
|
125
127
|
return evaluate(request, {
|
|
126
128
|
context: { req: request },
|
|
127
129
|
path: ["permdock"],
|
|
@@ -130,10 +132,11 @@ function createPermDock(policy, options) {
|
|
|
130
132
|
};
|
|
131
133
|
const kernelOpenApi = kernel.openapi;
|
|
132
134
|
return {
|
|
133
|
-
|
|
135
|
+
getPermDock,
|
|
136
|
+
middleware,
|
|
134
137
|
protect,
|
|
135
138
|
connection,
|
|
136
|
-
permdockHandler,
|
|
139
|
+
permdockHandler: () => handler,
|
|
137
140
|
openapi: {
|
|
138
141
|
protect,
|
|
139
142
|
security: kernelOpenApi.security,
|
package/dist/otel/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { j as PolicyVocabulary } from "../policy-types-DzwivBgR.js";
|
|
2
|
+
import { r as PermDock } from "../permdock-D7eeLJER.js";
|
|
3
|
+
import { a as OtelOptions, i as OtelApi, n as GEN_AI_TOOL_CALL_ID, o as OtelWrap, r as GEN_AI_TOOL_NAME, s as StructuralLogger, t as GENAI_SEMCONV_PIN } from "../types-BqAKcRNW.js";
|
|
3
4
|
//#region src/otel/instrument.d.ts
|
|
4
5
|
/**
|
|
5
6
|
* Listens on one instance. Spans carry no duration and no histogram is
|
package/dist/otel/index.js
CHANGED
|
@@ -1,8 +1,15 @@
|
|
|
1
|
-
import { t as compact } from "../compact-
|
|
1
|
+
import { t as compact } from "../compact-CAf557ZB.js";
|
|
2
|
+
import { n as wrapPermDock } from "../wrap-gX61EtpB.js";
|
|
3
|
+
import { r as appObligationNames } from "../ocsf-BFp-PZZA.js";
|
|
2
4
|
//#region src/otel/types.ts
|
|
3
5
|
const GENAI_SEMCONV_PIN = "1.37.0";
|
|
4
6
|
const GEN_AI_TOOL_NAME = "gen_ai.tool.name";
|
|
5
7
|
const GEN_AI_TOOL_CALL_ID = "gen_ai.tool.call.id";
|
|
8
|
+
const GEN_AI_AGENT_ID = "gen_ai.agent.id";
|
|
9
|
+
const GEN_AI_REQUEST_MODEL = "gen_ai.request.model";
|
|
10
|
+
const USER_ID = "user.id";
|
|
11
|
+
const USER_ROLES = "user.roles";
|
|
12
|
+
const ERROR_TYPE = "error.type";
|
|
6
13
|
//#endregion
|
|
7
14
|
//#region src/otel/instrument.ts
|
|
8
15
|
const FORBIDDEN = /* @__PURE__ */ new Set([
|
|
@@ -78,9 +85,26 @@ function omitPath(attributes, path) {
|
|
|
78
85
|
matched: true
|
|
79
86
|
};
|
|
80
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* `error.type` for a decision that failed: a boundary validation failure
|
|
90
|
+
* always, and the first denial reason when `errorOnDeny` marks every denial
|
|
91
|
+
* an error.
|
|
92
|
+
*/
|
|
93
|
+
function errorType(event, options) {
|
|
94
|
+
if (event.outcome !== "denied") return;
|
|
95
|
+
if (event.denials?.some((denial) => denial.reason === "validation") === true) return "validation";
|
|
96
|
+
return options.errorOnDeny === true ? event.denials?.[0]?.reason : void 0;
|
|
97
|
+
}
|
|
81
98
|
function attributesOf(event, options, parent) {
|
|
82
99
|
const extra = options.attributes === void 0 ? {} : options.attributes(event);
|
|
100
|
+
const actor = event.subject.actor;
|
|
101
|
+
const scopes = event.subject.delegation?.scope?.split(" ").filter((scope) => scope !== "");
|
|
83
102
|
let redacted = compact({
|
|
103
|
+
[USER_ID]: event.subject.principal?.id,
|
|
104
|
+
[USER_ROLES]: event.subject.principal?.roles,
|
|
105
|
+
[GEN_AI_AGENT_ID]: actor?.kind === "agent" ? actor.id : void 0,
|
|
106
|
+
[GEN_AI_REQUEST_MODEL]: event.model ?? parent?.attributes?.["gen_ai.request.model"],
|
|
107
|
+
[ERROR_TYPE]: errorType(event, options),
|
|
84
108
|
"permdock.outcome": event.outcome,
|
|
85
109
|
"permdock.permission": event.permission,
|
|
86
110
|
"permdock.scope": event.scope,
|
|
@@ -89,8 +113,11 @@ function attributesOf(event, options, parent) {
|
|
|
89
113
|
"permdock.subject.id": event.subject.principal?.id,
|
|
90
114
|
"permdock.actor.id": event.subject.actor?.id,
|
|
91
115
|
"permdock.actor.kind": event.subject.actor?.kind,
|
|
92
|
-
"permdock.
|
|
116
|
+
"permdock.support_session.id": event.subject.supportSession?.id,
|
|
117
|
+
"permdock.delegation.scopes": scopes,
|
|
93
118
|
"permdock.matched.role": event.matched?.role,
|
|
119
|
+
"permdock.matched.name": event.matched?.name,
|
|
120
|
+
"permdock.obligations": appObligationNames(event),
|
|
94
121
|
"permdock.denials.count": event.denials?.length,
|
|
95
122
|
"permdock.token": event.token,
|
|
96
123
|
"permdock.validate": event.trusted ? "trusted" : "boundary",
|
|
@@ -131,9 +158,9 @@ function recordSignals(event, options, api, timing) {
|
|
|
131
158
|
span.setAttributes?.(attributes);
|
|
132
159
|
if (event.outcome === "denied") {
|
|
133
160
|
span.addEvent?.("permdock.denied", compact({
|
|
134
|
-
role: event.denials?.map((denial) => denial.role
|
|
135
|
-
reason: event.denials?.map((denial) => denial.reason)
|
|
136
|
-
alternatives: event.alternatives
|
|
161
|
+
role: event.denials?.map((denial) => denial.role ?? ""),
|
|
162
|
+
reason: event.denials?.map((denial) => denial.reason),
|
|
163
|
+
alternatives: event.alternatives
|
|
137
164
|
}));
|
|
138
165
|
if (event.denials?.some((denial) => denial.reason === "validation") === true) span.recordException?.(/* @__PURE__ */ new Error("validation"));
|
|
139
166
|
if (options.errorOnDeny === true) span.setStatus?.({ code: SPAN_STATUS_ERROR });
|
|
@@ -170,28 +197,27 @@ function instrument(permdock, options = {}) {
|
|
|
170
197
|
return listen(permdock, options, resolveApi(options.api), () => void 0);
|
|
171
198
|
}
|
|
172
199
|
function instrumented(permdock, options, api) {
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
const
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
team: (id) => instrumented(permdock.team(id), options, api)
|
|
200
|
+
return wrapPermDock(permdock, (inner) => {
|
|
201
|
+
let started;
|
|
202
|
+
listen(inner, options, api, () => started);
|
|
203
|
+
const timed = (fn) => (...args) => {
|
|
204
|
+
const outer = started === void 0;
|
|
205
|
+
if (outer) started = now();
|
|
206
|
+
try {
|
|
207
|
+
return fn(...args);
|
|
208
|
+
} finally {
|
|
209
|
+
if (outer) started = void 0;
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
return {
|
|
213
|
+
can: timed(inner.can),
|
|
214
|
+
decide: timed(inner.decide),
|
|
215
|
+
assert: timed(inner.assert),
|
|
216
|
+
explain: timed(inner.explain),
|
|
217
|
+
filter: timed(inner.filter),
|
|
218
|
+
pick: timed(inner.pick),
|
|
219
|
+
actions: timed(inner.actions)
|
|
220
|
+
};
|
|
195
221
|
});
|
|
196
222
|
}
|
|
197
223
|
/** Returns an instrumented instance: timed spans and histogram, derived instances included. */
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { s as cliVersion } from "./version-CEbQ5UeM.js";
|
|
2
|
+
import { t as DOCS_BASE } from "./manifest-CtKR3GXL.js";
|
|
3
|
+
//#region src/cli/core/output.ts
|
|
4
|
+
const CLI_RESULT_SCHEMA = "https://permdock.com/schemas/cli-result-v1.json";
|
|
5
|
+
function envelope(input) {
|
|
6
|
+
return {
|
|
7
|
+
$schema: CLI_RESULT_SCHEMA,
|
|
8
|
+
status: input.status,
|
|
9
|
+
...input.data === void 0 ? {} : { data: input.data },
|
|
10
|
+
...input.error === void 0 ? {} : { error: input.error },
|
|
11
|
+
...input.next === void 0 || input.next.length === 0 ? {} : { next: input.next }
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/** A command's JSON report as data; text that is not JSON becomes `{ message }`. */
|
|
15
|
+
function dataOf(output) {
|
|
16
|
+
const text = output.trim();
|
|
17
|
+
if (text === "") return;
|
|
18
|
+
try {
|
|
19
|
+
return JSON.parse(text);
|
|
20
|
+
} catch {
|
|
21
|
+
return { message: text };
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const LOCATION = /^([^\s:]+\.[A-Za-z0-9]+):(\d+)\b/u;
|
|
25
|
+
/**
|
|
26
|
+
* A finding whose `file` and `line` default to the `path:line` a message
|
|
27
|
+
* opens with, the form doctor, usage and scan already print.
|
|
28
|
+
*/
|
|
29
|
+
function findingOf(input) {
|
|
30
|
+
if (input.file !== void 0) return input;
|
|
31
|
+
const match = LOCATION.exec(input.message);
|
|
32
|
+
if (match?.[1] === void 0 || match[2] === void 0) return input;
|
|
33
|
+
return {
|
|
34
|
+
...input,
|
|
35
|
+
file: match[1],
|
|
36
|
+
line: Number(match[2])
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function escapeData(value) {
|
|
40
|
+
return value.replaceAll("%", "%25").replaceAll("\r", "%0D").replaceAll("\n", "%0A");
|
|
41
|
+
}
|
|
42
|
+
function escapeProperty(value) {
|
|
43
|
+
return escapeData(value).replaceAll(":", "%3A").replaceAll(",", "%2C");
|
|
44
|
+
}
|
|
45
|
+
/** GitHub Actions workflow commands, one per finding. */
|
|
46
|
+
function githubAnnotations(findings) {
|
|
47
|
+
return findings.map((finding) => {
|
|
48
|
+
return `::${finding.severity === "error" ? "error" : finding.severity === "warning" ? "warning" : "notice"} ${[
|
|
49
|
+
...finding.file === void 0 ? [] : [`file=${escapeProperty(finding.file)}`],
|
|
50
|
+
...finding.line === void 0 ? [] : [`line=${String(finding.line)}`],
|
|
51
|
+
`title=${escapeProperty(finding.code)}`
|
|
52
|
+
].join(",")}::${escapeData(finding.fix === void 0 ? finding.message : `${finding.message}\nFix: ${finding.fix}`)}`;
|
|
53
|
+
}).join("\n");
|
|
54
|
+
}
|
|
55
|
+
/** A SARIF 2.1.0 log with one run, one rule per finding code. */
|
|
56
|
+
function sarifLog(command, findings) {
|
|
57
|
+
const rules = [...new Set(findings.map((finding) => finding.code))].map((code) => {
|
|
58
|
+
const sample = findings.find((finding) => finding.code === code);
|
|
59
|
+
const rule = { id: code };
|
|
60
|
+
if (sample?.docs !== void 0) rule.helpUri = sample.docs;
|
|
61
|
+
if (sample?.fix !== void 0) rule.help = { text: sample.fix };
|
|
62
|
+
return rule;
|
|
63
|
+
});
|
|
64
|
+
const results = findings.map((finding) => ({
|
|
65
|
+
ruleId: finding.code,
|
|
66
|
+
level: finding.severity === "error" ? "error" : finding.severity === "warning" ? "warning" : "note",
|
|
67
|
+
message: { text: finding.message },
|
|
68
|
+
...finding.file === void 0 ? {} : { locations: [{ physicalLocation: {
|
|
69
|
+
artifactLocation: { uri: finding.file },
|
|
70
|
+
...finding.line === void 0 ? {} : { region: { startLine: finding.line } }
|
|
71
|
+
} }] }
|
|
72
|
+
}));
|
|
73
|
+
return `${JSON.stringify({
|
|
74
|
+
$schema: "https://json.schemastore.org/sarif-2.1.0.json",
|
|
75
|
+
version: "2.1.0",
|
|
76
|
+
runs: [{
|
|
77
|
+
tool: { driver: {
|
|
78
|
+
name: `permdock ${command}`,
|
|
79
|
+
version: cliVersion(),
|
|
80
|
+
informationUri: DOCS_BASE,
|
|
81
|
+
rules
|
|
82
|
+
} },
|
|
83
|
+
results
|
|
84
|
+
}]
|
|
85
|
+
}, null, 2)}\n`;
|
|
86
|
+
}
|
|
87
|
+
//#endregion
|
|
88
|
+
export { sarifLog as a, githubAnnotations as i, envelope as n, findingOf as r, dataOf as t };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { t as SPLIT_PARTS } from "./output-files-DhRBBE4n.js";
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { i as dateAt } from "./time-DkWjdL98.js";
|
|
2
|
+
import { t as shortDiff } from "./text-diff-BQcUapOb.js";
|
|
3
|
+
import { t as applyFiles } from "./files-C5ZI27eV.js";
|
|
4
|
+
import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
5
|
+
import { basename, dirname, resolve } from "node:path";
|
|
6
|
+
/** How `path` on disk differs from `expected`; `undefined` when `same` holds. */
|
|
7
|
+
function fileDrift(path, expected, same = (a, b) => a === b) {
|
|
8
|
+
if (!existsSync(path)) return { kind: "missing" };
|
|
9
|
+
const onDisk = readFileSync(path, "utf8");
|
|
10
|
+
return same(onDisk, expected) ? void 0 : {
|
|
11
|
+
kind: "differs",
|
|
12
|
+
onDisk
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/** `--check`: one entry per file that is missing or differs, naming its part; a differing file carries a short diff. */
|
|
16
|
+
function driftOf(cwd, files) {
|
|
17
|
+
const drift = [];
|
|
18
|
+
for (const file of files) {
|
|
19
|
+
if (file.rel === "-") continue;
|
|
20
|
+
const found = fileDrift(resolve(cwd, file.rel), file.text);
|
|
21
|
+
if (found?.kind === "missing") drift.push(`${file.part}: missing ${file.rel}`);
|
|
22
|
+
else if (found?.kind === "differs") drift.push(`${file.part}: ${file.rel}\n${shortDiff(file.rel, found.onDisk, file.text)}`);
|
|
23
|
+
}
|
|
24
|
+
return drift;
|
|
25
|
+
}
|
|
26
|
+
/** Writes every file but the stdout ones, all or nothing, and returns the stdout text for printing. */
|
|
27
|
+
function writeOutputFiles(cwd, files) {
|
|
28
|
+
const onDisk = files.filter((file) => file.rel !== "-");
|
|
29
|
+
applyFiles(cwd, onDisk.map((file) => ({
|
|
30
|
+
path: file.rel,
|
|
31
|
+
text: file.text
|
|
32
|
+
})));
|
|
33
|
+
return {
|
|
34
|
+
wrote: onDisk.map((file) => file.rel),
|
|
35
|
+
printed: files.filter((file) => file.rel === "-").map((file) => file.text.trimEnd()).join("\n")
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const SPLIT_PARTS = [
|
|
39
|
+
"helpers",
|
|
40
|
+
"seeds",
|
|
41
|
+
"indexes",
|
|
42
|
+
"policies",
|
|
43
|
+
"hook"
|
|
44
|
+
];
|
|
45
|
+
/** `--split helpers,seeds,indexes,policies,hook`: the parts in that fixed order, or an error. */
|
|
46
|
+
function parseSplit(raw) {
|
|
47
|
+
if (raw === void 0) return;
|
|
48
|
+
const names = raw.split(",").map((name) => name.trim()).filter((name) => name !== "");
|
|
49
|
+
if (names.filter((name) => !SPLIT_PARTS.some((part) => part === name)).length > 0 || names.length === 0) return `rls generate --split takes helpers, seeds, indexes, policies and hook, got '${raw}'`;
|
|
50
|
+
return SPLIT_PARTS.filter((part) => names.includes(part));
|
|
51
|
+
}
|
|
52
|
+
/** The path of one split part: `{part}` in `out` replaced by the part name. */
|
|
53
|
+
function partPath(out, part) {
|
|
54
|
+
return out.replaceAll("{part}", part);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* pg-delta's per-schema, unnumbered layout: pg-delta orders statements by
|
|
58
|
+
* their dependencies, so no file needs a number to apply first.
|
|
59
|
+
*/
|
|
60
|
+
function pgDeltaPath(root, part, schema) {
|
|
61
|
+
switch (part) {
|
|
62
|
+
case "helpers":
|
|
63
|
+
case "indexes":
|
|
64
|
+
case "seeds": return `${root}/${schema}/${part}.sql`;
|
|
65
|
+
case "policies": return `${root}/public/policies/permdock.sql`;
|
|
66
|
+
case "hook": return `${root}/${schema}/functions/custom_access_token_hook.sql`;
|
|
67
|
+
default: return part;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/** Whether `--seeds-out` names a migrations directory: it ends with \`/\` or is an existing directory. */
|
|
71
|
+
function isSeedsDirectory(cwd, out) {
|
|
72
|
+
if (out === "-") return false;
|
|
73
|
+
if (out.endsWith("/")) return true;
|
|
74
|
+
const path = resolve(cwd, out);
|
|
75
|
+
return existsSync(path) && statSync(path).isDirectory();
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* A generated data migration at `out`: a file, `-` for stdout, or a
|
|
79
|
+
* migrations directory that gets a new versioned file only when the newest
|
|
80
|
+
* one starting with `marker` differs. With `check`, the planned file is
|
|
81
|
+
* always returned, so drift names it. `reserved` lists the files this run
|
|
82
|
+
* already plans, so two data migrations never share a version.
|
|
83
|
+
*/
|
|
84
|
+
function dataMigrationFile(input) {
|
|
85
|
+
if (!isSeedsDirectory(input.cwd, input.out)) return {
|
|
86
|
+
part: input.part,
|
|
87
|
+
rel: input.out,
|
|
88
|
+
text: input.text
|
|
89
|
+
};
|
|
90
|
+
const planned = seedsMigration(input.cwd, input.out, input.marker, input.text, input.now, input.part, input.reserved);
|
|
91
|
+
return !planned.current || input.check ? {
|
|
92
|
+
part: input.part,
|
|
93
|
+
rel: planned.rel,
|
|
94
|
+
text: input.text
|
|
95
|
+
} : void 0;
|
|
96
|
+
}
|
|
97
|
+
/** `YYYYMMDDHHMMSS` in UTC, the Supabase migration version. */
|
|
98
|
+
function migrationVersion(now) {
|
|
99
|
+
return now.toISOString().replaceAll(/[^0-9]/gu, "").slice(0, 14);
|
|
100
|
+
}
|
|
101
|
+
const VERSION_PREFIX = /^\d{14}(?=_)/u;
|
|
102
|
+
/**
|
|
103
|
+
* The version of a new migration that sorts after every migration in
|
|
104
|
+
* `names`: one second past the newest, so the same directory always gives the
|
|
105
|
+
* same name. Only a directory with no versioned migration falls back to `now`.
|
|
106
|
+
*/
|
|
107
|
+
function nextMigrationVersion(names, now) {
|
|
108
|
+
const times = names.flatMap((name) => {
|
|
109
|
+
const stamp = VERSION_PREFIX.exec(name)?.[0];
|
|
110
|
+
return stamp === void 0 ? [] : [Date.UTC(Number(stamp.slice(0, 4)), Number(stamp.slice(4, 6)) - 1, Number(stamp.slice(6, 8)), Number(stamp.slice(8, 10)), Number(stamp.slice(10, 12)), Number(stamp.slice(12, 14)))];
|
|
111
|
+
});
|
|
112
|
+
return times.length === 0 ? migrationVersion(now) : migrationVersion(dateAt({ epochMilliseconds: Math.max(...times) + 1e3 }));
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* The seeds part in a migrations directory: the newest migration there that
|
|
116
|
+
* starts with \`marker\` when its text is \`text\` already, otherwise a new
|
|
117
|
+
* \`<version>_permdock_seeds.sql\` one second after the newest migration
|
|
118
|
+
* (\`nextMigrationVersion\`), so a regeneration of the same directory names it
|
|
119
|
+
* the same. \`current\` is false when a new one is due. \`label\` replaces
|
|
120
|
+
* \`seeds\` in the file name for the other generated data migrations.
|
|
121
|
+
* \`reserved\` holds paths, relative to \`cwd\`, that this run writes; the ones
|
|
122
|
+
* in \`dir\` count as migrations already there.
|
|
123
|
+
*/
|
|
124
|
+
function seedsMigration(cwd, dir, marker, text, now, label = "seeds", reserved = []) {
|
|
125
|
+
const base = dir.endsWith("/") ? dir.slice(0, -1) : dir;
|
|
126
|
+
const path = resolve(cwd, base);
|
|
127
|
+
const latest = existsSync(path) ? readdirSync(path).filter((name) => name.endsWith(".sql")).toSorted().toReversed().find((name) => readFileSync(resolve(path, name), "utf8").startsWith(marker)) : void 0;
|
|
128
|
+
if (latest !== void 0 && readFileSync(resolve(path, latest), "utf8") === text) return {
|
|
129
|
+
rel: `${base}/${latest}`,
|
|
130
|
+
current: true
|
|
131
|
+
};
|
|
132
|
+
return {
|
|
133
|
+
rel: `${base}/${nextMigrationVersion([...existsSync(path) ? readdirSync(path) : [], ...reserved.filter((rel) => resolve(cwd, dirname(rel)) === path).map((rel) => basename(rel))], now)}_permdock_${label}.sql`,
|
|
134
|
+
current: false
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
//#endregion
|
|
138
|
+
export { isSeedsDirectory as a, parseSplit as c, seedsMigration as d, writeOutputFiles as f, fileDrift as i, partPath as l, dataMigrationFile as n, migrationVersion as o, driftOf as r, nextMigrationVersion as s, SPLIT_PARTS as t, pgDeltaPath as u };
|