permdock 0.4.0 → 0.6.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-DCYe60Pi.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-DvSSPQJX.d.ts +57 -0
- package/dist/approvals/index.d.ts +5 -3
- package/dist/approvals/index.js +8 -5
- package/dist/approvals-p1PGoVjb.js +995 -0
- package/dist/arazzo-41WuzHou.js +36 -0
- package/dist/{arazzo-C4BcskbX.js → arazzo-CaUVBn7D.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-DabClFLQ.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-BNM3TtDo.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-kk-uyCwH.js → bind-CAvgUuKs.js} +14 -10
- package/dist/{bind-BzqG8SMb.d.ts → bind-DOyrv6zi.d.ts} +12 -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-Bu_eDqYw.js} +4 -3
- package/dist/{canonical-json-CFKyFOke.js → canonical-json-BC8_nMTw.js} +5 -3
- package/dist/{capability-CksyCWDH.d.ts → capability-Drg-1YhL.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-BoWglDPI.js +1 -0
- package/dist/catalog-DZVbrF-z.js +52 -0
- package/dist/{catalog-tZUyOfOv.js → catalog-HD2gf5mY.js} +51 -6
- package/dist/{catalog-doc-DWtg0gGR.js → catalog-doc-Cdn7-0pQ.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-ytQ3uviA.js +87 -0
- package/dist/codemod-5mpSpnUY.js +37 -0
- package/dist/codemod-ua2hHy7w.js +2084 -0
- package/dist/collect-Ci6akVwH.js +55 -0
- package/dist/collect-D7eQDffE.js +1 -0
- package/dist/{collect-2SrB7lfk.js → collect-mLTY4nwb.js} +75 -11
- 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-CtTP7eur.d.ts → compile-1bsAezL0.d.ts} +5 -3
- package/dist/{compile-CcEu2ZQ1.js → compile-CMqMx_IN.js} +11 -8
- package/dist/completion-BTFrHZhX.js +143 -0
- package/dist/config-Bj2Ixq3d.js +26 -0
- package/dist/{config-BIjREpyE.js → config-bs_kZeYq.js} +12 -7
- package/dist/{config-report--Xb9APJS.js → config-report-DSpsLpCE.js} +15 -5
- package/dist/{connection-DUsczpB5.js → connection-DjhIJSs2.js} +6 -5
- package/dist/{context-DieZVJXu.js → context-B_u3_bDJ.js} +2 -2
- package/dist/convex/index.d.ts +11 -10
- package/dist/convex/index.js +6 -4
- package/dist/create-B30OMUOJ.d.ts +107 -0
- package/dist/create-CBMmFie-.d.ts +138 -0
- package/dist/create-CGm28gyI.js +130 -0
- package/dist/create-CQWIpUG-.js +403 -0
- package/dist/{create-BBO24vj6.js → create-DCF2SvoT.js} +31 -32
- package/dist/create-D_NmPOdH.d.ts +110 -0
- package/dist/{credential-kue0qpbm.js → credential-BcoiejpY.js} +152 -31
- package/dist/credentials-DPyHmYz5.js +74 -0
- package/dist/delegation-j6-rc37o.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-CiFQNuMV.d.ts} +5 -5
- package/dist/{describe-C3ldA9os.d.ts → describe-B5qgDvEW.d.ts} +2 -2
- package/dist/{describe-Cgkp7eP0.js → describe-BybMRY7A.js} +6 -2
- package/dist/device-BARQ8eYG.js +193 -0
- package/dist/{diff-rpqoe7Ag.js → diff-3jbx6Rm4.js} +60 -54
- package/dist/diff-CmuSD3vc.js +37 -0
- package/dist/doctor-3ZqNHX_G.js +44 -0
- package/dist/{doctor-owlv6ddh.js → doctor-BdZw53-k.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-CWTY6uih.js +143 -0
- package/dist/{errors-OD_4c__H.d.ts → errors-DH5QEGXh.d.ts} +2 -2
- package/dist/evaluate-CNClBvcj.js +1785 -0
- package/dist/evaluations-C_1vdSZc.d.ts +32 -0
- package/dist/{evaluations-C9YJsv3H.js → evaluations-beAooV0n.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-DD_gfmrC.js +120 -0
- package/dist/fetch-adapter-Dw0MTS3D.d.ts +31 -0
- package/dist/fields-OYG_JR78.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-CTCMsFZk.js} +55 -52
- package/dist/{grantee-conditions-MQs5NIuX.js → grantee-conditions-CcXf8hMM.js} +4 -3
- package/dist/{grantee-CXY-0C87.js → grantee-hxrUsbpM.js} +16 -6
- package/dist/{grantee-match-fxYp9Nmt.js → grantee-match-DbENBHLB.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-CBYVMjwh.js} +45 -38
- package/dist/hono/index.d.ts +12 -9
- package/dist/hono/index.js +13 -12
- package/dist/hosted-B46-5LYE.js +315 -0
- package/dist/hosted-BPk51-kX.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-wyqXUyjm.js} +190 -53
- package/dist/index-B8YjkEZ4.d.ts +210 -0
- package/dist/index-C-6Letxg.d.ts +431 -0
- package/dist/index-CaxrMD1A.d.ts +1 -0
- package/dist/{index-BwMe94Xq.d.ts → index-Ch8LpNDp.d.ts} +34 -16
- package/dist/index-Cp_ilKi1.d.ts +91 -0
- package/dist/index-CueFnxQc.d.ts +110 -0
- package/dist/index-DuWxc5dt.d.ts +909 -0
- 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-BsVpyGIk.d.ts} +2 -2
- package/dist/instance-snapshot-BOEhcqIF.js +601 -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-D0NVb1cK.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-dvL2XEe1.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-Dr70oA_3.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-CIq4-E9F.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-C4dDTVEd.js +138 -0
- package/dist/{openapi-BJdBmYDG.js → openapi-DD1SV-5-.js} +10 -9
- package/dist/operation-findings-DgATDpvh.js +36 -0
- package/dist/operations-X0VM7F3m.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-1im__-08.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-DqaJNJPn.js} +1045 -153
- 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-DvYUR0QL.d.ts → parse-local-manifest-5ODwqu8b.d.ts} +1 -1
- package/dist/{parse-local-manifest-C-q02Pal.js → parse-local-manifest-CVSs6J9I.js} +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-BrAscV28.js +868 -0
- package/dist/permdock-SV8ZINYT.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-BPxlwVhN.js} +4 -3
- package/dist/{permissions-COH-KRgT.d.ts → permissions-u_KHg-sN.d.ts} +1 -2
- package/dist/policies-DP2nqRoF.js +295 -0
- package/dist/{policy-ur0BBK_e.d.ts → policy-77FSAq_V.d.ts} +2 -2
- package/dist/{hosted-CBHgkzDl.js → policy-DbM5YYtV.js} +17 -273
- package/dist/policy-from-catalog-C2gMa2Dj.js +450 -0
- package/dist/policy-module-CTlwMvLI.js +89 -0
- package/dist/{policy-types-sp9P1iIV.d.ts → policy-types-n0uRTsW8.d.ts} +460 -632
- package/dist/postgrest-CEgRbefE.d.ts +100 -0
- package/dist/postgrest-DAjUkF9w.js +575 -0
- package/dist/{powersync-cZe4kzhL.js → powersync-BkWWCS1K.js} +23 -24
- package/dist/powersync-DISt6SUe.js +62 -0
- package/dist/powersync-MMJ2mI2q.js +1 -0
- 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-B45V5d2b.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-BN7BUdY1.js → protected-BlF0F6wL.js} +21 -4
- package/dist/{protected-B3_P7xuw.d.ts → protected-RFGpakN9.d.ts} +16 -8
- package/dist/{provider-Bi-0HNL3.js → provider-B1al-AZz.js} +2 -2
- package/dist/{provider-kwHC9CZD.d.ts → provider-DILL9oPK.d.ts} +1 -1
- package/dist/{provider-store-Ctt-81Ni.js → provider-store-DM6DNcta.js} +2 -2
- package/dist/pull-CvpINcMK.js +1 -0
- package/dist/pull-jEwbf80J.js +256 -0
- package/dist/push-BD4f15co.js +116 -0
- package/dist/pushed-policy-CqtxkV4G.js +238 -0
- package/dist/pushed-policy-DCW91KQU.d.ts +57 -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 +29 -25
- 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-Bkm-Ne4l.d.ts} +1 -1
- package/dist/{replay-BsOyTrdV.js → replay-Du1tJjG7.js} +2 -1
- package/dist/{request-context-BVM7aWNs.js → request-context-C81Pip9n.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-BAqP4q66.js +336 -0
- package/dist/{rls-BEktUaqg.js → rls-DTvYd-lI.js} +288 -690
- package/dist/{role-builder-B4GbKM-i.js → role-builder-uWQZ4v84.js} +14 -207
- package/dist/{rpc-nYC3cR_u.js → rpc-VSl5ylaQ.js} +7 -7
- package/dist/run-CUKuz0A8.js +723 -0
- package/dist/run-DDwUaJDU.js +1 -0
- package/dist/run-ticket-DocwaTKn.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-BCXRuXca.js} +16 -14
- package/dist/scan-qvOe0hS3.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-C3WXAHZj.js +453 -0
- package/dist/{server-types-DdqBwZN_.d.ts → server-types-CKQiCnON.d.ts} +51 -68
- package/dist/{sha256-BO0swRXL.js → sha256-D9ihqmvd.js} +8 -1
- package/dist/{shared-1uhI-e-b.js → shared-BAK8t4Uo.js} +20 -9
- package/dist/{shared-JhMeOsDF.js → shared-DvvFzYXe.js} +8 -9
- package/dist/signals-D3NcTKUS.js +32 -0
- package/dist/sink-4-eQIRWf.d.ts +225 -0
- package/dist/sink-BEZSlMS_.js +957 -0
- package/dist/{skills-BZdRQkxs.js → skills-B6lVdD_W.js} +13 -6
- package/dist/skills-CTYwkl44.js +51 -0
- package/dist/snapshot-B7DkYg6g.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-PXI-vGpY.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-Xc4zkszI.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-Cu2m75uo.js +1860 -0
- package/dist/ssf/index.d.ts +4 -4
- package/dist/ssf/index.js +384 -47
- package/dist/standard-webhooks-DgFFD-Ga.js +228 -0
- package/dist/standard-webhooks-rbD7LS6h.d.ts +88 -0
- package/dist/storage-C2bWdvJH.js +132 -0
- package/dist/{store-ILkLUj_o.js → store-BDutJkDL.js} +40 -53
- package/dist/{store-options-CbUHDoSe.js → store-options-u0ycEe8s.js} +26 -21
- package/dist/{stores-Cxz_80g-.d.ts → stores-BUGNbJTt.d.ts} +7 -8
- package/dist/{stores-BHXdSbw9.js → stores-CGhM8BN_.js} +2 -2
- package/dist/{stream-Dwsg6WwE.d.ts → stream-CeCMJmBB.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-By_frk3U.js +92 -0
- package/dist/{supabase-hook-Cva3ikXz.js → supabase-hook-BMoEhZir.js} +960 -64
- package/dist/supabase-hook-CCw5m35C.js +1 -0
- package/dist/{supabase-C1TWlnYt.js → supabase-x5JtR2tc.js} +99 -206
- 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-8RnwUAvE.d.ts +107 -0
- package/dist/{store-9KO4BlkB.d.ts → types-B3_ooZgZ.d.ts} +100 -75
- package/dist/{types-Br9IXUBG.d.ts → types-BdtSDbBO.d.ts} +77 -17
- package/dist/types-BtHtcKMr.d.ts +157 -0
- package/dist/{types-CqrjB9o6.d.ts → types-BzzaHxt3.d.ts} +23 -11
- package/dist/types-C791HFu9.d.ts +332 -0
- package/dist/types-C863OQiR.d.ts +57 -0
- package/dist/{types-ByUo56un.d.ts → types-CVZSNocA.d.ts} +23 -22
- package/dist/{types-DHrmBJLH.d.ts → types-CX7AvRqP.d.ts} +7 -7
- package/dist/types-C_IiEs64.d.ts +65 -0
- package/dist/{types-7rJVLWe5.d.ts → types-Dfv0aTER.d.ts} +63 -11
- package/dist/types-DqzsnlSA.js +67 -0
- package/dist/{types-DpWfQdSh.d.ts → types-Druu9wLM.d.ts} +46 -11
- package/dist/{types-CIlTojhq.d.ts → types-_WhUP7ud.d.ts} +9 -6
- package/dist/{types-CUcFZfpU.d.ts → types-lUlG3TVd.d.ts} +2 -1
- package/dist/unplugin/index.d.ts +1 -1
- package/dist/unplugin/index.js +2 -2
- package/dist/usage-CRVl9V3t.js +32 -0
- package/dist/usage-CZpSQP6L.js +1 -0
- package/dist/{usage-CG9nOYZw.js → usage-SveTRTyr.js} +54 -11
- package/dist/{validation-error-BSSw0l_8.d.ts → validation-error-DHUrAkku.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-BaAKx7t6.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-CN8H_9UF.d.ts} +67 -2
- package/dist/vue/index.d.ts +9 -10
- package/dist/vue/index.js +8 -8
- package/dist/waiter-B986w1oK.d.ts +36 -0
- package/dist/waiter-BGUtGYoU.js +67 -0
- package/dist/watch--ovlPOc0.js +1 -0
- package/dist/{watch-zeucB7eF.js → watch-vea54PRw.js} +44 -5
- package/dist/webmcp/index.d.ts +2 -2
- package/dist/webmcp/index.js +3 -3
- package/dist/where-scope-C9vfEphl.js +306 -0
- package/dist/who-can-DWBAcaCQ.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-C5jC6sKI.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 +10 -9
- 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 +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/index-UdVQgq48.d.ts +0 -550
- 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
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { n as isReadonlyArray, r as isRecord, t as compact } from "./compact-CAf557ZB.js";
|
|
2
2
|
import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { i as readAppData } from "./app-data-MuyzVqX8.js";
|
|
4
|
+
import { d as isoNow } from "./time-DkWjdL98.js";
|
|
5
|
+
import { t as canonicalJson } from "./canonical-json-BC8_nMTw.js";
|
|
6
|
+
import { n as sha256, r as sha256Digest } from "./sha256-D9ihqmvd.js";
|
|
7
|
+
import { d as membershipEvent, f as memoryDecisionSink } from "./sink-BEZSlMS_.js";
|
|
8
|
+
import { n as readBodyText, t as MAX_BODY_BYTES } from "./body-text-QcXok_SI.js";
|
|
9
|
+
import { t as readClaim } from "./claims-map-7oQ3ue4X.js";
|
|
5
10
|
//#region src/scim/auth.ts
|
|
6
11
|
function hexToBytes(hex) {
|
|
7
12
|
if (hex.length % 2 !== 0) return;
|
|
@@ -33,9 +38,12 @@ async function matchStaticToken(tenant, token, options) {
|
|
|
33
38
|
}
|
|
34
39
|
return timingSafeEqual(actual, expected);
|
|
35
40
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
41
|
+
/** The tenant a JWT names: `claims.tenant` when set, else `tenant`, then `tid`. */
|
|
42
|
+
function tenantClaim(claims, path) {
|
|
43
|
+
for (const candidate of path === void 0 ? ["tenant", "tid"] : [path]) {
|
|
44
|
+
const value = readClaim(claims, candidate);
|
|
45
|
+
if (typeof value === "string" && value !== "") return value;
|
|
46
|
+
}
|
|
39
47
|
}
|
|
40
48
|
async function authenticateScim(input) {
|
|
41
49
|
const bearer = bearerToken(input.request);
|
|
@@ -58,7 +66,7 @@ async function authenticateScim(input) {
|
|
|
58
66
|
ok: false,
|
|
59
67
|
status: 401
|
|
60
68
|
};
|
|
61
|
-
if (tenantClaim(verified.claims) !== input.tenant) return {
|
|
69
|
+
if (tenantClaim(verified.claims, input.claims?.tenant) !== input.tenant) return {
|
|
62
70
|
ok: false,
|
|
63
71
|
status: 403
|
|
64
72
|
};
|
|
@@ -84,7 +92,10 @@ const GROUP_SCHEMA = "urn:ietf:params:scim:schemas:core:2.0:Group";
|
|
|
84
92
|
const LIST_SCHEMA = "urn:ietf:params:scim:api:messages:2.0:ListResponse";
|
|
85
93
|
const ERROR_SCHEMA = "urn:ietf:params:scim:api:messages:2.0:Error";
|
|
86
94
|
const PATCH_SCHEMA = "urn:ietf:params:scim:api:messages:2.0:PatchOp";
|
|
87
|
-
|
|
95
|
+
/** The RFC 7643 section 3.3 Group extension that carries PermDock roles. */
|
|
96
|
+
const ROLES_EXTENSION = "urn:ietf:params:scim:schemas:extension:permdock:2.0:Group";
|
|
97
|
+
/** The extension that carries the application's own data (`x`) on a User or a Group. */
|
|
98
|
+
const APP_DATA_EXTENSION = "urn:ietf:params:scim:schemas:extension:permdock:2.0:AppData";
|
|
88
99
|
var DirectoryUniquenessError = class extends Error {
|
|
89
100
|
name = "DirectoryUniquenessError";
|
|
90
101
|
code = "uniqueness";
|
|
@@ -99,11 +110,16 @@ var DirectoryNotFoundError = class extends Error {
|
|
|
99
110
|
super(message);
|
|
100
111
|
}
|
|
101
112
|
};
|
|
113
|
+
function isNamedError(error, name, code) {
|
|
114
|
+
return error instanceof Error && error.name === name && Reflect.get(error, "code") === code;
|
|
115
|
+
}
|
|
116
|
+
/** Matches by `name` and `code`, so an error from another copy of the module still maps. */
|
|
102
117
|
function isDirectoryUniquenessError(error) {
|
|
103
|
-
return error
|
|
118
|
+
return isNamedError(error, "DirectoryUniquenessError", "uniqueness");
|
|
104
119
|
}
|
|
120
|
+
/** Matches by `name` and `code`, so an error from another copy of the module still maps. */
|
|
105
121
|
function isDirectoryNotFoundError(error) {
|
|
106
|
-
return error
|
|
122
|
+
return isNamedError(error, "DirectoryNotFoundError", "not-found");
|
|
107
123
|
}
|
|
108
124
|
//#endregion
|
|
109
125
|
//#region src/scim/discovery.ts
|
|
@@ -123,7 +139,7 @@ function serviceProviderConfig() {
|
|
|
123
139
|
},
|
|
124
140
|
changePassword: { supported: false },
|
|
125
141
|
sort: { supported: false },
|
|
126
|
-
etag: { supported:
|
|
142
|
+
etag: { supported: true },
|
|
127
143
|
pagination: {
|
|
128
144
|
cursor: true,
|
|
129
145
|
index: true
|
|
@@ -144,7 +160,10 @@ function resourceTypes() {
|
|
|
144
160
|
name: "User",
|
|
145
161
|
endpoint: "/Users",
|
|
146
162
|
schema: USER_SCHEMA,
|
|
147
|
-
schemaExtensions: [
|
|
163
|
+
schemaExtensions: [{
|
|
164
|
+
schema: APP_DATA_EXTENSION,
|
|
165
|
+
required: false
|
|
166
|
+
}]
|
|
148
167
|
}, {
|
|
149
168
|
schemas: ["urn:ietf:params:scim:schemas:core:2.0:ResourceType"],
|
|
150
169
|
id: "Group",
|
|
@@ -154,6 +173,9 @@ function resourceTypes() {
|
|
|
154
173
|
schemaExtensions: [{
|
|
155
174
|
schema: ROLES_EXTENSION,
|
|
156
175
|
required: false
|
|
176
|
+
}, {
|
|
177
|
+
schema: APP_DATA_EXTENSION,
|
|
178
|
+
required: false
|
|
157
179
|
}]
|
|
158
180
|
}];
|
|
159
181
|
}
|
|
@@ -208,6 +230,12 @@ function schemas() {
|
|
|
208
230
|
id: ROLES_EXTENSION,
|
|
209
231
|
name: "PermDockRoles",
|
|
210
232
|
attributes: [attribute("roles", "string", { multiValued: true })]
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
schemas: [SCHEMA_SCHEMA],
|
|
236
|
+
id: APP_DATA_EXTENSION,
|
|
237
|
+
name: "PermDockAppData",
|
|
238
|
+
attributes: [attribute("x", "complex")]
|
|
211
239
|
}
|
|
212
240
|
];
|
|
213
241
|
}
|
|
@@ -445,10 +473,21 @@ function filterSupported(filter) {
|
|
|
445
473
|
}
|
|
446
474
|
//#endregion
|
|
447
475
|
//#region src/scim/body.ts
|
|
476
|
+
/** The parsed body; `undefined` for an empty or unreadable one. Invalid JSON throws a `SyntaxError`. */
|
|
448
477
|
async function readJson(request) {
|
|
449
|
-
const
|
|
450
|
-
if (
|
|
451
|
-
|
|
478
|
+
const read = await readBodyText(request);
|
|
479
|
+
if (!read.ok) return read.cause === "too-large" ? { tooLarge: true } : {
|
|
480
|
+
tooLarge: false,
|
|
481
|
+
body: void 0
|
|
482
|
+
};
|
|
483
|
+
if (read.text === "") return {
|
|
484
|
+
tooLarge: false,
|
|
485
|
+
body: void 0
|
|
486
|
+
};
|
|
487
|
+
return {
|
|
488
|
+
tooLarge: false,
|
|
489
|
+
body: JSON.parse(read.text)
|
|
490
|
+
};
|
|
452
491
|
}
|
|
453
492
|
function schemasOk(body, required) {
|
|
454
493
|
const listed = body["schemas"];
|
|
@@ -460,6 +499,11 @@ function readRoles(body) {
|
|
|
460
499
|
if (!isRecord(extension) || !Array.isArray(extension["roles"])) return;
|
|
461
500
|
return extension["roles"].filter((item) => typeof item === "string");
|
|
462
501
|
}
|
|
502
|
+
/** `x` from the `AppData` extension; a value that is not a plain JSON object is dropped. */
|
|
503
|
+
function readX(body) {
|
|
504
|
+
const extension = body[APP_DATA_EXTENSION];
|
|
505
|
+
return isRecord(extension) && extension["x"] !== void 0 ? readAppData(void 0, extension["x"]) : void 0;
|
|
506
|
+
}
|
|
463
507
|
function userFromBody(body, id) {
|
|
464
508
|
if (typeof body["userName"] !== "string" || body["userName"] === "") return;
|
|
465
509
|
const emails = Array.isArray(body["emails"]) ? body["emails"].flatMap((item) => {
|
|
@@ -477,6 +521,7 @@ function userFromBody(body, id) {
|
|
|
477
521
|
externalId: typeof body["externalId"] === "string" ? body["externalId"] : void 0,
|
|
478
522
|
active,
|
|
479
523
|
emails,
|
|
524
|
+
x: readX(body),
|
|
480
525
|
meta: {
|
|
481
526
|
created: "",
|
|
482
527
|
lastModified: ""
|
|
@@ -495,6 +540,7 @@ function groupFromBody(body, id, fallbackRoles) {
|
|
|
495
540
|
externalId: typeof body["externalId"] === "string" ? body["externalId"] : void 0,
|
|
496
541
|
members,
|
|
497
542
|
roles: readRoles(body) ?? fallbackRoles,
|
|
543
|
+
x: readX(body),
|
|
498
544
|
meta: {
|
|
499
545
|
created: "",
|
|
500
546
|
lastModified: ""
|
|
@@ -547,7 +593,7 @@ function membershipEventsForGroup(input) {
|
|
|
547
593
|
}
|
|
548
594
|
async function emitDirectory(options, event, userIds, extra = [], known = []) {
|
|
549
595
|
const kind = event.resource.type === "User" && event.active === false ? "session-revoked" : "changed";
|
|
550
|
-
const sink = options.sink ??
|
|
596
|
+
const sink = options.sink ?? memoryDecisionSink();
|
|
551
597
|
try {
|
|
552
598
|
await sink.write([event, ...extra]);
|
|
553
599
|
} catch {}
|
|
@@ -567,7 +613,7 @@ async function principalIds(options, tenant, userIds, known) {
|
|
|
567
613
|
const hit = known.find((user) => user.id === id);
|
|
568
614
|
if (hit !== void 0) return hit;
|
|
569
615
|
try {
|
|
570
|
-
return await options.
|
|
616
|
+
return await options.directory.getUser(tenant, id);
|
|
571
617
|
} catch {
|
|
572
618
|
return null;
|
|
573
619
|
}
|
|
@@ -596,7 +642,7 @@ async function publish(options, kind, tenant, userIds, known) {
|
|
|
596
642
|
function directoryEvent(input) {
|
|
597
643
|
return compact({
|
|
598
644
|
type: "directory",
|
|
599
|
-
at: (
|
|
645
|
+
at: isoNow(),
|
|
600
646
|
source: "scim",
|
|
601
647
|
operation: input.operation,
|
|
602
648
|
tenant: input.tenant,
|
|
@@ -626,7 +672,7 @@ function coerceActive(value) {
|
|
|
626
672
|
}
|
|
627
673
|
}
|
|
628
674
|
function rolesPath(path) {
|
|
629
|
-
return path === "roles" || path === `urn:
|
|
675
|
+
return path === "roles" || path === `urn:ietf:params:scim:schemas:extension:permdock:2.0:Group:roles` || path === `urn:ietf:params:scim:schemas:extension:permdock:2.0:Group.roles`;
|
|
630
676
|
}
|
|
631
677
|
function opName(value) {
|
|
632
678
|
if (typeof value !== "string") return;
|
|
@@ -649,7 +695,7 @@ function normalizePatchOps(ops) {
|
|
|
649
695
|
continue;
|
|
650
696
|
}
|
|
651
697
|
for (const [key, value] of Object.entries(raw["value"])) {
|
|
652
|
-
if (key === "urn:
|
|
698
|
+
if (key === "urn:ietf:params:scim:schemas:extension:permdock:2.0:Group" && isRecord(value)) {
|
|
653
699
|
next.push({
|
|
654
700
|
op,
|
|
655
701
|
path: "roles",
|
|
@@ -736,25 +782,63 @@ function scimResponse(status, body, extra) {
|
|
|
736
782
|
}
|
|
737
783
|
});
|
|
738
784
|
}
|
|
739
|
-
|
|
740
|
-
|
|
785
|
+
/** RFC 7644 section 3.12: `scimType` is defined for `400` and `409` only, so other statuses omit it. */
|
|
786
|
+
function scimError(status, scimType, detail, extra) {
|
|
787
|
+
return scimResponse(status, compact({
|
|
741
788
|
schemas: [ERROR_SCHEMA],
|
|
742
789
|
status: String(status),
|
|
743
|
-
scimType,
|
|
790
|
+
scimType: status === 400 || status === 409 ? scimType : void 0,
|
|
744
791
|
detail
|
|
745
|
-
});
|
|
792
|
+
}), extra);
|
|
746
793
|
}
|
|
747
794
|
function unauthorized() {
|
|
748
|
-
return
|
|
749
|
-
status: 401,
|
|
750
|
-
headers: { "www-authenticate": "Bearer" }
|
|
751
|
-
});
|
|
795
|
+
return scimError(401, "", "authentication required", { "www-authenticate": "Bearer" });
|
|
752
796
|
}
|
|
753
797
|
function forbidden() {
|
|
754
|
-
return
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
798
|
+
return scimError(403, "", "the credential may not provision this tenant", { "www-authenticate": "Bearer error=\"insufficient_scope\"" });
|
|
799
|
+
}
|
|
800
|
+
/**
|
|
801
|
+
* RFC 7644 section 3.14 `meta.version`: a weak entity tag over the
|
|
802
|
+
* resource as rendered, `meta.location` excluded so every URL agrees.
|
|
803
|
+
*/
|
|
804
|
+
function withVersion(resource, meta) {
|
|
805
|
+
const { location: _location, ...stable } = meta;
|
|
806
|
+
const version = `W/"${sha256Digest(canonicalJson({
|
|
807
|
+
...resource,
|
|
808
|
+
meta: stable
|
|
809
|
+
}))}"`;
|
|
810
|
+
return {
|
|
811
|
+
...resource,
|
|
812
|
+
meta: {
|
|
813
|
+
...meta,
|
|
814
|
+
version
|
|
815
|
+
}
|
|
816
|
+
};
|
|
817
|
+
}
|
|
818
|
+
/** The `meta.version` a rendered resource carries, for `ETag`. */
|
|
819
|
+
function versionOf(rendered) {
|
|
820
|
+
const meta = rendered["meta"];
|
|
821
|
+
return isRecord(meta) && typeof meta["version"] === "string" ? meta["version"] : "";
|
|
822
|
+
}
|
|
823
|
+
function entityTags(field) {
|
|
824
|
+
return field.split(",").map((tag) => tag.trim().replace(/^W\//u, "")).filter((tag) => tag !== "");
|
|
825
|
+
}
|
|
826
|
+
/** RFC 9110 section 13.1.1 `If-Match` against a weak `meta.version`: `true` when the request may proceed. */
|
|
827
|
+
function ifMatchHolds(request, version) {
|
|
828
|
+
const field = request.headers.get("if-match");
|
|
829
|
+
if (field === null) return true;
|
|
830
|
+
const tags = entityTags(field);
|
|
831
|
+
return tags.includes("*") || tags.includes(version.replace(/^W\//u, ""));
|
|
832
|
+
}
|
|
833
|
+
/** RFC 9110 section 13.1.2 `If-None-Match`: `true` when the client holds `version`. */
|
|
834
|
+
function ifNoneMatchHolds(request, version) {
|
|
835
|
+
const field = request.headers.get("if-none-match");
|
|
836
|
+
if (field === null) return false;
|
|
837
|
+
const tags = entityTags(field);
|
|
838
|
+
return tags.includes("*") || tags.includes(version.replace(/^W\//u, ""));
|
|
839
|
+
}
|
|
840
|
+
function preconditionFailed() {
|
|
841
|
+
return scimError(412, "", "the resource changed since meta.version");
|
|
758
842
|
}
|
|
759
843
|
function mapStoreError(error) {
|
|
760
844
|
if (isDirectoryUniquenessError(error)) return scimError(409, "uniqueness", error.message);
|
|
@@ -771,37 +855,53 @@ function listBody(result, render) {
|
|
|
771
855
|
Resources: result.Resources.map(render)
|
|
772
856
|
});
|
|
773
857
|
}
|
|
858
|
+
/** The `AppData` extension for `x`, and the schema URN it adds. */
|
|
859
|
+
function appData(x) {
|
|
860
|
+
return x === void 0 ? {
|
|
861
|
+
schemas: [],
|
|
862
|
+
body: {}
|
|
863
|
+
} : {
|
|
864
|
+
schemas: [APP_DATA_EXTENSION],
|
|
865
|
+
body: { [APP_DATA_EXTENSION]: { x } }
|
|
866
|
+
};
|
|
867
|
+
}
|
|
774
868
|
function renderUser(user, location) {
|
|
775
|
-
|
|
776
|
-
|
|
869
|
+
const data = appData(user.x);
|
|
870
|
+
return withVersion(compact({
|
|
871
|
+
schemas: [USER_SCHEMA, ...data.schemas],
|
|
777
872
|
id: user.id,
|
|
778
873
|
externalId: user.externalId,
|
|
779
874
|
userName: user.userName,
|
|
780
875
|
active: user.active,
|
|
781
876
|
emails: user.emails,
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
877
|
+
...data.body
|
|
878
|
+
}), {
|
|
879
|
+
resourceType: "User",
|
|
880
|
+
created: user.meta.created,
|
|
881
|
+
lastModified: user.meta.lastModified,
|
|
882
|
+
location
|
|
788
883
|
});
|
|
789
884
|
}
|
|
790
885
|
function renderGroup(group, location) {
|
|
791
886
|
const extension = group.roles === void 0 ? void 0 : { [ROLES_EXTENSION]: { roles: group.roles } };
|
|
792
|
-
|
|
793
|
-
|
|
887
|
+
const data = appData(group.x);
|
|
888
|
+
return withVersion(compact({
|
|
889
|
+
schemas: [
|
|
890
|
+
GROUP_SCHEMA,
|
|
891
|
+
...group.roles === void 0 ? [] : [ROLES_EXTENSION],
|
|
892
|
+
...data.schemas
|
|
893
|
+
],
|
|
794
894
|
id: group.id,
|
|
795
895
|
externalId: group.externalId,
|
|
796
896
|
displayName: group.displayName,
|
|
797
897
|
members: group.members,
|
|
798
898
|
...extension,
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
899
|
+
...data.body
|
|
900
|
+
}), {
|
|
901
|
+
resourceType: "Group",
|
|
902
|
+
created: group.meta.created,
|
|
903
|
+
lastModified: group.meta.lastModified,
|
|
904
|
+
location
|
|
805
905
|
});
|
|
806
906
|
}
|
|
807
907
|
//#endregion
|
|
@@ -879,6 +979,20 @@ function pageFrom(url) {
|
|
|
879
979
|
}
|
|
880
980
|
//#endregion
|
|
881
981
|
//#region src/scim/handler.ts
|
|
982
|
+
/** One resource with its `meta.version` as the `ETag`. */
|
|
983
|
+
function resourceResponse(status, rendered, location) {
|
|
984
|
+
return scimResponse(status, rendered, compact({
|
|
985
|
+
ETag: versionOf(rendered),
|
|
986
|
+
location
|
|
987
|
+
}));
|
|
988
|
+
}
|
|
989
|
+
function renderedOf(request, resource) {
|
|
990
|
+
return "userName" in resource ? renderUser(resource, locationOf(request, "Users", resource.id)) : renderGroup(resource, locationOf(request, "Groups", resource.id));
|
|
991
|
+
}
|
|
992
|
+
/** `false` when `If-Match` names a version other than `current`'s; a missing resource passes to the store. */
|
|
993
|
+
function matches(request, current) {
|
|
994
|
+
return current === null || ifMatchHolds(request, versionOf(renderedOf(request, current)));
|
|
995
|
+
}
|
|
882
996
|
function scimHandler(options) {
|
|
883
997
|
if (options.token === void 0 && options.verifier === void 0) throw new Error("scimHandler requires token or verifier");
|
|
884
998
|
if (options.verifier !== void 0 && options.audience === void 0) throw new Error("scimHandler requires audience with a verifier");
|
|
@@ -898,7 +1012,8 @@ function scimHandler(options) {
|
|
|
898
1012
|
tenant,
|
|
899
1013
|
audience: options.audience,
|
|
900
1014
|
token: options.token,
|
|
901
|
-
verifier: options.verifier
|
|
1015
|
+
verifier: options.verifier,
|
|
1016
|
+
claims: options.claims
|
|
902
1017
|
}));
|
|
903
1018
|
if (!auth.ok) return auth.status === 403 ? forbidden() : unauthorized();
|
|
904
1019
|
try {
|
|
@@ -912,23 +1027,24 @@ function scimHandler(options) {
|
|
|
912
1027
|
if (rawFilter !== null && rawFilter !== "" && filter === void 0) return scimError(400, "invalidFilter", "unsupported filter");
|
|
913
1028
|
if (filter !== void 0 && !filterSupported(filter)) return scimError(400, "invalidFilter", "unsupported filter");
|
|
914
1029
|
const page = pageFrom(url);
|
|
915
|
-
if (route.kind === "Users") return scimResponse(200, listBody(await options.
|
|
916
|
-
return scimResponse(200, listBody(await options.
|
|
1030
|
+
if (route.kind === "Users") return scimResponse(200, listBody(await options.directory.findUsers(tenant, filter, page), (user) => renderUser(user, locationOf(request, "Users", user.id))));
|
|
1031
|
+
return scimResponse(200, listBody(await options.directory.findGroups(tenant, filter, page), (group) => renderGroup(group, locationOf(request, "Groups", group.id))));
|
|
917
1032
|
}
|
|
918
1033
|
if (request.method === "GET" && route.id !== void 0) {
|
|
919
1034
|
if (route.kind === "Users") {
|
|
920
|
-
const user = await options.
|
|
1035
|
+
const user = await options.directory.getUser(tenant, route.id);
|
|
921
1036
|
if (user === null) return scimError(404, "invalidValue", "resource not found");
|
|
922
|
-
return
|
|
1037
|
+
return readResponse(request, renderedOf(request, user));
|
|
923
1038
|
}
|
|
924
|
-
const group = await options.
|
|
1039
|
+
const group = await options.directory.getGroup(tenant, route.id);
|
|
925
1040
|
if (group === null) return scimError(404, "invalidValue", "resource not found");
|
|
926
|
-
return
|
|
1041
|
+
return readResponse(request, renderedOf(request, group));
|
|
927
1042
|
}
|
|
928
1043
|
if (request.method === "DELETE" && route.id !== void 0) {
|
|
929
1044
|
if (route.kind === "Users") {
|
|
930
|
-
const existing = await options.
|
|
931
|
-
|
|
1045
|
+
const existing = await options.directory.getUser(tenant, route.id);
|
|
1046
|
+
if (!matches(request, existing)) return preconditionFailed();
|
|
1047
|
+
await options.directory.deleteUser(tenant, route.id);
|
|
932
1048
|
await emitDirectory(options, directoryEvent({
|
|
933
1049
|
operation: "delete",
|
|
934
1050
|
tenant,
|
|
@@ -939,8 +1055,9 @@ function scimHandler(options) {
|
|
|
939
1055
|
}), existing === null ? [] : [existing.id], [], existing === null ? [] : [existing]);
|
|
940
1056
|
return new Response(null, { status: 204 });
|
|
941
1057
|
}
|
|
942
|
-
const existing = await options.
|
|
943
|
-
|
|
1058
|
+
const existing = await options.directory.getGroup(tenant, route.id);
|
|
1059
|
+
if (!matches(request, existing)) return preconditionFailed();
|
|
1060
|
+
await options.directory.deleteGroup(tenant, route.id);
|
|
944
1061
|
await emitDirectory(options, directoryEvent({
|
|
945
1062
|
operation: "delete",
|
|
946
1063
|
tenant,
|
|
@@ -956,14 +1073,16 @@ function scimHandler(options) {
|
|
|
956
1073
|
}));
|
|
957
1074
|
return new Response(null, { status: 204 });
|
|
958
1075
|
}
|
|
959
|
-
const
|
|
1076
|
+
const read = await readJson(request);
|
|
1077
|
+
if (read.tooLarge) return scimError(413, "", `request body exceeds ${String(MAX_BODY_BYTES)} bytes`);
|
|
1078
|
+
const { body } = read;
|
|
960
1079
|
if (!isRecord(body)) return scimError(400, "invalidSyntax", "malformed body");
|
|
961
1080
|
if (request.method === "POST" && route.id === void 0) {
|
|
962
1081
|
if (route.kind === "Users") {
|
|
963
1082
|
if (!schemasOk(body, "urn:ietf:params:scim:schemas:core:2.0:User")) return scimError(400, "invalidSyntax", "unsupported schema");
|
|
964
1083
|
const parsed = userFromBody(body, "");
|
|
965
1084
|
if (parsed === void 0) return scimError(400, "invalidValue", "userName is required");
|
|
966
|
-
const stored = await options.
|
|
1085
|
+
const stored = await options.directory.putUser(tenant, parsed);
|
|
967
1086
|
const location = locationOf(request, "Users", stored.id);
|
|
968
1087
|
await emitDirectory(options, directoryEvent({
|
|
969
1088
|
operation: "create",
|
|
@@ -973,13 +1092,13 @@ function scimHandler(options) {
|
|
|
973
1092
|
credential: auth.credential,
|
|
974
1093
|
active: stored.active
|
|
975
1094
|
}), [stored.id]);
|
|
976
|
-
return
|
|
1095
|
+
return resourceResponse(201, renderUser(stored, location), location);
|
|
977
1096
|
}
|
|
978
1097
|
if (!schemasOk(body, "urn:ietf:params:scim:schemas:core:2.0:Group")) return scimError(400, "invalidSyntax", "unsupported schema");
|
|
979
1098
|
const parsed = groupFromBody(body, "", groupRolesFor(options.groupRoles, body["id"]));
|
|
980
1099
|
if (parsed === void 0) return scimError(400, "invalidValue", "displayName is required");
|
|
981
1100
|
reportUnknownRoles(parsed.roles, options);
|
|
982
|
-
const stored = await options.
|
|
1101
|
+
const stored = await options.directory.putGroup(tenant, parsed);
|
|
983
1102
|
const location = locationOf(request, "Groups", stored.id);
|
|
984
1103
|
await emitDirectory(options, directoryEvent({
|
|
985
1104
|
operation: "create",
|
|
@@ -994,15 +1113,17 @@ function scimHandler(options) {
|
|
|
994
1113
|
previous: null,
|
|
995
1114
|
next: stored
|
|
996
1115
|
}));
|
|
997
|
-
return
|
|
1116
|
+
return resourceResponse(201, renderGroup(stored, location), location);
|
|
998
1117
|
}
|
|
999
1118
|
if (request.method === "PUT" && route.id !== void 0) {
|
|
1000
1119
|
if (route.kind === "Users") {
|
|
1001
1120
|
if (!schemasOk(body, "urn:ietf:params:scim:schemas:core:2.0:User")) return scimError(400, "invalidSyntax", "unsupported schema");
|
|
1002
|
-
|
|
1121
|
+
const existing = await options.directory.getUser(tenant, route.id);
|
|
1122
|
+
if (existing === null) return scimError(404, "invalidValue", "resource not found");
|
|
1123
|
+
if (!matches(request, existing)) return preconditionFailed();
|
|
1003
1124
|
const parsed = userFromBody(body, route.id);
|
|
1004
1125
|
if (parsed === void 0) return scimError(400, "invalidValue", "userName is required");
|
|
1005
|
-
const stored = await options.
|
|
1126
|
+
const stored = await options.directory.putUser(tenant, parsed);
|
|
1006
1127
|
const location = locationOf(request, "Users", stored.id);
|
|
1007
1128
|
await emitDirectory(options, directoryEvent({
|
|
1008
1129
|
operation: "replace",
|
|
@@ -1012,15 +1133,16 @@ function scimHandler(options) {
|
|
|
1012
1133
|
credential: auth.credential,
|
|
1013
1134
|
active: stored.active
|
|
1014
1135
|
}), [stored.id]);
|
|
1015
|
-
return
|
|
1136
|
+
return resourceResponse(200, renderUser(stored, location), location);
|
|
1016
1137
|
}
|
|
1017
1138
|
if (!schemasOk(body, "urn:ietf:params:scim:schemas:core:2.0:Group")) return scimError(400, "invalidSyntax", "unsupported schema");
|
|
1018
|
-
const existing = await options.
|
|
1139
|
+
const existing = await options.directory.getGroup(tenant, route.id);
|
|
1019
1140
|
if (existing === null) return scimError(404, "invalidValue", "resource not found");
|
|
1141
|
+
if (!matches(request, existing)) return preconditionFailed();
|
|
1020
1142
|
const parsed = groupFromBody(body, route.id, groupRolesFor(options.groupRoles, route.id));
|
|
1021
1143
|
if (parsed === void 0) return scimError(400, "invalidValue", "displayName is required");
|
|
1022
1144
|
reportUnknownRoles(parsed.roles, options);
|
|
1023
|
-
const stored = await options.
|
|
1145
|
+
const stored = await options.directory.putGroup(tenant, parsed);
|
|
1024
1146
|
const location = locationOf(request, "Groups", stored.id);
|
|
1025
1147
|
await emitDirectory(options, directoryEvent({
|
|
1026
1148
|
operation: "replace",
|
|
@@ -1035,7 +1157,7 @@ function scimHandler(options) {
|
|
|
1035
1157
|
previous: existing,
|
|
1036
1158
|
next: stored
|
|
1037
1159
|
}));
|
|
1038
|
-
return
|
|
1160
|
+
return resourceResponse(200, renderGroup(stored, location), location);
|
|
1039
1161
|
}
|
|
1040
1162
|
if (request.method === "PATCH" && route.id !== void 0) {
|
|
1041
1163
|
const operations = readPatchOperations(body);
|
|
@@ -1043,7 +1165,8 @@ function scimHandler(options) {
|
|
|
1043
1165
|
const normalized = normalizePatchOps(operations);
|
|
1044
1166
|
if (normalized === void 0) return scimError(400, "invalidSyntax", "invalid patch");
|
|
1045
1167
|
if (route.kind === "Users") {
|
|
1046
|
-
|
|
1168
|
+
if (!matches(request, await options.directory.getUser(tenant, route.id))) return preconditionFailed();
|
|
1169
|
+
const stored = await options.directory.patchUser(tenant, route.id, normalized);
|
|
1047
1170
|
const location = locationOf(request, "Users", stored.id);
|
|
1048
1171
|
await emitDirectory(options, directoryEvent({
|
|
1049
1172
|
operation: "patch",
|
|
@@ -1053,10 +1176,11 @@ function scimHandler(options) {
|
|
|
1053
1176
|
credential: auth.credential,
|
|
1054
1177
|
active: stored.active
|
|
1055
1178
|
}), [stored.id]);
|
|
1056
|
-
return
|
|
1179
|
+
return resourceResponse(200, renderUser(stored, location), location);
|
|
1057
1180
|
}
|
|
1058
|
-
const existing = await options.
|
|
1059
|
-
|
|
1181
|
+
const existing = await options.directory.getGroup(tenant, route.id);
|
|
1182
|
+
if (!matches(request, existing)) return preconditionFailed();
|
|
1183
|
+
const stored = await options.directory.patchGroup(tenant, route.id, normalized);
|
|
1060
1184
|
reportUnknownRoles(stored.roles, options);
|
|
1061
1185
|
const location = locationOf(request, "Groups", stored.id);
|
|
1062
1186
|
await emitDirectory(options, directoryEvent({
|
|
@@ -1072,7 +1196,7 @@ function scimHandler(options) {
|
|
|
1072
1196
|
previous: existing,
|
|
1073
1197
|
next: stored
|
|
1074
1198
|
}));
|
|
1075
|
-
return
|
|
1199
|
+
return resourceResponse(200, renderGroup(stored, location), location);
|
|
1076
1200
|
}
|
|
1077
1201
|
return scimError(405, "invalidValue", "method not allowed");
|
|
1078
1202
|
} catch (error) {
|
|
@@ -1081,6 +1205,14 @@ function scimHandler(options) {
|
|
|
1081
1205
|
}
|
|
1082
1206
|
};
|
|
1083
1207
|
}
|
|
1208
|
+
function readResponse(request, rendered) {
|
|
1209
|
+
const version = versionOf(rendered);
|
|
1210
|
+
if (ifNoneMatchHolds(request, version)) return new Response(null, {
|
|
1211
|
+
status: 304,
|
|
1212
|
+
headers: { ETag: version }
|
|
1213
|
+
});
|
|
1214
|
+
return resourceResponse(200, rendered);
|
|
1215
|
+
}
|
|
1084
1216
|
function discoveryResponse(request, route) {
|
|
1085
1217
|
if (route.kind === "ServiceProviderConfig") return scimResponse(200, {
|
|
1086
1218
|
...serviceProviderConfig(),
|
|
@@ -1174,7 +1306,7 @@ function directoryMembershipSource(store, options = {}) {
|
|
|
1174
1306
|
//#region src/scim/store.ts
|
|
1175
1307
|
const DEFAULT_COUNT = 100;
|
|
1176
1308
|
function now() {
|
|
1177
|
-
return (
|
|
1309
|
+
return isoNow();
|
|
1178
1310
|
}
|
|
1179
1311
|
function createdAt(at, ...candidates) {
|
|
1180
1312
|
return candidates.find((value) => value !== void 0 && value !== "") ?? at;
|
|
@@ -1436,4 +1568,4 @@ function memoryDirectoryStore() {
|
|
|
1436
1568
|
};
|
|
1437
1569
|
}
|
|
1438
1570
|
//#endregion
|
|
1439
|
-
export {
|
|
1571
|
+
export { isDirectoryUniquenessError as C, isDirectoryNotFoundError as S, sha256Hex as T, LIST_SCHEMA as _, normalizePatchOps as a, SCIM_CONTENT_TYPE as b, parseScimFilter as c, serviceProviderConfig as d, APP_DATA_EXTENSION as f, GROUP_SCHEMA as g, ERROR_SCHEMA as h, tenantFromPath as i, resourceTypes as l, DirectoryUniquenessError as m, directoryMembershipSource as n, filterSupported as o, DirectoryNotFoundError as p, scimHandler as r, matchFilter as s, memoryDirectoryStore as t, schemas as u, PATCH_SCHEMA as v, authenticateScim as w, USER_SCHEMA as x, ROLES_EXTENSION as y };
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { r as isRecord } from "./compact-CAf557ZB.js";
|
|
2
2
|
import { t as freezeCopy } from "./freeze-CrU8nQeX.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { i as readAppData } from "./app-data-
|
|
3
|
+
import { n as isForbiddenKey } from "./paths-DXSHAMIa.js";
|
|
4
|
+
import { i as idText, n as expirySeconds } from "./expiry-D4_YKRKD.js";
|
|
5
|
+
import { i as readAppData } from "./app-data-MuyzVqX8.js";
|
|
6
6
|
//#region src/core/scopes.ts
|
|
7
7
|
const RESERVED = /* @__PURE__ */ new Set(["global", "resource"]);
|
|
8
8
|
const NAME = /^[a-z][a-z0-9_]*$/u;
|
|
@@ -97,7 +97,8 @@ function tenantOf(membership, scopes) {
|
|
|
97
97
|
const root = rootScope(scopes);
|
|
98
98
|
return root === void 0 ? void 0 : scopeIdOf(membership, root);
|
|
99
99
|
}
|
|
100
|
-
|
|
100
|
+
/** A non-empty string. Unlike `isId` in `./ids.ts` it has no length cap: membership fields come from the app, not the wire. */
|
|
101
|
+
function isNonEmptyString(value) {
|
|
101
102
|
return typeof value === "string" && value !== "";
|
|
102
103
|
}
|
|
103
104
|
function roleList(value) {
|
|
@@ -122,7 +123,11 @@ function normalizeMembership(input, scopes) {
|
|
|
122
123
|
if (x !== void 0) extra.x = freezeCopy(x);
|
|
123
124
|
}
|
|
124
125
|
if (typeof raw["via"] === "string") extra.via = raw["via"];
|
|
125
|
-
if (
|
|
126
|
+
if (raw["expiresAt"] !== void 0 && raw["expiresAt"] !== null) {
|
|
127
|
+
const expiresAt = expirySeconds(raw["expiresAt"]);
|
|
128
|
+
if (expiresAt === void 0) return;
|
|
129
|
+
extra.expiresAt = expiresAt;
|
|
130
|
+
}
|
|
126
131
|
if (typeof raw["grantedBy"] === "string" && raw["grantedBy"] !== "") extra.grantedBy = raw["grantedBy"];
|
|
127
132
|
if (typeof raw["reason"] === "string" && raw["reason"] !== "") extra.reason = raw["reason"];
|
|
128
133
|
const eligible = roleList(raw["eligible"]);
|
|
@@ -136,7 +141,7 @@ function normalizeMembership(input, scopes) {
|
|
|
136
141
|
if (seats.length > 0) extra.entitlements = Object.freeze(seats);
|
|
137
142
|
}
|
|
138
143
|
if (raw["keep"] !== void 0) {
|
|
139
|
-
if (!Array.isArray(raw["keep"]) || !raw["keep"].every(
|
|
144
|
+
if (!Array.isArray(raw["keep"]) || !raw["keep"].every(isNonEmptyString)) return;
|
|
140
145
|
extra.keep = Object.freeze([...raw["keep"]]);
|
|
141
146
|
}
|
|
142
147
|
const named = raw["scope"] !== void 0 || raw["id"] !== void 0;
|
|
@@ -146,7 +151,7 @@ function normalizeMembership(input, scopes) {
|
|
|
146
151
|
if (named || legacy || on === null || typeof on !== "object") return;
|
|
147
152
|
const target = on;
|
|
148
153
|
const targetId = idText(target["id"]);
|
|
149
|
-
if (!
|
|
154
|
+
if (!isNonEmptyString(target["resource"]) || targetId === void 0) return;
|
|
150
155
|
return Object.freeze({
|
|
151
156
|
on: Object.freeze({
|
|
152
157
|
resource: target["resource"],
|