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,94 @@
|
|
|
1
|
+
import { Ir as Condition, Pr as Subject, br as Scope, mn as WhereResult } from "./policy-CFZAr_Al.js";
|
|
2
|
+
import { y as ResourceNode } from "./permissions-DttnqqxC.js";
|
|
3
|
+
import { r as RelationsMapping, t as GraphSql } from "./graph-sql-B-dsAT6j.js";
|
|
4
|
+
//#region src/conditions/compile.d.ts
|
|
5
|
+
type MembershipTable = {
|
|
6
|
+
readonly table: string;
|
|
7
|
+
readonly user: string;
|
|
8
|
+
readonly role: string;
|
|
9
|
+
/** Per scope name, the column holding that scope's id (the row's own scope and its ancestors). */
|
|
10
|
+
readonly columns?: Readonly<Record<string, string>>;
|
|
11
|
+
/** Column of the first scope's id; shorthand for `columns[<first scope>]`. */
|
|
12
|
+
readonly tenant?: string;
|
|
13
|
+
/** Column of the second scope's id; shorthand for `columns[<second scope>]`. */
|
|
14
|
+
readonly team?: string;
|
|
15
|
+
readonly id?: string;
|
|
16
|
+
/** Column naming the membership's resource, when one table holds several kinds. */
|
|
17
|
+
readonly resource?: string;
|
|
18
|
+
/** Column holding the membership kind (`Membership.via`); roles with `for` need it. */
|
|
19
|
+
readonly via?: string;
|
|
20
|
+
/** Unix seconds, like `Membership.expiresAt`; `null` never expires. */
|
|
21
|
+
readonly expiresAt?: string;
|
|
22
|
+
};
|
|
23
|
+
type MembershipsMapping = {
|
|
24
|
+
/** The membership table of each named scope. */
|
|
25
|
+
readonly scopes?: Readonly<Record<string, MembershipTable>>;
|
|
26
|
+
/** The first scope's table; shorthand for `scopes[<first scope>]`. */
|
|
27
|
+
readonly tenant?: MembershipTable;
|
|
28
|
+
/** The second scope's table; shorthand for `scopes[<second scope>]`. */
|
|
29
|
+
readonly team?: MembershipTable;
|
|
30
|
+
readonly resource?: Readonly<Record<string, MembershipTable>>;
|
|
31
|
+
};
|
|
32
|
+
type CompileWhereOptions = {
|
|
33
|
+
readonly subject?: Subject;
|
|
34
|
+
readonly memberships?: MembershipsMapping;
|
|
35
|
+
readonly now?: number;
|
|
36
|
+
/** The policy's scopes; `where()` results carry them. Defaults to the implicit `tenant` / `team` pair. */
|
|
37
|
+
readonly scopes?: readonly Scope[];
|
|
38
|
+
/** Where the relation graph lives; without it a `related` node is refused. */
|
|
39
|
+
readonly relations?: RelationsMapping;
|
|
40
|
+
/** The policy's resource graph; `where()` results carry it. */
|
|
41
|
+
readonly resources?: ReadonlyMap<string, ResourceNode>;
|
|
42
|
+
};
|
|
43
|
+
type CompiledCompare = {
|
|
44
|
+
readonly kind: "compare";
|
|
45
|
+
readonly op: "eq" | "ne" | "gt" | "gte" | "lt" | "lte" | "contains" | "in" | "notIn";
|
|
46
|
+
readonly field: string;
|
|
47
|
+
readonly value: unknown;
|
|
48
|
+
};
|
|
49
|
+
type CompiledExists = {
|
|
50
|
+
readonly kind: "exists";
|
|
51
|
+
readonly table: string;
|
|
52
|
+
readonly user: string;
|
|
53
|
+
readonly userValue: string;
|
|
54
|
+
readonly role: string;
|
|
55
|
+
/** Empty means any role. */
|
|
56
|
+
readonly roles: readonly string[];
|
|
57
|
+
readonly rowColumn: string;
|
|
58
|
+
readonly rowField: string;
|
|
59
|
+
readonly expiresAt?: string;
|
|
60
|
+
/** Unix seconds the `expiresAt` column is compared against. */
|
|
61
|
+
readonly now: number;
|
|
62
|
+
/** A membership row matches when this column is `null` or equals `tenantValue`. */
|
|
63
|
+
readonly tenantColumn?: string;
|
|
64
|
+
readonly tenantValue?: string;
|
|
65
|
+
readonly resourceColumn?: string;
|
|
66
|
+
readonly resourceValue?: string;
|
|
67
|
+
};
|
|
68
|
+
type CompiledWhere = {
|
|
69
|
+
readonly kind: "never";
|
|
70
|
+
} | {
|
|
71
|
+
readonly kind: "always";
|
|
72
|
+
} | CompiledCompare | {
|
|
73
|
+
readonly kind: "isNull";
|
|
74
|
+
readonly field: string;
|
|
75
|
+
readonly negated: boolean;
|
|
76
|
+
} | {
|
|
77
|
+
readonly kind: "and" | "or";
|
|
78
|
+
readonly items: readonly CompiledWhere[];
|
|
79
|
+
} | {
|
|
80
|
+
readonly kind: "not";
|
|
81
|
+
readonly item: CompiledWhere;
|
|
82
|
+
} | CompiledExists | CompiledSql;
|
|
83
|
+
/** A Postgres boolean over the row that is never NULL: a `related` node's subquery. */
|
|
84
|
+
type CompiledSql = {
|
|
85
|
+
readonly kind: "sql";
|
|
86
|
+
readonly parts: GraphSql;
|
|
87
|
+
/** What a `{ subject: true }` part binds. */
|
|
88
|
+
readonly subject: string;
|
|
89
|
+
};
|
|
90
|
+
/** A `contains` pattern for `LIKE`: `%`, `_` and the escape itself match literally. */
|
|
91
|
+
declare function escapeLike(value: string): string;
|
|
92
|
+
declare function compileWhere(input: Condition | WhereResult, options?: CompileWhereOptions): CompiledWhere;
|
|
93
|
+
//#endregion
|
|
94
|
+
export { CompiledWhere as a, compileWhere as c, CompiledSql as i, escapeLike as l, CompiledCompare as n, MembershipTable as o, CompiledExists as r, MembershipsMapping as s, CompileWhereOptions as t };
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { t as CliError } from "./errors-CWfoNg9N.js";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { relative, resolve } from "node:path";
|
|
4
|
+
//#region src/cli/config-schema.ts
|
|
5
|
+
const SECTIONS = {
|
|
6
|
+
collect: {
|
|
7
|
+
srcPath: true,
|
|
8
|
+
out: true,
|
|
9
|
+
barrel: true
|
|
10
|
+
},
|
|
11
|
+
catalog: { out: true },
|
|
12
|
+
openapi: { doc: true },
|
|
13
|
+
rls: {
|
|
14
|
+
tables: true,
|
|
15
|
+
dialect: true,
|
|
16
|
+
memberships: true,
|
|
17
|
+
membershipSources: true,
|
|
18
|
+
suspension: true,
|
|
19
|
+
functions: true,
|
|
20
|
+
inlineFunctions: true,
|
|
21
|
+
force: true,
|
|
22
|
+
fixtures: true,
|
|
23
|
+
tenantClaim: true,
|
|
24
|
+
tenantType: true,
|
|
25
|
+
teamType: true,
|
|
26
|
+
scopeTypes: true,
|
|
27
|
+
roleClaim: true,
|
|
28
|
+
gucPrefix: true,
|
|
29
|
+
out: true,
|
|
30
|
+
drizzle: true,
|
|
31
|
+
prisma: true,
|
|
32
|
+
schema: true,
|
|
33
|
+
authorize: true,
|
|
34
|
+
policyPerRole: true,
|
|
35
|
+
customRoles: true,
|
|
36
|
+
capabilities: true,
|
|
37
|
+
anonymousSignIns: true,
|
|
38
|
+
fields: true,
|
|
39
|
+
revokeColumns: true,
|
|
40
|
+
policyName: true,
|
|
41
|
+
rbac: true,
|
|
42
|
+
roles: true,
|
|
43
|
+
actions: true,
|
|
44
|
+
helpersOnly: true,
|
|
45
|
+
rowHelpers: true,
|
|
46
|
+
treeValues: true,
|
|
47
|
+
trustedReaders: true,
|
|
48
|
+
migrate: true,
|
|
49
|
+
shims: true,
|
|
50
|
+
tenants: true,
|
|
51
|
+
customRoleWrites: true,
|
|
52
|
+
anonExecute: true,
|
|
53
|
+
assignments: true,
|
|
54
|
+
approvals: true,
|
|
55
|
+
jsonSchema: true,
|
|
56
|
+
ownershipTriggers: true,
|
|
57
|
+
readOnlyActors: true,
|
|
58
|
+
apiKeys: true,
|
|
59
|
+
realtime: true,
|
|
60
|
+
storage: true
|
|
61
|
+
},
|
|
62
|
+
supabase: { hook: true },
|
|
63
|
+
powersync: {
|
|
64
|
+
out: true,
|
|
65
|
+
resources: true,
|
|
66
|
+
action: true,
|
|
67
|
+
manifest: true
|
|
68
|
+
},
|
|
69
|
+
doctor: {
|
|
70
|
+
sensitiveActions: true,
|
|
71
|
+
memberships: true,
|
|
72
|
+
credentials: true,
|
|
73
|
+
clientEntries: true,
|
|
74
|
+
migrations: true,
|
|
75
|
+
claims: true,
|
|
76
|
+
srcPath: true
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
const TOP_LEVEL = /* @__PURE__ */ new Set([
|
|
80
|
+
"permissions",
|
|
81
|
+
"policy",
|
|
82
|
+
...Object.keys(SECTIONS)
|
|
83
|
+
]);
|
|
84
|
+
function isRecord(value) {
|
|
85
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
86
|
+
}
|
|
87
|
+
function isSection(key) {
|
|
88
|
+
return Object.hasOwn(SECTIONS, key);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Checks the shape a command relies on before it reads the config: module
|
|
92
|
+
* paths are strings and each section is an object. A key PermDock does not
|
|
93
|
+
* read is a warning, so a config written for a newer version still loads.
|
|
94
|
+
*/
|
|
95
|
+
function parseConfig(value, file) {
|
|
96
|
+
if (value === void 0) return {
|
|
97
|
+
config: {},
|
|
98
|
+
warnings: []
|
|
99
|
+
};
|
|
100
|
+
if (!isRecord(value)) throw new CliError("usage", `PermDock CLI: ${file} must export a config object as default (use defineConfig)`);
|
|
101
|
+
const warnings = [];
|
|
102
|
+
const unknown = (path, known) => `${file}: unknown key ${path}; PermDock reads ${[...known].join(", ")}`;
|
|
103
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
104
|
+
if (key === "permissions" || key === "policy") {
|
|
105
|
+
if (entry !== void 0 && typeof entry !== "string") throw new CliError("usage", `PermDock CLI: ${file}: ${key} must be a module path string`);
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (!isSection(key)) {
|
|
109
|
+
warnings.push(unknown(key, TOP_LEVEL));
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (entry === void 0) continue;
|
|
113
|
+
if (!isRecord(entry)) throw new CliError("usage", `PermDock CLI: ${file}: ${key} must be an object`);
|
|
114
|
+
const known = SECTIONS[key];
|
|
115
|
+
for (const child of Object.keys(entry)) if (!Object.hasOwn(known, child)) warnings.push(unknown(`${key}.${child}`, Object.keys(known)));
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
config: value,
|
|
119
|
+
warnings
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
//#endregion
|
|
123
|
+
//#region src/cli/config.ts
|
|
124
|
+
const CONFIG_FILES = [
|
|
125
|
+
"permdock.config.ts",
|
|
126
|
+
"permdock.config.mts",
|
|
127
|
+
"permdock.config.js",
|
|
128
|
+
"permdock.config.mjs"
|
|
129
|
+
];
|
|
130
|
+
function defineConfig(config) {
|
|
131
|
+
return config;
|
|
132
|
+
}
|
|
133
|
+
function isConfigFile(name) {
|
|
134
|
+
return CONFIG_FILES.some((file) => file === name);
|
|
135
|
+
}
|
|
136
|
+
async function readConfig(cwd, fromFlag, options) {
|
|
137
|
+
const path = fromFlag ? resolve(cwd, fromFlag) : CONFIG_FILES.map((name) => resolve(cwd, name)).find((file) => existsSync(file));
|
|
138
|
+
if (path === void 0) return {
|
|
139
|
+
config: {},
|
|
140
|
+
warnings: [],
|
|
141
|
+
file: void 0
|
|
142
|
+
};
|
|
143
|
+
if (!existsSync(path)) throw new Error(`PermDock CLI: config file not found: ${path}`);
|
|
144
|
+
const { loadModule, pickNamed } = await import("./load-DwJUafYN.js");
|
|
145
|
+
return {
|
|
146
|
+
...parseConfig(pickNamed(await loadModule(path, options), ["default"]), relative(cwd, path).replaceAll("\\", "/")),
|
|
147
|
+
file: path
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
async function loadConfig(cwd, fromFlag, options) {
|
|
151
|
+
return (await readConfig(cwd, fromFlag, options)).config;
|
|
152
|
+
}
|
|
153
|
+
function resolveCwd(cwd, fallback) {
|
|
154
|
+
return cwd === void 0 ? fallback : resolve(fallback, cwd);
|
|
155
|
+
}
|
|
156
|
+
//#endregion
|
|
157
|
+
export { resolveCwd as a, readConfig as i, isConfigFile as n, loadConfig as r, defineConfig as t };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { i as globalArgs, t as COMMAND_DESCRIPTIONS } from "./commands-DWOrSQic.js";
|
|
2
|
+
import { defineCommand } from "citty";
|
|
3
|
+
//#region src/cli/commands/config.ts
|
|
4
|
+
function config(ctx) {
|
|
5
|
+
return defineCommand({
|
|
6
|
+
meta: {
|
|
7
|
+
name: "config",
|
|
8
|
+
description: COMMAND_DESCRIPTIONS.config
|
|
9
|
+
},
|
|
10
|
+
args: {
|
|
11
|
+
...globalArgs,
|
|
12
|
+
print: {
|
|
13
|
+
type: "boolean",
|
|
14
|
+
description: "Print the effective config as JSON: the file, as written, and each default"
|
|
15
|
+
},
|
|
16
|
+
strict: {
|
|
17
|
+
type: "boolean",
|
|
18
|
+
description: "Exit 1 on warnings"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
async run({ args: parsed }) {
|
|
22
|
+
const { runConfig } = await import("./config-report-Dw_JcUqT.js");
|
|
23
|
+
ctx.report(runConfig({
|
|
24
|
+
cwd: ctx.cwd,
|
|
25
|
+
config: ctx.config,
|
|
26
|
+
file: ctx.configPath,
|
|
27
|
+
warnings: ctx.configWarnings,
|
|
28
|
+
print: parsed.print === true,
|
|
29
|
+
json: ctx.json,
|
|
30
|
+
strict: parsed.strict === true
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
//#endregion
|
|
36
|
+
export { config };
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { n as CONFIG_REPORT_SCHEMA } from "./version-BvacVTZR.js";
|
|
2
|
+
import { t as catalogPath } from "./catalog-path-CnI0XTFK.js";
|
|
3
|
+
import { i as rel, t as defaultSrcPath } from "./files-DWUN9PzI.js";
|
|
4
|
+
import { n as guessPermissions, t as barrelFile } from "./collect-DDDv_ESs.js";
|
|
5
|
+
import "./sources-B0UvrJ21.js";
|
|
6
|
+
import { r as MIGRATION_DIRS } from "./supabase-config-Bs44dare.js";
|
|
7
|
+
import { t as DEFAULT_SENSITIVE_ACTIONS } from "./doctor-collect-ByfYlNv1.js";
|
|
8
|
+
//#region src/cli/config-report.ts
|
|
9
|
+
function configReport(input) {
|
|
10
|
+
const { cwd, config } = input;
|
|
11
|
+
const srcPath = config.collect?.srcPath ?? defaultSrcPath();
|
|
12
|
+
const barrel = config.collect?.barrel;
|
|
13
|
+
return {
|
|
14
|
+
$schema: CONFIG_REPORT_SCHEMA,
|
|
15
|
+
file: input.file === void 0 ? null : rel(cwd, input.file),
|
|
16
|
+
config,
|
|
17
|
+
resolved: {
|
|
18
|
+
permissions: config.permissions ?? guessPermissions(cwd, srcPath) ?? null,
|
|
19
|
+
policy: config.policy ?? null,
|
|
20
|
+
srcPath,
|
|
21
|
+
catalog: rel(cwd, catalogPath(config, cwd)),
|
|
22
|
+
barrel: barrel === void 0 || barrel === false ? false : barrelFile(barrel),
|
|
23
|
+
migrations: config.doctor?.migrations ?? MIGRATION_DIRS,
|
|
24
|
+
sensitiveActions: config.doctor?.sensitiveActions ?? DEFAULT_SENSITIVE_ACTIONS,
|
|
25
|
+
rlsSchema: config.rls?.schema ?? config.rls?.rbac?.schema ?? "permdock"
|
|
26
|
+
},
|
|
27
|
+
warnings: input.warnings
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/** `permdock config`: the config's warnings, or with `--print` or `--json` the effective config. */
|
|
31
|
+
function runConfig(input) {
|
|
32
|
+
const report = configReport(input);
|
|
33
|
+
const code = input.strict && report.warnings.length > 0 ? 1 : 0;
|
|
34
|
+
if (input.print || input.json) return {
|
|
35
|
+
code,
|
|
36
|
+
output: `${JSON.stringify(report, null, 2)}\n`
|
|
37
|
+
};
|
|
38
|
+
return {
|
|
39
|
+
code,
|
|
40
|
+
output: `${[report.file === null ? "no permdock.config file; every option takes its default" : `${report.file}: ${report.warnings.length === 0 ? "ok" : `${String(report.warnings.length)} warning${report.warnings.length === 1 ? "" : "s"}`}`, ...report.warnings.map((warning) => ` warn ${warning}`)].join("\n")}\n`
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//#endregion
|
|
44
|
+
export { runConfig };
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { t as compact } from "./compact-y6vfu2_f.js";
|
|
2
|
+
import { r as PermDockRevokedError } from "./errors-Cz5zn0mW.js";
|
|
3
|
+
//#region src/server/connection.ts
|
|
4
|
+
/** `setTimeout` stores delays in a signed 32-bit integer. */
|
|
5
|
+
const MAX_DELAY = 2147483647;
|
|
6
|
+
const REVOKED = Object.freeze({
|
|
7
|
+
outcome: "denied",
|
|
8
|
+
denials: Object.freeze([Object.freeze({
|
|
9
|
+
role: null,
|
|
10
|
+
reason: "no-grant",
|
|
11
|
+
detail: "connection-revoked"
|
|
12
|
+
})]),
|
|
13
|
+
alternatives: Object.freeze([])
|
|
14
|
+
});
|
|
15
|
+
function principalId(permdock) {
|
|
16
|
+
return permdock.subject.principal?.id;
|
|
17
|
+
}
|
|
18
|
+
function nextMembershipExpiry(permdock, now) {
|
|
19
|
+
let next;
|
|
20
|
+
for (const membership of permdock.memberships()) {
|
|
21
|
+
const at = membership.expiresAt;
|
|
22
|
+
if (at !== void 0 && at > now && (next === void 0 || at < next)) next = at;
|
|
23
|
+
}
|
|
24
|
+
return next;
|
|
25
|
+
}
|
|
26
|
+
async function loadData(data) {
|
|
27
|
+
if (data === void 0) return {
|
|
28
|
+
ok: true,
|
|
29
|
+
value: void 0
|
|
30
|
+
};
|
|
31
|
+
if (typeof data !== "function") return {
|
|
32
|
+
ok: true,
|
|
33
|
+
value: data
|
|
34
|
+
};
|
|
35
|
+
const loaded = await data();
|
|
36
|
+
return loaded === null || loaded === void 0 ? {
|
|
37
|
+
ok: false,
|
|
38
|
+
value: void 0
|
|
39
|
+
} : {
|
|
40
|
+
ok: true,
|
|
41
|
+
value: loaded
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function matches(event, permdock, tenant) {
|
|
45
|
+
if (event.principal !== principalId(permdock)) return false;
|
|
46
|
+
const session = permdock.subject.session;
|
|
47
|
+
if (event.session !== void 0 && session !== void 0 && event.session !== session) return false;
|
|
48
|
+
return !(event.kind === "changed" && event.tenant !== void 0 && tenant !== void 0 && event.tenant !== tenant);
|
|
49
|
+
}
|
|
50
|
+
/** Opens a long-lived connection. Never throws; a failure aborts. */
|
|
51
|
+
async function openConnection(input) {
|
|
52
|
+
const controller = new AbortController();
|
|
53
|
+
const timers = /* @__PURE__ */ new Set();
|
|
54
|
+
const decideOptions = compact({
|
|
55
|
+
source: "adapter",
|
|
56
|
+
adapter: input.adapter
|
|
57
|
+
});
|
|
58
|
+
let unsubscribe;
|
|
59
|
+
let closed = false;
|
|
60
|
+
let current;
|
|
61
|
+
let chain = Promise.resolve();
|
|
62
|
+
const clear = () => {
|
|
63
|
+
for (const timer of timers) clearTimeout(timer);
|
|
64
|
+
timers.clear();
|
|
65
|
+
unsubscribe?.();
|
|
66
|
+
unsubscribe = void 0;
|
|
67
|
+
};
|
|
68
|
+
const abort = (code, decision) => {
|
|
69
|
+
if (controller.signal.aborted) return;
|
|
70
|
+
clear();
|
|
71
|
+
controller.abort(new PermDockRevokedError(compact({
|
|
72
|
+
code,
|
|
73
|
+
permission: input.options.permission?.key,
|
|
74
|
+
decision
|
|
75
|
+
})));
|
|
76
|
+
};
|
|
77
|
+
const after = (ms, run) => {
|
|
78
|
+
const timer = setTimeout(() => {
|
|
79
|
+
timers.delete(timer);
|
|
80
|
+
run();
|
|
81
|
+
}, Math.max(0, Math.min(ms, MAX_DELAY)));
|
|
82
|
+
timers.add(timer);
|
|
83
|
+
};
|
|
84
|
+
/** `true` when `permdock` still holds the opening permission. */
|
|
85
|
+
const admits = async (permdock) => {
|
|
86
|
+
const { permission } = input.options;
|
|
87
|
+
if (permission === void 0) return true;
|
|
88
|
+
const loaded = await loadData(input.options.data);
|
|
89
|
+
if (!loaded.ok) {
|
|
90
|
+
abort("denied");
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
const decision = permdock.decide(permission, loaded.value, decideOptions);
|
|
94
|
+
if (decision.outcome !== "granted") {
|
|
95
|
+
abort("denied", decision);
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
return true;
|
|
99
|
+
};
|
|
100
|
+
let schedule;
|
|
101
|
+
const revalidate = () => {
|
|
102
|
+
chain = chain.then(async () => {
|
|
103
|
+
if (controller.signal.aborted || closed) return;
|
|
104
|
+
let next;
|
|
105
|
+
try {
|
|
106
|
+
next = await input.rebuild();
|
|
107
|
+
} catch {
|
|
108
|
+
abort("subject-changed");
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const id = principalId(next);
|
|
112
|
+
if (id === void 0 || current === void 0 || id !== principalId(current)) {
|
|
113
|
+
abort("subject-changed");
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (!await admits(next)) return;
|
|
117
|
+
current = next;
|
|
118
|
+
for (const timer of timers) clearTimeout(timer);
|
|
119
|
+
timers.clear();
|
|
120
|
+
schedule?.(next);
|
|
121
|
+
}).catch(() => {
|
|
122
|
+
abort("subject-changed");
|
|
123
|
+
});
|
|
124
|
+
};
|
|
125
|
+
schedule = (permdock) => {
|
|
126
|
+
const now = Date.now() / 1e3;
|
|
127
|
+
const expiresAt = permdock.subject.expiresAt;
|
|
128
|
+
if (expiresAt !== void 0) {
|
|
129
|
+
if (expiresAt <= now) {
|
|
130
|
+
abort("expired");
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
const wait = (expiresAt - now) * 1e3;
|
|
134
|
+
after(wait, () => {
|
|
135
|
+
if (wait > MAX_DELAY) {
|
|
136
|
+
schedule?.(current ?? permdock);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
abort("expired");
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
const membership = nextMembershipExpiry(permdock, now);
|
|
143
|
+
if (membership !== void 0) after((membership - now) * 1e3, revalidate);
|
|
144
|
+
const every = input.options.revalidate;
|
|
145
|
+
if (every !== void 0 && Number.isFinite(every) && every > 0) after(every, revalidate);
|
|
146
|
+
};
|
|
147
|
+
try {
|
|
148
|
+
current = await input.open();
|
|
149
|
+
} catch {
|
|
150
|
+
abort("denied");
|
|
151
|
+
}
|
|
152
|
+
if (current !== void 0 && !controller.signal.aborted && await admits(current)) {
|
|
153
|
+
schedule(current);
|
|
154
|
+
if (input.feed !== void 0 && !controller.signal.aborted) try {
|
|
155
|
+
unsubscribe = input.feed.subscribe((event) => {
|
|
156
|
+
if (current === void 0 || !matches(event, current, input.tenant)) return;
|
|
157
|
+
if (event.kind === "session-revoked") abort("session-revoked");
|
|
158
|
+
else revalidate();
|
|
159
|
+
});
|
|
160
|
+
} catch {
|
|
161
|
+
abort("expired");
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
const live = () => controller.signal.aborted || closed ? void 0 : current;
|
|
165
|
+
return Object.freeze({
|
|
166
|
+
get permdock() {
|
|
167
|
+
if (current === void 0) throw new PermDockRevokedError({ code: "denied" });
|
|
168
|
+
return current;
|
|
169
|
+
},
|
|
170
|
+
signal: controller.signal,
|
|
171
|
+
check(permission, data, checkOptions) {
|
|
172
|
+
const permdock = live();
|
|
173
|
+
if (permdock === void 0) return REVOKED;
|
|
174
|
+
return permdock.decide(permission, data, checkOptions?.trusted === true ? {
|
|
175
|
+
...decideOptions,
|
|
176
|
+
trusted: true
|
|
177
|
+
} : {
|
|
178
|
+
...decideOptions,
|
|
179
|
+
trusted: false,
|
|
180
|
+
boundary: "manual"
|
|
181
|
+
});
|
|
182
|
+
},
|
|
183
|
+
filter(permission, items) {
|
|
184
|
+
const permdock = live();
|
|
185
|
+
return permdock === void 0 ? [] : permdock.filter(permission, items, decideOptions);
|
|
186
|
+
},
|
|
187
|
+
close() {
|
|
188
|
+
closed = true;
|
|
189
|
+
clear();
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
//#endregion
|
|
194
|
+
export { openConnection };
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { t as compact } from "./compact-y6vfu2_f.js";
|
|
2
|
+
import { i as isPromiseLike } from "./store-options-yO0V6gRn.js";
|
|
3
|
+
import { n as switchTenant, t as providerStore } from "./provider-store-DNyC1y48.js";
|
|
4
|
+
import { getContext, onDestroy, setContext } from "svelte";
|
|
5
|
+
import { toStore } from "svelte/store";
|
|
6
|
+
//#region src/svelte/context.ts
|
|
7
|
+
const permDockKey = Symbol("permdock");
|
|
8
|
+
function isReadable(value) {
|
|
9
|
+
return typeof value === "object" && value !== null && "subscribe" in value && typeof value.subscribe === "function";
|
|
10
|
+
}
|
|
11
|
+
function reactiveSource(source) {
|
|
12
|
+
if (typeof source === "function") return toStore(source);
|
|
13
|
+
return isReadable(source) ? source : void 0;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Builds the store; the returned `stop` ends the subscription to a reactive
|
|
17
|
+
* snapshot source.
|
|
18
|
+
*/
|
|
19
|
+
function connectSvelteStore(options) {
|
|
20
|
+
const source = options.snapshot;
|
|
21
|
+
const promised = isPromiseLike(source);
|
|
22
|
+
const reactive = promised ? void 0 : reactiveSource(source);
|
|
23
|
+
let initial;
|
|
24
|
+
if (reactive !== void 0) reactive.subscribe((value) => {
|
|
25
|
+
initial = value;
|
|
26
|
+
})();
|
|
27
|
+
else if (!promised) initial = source;
|
|
28
|
+
const tenant = options.tenant;
|
|
29
|
+
const headers = options.headers;
|
|
30
|
+
const store = providerStore(compact({
|
|
31
|
+
endpoint: options.endpoint,
|
|
32
|
+
snapshotUrl: options.snapshotUrl,
|
|
33
|
+
approvals: options.approvals,
|
|
34
|
+
tenant: typeof tenant === "function" ? tenant() : tenant,
|
|
35
|
+
maxAge: options.maxAge
|
|
36
|
+
}), () => ({
|
|
37
|
+
headers: typeof headers === "function" ? headers() : headers,
|
|
38
|
+
fetch: options.fetch,
|
|
39
|
+
verifier: options.verifier
|
|
40
|
+
}), promised ? source : initial);
|
|
41
|
+
const stops = [];
|
|
42
|
+
if (reactive !== void 0) {
|
|
43
|
+
let current = initial;
|
|
44
|
+
stops.push(reactive.subscribe((value) => {
|
|
45
|
+
if (value !== current) {
|
|
46
|
+
current = value;
|
|
47
|
+
store.replace(value);
|
|
48
|
+
}
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
51
|
+
if (typeof tenant === "function") {
|
|
52
|
+
let active = tenant();
|
|
53
|
+
stops.push(toStore(tenant).subscribe((next) => {
|
|
54
|
+
if (next !== void 0 && next !== active) {
|
|
55
|
+
active = next;
|
|
56
|
+
switchTenant(store, next);
|
|
57
|
+
}
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
store,
|
|
62
|
+
stop: () => {
|
|
63
|
+
for (const stop of stops) stop();
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function providePermDock(options) {
|
|
68
|
+
const { store, stop } = connectSvelteStore(options);
|
|
69
|
+
onDestroy(() => {
|
|
70
|
+
stop();
|
|
71
|
+
store.dispose();
|
|
72
|
+
});
|
|
73
|
+
setContext(permDockKey, store);
|
|
74
|
+
return store;
|
|
75
|
+
}
|
|
76
|
+
function getStore() {
|
|
77
|
+
const store = getContext(permDockKey);
|
|
78
|
+
if (store === void 0) throw new Error("PermDock: stores require setPermDock.");
|
|
79
|
+
return store;
|
|
80
|
+
}
|
|
81
|
+
//#endregion
|
|
82
|
+
export { providePermDock as n, getStore as t };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { C as Policy, D as PolicyVocabulary, Nr as Principal, ln as PermDock } from "../policy-CFZAr_Al.js";
|
|
2
|
+
import { f as Permission } from "../permissions-DttnqqxC.js";
|
|
3
|
+
import { a as ProblemDetails, r as PermDockDeniedError } from "../errors-DAqevpNk.js";
|
|
4
|
+
import { t as InstanceOptions } from "../instance-options-BK_rNOSC.js";
|
|
5
|
+
//#region src/convex/types.d.ts
|
|
6
|
+
type ConvexCtxLike = {
|
|
7
|
+
readonly auth?: {
|
|
8
|
+
readonly getUserIdentity?: () => Promise<unknown>;
|
|
9
|
+
};
|
|
10
|
+
readonly db?: unknown;
|
|
11
|
+
};
|
|
12
|
+
type ConvexPermDockCtx<TCtx, V extends PolicyVocabulary = PolicyVocabulary> = TCtx & {
|
|
13
|
+
readonly permdock: PermDock<V>;
|
|
14
|
+
};
|
|
15
|
+
type ConvexSubject<TCtx, TUser = unknown> = (ctx: TCtx) => TUser | Promise<TUser>;
|
|
16
|
+
type ConvexQueryBuilder = (definition: {
|
|
17
|
+
readonly args: Record<string, never>;
|
|
18
|
+
readonly handler: (ctx: ConvexCtxLike, args: Record<string, never>) => unknown;
|
|
19
|
+
}) => unknown;
|
|
20
|
+
type ConvexPermDockOptions<TCtx, TUser = unknown> = InstanceOptions & {
|
|
21
|
+
readonly subject: ConvexSubject<TCtx, TUser>;
|
|
22
|
+
/** The active tenant: a fixed id or a function of the Convex context; a throw is no tenant. */
|
|
23
|
+
readonly tenant?: string | ((ctx: TCtx) => string | undefined | Promise<string | undefined>);
|
|
24
|
+
/** The agent or service acting for the subject; anything but an `Actor` is ignored. */
|
|
25
|
+
readonly actor?: (ctx: TCtx) => unknown;
|
|
26
|
+
readonly query?: ConvexQueryBuilder;
|
|
27
|
+
};
|
|
28
|
+
type ConvexHandler<TCtx, TArgs, TResult, V extends PolicyVocabulary = PolicyVocabulary> = (ctx: ConvexPermDockCtx<TCtx, V>, args: TArgs) => TResult | Promise<TResult>;
|
|
29
|
+
type ConvexErrorData = ProblemDetails;
|
|
30
|
+
type ConvexPermDock<TCtx, V extends PolicyVocabulary = PolicyVocabulary> = {
|
|
31
|
+
readonly withPermDock: <TArgs, TResult>(handler: ConvexHandler<TCtx, TArgs, TResult, V>) => (ctx: TCtx, args: TArgs) => Promise<TResult>;
|
|
32
|
+
readonly snapshotQuery: (options?: {
|
|
33
|
+
readonly include?: readonly Permission[];
|
|
34
|
+
}) => unknown;
|
|
35
|
+
};
|
|
36
|
+
//#endregion
|
|
37
|
+
//#region src/convex/create.d.ts
|
|
38
|
+
export declare class ConvexError extends Error {
|
|
39
|
+
override readonly name = "ConvexError";
|
|
40
|
+
readonly data: ReturnType<PermDockDeniedError["toProblemDetails"]>;
|
|
41
|
+
constructor(data: ReturnType<PermDockDeniedError["toProblemDetails"]>);
|
|
42
|
+
}
|
|
43
|
+
export declare function createPermDock<TCtx, TUser, TPrincipal extends Principal = Principal, V extends PolicyVocabulary = PolicyVocabulary>(policy: Policy<TUser, TPrincipal, V>, options: ConvexPermDockOptions<TCtx, TUser>): ConvexPermDock<TCtx, V>;
|
|
44
|
+
//#endregion
|
|
45
|
+
export type { ConvexCtxLike, ConvexErrorData, ConvexHandler, ConvexPermDock, ConvexPermDockCtx, ConvexPermDockOptions, ConvexQueryBuilder, ConvexSubject };
|