@classytic/arc 1.1.0 → 2.1.2
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 +247 -794
- package/bin/arc.js +91 -52
- package/dist/EventTransport-BD2U0BTc.d.mts +100 -0
- package/dist/EventTransport-BD2U0BTc.d.mts.map +1 -0
- package/dist/HookSystem-BsGV-j2l.mjs +405 -0
- package/dist/HookSystem-BsGV-j2l.mjs.map +1 -0
- package/dist/ResourceRegistry-DsN4KJjV.mjs +250 -0
- package/dist/ResourceRegistry-DsN4KJjV.mjs.map +1 -0
- package/dist/adapters/index.d.mts +5 -0
- package/dist/adapters/index.mjs +3 -0
- package/dist/audit/index.d.mts +82 -0
- package/dist/audit/index.d.mts.map +1 -0
- package/dist/audit/index.mjs +276 -0
- package/dist/audit/index.mjs.map +1 -0
- package/dist/audit/mongodb.d.mts +5 -0
- package/dist/audit/mongodb.mjs +3 -0
- package/dist/audited-C3T5DTUx.mjs +141 -0
- package/dist/audited-C3T5DTUx.mjs.map +1 -0
- package/dist/auth/index.d.mts +189 -0
- package/dist/auth/index.d.mts.map +1 -0
- package/dist/auth/index.mjs +1102 -0
- package/dist/auth/index.mjs.map +1 -0
- package/dist/auth/redis-session.d.mts +44 -0
- package/dist/auth/redis-session.d.mts.map +1 -0
- package/dist/auth/redis-session.mjs +76 -0
- package/dist/auth/redis-session.mjs.map +1 -0
- package/dist/betterAuthOpenApi-BrHKeSAx.mjs +250 -0
- package/dist/betterAuthOpenApi-BrHKeSAx.mjs.map +1 -0
- package/dist/cache/index.d.mts +146 -0
- package/dist/cache/index.d.mts.map +1 -0
- package/dist/cache/index.mjs +92 -0
- package/dist/cache/index.mjs.map +1 -0
- package/dist/caching-Bl28lYsR.mjs +94 -0
- package/dist/caching-Bl28lYsR.mjs.map +1 -0
- package/dist/chunk-C7Uep-_p.mjs +20 -0
- package/dist/circuitBreaker-DeY4FCjs.mjs +1097 -0
- package/dist/circuitBreaker-DeY4FCjs.mjs.map +1 -0
- package/dist/cli/commands/describe.d.mts +19 -0
- package/dist/cli/commands/describe.d.mts.map +1 -0
- package/dist/cli/commands/describe.mjs +239 -0
- package/dist/cli/commands/describe.mjs.map +1 -0
- package/dist/cli/commands/docs.d.mts +14 -0
- package/dist/cli/commands/docs.d.mts.map +1 -0
- package/dist/cli/commands/docs.mjs +53 -0
- package/dist/cli/commands/docs.mjs.map +1 -0
- package/dist/cli/commands/{generate.d.ts → generate.d.mts} +3 -1
- package/dist/cli/commands/generate.d.mts.map +1 -0
- package/dist/cli/commands/generate.mjs +358 -0
- package/dist/cli/commands/generate.mjs.map +1 -0
- package/dist/cli/commands/{init.d.ts → init.d.mts} +12 -8
- package/dist/cli/commands/init.d.mts.map +1 -0
- package/dist/cli/commands/{init.js → init.mjs} +807 -616
- package/dist/cli/commands/init.mjs.map +1 -0
- package/dist/cli/commands/introspect.d.mts +11 -0
- package/dist/cli/commands/introspect.d.mts.map +1 -0
- package/dist/cli/commands/introspect.mjs +76 -0
- package/dist/cli/commands/introspect.mjs.map +1 -0
- package/dist/cli/index.d.mts +17 -0
- package/dist/cli/index.d.mts.map +1 -0
- package/dist/cli/index.mjs +157 -0
- package/dist/cli/index.mjs.map +1 -0
- package/dist/constants-DdXFXQtN.mjs +85 -0
- package/dist/constants-DdXFXQtN.mjs.map +1 -0
- package/dist/core/index.d.mts +5 -0
- package/dist/core/index.mjs +4 -0
- package/dist/createApp-CUgNqegw.mjs +560 -0
- package/dist/createApp-CUgNqegw.mjs.map +1 -0
- package/dist/defineResource-k0_BDn8v.mjs +2197 -0
- package/dist/defineResource-k0_BDn8v.mjs.map +1 -0
- package/dist/discovery/index.d.mts +47 -0
- package/dist/discovery/index.d.mts.map +1 -0
- package/dist/discovery/index.mjs +110 -0
- package/dist/discovery/index.mjs.map +1 -0
- package/dist/docs/index.d.mts +163 -0
- package/dist/docs/index.d.mts.map +1 -0
- package/dist/docs/index.mjs +73 -0
- package/dist/docs/index.mjs.map +1 -0
- package/dist/elevation-BRy3yFWT.mjs +113 -0
- package/dist/elevation-BRy3yFWT.mjs.map +1 -0
- package/dist/elevation-B_2dRLVP.d.mts +88 -0
- package/dist/elevation-B_2dRLVP.d.mts.map +1 -0
- package/dist/errorHandler-BbcgBmIH.d.mts +73 -0
- package/dist/errorHandler-BbcgBmIH.d.mts.map +1 -0
- package/dist/errorHandler-C1okiriz.mjs +109 -0
- package/dist/errorHandler-C1okiriz.mjs.map +1 -0
- package/dist/errors-B9bZok84.mjs +212 -0
- package/dist/errors-B9bZok84.mjs.map +1 -0
- package/dist/errors-ChKiFz62.d.mts +125 -0
- package/dist/errors-ChKiFz62.d.mts.map +1 -0
- package/dist/eventPlugin-CTrLH3mt.d.mts +125 -0
- package/dist/eventPlugin-CTrLH3mt.d.mts.map +1 -0
- package/dist/eventPlugin-DGR_B2on.mjs +230 -0
- package/dist/eventPlugin-DGR_B2on.mjs.map +1 -0
- package/dist/events/index.d.mts +54 -0
- package/dist/events/index.d.mts.map +1 -0
- package/dist/events/index.mjs +52 -0
- package/dist/events/index.mjs.map +1 -0
- package/dist/events/transports/redis-stream-entry.d.mts +2 -0
- package/dist/events/transports/redis-stream-entry.mjs +178 -0
- package/dist/events/transports/redis-stream-entry.mjs.map +1 -0
- package/dist/events/transports/redis.d.mts +77 -0
- package/dist/events/transports/redis.d.mts.map +1 -0
- package/dist/events/transports/redis.mjs +125 -0
- package/dist/events/transports/redis.mjs.map +1 -0
- package/dist/externalPaths-DlINfKbP.d.mts +51 -0
- package/dist/externalPaths-DlINfKbP.d.mts.map +1 -0
- package/dist/factory/index.d.mts +64 -0
- package/dist/factory/index.d.mts.map +1 -0
- package/dist/factory/index.mjs +3 -0
- package/dist/fastifyAdapter-BkrGrlFi.d.mts +217 -0
- package/dist/fastifyAdapter-BkrGrlFi.d.mts.map +1 -0
- package/dist/fields-DyaDVX4J.d.mts +110 -0
- package/dist/fields-DyaDVX4J.d.mts.map +1 -0
- package/dist/fields-iagOozy0.mjs +115 -0
- package/dist/fields-iagOozy0.mjs.map +1 -0
- package/dist/hooks/index.d.mts +4 -0
- package/dist/hooks/index.mjs +3 -0
- package/dist/idempotency/index.d.mts +97 -0
- package/dist/idempotency/index.d.mts.map +1 -0
- package/dist/idempotency/index.mjs +320 -0
- package/dist/idempotency/index.mjs.map +1 -0
- package/dist/idempotency/mongodb.d.mts +2 -0
- package/dist/idempotency/mongodb.mjs +115 -0
- package/dist/idempotency/mongodb.mjs.map +1 -0
- package/dist/idempotency/redis.d.mts +2 -0
- package/dist/idempotency/redis.mjs +104 -0
- package/dist/idempotency/redis.mjs.map +1 -0
- package/dist/index.d.mts +261 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +105 -0
- package/dist/index.mjs.map +1 -0
- package/dist/integrations/event-gateway.d.mts +47 -0
- package/dist/integrations/event-gateway.d.mts.map +1 -0
- package/dist/integrations/event-gateway.mjs +44 -0
- package/dist/integrations/event-gateway.mjs.map +1 -0
- package/dist/integrations/index.d.mts +5 -0
- package/dist/integrations/index.mjs +1 -0
- package/dist/integrations/jobs.d.mts +104 -0
- package/dist/integrations/jobs.d.mts.map +1 -0
- package/dist/integrations/jobs.mjs +124 -0
- package/dist/integrations/jobs.mjs.map +1 -0
- package/dist/integrations/streamline.d.mts +61 -0
- package/dist/integrations/streamline.d.mts.map +1 -0
- package/dist/integrations/streamline.mjs +126 -0
- package/dist/integrations/streamline.mjs.map +1 -0
- package/dist/integrations/websocket.d.mts +83 -0
- package/dist/integrations/websocket.d.mts.map +1 -0
- package/dist/integrations/websocket.mjs +289 -0
- package/dist/integrations/websocket.mjs.map +1 -0
- package/dist/interface-B01JvPVc.d.mts +78 -0
- package/dist/interface-B01JvPVc.d.mts.map +1 -0
- package/dist/interface-CZe8IkMf.d.mts +55 -0
- package/dist/interface-CZe8IkMf.d.mts.map +1 -0
- package/dist/interface-Ch8HU9uM.d.mts +1098 -0
- package/dist/interface-Ch8HU9uM.d.mts.map +1 -0
- package/dist/introspectionPlugin-rFdO8ZUa.mjs +54 -0
- package/dist/introspectionPlugin-rFdO8ZUa.mjs.map +1 -0
- package/dist/keys-BqNejWup.mjs +43 -0
- package/dist/keys-BqNejWup.mjs.map +1 -0
- package/dist/logger-Df2O2WsW.mjs +79 -0
- package/dist/logger-Df2O2WsW.mjs.map +1 -0
- package/dist/memory-cQgelFOj.mjs +144 -0
- package/dist/memory-cQgelFOj.mjs.map +1 -0
- package/dist/migrations/index.d.mts +157 -0
- package/dist/migrations/index.d.mts.map +1 -0
- package/dist/migrations/index.mjs +261 -0
- package/dist/migrations/index.mjs.map +1 -0
- package/dist/mongodb-BfJVlUJH.mjs +94 -0
- package/dist/mongodb-BfJVlUJH.mjs.map +1 -0
- package/dist/mongodb-CGzRbfAK.d.mts +119 -0
- package/dist/mongodb-CGzRbfAK.d.mts.map +1 -0
- package/dist/mongodb-JN-9JA7K.d.mts +72 -0
- package/dist/mongodb-JN-9JA7K.d.mts.map +1 -0
- package/dist/openapi-G3Cw7XuM.mjs +524 -0
- package/dist/openapi-G3Cw7XuM.mjs.map +1 -0
- package/dist/org/index.d.mts +69 -0
- package/dist/org/index.d.mts.map +1 -0
- package/dist/org/index.mjs +514 -0
- package/dist/org/index.mjs.map +1 -0
- package/dist/org/types.d.mts +83 -0
- package/dist/org/types.d.mts.map +1 -0
- package/dist/org/types.mjs +1 -0
- package/dist/permissions/index.d.mts +279 -0
- package/dist/permissions/index.d.mts.map +1 -0
- package/dist/permissions/index.mjs +579 -0
- package/dist/permissions/index.mjs.map +1 -0
- package/dist/plugins/index.d.mts +173 -0
- package/dist/plugins/index.d.mts.map +1 -0
- package/dist/plugins/index.mjs +523 -0
- package/dist/plugins/index.mjs.map +1 -0
- package/dist/plugins/response-cache.d.mts +88 -0
- package/dist/plugins/response-cache.d.mts.map +1 -0
- package/dist/plugins/response-cache.mjs +284 -0
- package/dist/plugins/response-cache.mjs.map +1 -0
- package/dist/plugins/tracing-entry.d.mts +2 -0
- package/dist/plugins/tracing-entry.mjs +186 -0
- package/dist/plugins/tracing-entry.mjs.map +1 -0
- package/dist/pluralize-CEweyOEm.mjs +87 -0
- package/dist/pluralize-CEweyOEm.mjs.map +1 -0
- package/dist/policies/{index.d.ts → index.d.mts} +204 -169
- package/dist/policies/index.d.mts.map +1 -0
- package/dist/policies/index.mjs +322 -0
- package/dist/policies/index.mjs.map +1 -0
- package/dist/presets/{index.d.ts → index.d.mts} +63 -131
- package/dist/presets/index.d.mts.map +1 -0
- package/dist/presets/index.mjs +144 -0
- package/dist/presets/index.mjs.map +1 -0
- package/dist/presets/multiTenant.d.mts +25 -0
- package/dist/presets/multiTenant.d.mts.map +1 -0
- package/dist/presets/multiTenant.mjs +114 -0
- package/dist/presets/multiTenant.mjs.map +1 -0
- package/dist/presets-BITljm96.mjs +120 -0
- package/dist/presets-BITljm96.mjs.map +1 -0
- package/dist/presets-DzSMwlKj.d.mts +58 -0
- package/dist/presets-DzSMwlKj.d.mts.map +1 -0
- package/dist/prisma-DJbMt3yf.mjs +628 -0
- package/dist/prisma-DJbMt3yf.mjs.map +1 -0
- package/dist/prisma-Dg9GoVdj.d.mts +275 -0
- package/dist/prisma-Dg9GoVdj.d.mts.map +1 -0
- package/dist/queryCachePlugin-7THaI5mt.d.mts +72 -0
- package/dist/queryCachePlugin-7THaI5mt.d.mts.map +1 -0
- package/dist/queryCachePlugin-DMBnp2Q0.mjs +139 -0
- package/dist/queryCachePlugin-DMBnp2Q0.mjs.map +1 -0
- package/dist/redis-D-JAeLtm.d.mts +50 -0
- package/dist/redis-D-JAeLtm.d.mts.map +1 -0
- package/dist/redis-stream-Bdh_vUU8.d.mts +104 -0
- package/dist/redis-stream-Bdh_vUU8.d.mts.map +1 -0
- package/dist/registry/index.d.mts +12 -0
- package/dist/registry/index.d.mts.map +1 -0
- package/dist/registry/index.mjs +4 -0
- package/dist/requestContext-QQD6ROJc.mjs +56 -0
- package/dist/requestContext-QQD6ROJc.mjs.map +1 -0
- package/dist/schemaConverter-BwrmWroW.mjs +99 -0
- package/dist/schemaConverter-BwrmWroW.mjs.map +1 -0
- package/dist/schemas/index.d.mts +64 -0
- package/dist/schemas/index.d.mts.map +1 -0
- package/dist/schemas/index.mjs +83 -0
- package/dist/schemas/index.mjs.map +1 -0
- package/dist/scope/index.d.mts +22 -0
- package/dist/scope/index.d.mts.map +1 -0
- package/dist/scope/index.mjs +66 -0
- package/dist/scope/index.mjs.map +1 -0
- package/dist/sessionManager-jPKLbHE0.d.mts +187 -0
- package/dist/sessionManager-jPKLbHE0.d.mts.map +1 -0
- package/dist/sse-B3c3_yZp.mjs +124 -0
- package/dist/sse-B3c3_yZp.mjs.map +1 -0
- package/dist/testing/index.d.mts +908 -0
- package/dist/testing/index.d.mts.map +1 -0
- package/dist/testing/index.mjs +1977 -0
- package/dist/testing/index.mjs.map +1 -0
- package/dist/tracing-Cc7vVQPp.d.mts +71 -0
- package/dist/tracing-Cc7vVQPp.d.mts.map +1 -0
- package/dist/typeGuards-DhMNLuvU.mjs +10 -0
- package/dist/typeGuards-DhMNLuvU.mjs.map +1 -0
- package/dist/types/index.d.mts +947 -0
- package/dist/types/index.d.mts.map +1 -0
- package/dist/types/index.mjs +15 -0
- package/dist/types/index.mjs.map +1 -0
- package/dist/types-Beqn1Un7.mjs +39 -0
- package/dist/types-Beqn1Un7.mjs.map +1 -0
- package/dist/types-CIgB7UUl.d.mts +446 -0
- package/dist/types-CIgB7UUl.d.mts.map +1 -0
- package/dist/types-aYB4V7uN.d.mts +87 -0
- package/dist/types-aYB4V7uN.d.mts.map +1 -0
- package/dist/utils/index.d.mts +748 -0
- package/dist/utils/index.d.mts.map +1 -0
- package/dist/utils/index.mjs +6 -0
- package/package.json +194 -68
- package/dist/BaseController-DVAiHxEQ.d.ts +0 -233
- package/dist/adapters/index.d.ts +0 -237
- package/dist/adapters/index.js +0 -668
- package/dist/arcCorePlugin-CsShQdyP.d.ts +0 -273
- package/dist/audit/index.d.ts +0 -195
- package/dist/audit/index.js +0 -319
- package/dist/auth/index.d.ts +0 -47
- package/dist/auth/index.js +0 -174
- package/dist/cli/commands/docs.d.ts +0 -11
- package/dist/cli/commands/docs.js +0 -474
- package/dist/cli/commands/generate.js +0 -334
- package/dist/cli/commands/introspect.d.ts +0 -8
- package/dist/cli/commands/introspect.js +0 -338
- package/dist/cli/index.d.ts +0 -4
- package/dist/cli/index.js +0 -3269
- package/dist/core/index.d.ts +0 -220
- package/dist/core/index.js +0 -2786
- package/dist/createApp-Ce9wl8W9.d.ts +0 -77
- package/dist/docs/index.d.ts +0 -166
- package/dist/docs/index.js +0 -658
- package/dist/errors-8WIxGS_6.d.ts +0 -122
- package/dist/events/index.d.ts +0 -117
- package/dist/events/index.js +0 -89
- package/dist/factory/index.d.ts +0 -38
- package/dist/factory/index.js +0 -1652
- package/dist/hooks/index.d.ts +0 -4
- package/dist/hooks/index.js +0 -199
- package/dist/idempotency/index.d.ts +0 -323
- package/dist/idempotency/index.js +0 -500
- package/dist/index-B4t03KQ0.d.ts +0 -1366
- package/dist/index.d.ts +0 -135
- package/dist/index.js +0 -4756
- package/dist/migrations/index.d.ts +0 -185
- package/dist/migrations/index.js +0 -274
- package/dist/org/index.d.ts +0 -129
- package/dist/org/index.js +0 -220
- package/dist/permissions/index.d.ts +0 -144
- package/dist/permissions/index.js +0 -103
- package/dist/plugins/index.d.ts +0 -46
- package/dist/plugins/index.js +0 -1069
- package/dist/policies/index.js +0 -196
- package/dist/presets/index.js +0 -384
- package/dist/presets/multiTenant.d.ts +0 -39
- package/dist/presets/multiTenant.js +0 -112
- package/dist/registry/index.d.ts +0 -16
- package/dist/registry/index.js +0 -253
- package/dist/testing/index.d.ts +0 -618
- package/dist/testing/index.js +0 -48020
- package/dist/types/index.d.ts +0 -4
- package/dist/types/index.js +0 -8
- package/dist/types-B99TBmFV.d.ts +0 -76
- package/dist/types-BvckRbs2.d.ts +0 -143
- package/dist/utils/index.d.ts +0 -679
- package/dist/utils/index.js +0 -931
|
@@ -1,130 +1,91 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Policy Interface
|
|
5
|
-
*
|
|
6
|
-
* Pluggable authorization interface for Arc.
|
|
7
|
-
* Apps implement this interface to define custom authorization strategies.
|
|
8
|
-
*
|
|
9
|
-
* @example RBAC Policy
|
|
10
|
-
* ```typescript
|
|
11
|
-
* class RBACPolicy implements PolicyEngine {
|
|
12
|
-
* can(user, operation, context) {
|
|
13
|
-
* return {
|
|
14
|
-
* allowed: user.roles.includes('admin'),
|
|
15
|
-
* reason: 'Admin role required',
|
|
16
|
-
* };
|
|
17
|
-
* }
|
|
18
|
-
* toMiddleware(operation) {
|
|
19
|
-
* return async (request, reply) => {
|
|
20
|
-
* const result = await this.can(request.user, operation);
|
|
21
|
-
* if (!result.allowed) {
|
|
22
|
-
* reply.code(403).send({ error: result.reason });
|
|
23
|
-
* }
|
|
24
|
-
* };
|
|
25
|
-
* }
|
|
26
|
-
* }
|
|
27
|
-
* ```
|
|
28
|
-
*
|
|
29
|
-
* @example ABAC (Attribute-Based) Policy
|
|
30
|
-
* ```typescript
|
|
31
|
-
* class ABACPolicy implements PolicyEngine {
|
|
32
|
-
* can(user, operation, context) {
|
|
33
|
-
* return {
|
|
34
|
-
* allowed: this.evaluateAttributes(user, operation, context),
|
|
35
|
-
* filters: { department: user.department },
|
|
36
|
-
* fieldMask: { exclude: ['salary', 'ssn'] },
|
|
37
|
-
* };
|
|
38
|
-
* }
|
|
39
|
-
* // ...
|
|
40
|
-
* }
|
|
41
|
-
* ```
|
|
42
|
-
*/
|
|
1
|
+
import { t as PermissionCheck } from "../types-aYB4V7uN.mjs";
|
|
2
|
+
import { FastifyReply, FastifyRequest } from "fastify";
|
|
43
3
|
|
|
4
|
+
//#region src/policies/PolicyInterface.d.ts
|
|
44
5
|
/**
|
|
45
6
|
* Policy result returned by can() method
|
|
46
7
|
*/
|
|
47
8
|
interface PolicyResult {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
9
|
+
/**
|
|
10
|
+
* Whether the operation is allowed
|
|
11
|
+
*/
|
|
12
|
+
allowed: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Human-readable reason if denied
|
|
15
|
+
* Returned in 403 error responses
|
|
16
|
+
*/
|
|
17
|
+
reason?: string;
|
|
18
|
+
/**
|
|
19
|
+
* Query filters to apply (for list operations)
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* // Multi-tenant filter
|
|
24
|
+
* { organizationId: user.organizationId }
|
|
25
|
+
*
|
|
26
|
+
* // Ownership filter
|
|
27
|
+
* { userId: user.id }
|
|
28
|
+
*
|
|
29
|
+
* // Complex filter
|
|
30
|
+
* { $or: [{ public: true }, { createdBy: user.id }] }
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
filters?: Record<string, any>;
|
|
34
|
+
/**
|
|
35
|
+
* Fields to include/exclude in response
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```typescript
|
|
39
|
+
* // Hide sensitive fields from non-admins
|
|
40
|
+
* { exclude: ['password', 'ssn', 'salary'] }
|
|
41
|
+
*
|
|
42
|
+
* // Only show specific fields
|
|
43
|
+
* { include: ['name', 'email', 'role'] }
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
fieldMask?: {
|
|
47
|
+
include?: string[];
|
|
48
|
+
exclude?: string[];
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Additional context for downstream middleware
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```typescript
|
|
55
|
+
* {
|
|
56
|
+
* auditLog: { action: 'read', resource: 'patient', userId: user.id },
|
|
57
|
+
* rateLimit: { tier: user.subscriptionTier },
|
|
58
|
+
* }
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
metadata?: Record<string, any>;
|
|
101
62
|
}
|
|
102
63
|
/**
|
|
103
64
|
* Policy context provided to can() method
|
|
104
65
|
*/
|
|
105
66
|
interface PolicyContext {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
67
|
+
/**
|
|
68
|
+
* The document being accessed (for update/delete/get)
|
|
69
|
+
* Populated by fetchDocument middleware
|
|
70
|
+
*/
|
|
71
|
+
document?: any;
|
|
72
|
+
/**
|
|
73
|
+
* Request body (for create/update)
|
|
74
|
+
*/
|
|
75
|
+
body?: any;
|
|
76
|
+
/**
|
|
77
|
+
* Request params (e.g., :id from route)
|
|
78
|
+
*/
|
|
79
|
+
params?: any;
|
|
80
|
+
/**
|
|
81
|
+
* Request query parameters
|
|
82
|
+
*/
|
|
83
|
+
query?: any;
|
|
84
|
+
/**
|
|
85
|
+
* Additional app-specific context
|
|
86
|
+
* Can include anything your policy needs to make decisions
|
|
87
|
+
*/
|
|
88
|
+
[key: string]: any;
|
|
128
89
|
}
|
|
129
90
|
/**
|
|
130
91
|
* Policy Engine Interface
|
|
@@ -212,48 +173,48 @@ interface PolicyContext {
|
|
|
212
173
|
* ```
|
|
213
174
|
*/
|
|
214
175
|
interface PolicyEngine {
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
176
|
+
/**
|
|
177
|
+
* Check if user can perform operation
|
|
178
|
+
*
|
|
179
|
+
* @param user - User object from request (request.user)
|
|
180
|
+
* @param operation - Operation name (list, get, create, update, delete, custom)
|
|
181
|
+
* @param context - Additional context (document, body, params, query, etc.)
|
|
182
|
+
* @returns Policy result with allowed/denied and optional filters/fieldMask
|
|
183
|
+
*
|
|
184
|
+
* @example
|
|
185
|
+
* ```typescript
|
|
186
|
+
* const result = await policy.can(request.user, 'update', {
|
|
187
|
+
* document: existingDocument,
|
|
188
|
+
* body: request.body,
|
|
189
|
+
* });
|
|
190
|
+
*
|
|
191
|
+
* if (!result.allowed) {
|
|
192
|
+
* throw new Error(result.reason);
|
|
193
|
+
* }
|
|
194
|
+
* ```
|
|
195
|
+
*/
|
|
196
|
+
can(user: any, operation: string, context?: PolicyContext): PolicyResult | Promise<PolicyResult>;
|
|
197
|
+
/**
|
|
198
|
+
* Generate Fastify middleware for this policy
|
|
199
|
+
*
|
|
200
|
+
* Called during route registration to create preHandler middleware.
|
|
201
|
+
* Middleware should:
|
|
202
|
+
* 1. Call can() with request context
|
|
203
|
+
* 2. Return 403 if denied
|
|
204
|
+
* 3. Attach result to request for downstream use
|
|
205
|
+
*
|
|
206
|
+
* @param operation - Operation name (list, get, create, update, delete)
|
|
207
|
+
* @returns Fastify preHandler middleware
|
|
208
|
+
*
|
|
209
|
+
* @example
|
|
210
|
+
* ```typescript
|
|
211
|
+
* const middleware = policy.toMiddleware('update');
|
|
212
|
+
* fastify.put('/products/:id', {
|
|
213
|
+
* preHandler: [authenticate, middleware],
|
|
214
|
+
* }, handler);
|
|
215
|
+
* ```
|
|
216
|
+
*/
|
|
217
|
+
toMiddleware(operation: string): (request: FastifyRequest, reply: FastifyReply) => Promise<void>;
|
|
257
218
|
}
|
|
258
219
|
/**
|
|
259
220
|
* Policy factory function signature
|
|
@@ -278,18 +239,91 @@ type PolicyFactory<TConfig = any> = (config: TConfig) => PolicyEngine;
|
|
|
278
239
|
/**
|
|
279
240
|
* Extended Fastify request with policy result
|
|
280
241
|
*/
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
242
|
+
/**
|
|
243
|
+
* Access control statement
|
|
244
|
+
*
|
|
245
|
+
* Maps to Better Auth's organization permission model
|
|
246
|
+
* where permissions are defined as resource + action pairs.
|
|
247
|
+
*/
|
|
248
|
+
interface AccessControlStatement {
|
|
249
|
+
/** Resource name (e.g., 'product', 'order') */
|
|
250
|
+
resource: string;
|
|
251
|
+
/** Allowed actions on this resource */
|
|
252
|
+
action: string[];
|
|
285
253
|
}
|
|
286
|
-
|
|
287
254
|
/**
|
|
288
|
-
*
|
|
255
|
+
* Options for createAccessControlPolicy
|
|
256
|
+
*/
|
|
257
|
+
interface AccessControlPolicyOptions {
|
|
258
|
+
/** Permission statements defining resource-action pairs */
|
|
259
|
+
statements: AccessControlStatement[];
|
|
260
|
+
/**
|
|
261
|
+
* Optional async permission check against external source (e.g., org role permissions).
|
|
262
|
+
* Called when the static statements allow the action — use this for dynamic checks
|
|
263
|
+
* like verifying the user's org role actually grants the permission.
|
|
264
|
+
*
|
|
265
|
+
* @param userId - ID of the user
|
|
266
|
+
* @param resource - Resource being accessed
|
|
267
|
+
* @param action - Action being performed
|
|
268
|
+
* @returns Whether the user has the permission
|
|
269
|
+
*/
|
|
270
|
+
checkPermission?: (userId: string, resource: string, action: string) => Promise<boolean>;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Create a PermissionCheck from access control statements.
|
|
289
274
|
*
|
|
290
|
-
*
|
|
275
|
+
* Maps Better Auth's statement-based access control model to Arc's
|
|
276
|
+
* PermissionCheck function, which can be used directly in resource permissions.
|
|
277
|
+
*
|
|
278
|
+
* The returned PermissionCheck:
|
|
279
|
+
* 1. Looks up the resource + action in the statements list
|
|
280
|
+
* 2. If no matching statement exists, denies access
|
|
281
|
+
* 3. If a matching statement exists and `checkPermission` is provided,
|
|
282
|
+
* calls it for dynamic verification (e.g., check org role)
|
|
283
|
+
* 4. If `checkPermission` is not provided, allows access based on static statements
|
|
284
|
+
*
|
|
285
|
+
* @example Static statements only
|
|
286
|
+
* ```typescript
|
|
287
|
+
* import { createAccessControlPolicy } from '@classytic/arc/policies';
|
|
288
|
+
*
|
|
289
|
+
* const editorPermissions = createAccessControlPolicy({
|
|
290
|
+
* statements: [
|
|
291
|
+
* { resource: 'product', action: ['create', 'update'] },
|
|
292
|
+
* { resource: 'order', action: ['read'] },
|
|
293
|
+
* ],
|
|
294
|
+
* });
|
|
295
|
+
*
|
|
296
|
+
* // Use in resource config
|
|
297
|
+
* defineResource({
|
|
298
|
+
* name: 'product',
|
|
299
|
+
* permissions: {
|
|
300
|
+
* create: editorPermissions,
|
|
301
|
+
* update: editorPermissions,
|
|
302
|
+
* },
|
|
303
|
+
* });
|
|
304
|
+
* ```
|
|
305
|
+
*
|
|
306
|
+
* @example With dynamic permission check (Better Auth org roles)
|
|
307
|
+
* ```typescript
|
|
308
|
+
* const policy = createAccessControlPolicy({
|
|
309
|
+
* statements: [
|
|
310
|
+
* { resource: 'product', action: ['create', 'update'] },
|
|
311
|
+
* { resource: 'order', action: ['read'] },
|
|
312
|
+
* ],
|
|
313
|
+
* checkPermission: async (userId, resource, action) => {
|
|
314
|
+
* return hasOrgPermission(userId, resource, action);
|
|
315
|
+
* },
|
|
316
|
+
* });
|
|
317
|
+
* ```
|
|
291
318
|
*/
|
|
292
|
-
|
|
319
|
+
declare function createAccessControlPolicy(options: AccessControlPolicyOptions): PermissionCheck;
|
|
320
|
+
declare module 'fastify' {
|
|
321
|
+
interface FastifyRequest {
|
|
322
|
+
policyResult?: PolicyResult;
|
|
323
|
+
}
|
|
324
|
+
} //# sourceMappingURL=PolicyInterface.d.ts.map
|
|
325
|
+
//#endregion
|
|
326
|
+
//#region src/policies/helpers.d.ts
|
|
293
327
|
/**
|
|
294
328
|
* Helper to create Fastify middleware from any PolicyEngine implementation
|
|
295
329
|
*
|
|
@@ -394,5 +428,6 @@ declare function allowAll(): PolicyEngine;
|
|
|
394
428
|
* ```
|
|
395
429
|
*/
|
|
396
430
|
declare function denyAll(reason?: string): PolicyEngine;
|
|
397
|
-
|
|
398
|
-
export { type PolicyContext, type PolicyEngine, type PolicyFactory, type PolicyResult, allowAll, anyPolicy, combinePolicies, createPolicyMiddleware, denyAll };
|
|
431
|
+
//#endregion
|
|
432
|
+
export { type AccessControlPolicyOptions, type AccessControlStatement, type PolicyContext, type PolicyEngine, type PolicyFactory, type PolicyResult, allowAll, anyPolicy, combinePolicies, createAccessControlPolicy, createPolicyMiddleware, denyAll };
|
|
433
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/policies/PolicyInterface.ts","../../src/policies/helpers.ts"],"mappings":";;;;;;;UA+CiB,YAAA;EAyMb;;;EArMF,OAAA;EA4NA;;;;EAtNA,MAAA;EAwN6B;;;;AAsB/B;;;;;;;;;;AAWA;EAxOE,OAAA,GAAU,MAAA;;;;AAkPZ;;;;;;;;;EApOE,SAAA;IACE,OAAA;IACA,OAAA;EAAA;EAiSY;;;;;;;;;AAmDf;;EAtUC,QAAA,GAAW,MAAA;AAAA;;;;UAMI,aAAA;EAoUc;;;;EA/T7B,QAAA;ECnFc;;;EDwFd,IAAA;ECrFW;;;ED0FX,MAAA;EC1F0D;;;ED+F1D,KAAA;EC/FW;;;;EAAA,CDqGV,GAAA;AAAA;;AC5BH;;;;;;;;;AA4HA;;;;;;;;;AA2FA;;;;;AA6BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UDhIiB,YAAA;;;;;;;;;;;;;;;;;;;;;EAqBf,GAAA,CACE,IAAA,OACA,SAAA,UACA,OAAA,GAAU,aAAA,GACT,YAAA,GAAe,OAAA,CAAQ,YAAA;;;;;;;;;;;;;;;;;;;;;EAsB1B,YAAA,CACE,SAAA,YACE,OAAA,EAAS,cAAA,EAAgB,KAAA,EAAO,YAAA,KAAiB,OAAA;AAAA;;;;;;;;;;;;;;;;;;;;KAsB3C,aAAA,mBAAgC,MAAA,EAAQ,OAAA,KAAY,YAAA;;;;;;;;;;UAW/C,sBAAA;;EAEf,QAAA;;EAEA,MAAA;AAAA;;;;UAMe,0BAAA;;EAEf,UAAA,EAAY,sBAAA;;;;;;;;;;;EAWZ,eAAA,IAAmB,MAAA,UAAgB,QAAA,UAAkB,MAAA,aAAmB,OAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAkD1D,yBAAA,CACd,OAAA,EAAS,0BAAA,GACR,eAAA;AAAA;EAAA,UAoDS,cAAA;IACR,YAAA,GAAe,YAAA;EAAA;AAAA;;;;;;;;;;;;;;;AApUnB;;;;;;;;;;;iBC9EgB,sBAAA,CACd,MAAA,EAAQ,YAAA,EACR,SAAA,YACE,OAAA,EAAS,cAAA,EAAgB,KAAA,EAAO,YAAA,KAAiB,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ADoQrD;iBC3LgB,eAAA,CAAA,GAAmB,QAAA,EAAU,YAAA,KAAiB,YAAA;;;;;;;;;ADsM9D;;;;;AAUA;;;;;;;iBCpFgB,SAAA,CAAA,GAAa,QAAA,EAAU,YAAA,KAAiB,YAAA;;;;;;ADmJxD;;;;;;;iBCxDgB,QAAA,CAAA,GAAY,YAAA;;AD2G3B;;;;;;;;;;;;;AC9YD;iBAgUgB,OAAA,CAAQ,MAAA,YAAmC,YAAA"}
|