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,214 @@
|
|
|
1
|
+
import { StandardSchemaV1 } from "@standard-schema/spec";
|
|
2
|
+
//#region src/core/permissions.d.ts
|
|
3
|
+
declare const RESOURCE_BRAND: unique symbol;
|
|
4
|
+
/** `definePermissions` options. */
|
|
5
|
+
type DefinePermissionsOptions = {
|
|
6
|
+
/**
|
|
7
|
+
* Keys a permission used to have, mapped to its current key. Old keys are
|
|
8
|
+
* accepted wherever a key arrives as a string (stored custom roles, OAuth
|
|
9
|
+
* scopes, AuthZEN actions, hosted grants, `findPermission`) and resolve to
|
|
10
|
+
* the current leaf; code, decisions and audit only ever see the current key.
|
|
11
|
+
*/
|
|
12
|
+
readonly renamed?: Readonly<Record<string, string>>;
|
|
13
|
+
};
|
|
14
|
+
type ActionMeta = {
|
|
15
|
+
readonly title?: string;
|
|
16
|
+
readonly description?: string;
|
|
17
|
+
readonly tags?: readonly string[];
|
|
18
|
+
readonly readOnly?: boolean;
|
|
19
|
+
/** The action may destroy or overwrite data; only meaningful when not `readOnly`. */
|
|
20
|
+
readonly destructive?: boolean;
|
|
21
|
+
/** Repeating the action with the same input has no further effect. */
|
|
22
|
+
readonly idempotent?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* On a role, or on a permission the subject is granted: whoever holds it may
|
|
25
|
+
* assign the whole custom-role ceiling, not only what they hold themselves.
|
|
26
|
+
*/
|
|
27
|
+
readonly manageRoles?: boolean;
|
|
28
|
+
/** Set by a generator (`permdock openapi import`) to the operation an action was inferred from. */
|
|
29
|
+
readonly inferredFrom?: string;
|
|
30
|
+
/**
|
|
31
|
+
* Data the application owns, such as a risk level or an undo window. Plain
|
|
32
|
+
* JSON; PermDock carries it on the leaf, the catalog and snapshots and
|
|
33
|
+
* never reads it.
|
|
34
|
+
*/
|
|
35
|
+
readonly x?: Readonly<Record<string, MetaValue>>;
|
|
36
|
+
};
|
|
37
|
+
/** A JSON value in `ActionMeta.x`. */
|
|
38
|
+
type MetaValue = string | number | boolean | null | readonly MetaValue[] | {
|
|
39
|
+
readonly [key: string]: MetaValue;
|
|
40
|
+
};
|
|
41
|
+
type PermissionKind = "instance" | "collection";
|
|
42
|
+
type Permission<K extends string = string, T = unknown, Kind extends PermissionKind = PermissionKind> = {
|
|
43
|
+
readonly key: K;
|
|
44
|
+
readonly scope: string;
|
|
45
|
+
readonly resource: string;
|
|
46
|
+
readonly action: string;
|
|
47
|
+
readonly meta: ActionMeta;
|
|
48
|
+
readonly kind: Kind;
|
|
49
|
+
} & ([T] extends [never] ? unknown : unknown);
|
|
50
|
+
type ResourceParent = {
|
|
51
|
+
readonly field: string;
|
|
52
|
+
readonly resource: string;
|
|
53
|
+
};
|
|
54
|
+
/** Relations on the same resource whose holders also hold this one. */
|
|
55
|
+
type RelationIncludes = {
|
|
56
|
+
readonly includes?: readonly string[];
|
|
57
|
+
};
|
|
58
|
+
/** The row's `field` holds the principal id (or, with `memberOf`, a scope id). */
|
|
59
|
+
type FieldRelation = RelationIncludes & {
|
|
60
|
+
readonly field: string;
|
|
61
|
+
/** A declared scope name (or the `tenant` / `team` alias): the field holds that scope's id. */
|
|
62
|
+
readonly memberOf?: string;
|
|
63
|
+
};
|
|
64
|
+
/** Literal values an edge row's columns must hold, so one table backs several relations. */
|
|
65
|
+
type EdgeMatch = Readonly<Record<string, string | number | boolean>>;
|
|
66
|
+
/**
|
|
67
|
+
* One group resource of an edge: the relation whoever the row names must
|
|
68
|
+
* hold on the group, and, when the group's id has its own typed column, that
|
|
69
|
+
* column in place of the edge's `subject`.
|
|
70
|
+
*/
|
|
71
|
+
type EdgeGroup = string | {
|
|
72
|
+
readonly relation: string;
|
|
73
|
+
readonly subject?: string;
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Edge rows that name a group instead of a principal: `column` holds the
|
|
77
|
+
* resource name, `subject` the group's id, and the row holds for whoever
|
|
78
|
+
* holds `resources[<name>]` on that group. A null `column` (or `direct`)
|
|
79
|
+
* names a principal; any other value matches nothing. A group with its own
|
|
80
|
+
* `subject` column reads the group's id from it; without `column`, a row
|
|
81
|
+
* names that group when the column is not null, and a principal when the
|
|
82
|
+
* edge's `subject` is not null.
|
|
83
|
+
*/
|
|
84
|
+
type EdgeGroups = {
|
|
85
|
+
/** Required unless every group names its own `subject` column. */
|
|
86
|
+
readonly column?: string;
|
|
87
|
+
readonly resources: Readonly<Record<string, EdgeGroup>>;
|
|
88
|
+
/** The `column` value of a row naming a principal, besides `null`. */
|
|
89
|
+
readonly direct?: string;
|
|
90
|
+
};
|
|
91
|
+
/** One row per holder in an edge table: `object` holds the resource id, `subject` the principal id. */
|
|
92
|
+
type EdgeRelation = RelationIncludes & {
|
|
93
|
+
readonly edge: string;
|
|
94
|
+
/** Default `<resource>_id`. */
|
|
95
|
+
readonly object?: string;
|
|
96
|
+
/** Default `user_id`. */
|
|
97
|
+
readonly subject?: string;
|
|
98
|
+
/** A timestamp column; an edge whose value has passed does not match. */
|
|
99
|
+
readonly expiresAt?: string;
|
|
100
|
+
readonly match?: EdgeMatch;
|
|
101
|
+
readonly groups?: EdgeGroups;
|
|
102
|
+
};
|
|
103
|
+
/** On a principal resource: the row's `principal` column holds the principal who holds the relation over it. */
|
|
104
|
+
type PrincipalRelation = RelationIncludes & {
|
|
105
|
+
readonly principal: string;
|
|
106
|
+
/** Timestamp columns bounding when the relation holds; `null` leaves that side open. */
|
|
107
|
+
readonly period?: {
|
|
108
|
+
readonly startsAt?: string;
|
|
109
|
+
readonly expiresAt?: string;
|
|
110
|
+
};
|
|
111
|
+
};
|
|
112
|
+
/** Held only through the relations it includes. */
|
|
113
|
+
type ComputedRelation = {
|
|
114
|
+
readonly includes: readonly string[];
|
|
115
|
+
};
|
|
116
|
+
type ResourceRelation = FieldRelation | EdgeRelation | PrincipalRelation | ComputedRelation;
|
|
117
|
+
type ResourceRelationInput = string | ResourceRelation;
|
|
118
|
+
/** A to-one link from a row to another resource's instance, walked by `through: [<link>]`. */
|
|
119
|
+
type ResourceLink = {
|
|
120
|
+
readonly field: string;
|
|
121
|
+
readonly resource: string;
|
|
122
|
+
};
|
|
123
|
+
type ResourceRestricted = {
|
|
124
|
+
readonly field: string;
|
|
125
|
+
readonly stops?: readonly string[];
|
|
126
|
+
};
|
|
127
|
+
type ActionList = readonly string[] | Record<string, ActionMeta>;
|
|
128
|
+
type ResourceOptions<A extends ActionList | undefined = ActionList | undefined, C extends ActionList | undefined = ActionList | undefined> = {
|
|
129
|
+
/**
|
|
130
|
+
* The resource name leaves, tables, relations and AuthZEN types use; the
|
|
131
|
+
* last path segment when absent. Names are unique across a tree.
|
|
132
|
+
*/
|
|
133
|
+
readonly name?: string;
|
|
134
|
+
readonly id?: string;
|
|
135
|
+
readonly actions?: A;
|
|
136
|
+
readonly collection?: C;
|
|
137
|
+
readonly parent?: ResourceParent;
|
|
138
|
+
readonly links?: Readonly<Record<string, ResourceLink>>;
|
|
139
|
+
readonly relations?: Readonly<Record<string, ResourceRelationInput>>;
|
|
140
|
+
/**
|
|
141
|
+
* The row field that changes whenever the row does (`updatedAt`, a revision
|
|
142
|
+
* counter). An `approval: { staleOn: 'resource-change' }` binds to its value.
|
|
143
|
+
*/
|
|
144
|
+
readonly version?: string;
|
|
145
|
+
/**
|
|
146
|
+
* A boolean column: a row where it is `true` is reached only by grants on
|
|
147
|
+
* itself, never by relations held on its ancestors.
|
|
148
|
+
*/
|
|
149
|
+
readonly restricted?: string | ResourceRestricted;
|
|
150
|
+
/**
|
|
151
|
+
* `'hide'`: a denied check on a loaded row answers as if the row did not
|
|
152
|
+
* exist (HTTP `404`), so an id never confirms a row the caller cannot read.
|
|
153
|
+
*/
|
|
154
|
+
readonly disclosure?: "hide" | "reveal";
|
|
155
|
+
/**
|
|
156
|
+
* Named grant levels a custom role may pick per permission, each a row
|
|
157
|
+
* condition (`where` shorthand or a `Condition`), such as `own`, `team` and
|
|
158
|
+
* `all`. A level narrows the ceiling grant it applies to and never widens
|
|
159
|
+
* it; it reaches only instance actions. Names match `^[a-z][a-z0-9_]*$`.
|
|
160
|
+
*/
|
|
161
|
+
readonly levels?: Readonly<Record<string, ResourceLevel>>;
|
|
162
|
+
};
|
|
163
|
+
/** A level's row condition: `where` shorthand or a normalised `Condition`, checked by `definePolicy`. */
|
|
164
|
+
type ResourceLevel = Readonly<Record<string, unknown>>;
|
|
165
|
+
type ResourceInit<T = unknown, A extends ActionList | undefined = ActionList | undefined, C extends ActionList | undefined = ActionList | undefined> = {
|
|
166
|
+
readonly [RESOURCE_BRAND]: true;
|
|
167
|
+
readonly schema: StandardSchemaV1<unknown, T> | undefined;
|
|
168
|
+
readonly options: ResourceOptions<A, C>;
|
|
169
|
+
};
|
|
170
|
+
type ResourceNode<T = unknown> = {
|
|
171
|
+
readonly name: string;
|
|
172
|
+
readonly path: string;
|
|
173
|
+
readonly schema: StandardSchemaV1<unknown, T> | undefined;
|
|
174
|
+
readonly id: string;
|
|
175
|
+
readonly parent: ResourceParent | undefined;
|
|
176
|
+
readonly links: Readonly<Record<string, ResourceLink>>;
|
|
177
|
+
readonly relations: Readonly<Record<string, ResourceRelation>>;
|
|
178
|
+
readonly version: string | undefined;
|
|
179
|
+
readonly restricted: string | undefined;
|
|
180
|
+
readonly restrictedStops?: readonly string[];
|
|
181
|
+
readonly disclosure: "hide" | "reveal";
|
|
182
|
+
readonly instanceActions: ReadonlySet<string>;
|
|
183
|
+
readonly collectionActions: ReadonlySet<string>;
|
|
184
|
+
/** Declared level names to their raw condition; `definePolicy` normalises them. */
|
|
185
|
+
readonly levels?: Readonly<Record<string, ResourceLevel>>;
|
|
186
|
+
};
|
|
187
|
+
type PermissionTree = {
|
|
188
|
+
readonly [key: string]: PermissionTree | Permission;
|
|
189
|
+
};
|
|
190
|
+
type ActionNames<A extends ActionList | undefined> = A extends readonly string[] ? A[number] : A extends Record<string, ActionMeta> ? keyof A & string : never;
|
|
191
|
+
type LeavesFrom<Prefix extends string, Names extends string, T, Kind extends PermissionKind> = [Names] extends [never] ? object : { readonly [K in Names]: Permission<Prefix extends "" ? K : `${Prefix}.${K}`, T, Kind>; };
|
|
192
|
+
type InferResourceLeaves<R extends ResourceInit, Prefix extends string> = R extends ResourceInit<infer T, infer A, infer C> ? LeavesFrom<Prefix, ActionNames<A>, T, "instance"> & LeavesFrom<Prefix, ActionNames<C>, T, "collection"> : object;
|
|
193
|
+
type InferPermissionTree<Input, Prefix extends string = ""> = Input extends ResourceInit ? InferResourceLeaves<Input, Prefix> : Input extends Record<string, unknown> ? { readonly [K in keyof Input & string]: InferPermissionTree<Input[K], Prefix extends "" ? K : `${Prefix}.${K}`>; } : never;
|
|
194
|
+
/**
|
|
195
|
+
* The keys `permission` was renamed from, sorted. Empty for a leaf without
|
|
196
|
+
* renames and for one that crossed a serialisation boundary.
|
|
197
|
+
*/
|
|
198
|
+
declare function formerKeys(permission: object): readonly string[];
|
|
199
|
+
declare function resource<T, const A extends ActionList = readonly [], const C extends ActionList = readonly []>(schema: StandardSchemaV1<unknown, T>, options?: ResourceOptions<A, C>): ResourceInit<T, A, C>;
|
|
200
|
+
declare function resource<const A extends ActionList = readonly [], const C extends ActionList = readonly []>(options: ResourceOptions<A, C>): ResourceInit<unknown, A, C>;
|
|
201
|
+
declare function getResource(tree: PermissionTree, name: string): ResourceNode | undefined;
|
|
202
|
+
declare function definePermissions<const Input>(input: Input, options?: DefinePermissionsOptions): InferPermissionTree<Input>;
|
|
203
|
+
declare function listPermissions(tree: PermissionTree | Permission): readonly Permission[];
|
|
204
|
+
declare function findPermission(tree: PermissionTree, keyOrScope: string): Permission | undefined;
|
|
205
|
+
/**
|
|
206
|
+
* A permission leaf: string `key`, `scope`, `resource` and `action` plus an
|
|
207
|
+
* object `meta`. `kind` is non-enumerable and does not survive
|
|
208
|
+
* `JSON.stringify`, so a leaf that crossed a serialisation boundary passes
|
|
209
|
+
* without it; when present it must be `instance` or `collection`.
|
|
210
|
+
*/
|
|
211
|
+
declare function isPermission(value: unknown): value is Permission;
|
|
212
|
+
declare function mergePermissions<const Trees extends readonly PermissionTree[]>(...trees: Trees): PermissionTree;
|
|
213
|
+
//#endregion
|
|
214
|
+
export { listPermissions as A, ResourceRelationInput as C, formerKeys as D, findPermission as E, resource as M, getResource as O, ResourceRelation as S, definePermissions as T, ResourceLevel as _, EdgeGroup as a, ResourceOptions as b, EdgeRelation as c, MetaValue as d, Permission as f, ResourceInit as g, PrincipalRelation as h, DefinePermissionsOptions as i, mergePermissions as j, isPermission as k, FieldRelation as l, PermissionTree as m, ActionMeta as n, EdgeGroups as o, PermissionKind as p, ComputedRelation as r, EdgeMatch as s, ActionList as t, InferPermissionTree as u, ResourceLink as v, ResourceRestricted as w, ResourceParent as x, ResourceNode as y };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
//#region src/openapi/pins.ts
|
|
2
|
+
const DRAFT_PINS = {
|
|
3
|
+
oas: "3.3-dev@2026-09-01",
|
|
4
|
+
securityProfiles: "oai-discussion-5304@2026-09-01",
|
|
5
|
+
overlay: "1.2-dev@edd4adea"
|
|
6
|
+
};
|
|
7
|
+
const PROFILE_NAMES = { fapi2: "fapi-20-security-profile" };
|
|
8
|
+
/** PermDock's published `supportedParametersSchema` per profile, stable across pins. */
|
|
9
|
+
const PROFILE_PARAMETERS = { fapi2: "https://permdock.com/schemas/security-profiles/fapi2.json" };
|
|
10
|
+
const GNAP_RESERVED = "scheme.type 'gnap' is reserved and emits nothing. See https://permdock.com/docs/standards/watch-list#gnap";
|
|
11
|
+
//#endregion
|
|
12
|
+
export { PROFILE_PARAMETERS as i, GNAP_RESERVED as n, PROFILE_NAMES as r, DRAFT_PINS as t };
|