@classytic/arc 2.1.2 → 2.1.7
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 +6 -5
- package/bin/arc.js +1 -0
- package/dist/{EventTransport-BD2U0BTc.d.mts → EventTransport-BkUDYZEb.d.mts} +1 -2
- package/dist/HookSystem-BsGV-j2l.mjs +1 -2
- package/dist/{ResourceRegistry-DsN4KJjV.mjs → ResourceRegistry-7Ic20ZMw.mjs} +1 -2
- package/dist/adapters/index.d.mts +4 -4
- package/dist/audit/index.d.mts +5 -6
- package/dist/audit/index.mjs +2 -3
- package/dist/audit/mongodb.d.mts +4 -4
- package/dist/audit/mongodb.mjs +1 -1
- package/dist/{audited-C3T5DTUx.mjs → audited-CGdLiSlE.mjs} +1 -2
- package/dist/auth/index.d.mts +6 -7
- package/dist/auth/index.mjs +10 -16
- package/dist/auth/redis-session.d.mts +2 -3
- package/dist/auth/redis-session.mjs +1 -2
- package/dist/{betterAuthOpenApi-BrHKeSAx.mjs → betterAuthOpenApi-DjWDddNc.mjs} +2 -3
- package/dist/cache/index.d.mts +3 -4
- package/dist/cache/index.mjs +4 -5
- package/dist/{caching-Bl28lYsR.mjs → caching-GSDJcA6-.mjs} +1 -2
- package/dist/{circuitBreaker-DeY4FCjs.mjs → circuitBreaker-DYhWBW_D.mjs} +1 -2
- package/dist/cli/commands/describe.d.mts +1 -2
- package/dist/cli/commands/describe.mjs +1 -2
- package/dist/cli/commands/docs.d.mts +1 -2
- package/dist/cli/commands/docs.mjs +3 -4
- package/dist/cli/commands/generate.d.mts +6 -2
- package/dist/cli/commands/generate.mjs +89 -58
- package/dist/cli/commands/init.d.mts +1 -2
- package/dist/cli/commands/init.mjs +15 -19
- package/dist/cli/commands/introspect.d.mts +1 -2
- package/dist/cli/commands/introspect.mjs +2 -3
- package/dist/cli/index.d.mts +1 -2
- package/dist/cli/index.mjs +1 -2
- package/dist/constants-DdXFXQtN.mjs +1 -2
- package/dist/core/index.d.mts +4 -4
- package/dist/core/index.mjs +1 -1
- package/dist/{createApp-CUgNqegw.mjs → createApp-D2D5XXaV.mjs} +9 -10
- package/dist/{defineResource-k0_BDn8v.mjs → defineResource-DZVbwsFb.mjs} +17 -39
- package/dist/discovery/index.d.mts +1 -2
- package/dist/discovery/index.mjs +1 -2
- package/dist/docs/index.d.mts +5 -6
- package/dist/docs/index.mjs +5 -4
- package/dist/{elevation-B_2dRLVP.d.mts → elevation-DGo5shaX.d.mts} +1 -2
- package/dist/{elevation-BRy3yFWT.mjs → elevation-DSTbVvYj.mjs} +4 -4
- package/dist/{errorHandler-C1okiriz.mjs → errorHandler-C3GY3_ow.mjs} +2 -3
- package/dist/{errorHandler-BbcgBmIH.d.mts → errorHandler-CW3OOeYq.d.mts} +2 -3
- package/dist/{errors-ChKiFz62.d.mts → errors-DAWRdiYP.d.mts} +1 -2
- package/dist/{errors-B9bZok84.mjs → errors-DBANPbGr.mjs} +1 -2
- package/dist/{eventPlugin-DGR_B2on.mjs → eventPlugin-BEOvaDqo.mjs} +2 -3
- package/dist/{eventPlugin-CTrLH3mt.d.mts → eventPlugin-H6wDDjGO.d.mts} +2 -3
- package/dist/events/index.d.mts +4 -5
- package/dist/events/index.mjs +2 -3
- package/dist/events/transports/redis-stream-entry.d.mts +1 -1
- package/dist/events/transports/redis-stream-entry.mjs +1 -2
- package/dist/events/transports/redis.d.mts +2 -3
- package/dist/events/transports/redis.mjs +1 -2
- package/dist/{externalPaths-DlINfKbP.d.mts → externalPaths-SyPF2tgK.d.mts} +1 -2
- package/dist/factory/index.d.mts +8 -9
- package/dist/factory/index.mjs +1 -1
- package/dist/{fastifyAdapter-BkrGrlFi.d.mts → fastifyAdapter-sGkvUvf5.d.mts} +4 -5
- package/dist/{fields-DyaDVX4J.d.mts → fields-Bi_AVKSo.d.mts} +2 -3
- package/dist/{fields-iagOozy0.mjs → fields-CTd_CrKr.mjs} +2 -3
- package/dist/hooks/index.d.mts +3 -3
- package/dist/idempotency/index.d.mts +4 -5
- package/dist/idempotency/index.mjs +1 -2
- package/dist/idempotency/mongodb.d.mts +1 -1
- package/dist/idempotency/mongodb.mjs +1 -2
- package/dist/idempotency/redis.d.mts +1 -1
- package/dist/idempotency/redis.mjs +1 -2
- package/dist/index.d.mts +9 -10
- package/dist/index.mjs +7 -8
- package/dist/integrations/event-gateway.d.mts +2 -3
- package/dist/integrations/event-gateway.mjs +2 -3
- package/dist/integrations/jobs.d.mts +1 -2
- package/dist/integrations/jobs.mjs +1 -2
- package/dist/integrations/streamline.d.mts +1 -2
- package/dist/integrations/streamline.mjs +1 -2
- package/dist/integrations/websocket.d.mts +1 -2
- package/dist/integrations/websocket.mjs +1 -2
- package/dist/{interface-B01JvPVc.d.mts → interface-CSNjltAc.d.mts} +1 -2
- package/dist/{interface-Ch8HU9uM.d.mts → interface-Cb2klgid.d.mts} +10 -10
- package/dist/{interface-CZe8IkMf.d.mts → interface-DTbsvIWe.d.mts} +1 -2
- package/dist/{introspectionPlugin-rFdO8ZUa.mjs → introspectionPlugin-B3JkrjwU.mjs} +1 -2
- package/dist/{keys-BqNejWup.mjs → keys-DhqDRxv3.mjs} +1 -2
- package/dist/{logger-Df2O2WsW.mjs → logger-ByrvQWZO.mjs} +1 -2
- package/dist/{memory-cQgelFOj.mjs → memory-B2v7KrCB.mjs} +1 -2
- package/dist/migrations/index.d.mts +1 -2
- package/dist/migrations/index.mjs +1 -2
- package/dist/{mongodb-CGzRbfAK.d.mts → mongodb-ClykrfGo.d.mts} +2 -3
- package/dist/{mongodb-BfJVlUJH.mjs → mongodb-DNKEExbf.mjs} +1 -2
- package/dist/{mongodb-JN-9JA7K.d.mts → mongodb-Dg8O_gvd.d.mts} +2 -3
- package/dist/{openapi-G3Cw7XuM.mjs → openapi-9nB_kiuR.mjs} +5 -4
- package/dist/org/index.d.mts +4 -5
- package/dist/org/index.mjs +1 -2
- package/dist/org/types.d.mts +1 -2
- package/dist/permissions/index.d.mts +5 -6
- package/dist/permissions/index.mjs +7 -7
- package/dist/plugins/index.d.mts +7 -8
- package/dist/plugins/index.mjs +7 -8
- package/dist/plugins/response-cache.d.mts +1 -2
- package/dist/plugins/response-cache.mjs +2 -3
- package/dist/plugins/tracing-entry.d.mts +1 -1
- package/dist/plugins/tracing-entry.mjs +1 -2
- package/dist/{pluralize-CEweyOEm.mjs → pluralize-CM-jZg7p.mjs} +1 -2
- package/dist/policies/index.d.mts +4 -5
- package/dist/policies/index.mjs +1 -2
- package/dist/presets/index.d.mts +4 -5
- package/dist/presets/index.mjs +2 -3
- package/dist/presets/multiTenant.d.mts +4 -5
- package/dist/presets/multiTenant.mjs +1 -2
- package/dist/{presets-DzSMwlKj.d.mts → presets-BTeYbw7h.d.mts} +2 -3
- package/dist/{presets-BITljm96.mjs → presets-CeFtfDR8.mjs} +1 -2
- package/dist/prisma-DJbMt3yf.mjs +1 -2
- package/dist/{prisma-Dg9GoVdj.d.mts → prisma-DQBSSHAB.d.mts} +2 -3
- package/dist/{queryCachePlugin-DMBnp2Q0.mjs → queryCachePlugin-B6R0d4av.mjs} +4 -5
- package/dist/{queryCachePlugin-7THaI5mt.d.mts → queryCachePlugin-Q6SYuHZ6.d.mts} +2 -3
- package/dist/{redis-D-JAeLtm.d.mts → redis-UwjEp8Ea.d.mts} +2 -3
- package/dist/{redis-stream-Bdh_vUU8.d.mts → redis-stream-CBg0upHI.d.mts} +2 -3
- package/dist/registry/index.d.mts +4 -5
- package/dist/registry/index.mjs +2 -2
- package/dist/{requestContext-QQD6ROJc.mjs → requestContext-xi6OKBL-.mjs} +1 -2
- package/dist/{schemaConverter-BwrmWroW.mjs → schemaConverter-Dtg0Kt9T.mjs} +1 -2
- package/dist/schemas/index.d.mts +1 -2
- package/dist/schemas/index.mjs +1 -2
- package/dist/scope/index.d.mts +2 -3
- package/dist/scope/index.mjs +2 -3
- package/dist/{sessionManager-jPKLbHE0.d.mts → sessionManager-D_iEHjQl.d.mts} +1 -2
- package/dist/{sse-B3c3_yZp.mjs → sse-DkqQ1uxb.mjs} +2 -3
- package/dist/testing/index.d.mts +8 -9
- package/dist/testing/index.mjs +3 -4
- package/dist/{tracing-Cc7vVQPp.d.mts → tracing-8CEbhF0w.d.mts} +1 -2
- package/dist/{typeGuards-DhMNLuvU.mjs → typeGuards-DwxA1t_L.mjs} +1 -2
- package/dist/types/index.d.mts +7 -8
- package/dist/types/index.mjs +1 -2
- package/dist/{types-CIgB7UUl.d.mts → types-B0dhNrnd.d.mts} +9 -10
- package/dist/types-Beqn1Un7.mjs +1 -2
- package/dist/types-DelU6kln.mjs +25 -0
- package/dist/{types-aYB4V7uN.d.mts → types-RLkFVgaw.d.mts} +18 -4
- package/dist/utils/index.d.mts +5 -6
- package/dist/utils/index.mjs +4 -4
- package/package.json +1 -1
- package/dist/EventTransport-BD2U0BTc.d.mts.map +0 -1
- package/dist/HookSystem-BsGV-j2l.mjs.map +0 -1
- package/dist/ResourceRegistry-DsN4KJjV.mjs.map +0 -1
- package/dist/audit/index.d.mts.map +0 -1
- package/dist/audit/index.mjs.map +0 -1
- package/dist/audited-C3T5DTUx.mjs.map +0 -1
- package/dist/auth/index.d.mts.map +0 -1
- package/dist/auth/index.mjs.map +0 -1
- package/dist/auth/redis-session.d.mts.map +0 -1
- package/dist/auth/redis-session.mjs.map +0 -1
- package/dist/betterAuthOpenApi-BrHKeSAx.mjs.map +0 -1
- package/dist/cache/index.d.mts.map +0 -1
- package/dist/cache/index.mjs.map +0 -1
- package/dist/caching-Bl28lYsR.mjs.map +0 -1
- package/dist/circuitBreaker-DeY4FCjs.mjs.map +0 -1
- package/dist/cli/commands/describe.d.mts.map +0 -1
- package/dist/cli/commands/describe.mjs.map +0 -1
- package/dist/cli/commands/docs.d.mts.map +0 -1
- package/dist/cli/commands/docs.mjs.map +0 -1
- package/dist/cli/commands/generate.d.mts.map +0 -1
- package/dist/cli/commands/generate.mjs.map +0 -1
- package/dist/cli/commands/init.d.mts.map +0 -1
- package/dist/cli/commands/init.mjs.map +0 -1
- package/dist/cli/commands/introspect.d.mts.map +0 -1
- package/dist/cli/commands/introspect.mjs.map +0 -1
- package/dist/cli/index.d.mts.map +0 -1
- package/dist/cli/index.mjs.map +0 -1
- package/dist/constants-DdXFXQtN.mjs.map +0 -1
- package/dist/createApp-CUgNqegw.mjs.map +0 -1
- package/dist/defineResource-k0_BDn8v.mjs.map +0 -1
- package/dist/discovery/index.d.mts.map +0 -1
- package/dist/discovery/index.mjs.map +0 -1
- package/dist/docs/index.d.mts.map +0 -1
- package/dist/docs/index.mjs.map +0 -1
- package/dist/elevation-BRy3yFWT.mjs.map +0 -1
- package/dist/elevation-B_2dRLVP.d.mts.map +0 -1
- package/dist/errorHandler-BbcgBmIH.d.mts.map +0 -1
- package/dist/errorHandler-C1okiriz.mjs.map +0 -1
- package/dist/errors-B9bZok84.mjs.map +0 -1
- package/dist/errors-ChKiFz62.d.mts.map +0 -1
- package/dist/eventPlugin-CTrLH3mt.d.mts.map +0 -1
- package/dist/eventPlugin-DGR_B2on.mjs.map +0 -1
- package/dist/events/index.d.mts.map +0 -1
- package/dist/events/index.mjs.map +0 -1
- package/dist/events/transports/redis-stream-entry.mjs.map +0 -1
- package/dist/events/transports/redis.d.mts.map +0 -1
- package/dist/events/transports/redis.mjs.map +0 -1
- package/dist/externalPaths-DlINfKbP.d.mts.map +0 -1
- package/dist/factory/index.d.mts.map +0 -1
- package/dist/fastifyAdapter-BkrGrlFi.d.mts.map +0 -1
- package/dist/fields-DyaDVX4J.d.mts.map +0 -1
- package/dist/fields-iagOozy0.mjs.map +0 -1
- package/dist/idempotency/index.d.mts.map +0 -1
- package/dist/idempotency/index.mjs.map +0 -1
- package/dist/idempotency/mongodb.mjs.map +0 -1
- package/dist/idempotency/redis.mjs.map +0 -1
- package/dist/index.d.mts.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/integrations/event-gateway.d.mts.map +0 -1
- package/dist/integrations/event-gateway.mjs.map +0 -1
- package/dist/integrations/jobs.d.mts.map +0 -1
- package/dist/integrations/jobs.mjs.map +0 -1
- package/dist/integrations/streamline.d.mts.map +0 -1
- package/dist/integrations/streamline.mjs.map +0 -1
- package/dist/integrations/websocket.d.mts.map +0 -1
- package/dist/integrations/websocket.mjs.map +0 -1
- package/dist/interface-B01JvPVc.d.mts.map +0 -1
- package/dist/interface-CZe8IkMf.d.mts.map +0 -1
- package/dist/interface-Ch8HU9uM.d.mts.map +0 -1
- package/dist/introspectionPlugin-rFdO8ZUa.mjs.map +0 -1
- package/dist/keys-BqNejWup.mjs.map +0 -1
- package/dist/logger-Df2O2WsW.mjs.map +0 -1
- package/dist/memory-cQgelFOj.mjs.map +0 -1
- package/dist/migrations/index.d.mts.map +0 -1
- package/dist/migrations/index.mjs.map +0 -1
- package/dist/mongodb-BfJVlUJH.mjs.map +0 -1
- package/dist/mongodb-CGzRbfAK.d.mts.map +0 -1
- package/dist/mongodb-JN-9JA7K.d.mts.map +0 -1
- package/dist/openapi-G3Cw7XuM.mjs.map +0 -1
- package/dist/org/index.d.mts.map +0 -1
- package/dist/org/index.mjs.map +0 -1
- package/dist/org/types.d.mts.map +0 -1
- package/dist/permissions/index.d.mts.map +0 -1
- package/dist/permissions/index.mjs.map +0 -1
- package/dist/plugins/index.d.mts.map +0 -1
- package/dist/plugins/index.mjs.map +0 -1
- package/dist/plugins/response-cache.d.mts.map +0 -1
- package/dist/plugins/response-cache.mjs.map +0 -1
- package/dist/plugins/tracing-entry.mjs.map +0 -1
- package/dist/pluralize-CEweyOEm.mjs.map +0 -1
- package/dist/policies/index.d.mts.map +0 -1
- package/dist/policies/index.mjs.map +0 -1
- package/dist/presets/index.d.mts.map +0 -1
- package/dist/presets/index.mjs.map +0 -1
- package/dist/presets/multiTenant.d.mts.map +0 -1
- package/dist/presets/multiTenant.mjs.map +0 -1
- package/dist/presets-BITljm96.mjs.map +0 -1
- package/dist/presets-DzSMwlKj.d.mts.map +0 -1
- package/dist/prisma-DJbMt3yf.mjs.map +0 -1
- package/dist/prisma-Dg9GoVdj.d.mts.map +0 -1
- package/dist/queryCachePlugin-7THaI5mt.d.mts.map +0 -1
- package/dist/queryCachePlugin-DMBnp2Q0.mjs.map +0 -1
- package/dist/redis-D-JAeLtm.d.mts.map +0 -1
- package/dist/redis-stream-Bdh_vUU8.d.mts.map +0 -1
- package/dist/registry/index.d.mts.map +0 -1
- package/dist/requestContext-QQD6ROJc.mjs.map +0 -1
- package/dist/schemaConverter-BwrmWroW.mjs.map +0 -1
- package/dist/schemas/index.d.mts.map +0 -1
- package/dist/schemas/index.mjs.map +0 -1
- package/dist/scope/index.d.mts.map +0 -1
- package/dist/scope/index.mjs.map +0 -1
- package/dist/sessionManager-jPKLbHE0.d.mts.map +0 -1
- package/dist/sse-B3c3_yZp.mjs.map +0 -1
- package/dist/testing/index.d.mts.map +0 -1
- package/dist/testing/index.mjs.map +0 -1
- package/dist/tracing-Cc7vVQPp.d.mts.map +0 -1
- package/dist/typeGuards-DhMNLuvU.mjs.map +0 -1
- package/dist/types/index.d.mts.map +0 -1
- package/dist/types/index.mjs.map +0 -1
- package/dist/types-Beqn1Un7.mjs.map +0 -1
- package/dist/types-CIgB7UUl.d.mts.map +0 -1
- package/dist/types-aYB4V7uN.d.mts.map +0 -1
- package/dist/utils/index.d.mts.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { t as __exportAll } from "./chunk-C7Uep-_p.mjs";
|
|
2
|
-
import { i as versionKey, r as tagVersionKey } from "./keys-
|
|
3
|
-
import { t as hasEvents } from "./typeGuards-
|
|
4
|
-
import { t as MemoryCacheStore } from "./memory-
|
|
2
|
+
import { i as versionKey, r as tagVersionKey } from "./keys-DhqDRxv3.mjs";
|
|
3
|
+
import { t as hasEvents } from "./typeGuards-DwxA1t_L.mjs";
|
|
4
|
+
import { t as MemoryCacheStore } from "./memory-B2v7KrCB.mjs";
|
|
5
5
|
import fp from "fastify-plugin";
|
|
6
6
|
|
|
7
7
|
//#region src/cache/QueryCache.ts
|
|
@@ -135,5 +135,4 @@ const queryCachePlugin = fp(queryCachePluginImpl, {
|
|
|
135
135
|
});
|
|
136
136
|
|
|
137
137
|
//#endregion
|
|
138
|
-
export { queryCachePlugin_exports as n, QueryCache as r, queryCachePlugin as t };
|
|
139
|
-
//# sourceMappingURL=queryCachePlugin-DMBnp2Q0.mjs.map
|
|
138
|
+
export { queryCachePlugin_exports as n, QueryCache as r, queryCachePlugin as t };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as CacheStore } from "./interface-
|
|
1
|
+
import { i as CacheStore } from "./interface-DTbsvIWe.mjs";
|
|
2
2
|
import { FastifyPluginAsync } from "fastify";
|
|
3
3
|
|
|
4
4
|
//#region src/cache/QueryCache.d.ts
|
|
@@ -68,5 +68,4 @@ declare module 'fastify' {
|
|
|
68
68
|
}
|
|
69
69
|
declare const queryCachePlugin: FastifyPluginAsync<QueryCachePluginOptions>;
|
|
70
70
|
//#endregion
|
|
71
|
-
export { CacheEnvelope as a, QueryCache as c, queryCachePlugin as i, QueryCacheConfig as l, QueryCacheDefaults as n, CacheResult as o, QueryCachePluginOptions as r, CacheStatus as s, CrossResourceRule as t };
|
|
72
|
-
//# sourceMappingURL=queryCachePlugin-7THaI5mt.d.mts.map
|
|
71
|
+
export { CacheEnvelope as a, QueryCache as c, queryCachePlugin as i, QueryCacheConfig as l, QueryCacheDefaults as n, CacheResult as o, QueryCachePluginOptions as r, CacheStatus as s, CrossResourceRule as t };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as IdempotencyResult, r as IdempotencyStore } from "./interface-
|
|
1
|
+
import { n as IdempotencyResult, r as IdempotencyStore } from "./interface-CSNjltAc.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/idempotency/stores/redis.d.ts
|
|
4
4
|
interface RedisClient {
|
|
@@ -46,5 +46,4 @@ declare class RedisIdempotencyStore implements IdempotencyStore {
|
|
|
46
46
|
close(): Promise<void>;
|
|
47
47
|
}
|
|
48
48
|
//#endregion
|
|
49
|
-
export { RedisIdempotencyStore as n, RedisIdempotencyStoreOptions as r, RedisClient as t };
|
|
50
|
-
//# sourceMappingURL=redis-D-JAeLtm.d.mts.map
|
|
49
|
+
export { RedisIdempotencyStore as n, RedisIdempotencyStoreOptions as r, RedisClient as t };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as EventTransport, n as EventHandler, r as EventLogger, t as DomainEvent } from "./EventTransport-
|
|
1
|
+
import { i as EventTransport, n as EventHandler, r as EventLogger, t as DomainEvent } from "./EventTransport-BkUDYZEb.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/events/transports/redis-stream.d.ts
|
|
4
4
|
interface RedisStreamLike {
|
|
@@ -100,5 +100,4 @@ declare class RedisStreamTransport implements EventTransport {
|
|
|
100
100
|
private sleep;
|
|
101
101
|
}
|
|
102
102
|
//#endregion
|
|
103
|
-
export { RedisStreamTransport as n, RedisStreamTransportOptions as r, RedisStreamLike as t };
|
|
104
|
-
//# sourceMappingURL=redis-stream-Bdh_vUU8.d.mts.map
|
|
103
|
+
export { RedisStreamTransport as n, RedisStreamTransportOptions as r, RedisStreamLike as t };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import "../elevation-
|
|
2
|
-
import { C as RegisterOptions, w as ResourceRegistry } from "../interface-
|
|
3
|
-
import "../types-
|
|
1
|
+
import "../elevation-DGo5shaX.mjs";
|
|
2
|
+
import { C as RegisterOptions, w as ResourceRegistry } from "../interface-Cb2klgid.mjs";
|
|
3
|
+
import "../types-RLkFVgaw.mjs";
|
|
4
4
|
import { IntrospectionPluginOptions } from "../types/index.mjs";
|
|
5
5
|
import { FastifyPluginAsync } from "fastify";
|
|
6
6
|
|
|
@@ -8,5 +8,4 @@ import { FastifyPluginAsync } from "fastify";
|
|
|
8
8
|
declare const introspectionPlugin: FastifyPluginAsync<IntrospectionPluginOptions>;
|
|
9
9
|
declare const _default: FastifyPluginAsync<IntrospectionPluginOptions>;
|
|
10
10
|
//#endregion
|
|
11
|
-
export { type IntrospectionPluginOptions, type RegisterOptions, ResourceRegistry, _default as introspectionPlugin, introspectionPlugin as introspectionPluginFn };
|
|
12
|
-
//# sourceMappingURL=index.d.mts.map
|
|
11
|
+
export { type IntrospectionPluginOptions, type RegisterOptions, ResourceRegistry, _default as introspectionPlugin, introspectionPlugin as introspectionPluginFn };
|
package/dist/registry/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as ResourceRegistry } from "../ResourceRegistry-
|
|
2
|
-
import { n as introspectionPlugin_default, t as introspectionPlugin } from "../introspectionPlugin-
|
|
1
|
+
import { t as ResourceRegistry } from "../ResourceRegistry-7Ic20ZMw.mjs";
|
|
2
|
+
import { n as introspectionPlugin_default, t as introspectionPlugin } from "../introspectionPlugin-B3JkrjwU.mjs";
|
|
3
3
|
|
|
4
4
|
export { ResourceRegistry, introspectionPlugin_default as introspectionPlugin, introspectionPlugin as introspectionPluginFn };
|
|
@@ -95,5 +95,4 @@ function convertRouteSchema(schema) {
|
|
|
95
95
|
}
|
|
96
96
|
|
|
97
97
|
//#endregion
|
|
98
|
-
export { toJsonSchema as a, isZodSchema as i, convertRouteSchema as n, isJsonSchema as r, convertOpenApiSchemas as t };
|
|
99
|
-
//# sourceMappingURL=schemaConverter-BwrmWroW.mjs.map
|
|
98
|
+
export { toJsonSchema as a, isZodSchema as i, convertRouteSchema as n, isJsonSchema as r, convertOpenApiSchemas as t };
|
package/dist/schemas/index.d.mts
CHANGED
|
@@ -60,5 +60,4 @@ declare function ArcPaginationQuery(): _sinclair_typebox0.TObject<{
|
|
|
60
60
|
populate: _sinclair_typebox0.TOptional<_sinclair_typebox0.TString>;
|
|
61
61
|
}>;
|
|
62
62
|
//#endregion
|
|
63
|
-
export { ArcDeleteResponse, ArcErrorResponse, ArcItemResponse, ArcListResponse, ArcMutationResponse, ArcPaginationQuery, type FastifyPluginAsyncTypebox, type FastifyPluginCallbackTypebox, type Static, type TObject, type TSchema, Type, type TypeBoxTypeProvider, TypeBoxValidatorCompiler };
|
|
64
|
-
//# sourceMappingURL=index.d.mts.map
|
|
63
|
+
export { ArcDeleteResponse, ArcErrorResponse, ArcItemResponse, ArcListResponse, ArcMutationResponse, ArcPaginationQuery, type FastifyPluginAsyncTypebox, type FastifyPluginCallbackTypebox, type Static, type TObject, type TSchema, Type, type TypeBoxTypeProvider, TypeBoxValidatorCompiler };
|
package/dist/schemas/index.mjs
CHANGED
|
@@ -79,5 +79,4 @@ function ArcPaginationQuery() {
|
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
//#endregion
|
|
82
|
-
export { ArcDeleteResponse, ArcErrorResponse, ArcItemResponse, ArcListResponse, ArcMutationResponse, ArcPaginationQuery, Type, TypeBoxValidatorCompiler };
|
|
83
|
-
//# sourceMappingURL=index.mjs.map
|
|
82
|
+
export { ArcDeleteResponse, ArcErrorResponse, ArcItemResponse, ArcListResponse, ArcMutationResponse, ArcPaginationQuery, Type, TypeBoxValidatorCompiler };
|
package/dist/scope/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as AUTHENTICATED_SCOPE, c as getOrgId, d as hasOrgAccess, f as isAuthenticated, i as elevationPlugin, l as getOrgRoles, m as isMember, n as ElevationOptions, o as PUBLIC_SCOPE, p as isElevated, r as _default, s as RequestScope, t as ElevationEvent, u as getTeamId } from "../elevation-
|
|
1
|
+
import { a as AUTHENTICATED_SCOPE, c as getOrgId, d as hasOrgAccess, f as isAuthenticated, i as elevationPlugin, l as getOrgRoles, m as isMember, n as ElevationOptions, o as PUBLIC_SCOPE, p as isElevated, r as _default, s as RequestScope, t as ElevationEvent, u as getTeamId } from "../elevation-DGo5shaX.mjs";
|
|
2
2
|
import { FastifyReply, FastifyRequest } from "fastify";
|
|
3
3
|
|
|
4
4
|
//#region src/scope/resolveOrgFromHeader.d.ts
|
|
@@ -18,5 +18,4 @@ interface ResolveOrgFromHeaderOptions {
|
|
|
18
18
|
*/
|
|
19
19
|
declare function resolveOrgFromHeader(options: ResolveOrgFromHeaderOptions): (request: FastifyRequest, reply: FastifyReply) => Promise<void>;
|
|
20
20
|
//#endregion
|
|
21
|
-
export { AUTHENTICATED_SCOPE, type ElevationEvent, type ElevationOptions, PUBLIC_SCOPE, type RequestScope, type ResolveOrgFromHeaderOptions, _default as elevationPlugin, elevationPlugin as elevationPluginFn, getOrgId, getOrgRoles, getTeamId, hasOrgAccess, isAuthenticated, isElevated, isMember, resolveOrgFromHeader };
|
|
22
|
-
//# sourceMappingURL=index.d.mts.map
|
|
21
|
+
export { AUTHENTICATED_SCOPE, type ElevationEvent, type ElevationOptions, PUBLIC_SCOPE, type RequestScope, type ResolveOrgFromHeaderOptions, _default as elevationPlugin, elevationPlugin as elevationPluginFn, getOrgId, getOrgRoles, getTeamId, hasOrgAccess, isAuthenticated, isElevated, isMember, resolveOrgFromHeader };
|
package/dist/scope/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { a as getTeamId, c as isElevated, i as getOrgRoles, l as isMember, n as PUBLIC_SCOPE, o as hasOrgAccess, r as getOrgId, s as isAuthenticated, t as AUTHENTICATED_SCOPE } from "../types-Beqn1Un7.mjs";
|
|
2
|
-
import { n as elevation_default, t as elevationPlugin } from "../elevation-
|
|
2
|
+
import { n as elevation_default, t as elevationPlugin } from "../elevation-DSTbVvYj.mjs";
|
|
3
3
|
|
|
4
4
|
//#region src/scope/resolveOrgFromHeader.ts
|
|
5
5
|
/**
|
|
@@ -62,5 +62,4 @@ function resolveOrgFromHeader(options) {
|
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
//#endregion
|
|
65
|
-
export { AUTHENTICATED_SCOPE, PUBLIC_SCOPE, elevation_default as elevationPlugin, elevationPlugin as elevationPluginFn, getOrgId, getOrgRoles, getTeamId, hasOrgAccess, isAuthenticated, isElevated, isMember, resolveOrgFromHeader };
|
|
66
|
-
//# sourceMappingURL=index.mjs.map
|
|
65
|
+
export { AUTHENTICATED_SCOPE, PUBLIC_SCOPE, elevation_default as elevationPlugin, elevationPlugin as elevationPluginFn, getOrgId, getOrgRoles, getTeamId, hasOrgAccess, isAuthenticated, isElevated, isMember, resolveOrgFromHeader };
|
|
@@ -183,5 +183,4 @@ declare class MemorySessionStore implements SessionStore {
|
|
|
183
183
|
*/
|
|
184
184
|
declare function createSessionManager(options: SessionManagerOptions): SessionManagerResult;
|
|
185
185
|
//#endregion
|
|
186
|
-
export { SessionManagerOptions as a, createSessionManager as c, SessionData as i, MemorySessionStoreOptions as n, SessionManagerResult as o, SessionCookieOptions as r, SessionStore as s, MemorySessionStore as t };
|
|
187
|
-
//# sourceMappingURL=sessionManager-jPKLbHE0.d.mts.map
|
|
186
|
+
export { SessionManagerOptions as a, createSessionManager as c, SessionData as i, MemorySessionStoreOptions as n, SessionManagerResult as o, SessionCookieOptions as r, SessionStore as s, MemorySessionStore as t };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as __exportAll } from "./chunk-C7Uep-_p.mjs";
|
|
2
2
|
import { n as PUBLIC_SCOPE, r as getOrgId } from "./types-Beqn1Un7.mjs";
|
|
3
|
-
import { t as arcLog } from "./logger-
|
|
3
|
+
import { t as arcLog } from "./logger-ByrvQWZO.mjs";
|
|
4
4
|
import fp from "fastify-plugin";
|
|
5
5
|
|
|
6
6
|
//#region src/plugins/sse.ts
|
|
@@ -120,5 +120,4 @@ var sse_default = fp(ssePlugin, {
|
|
|
120
120
|
});
|
|
121
121
|
|
|
122
122
|
//#endregion
|
|
123
|
-
export { sse_default as n, sse_exports as r, ssePlugin as t };
|
|
124
|
-
//# sourceMappingURL=sse-B3c3_yZp.mjs.map
|
|
123
|
+
export { sse_default as n, sse_exports as r, ssePlugin as t };
|
package/dist/testing/index.d.mts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import "../elevation-
|
|
2
|
-
import { D as CrudRepository, T as ResourceDefinition } from "../interface-
|
|
3
|
-
import "../types-
|
|
1
|
+
import "../elevation-DGo5shaX.mjs";
|
|
2
|
+
import { D as CrudRepository, T as ResourceDefinition } from "../interface-Cb2klgid.mjs";
|
|
3
|
+
import "../types-RLkFVgaw.mjs";
|
|
4
4
|
import { AnyRecord } from "../types/index.mjs";
|
|
5
|
-
import "../queryCachePlugin-
|
|
6
|
-
import "../eventPlugin-
|
|
7
|
-
import "../errorHandler-
|
|
8
|
-
import { r as CreateAppOptions } from "../types-
|
|
5
|
+
import "../queryCachePlugin-Q6SYuHZ6.mjs";
|
|
6
|
+
import "../eventPlugin-H6wDDjGO.mjs";
|
|
7
|
+
import "../errorHandler-CW3OOeYq.mjs";
|
|
8
|
+
import { r as CreateAppOptions } from "../types-B0dhNrnd.mjs";
|
|
9
9
|
import Fastify, { FastifyInstance } from "fastify";
|
|
10
10
|
import { Mock } from "vitest";
|
|
11
11
|
import { Connection } from "mongoose";
|
|
@@ -904,5 +904,4 @@ declare class DatabaseSnapshot {
|
|
|
904
904
|
clear(): void;
|
|
905
905
|
}
|
|
906
906
|
//#endregion
|
|
907
|
-
export { type AuthProvider, type AuthResponse, type BetterAuthTestHelpers, type BetterAuthTestHelpersOptions, type CreateTestAppOptions, DatabaseSnapshot, TestFixtures as DbTestFixtures, type GenerateTestFileOptions, HttpTestHarness, type HttpTestHarnessOptions, InMemoryDatabase, type OrgResponse, type SetupBetterAuthOrgOptions, type SetupUserConfig, type TestAppResult, TestDataLoader, TestDatabase, type TestFixtures$1 as TestFixtures, TestHarness, type TestHarnessOptions, type TestOrgContext, TestRequestBuilder, TestSeeder, TestTransaction, type TestUserContext, createBetterAuthProvider, createBetterAuthTestHelpers, createConfigTestSuite, createDataFactory, createHttpTestHarness, createJwtAuthProvider, createMinimalTestApp, createMockController, createMockReply, createMockRepository, createMockRequest, createMockUser, createSnapshotMatcher, createSpy, createTestApp, createTestAuth, createTestHarness, createTestTimer, generateTestFile, request, safeParseBody, setupBetterAuthOrg, waitFor, withTestDb };
|
|
908
|
-
//# sourceMappingURL=index.d.mts.map
|
|
907
|
+
export { type AuthProvider, type AuthResponse, type BetterAuthTestHelpers, type BetterAuthTestHelpersOptions, type CreateTestAppOptions, DatabaseSnapshot, TestFixtures as DbTestFixtures, type GenerateTestFileOptions, HttpTestHarness, type HttpTestHarnessOptions, InMemoryDatabase, type OrgResponse, type SetupBetterAuthOrgOptions, type SetupUserConfig, type TestAppResult, TestDataLoader, TestDatabase, type TestFixtures$1 as TestFixtures, TestHarness, type TestHarnessOptions, type TestOrgContext, TestRequestBuilder, TestSeeder, TestTransaction, type TestUserContext, createBetterAuthProvider, createBetterAuthTestHelpers, createConfigTestSuite, createDataFactory, createHttpTestHarness, createJwtAuthProvider, createMinimalTestApp, createMockController, createMockReply, createMockRepository, createMockRequest, createMockUser, createSnapshotMatcher, createSpy, createTestApp, createTestAuth, createTestHarness, createTestTimer, generateTestFile, request, safeParseBody, setupBetterAuthOrg, waitFor, withTestDb };
|
package/dist/testing/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as CRUD_OPERATIONS } from "../constants-DdXFXQtN.mjs";
|
|
2
|
-
import { n as applyFieldWritePermissions, t as applyFieldReadPermissions } from "../fields-
|
|
2
|
+
import { n as applyFieldWritePermissions, t as applyFieldReadPermissions } from "../fields-CTd_CrKr.mjs";
|
|
3
3
|
import Fastify from "fastify";
|
|
4
4
|
import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
|
|
5
5
|
import mongoose, { Model } from "mongoose";
|
|
@@ -1000,7 +1000,7 @@ var DatabaseSnapshot = class {
|
|
|
1000
1000
|
* ```
|
|
1001
1001
|
*/
|
|
1002
1002
|
async function createTestApp(options = {}) {
|
|
1003
|
-
const { createApp } = await import("../createApp-
|
|
1003
|
+
const { createApp } = await import("../createApp-D2D5XXaV.mjs").then((n) => n.r);
|
|
1004
1004
|
const { useInMemoryDb = true, mongoUri: providedMongoUri, ...appOptions } = options;
|
|
1005
1005
|
const defaultAuth = {
|
|
1006
1006
|
type: "jwt",
|
|
@@ -1973,5 +1973,4 @@ function createHttpTestHarness(resource, optionsOrGetter) {
|
|
|
1973
1973
|
}
|
|
1974
1974
|
|
|
1975
1975
|
//#endregion
|
|
1976
|
-
export { DatabaseSnapshot, TestFixtures as DbTestFixtures, HttpTestHarness, InMemoryDatabase, TestDataLoader, TestDatabase, TestHarness, TestRequestBuilder, TestSeeder, TestTransaction, createBetterAuthProvider, createBetterAuthTestHelpers, createConfigTestSuite, createDataFactory, createHttpTestHarness, createJwtAuthProvider, createMinimalTestApp, createMockController, createMockReply, createMockRepository, createMockRequest, createMockUser, createSnapshotMatcher, createSpy, createTestApp, createTestAuth, createTestHarness, createTestTimer, generateTestFile, request, safeParseBody, setupBetterAuthOrg, waitFor, withTestDb };
|
|
1977
|
-
//# sourceMappingURL=index.mjs.map
|
|
1976
|
+
export { DatabaseSnapshot, TestFixtures as DbTestFixtures, HttpTestHarness, InMemoryDatabase, TestDataLoader, TestDatabase, TestHarness, TestRequestBuilder, TestSeeder, TestTransaction, createBetterAuthProvider, createBetterAuthTestHelpers, createConfigTestSuite, createDataFactory, createHttpTestHarness, createJwtAuthProvider, createMinimalTestApp, createMockController, createMockReply, createMockRepository, createMockRequest, createMockUser, createSnapshotMatcher, createSpy, createTestApp, createTestAuth, createTestHarness, createTestTimer, generateTestFile, request, safeParseBody, setupBetterAuthOrg, waitFor, withTestDb };
|
|
@@ -67,5 +67,4 @@ declare function traced(spanName?: string): (target: any, propertyKey: string, d
|
|
|
67
67
|
declare function isTracingAvailable(): boolean;
|
|
68
68
|
declare const _default: typeof tracingPlugin;
|
|
69
69
|
//#endregion
|
|
70
|
-
export { traced as a, isTracingAvailable as i, _default as n, createSpan as r, TracingOptions as t };
|
|
71
|
-
//# sourceMappingURL=tracing-Cc7vVQPp.d.mts.map
|
|
70
|
+
export { traced as a, isTracingAvailable as i, _default as n, createSpan as r, TracingOptions as t };
|
package/dist/types/index.d.mts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { a as AUTHENTICATED_SCOPE, c as getOrgId, d as hasOrgAccess, f as isAuthenticated, l as getOrgRoles, m as isMember, n as ElevationOptions, o as PUBLIC_SCOPE, p as isElevated, s as RequestScope, t as ElevationEvent, u as getTeamId } from "../elevation-
|
|
2
|
-
import { A as PaginationParams, D as CrudRepository, I as PipelineConfig, K as HookSystem, O as InferDoc, S as RouteHandler, _ as ControllerLike, b as IControllerResponse, g as ControllerHandler, j as QueryOptions, k as PaginatedResult, l as BaseControllerOptions, n as DataAdapter, v as FastifyHandler, w as ResourceRegistry, x as IRequestContext, y as IController } from "../interface-
|
|
3
|
-
import { n as FieldPermissionMap } from "../fields-
|
|
4
|
-
import { i as UserBase, n as PermissionContext, r as PermissionResult, t as PermissionCheck } from "../types-
|
|
1
|
+
import { a as AUTHENTICATED_SCOPE, c as getOrgId, d as hasOrgAccess, f as isAuthenticated, l as getOrgRoles, m as isMember, n as ElevationOptions, o as PUBLIC_SCOPE, p as isElevated, s as RequestScope, t as ElevationEvent, u as getTeamId } from "../elevation-DGo5shaX.mjs";
|
|
2
|
+
import { A as PaginationParams, D as CrudRepository, I as PipelineConfig, K as HookSystem, O as InferDoc, S as RouteHandler, _ as ControllerLike, b as IControllerResponse, g as ControllerHandler, j as QueryOptions, k as PaginatedResult, l as BaseControllerOptions, n as DataAdapter, v as FastifyHandler, w as ResourceRegistry, x as IRequestContext, y as IController } from "../interface-Cb2klgid.mjs";
|
|
3
|
+
import { n as FieldPermissionMap } from "../fields-Bi_AVKSo.mjs";
|
|
4
|
+
import { i as UserBase, n as PermissionContext, r as PermissionResult, t as PermissionCheck } from "../types-RLkFVgaw.mjs";
|
|
5
5
|
import { FastifyInstance, FastifyReply, FastifyRequest, RouteHandlerMethod, RouteHandlerMethod as RouteHandlerMethod$1 } from "fastify";
|
|
6
6
|
import { Types } from "mongoose";
|
|
7
7
|
|
|
@@ -363,7 +363,7 @@ interface ResourceConfig<TDoc = AnyRecord> {
|
|
|
363
363
|
* Override to match your schema: 'workspaceId', 'tenantId', 'teamId', etc.
|
|
364
364
|
* Takes effect when org context is present (via multiTenant preset).
|
|
365
365
|
*/
|
|
366
|
-
tenantField?: string;
|
|
366
|
+
tenantField?: string | false;
|
|
367
367
|
/**
|
|
368
368
|
* Primary key field name (default: '_id').
|
|
369
369
|
* Override for non-MongoDB adapters (e.g., 'id' for SQL databases).
|
|
@@ -649,7 +649,7 @@ interface TokenPair {
|
|
|
649
649
|
* const tokens = fastify.auth.issueTokens({
|
|
650
650
|
* id: user._id,
|
|
651
651
|
* email: user.email,
|
|
652
|
-
*
|
|
652
|
+
* role: user.role,
|
|
653
653
|
* });
|
|
654
654
|
*
|
|
655
655
|
* return { success: true, ...tokens, user };
|
|
@@ -943,5 +943,4 @@ type TypedResourceConfig<TDoc> = ResourceConfig<TDoc>;
|
|
|
943
943
|
type TypedController<TDoc> = IController<TDoc>;
|
|
944
944
|
type TypedRepository<TDoc> = CrudRepository<TDoc>;
|
|
945
945
|
//#endregion
|
|
946
|
-
export { AUTHENTICATED_SCOPE, AdditionalRoute, AnyRecord, ApiResponse, ArcDecorator, ArcInternalMetadata, AuthHelpers, AuthPluginOptions, Authenticator, AuthenticatorContext, type BaseControllerOptions, ConfigError, type ControllerHandler, type ControllerLike, ControllerQueryOptions, CrudController, type CrudRepository, CrudRouteKey, CrudRouterOptions, CrudSchemas, type ElevationEvent, type ElevationOptions, EventDefinition, EventsDecorator, type FastifyHandler, FastifyRequestExtras, FastifyWithAuth, FastifyWithDecorators, FieldRule, GracefulShutdownOptions, HealthCheck, HealthOptions, type IController, type IControllerResponse, type IRequestContext, InferAdapterDoc, type InferDoc, InferDocType, InferResourceDoc, IntrospectionData, IntrospectionPluginOptions, JWTPayload, JwtContext, MiddlewareConfig, MiddlewareHandler, ObjectId, OpenApiSchemas, OwnershipCheck, PUBLIC_SCOPE, type PaginatedResult, type PaginationParams, ParsedQuery, type PermissionCheck, type PermissionContext, type PermissionResult, PopulateOption, PresetFunction, PresetHook, PresetResult, type QueryOptions, QueryParserInterface, RateLimitConfig, RegistryEntry, RegistryStats, RequestContext, RequestIdOptions, type RequestScope, RequestWithExtras, ResourceCacheConfig, ResourceConfig, ResourceHooks, ResourceMetadata, ResourcePermissions, type RouteHandler, type RouteHandlerMethod, RouteSchemaOptions, ServiceContext, TokenPair, TypedController, TypedRepository, TypedResourceConfig, type UserBase, UserLike, UserOrganization, ValidateOptions, ValidationResult, getOrgId, getOrgRoles, getTeamId, getUserId, hasOrgAccess, isAuthenticated, isElevated, isMember };
|
|
947
|
-
//# sourceMappingURL=index.d.mts.map
|
|
946
|
+
export { AUTHENTICATED_SCOPE, AdditionalRoute, AnyRecord, ApiResponse, ArcDecorator, ArcInternalMetadata, AuthHelpers, AuthPluginOptions, Authenticator, AuthenticatorContext, type BaseControllerOptions, ConfigError, type ControllerHandler, type ControllerLike, ControllerQueryOptions, CrudController, type CrudRepository, CrudRouteKey, CrudRouterOptions, CrudSchemas, type ElevationEvent, type ElevationOptions, EventDefinition, EventsDecorator, type FastifyHandler, FastifyRequestExtras, FastifyWithAuth, FastifyWithDecorators, FieldRule, GracefulShutdownOptions, HealthCheck, HealthOptions, type IController, type IControllerResponse, type IRequestContext, InferAdapterDoc, type InferDoc, InferDocType, InferResourceDoc, IntrospectionData, IntrospectionPluginOptions, JWTPayload, JwtContext, MiddlewareConfig, MiddlewareHandler, ObjectId, OpenApiSchemas, OwnershipCheck, PUBLIC_SCOPE, type PaginatedResult, type PaginationParams, ParsedQuery, type PermissionCheck, type PermissionContext, type PermissionResult, PopulateOption, PresetFunction, PresetHook, PresetResult, type QueryOptions, QueryParserInterface, RateLimitConfig, RegistryEntry, RegistryStats, RequestContext, RequestIdOptions, type RequestScope, RequestWithExtras, ResourceCacheConfig, ResourceConfig, ResourceHooks, ResourceMetadata, ResourcePermissions, type RouteHandler, type RouteHandlerMethod, RouteSchemaOptions, ServiceContext, TokenPair, TypedController, TypedRepository, TypedResourceConfig, type UserBase, UserLike, UserOrganization, ValidateOptions, ValidationResult, getOrgId, getOrgRoles, getTeamId, getUserId, hasOrgAccess, isAuthenticated, isElevated, isMember };
|
package/dist/types/index.mjs
CHANGED
|
@@ -11,5 +11,4 @@ function getUserId(user) {
|
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
//#endregion
|
|
14
|
-
export { AUTHENTICATED_SCOPE, PUBLIC_SCOPE, getOrgId, getOrgRoles, getTeamId, getUserId, hasOrgAccess, isAuthenticated, isElevated, isMember };
|
|
15
|
-
//# sourceMappingURL=index.mjs.map
|
|
14
|
+
export { AUTHENTICATED_SCOPE, PUBLIC_SCOPE, getOrgId, getOrgRoles, getTeamId, getUserId, hasOrgAccess, isAuthenticated, isElevated, isMember };
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { n as ElevationOptions } from "./elevation-
|
|
1
|
+
import { n as ElevationOptions } from "./elevation-DGo5shaX.mjs";
|
|
2
2
|
import { Authenticator } from "./types/index.mjs";
|
|
3
|
-
import { t as ExternalOpenApiPaths } from "./externalPaths-
|
|
4
|
-
import { i as CacheStore } from "./interface-
|
|
5
|
-
import { r as QueryCachePluginOptions } from "./queryCachePlugin-
|
|
6
|
-
import { i as EventTransport } from "./EventTransport-
|
|
7
|
-
import { t as EventPluginOptions } from "./eventPlugin-
|
|
8
|
-
import { o as CachingOptions, r as SSEOptions, t as ErrorHandlerOptions } from "./errorHandler-
|
|
9
|
-
import { r as IdempotencyStore } from "./interface-
|
|
3
|
+
import { t as ExternalOpenApiPaths } from "./externalPaths-SyPF2tgK.mjs";
|
|
4
|
+
import { i as CacheStore } from "./interface-DTbsvIWe.mjs";
|
|
5
|
+
import { r as QueryCachePluginOptions } from "./queryCachePlugin-Q6SYuHZ6.mjs";
|
|
6
|
+
import { i as EventTransport } from "./EventTransport-BkUDYZEb.mjs";
|
|
7
|
+
import { t as EventPluginOptions } from "./eventPlugin-H6wDDjGO.mjs";
|
|
8
|
+
import { o as CachingOptions, r as SSEOptions, t as ErrorHandlerOptions } from "./errorHandler-CW3OOeYq.mjs";
|
|
9
|
+
import { r as IdempotencyStore } from "./interface-CSNjltAc.mjs";
|
|
10
10
|
import { FastifyInstance, FastifyPluginAsync, FastifyReply, FastifyRequest, FastifyServerOptions } from "fastify";
|
|
11
11
|
import { FastifyCorsOptions } from "@fastify/cors";
|
|
12
12
|
import { FastifyHelmetOptions } from "@fastify/helmet";
|
|
@@ -442,5 +442,4 @@ interface RawBodyOptions {
|
|
|
442
442
|
runFirst?: boolean;
|
|
443
443
|
}
|
|
444
444
|
//#endregion
|
|
445
|
-
export { CustomPluginAuthOption as a, RawBodyOptions as c, CustomAuthenticatorOption as i, UnderPressureOptions as l, BetterAuthOption as n, JwtAuthOption as o, CreateAppOptions as r, MultipartOptions as s, AuthOption as t };
|
|
446
|
-
//# sourceMappingURL=types-CIgB7UUl.d.mts.map
|
|
445
|
+
export { CustomPluginAuthOption as a, RawBodyOptions as c, CustomAuthenticatorOption as i, UnderPressureOptions as l, BetterAuthOption as n, JwtAuthOption as o, CreateAppOptions as r, MultipartOptions as s, AuthOption as t };
|
package/dist/types-Beqn1Un7.mjs
CHANGED
|
@@ -35,5 +35,4 @@ const PUBLIC_SCOPE = Object.freeze({ kind: "public" });
|
|
|
35
35
|
const AUTHENTICATED_SCOPE = Object.freeze({ kind: "authenticated" });
|
|
36
36
|
|
|
37
37
|
//#endregion
|
|
38
|
-
export { getTeamId as a, isElevated as c, getOrgRoles as i, isMember as l, PUBLIC_SCOPE as n, hasOrgAccess as o, getOrgId as r, isAuthenticated as s, AUTHENTICATED_SCOPE as t };
|
|
39
|
-
//# sourceMappingURL=types-Beqn1Un7.mjs.map
|
|
38
|
+
export { getTeamId as a, isElevated as c, getOrgRoles as i, isMember as l, PUBLIC_SCOPE as n, hasOrgAccess as o, getOrgId as r, isAuthenticated as s, AUTHENTICATED_SCOPE as t };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
//#region src/permissions/types.ts
|
|
2
|
+
/**
|
|
3
|
+
* Extract normalized roles from a user object.
|
|
4
|
+
*
|
|
5
|
+
* Reads `user.role` which can be:
|
|
6
|
+
* - A comma-separated string: `"superadmin,user"` (Better Auth admin plugin)
|
|
7
|
+
* - A string array: `["admin", "user"]` (JWT / custom auth)
|
|
8
|
+
* - A single string: `"admin"`
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Normalize a raw role value (string, comma-separated string, or array) into a string[].
|
|
12
|
+
* Shared low-level helper used by both getUserRoles() and the Better Auth adapter.
|
|
13
|
+
*/
|
|
14
|
+
function normalizeRoles(value) {
|
|
15
|
+
if (Array.isArray(value)) return value.map((r) => String(r).trim()).filter(Boolean);
|
|
16
|
+
if (typeof value === "string" && value.length > 0) return value.split(",").map((r) => r.trim()).filter(Boolean);
|
|
17
|
+
return [];
|
|
18
|
+
}
|
|
19
|
+
function getUserRoles(user) {
|
|
20
|
+
if (!user) return [];
|
|
21
|
+
return normalizeRoles(user.role);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
//#endregion
|
|
25
|
+
export { normalizeRoles as n, getUserRoles as t };
|
|
@@ -8,9 +8,24 @@ import { FastifyRequest } from "fastify";
|
|
|
8
8
|
interface UserBase {
|
|
9
9
|
id?: string;
|
|
10
10
|
_id?: string;
|
|
11
|
-
roles
|
|
11
|
+
/** User roles — string (comma-separated), string[], or undefined. Matches Better Auth's admin plugin pattern. */
|
|
12
|
+
role?: string | string[];
|
|
12
13
|
[key: string]: unknown;
|
|
13
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Extract normalized roles from a user object.
|
|
17
|
+
*
|
|
18
|
+
* Reads `user.role` which can be:
|
|
19
|
+
* - A comma-separated string: `"superadmin,user"` (Better Auth admin plugin)
|
|
20
|
+
* - A string array: `["admin", "user"]` (JWT / custom auth)
|
|
21
|
+
* - A single string: `"admin"`
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* Normalize a raw role value (string, comma-separated string, or array) into a string[].
|
|
25
|
+
* Shared low-level helper used by both getUserRoles() and the Better Auth adapter.
|
|
26
|
+
*/
|
|
27
|
+
declare function normalizeRoles(value: unknown): string[];
|
|
28
|
+
declare function getUserRoles(user: UserBase | null | undefined): string[];
|
|
14
29
|
/**
|
|
15
30
|
* Context passed to permission check functions
|
|
16
31
|
*/
|
|
@@ -50,7 +65,7 @@ interface PermissionResult {
|
|
|
50
65
|
* @example
|
|
51
66
|
* ```typescript
|
|
52
67
|
* // Simple boolean return
|
|
53
|
-
* const isAdmin: PermissionCheck = (ctx) => ctx.user
|
|
68
|
+
* const isAdmin: PermissionCheck = (ctx) => getUserRoles(ctx.user).includes('admin');
|
|
54
69
|
*
|
|
55
70
|
* // With filters for ownership
|
|
56
71
|
* const ownedByUser: PermissionCheck = (ctx) => ({
|
|
@@ -83,5 +98,4 @@ interface PermissionCheckMeta {
|
|
|
83
98
|
_teamPermission?: string;
|
|
84
99
|
}
|
|
85
100
|
//#endregion
|
|
86
|
-
export { UserBase as i, PermissionContext as n, PermissionResult as r, PermissionCheck as t };
|
|
87
|
-
//# sourceMappingURL=types-aYB4V7uN.d.mts.map
|
|
101
|
+
export { getUserRoles as a, UserBase as i, PermissionContext as n, normalizeRoles as o, PermissionResult as r, PermissionCheck as t };
|
package/dist/utils/index.d.mts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import "../elevation-
|
|
2
|
-
import "../interface-
|
|
3
|
-
import "../types-
|
|
1
|
+
import "../elevation-DGo5shaX.mjs";
|
|
2
|
+
import "../interface-Cb2klgid.mjs";
|
|
3
|
+
import "../types-RLkFVgaw.mjs";
|
|
4
4
|
import { AnyRecord, OpenApiSchemas, ParsedQuery, QueryParserInterface } from "../types/index.mjs";
|
|
5
|
-
import { a as NotFoundError, c as RateLimitError, d as ValidationError, f as createError, i as ForbiddenError, l as ServiceUnavailableError, n as ConflictError, o as OrgAccessDeniedError, p as isArcError, r as ErrorDetails, s as OrgRequiredError, t as ArcError, u as UnauthorizedError } from "../errors-
|
|
5
|
+
import { a as NotFoundError, c as RateLimitError, d as ValidationError, f as createError, i as ForbiddenError, l as ServiceUnavailableError, n as ConflictError, o as OrgAccessDeniedError, p as isArcError, r as ErrorDetails, s as OrgRequiredError, t as ArcError, u as UnauthorizedError } from "../errors-DAWRdiYP.mjs";
|
|
6
6
|
import { FastifyInstance } from "fastify";
|
|
7
7
|
|
|
8
8
|
//#region src/utils/responseSchemas.d.ts
|
|
@@ -744,5 +744,4 @@ declare function convertOpenApiSchemas(schemas: OpenApiSchemas): OpenApiSchemas;
|
|
|
744
744
|
*/
|
|
745
745
|
declare function convertRouteSchema(schema: Record<string, unknown>): Record<string, unknown>;
|
|
746
746
|
//#endregion
|
|
747
|
-
export { ArcError, ArcQueryParser, type ArcQueryParserOptions, CircuitBreaker, CircuitBreakerError, type CircuitBreakerOptions, CircuitBreakerRegistry, type CircuitBreakerStats, CircuitState, ConflictError, type ErrorDetails, type EventsDecorator, ForbiddenError, type JsonSchema, NotFoundError, OrgAccessDeniedError, OrgRequiredError, RateLimitError, ServiceUnavailableError, type StateMachine, type TransitionConfig, UnauthorizedError, ValidationError, convertOpenApiSchemas, convertRouteSchema, createCircuitBreaker, createCircuitBreakerRegistry, createError, createQueryParser, createStateMachine, deleteResponse, errorResponseSchema, getDefaultCrudSchemas, getListQueryParams, hasEvents, isArcError, isJsonSchema, isZodSchema, itemResponse, itemWrapper, listResponse, messageWrapper, mutationResponse, paginateWrapper, paginationSchema, queryParams, responses, successResponseSchema, toJsonSchema, wrapResponse };
|
|
748
|
-
//# sourceMappingURL=index.d.mts.map
|
|
747
|
+
export { ArcError, ArcQueryParser, type ArcQueryParserOptions, CircuitBreaker, CircuitBreakerError, type CircuitBreakerOptions, CircuitBreakerRegistry, type CircuitBreakerStats, CircuitState, ConflictError, type ErrorDetails, type EventsDecorator, ForbiddenError, type JsonSchema, NotFoundError, OrgAccessDeniedError, OrgRequiredError, RateLimitError, ServiceUnavailableError, type StateMachine, type TransitionConfig, UnauthorizedError, ValidationError, convertOpenApiSchemas, convertRouteSchema, createCircuitBreaker, createCircuitBreakerRegistry, createError, createQueryParser, createStateMachine, deleteResponse, errorResponseSchema, getDefaultCrudSchemas, getListQueryParams, hasEvents, isArcError, isJsonSchema, isZodSchema, itemResponse, itemWrapper, listResponse, messageWrapper, mutationResponse, paginateWrapper, paginationSchema, queryParams, responses, successResponseSchema, toJsonSchema, wrapResponse };
|
package/dist/utils/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { C as ArcQueryParser, S as wrapResponse, _ as paginateWrapper, a as createCircuitBreaker, b as responses, c as deleteResponse, d as getListQueryParams, f as itemResponse, g as mutationResponse, h as messageWrapper, i as CircuitState, l as errorResponseSchema, m as listResponse, n as CircuitBreakerError, o as createCircuitBreakerRegistry, p as itemWrapper, r as CircuitBreakerRegistry, s as createStateMachine, t as CircuitBreaker, u as getDefaultCrudSchemas, v as paginationSchema, w as createQueryParser, x as successResponseSchema, y as queryParams } from "../circuitBreaker-
|
|
2
|
-
import { a as OrgAccessDeniedError, c as ServiceUnavailableError, d as createError, f as isArcError, i as NotFoundError, l as UnauthorizedError, n as ConflictError, o as OrgRequiredError, r as ForbiddenError, s as RateLimitError, t as ArcError, u as ValidationError } from "../errors-
|
|
3
|
-
import { t as hasEvents } from "../typeGuards-
|
|
4
|
-
import { a as toJsonSchema, i as isZodSchema, n as convertRouteSchema, r as isJsonSchema, t as convertOpenApiSchemas } from "../schemaConverter-
|
|
1
|
+
import { C as ArcQueryParser, S as wrapResponse, _ as paginateWrapper, a as createCircuitBreaker, b as responses, c as deleteResponse, d as getListQueryParams, f as itemResponse, g as mutationResponse, h as messageWrapper, i as CircuitState, l as errorResponseSchema, m as listResponse, n as CircuitBreakerError, o as createCircuitBreakerRegistry, p as itemWrapper, r as CircuitBreakerRegistry, s as createStateMachine, t as CircuitBreaker, u as getDefaultCrudSchemas, v as paginationSchema, w as createQueryParser, x as successResponseSchema, y as queryParams } from "../circuitBreaker-DYhWBW_D.mjs";
|
|
2
|
+
import { a as OrgAccessDeniedError, c as ServiceUnavailableError, d as createError, f as isArcError, i as NotFoundError, l as UnauthorizedError, n as ConflictError, o as OrgRequiredError, r as ForbiddenError, s as RateLimitError, t as ArcError, u as ValidationError } from "../errors-DBANPbGr.mjs";
|
|
3
|
+
import { t as hasEvents } from "../typeGuards-DwxA1t_L.mjs";
|
|
4
|
+
import { a as toJsonSchema, i as isZodSchema, n as convertRouteSchema, r as isJsonSchema, t as convertOpenApiSchemas } from "../schemaConverter-Dtg0Kt9T.mjs";
|
|
5
5
|
|
|
6
6
|
export { ArcError, ArcQueryParser, CircuitBreaker, CircuitBreakerError, CircuitBreakerRegistry, CircuitState, ConflictError, ForbiddenError, NotFoundError, OrgAccessDeniedError, OrgRequiredError, RateLimitError, ServiceUnavailableError, UnauthorizedError, ValidationError, convertOpenApiSchemas, convertRouteSchema, createCircuitBreaker, createCircuitBreakerRegistry, createError, createQueryParser, createStateMachine, deleteResponse, errorResponseSchema, getDefaultCrudSchemas, getListQueryParams, hasEvents, isArcError, isJsonSchema, isZodSchema, itemResponse, itemWrapper, listResponse, messageWrapper, mutationResponse, paginateWrapper, paginationSchema, queryParams, responses, successResponseSchema, toJsonSchema, wrapResponse };
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EventTransport-BD2U0BTc.d.mts","names":[],"sources":["../src/events/EventTransport.ts"],"mappings":";;AAmBA;;;;;;;;;;;;;;;;;UAAiB,WAAA;EAoBA;EAlBf,IAAA;EAsBsB;EApBtB,OAAA,EAAS,CAAA;EAoBiD;EAlB1D,IAAA;IAkBwE,sBAhBtE,EAAA,UAgB6E;IAd7E,SAAA,EAAW,IAAA,EAciC;IAZ5C,QAAA,WAYqC;IAVrC,UAAA,WAU6E;IAR7E,MAAA,WA0Ba;IAxBb,cAAA,WAwBwB;IAtBxB,aAAA;EAAA;AAAA;AAAA,KAIQ,YAAA,iBAA6B,KAAA,EAAO,WAAA,CAAY,CAAA,aAAc,OAAA;;;;;;AAuB1E;;;;;;;;;;;UALiB,WAAA;EACf,IAAA,CAAK,OAAA,aAAoB,IAAA;EACzB,KAAA,CAAM,OAAA,aAAoB,IAAA;AAAA;AAAA,UAGX,cAAA;EAeL;EAAA,SAbD,IAAA;EAakB;;;EAR3B,OAAA,CAAQ,KAAA,EAAO,WAAA,GAAc,OAAA;EAaZ;;AAGnB;;;;EARE,SAAA,CAAU,OAAA,UAAiB,OAAA,EAAS,YAAA,GAAe,OAAA;EAkBxC;;;EAbX,KAAA,KAAU,OAAA;AAAA;AAAA,UAGK,2BAAA;EAiD2B;EA/C1C,MAAA,GAAS,WAAA;AAAA;;;;;;cAQE,oBAAA,YAAgC,cAAA;EAAA,SAClC,IAAA;EAAA,QACD,QAAA;EAAA,QACA,MAAA;cAEI,OAAA,GAAU,2BAAA;EAIhB,OAAA,CAAQ,KAAA,EAAO,WAAA,GAAc,OAAA;EA8B7B,SAAA,CAAU,OAAA,UAAiB,OAAA,EAAS,YAAA,GAAe,OAAA;EAWnD,KAAA,CAAA,GAAS,OAAA;AAAA;;;;iBAQD,WAAA,GAAA,CACd,IAAA,UACA,OAAA,EAAS,CAAA,EACT,IAAA,GAAO,OAAA,CAAQ,WAAA,YACd,WAAA,CAAY,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"HookSystem-BsGV-j2l.mjs","names":[],"sources":["../src/hooks/HookSystem.ts"],"sourcesContent":["/**\n * Hook System\n *\n * Lifecycle hooks for resource operations.\n * Allows intercepting and modifying data at various points.\n */\n\nimport type { AnyRecord, RequestContext, UserBase } from '../types/index.js';\n\n// ============================================================================\n// Hook Types\n// ============================================================================\n\nexport type HookPhase = 'before' | 'around' | 'after';\nexport type HookOperation = 'create' | 'update' | 'delete' | 'read' | 'list';\n\nexport interface HookContext<T = AnyRecord> {\n resource: string;\n operation: HookOperation;\n phase: HookPhase;\n data?: T;\n result?: T | T[];\n user?: UserBase;\n context?: RequestContext;\n meta?: AnyRecord;\n}\n\nexport type HookHandler<T = AnyRecord> = (\n ctx: HookContext<T>\n) => void | Promise<void> | T | Promise<T>;\n\n/**\n * Around hook handler — wraps the core operation.\n * Call `next()` to proceed to the next around hook or the actual operation.\n */\nexport type AroundHookHandler<T = AnyRecord> = (\n ctx: HookContext<T>,\n next: () => Promise<T | undefined>,\n) => T | undefined | Promise<T | undefined>;\n\nexport interface HookRegistration {\n /** Hook name for dependency resolution and debugging */\n name?: string;\n resource: string;\n operation: HookOperation;\n phase: HookPhase;\n handler: HookHandler;\n priority: number;\n /** Names of hooks that must execute before this one */\n dependsOn?: string[];\n}\n\n// ============================================================================\n// Hook System Types\n// ============================================================================\n\nexport interface HookSystemOptions {\n /** Custom logger for error/warning reporting. Defaults to console */\n logger?: {\n error: (message: string, ...args: unknown[]) => void;\n warn?: (message: string, ...args: unknown[]) => void;\n };\n}\n\n// ============================================================================\n// Hook System Class\n// ============================================================================\n\nexport class HookSystem {\n private hooks: Map<string, HookRegistration[]>;\n private logger: { error: (message: string, ...args: unknown[]) => void };\n private warn: (message: string, ...args: unknown[]) => void;\n\n constructor(options?: HookSystemOptions) {\n this.hooks = new Map();\n // Default to console.error/warn so developers see hook issues during development\n // Pass custom logger to redirect to fastify.log or silence in tests\n // Use arrow function wrapper to allow spying in tests\n this.logger = options?.logger ?? { error: (...args: unknown[]) => console.error(...args) };\n this.warn = options?.logger?.warn ?? ((...args: unknown[]) => console.warn(...args));\n }\n\n /**\n * Generate hook key\n */\n private getKey(resource: string, operation: HookOperation, phase: HookPhase): string {\n return `${resource}:${operation}:${phase}`;\n }\n\n /**\n * Register a hook\n * Supports both object parameter and positional arguments\n */\n register<T = AnyRecord>(\n resourceOrOptions: string | {\n name?: string;\n resource: string;\n operation: HookOperation;\n phase: HookPhase;\n handler: HookHandler<T>;\n priority?: number;\n dependsOn?: string[];\n },\n operation?: HookOperation,\n phase?: HookPhase,\n handler?: HookHandler<T>,\n priority = 10\n ): () => void {\n // Handle object parameter\n let hookName: string | undefined;\n let resource: string;\n let finalOperation: HookOperation;\n let finalPhase: HookPhase;\n let finalHandler: HookHandler<T>;\n let finalPriority: number;\n let dependsOn: string[] | undefined;\n\n if (typeof resourceOrOptions === 'object') {\n // Object syntax: register({ name, resource, operation, phase, handler, priority, dependsOn })\n hookName = resourceOrOptions.name;\n resource = resourceOrOptions.resource;\n finalOperation = resourceOrOptions.operation;\n finalPhase = resourceOrOptions.phase;\n finalHandler = resourceOrOptions.handler;\n finalPriority = resourceOrOptions.priority ?? 10;\n dependsOn = resourceOrOptions.dependsOn;\n } else {\n // Positional syntax: register(resource, operation, phase, handler, priority)\n resource = resourceOrOptions;\n finalOperation = operation!;\n finalPhase = phase!;\n finalHandler = handler!;\n finalPriority = priority;\n }\n\n const key = this.getKey(resource, finalOperation, finalPhase);\n\n if (!this.hooks.has(key)) {\n this.hooks.set(key, []);\n }\n\n const registration: HookRegistration = {\n name: hookName,\n resource,\n operation: finalOperation,\n phase: finalPhase,\n handler: finalHandler as HookHandler,\n priority: finalPriority,\n dependsOn,\n };\n\n const hooks = this.hooks.get(key)!;\n hooks.push(registration);\n\n // Sort by priority (lower runs first) — topological sort done at execution time\n hooks.sort((a, b) => a.priority - b.priority);\n\n // Return unregister function\n return () => {\n const idx = hooks.indexOf(registration);\n if (idx !== -1) {\n hooks.splice(idx, 1);\n }\n };\n }\n\n /**\n * Register before hook\n */\n before<T = AnyRecord>(\n resource: string,\n operation: HookOperation,\n handler: HookHandler<T>,\n priority = 10\n ): () => void {\n return this.register(resource, operation, 'before', handler, priority);\n }\n\n /**\n * Register after hook\n */\n after<T = AnyRecord>(\n resource: string,\n operation: HookOperation,\n handler: HookHandler<T>,\n priority = 10\n ): () => void {\n return this.register(resource, operation, 'after', handler, priority);\n }\n\n /**\n * Register around hook — wraps the core operation.\n * Call `next()` inside the handler to proceed.\n */\n around<T = AnyRecord>(\n resource: string,\n operation: HookOperation,\n handler: AroundHookHandler<T>,\n priority = 10\n ): () => void {\n return this.register(resource, operation, 'around', handler as HookHandler, priority);\n }\n\n /**\n * Execute around hooks as a nested middleware chain.\n * Each around hook receives `next()` to call the next hook or the core operation.\n */\n async executeAround<T = AnyRecord>(\n resource: string,\n operation: HookOperation,\n data: T,\n execute: () => Promise<T | undefined>,\n options?: {\n user?: UserBase;\n context?: RequestContext;\n meta?: AnyRecord;\n }\n ): Promise<T | undefined> {\n const key = this.getKey(resource, operation, 'around');\n const hooks = [...(this.hooks.get(key) ?? [])];\n\n // Also check wildcard\n const wildcardKey = this.getKey('*', operation, 'around');\n const wildcardHooks = this.hooks.get(wildcardKey) ?? [];\n const allHooks = [...wildcardHooks, ...hooks];\n allHooks.sort((a, b) => a.priority - b.priority);\n\n if (allHooks.length === 0) {\n return execute();\n }\n\n // Build nested next() chain\n let index = 0;\n const next = async (): Promise<T | undefined> => {\n if (index < allHooks.length) {\n const hook = allHooks[index++]!;\n const ctx: HookContext<T> = {\n resource,\n operation,\n phase: 'around',\n data,\n user: options?.user,\n context: options?.context,\n meta: options?.meta,\n };\n return (hook.handler as unknown as AroundHookHandler<T>)(ctx, next);\n }\n return execute();\n };\n\n return next();\n }\n\n /**\n * Execute hooks for a given context\n */\n async execute<T = AnyRecord>(ctx: HookContext<T>): Promise<T | undefined> {\n const key = this.getKey(ctx.resource, ctx.operation, ctx.phase);\n const hooks = this.hooks.get(key) ?? [];\n\n // Also check for wildcard hooks\n const wildcardKey = this.getKey('*', ctx.operation, ctx.phase);\n const wildcardHooks = this.hooks.get(wildcardKey) ?? [];\n\n let allHooks = [...wildcardHooks, ...hooks];\n allHooks.sort((a, b) => a.priority - b.priority);\n\n // Apply topological sort if any hook has dependsOn\n if (allHooks.some((h) => h.dependsOn?.length)) {\n allHooks = this.topologicalSort(allHooks);\n }\n\n let result: T | undefined = ctx.data as T | undefined;\n\n for (const hook of allHooks) {\n // Cast context to HookContext<AnyRecord> for handler compatibility\n const handlerContext: HookContext<AnyRecord> = {\n resource: ctx.resource,\n operation: ctx.operation,\n phase: ctx.phase,\n data: result as AnyRecord | undefined,\n result: ctx.result as AnyRecord | AnyRecord[] | undefined,\n user: ctx.user,\n context: ctx.context,\n meta: ctx.meta,\n };\n const hookResult = await hook.handler(handlerContext);\n if (hookResult !== undefined && hookResult !== null) {\n result = hookResult as T;\n }\n }\n\n return result;\n }\n\n /**\n * Execute before hooks\n */\n async executeBefore<T = AnyRecord>(\n resource: string,\n operation: HookOperation,\n data: T,\n options?: {\n user?: UserBase;\n context?: RequestContext;\n meta?: AnyRecord;\n }\n ): Promise<T> {\n const result = await this.execute<T>({\n resource,\n operation,\n phase: 'before',\n data,\n user: options?.user,\n context: options?.context,\n meta: options?.meta,\n });\n\n return result ?? data;\n }\n\n /**\n * Execute after hooks\n * Errors in after hooks are logged but don't fail the request\n */\n async executeAfter<T = AnyRecord>(\n resource: string,\n operation: HookOperation,\n result: T | T[],\n options?: {\n user?: UserBase;\n context?: RequestContext;\n meta?: AnyRecord;\n }\n ): Promise<void> {\n try {\n await this.execute({\n resource,\n operation,\n phase: 'after',\n result,\n user: options?.user,\n context: options?.context,\n meta: options?.meta,\n });\n } catch (error) {\n // Log error but don't fail the request\n this.logger.error(\n `[HookSystem] Error in after hook for ${resource}:${operation}:`,\n error\n );\n }\n }\n\n /**\n * Topological sort with Kahn's algorithm.\n * Hooks with `dependsOn` are ordered after their dependencies.\n * Within the same dependency level, priority ordering is preserved.\n * Hooks without names or dependencies pass through in their original order.\n */\n private topologicalSort(hooks: HookRegistration[]): HookRegistration[] {\n // Build adjacency list and in-degree map\n const byName = new Map<string, HookRegistration>();\n const inDegree = new Map<HookRegistration, number>();\n const dependents = new Map<string, HookRegistration[]>();\n\n for (const hook of hooks) {\n inDegree.set(hook, 0);\n if (hook.name) {\n byName.set(hook.name, hook);\n }\n }\n\n for (const hook of hooks) {\n if (hook.dependsOn) {\n let resolvedDeps = 0;\n for (const dep of hook.dependsOn) {\n if (byName.has(dep)) {\n resolvedDeps++;\n if (!dependents.has(dep)) dependents.set(dep, []);\n dependents.get(dep)!.push(hook);\n } else {\n this.warn(\n `[HookSystem] Hook '${hook.name ?? '<unnamed>'}' depends on '${dep}' which is not registered ` +\n 'in the same phase/resource. Dependency will be ignored.'\n );\n }\n }\n inDegree.set(hook, resolvedDeps);\n }\n }\n\n // Kahn's algorithm: start with hooks that have no dependencies\n const queue: HookRegistration[] = [];\n const result: HookRegistration[] = [];\n\n for (const hook of hooks) {\n if (inDegree.get(hook)! === 0) {\n queue.push(hook);\n }\n }\n\n // Sort queue by priority within each level\n queue.sort((a, b) => a.priority - b.priority);\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n result.push(current);\n\n if (current.name && dependents.has(current.name)) {\n const deps = dependents.get(current.name)!;\n for (const dep of deps) {\n const newDegree = inDegree.get(dep)! - 1;\n inDegree.set(dep, newDegree);\n if (newDegree === 0) {\n // Insert sorted by priority\n const insertIdx = queue.findIndex((q) => q.priority > dep.priority);\n if (insertIdx === -1) {\n queue.push(dep);\n } else {\n queue.splice(insertIdx, 0, dep);\n }\n }\n }\n }\n }\n\n // Detect cycles: if result doesn't contain all hooks, there's a cycle\n if (result.length < hooks.length) {\n const missing = hooks.filter((h) => !result.includes(h));\n const names = missing.map((h) => h.name ?? '<unnamed>').join(', ');\n this.logger.error(\n `[HookSystem] Circular dependency detected in hooks: ${names}. ` +\n 'These hooks will be appended in priority order.',\n );\n // Append cycled hooks in priority order (best effort)\n missing.sort((a, b) => a.priority - b.priority);\n result.push(...missing);\n }\n\n return result;\n }\n\n /**\n * Get all registered hooks\n */\n getAll(): HookRegistration[] {\n const all: HookRegistration[] = [];\n for (const hooks of this.hooks.values()) {\n all.push(...hooks);\n }\n return all;\n }\n\n /**\n * Get hooks for a specific resource\n */\n getForResource(resource: string): HookRegistration[] {\n const all: HookRegistration[] = [];\n for (const [key, hooks] of this.hooks.entries()) {\n if (key.startsWith(`${resource}:`)) {\n all.push(...hooks);\n }\n }\n return all;\n }\n\n /**\n * Get hooks matching filter criteria.\n * Useful for debugging and testing specific hook combinations.\n *\n * @example\n * ```typescript\n * // Find all before-create hooks for products (including wildcards)\n * const hooks = hookSystem.getRegistered({\n * resource: 'product',\n * operation: 'create',\n * phase: 'before',\n * });\n * ```\n */\n getRegistered(filter?: {\n resource?: string;\n operation?: HookOperation;\n phase?: HookPhase;\n }): HookRegistration[] {\n let results = this.getAll();\n if (filter?.resource) {\n results = results.filter(\n (h) => h.resource === filter.resource || h.resource === '*',\n );\n }\n if (filter?.operation) {\n results = results.filter((h) => h.operation === filter.operation);\n }\n if (filter?.phase) {\n results = results.filter((h) => h.phase === filter.phase);\n }\n return results;\n }\n\n /**\n * Get a structured summary of all registered hooks for debugging.\n *\n * @example\n * ```typescript\n * const info = hookSystem.inspect();\n * // { total: 12, resources: { product: [...], '*': [...] }, summary: [...] }\n * ```\n */\n inspect(): {\n total: number;\n resources: Record<string, HookRegistration[]>;\n summary: Array<{\n name?: string;\n key: string;\n priority: number;\n dependsOn?: string[];\n }>;\n } {\n const all = this.getAll();\n const byResource = new Map<string, HookRegistration[]>();\n for (const hook of all) {\n const arr = byResource.get(hook.resource) ?? [];\n arr.push(hook);\n byResource.set(hook.resource, arr);\n }\n return {\n total: all.length,\n resources: Object.fromEntries(byResource),\n summary: all.map((h) => ({\n name: h.name,\n key: `${h.resource}:${h.operation}:${h.phase}`,\n priority: h.priority,\n ...(h.dependsOn?.length ? { dependsOn: h.dependsOn } : {}),\n })),\n };\n }\n\n /**\n * Check if any hooks exist for a specific resource/operation/phase combination.\n */\n has(resource: string, operation: HookOperation, phase: HookPhase): boolean {\n const key = this.getKey(resource, operation, phase);\n return (this.hooks.get(key)?.length ?? 0) > 0;\n }\n\n /**\n * Clear all hooks\n */\n clear(): void {\n this.hooks.clear();\n }\n\n /**\n * Clear hooks for a specific resource\n */\n clearResource(resource: string): void {\n for (const key of this.hooks.keys()) {\n if (key.startsWith(`${resource}:`)) {\n this.hooks.delete(key);\n }\n }\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\n/**\n * Create a new isolated HookSystem instance\n *\n * Use this for:\n * - Test isolation (parallel test suites)\n * - Multiple app instances with independent hooks\n *\n * @example\n * const hooks = createHookSystem();\n * await app.register(arcCorePlugin, { hookSystem: hooks });\n *\n * @example With custom logger\n * const hooks = createHookSystem({ logger: fastify.log });\n */\nexport function createHookSystem(options?: HookSystemOptions): HookSystem {\n return new HookSystem(options);\n}\n\n// ============================================================================\n// defineHook — Declarative hook with name + dependency support\n// ============================================================================\n\nexport interface DefineHookOptions<T = AnyRecord> {\n /** Unique hook name (required for dependency resolution) */\n name: string;\n /** Target resource */\n resource: string;\n /** CRUD operation */\n operation: HookOperation;\n /** before or after */\n phase: HookPhase;\n /** Hook handler */\n handler: HookHandler<T>;\n /** Priority (lower = earlier, default: 10) */\n priority?: number;\n /** Names of hooks that must execute before this one */\n dependsOn?: string[];\n}\n\n/**\n * Define a named hook with optional dependencies.\n * Returns a registration object — call `register(hookSystem)` to activate.\n *\n * @example\n * ```typescript\n * const generateSlug = defineHook({\n * name: 'generateSlug',\n * resource: 'product', operation: 'create', phase: 'before',\n * handler: (ctx) => ({ ...ctx.data, slug: slugify(ctx.data.name) }),\n * });\n *\n * const validateUniqueSlug = defineHook({\n * name: 'validateUniqueSlug',\n * resource: 'product', operation: 'create', phase: 'before',\n * dependsOn: ['generateSlug'],\n * handler: async (ctx) => { // check uniqueness },\n * });\n *\n * // Register on a hook system\n * generateSlug.register(hooks);\n * validateUniqueSlug.register(hooks);\n * ```\n */\nexport function defineHook<T = AnyRecord>(\n options: DefineHookOptions<T>,\n): DefineHookOptions<T> & { register: (hooks: HookSystem) => () => void } {\n return {\n ...options,\n register(hooks: HookSystem): () => void {\n return hooks.register({\n name: options.name,\n resource: options.resource,\n operation: options.operation,\n phase: options.phase,\n handler: options.handler,\n priority: options.priority,\n dependsOn: options.dependsOn,\n });\n },\n };\n}\n\n// ============================================================================\n// Convenience Functions (operate on a provided HookSystem instance)\n// ============================================================================\n\n/**\n * Create a before-create hook registration for a given hook system\n */\nexport function beforeCreate<T = AnyRecord>(\n hooks: HookSystem,\n resource: string,\n handler: HookHandler<T>,\n priority = 10\n): () => void {\n return hooks.before(resource, 'create', handler, priority);\n}\n\n/**\n * Create an after-create hook registration for a given hook system\n */\nexport function afterCreate<T = AnyRecord>(\n hooks: HookSystem,\n resource: string,\n handler: HookHandler<T>,\n priority = 10\n): () => void {\n return hooks.after(resource, 'create', handler, priority);\n}\n\n/**\n * Create a before-update hook registration for a given hook system\n */\nexport function beforeUpdate<T = AnyRecord>(\n hooks: HookSystem,\n resource: string,\n handler: HookHandler<T>,\n priority = 10\n): () => void {\n return hooks.before(resource, 'update', handler, priority);\n}\n\n/**\n * Create an after-update hook registration for a given hook system\n */\nexport function afterUpdate<T = AnyRecord>(\n hooks: HookSystem,\n resource: string,\n handler: HookHandler<T>,\n priority = 10\n): () => void {\n return hooks.after(resource, 'update', handler, priority);\n}\n\n/**\n * Create a before-delete hook registration for a given hook system\n */\nexport function beforeDelete<T = AnyRecord>(\n hooks: HookSystem,\n resource: string,\n handler: HookHandler<T>,\n priority = 10\n): () => void {\n return hooks.before(resource, 'delete', handler, priority);\n}\n\n/**\n * Create an after-delete hook registration for a given hook system\n */\nexport function afterDelete<T = AnyRecord>(\n hooks: HookSystem,\n resource: string,\n handler: HookHandler<T>,\n priority = 10\n): () => void {\n return hooks.after(resource, 'delete', handler, priority);\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ResourceRegistry-DsN4KJjV.mjs","names":[],"sources":["../src/registry/ResourceRegistry.ts"],"sourcesContent":["/**\n * Resource Registry\n *\n * Singleton that tracks all registered resources for introspection.\n */\n\nimport type {\n IntrospectionData,\n OpenApiSchemas,\n RegistryEntry,\n RegistryStats,\n ResourcePermissions,\n} from '../types/index.js';\nimport type { ResourceDefinition } from '../core/defineResource.js';\nimport type { FieldPermissionMap } from '../permissions/fields.js';\nimport type { PipelineConfig, PipelineStep } from '../pipeline/types.js';\nimport { CRUD_OPERATIONS, DEFAULT_UPDATE_METHOD } from '../constants.js';\n\nexport interface RegisterOptions {\n module?: string;\n /** Pre-generated OpenAPI schemas */\n openApiSchemas?: OpenApiSchemas;\n}\n\nexport class ResourceRegistry {\n private _resources: Map<string, RegistryEntry>;\n private _frozen: boolean;\n\n constructor() {\n this._resources = new Map();\n this._frozen = false;\n }\n\n /**\n * Register a resource\n */\n register(resource: ResourceDefinition<unknown>, options: RegisterOptions = {}): this {\n if (this._frozen) {\n throw new Error(\n `Registry frozen. Cannot register '${resource.name}' after startup.`\n );\n }\n\n if (this._resources.has(resource.name)) {\n throw new Error(`Resource '${resource.name}' already registered.`);\n }\n\n const entry: RegistryEntry = {\n name: resource.name,\n displayName: resource.displayName,\n tag: resource.tag,\n prefix: resource.prefix,\n module: options.module ?? undefined,\n adapter: resource.adapter\n ? {\n type: resource.adapter.type,\n name: resource.adapter.name,\n }\n : null,\n permissions: resource.permissions as ResourcePermissions | undefined,\n presets: resource._appliedPresets ?? [],\n routes: [], // Populated later by getIntrospection()\n additionalRoutes: resource.additionalRoutes.map((r) => ({\n method: r.method,\n path: r.path,\n handler:\n typeof r.handler === 'string'\n ? r.handler\n : (r.handler as Function).name || 'anonymous',\n operation: r.operation,\n summary: r.summary,\n description: r.description,\n permissions: r.permissions,\n wrapHandler: r.wrapHandler,\n schema: r.schema, // Include schema for OpenAPI docs\n })),\n events: Object.keys(resource.events ?? {}),\n registeredAt: new Date().toISOString(),\n disableDefaultRoutes: resource.disableDefaultRoutes,\n updateMethod: resource.updateMethod,\n disabledRoutes: resource.disabledRoutes,\n openApiSchemas: options.openApiSchemas,\n fieldPermissions: extractFieldPermissions(resource.fields),\n pipelineSteps: extractPipelineSteps(resource.pipe),\n rateLimit: resource.rateLimit,\n plugin: resource.toPlugin(), // Store plugin factory\n };\n\n this._resources.set(resource.name, entry);\n return this;\n }\n\n /**\n * Get resource by name\n */\n get(name: string): RegistryEntry | undefined {\n return this._resources.get(name);\n }\n\n /**\n * Get all resources\n */\n getAll(): RegistryEntry[] {\n return Array.from(this._resources.values());\n }\n\n /**\n * Get resources by module\n */\n getByModule(moduleName: string): RegistryEntry[] {\n return this.getAll().filter((r) => r.module === moduleName);\n }\n\n /**\n * Get resources by preset\n */\n getByPreset(presetName: string): RegistryEntry[] {\n return this.getAll().filter((r) => r.presets.includes(presetName));\n }\n\n /**\n * Check if resource exists\n */\n has(name: string): boolean {\n return this._resources.has(name);\n }\n\n /**\n * Get registry statistics\n */\n getStats(): RegistryStats {\n const resources = this.getAll();\n const presetCounts: Record<string, number> = {};\n\n for (const r of resources) {\n for (const preset of r.presets) {\n presetCounts[preset] = (presetCounts[preset] ?? 0) + 1;\n }\n }\n\n return {\n totalResources: resources.length,\n byModule: this._groupBy(resources, 'module'),\n presetUsage: presetCounts,\n totalRoutes: resources.reduce((sum, r) => {\n if (r.disableDefaultRoutes) {\n return sum + (r.additionalRoutes?.length ?? 0);\n }\n const disabledSet = new Set(r.disabledRoutes ?? []);\n let defaultCount = CRUD_OPERATIONS.filter(route => !disabledSet.has(route)).length;\n // 'update' creates 2 routes when updateMethod is 'both' (PUT + PATCH)\n if (!disabledSet.has('update') && r.updateMethod === 'both') {\n defaultCount += 1;\n }\n return sum + defaultCount + (r.additionalRoutes?.length ?? 0);\n }, 0),\n totalEvents: resources.reduce((sum, r) => sum + (r.events?.length ?? 0), 0),\n };\n }\n\n /**\n * Get full introspection data\n */\n getIntrospection(): IntrospectionData {\n return {\n resources: this.getAll().map((r) => {\n // Build default routes accounting for disabledRoutes and updateMethod\n const disabledSet = new Set(r.disabledRoutes ?? []);\n const updateMethod = r.updateMethod ?? DEFAULT_UPDATE_METHOD;\n const defaultRoutes = r.disableDefaultRoutes ? [] : [\n ...(!disabledSet.has('list') ? [{ method: 'GET', path: r.prefix, operation: 'list' }] : []),\n ...(!disabledSet.has('get') ? [{ method: 'GET', path: `${r.prefix}/:id`, operation: 'get' }] : []),\n ...(!disabledSet.has('create') ? [{ method: 'POST', path: r.prefix, operation: 'create' }] : []),\n ...(!disabledSet.has('update') ? (\n updateMethod === 'both'\n ? [\n { method: 'PUT', path: `${r.prefix}/:id`, operation: 'update' },\n { method: 'PATCH', path: `${r.prefix}/:id`, operation: 'update' },\n ]\n : [{ method: updateMethod, path: `${r.prefix}/:id`, operation: 'update' }]\n ) : []),\n ...(!disabledSet.has('delete') ? [{ method: 'DELETE', path: `${r.prefix}/:id`, operation: 'delete' }] : []),\n ];\n\n return {\n name: r.name,\n displayName: r.displayName,\n prefix: r.prefix,\n module: r.module,\n presets: r.presets,\n permissions: r.permissions,\n routes: [\n ...defaultRoutes,\n ...(r.additionalRoutes?.map((ar) => ({\n method: ar.method,\n path: `${r.prefix}${ar.path}`,\n operation: ar.operation ?? (typeof ar.handler === 'string' ? ar.handler : 'custom'),\n handler: typeof ar.handler === 'string' ? ar.handler : undefined,\n summary: ar.summary,\n })) ?? []),\n ],\n events: r.events,\n };\n }),\n stats: this.getStats(),\n generatedAt: new Date().toISOString(),\n };\n }\n\n /**\n * Freeze registry (prevent further registrations)\n */\n freeze(): void {\n this._frozen = true;\n }\n\n /**\n * Check if frozen\n */\n isFrozen(): boolean {\n return this._frozen;\n }\n\n /**\n * Unfreeze registry (allow new registrations)\n */\n unfreeze(): void {\n this._frozen = false;\n }\n\n /**\n * Reset registry — clear all resources and unfreeze\n */\n reset(): void {\n this._resources.clear();\n this._frozen = false;\n }\n\n /** @internal Alias for unfreeze() */\n _unfreeze(): void {\n this.unfreeze();\n }\n\n /** @internal Alias for reset() */\n _clear(): void {\n this.reset();\n }\n\n /**\n * Group by key\n */\n private _groupBy(\n arr: RegistryEntry[],\n key: keyof RegistryEntry\n ): Record<string, number> {\n const result: Record<string, number> = {};\n for (const item of arr) {\n const k = String(item[key] ?? 'uncategorized');\n result[k] = (result[k] ?? 0) + 1;\n }\n return result;\n }\n}\n\nexport default ResourceRegistry;\n\n// ---------------------------------------------------------------------------\n// Helpers for extracting v2.0 metadata\n// ---------------------------------------------------------------------------\n\nfunction extractFieldPermissions(\n fields?: FieldPermissionMap,\n): RegistryEntry['fieldPermissions'] {\n if (!fields || Object.keys(fields).length === 0) return undefined;\n\n const result: NonNullable<RegistryEntry['fieldPermissions']> = {};\n for (const [field, perm] of Object.entries(fields)) {\n const entry: { type: string; roles?: readonly string[]; redactValue?: unknown } = {\n type: perm._type,\n };\n if (perm.roles?.length) entry.roles = perm.roles;\n if (perm.redactValue !== undefined) entry.redactValue = perm.redactValue;\n result[field] = entry;\n }\n return result;\n}\n\nfunction extractPipelineSteps(\n pipe?: PipelineConfig,\n): RegistryEntry['pipelineSteps'] {\n if (!pipe) return undefined;\n\n const steps: PipelineStep[] = [];\n if (Array.isArray(pipe)) {\n steps.push(...pipe);\n } else {\n const seen = new Set<string>();\n for (const opSteps of Object.values(pipe)) {\n if (Array.isArray(opSteps)) {\n for (const step of opSteps) {\n const key = `${step._type}:${step.name}`;\n if (!seen.has(key)) {\n seen.add(key);\n steps.push(step);\n }\n }\n }\n }\n }\n\n if (steps.length === 0) return undefined;\n\n return steps.map((s) => ({\n type: s._type,\n name: s.name,\n operations: s.operations ? [...s.operations] : undefined,\n }));\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/audit/auditPlugin.ts","../../src/audit/stores/memory.ts"],"mappings":";;;;;;;UAgCiB,kBAAA;EAoCc;EAlC7B,OAAA;EA6BE;EA3BF,MAAA;EA8BU;EA5BV,eAAA,GAAkB,eAAA;EA8BD;EA5BjB,eAAA;EA4B6B;EA1B7B,OAAA;EA8Be;EA5Bf,YAAA,GAAe,UAAA;;;;;;;;;;EAUf,SAAA;IACE,UAAA;IACA,OAAA;EAAA;AAAA;AAAA;EAAA,UAKQ,eAAA;IAoDL;IAlDH,KAAA,EAAO,WAAA;EAAA;EAAA,UAGC,cAAA;IAkDoE;IAhD5E,YAAA,GAAe,YAAA;EAAA;AAAA;AAAA,UAIF,WAAA;EAKP;EAHR,MAAA,GACE,QAAA,UACA,UAAA,UACA,IAAA,EAAM,MAAA,mBACN,OAAA,GAAU,YAAA,KACP,OAAA;EADO;EAIZ,MAAA,GACE,QAAA,UACA,UAAA,UACA,MAAA,EAAQ,MAAA,mBACR,KAAA,EAAO,MAAA,mBACP,OAAA,GAAU,YAAA,KACP,OAAA;EATA;EAYL,MAAA,GACE,QAAA,UACA,UAAA,UACA,IAAA,EAAM,MAAA,mBACN,OAAA,GAAU,YAAA,KACP,OAAA;EAbH;EAgBF,OAAA,GACE,QAAA,UACA,UAAA,UACA,IAAA,EAAM,MAAA,mBACN,OAAA,GAAU,YAAA,KACP,OAAA;EAnBK;EAsBV,MAAA,GACE,QAAA,UACA,UAAA,UACA,MAAA,UACA,IAAA,GAAO,MAAA,mBACP,OAAA,GAAU,YAAA,KACP,OAAA;EA3BI;EA8BT,KAAA,GAAQ,OAAA,EAHI,iBAAA,KAG2D,OAAA,CAAQ,UAAA;AAAA;AAAA,cAG3E,WAAA,EAAa,kBAAA,CAAmB,kBAAA;AAAA,cAAkB,QAAA;;;UC9GvC,uBAAA;EDuBkB;ECrBjC,UAAA;AAAA;AAAA,cAGW,gBAAA,YAA4B,UAAA;EAAA,SAC9B,IAAA;EAAA,QACD,OAAA;EAAA,QACA,UAAA;cAEI,OAAA,GAAS,uBAAA;EAIf,GAAA,CAAI,KAAA,EAAO,UAAA,GAAa,OAAA;EASxB,KAAA,CAAM,OAAA,GAAS,iBAAA,GAAyB,OAAA,CAAQ,UAAA;EAwChD,KAAA,CAAA,GAAS,OAAA;EDlBf;ECuBA,MAAA,CAAA,GAAU,UAAA;EDrBR;EC0BF,KAAA,CAAA;AAAA"}
|