permdock 0.0.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +327 -1
- package/dist/a2a/index.d.ts +169 -0
- package/dist/a2a/index.js +232 -0
- package/dist/adapter-context-mlWsVGGg.js +23 -0
- package/dist/ai-sdk/index.d.ts +95 -0
- package/dist/ai-sdk/index.js +154 -0
- package/dist/approval-required-TzNB9oQA.js +6 -0
- package/dist/approvals/index.d.ts +3 -0
- package/dist/approvals/index.js +5 -0
- package/dist/approvals-DbYAuNkG.js +224 -0
- package/dist/approvers-DT4AVyIg.js +52 -0
- package/dist/arazzo-BAgw9ap6.js +70 -0
- package/dist/arazzo-cmvX2jDe.js +54 -0
- package/dist/authzen/index.d.ts +39 -0
- package/dist/authzen/index.js +302 -0
- package/dist/better-auth/index.d.ts +109 -0
- package/dist/better-auth/index.js +344 -0
- package/dist/better-supabase/index.d.ts +206 -0
- package/dist/better-supabase/index.js +620 -0
- package/dist/bind-CVy3Espv.d.ts +25 -0
- package/dist/bind-VnYn2HKq.js +97 -0
- package/dist/boundary-BM8a_P6E.js +13 -0
- package/dist/boundary-BmHxVH1J.d.ts +15 -0
- package/dist/budget-JqcRqyhK.d.ts +11 -0
- package/dist/budget-NbEtbJC_.js +11 -0
- package/dist/canonical-json-DemiK4Vp.js +26 -0
- package/dist/capability-4qPdO9gk.js +173 -0
- package/dist/capability-Dq43tT1u.d.ts +99 -0
- package/dist/catalog/index.d.ts +12 -0
- package/dist/catalog/index.js +2 -0
- package/dist/catalog-BjZSovXQ.js +2 -0
- package/dist/catalog-doc-Dsc9y7sd.js +309 -0
- package/dist/catalog-h2tlKFkq.js +48 -0
- package/dist/catalog-path-CnI0XTFK.js +12 -0
- package/dist/catalog-z8q6bi_r.js +55 -0
- package/dist/claude-agent/index.d.ts +72 -0
- package/dist/claude-agent/index.js +77 -0
- package/dist/clerk/index.d.ts +65 -0
- package/dist/clerk/index.js +301 -0
- package/dist/cli/bin.d.ts +1 -0
- package/dist/cli/bin.js +20 -0
- package/dist/cli/index.d.ts +46 -0
- package/dist/cli/index.js +5 -0
- package/dist/clients-C7zLFuWT.d.ts +12 -0
- package/dist/clients-DjU5ABMy.js +23 -0
- package/dist/cloud/index.d.ts +90 -0
- package/dist/cloud/index.js +404 -0
- package/dist/cloud-BGhHS-lY.js +50 -0
- package/dist/cloud-Bo3e9Ak3.js +118 -0
- package/dist/collect-DDDv_ESs.js +502 -0
- package/dist/collect-DLlujdHC.js +83 -0
- package/dist/collect-rG2IQ3t0.js +2 -0
- package/dist/commands-DWOrSQic.js +97 -0
- package/dist/compact-y6vfu2_f.js +19 -0
- package/dist/compare-pfyVnBjE.js +12 -0
- package/dist/compile/index.d.ts +3 -0
- package/dist/compile/index.js +2 -0
- package/dist/compile-Ba4blROR.js +613 -0
- package/dist/compile-CNnl6uIt.d.ts +94 -0
- package/dist/config-BJiM-xAm.js +157 -0
- package/dist/config-Bn00Z3ks.js +36 -0
- package/dist/config-report-Dw_JcUqT.js +44 -0
- package/dist/connection-CU8MQxRi.js +194 -0
- package/dist/context-Ttp0ekMT.js +82 -0
- package/dist/convex/index.d.ts +45 -0
- package/dist/convex/index.js +65 -0
- package/dist/create-BWyx3jua.d.ts +245 -0
- package/dist/create-CPhDL6qx.js +253 -0
- package/dist/credential-8P81ff4u.js +306 -0
- package/dist/delegation-D8pUEuce.js +103 -0
- package/dist/describe-B_gVZEVi.js +94 -0
- package/dist/describe-PdoqESvg.d.ts +36 -0
- package/dist/diff-B8Tunc3o.js +451 -0
- package/dist/diff-CzqLxZ77.js +48 -0
- package/dist/digest-B3kc_PgQ.d.ts +19 -0
- package/dist/digest-BI-6aa6d.js +27 -0
- package/dist/doctor-WpvG6p4k.js +1194 -0
- package/dist/doctor-collect-ByfYlNv1.js +664 -0
- package/dist/doctor-rOr-4ZfS.js +53 -0
- package/dist/drizzle/index.d.ts +73 -0
- package/dist/drizzle/index.js +160 -0
- package/dist/duration-xK2jGFVc.js +25 -0
- package/dist/elysia/index.d.ts +49 -0
- package/dist/elysia/index.js +59 -0
- package/dist/errors-CWfoNg9N.js +47 -0
- package/dist/errors-Cz5zn0mW.js +123 -0
- package/dist/errors-DAqevpNk.d.ts +125 -0
- package/dist/errors-DRnGZHzF.js +30 -0
- package/dist/evaluation-items-CfCCejQd.js +40 -0
- package/dist/evaluations-tz6D9A2G.js +461 -0
- package/dist/eve/index.d.ts +86 -0
- package/dist/eve/index.js +176 -0
- package/dist/expiry-BoBJ8Tvc.js +7 -0
- package/dist/express/index.d.ts +23 -0
- package/dist/express/index.js +78 -0
- package/dist/fastify/index.d.ts +33 -0
- package/dist/fastify/index.js +92 -0
- package/dist/fields-BMl1RxoX.js +26 -0
- package/dist/files-DWUN9PzI.js +125 -0
- package/dist/fixtures-ht28Cplr.js +67 -0
- package/dist/freeze-CrU8nQeX.js +60 -0
- package/dist/from-snapshot-C3sHpZNS.js +569 -0
- package/dist/generate-CH7ThJ14.js +173 -0
- package/dist/grantee-Cv5Sogfv.js +602 -0
- package/dist/graph-sql-B-dsAT6j.d.ts +29 -0
- package/dist/headers-BZSDieNT.js +6 -0
- package/dist/headers-Cf-zWvsO.d.ts +6 -0
- package/dist/helpers-H_KARDVC.js +421 -0
- package/dist/hono/index.d.ts +48 -0
- package/dist/hono/index.js +99 -0
- package/dist/hosted-DJQw46hn.js +266 -0
- package/dist/http-BIhmLfCc.js +95 -0
- package/dist/http-DPuDaChb.d.ts +13 -0
- package/dist/http-SO7qGttf.js +44 -0
- package/dist/ids-DC4V4CFu.js +18 -0
- package/dist/index-A0YNL8jZ.d.ts +177 -0
- package/dist/index-CtE07CBF.d.ts +6 -0
- package/dist/index-D3vbkoSI.d.ts +483 -0
- package/dist/index-D6_cSa1z.d.ts +201 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.js +26 -0
- package/dist/instance-options-BK_rNOSC.d.ts +11 -0
- package/dist/instance-options-Dhhcnm3y.js +22 -0
- package/dist/json-schema-BsAflUGW.js +106 -0
- package/dist/jwt/index.d.ts +91 -0
- package/dist/jwt/index.js +590 -0
- package/dist/kernel-GSQnMz3O.js +208 -0
- package/dist/kysely/index.d.ts +78 -0
- package/dist/kysely/index.js +129 -0
- package/dist/live-options-H2eG8dfJ.js +60 -0
- package/dist/load-DhWEB9P1.js +75 -0
- package/dist/load-DwJUafYN.js +2 -0
- package/dist/load-jose-BL6LH4bL.js +11 -0
- package/dist/lru-8q4WZjBV.js +28 -0
- package/dist/manifest-iaoBXHKc.js +783 -0
- package/dist/manifest-uDS9y5de.d.ts +206 -0
- package/dist/map-AcxK9o_D.js +147 -0
- package/dist/map-claims-Z4QZOiFF.js +369 -0
- package/dist/map-error-pgUWNNtG.js +23 -0
- package/dist/markers-B0hYLvMD.js +60 -0
- package/dist/may-use-DndQ5tQ-.js +77 -0
- package/dist/mcp/index.d.ts +159 -0
- package/dist/mcp/index.js +603 -0
- package/dist/nest/index.d.ts +75 -0
- package/dist/nest/index.js +261 -0
- package/dist/next/client.d.ts +23 -0
- package/dist/next/client.js +33 -0
- package/dist/next/index.d.ts +93 -0
- package/dist/next/index.js +180 -0
- package/dist/next/plugin.d.ts +14 -0
- package/dist/next/plugin.js +33 -0
- package/dist/node/index.d.ts +24 -0
- package/dist/node/index.js +34 -0
- package/dist/openai/index.d.ts +62 -0
- package/dist/openai/index.js +92 -0
- package/dist/openapi/index.d.ts +176 -0
- package/dist/openapi/index.js +3 -0
- package/dist/openapi-Bbg4wGVL.js +164 -0
- package/dist/openapi-BqRBvAng.js +538 -0
- package/dist/openapi-CqqEbHsL.js +250 -0
- package/dist/openapi-import-cmwetbzw.js +5959 -0
- package/dist/openapi-schema--ARjyfQr.js +6902 -0
- package/dist/orpc/index.d.ts +51 -0
- package/dist/orpc/index.js +145 -0
- package/dist/otel/index.d.ts +13 -0
- package/dist/otel/index.js +202 -0
- package/dist/package-root-zGkxO3oN.js +30 -0
- package/dist/parse-BuyjxhZV.js +53 -0
- package/dist/parse-local-manifest-BkGQNzAh.d.ts +10 -0
- package/dist/parse-local-manifest-BrMozJCo.js +36 -0
- package/dist/pdp/index.d.ts +22 -0
- package/dist/pdp/index.js +682 -0
- package/dist/peer-BOr_kJE1.js +31 -0
- package/dist/permdock-CzqXjCpU.js +3471 -0
- package/dist/permissions-CDgvKG5L.d.ts +52 -0
- package/dist/permissions-CpZrivYv.js +142 -0
- package/dist/permissions-DVoF6dMt.js +662 -0
- package/dist/permissions-DttnqqxC.d.ts +214 -0
- package/dist/pins-8ILTftC9.js +12 -0
- package/dist/policy-CFZAr_Al.d.ts +2252 -0
- package/dist/policy-D8UFyERw.d.ts +20 -0
- package/dist/policy-xyWg7QdR.js +1122 -0
- package/dist/powersync-A8x_Yyvh.js +2 -0
- package/dist/powersync-C7kLglqX.js +540 -0
- package/dist/powersync-yW1UUFzp.js +62 -0
- package/dist/prisma/index.d.ts +136 -0
- package/dist/prisma/index.js +455 -0
- package/dist/problem-B43ztKIm.js +191 -0
- package/dist/problem-details-CkL50EEf.d.ts +7 -0
- package/dist/problem-details-_AMOYz-w.js +144 -0
- package/dist/prompt-CXYhLfsS.js +32 -0
- package/dist/protected-CNsMzrVd.d.ts +27 -0
- package/dist/protected-Cs6kTaHo.js +100 -0
- package/dist/protected-bZs6rbT1.d.ts +40 -0
- package/dist/provider-Cjr62YMV.d.ts +6 -0
- package/dist/provider-DLzpb2Xz.js +52 -0
- package/dist/provider-store-DNyC1y48.js +43 -0
- package/dist/react/index.d.ts +8 -0
- package/dist/react/index.js +7 -0
- package/dist/react/provider-client.d.ts +2 -0
- package/dist/react/provider-client.js +3 -0
- package/dist/react-native/index.d.ts +198 -0
- package/dist/react-native/index.js +696 -0
- package/dist/refs-KYb4ntaz.js +91 -0
- package/dist/relations-cjOL01hZ.js +505 -0
- package/dist/replay-BsOyTrdV.js +28 -0
- package/dist/replay-sqBGMnNs.d.ts +5 -0
- package/dist/resource-ref-CaS9yVPi.js +20 -0
- package/dist/revocations-Bhr0aMIC.js +27 -0
- package/dist/revocations-Cy06JNx2.d.ts +21 -0
- package/dist/rls-BMNydpHk.js +2521 -0
- package/dist/rls-CEvs64Kj.js +238 -0
- package/dist/rls-fields-BMasREhR.js +3502 -0
- package/dist/rls-graph-pc9fuXYm.js +435 -0
- package/dist/rls-import-D8F7j35Q.js +943 -0
- package/dist/rls-migrate-7wikfrVI.js +367 -0
- package/dist/rls-ownership-B5Lkq62W.js +843 -0
- package/dist/rls-shared-aOQ4hGTO.js +493 -0
- package/dist/rls-verify-D8B7dOTh.js +745 -0
- package/dist/row-check-Dt35czLy.d.ts +40 -0
- package/dist/rpc-DOK54_CS.js +89 -0
- package/dist/run-YXCJDNYk.js +174 -0
- package/dist/runtime-CB8gQFvS.js +11 -0
- package/dist/saas-Bj_FFkjN.js +1203 -0
- package/dist/schema-D3MnDMxa.js +300 -0
- package/dist/scim/index.d.ts +2 -0
- package/dist/scim/index.js +2 -0
- package/dist/scim-BFGBBAqR.js +1445 -0
- package/dist/scopes-CVdPrWN-.js +239 -0
- package/dist/server/index.d.ts +134 -0
- package/dist/server/index.js +11 -0
- package/dist/server-DlZ28Oz5.js +268 -0
- package/dist/sha256-BO0swRXL.js +150 -0
- package/dist/shared-DRu8VFVM.js +123 -0
- package/dist/sink-Bd9PSyfq.js +141 -0
- package/dist/sink-Gs6TTVa-.d.ts +104 -0
- package/dist/skills-Biq5uup3.js +192 -0
- package/dist/skills-JaymNCdK.js +56 -0
- package/dist/snapshot-Enxd0n-s.js +975 -0
- package/dist/snapshot-cache-D6jLelln.js +44 -0
- package/dist/snapshot-cache-DwQH8ufx.d.ts +45 -0
- package/dist/solid/index.d.ts +93 -0
- package/dist/solid/index.js +188 -0
- package/dist/sources-B0UvrJ21.js +534 -0
- package/dist/sources-BcJgw0lt.d.ts +192 -0
- package/dist/sql-xdg5f4Fi.js +27 -0
- package/dist/src-CSbUiozF.js +568 -0
- package/dist/ssf/index.d.ts +4 -0
- package/dist/ssf/index.js +596 -0
- package/dist/store-DMAWwAJV.js +371 -0
- package/dist/store-D_pjn91-.d.ts +36 -0
- package/dist/store-options-yO0V6gRn.js +716 -0
- package/dist/stores-4_sqiOA1.js +87 -0
- package/dist/stores-DVR5NHLE.d.ts +52 -0
- package/dist/stream-DDpvynSB.js +66 -0
- package/dist/stream-DlvG2hs-.d.ts +12 -0
- package/dist/style-CTm1AXDT.js +22 -0
- package/dist/subject-C6dLxqHU.js +24 -0
- package/dist/subject-settings-BwBmCdTR.js +128 -0
- package/dist/supabase/index.d.ts +183 -0
- package/dist/supabase/index.js +5 -0
- package/dist/supabase/middleware.d.ts +82 -0
- package/dist/supabase/middleware.js +102 -0
- package/dist/supabase-CwafwxxF.js +83 -0
- package/dist/supabase-DTBaC20O.js +774 -0
- package/dist/supabase-config-Bs44dare.js +472 -0
- package/dist/supabase-hook-BuxLQLpU.js +1814 -0
- package/dist/supabase-hook-D5qVd_D8.js +2 -0
- package/dist/supautils-DYZnzRWV.js +91 -0
- package/dist/svelte/PermissionBoundary.svelte +37 -0
- package/dist/svelte/Protected.svelte +40 -0
- package/dist/svelte/index.d.ts +13 -0
- package/dist/svelte/index.js +107 -0
- package/dist/svelte/runtime.d.ts +7 -0
- package/dist/svelte/runtime.js +4 -0
- package/dist/svelte/source.d.ts +13 -0
- package/dist/svelte/source.js +11 -0
- package/dist/terminal/index.d.ts +163 -0
- package/dist/terminal/index.js +833 -0
- package/dist/testing/index.d.ts +745 -0
- package/dist/testing/index.js +3672 -0
- package/dist/testing/saas/index.d.ts +194 -0
- package/dist/testing/saas/index.js +3 -0
- package/dist/testing/saas/permissions.d.ts +2 -0
- package/dist/testing/saas/permissions.js +2 -0
- package/dist/text-diff-BdkkYSbi.js +15 -0
- package/dist/thenable-okc2xDsj.js +10 -0
- package/dist/timeout-D51niuQP.js +8 -0
- package/dist/token-CIWxJOCh.js +50 -0
- package/dist/trpc/index.d.ts +61 -0
- package/dist/trpc/index.js +122 -0
- package/dist/types-9AWO9EGt.d.ts +197 -0
- package/dist/types-BPxgszlT.d.ts +550 -0
- package/dist/types-BVyImy5I.d.ts +120 -0
- package/dist/types-Bvc4oWT6.d.ts +9 -0
- package/dist/types-C3s9xVJG.d.ts +48 -0
- package/dist/types-Dnemwd77.d.ts +183 -0
- package/dist/types-kxznc7cn.d.ts +52 -0
- package/dist/types-vKyAMtcX.d.ts +157 -0
- package/dist/types-vNSDF7Dq.d.ts +66 -0
- package/dist/types-yF5LmQVD.d.ts +306 -0
- package/dist/unplugin/index.d.ts +7 -0
- package/dist/unplugin/index.js +31 -0
- package/dist/usage-D07N9QJ3.js +42 -0
- package/dist/usage-D82l1CwK.js +2 -0
- package/dist/usage-DG1oeCca.js +693 -0
- package/dist/validation-error-CnjZ4t92.js +33 -0
- package/dist/validation-error-CtF23SrC.d.ts +26 -0
- package/dist/validity-uOp8UpYn.js +245 -0
- package/dist/verifier-BxBo6I44.js +466 -0
- package/dist/version-BvacVTZR.js +17 -0
- package/dist/views-Soe7bGSC.js +95 -0
- package/dist/vocabulary-DA8a8zif.d.ts +56 -0
- package/dist/vue/index.d.ts +79 -0
- package/dist/vue/index.js +196 -0
- package/dist/watch-Etoa_Mvr.js +2 -0
- package/dist/watch-UihESpsJ.js +128 -0
- package/dist/webmcp/index.d.ts +75 -0
- package/dist/webmcp/index.js +307 -0
- package/package.json +450 -5
- package/rulesets/permdock.yaml +29 -0
- package/schemas/approval-request-v1.json +175 -0
- package/schemas/catalog-v1.json +535 -0
- package/schemas/openapi/oas-3.1.json +1298 -0
- package/schemas/openapi/oas-3.2.json +1516 -0
- package/schemas/openapi/overlay-1.1.json +79 -0
- package/schemas/supabase-claims-v1.json +144 -0
- package/schemas/supabase-manifest-v1.json +361 -0
- package/skills/permdock/SKILL.md +66 -0
- package/skills/permdock-agents/SKILL.md +77 -0
- package/skills/permdock-agents/references/runtimes.md +213 -0
- package/skills/permdock-approvals/SKILL.md +80 -0
- package/skills/permdock-approvals/references/stores-and-resume.md +94 -0
- package/skills/permdock-audit/SKILL.md +67 -0
- package/skills/permdock-credentials/SKILL.md +55 -0
- package/skills/permdock-credentials/references/tokens-keys-links.md +132 -0
- package/skills/permdock-data/SKILL.md +57 -0
- package/skills/permdock-data/references/queries-and-rls.md +62 -0
- package/skills/permdock-data/references/relationships.md +67 -0
- package/skills/permdock-tenancy/SKILL.md +80 -0
- package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +89 -0
- package/skills/permdock-wire/SKILL.md +116 -0
- package/skills/permdock-wire/references/adapters.md +492 -0
- package/skills/permdock-wire/references/policy-options.md +45 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
//#region src/supabase/manifest.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* What `permdock supabase inspect --json` prints and `--out` writes to
|
|
4
|
+
* `permdock.manifest.json`: the contract between the generated hook and SQL
|
|
5
|
+
* helpers and a package that writes policies or claims next to them.
|
|
6
|
+
* `version` is the major of this shape; a field is only
|
|
7
|
+
* ever added within it. `schemas/supabase-manifest-v1.json` is its JSON Schema.
|
|
8
|
+
*/
|
|
9
|
+
type SupabaseHookManifest = {
|
|
10
|
+
readonly $schema: "https://permdock.com/schemas/supabase-manifest-v1.json";
|
|
11
|
+
readonly version: 1;
|
|
12
|
+
readonly hook: {
|
|
13
|
+
readonly schema: string;
|
|
14
|
+
readonly function: "custom_access_token_hook";
|
|
15
|
+
readonly out: string;
|
|
16
|
+
readonly before?: readonly string[];
|
|
17
|
+
};
|
|
18
|
+
readonly helpers: {
|
|
19
|
+
readonly schema: string;
|
|
20
|
+
/**
|
|
21
|
+
* `permdock_has` and, per declared scope, `permitted_<scope>_ids`, each
|
|
22
|
+
* `(p_grant text)`, the membership-only `member_<scope>_ids()` and, for a
|
|
23
|
+
* scope with a membership source, `member_<scope>_ids_for(p_user uuid)`.
|
|
24
|
+
*/
|
|
25
|
+
readonly functions: readonly string[];
|
|
26
|
+
};
|
|
27
|
+
readonly tenantClaim: string;
|
|
28
|
+
readonly budget: {
|
|
29
|
+
readonly bytes: number;
|
|
30
|
+
readonly measure: string;
|
|
31
|
+
};
|
|
32
|
+
readonly claims: readonly SupabaseHookClaim[];
|
|
33
|
+
readonly authzVersion: boolean;
|
|
34
|
+
/**
|
|
35
|
+
* With `authzVersion`, the function that bumps the listed users' `authz_ver`,
|
|
36
|
+
* for a membership source outside the hook. It is `security definer` and no
|
|
37
|
+
* client role may execute it: call it from a trigger owned by the table's owner.
|
|
38
|
+
*/
|
|
39
|
+
readonly authzVersionBump?: {
|
|
40
|
+
readonly schema: string;
|
|
41
|
+
readonly function: "permdock_bump_authz_version_for";
|
|
42
|
+
readonly args: "p_users uuid[]";
|
|
43
|
+
};
|
|
44
|
+
/** The `supabase.hook.memberships` sources, in the order the hook reads them. */
|
|
45
|
+
readonly memberships: readonly SupabaseManifestMembership[];
|
|
46
|
+
readonly rls: SupabaseManifestRls;
|
|
47
|
+
/**
|
|
48
|
+
* Every `schema.table.column` a membership or an `attrs` claim is computed
|
|
49
|
+
* from. A client role that can insert or update one can grant itself access.
|
|
50
|
+
*/
|
|
51
|
+
readonly decidingColumns: readonly string[];
|
|
52
|
+
/** The majors of the `-- permdock:hook` and `-- permdock:grants` marker lines. */
|
|
53
|
+
readonly markers: {
|
|
54
|
+
readonly hook: "v1";
|
|
55
|
+
readonly grants: "v1";
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* The `supabase/sdk` capability-matrix feature ids the hook, the helpers and
|
|
59
|
+
* `subjectFromSupabase` depend on, as of the `matrix` release tag. A client
|
|
60
|
+
* SDK that lacks one cannot serve this policy.
|
|
61
|
+
*/
|
|
62
|
+
readonly requires?: SupabaseManifestRequires;
|
|
63
|
+
};
|
|
64
|
+
type SupabaseManifestRequires = {
|
|
65
|
+
/** The capability-matrix release tag, `capability-matrix-v1.<minor>.<patch>`. */
|
|
66
|
+
readonly matrix: string;
|
|
67
|
+
/** Sorted three-segment feature ids, such as `auth.session.get_claims`. */
|
|
68
|
+
readonly capabilities: readonly string[];
|
|
69
|
+
};
|
|
70
|
+
type SupabaseHookClaim = {
|
|
71
|
+
readonly name: string;
|
|
72
|
+
/** `permdock`, or the `<schema>.<function>` of a `supabase.hook.claims` entry. */
|
|
73
|
+
readonly source: string;
|
|
74
|
+
/** Whether the claim counts toward `budget.bytes`. */
|
|
75
|
+
readonly budget: boolean;
|
|
76
|
+
};
|
|
77
|
+
type SupabaseManifestColumn = {
|
|
78
|
+
readonly column: string;
|
|
79
|
+
};
|
|
80
|
+
/** A column of the source table, or a value every row has. */
|
|
81
|
+
type SupabaseManifestValue = SupabaseManifestColumn | {
|
|
82
|
+
readonly value: string | readonly string[];
|
|
83
|
+
};
|
|
84
|
+
/** A column that references another table: the value (role key or user id) is `column` of `table`, matched on `id`. */
|
|
85
|
+
type SupabaseManifestThrough = {
|
|
86
|
+
readonly table: string;
|
|
87
|
+
readonly id: string;
|
|
88
|
+
readonly column: string;
|
|
89
|
+
};
|
|
90
|
+
/** A role column (with `through` when it references a roles table), or the fixed roles every row holds. */
|
|
91
|
+
type SupabaseManifestRole = SupabaseManifestValue | (SupabaseManifestColumn & {
|
|
92
|
+
readonly through: SupabaseManifestThrough;
|
|
93
|
+
});
|
|
94
|
+
/** One `fromTable` or `fromJunction` source. */
|
|
95
|
+
type SupabaseManifestMembership = {
|
|
96
|
+
/** `schema.table`, `public` when the source names no schema. */
|
|
97
|
+
readonly table: string;
|
|
98
|
+
/** The user id column, with `through` when it references the table that holds the user id. */
|
|
99
|
+
readonly user: SupabaseManifestColumn | (SupabaseManifestColumn & {
|
|
100
|
+
readonly through: SupabaseManifestThrough;
|
|
101
|
+
});
|
|
102
|
+
/** A column for `fromTable`, the fixed scope for `fromJunction`. */
|
|
103
|
+
readonly scope: SupabaseManifestValue;
|
|
104
|
+
readonly id: SupabaseManifestColumn;
|
|
105
|
+
/** A role column, the fixed roles every row holds, or several role columns whose keys the row holds together. */
|
|
106
|
+
readonly role: SupabaseManifestRole | readonly SupabaseManifestRole[];
|
|
107
|
+
/** A `jsonb` column of ancestor ids keyed by scope, or one column per ancestor scope. */
|
|
108
|
+
readonly within?: SupabaseManifestColumn | {
|
|
109
|
+
readonly columns: Readonly<Record<string, string>>;
|
|
110
|
+
};
|
|
111
|
+
readonly via?: SupabaseManifestValue;
|
|
112
|
+
readonly expiresAt?: SupabaseManifestColumn;
|
|
113
|
+
readonly disabledAt?: SupabaseManifestColumn;
|
|
114
|
+
/** The columns of `table` that decide the membership. */
|
|
115
|
+
readonly columns: readonly string[];
|
|
116
|
+
};
|
|
117
|
+
type SupabaseManifestHelper = {
|
|
118
|
+
readonly name: string;
|
|
119
|
+
/** The argument list, `p_grant text`, or `''` for none. */
|
|
120
|
+
readonly args: string;
|
|
121
|
+
readonly returns: string;
|
|
122
|
+
/** The roles granted `execute`; a field view `anon` reads adds `anon` to the `authenticated` ones. */
|
|
123
|
+
readonly execute: readonly string[];
|
|
124
|
+
};
|
|
125
|
+
/** A table whose row says whether a user or a scope instance is active (`rls.suspension`); a missing row counts as suspended. */
|
|
126
|
+
type SupabaseManifestActiveRow = {
|
|
127
|
+
/** `schema.table`. */
|
|
128
|
+
readonly table: string;
|
|
129
|
+
/** The column holding the user id or the scope instance id. */
|
|
130
|
+
readonly id: string;
|
|
131
|
+
/** A nullable timestamp column; a row with a value is suspended. */
|
|
132
|
+
readonly disabledAt?: string;
|
|
133
|
+
/** A status column; only a row whose value is in `active` is active. */
|
|
134
|
+
readonly status?: string;
|
|
135
|
+
readonly active?: readonly string[];
|
|
136
|
+
/** A scope only: the permission keys members of a suspended instance still hold. */
|
|
137
|
+
readonly keep?: readonly string[];
|
|
138
|
+
};
|
|
139
|
+
type SupabaseManifestRls = {
|
|
140
|
+
readonly schema: string;
|
|
141
|
+
/** Where the helpers read roles and memberships: the claims (`jwt`) or the tables (`database`). */
|
|
142
|
+
readonly mode: "jwt" | "database";
|
|
143
|
+
readonly tenantClaim: string;
|
|
144
|
+
/** The declared scopes, root first, with the Postgres type of their ids. */
|
|
145
|
+
readonly scopes: readonly {
|
|
146
|
+
readonly name: string;
|
|
147
|
+
readonly type: string;
|
|
148
|
+
readonly within?: string;
|
|
149
|
+
}[];
|
|
150
|
+
/**
|
|
151
|
+
* Every function `rls generate` writes for policies and trusted SQL to
|
|
152
|
+
* call: `permdock_has`, `permitted_<scope>_ids`, `member_<scope>_ids` and
|
|
153
|
+
* `permdock_user_id`, the caller's user id; in `database` mode `permdock_has_for`, `permitted_<scope>_ids_for` and
|
|
154
|
+
* `member_<scope>_ids_for`; and when a role declares `assigns`,
|
|
155
|
+
* `permdock_can_assign`, `permdock_can_assign_any` and, with custom roles,
|
|
156
|
+
* `permdock_can_assign_custom_role`, each with its `_for` form where one
|
|
157
|
+
* is written. A helper whose `execute` is empty is for trusted SQL only.
|
|
158
|
+
*/
|
|
159
|
+
readonly helpers: readonly SupabaseManifestHelper[];
|
|
160
|
+
/**
|
|
161
|
+
* The tables `member_<scope>_ids_for` reads: an `rls.memberships` table
|
|
162
|
+
* mapped for the scope, else `rls.membershipSources`, else the hook's
|
|
163
|
+
* `memberships`.
|
|
164
|
+
*/
|
|
165
|
+
readonly memberships: readonly SupabaseManifestMembership[];
|
|
166
|
+
/** Whether custom roles live in the helpers' tables (`rls.customRoles` in `database` mode). */
|
|
167
|
+
readonly customRoles?: boolean;
|
|
168
|
+
/** The global-roles table the hook and the `database` mode helpers read. */
|
|
169
|
+
readonly roles?: {
|
|
170
|
+
readonly table: string;
|
|
171
|
+
readonly user: SupabaseManifestColumn;
|
|
172
|
+
readonly role: SupabaseManifestRole | readonly SupabaseManifestRole[];
|
|
173
|
+
};
|
|
174
|
+
/** `rls.suspension`: a suspended user, or a suspended scope instance, holds nothing but its scope's `keep`. */
|
|
175
|
+
readonly suspension?: {
|
|
176
|
+
readonly users?: SupabaseManifestActiveRow;
|
|
177
|
+
readonly scopes?: Readonly<Record<string, SupabaseManifestActiveRow>>;
|
|
178
|
+
readonly memberships?: {
|
|
179
|
+
readonly keep: readonly string[];
|
|
180
|
+
};
|
|
181
|
+
};
|
|
182
|
+
/**
|
|
183
|
+
* `rls.assignments`: the tables whose client writes the assignment
|
|
184
|
+
* triggers check against `permdock_can_assign_any`, so SQL writing rows
|
|
185
|
+
* there needs no role-ceiling check of its own.
|
|
186
|
+
*/
|
|
187
|
+
readonly assignments?: {
|
|
188
|
+
readonly tables: readonly string[];
|
|
189
|
+
};
|
|
190
|
+
readonly apiKeys?: {
|
|
191
|
+
readonly claim: string;
|
|
192
|
+
readonly scopes: string;
|
|
193
|
+
readonly tenant: string;
|
|
194
|
+
readonly roles: string;
|
|
195
|
+
readonly serviceRoles: readonly string[];
|
|
196
|
+
};
|
|
197
|
+
};
|
|
198
|
+
/**
|
|
199
|
+
* Reads a `permdock.manifest.json` document (parsed, or the JSON text) and
|
|
200
|
+
* validates it against `schemas/supabase-manifest-v1.json`. Returns a
|
|
201
|
+
* deep-frozen copy built from own keys; throws `PermDockValidationError`
|
|
202
|
+
* with every issue, so a manifest of another major is refused.
|
|
203
|
+
*/
|
|
204
|
+
declare function parseSupabaseManifest(json: unknown): SupabaseHookManifest;
|
|
205
|
+
//#endregion
|
|
206
|
+
export { SupabaseManifestHelper as a, SupabaseManifestRls as c, SupabaseManifestValue as d, parseSupabaseManifest as f, SupabaseManifestColumn as i, SupabaseManifestRole as l, SupabaseHookManifest as n, SupabaseManifestMembership as o, SupabaseManifestActiveRow as r, SupabaseManifestRequires as s, SupabaseHookClaim as t, SupabaseManifestThrough as u };
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { t as compact } from "./compact-y6vfu2_f.js";
|
|
2
|
+
import { t as itemResourceData } from "./evaluation-items-CfCCejQd.js";
|
|
3
|
+
//#region src/authzen/map.ts
|
|
4
|
+
const UNKNOWN = {
|
|
5
|
+
outcome: "denied",
|
|
6
|
+
denials: [{
|
|
7
|
+
role: null,
|
|
8
|
+
reason: "no-grant",
|
|
9
|
+
detail: "unknown-permission"
|
|
10
|
+
}],
|
|
11
|
+
alternatives: []
|
|
12
|
+
};
|
|
13
|
+
const UNAVAILABLE = {
|
|
14
|
+
outcome: "denied",
|
|
15
|
+
denials: [{
|
|
16
|
+
role: null,
|
|
17
|
+
reason: "no-grant",
|
|
18
|
+
detail: "resource-unavailable"
|
|
19
|
+
}],
|
|
20
|
+
alternatives: []
|
|
21
|
+
};
|
|
22
|
+
function isRecord(value) {
|
|
23
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
24
|
+
}
|
|
25
|
+
function actionNameOf(item) {
|
|
26
|
+
if (typeof item.action?.name === "string") return item.action.name;
|
|
27
|
+
if (!isRecord(item.action?.properties)) return;
|
|
28
|
+
const scope = item.action.properties["scope"];
|
|
29
|
+
return typeof scope === "string" ? scope : void 0;
|
|
30
|
+
}
|
|
31
|
+
function permissionOf(lookup, item) {
|
|
32
|
+
return lookup(actionNameOf(item), item.resource);
|
|
33
|
+
}
|
|
34
|
+
function resourceData(item) {
|
|
35
|
+
return itemResourceData(item.resource);
|
|
36
|
+
}
|
|
37
|
+
function resourceIdOf(item) {
|
|
38
|
+
const id = item.resource?.id;
|
|
39
|
+
if (typeof id === "string" || typeof id === "number") return String(id);
|
|
40
|
+
}
|
|
41
|
+
function userFromEntity(entity) {
|
|
42
|
+
if (entity === void 0) return null;
|
|
43
|
+
const result = {};
|
|
44
|
+
if (typeof entity.id === "string" || typeof entity.id === "number") result["id"] = String(entity.id);
|
|
45
|
+
if (isRecord(entity.properties)) for (const [key, value] of Object.entries(entity.properties)) {
|
|
46
|
+
if (key === "actor" || key === "delegation") continue;
|
|
47
|
+
result[key] = value;
|
|
48
|
+
}
|
|
49
|
+
return Object.keys(result).length === 0 ? null : result;
|
|
50
|
+
}
|
|
51
|
+
function actorOf(item) {
|
|
52
|
+
const context = isRecord(item.context) ? item.context : {};
|
|
53
|
+
const fromSubject = isRecord(item.subject?.properties) ? item.subject.properties["actor"] : void 0;
|
|
54
|
+
const raw = context["actor"] ?? fromSubject;
|
|
55
|
+
if (!isRecord(raw) || typeof raw["id"] !== "string") return;
|
|
56
|
+
const kind = typeof raw["kind"] === "string" ? raw["kind"] : "oauth-client";
|
|
57
|
+
return {
|
|
58
|
+
id: raw["id"],
|
|
59
|
+
kind
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
function delegationOf(item) {
|
|
63
|
+
const context = isRecord(item.context) ? item.context : {};
|
|
64
|
+
const fromSubject = isRecord(item.subject?.properties) ? item.subject.properties["delegation"] : void 0;
|
|
65
|
+
const raw = context["delegation"] ?? fromSubject;
|
|
66
|
+
if (!isRecord(raw)) return;
|
|
67
|
+
const scopes = raw["scopes"];
|
|
68
|
+
const authorizationDetails = raw["authorizationDetails"];
|
|
69
|
+
return compact({
|
|
70
|
+
scopes: Array.isArray(scopes) ? scopes.filter((scope) => typeof scope === "string") : void 0,
|
|
71
|
+
authorizationDetails: Array.isArray(authorizationDetails) ? authorizationDetails : void 0
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
function tenantOf(item) {
|
|
75
|
+
if (!isRecord(item.context) || typeof item.context["tenant"] !== "string") return;
|
|
76
|
+
return item.context["tenant"];
|
|
77
|
+
}
|
|
78
|
+
function permdockContext(decision) {
|
|
79
|
+
switch (decision.outcome) {
|
|
80
|
+
case "granted": return { outcome: "granted" };
|
|
81
|
+
case "denied": {
|
|
82
|
+
const unknown = decision.denials.some((denial) => denial.detail === "unknown-permission");
|
|
83
|
+
return compact({
|
|
84
|
+
outcome: "denied",
|
|
85
|
+
denials: decision.denials.map((denial) => ({
|
|
86
|
+
role: denial.role,
|
|
87
|
+
reason: denial.reason
|
|
88
|
+
})),
|
|
89
|
+
reason: unknown ? "unknown-permission" : void 0
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
case "approval-required": return {
|
|
93
|
+
outcome: "approval-required",
|
|
94
|
+
token: decision.token
|
|
95
|
+
};
|
|
96
|
+
default: return decision;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function evaluationContext(decision) {
|
|
100
|
+
return { permdock: permdockContext(decision) };
|
|
101
|
+
}
|
|
102
|
+
function evaluationRow(decision) {
|
|
103
|
+
return {
|
|
104
|
+
decision: decision.outcome === "granted",
|
|
105
|
+
context: evaluationContext(decision)
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
function pathnameOf(request) {
|
|
109
|
+
return new URL(request.url).pathname;
|
|
110
|
+
}
|
|
111
|
+
function endsWithPath(pathname, suffix) {
|
|
112
|
+
return pathname === suffix || pathname.endsWith(suffix);
|
|
113
|
+
}
|
|
114
|
+
function mergeItem(shared, item) {
|
|
115
|
+
if (!isRecord(item)) return shared;
|
|
116
|
+
return compact({
|
|
117
|
+
subject: isRecord(item["subject"]) ? item["subject"] : shared.subject,
|
|
118
|
+
action: isRecord(item["action"]) ? item["action"] : shared.action,
|
|
119
|
+
resource: isRecord(item["resource"]) ? item["resource"] : shared.resource,
|
|
120
|
+
context: item["context"] ?? shared.context
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
function pageOf(body) {
|
|
124
|
+
const page = isRecord(body["page"]) ? body["page"] : {};
|
|
125
|
+
const raw = typeof page["token"] === "string" ? page["token"] : typeof page["next_token"] === "string" ? page["next_token"] : "0";
|
|
126
|
+
const parsed = Math.trunc(Number(raw));
|
|
127
|
+
const sizeRaw = page["limit"] ?? page["size"];
|
|
128
|
+
const size = typeof sizeRaw === "number" && sizeRaw > 0 ? Math.min(sizeRaw, 200) : 50;
|
|
129
|
+
return {
|
|
130
|
+
offset: Number.isFinite(parsed) && parsed > 0 ? parsed : 0,
|
|
131
|
+
size
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
function paged(items, offset, size) {
|
|
135
|
+
const slice = items.slice(offset, offset + size);
|
|
136
|
+
const next = offset + slice.length;
|
|
137
|
+
return {
|
|
138
|
+
results: slice,
|
|
139
|
+
page: {
|
|
140
|
+
next_token: next < items.length ? String(next) : "",
|
|
141
|
+
count: slice.length,
|
|
142
|
+
total: items.length
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
//#endregion
|
|
147
|
+
export { endsWithPath as a, mergeItem as c, pathnameOf as d, permissionOf as f, userFromEntity as g, tenantOf as h, delegationOf as i, pageOf as l, resourceIdOf as m, UNKNOWN as n, evaluationRow as o, resourceData as p, actorOf as r, isRecord as s, UNAVAILABLE as t, paged as u };
|