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,44 @@
|
|
|
1
|
+
import { n as payloadDigest } from "./token-CIWxJOCh.js";
|
|
2
|
+
//#region src/core/snapshot-cache.ts
|
|
3
|
+
/**
|
|
4
|
+
* `{ stale }` in seconds: `max` when the value never expires, otherwise the seconds left, clamped
|
|
5
|
+
* to `[min, max]`. A value with less than `min` seconds left gets its real remainder, so Next.js
|
|
6
|
+
* leaves it out of prefetches and an HTTP cache does not serve it past `expiresAt`.
|
|
7
|
+
*/
|
|
8
|
+
function cacheLifeFor(value, options = {}) {
|
|
9
|
+
const min = options.min ?? 30;
|
|
10
|
+
const max = Math.max(options.max ?? 300, min);
|
|
11
|
+
const expiresAt = value?.expiresAt;
|
|
12
|
+
if (expiresAt === void 0 || expiresAt === null) return { stale: max };
|
|
13
|
+
const issuedAt = value?.issuedAt !== void 0 && value.issuedAt > 0 ? value.issuedAt : void 0;
|
|
14
|
+
const now = options.now ?? issuedAt ?? Math.floor(Date.now() / 1e3);
|
|
15
|
+
const remaining = Math.floor(expiresAt - now);
|
|
16
|
+
if (remaining < min) return { stale: Math.max(0, remaining) };
|
|
17
|
+
return { stale: Math.min(max, remaining) };
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The `cacheTag` for one subject's cached snapshots: `permdock:<sub>`, or `permdock:anon`
|
|
21
|
+
* without a subject. Tag the private cache with it and pass it to `updateTag` or
|
|
22
|
+
* `revalidateTag` on every write that changes the subject's snapshot.
|
|
23
|
+
*/
|
|
24
|
+
function snapshotTag(sub) {
|
|
25
|
+
return `permdock:${sub === void 0 || sub === null || sub === "" ? "anon" : sub}`;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Response headers for a loader or route that returns `snapshot`: `Cache-Control: private` with
|
|
29
|
+
* `max-age` from `cacheLifeFor`, `Vary: Authorization, Cookie`, an `ETag` over everything but
|
|
30
|
+
* `issuedAt`, and `Cache-Tag` with `snapshotTag(sub)` and `tags`.
|
|
31
|
+
*/
|
|
32
|
+
function snapshotHeaders(snapshot, options = {}) {
|
|
33
|
+
const content = {};
|
|
34
|
+
for (const [key, value] of Object.entries(snapshot)) if (key !== "issuedAt") content[key] = value;
|
|
35
|
+
const { tags, ...life } = options;
|
|
36
|
+
return {
|
|
37
|
+
"Cache-Control": `private, max-age=${cacheLifeFor(snapshot, life).stale}`,
|
|
38
|
+
Vary: "Authorization, Cookie",
|
|
39
|
+
ETag: `"${payloadDigest(content)}"`,
|
|
40
|
+
"Cache-Tag": [snapshotTag(snapshot.subject.principal?.id), ...tags ?? []].join(",")
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//#endregion
|
|
44
|
+
export { snapshotHeaders as n, snapshotTag as r, cacheLifeFor as t };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { Tt as Snapshot } from "./policy-CFZAr_Al.js";
|
|
2
|
+
//#region src/core/snapshot-cache.d.ts
|
|
3
|
+
type CacheLifeForOptions = {
|
|
4
|
+
/** Lower bound in seconds. Next.js includes a private entry in per-link prefetches from 30. */
|
|
5
|
+
readonly min?: number;
|
|
6
|
+
/** Upper bound in seconds. Next.js keeps a per-session App Shell entry from 300. */
|
|
7
|
+
readonly max?: number;
|
|
8
|
+
/** Seconds since the epoch; defaults to the snapshot's `issuedAt`, then the clock. */
|
|
9
|
+
readonly now?: number;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* `{ stale }` in seconds: `max` when the value never expires, otherwise the seconds left, clamped
|
|
13
|
+
* to `[min, max]`. A value with less than `min` seconds left gets its real remainder, so Next.js
|
|
14
|
+
* leaves it out of prefetches and an HTTP cache does not serve it past `expiresAt`.
|
|
15
|
+
*/
|
|
16
|
+
declare function cacheLifeFor(value: {
|
|
17
|
+
readonly expiresAt?: number | null;
|
|
18
|
+
readonly issuedAt?: number;
|
|
19
|
+
} | null, options?: CacheLifeForOptions): {
|
|
20
|
+
readonly stale: number;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* The `cacheTag` for one subject's cached snapshots: `permdock:<sub>`, or `permdock:anon`
|
|
24
|
+
* without a subject. Tag the private cache with it and pass it to `updateTag` or
|
|
25
|
+
* `revalidateTag` on every write that changes the subject's snapshot.
|
|
26
|
+
*/
|
|
27
|
+
declare function snapshotTag(sub?: string | null): string;
|
|
28
|
+
type SnapshotHeadersOptions = CacheLifeForOptions & {
|
|
29
|
+
/** Sent in `Cache-Tag` after `snapshotTag(sub)`, such as the app's own organisation tag. */
|
|
30
|
+
readonly tags?: readonly string[];
|
|
31
|
+
};
|
|
32
|
+
type SnapshotHeaders = {
|
|
33
|
+
readonly "Cache-Control": string;
|
|
34
|
+
readonly Vary: string;
|
|
35
|
+
readonly ETag: string;
|
|
36
|
+
readonly "Cache-Tag": string;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Response headers for a loader or route that returns `snapshot`: `Cache-Control: private` with
|
|
40
|
+
* `max-age` from `cacheLifeFor`, `Vary: Authorization, Cookie`, an `ETag` over everything but
|
|
41
|
+
* `issuedAt`, and `Cache-Tag` with `snapshotTag(sub)` and `tags`.
|
|
42
|
+
*/
|
|
43
|
+
declare function snapshotHeaders(snapshot: Snapshot, options?: SnapshotHeadersOptions): SnapshotHeaders;
|
|
44
|
+
//#endregion
|
|
45
|
+
export { snapshotHeaders as a, cacheLifeFor as i, SnapshotHeaders as n, snapshotTag as o, SnapshotHeadersOptions as r, CacheLifeForOptions as t };
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { Ft as TokenVerifier, Mr as Membership, Tt as Snapshot, Yn as Decision } from "../policy-CFZAr_Al.js";
|
|
2
|
+
import { f as Permission } from "../permissions-DttnqqxC.js";
|
|
3
|
+
import { r as Role } from "../vocabulary-DA8a8zif.js";
|
|
4
|
+
import { n as requiredPlans } from "../problem-details-CkL50EEf.js";
|
|
5
|
+
import { i as describe } from "../describe-PdoqESvg.js";
|
|
6
|
+
import { t as PermissionBoundaryState } from "../boundary-BmHxVH1J.js";
|
|
7
|
+
import { t as approvalHeaders } from "../headers-Cf-zWvsO.js";
|
|
8
|
+
import { a as FilterResult, c as SubjectView, i as ClientStatus, l as TenantView, n as ApprovalState, o as PermissionSet, r as ClientPermDock, s as PermissionState, t as ApprovalHandle, u as UseRolesOptions } from "../types-kxznc7cn.js";
|
|
9
|
+
import { Accessor, Accessor as Accessor$1, JSX } from "solid-js";
|
|
10
|
+
//#region src/solid/types.d.ts
|
|
11
|
+
/** Structural `JSX.Element`: text, a DOM node or a list of children. */
|
|
12
|
+
type SolidChild = string | number | boolean | null | undefined | {
|
|
13
|
+
readonly nodeType: number;
|
|
14
|
+
} | readonly SolidChild[];
|
|
15
|
+
type PermDockProviderProps = {
|
|
16
|
+
/**
|
|
17
|
+
* An accessor re-hydrates the store when it changes and keeps it `pending`
|
|
18
|
+
* while it returns `undefined` (a loading `createResource`); a promise keeps
|
|
19
|
+
* the store `pending` until it settles.
|
|
20
|
+
*/
|
|
21
|
+
readonly snapshot: Snapshot | string | Accessor$1<Snapshot | string | undefined> | PromiseLike<Snapshot | string>;
|
|
22
|
+
/**
|
|
23
|
+
* The AuthZEN evaluations endpoint for checks the snapshot cannot answer.
|
|
24
|
+
* `false` never calls one: such a check is denied with reason `server-only`.
|
|
25
|
+
*/
|
|
26
|
+
readonly endpoint?: string | false;
|
|
27
|
+
/** Where `refresh()` fetches a fresh snapshot. Defaults to `endpoint`. */
|
|
28
|
+
readonly snapshotUrl?: string;
|
|
29
|
+
readonly approvals?: string;
|
|
30
|
+
/** A change switches the active tenant (`refresh({ tenant })`). */
|
|
31
|
+
readonly tenant?: string;
|
|
32
|
+
/** `headers`, `fetch` and `verifier` are read on every request, so a rotated token applies without a new store. */
|
|
33
|
+
readonly fetch?: typeof fetch;
|
|
34
|
+
readonly headers?: Readonly<Record<string, string>>;
|
|
35
|
+
readonly maxAge?: number;
|
|
36
|
+
readonly verifier?: TokenVerifier;
|
|
37
|
+
readonly children: unknown;
|
|
38
|
+
};
|
|
39
|
+
type PermissionBoundaryProps = {
|
|
40
|
+
/** Rendered in place of the children when one throws `PermDockDeniedError`. */
|
|
41
|
+
readonly denied?: SolidChild | ((state: PermissionBoundaryState) => SolidChild);
|
|
42
|
+
/** Rendered for `PermDockApprovalRequiredError`; defaults to `denied`. */
|
|
43
|
+
readonly approval?: SolidChild | ((state: PermissionBoundaryState) => SolidChild);
|
|
44
|
+
readonly children: unknown;
|
|
45
|
+
};
|
|
46
|
+
type ProtectedProps = {
|
|
47
|
+
readonly permission: Permission;
|
|
48
|
+
readonly data?: unknown;
|
|
49
|
+
readonly tenant?: string;
|
|
50
|
+
readonly pending?: SolidChild;
|
|
51
|
+
readonly fallback?: SolidChild | ((decision: Decision) => SolidChild);
|
|
52
|
+
readonly children: SolidChild | ((decision: Extract<Decision, {
|
|
53
|
+
readonly outcome: "granted";
|
|
54
|
+
}>) => SolidChild);
|
|
55
|
+
};
|
|
56
|
+
//#endregion
|
|
57
|
+
//#region src/solid/hooks.d.ts
|
|
58
|
+
export declare function usePermDock(): ClientPermDock;
|
|
59
|
+
export declare function usePermission(permission: Permission | Accessor<Permission>, data?: Accessor<unknown>): Accessor<PermissionState>;
|
|
60
|
+
export declare function usePermissions(permissions: Accessor<readonly Permission[]>, data?: Accessor<unknown>): Accessor<PermissionSet>;
|
|
61
|
+
export declare function useFilter<T>(permission: Permission<string, T, "instance">, rows: Accessor<readonly T[]>): Accessor<FilterResult<T>>;
|
|
62
|
+
export declare function useTenant(): Accessor<TenantView>;
|
|
63
|
+
export declare function useMemberships(): Accessor<readonly Membership[]>;
|
|
64
|
+
export declare function useRoles(options?: Accessor<UseRolesOptions>): Accessor<{
|
|
65
|
+
readonly roles: readonly Role[];
|
|
66
|
+
}>;
|
|
67
|
+
export declare function useAssignableRoles(): Accessor<readonly Role[]>;
|
|
68
|
+
export declare function useAssignablePermissions(options?: {
|
|
69
|
+
readonly tenant?: string;
|
|
70
|
+
} | Accessor<{
|
|
71
|
+
readonly tenant?: string;
|
|
72
|
+
}>): Accessor<readonly Permission[]>;
|
|
73
|
+
export declare function useSubject(): Accessor<SubjectView>;
|
|
74
|
+
export declare function useApproval(decision: Accessor<Decision>): Accessor<ApprovalHandle>;
|
|
75
|
+
//#endregion
|
|
76
|
+
//#region src/solid/boundary.d.ts
|
|
77
|
+
/**
|
|
78
|
+
* Catches `PermDockDeniedError` and `PermDockApprovalRequiredError` thrown
|
|
79
|
+
* below it and renders `denied`, or `approval` for an approval request
|
|
80
|
+
* (default `denied`), with the refused permission and `retry()`. Any other
|
|
81
|
+
* error goes to the next `ErrorBoundary` up.
|
|
82
|
+
*/
|
|
83
|
+
export declare function PermissionBoundary(props: PermissionBoundaryProps): JSX.Element;
|
|
84
|
+
/** Inside a `PermissionBoundary` fallback: what was refused and `retry()`. */
|
|
85
|
+
export declare function usePermissionBoundary(): PermissionBoundaryState | null;
|
|
86
|
+
//#endregion
|
|
87
|
+
//#region src/solid/protected.d.ts
|
|
88
|
+
export declare function Protected(props: ProtectedProps): JSX.Element;
|
|
89
|
+
//#endregion
|
|
90
|
+
//#region src/solid/provider.d.ts
|
|
91
|
+
export declare function PermDockProvider(props: PermDockProviderProps): JSX.Element;
|
|
92
|
+
//#endregion
|
|
93
|
+
export { type ApprovalHandle, type ApprovalState, type ClientPermDock, type ClientStatus, type FilterResult, type PermDockProviderProps, type PermissionBoundaryProps, type PermissionBoundaryState, type PermissionSet, type PermissionState, type ProtectedProps, type SolidChild, type SubjectView, type TenantView, type UseRolesOptions, approvalHeaders, describe, requiredPlans };
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { t as compact } from "../compact-y6vfu2_f.js";
|
|
2
|
+
import { r as requiredPlans } from "../problem-details-_AMOYz-w.js";
|
|
3
|
+
import { t as describe } from "../describe-B_gVZEVi.js";
|
|
4
|
+
import { t as approvalHeaders } from "../headers-BZSDieNT.js";
|
|
5
|
+
import { i as isPromiseLike } from "../store-options-yO0V6gRn.js";
|
|
6
|
+
import { a as protectedView, c as subjectView, i as permissionSet, l as tenantView, n as filterResult, o as rolesView, r as livePermDock, s as scopedTenant, t as approvalHandle } from "../views-Soe7bGSC.js";
|
|
7
|
+
import { n as boundaryFallback, t as boundaryDigest } from "../boundary-BM8a_P6E.js";
|
|
8
|
+
import { n as switchTenant, t as providerStore } from "../provider-store-DNyC1y48.js";
|
|
9
|
+
import { ErrorBoundary, createComponent, createComputed, createContext, createMemo, createSignal, getOwner, on, onCleanup, useContext } from "solid-js";
|
|
10
|
+
//#region src/solid/context.ts
|
|
11
|
+
const PermDockContext = createContext(void 0);
|
|
12
|
+
function useStore() {
|
|
13
|
+
const store = useContext(PermDockContext);
|
|
14
|
+
if (store === void 0) throw new Error("PermDock: hooks require <PermDockProvider>.");
|
|
15
|
+
return store;
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
//#region src/solid/hooks.ts
|
|
19
|
+
function useVersion(store) {
|
|
20
|
+
if (getOwner() === null) throw new Error("PermDock: call hooks inside a component or createRoot, which removes their store subscription.");
|
|
21
|
+
const [tick, setTick] = createSignal(0);
|
|
22
|
+
onCleanup(store.subscribe(() => {
|
|
23
|
+
setTick((current) => current + 1);
|
|
24
|
+
}));
|
|
25
|
+
return tick;
|
|
26
|
+
}
|
|
27
|
+
function usePermDock() {
|
|
28
|
+
const store = useStore();
|
|
29
|
+
const version = useVersion(store);
|
|
30
|
+
return livePermDock(() => {
|
|
31
|
+
version();
|
|
32
|
+
return store.get();
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
function usePermission(permission, data) {
|
|
36
|
+
const store = useStore();
|
|
37
|
+
const version = useVersion(store);
|
|
38
|
+
return createMemo(() => {
|
|
39
|
+
version();
|
|
40
|
+
const current = typeof permission === "function" ? permission() : permission;
|
|
41
|
+
return store.permissionState(current, data?.());
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
function usePermissions(permissions, data) {
|
|
45
|
+
const store = useStore();
|
|
46
|
+
const version = useVersion(store);
|
|
47
|
+
return createMemo(() => {
|
|
48
|
+
version();
|
|
49
|
+
return permissionSet(store, permissions(), data?.());
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
function useFilter(permission, rows) {
|
|
53
|
+
const permdock = usePermDock();
|
|
54
|
+
return createMemo(() => filterResult(permdock, permission, rows()));
|
|
55
|
+
}
|
|
56
|
+
function useTenant() {
|
|
57
|
+
const permdock = usePermDock();
|
|
58
|
+
return createMemo(() => tenantView(permdock));
|
|
59
|
+
}
|
|
60
|
+
function useMemberships() {
|
|
61
|
+
const permdock = usePermDock();
|
|
62
|
+
return createMemo(() => permdock.memberships());
|
|
63
|
+
}
|
|
64
|
+
function useRoles(options = () => ({})) {
|
|
65
|
+
const permdock = usePermDock();
|
|
66
|
+
return createMemo(() => rolesView(permdock, options()));
|
|
67
|
+
}
|
|
68
|
+
function useAssignableRoles() {
|
|
69
|
+
const permdock = usePermDock();
|
|
70
|
+
return createMemo(() => permdock.assignableRoles());
|
|
71
|
+
}
|
|
72
|
+
function useAssignablePermissions(options = {}) {
|
|
73
|
+
const permdock = usePermDock();
|
|
74
|
+
return createMemo(() => permdock.assignablePermissions(typeof options === "function" ? options() : options));
|
|
75
|
+
}
|
|
76
|
+
function useSubject() {
|
|
77
|
+
const permdock = usePermDock();
|
|
78
|
+
return createMemo(() => subjectView(permdock));
|
|
79
|
+
}
|
|
80
|
+
function useApproval(decision) {
|
|
81
|
+
const store = useStore();
|
|
82
|
+
const version = useVersion(store);
|
|
83
|
+
return createMemo(() => {
|
|
84
|
+
version();
|
|
85
|
+
return approvalHandle(store, decision());
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
//#endregion
|
|
89
|
+
//#region src/solid/boundary.ts
|
|
90
|
+
const BoundaryContext = createContext(null);
|
|
91
|
+
/**
|
|
92
|
+
* Catches `PermDockDeniedError` and `PermDockApprovalRequiredError` thrown
|
|
93
|
+
* below it and renders `denied`, or `approval` for an approval request
|
|
94
|
+
* (default `denied`), with the refused permission and `retry()`. Any other
|
|
95
|
+
* error goes to the next `ErrorBoundary` up.
|
|
96
|
+
*/
|
|
97
|
+
function PermissionBoundary(props) {
|
|
98
|
+
return createComponent(ErrorBoundary, {
|
|
99
|
+
fallback: (error, reset) => {
|
|
100
|
+
const digest = boundaryDigest(error);
|
|
101
|
+
if (digest === null) throw error;
|
|
102
|
+
const state = {
|
|
103
|
+
...digest,
|
|
104
|
+
retry: reset
|
|
105
|
+
};
|
|
106
|
+
return createComponent(BoundaryContext.Provider, {
|
|
107
|
+
value: state,
|
|
108
|
+
get children() {
|
|
109
|
+
const chosen = boundaryFallback(digest, props);
|
|
110
|
+
return typeof chosen === "function" ? chosen(state) : chosen ?? null;
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
},
|
|
114
|
+
get children() {
|
|
115
|
+
return props.children;
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
/** Inside a `PermissionBoundary` fallback: what was refused and `retry()`. */
|
|
120
|
+
function usePermissionBoundary() {
|
|
121
|
+
return useContext(BoundaryContext);
|
|
122
|
+
}
|
|
123
|
+
//#endregion
|
|
124
|
+
//#region src/solid/protected.ts
|
|
125
|
+
function Protected(props) {
|
|
126
|
+
const root = usePermDock();
|
|
127
|
+
const local = usePermission(() => props.permission, () => props.data);
|
|
128
|
+
const scoped = createMemo(() => scopedTenant(root, props.tenant));
|
|
129
|
+
const view = createMemo(() => protectedView(local(), root, props.permission, props.data, scoped()));
|
|
130
|
+
const render = () => {
|
|
131
|
+
const current = view();
|
|
132
|
+
switch (current.slot) {
|
|
133
|
+
case "pending": return props.pending ?? null;
|
|
134
|
+
case "fallback": return typeof props.fallback === "function" ? props.fallback(current.decision) : props.fallback ?? null;
|
|
135
|
+
case "default": return typeof props.children === "function" ? props.children(current.decision) : props.children;
|
|
136
|
+
default: return current;
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
return render;
|
|
140
|
+
}
|
|
141
|
+
//#endregion
|
|
142
|
+
//#region src/solid/provider.ts
|
|
143
|
+
function PermDockProvider(props) {
|
|
144
|
+
const source = props.snapshot;
|
|
145
|
+
const promised = isPromiseLike(source);
|
|
146
|
+
const read = typeof source === "function" ? source : void 0;
|
|
147
|
+
const initial = promised ? void 0 : read === void 0 ? source : read();
|
|
148
|
+
const store = providerStore(compact({
|
|
149
|
+
endpoint: props.endpoint,
|
|
150
|
+
snapshotUrl: props.snapshotUrl,
|
|
151
|
+
approvals: props.approvals,
|
|
152
|
+
tenant: props.tenant,
|
|
153
|
+
maxAge: props.maxAge
|
|
154
|
+
}), () => ({
|
|
155
|
+
headers: props.headers,
|
|
156
|
+
fetch: props.fetch,
|
|
157
|
+
verifier: props.verifier
|
|
158
|
+
}), promised ? source : initial);
|
|
159
|
+
createComputed(on(() => props.tenant, (next) => {
|
|
160
|
+
switchTenant(store, next);
|
|
161
|
+
}, { defer: true }));
|
|
162
|
+
onCleanup(() => {
|
|
163
|
+
store.dispose();
|
|
164
|
+
});
|
|
165
|
+
if (!promised && read !== void 0) {
|
|
166
|
+
let arrive;
|
|
167
|
+
if (initial === void 0) store.follow(new Promise((resolve) => {
|
|
168
|
+
arrive = resolve;
|
|
169
|
+
}));
|
|
170
|
+
createComputed(on(read, (next) => {
|
|
171
|
+
if (next === void 0) return;
|
|
172
|
+
if (arrive === void 0) {
|
|
173
|
+
store.replace(next);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
arrive(next);
|
|
177
|
+
arrive = void 0;
|
|
178
|
+
}, { defer: initial !== void 0 }));
|
|
179
|
+
}
|
|
180
|
+
return createComponent(PermDockContext.Provider, {
|
|
181
|
+
value: store,
|
|
182
|
+
get children() {
|
|
183
|
+
return props.children;
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
//#endregion
|
|
188
|
+
export { PermDockProvider, PermissionBoundary, Protected, approvalHeaders, describe, requiredPlans, useApproval, useAssignablePermissions, useAssignableRoles, useFilter, useMemberships, usePermDock, usePermission, usePermissionBoundary, usePermissions, useRoles, useSubject, useTenant };
|