@classytic/arc 2.4.3 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/{BaseController-CkM5dUh_.mjs → BaseController-CNwMYpDW.mjs} +1 -1
  2. package/dist/adapters/index.d.mts +2 -2
  3. package/dist/auth/index.d.mts +1 -1
  4. package/dist/auth/index.mjs +2 -2
  5. package/dist/core/index.d.mts +2 -2
  6. package/dist/core/index.mjs +2 -2
  7. package/dist/{createApp-CBgVaFyh.mjs → createApp-oic3-ieX.mjs} +3 -3
  8. package/dist/{defineResource-B22gcNvn.mjs → defineResource-BYm3CIoe.mjs} +85 -10
  9. package/dist/docs/index.d.mts +1 -1
  10. package/dist/dynamic/index.d.mts +1 -1
  11. package/dist/dynamic/index.mjs +2 -2
  12. package/dist/{elevation-Ca_yveIO.d.mts → elevation-C_taLQrM.d.mts} +27 -1
  13. package/dist/{errorHandler-DMbGdzBG.mjs → errorHandler-r2595m8T.mjs} +1 -1
  14. package/dist/{errors-CPpvPHT0.d.mts → errors-CcVbl1-T.d.mts} +17 -1
  15. package/dist/{errors-rxhfP7Hf.mjs → errors-NoQKsbAT.mjs} +23 -1
  16. package/dist/factory/index.d.mts +1 -1
  17. package/dist/factory/index.mjs +1 -1
  18. package/dist/hooks/index.d.mts +1 -1
  19. package/dist/{index-BL8CaQih.d.mts → index-TG7-pXDC.d.mts} +2 -2
  20. package/dist/{index-yhxyjqNb.d.mts → index-bX8T5bmn.d.mts} +4 -8
  21. package/dist/index.d.mts +5 -5
  22. package/dist/index.mjs +7 -6
  23. package/dist/integrations/event-gateway.mjs +1 -1
  24. package/dist/integrations/index.d.mts +1 -1
  25. package/dist/integrations/mcp/index.d.mts +2 -2
  26. package/dist/integrations/mcp/index.mjs +1 -1
  27. package/dist/integrations/mcp/testing.d.mts +1 -1
  28. package/dist/integrations/mcp/testing.mjs +1 -1
  29. package/dist/{interface-DGmPxakH.d.mts → interface-BnNjdl33.d.mts} +170 -8
  30. package/dist/org/index.d.mts +1 -1
  31. package/dist/org/index.mjs +1 -1
  32. package/dist/permissions/index.mjs +1 -1
  33. package/dist/{permissions-Jk5x3sxz.mjs → permissions-D9_AAtvz.mjs} +1 -1
  34. package/dist/plugins/index.d.mts +1 -1
  35. package/dist/plugins/index.mjs +3 -3
  36. package/dist/plugins/tracing-entry.mjs +1 -1
  37. package/dist/presets/index.d.mts +1 -1
  38. package/dist/presets/index.mjs +1 -1
  39. package/dist/presets/multiTenant.d.mts +1 -1
  40. package/dist/presets/multiTenant.mjs +1 -1
  41. package/dist/{presets-OMPaHMTY.mjs → presets-CD3e6M7c.mjs} +2 -2
  42. package/dist/registry/index.d.mts +1 -1
  43. package/dist/{resourceToTools-PMFE8HIv.mjs → resourceToTools-CN0lwJrL.mjs} +1 -1
  44. package/dist/scope/index.d.mts +2 -2
  45. package/dist/scope/index.mjs +2 -2
  46. package/dist/{sse-BkViJPlT.mjs → sse-BF7GR7IB.mjs} +1 -1
  47. package/dist/testing/index.d.mts +2 -2
  48. package/dist/testing/index.mjs +1 -1
  49. package/dist/types/index.d.mts +3 -3
  50. package/dist/types/index.mjs +23 -2
  51. package/dist/{types-C6TQjtdi.mjs → types-BhtYdxZU.mjs} +26 -1
  52. package/dist/{types-BJmgxNbF.d.mts → types-ByCPlfZ1.d.mts} +1 -1
  53. package/dist/{types-Dt0-AI6E.d.mts → types-Guk83PDz.d.mts} +2 -2
  54. package/dist/utils/index.d.mts +2 -2
  55. package/dist/utils/index.mjs +1 -1
  56. package/package.json +4 -4
  57. package/skills/arc/SKILL.md +53 -2
  58. package/skills/arc/references/mcp.md +135 -0
@@ -1,5 +1,5 @@
1
1
  import { h as SYSTEM_FIELDS, o as DEFAULT_TENANT_FIELD } from "./constants-Cxde4rpC.mjs";
2
- import { d as isMember, n as PUBLIC_SCOPE, r as getOrgId, u as isElevated } from "./types-C6TQjtdi.mjs";
2
+ import { d as isElevated, f as isMember, i as getOrgId, n as PUBLIC_SCOPE } from "./types-BhtYdxZU.mjs";
3
3
  import { t as buildQueryKey } from "./keys-qcD-TVJl.mjs";
4
4
  import { getUserId } from "./types/index.mjs";
5
5
  import { i as resolveEffectiveRoles, n as applyFieldWritePermissions } from "./fields-ipsbIRPK.mjs";
@@ -1,3 +1,3 @@
1
- import { a as RepositoryLike, i as RelationMetadata, n as DataAdapter, o as SchemaMetadata, r as FieldMetadata, s as ValidationResult, t as AdapterFactory } from "../interface-DGmPxakH.mjs";
2
- import { a as PrismaQueryParserOptions, c as MongooseAdapterOptions, i as PrismaQueryParser, l as createMongooseAdapter, n as PrismaAdapterOptions, o as createPrismaAdapter, r as PrismaQueryOptions, s as MongooseAdapter, t as PrismaAdapter } from "../index-yhxyjqNb.mjs";
1
+ import { a as RepositoryLike, i as RelationMetadata, n as DataAdapter, o as SchemaMetadata, r as FieldMetadata, s as ValidationResult, t as AdapterFactory } from "../interface-BnNjdl33.mjs";
2
+ import { a as PrismaQueryParserOptions, c as MongooseAdapterOptions, i as PrismaQueryParser, l as createMongooseAdapter, n as PrismaAdapterOptions, o as createPrismaAdapter, r as PrismaQueryOptions, s as MongooseAdapter, t as PrismaAdapter } from "../index-bX8T5bmn.mjs";
3
3
  export { AdapterFactory, DataAdapter, FieldMetadata, MongooseAdapter, MongooseAdapterOptions, PrismaAdapter, PrismaAdapterOptions, PrismaQueryOptions, PrismaQueryParser, PrismaQueryParserOptions, RelationMetadata, RepositoryLike, SchemaMetadata, ValidationResult, createMongooseAdapter, createPrismaAdapter };
@@ -1,4 +1,4 @@
1
- import { m as AuthPluginOptions, p as AuthHelpers } from "../interface-DGmPxakH.mjs";
1
+ import { h as AuthPluginOptions, m as AuthHelpers } from "../interface-BnNjdl33.mjs";
2
2
  import { t as PermissionCheck } from "../types-BNUccdcf.mjs";
3
3
  import { t as ExternalOpenApiPaths } from "../externalPaths-DpO-s7r8.mjs";
4
4
  import { a as SessionManagerOptions, c as createSessionManager, i as SessionData, n as MemorySessionStoreOptions, o as SessionManagerResult, r as SessionCookieOptions, s as SessionStore, t as MemorySessionStore } from "../sessionManager-wbkYj2HL.mjs";
@@ -1,6 +1,6 @@
1
1
  import { n as normalizeRoles, t as getUserRoles } from "../types-ZUu_h0jp.mjs";
2
- import { t as ArcError } from "../errors-rxhfP7Hf.mjs";
3
- import { c as requireOrgMembership, f as requireTeamMembership, l as requireOrgRole } from "../permissions-Jk5x3sxz.mjs";
2
+ import { t as ArcError } from "../errors-NoQKsbAT.mjs";
3
+ import { c as requireOrgMembership, f as requireTeamMembership, l as requireOrgRole } from "../permissions-D9_AAtvz.mjs";
4
4
  import { n as extractBetterAuthOpenApi } from "../betterAuthOpenApi-lz0IRbXJ.mjs";
5
5
  import { createHmac, randomUUID, timingSafeEqual } from "node:crypto";
6
6
  import fp from "fastify-plugin";
@@ -1,3 +1,3 @@
1
- import { Ct as QueryResolverConfig, Dt as AccessControlConfig, Et as AccessControl, Lt as ResourceDefinition, Rt as defineResource, St as QueryResolver, Tt as BodySanitizerConfig, bt as BaseController, wt as BodySanitizer, xt as BaseControllerOptions } from "../interface-DGmPxakH.mjs";
2
- import { A as RESERVED_QUERY_PARAMS, C as HookOperation, D as MAX_SEARCH_LENGTH, E as MAX_REGEX_LENGTH, O as MUTATION_OPERATIONS, S as HOOK_PHASES, T as MAX_FILTER_DEPTH, _ as DEFAULT_MAX_LIMIT, a as getControllerScope, b as DEFAULT_UPDATE_METHOD, c as createPermissionMiddleware, d as IdempotencyService, f as createActionRouter, g as DEFAULT_LIMIT, h as DEFAULT_ID_FIELD, i as getControllerContext, j as SYSTEM_FIELDS, k as MutationOperation, l as ActionHandler, m as CrudOperation, n as createFastifyHandler, o as sendControllerResponse, p as CRUD_OPERATIONS, r as createRequestContext, s as createCrudRouter, t as createCrudHandlers, u as ActionRouterConfig, v as DEFAULT_SORT, w as HookPhase, x as HOOK_OPERATIONS, y as DEFAULT_TENANT_FIELD } from "../index-BL8CaQih.mjs";
1
+ import { At as AccessControlConfig, Bt as ResourceDefinition, Ct as BaseController, Dt as BodySanitizer, Et as QueryResolverConfig, Ot as BodySanitizerConfig, Tt as QueryResolver, Vt as defineResource, kt as AccessControl, wt as BaseControllerOptions } from "../interface-BnNjdl33.mjs";
2
+ import { A as RESERVED_QUERY_PARAMS, C as HookOperation, D as MAX_SEARCH_LENGTH, E as MAX_REGEX_LENGTH, O as MUTATION_OPERATIONS, S as HOOK_PHASES, T as MAX_FILTER_DEPTH, _ as DEFAULT_MAX_LIMIT, a as getControllerScope, b as DEFAULT_UPDATE_METHOD, c as createPermissionMiddleware, d as IdempotencyService, f as createActionRouter, g as DEFAULT_LIMIT, h as DEFAULT_ID_FIELD, i as getControllerContext, j as SYSTEM_FIELDS, k as MutationOperation, l as ActionHandler, m as CrudOperation, n as createFastifyHandler, o as sendControllerResponse, p as CRUD_OPERATIONS, r as createRequestContext, s as createCrudRouter, t as createCrudHandlers, u as ActionRouterConfig, v as DEFAULT_SORT, w as HookPhase, x as HOOK_OPERATIONS, y as DEFAULT_TENANT_FIELD } from "../index-TG7-pXDC.mjs";
3
3
  export { AccessControl, AccessControlConfig, ActionHandler, ActionRouterConfig, BaseController, BaseControllerOptions, BodySanitizer, BodySanitizerConfig, CRUD_OPERATIONS, CrudOperation, DEFAULT_ID_FIELD, DEFAULT_LIMIT, DEFAULT_MAX_LIMIT, DEFAULT_SORT, DEFAULT_TENANT_FIELD, DEFAULT_UPDATE_METHOD, HOOK_OPERATIONS, HOOK_PHASES, HookOperation, HookPhase, IdempotencyService, MAX_FILTER_DEPTH, MAX_REGEX_LENGTH, MAX_SEARCH_LENGTH, MUTATION_OPERATIONS, MutationOperation, QueryResolver, QueryResolverConfig, RESERVED_QUERY_PARAMS, ResourceDefinition, SYSTEM_FIELDS, createActionRouter, createCrudHandlers, createCrudRouter, createFastifyHandler, createPermissionMiddleware, createRequestContext, defineResource, getControllerContext, getControllerScope, sendControllerResponse };
@@ -1,5 +1,5 @@
1
1
  import { a as DEFAULT_SORT, c as HOOK_OPERATIONS, d as MAX_REGEX_LENGTH, f as MAX_SEARCH_LENGTH, h as SYSTEM_FIELDS, i as DEFAULT_MAX_LIMIT, l as HOOK_PHASES, m as RESERVED_QUERY_PARAMS, n as DEFAULT_ID_FIELD, o as DEFAULT_TENANT_FIELD, p as MUTATION_OPERATIONS, r as DEFAULT_LIMIT, s as DEFAULT_UPDATE_METHOD, t as CRUD_OPERATIONS, u as MAX_FILTER_DEPTH } from "../constants-Cxde4rpC.mjs";
2
- import { i as AccessControl, n as QueryResolver, r as BodySanitizer, t as BaseController } from "../BaseController-CkM5dUh_.mjs";
2
+ import { i as AccessControl, n as QueryResolver, r as BodySanitizer, t as BaseController } from "../BaseController-CNwMYpDW.mjs";
3
3
  import { t as createActionRouter } from "../core-C1XCMtqM.mjs";
4
- import { c as createCrudHandlers, d as getControllerContext, f as getControllerScope, l as createFastifyHandler, n as defineResource, o as createCrudRouter, p as sendControllerResponse, s as createPermissionMiddleware, t as ResourceDefinition, u as createRequestContext } from "../defineResource-B22gcNvn.mjs";
4
+ import { c as createCrudHandlers, d as getControllerContext, f as getControllerScope, l as createFastifyHandler, n as defineResource, o as createCrudRouter, p as sendControllerResponse, s as createPermissionMiddleware, t as ResourceDefinition, u as createRequestContext } from "../defineResource-BYm3CIoe.mjs";
5
5
  export { AccessControl, BaseController, BodySanitizer, CRUD_OPERATIONS, DEFAULT_ID_FIELD, DEFAULT_LIMIT, DEFAULT_MAX_LIMIT, DEFAULT_SORT, DEFAULT_TENANT_FIELD, DEFAULT_UPDATE_METHOD, HOOK_OPERATIONS, HOOK_PHASES, MAX_FILTER_DEPTH, MAX_REGEX_LENGTH, MAX_SEARCH_LENGTH, MUTATION_OPERATIONS, QueryResolver, RESERVED_QUERY_PARAMS, ResourceDefinition, SYSTEM_FIELDS, createActionRouter, createCrudHandlers, createCrudRouter, createFastifyHandler, createPermissionMiddleware, createRequestContext, defineResource, getControllerContext, getControllerScope, sendControllerResponse };
@@ -1,5 +1,5 @@
1
1
  import { t as __exportAll } from "./chunk-BpYLSNr0.mjs";
2
- import { n as PUBLIC_SCOPE } from "./types-C6TQjtdi.mjs";
2
+ import { n as PUBLIC_SCOPE } from "./types-BhtYdxZU.mjs";
3
3
  import Fastify from "fastify";
4
4
  import qs from "qs";
5
5
  //#region src/factory/presets.ts
@@ -470,7 +470,7 @@ async function createApp(options) {
470
470
  }
471
471
  if (config.arcPlugins?.sse) if (config.arcPlugins?.events === false) fastify.log.warn("SSE plugin requires events plugin (arcPlugins.events). SSE disabled.");
472
472
  else {
473
- const { default: ssePlugin } = await import("./sse-BkViJPlT.mjs").then((n) => n.r);
473
+ const { default: ssePlugin } = await import("./sse-BF7GR7IB.mjs").then((n) => n.r);
474
474
  const sseOpts = config.arcPlugins.sse === true ? {} : config.arcPlugins.sse;
475
475
  await fastify.register(ssePlugin, sseOpts);
476
476
  trackPlugin("arc-sse", sseOpts);
@@ -557,7 +557,7 @@ async function createApp(options) {
557
557
  fastify.log.debug("Elevation plugin enabled");
558
558
  }
559
559
  if (config.errorHandler !== false) {
560
- const { errorHandlerPlugin } = await import("./errorHandler-DMbGdzBG.mjs").then((n) => n.n);
560
+ const { errorHandlerPlugin } = await import("./errorHandler-r2595m8T.mjs").then((n) => n.n);
561
561
  const errorOpts = typeof config.errorHandler === "object" ? config.errorHandler : { includeStack: config.preset !== "production" };
562
562
  await fastify.register(errorHandlerPlugin, errorOpts);
563
563
  trackPlugin("arc-error-handler", errorOpts);
@@ -1,14 +1,14 @@
1
1
  import { s as DEFAULT_UPDATE_METHOD, t as CRUD_OPERATIONS } from "./constants-Cxde4rpC.mjs";
2
- import { d as isMember, n as PUBLIC_SCOPE, u as isElevated } from "./types-C6TQjtdi.mjs";
3
- import { t as BaseController } from "./BaseController-CkM5dUh_.mjs";
2
+ import { d as isElevated, f as isMember, n as PUBLIC_SCOPE } from "./types-BhtYdxZU.mjs";
3
+ import { t as BaseController } from "./BaseController-CNwMYpDW.mjs";
4
4
  import { i as resolveEffectiveRoles, t as applyFieldReadPermissions } from "./fields-ipsbIRPK.mjs";
5
5
  import { t as getUserRoles } from "./types-ZUu_h0jp.mjs";
6
6
  import { t as requestContext } from "./requestContext-DYtmNpm5.mjs";
7
7
  import { i as getDefaultCrudSchemas } from "./utils-Dc0WhlIl.mjs";
8
- import { r as ForbiddenError } from "./errors-rxhfP7Hf.mjs";
8
+ import { r as ForbiddenError } from "./errors-NoQKsbAT.mjs";
9
9
  import { n as convertRouteSchema, t as convertOpenApiSchemas } from "./schemaConverter-DjzHpFam.mjs";
10
10
  import { t as hasEvents } from "./typeGuards-Cj5Rgvlg.mjs";
11
- import { r as getAvailablePresets, t as applyPresets } from "./presets-OMPaHMTY.mjs";
11
+ import { r as getAvailablePresets, t as applyPresets } from "./presets-CD3e6M7c.mjs";
12
12
  //#region src/pipeline/pipe.ts
13
13
  /**
14
14
  * Compose pipeline steps into an ordered array.
@@ -432,23 +432,31 @@ function createAdditionalRoutes(fastify, routes, controller, options) {
432
432
  const authMw = buildAuthMiddleware(fastify, route.permissions);
433
433
  const permissionMw = buildPermissionMiddleware(route.permissions, resourceName, opName);
434
434
  const customPreHandlers = typeof route.preHandler === "function" ? route.preHandler(fastify) : route.preHandler ?? [];
435
+ const pluginMw = route.method === "GET" ? cacheMw : [
436
+ "POST",
437
+ "PUT",
438
+ "PATCH"
439
+ ].includes(route.method) ? idempotencyMw : null;
435
440
  const preHandler = [
441
+ ...route.preAuth ?? [],
436
442
  arcDecorator,
437
443
  authMw,
438
444
  permissionMw,
439
- route.method === "GET" ? cacheMw : [
440
- "POST",
441
- "PUT",
442
- "PATCH"
443
- ].includes(route.method) ? idempotencyMw : null,
445
+ pluginMw,
444
446
  ...customPreHandlers
445
447
  ].filter(Boolean);
448
+ const isStream = route.streamResponse === true;
446
449
  fastify.route({
447
450
  method: route.method,
448
451
  url: route.path,
449
452
  schema,
450
453
  preHandler: preHandler.length > 0 ? preHandler : void 0,
451
- handler,
454
+ handler: isStream ? async (request, reply) => {
455
+ reply.raw.setHeader("Content-Type", "text/event-stream");
456
+ reply.raw.setHeader("Cache-Control", "no-cache");
457
+ reply.raw.setHeader("Connection", "keep-alive");
458
+ return handler(request, reply);
459
+ } : handler,
452
460
  ...rateLimitConfig ? { config: rateLimitConfig } : {}
453
461
  });
454
462
  }
@@ -940,6 +948,70 @@ function defineResource(config) {
940
948
  handler: hook.handler,
941
949
  priority: hook.priority ?? 10
942
950
  })));
951
+ if (config.hooks) {
952
+ const h = config.hooks;
953
+ const inlineHooks = [];
954
+ const toCtx = (ctx) => ({
955
+ data: ctx.data ?? ctx.result ?? {},
956
+ user: ctx.user,
957
+ meta: ctx.meta
958
+ });
959
+ if (h.beforeCreate) {
960
+ const fn = h.beforeCreate;
961
+ inlineHooks.push({
962
+ operation: "create",
963
+ phase: "before",
964
+ priority: 10,
965
+ handler: (ctx) => fn(toCtx(ctx))
966
+ });
967
+ }
968
+ if (h.afterCreate) {
969
+ const fn = h.afterCreate;
970
+ inlineHooks.push({
971
+ operation: "create",
972
+ phase: "after",
973
+ priority: 10,
974
+ handler: (ctx) => fn(toCtx(ctx))
975
+ });
976
+ }
977
+ if (h.beforeUpdate) {
978
+ const fn = h.beforeUpdate;
979
+ inlineHooks.push({
980
+ operation: "update",
981
+ phase: "before",
982
+ priority: 10,
983
+ handler: (ctx) => fn(toCtx(ctx))
984
+ });
985
+ }
986
+ if (h.afterUpdate) {
987
+ const fn = h.afterUpdate;
988
+ inlineHooks.push({
989
+ operation: "update",
990
+ phase: "after",
991
+ priority: 10,
992
+ handler: (ctx) => fn(toCtx(ctx))
993
+ });
994
+ }
995
+ if (h.beforeDelete) {
996
+ const fn = h.beforeDelete;
997
+ inlineHooks.push({
998
+ operation: "delete",
999
+ phase: "before",
1000
+ priority: 10,
1001
+ handler: (ctx) => fn(toCtx(ctx))
1002
+ });
1003
+ }
1004
+ if (h.afterDelete) {
1005
+ const fn = h.afterDelete;
1006
+ inlineHooks.push({
1007
+ operation: "delete",
1008
+ phase: "after",
1009
+ priority: 10,
1010
+ handler: (ctx) => fn(toCtx(ctx))
1011
+ });
1012
+ }
1013
+ resource._pendingHooks.push(...inlineHooks);
1014
+ }
943
1015
  if (!config.skipRegistry) try {
944
1016
  let openApiSchemas = config.openApiSchemas;
945
1017
  if (!openApiSchemas && config.adapter?.generateSchemas) {
@@ -1013,6 +1085,7 @@ var ResourceDefinition = class {
1013
1085
  this.queryParser = config.queryParser;
1014
1086
  this._appliedPresets = config._appliedPresets ?? [];
1015
1087
  this._pendingHooks = config._pendingHooks ?? [];
1088
+ if (config.onRegister) this._onRegister = config.onRegister;
1016
1089
  }
1017
1090
  /** Get repository from adapter (if available) */
1018
1091
  get repository() {
@@ -1067,6 +1140,8 @@ var ResourceDefinition = class {
1067
1140
  pattern,
1068
1141
  tags
1069
1142
  });
1143
+ const onRegister = self._onRegister;
1144
+ if (onRegister) await onRegister(fastify);
1070
1145
  await fastify.register(async (instance) => {
1071
1146
  const typedInstance = instance;
1072
1147
  let schemas = null;
@@ -1,4 +1,4 @@
1
- import { Q as RegistryEntry } from "../interface-DGmPxakH.mjs";
1
+ import { $ as RegistryEntry } from "../interface-BnNjdl33.mjs";
2
2
  import { t as ExternalOpenApiPaths } from "../externalPaths-DpO-s7r8.mjs";
3
3
  import { FastifyPluginAsync } from "fastify";
4
4
 
@@ -1,4 +1,4 @@
1
- import { Lt as ResourceDefinition, n as DataAdapter } from "../interface-DGmPxakH.mjs";
1
+ import { Bt as ResourceDefinition, n as DataAdapter } from "../interface-BnNjdl33.mjs";
2
2
  import { t as PermissionCheck } from "../types-BNUccdcf.mjs";
3
3
 
4
4
  //#region src/dynamic/ArcDynamicLoader.d.ts
@@ -1,6 +1,6 @@
1
1
  import { t as ArcQueryParser } from "../queryParser-CgCtsjti.mjs";
2
- import { n as defineResource } from "../defineResource-B22gcNvn.mjs";
3
- import { _ as ownerWithAdminBypass, b as publicReadAdminWrite, g as fullPublic, h as authenticated, m as adminOnly, x as readOnly, y as publicRead } from "../permissions-Jk5x3sxz.mjs";
2
+ import { n as defineResource } from "../defineResource-BYm3CIoe.mjs";
3
+ import { _ as ownerWithAdminBypass, b as publicReadAdminWrite, g as fullPublic, h as authenticated, m as adminOnly, x as readOnly, y as publicRead } from "../permissions-D9_AAtvz.mjs";
4
4
  //#region src/dynamic/ArcDynamicLoader.ts
5
5
  const VALID_FIELD_TYPES = new Set([
6
6
  "string",
@@ -93,6 +93,32 @@ declare function getUserId(scope: RequestScope): string | undefined;
93
93
  * ```
94
94
  */
95
95
  declare function getUserRoles(scope: RequestScope): string[];
96
+ /**
97
+ * Org context — canonical extraction from a Fastify request.
98
+ *
99
+ * Works regardless of auth type (JWT, Better Auth, custom) by reading
100
+ * `request.scope` and `request.user`. Eliminates the need for each resource
101
+ * to re-invent org extraction from headers/user/scope.
102
+ *
103
+ * @example
104
+ * ```typescript
105
+ * import { getOrgContext } from '@classytic/arc/scope';
106
+ *
107
+ * handler: async (request, reply) => {
108
+ * const { userId, organizationId, roles, orgRoles } = getOrgContext(request);
109
+ * }
110
+ * ```
111
+ */
112
+ declare function getOrgContext(request: {
113
+ scope?: RequestScope;
114
+ user?: Record<string, unknown> | null;
115
+ headers?: Record<string, string | string[] | undefined>;
116
+ }): {
117
+ userId: string | undefined;
118
+ organizationId: string | undefined;
119
+ roles: string[];
120
+ orgRoles: string[];
121
+ };
96
122
  /** Default public scope — used as initial decoration value */
97
123
  declare const PUBLIC_SCOPE: Readonly<RequestScope>;
98
124
  /** Default authenticated scope — used when user is logged in but no org */
@@ -118,4 +144,4 @@ interface ElevationEvent {
118
144
  declare const elevationPlugin: FastifyPluginAsync<ElevationOptions>;
119
145
  declare const _default: FastifyPluginAsync<ElevationOptions>;
120
146
  //#endregion
121
- export { AUTHENTICATED_SCOPE as a, getOrgId as c, getUserId as d, getUserRoles as f, isMember as g, isElevated as h, elevationPlugin as i, getOrgRoles as l, isAuthenticated as m, ElevationOptions as n, PUBLIC_SCOPE as o, hasOrgAccess as p, _default as r, RequestScope as s, ElevationEvent as t, getTeamId as u };
147
+ export { isMember as _, AUTHENTICATED_SCOPE as a, getOrgContext as c, getTeamId as d, getUserId as f, isElevated as g, isAuthenticated as h, elevationPlugin as i, getOrgId as l, hasOrgAccess as m, ElevationOptions as n, PUBLIC_SCOPE as o, getUserRoles as p, _default as r, RequestScope as s, ElevationEvent as t, getOrgRoles as u };
@@ -1,5 +1,5 @@
1
1
  import { t as __exportAll } from "./chunk-BpYLSNr0.mjs";
2
- import { f as isArcError } from "./errors-rxhfP7Hf.mjs";
2
+ import { p as isArcError } from "./errors-NoQKsbAT.mjs";
3
3
  import fp from "fastify-plugin";
4
4
  //#region src/plugins/errorHandler.ts
5
5
  var errorHandler_exports = /* @__PURE__ */ __exportAll({ errorHandlerPlugin: () => errorHandlerPlugin });
@@ -116,9 +116,25 @@ declare class ServiceUnavailableError extends ArcError {
116
116
  * Create error from status code
117
117
  */
118
118
  declare function createError(statusCode: number, message: string, details?: Record<string, unknown>): ArcError;
119
+ /**
120
+ * Create a domain-specific error with automatic HTTP status mapping.
121
+ *
122
+ * Eliminates manual `if (err.code === 'X') return status` boilerplate.
123
+ * Arc's error handler automatically maps `statusCode` to HTTP response.
124
+ *
125
+ * @example
126
+ * ```typescript
127
+ * import { createDomainError } from '@classytic/arc';
128
+ *
129
+ * throw createDomainError('MEMBER_NOT_FOUND', 'Member does not exist', 404);
130
+ * throw createDomainError('SELF_REFERRAL', 'Cannot refer yourself', 422);
131
+ * throw createDomainError('INSUFFICIENT_BALANCE', 'Not enough credits', 402, { balance: 0 });
132
+ * ```
133
+ */
134
+ declare function createDomainError(code: string, message: string, statusCode?: number, details?: Record<string, unknown>): ArcError;
119
135
  /**
120
136
  * Check if error is an Arc error
121
137
  */
122
138
  declare function isArcError(error: unknown): error is ArcError;
123
139
  //#endregion
124
- export { NotFoundError as a, RateLimitError as c, ValidationError as d, createError as f, ForbiddenError as i, ServiceUnavailableError as l, ConflictError as n, OrgAccessDeniedError as o, isArcError as p, ErrorDetails as r, OrgRequiredError as s, ArcError as t, UnauthorizedError as u };
140
+ export { NotFoundError as a, RateLimitError as c, ValidationError as d, createDomainError as f, ForbiddenError as i, ServiceUnavailableError as l, isArcError as m, ConflictError as n, OrgAccessDeniedError as o, createError as p, ErrorDetails as r, OrgRequiredError as s, ArcError as t, UnauthorizedError as u };
@@ -201,10 +201,32 @@ function createError(statusCode, message, details) {
201
201
  });
202
202
  }
203
203
  /**
204
+ * Create a domain-specific error with automatic HTTP status mapping.
205
+ *
206
+ * Eliminates manual `if (err.code === 'X') return status` boilerplate.
207
+ * Arc's error handler automatically maps `statusCode` to HTTP response.
208
+ *
209
+ * @example
210
+ * ```typescript
211
+ * import { createDomainError } from '@classytic/arc';
212
+ *
213
+ * throw createDomainError('MEMBER_NOT_FOUND', 'Member does not exist', 404);
214
+ * throw createDomainError('SELF_REFERRAL', 'Cannot refer yourself', 422);
215
+ * throw createDomainError('INSUFFICIENT_BALANCE', 'Not enough credits', 402, { balance: 0 });
216
+ * ```
217
+ */
218
+ function createDomainError(code, message, statusCode = 400, details) {
219
+ return new ArcError(message, {
220
+ code,
221
+ statusCode,
222
+ details
223
+ });
224
+ }
225
+ /**
204
226
  * Check if error is an Arc error
205
227
  */
206
228
  function isArcError(error) {
207
229
  return error instanceof ArcError;
208
230
  }
209
231
  //#endregion
210
- export { OrgAccessDeniedError as a, ServiceUnavailableError as c, createError as d, isArcError as f, NotFoundError as i, UnauthorizedError as l, ConflictError as n, OrgRequiredError as o, ForbiddenError as r, RateLimitError as s, ArcError as t, ValidationError as u };
232
+ export { OrgAccessDeniedError as a, ServiceUnavailableError as c, createDomainError as d, createError as f, NotFoundError as i, UnauthorizedError as l, ConflictError as n, OrgRequiredError as o, isArcError as p, ForbiddenError as r, RateLimitError as s, ArcError as t, ValidationError as u };
@@ -1,4 +1,4 @@
1
- import { a as CustomPluginAuthOption, c as RawBodyOptions, i as CustomAuthenticatorOption, l as UnderPressureOptions, n as BetterAuthOption, o as JwtAuthOption, r as CreateAppOptions, s as MultipartOptions, t as AuthOption } from "../types-Dt0-AI6E.mjs";
1
+ import { a as CustomPluginAuthOption, c as RawBodyOptions, i as CustomAuthenticatorOption, l as UnderPressureOptions, n as BetterAuthOption, o as JwtAuthOption, r as CreateAppOptions, s as MultipartOptions, t as AuthOption } from "../types-Guk83PDz.mjs";
2
2
  import { FastifyInstance } from "fastify";
3
3
 
4
4
  //#region src/factory/createApp.d.ts
@@ -1,4 +1,4 @@
1
- import { a as getPreset, i as developmentPreset, n as createApp, o as productionPreset, s as testingPreset, t as ArcFactory } from "../createApp-CBgVaFyh.mjs";
1
+ import { a as getPreset, i as developmentPreset, n as createApp, o as productionPreset, s as testingPreset, t as ArcFactory } from "../createApp-oic3-ieX.mjs";
2
2
  //#region src/factory/edge.ts
3
3
  /**
4
4
  * Convert a Fastify app into a Web Standards fetch handler.
@@ -1,2 +1,2 @@
1
- import { $t as HookContext, Qt as DefineHookOptions, an as HookSystemOptions, cn as afterUpdate, dn as beforeUpdate, en as HookHandler, fn as createHookSystem, in as HookSystem, ln as beforeCreate, nn as HookPhase, on as afterCreate, pn as defineHook, rn as HookRegistration, sn as afterDelete, tn as HookOperation, un as beforeDelete } from "../interface-DGmPxakH.mjs";
1
+ import { an as HookPhase, cn as HookSystemOptions, dn as afterUpdate, fn as beforeCreate, gn as defineHook, hn as createHookSystem, in as HookOperation, ln as afterCreate, mn as beforeUpdate, nn as HookContext, on as HookRegistration, pn as beforeDelete, rn as HookHandler, sn as HookSystem, tn as DefineHookOptions, un as afterDelete } from "../interface-BnNjdl33.mjs";
2
2
  export { type DefineHookOptions, type HookContext, type HookHandler, type HookOperation, type HookPhase, type HookRegistration, HookSystem, type HookSystemOptions, afterCreate, afterDelete, afterUpdate, beforeCreate, beforeDelete, beforeUpdate, createHookSystem, defineHook };
@@ -1,5 +1,5 @@
1
- import { s as RequestScope } from "./elevation-Ca_yveIO.mjs";
2
- import { D as FastifyWithDecorators, Mt as IControllerResponse, Nt as IRequestContext, et as RequestContext, jt as IController, nt as RequestWithExtras, x as CrudRouterOptions, y as CrudController } from "./interface-DGmPxakH.mjs";
1
+ import { s as RequestScope } from "./elevation-C_taLQrM.mjs";
2
+ import { Ft as IControllerResponse, It as IRequestContext, O as FastifyWithDecorators, Pt as IController, S as CrudRouterOptions, b as CrudController, rt as RequestWithExtras, tt as RequestContext } from "./interface-BnNjdl33.mjs";
3
3
  import { t as PermissionCheck } from "./types-BNUccdcf.mjs";
4
4
  import { FastifyInstance, FastifyReply, FastifyRequest, RouteHandlerMethod } from "fastify";
5
5
 
@@ -1,16 +1,12 @@
1
- import { G as ParsedQuery, U as OpenApiSchemas, X as QueryParserInterface, a as RepositoryLike, lt as RouteSchemaOptions, n as DataAdapter, o as SchemaMetadata, s as ValidationResult, zt as CrudRepository } from "./interface-DGmPxakH.mjs";
1
+ import { Ht as CrudRepository, K as ParsedQuery, W as OpenApiSchemas, Z as QueryParserInterface, a as RepositoryLike, dt as RouteSchemaOptions, n as DataAdapter, o as SchemaMetadata, s as ValidationResult } from "./interface-BnNjdl33.mjs";
2
2
  import { Model } from "mongoose";
3
3
 
4
4
  //#region src/adapters/mongoose.d.ts
5
5
  /**
6
- * Options for creating a Mongoose adapter
6
+ * Options for creating a Mongoose adapter.
7
+ * TDoc is auto-inferred from the Mongoose model — no explicit type needed.
7
8
  *
8
- * @typeParam TDoc - The document type (inferred or explicit)
9
- */
10
- /**
11
- * Options for creating a Mongoose adapter
12
- *
13
- * @typeParam TDoc - The document type (inferred or explicit)
9
+ * @typeParam TDoc - Inferred from `model: Model<TDoc>`
14
10
  */
15
11
  interface MongooseAdapterOptions<TDoc = unknown> {
16
12
  /** Mongoose model instance — preserves document type for type safety */
package/dist/index.d.mts CHANGED
@@ -1,10 +1,10 @@
1
- import { $ as RegistryStats, A as HealthCheck, B as MiddlewareConfig, C as EventDefinition, D as FastifyWithDecorators, E as FastifyWithAuth, F as IntrospectionData, Gt as Interceptor, I as IntrospectionPluginOptions, Jt as PipelineConfig, Kt as NextFunction, L as JWTPayload, Lt as ResourceDefinition, M as InferAdapterDoc, Mt as IControllerResponse, N as InferDocType, Nt as IRequestContext, O as FieldRule, P as InferResourceDoc, Pt as RouteHandler, Q as RegistryEntry, Rt as defineResource, S as CrudSchemas, T as FastifyRequestExtras, Ut as QueryOptions, V as MiddlewareHandler, Vt as PaginatedResult, W as OwnershipCheck, Wt as Guard, Xt as PipelineStep, Y as PresetResult, Yt as PipelineContext, Z as RateLimitConfig, Zt as Transform, _ as ConfigError, _t as ValidateOptions, a as RepositoryLike, b as CrudRouteKey, bt as BaseController, c as AdditionalRoute, ct as RouteHandlerMethod, et as RequestContext, f as ArcInternalMetadata, ft as TypedController, gt as UserOrganization, i as RelationMetadata, it as ResourceConfig, j as HealthOptions, jt as IController, k as GracefulShutdownOptions, kt as ControllerLike, l as AnyRecord, lt as RouteSchemaOptions, m as AuthPluginOptions, mt as TypedResourceConfig, n as DataAdapter, nt as RequestWithExtras, o as SchemaMetadata, ot as ResourceMetadata, pt as TypedRepository, q as PresetFunction, qt as OperationFilter, r as FieldMetadata, s as ValidationResult, tt as RequestIdOptions, u as ApiResponse, ut as ServiceContext, vt as ValidationResult$1, x as CrudRouterOptions, xt as BaseControllerOptions, y as CrudController, zt as CrudRepository } from "./interface-DGmPxakH.mjs";
1
+ import { $ as RegistryEntry, $t as PipelineStep, A as GracefulShutdownOptions, Bt as ResourceDefinition, C as CrudSchemas, Ct as BaseController, D as FastifyWithAuth, E as FastifyRequestExtras, F as InferResourceDoc, Ft as IControllerResponse, G as OwnershipCheck, H as MiddlewareHandler, Ht as CrudRepository, I as IntrospectionData, It as IRequestContext, J as PresetFunction, Jt as Interceptor, Kt as QueryOptions, L as IntrospectionPluginOptions, Lt as RouteHandler, M as HealthOptions, Mt as ControllerLike, N as InferAdapterDoc, O as FastifyWithDecorators, P as InferDocType, Pt as IController, Q as RateLimitConfig, Qt as PipelineContext, R as JWTPayload, S as CrudRouterOptions, V as MiddlewareConfig, Vt as defineResource, Wt as PaginatedResult, X as PresetResult, Xt as OperationFilter, Yt as NextFunction, Zt as PipelineConfig, a as RepositoryLike, at as ResourceConfig, b as CrudController, bt as ValidationResult$1, c as AdditionalRoute, ct as ResourceMetadata, dt as RouteSchemaOptions, en as Transform, et as RegistryStats, f as ArcInternalMetadata, ft as ServiceContext, gt as TypedResourceConfig, h as AuthPluginOptions, ht as TypedRepository, i as RelationMetadata, j as HealthCheck, k as FieldRule, l as AnyRecord, mt as TypedController, n as DataAdapter, nt as RequestIdOptions, o as SchemaMetadata, p as ArcRequest, qt as Guard, r as FieldMetadata, rt as RequestWithExtras, s as ValidationResult, tt as RequestContext, u as ApiResponse, ut as RouteHandlerMethod, v as ConfigError, vt as UserOrganization, w as EventDefinition, wt as BaseControllerOptions, x as CrudRouteKey, xt as envelope, yt as ValidateOptions } from "./interface-BnNjdl33.mjs";
2
2
  import { a as applyFieldWritePermissions, i as applyFieldReadPermissions, n as FieldPermissionMap, o as fields, t as FieldPermission } from "./fields-DFwdaWCq.mjs";
3
3
  import { i as UserBase, n as PermissionContext, r as PermissionResult, t as PermissionCheck } from "./types-BNUccdcf.mjs";
4
- import { l as createMongooseAdapter, o as createPrismaAdapter, s as MongooseAdapter, t as PrismaAdapter } from "./index-yhxyjqNb.mjs";
5
- import { A as RESERVED_QUERY_PARAMS, C as HookOperation, D as MAX_SEARCH_LENGTH, E as MAX_REGEX_LENGTH, O as MUTATION_OPERATIONS, S as HOOK_PHASES, T as MAX_FILTER_DEPTH, _ as DEFAULT_MAX_LIMIT, a as getControllerScope, b as DEFAULT_UPDATE_METHOD, g as DEFAULT_LIMIT, h as DEFAULT_ID_FIELD, j as SYSTEM_FIELDS, k as MutationOperation, m as CrudOperation, p as CRUD_OPERATIONS, v as DEFAULT_SORT, w as HookPhase, x as HOOK_OPERATIONS, y as DEFAULT_TENANT_FIELD } from "./index-BL8CaQih.mjs";
4
+ import { l as createMongooseAdapter, o as createPrismaAdapter, s as MongooseAdapter, t as PrismaAdapter } from "./index-bX8T5bmn.mjs";
5
+ import { A as RESERVED_QUERY_PARAMS, C as HookOperation, D as MAX_SEARCH_LENGTH, E as MAX_REGEX_LENGTH, O as MUTATION_OPERATIONS, S as HOOK_PHASES, T as MAX_FILTER_DEPTH, _ as DEFAULT_MAX_LIMIT, a as getControllerScope, b as DEFAULT_UPDATE_METHOD, g as DEFAULT_LIMIT, h as DEFAULT_ID_FIELD, j as SYSTEM_FIELDS, k as MutationOperation, m as CrudOperation, p as CRUD_OPERATIONS, v as DEFAULT_SORT, w as HookPhase, x as HOOK_OPERATIONS, y as DEFAULT_TENANT_FIELD } from "./index-TG7-pXDC.mjs";
6
6
  import { C as publicRead, S as presets_d_exports, T as readOnly, _ as when, a as allOf, b as fullPublic, c as createDynamicPermissionMatrix, d as requireAuth, f as requireOrgMembership, g as requireTeamMembership, h as requireRoles, l as createOrgPermissions, m as requireOwnership, n as DynamicPermissionMatrix, o as allowPublic, p as requireOrgRole, r as DynamicPermissionMatrixConfig, s as anyOf, u as denyAll, v as adminOnly, w as publicReadAdminWrite, x as ownerWithAdminBypass, y as authenticated } from "./index-Diqcm14c.mjs";
7
- import { a as NotFoundError, d as ValidationError, i as ForbiddenError, t as ArcError, u as UnauthorizedError } from "./errors-CPpvPHT0.mjs";
7
+ import { a as NotFoundError, d as ValidationError, f as createDomainError, i as ForbiddenError, t as ArcError, u as UnauthorizedError } from "./errors-CcVbl1-T.mjs";
8
8
  import { AsyncLocalStorage } from "node:async_hooks";
9
9
 
10
10
  //#region src/context/requestContext.d.ts
@@ -252,4 +252,4 @@ declare function arcLog(module: string): ArcLogger;
252
252
  //#region src/index.d.ts
253
253
  declare const version: string;
254
254
  //#endregion
255
- export { type ValidationResult as AdapterValidationResult, type AdditionalRoute, type AnyRecord, type ApiResponse, ArcError, type ArcInternalMetadata, type ArcLogWriter, type ArcLogger, type ArcLoggerOptions, type AuthPluginOptions, BaseController, type BaseControllerOptions, CRUD_OPERATIONS, type ConfigError, type ControllerLike, type CrudController, CrudOperation, type CrudRepository, type CrudRouteKey, type CrudRouterOptions, type CrudSchemas, DEFAULT_ID_FIELD, DEFAULT_LIMIT, DEFAULT_MAX_LIMIT, DEFAULT_SORT, DEFAULT_TENANT_FIELD, DEFAULT_UPDATE_METHOD, type DataAdapter, type DynamicPermissionMatrix, type DynamicPermissionMatrixConfig, type EventDefinition, type FastifyRequestExtras, type FastifyWithAuth, type FastifyWithDecorators, type FieldMetadata, type FieldPermission, type FieldPermissionMap, type FieldRule, ForbiddenError, type GracefulShutdownOptions, type Guard, HOOK_OPERATIONS, HOOK_PHASES, type HealthCheck, type HealthOptions, HookOperation, HookPhase, type IController, type IControllerResponse, type IRequestContext, type InferAdapterDoc, type InferDocType, type InferResourceDoc, type Interceptor, type IntrospectionData, type IntrospectionPluginOptions, type JWTPayload, MAX_FILTER_DEPTH, MAX_REGEX_LENGTH, MAX_SEARCH_LENGTH, MUTATION_OPERATIONS, type MiddlewareConfig, MongooseAdapter, MutationOperation, type NamedMiddleware, NotFoundError, type OwnershipCheck, type PaginatedResult, type PermissionCheck, type PermissionContext, type PermissionResult, type PipelineConfig, type PipelineContext, type PipelineStep, type PresetFunction, type PresetResult, PrismaAdapter, type QueryOptions, RESERVED_QUERY_PARAMS, type RateLimitConfig, type RegistryEntry, type RegistryStats, type RelationMetadata, type RepositoryLike, type RequestContext, type RequestIdOptions, type RequestStore, type RequestWithExtras, type ResourceConfig, ResourceDefinition, type ResourceMetadata, type RouteHandler, type RouteHandlerMethod, type RouteSchemaOptions, SYSTEM_FIELDS, type SchemaMetadata, type ServiceContext, type Transform, type TypedController, type TypedRepository, type TypedResourceConfig, UnauthorizedError, type UserBase, type UserOrganization, type ValidateOptions, ValidationError, type ValidationResult$1 as ValidationResult, adminOnly, allOf, allowPublic, anyOf, applyFieldReadPermissions, applyFieldWritePermissions, arcLog, assertValidConfig, authenticated, configureArcLogger, createDynamicPermissionMatrix, createMongooseAdapter, createOrgPermissions, createPrismaAdapter, defineResource, denyAll, fields, formatValidationErrors, fullPublic, getControllerScope, guard, intercept, middleware, ownerWithAdminBypass, presets_d_exports as permissions, pipe, publicRead, publicReadAdminWrite, readOnly, requestContext, requireAuth, requireOrgMembership, requireOrgRole, requireOwnership, requireRoles, requireTeamMembership, sortMiddlewares, transform, validateResourceConfig, version, when };
255
+ export { type ValidationResult as AdapterValidationResult, type AdditionalRoute, type AnyRecord, type ApiResponse, ArcError, type ArcInternalMetadata, type ArcLogWriter, type ArcLogger, type ArcLoggerOptions, type ArcRequest, type AuthPluginOptions, BaseController, type BaseControllerOptions, CRUD_OPERATIONS, type ConfigError, type ControllerLike, type CrudController, CrudOperation, type CrudRepository, type CrudRouteKey, type CrudRouterOptions, type CrudSchemas, DEFAULT_ID_FIELD, DEFAULT_LIMIT, DEFAULT_MAX_LIMIT, DEFAULT_SORT, DEFAULT_TENANT_FIELD, DEFAULT_UPDATE_METHOD, type DataAdapter, type DynamicPermissionMatrix, type DynamicPermissionMatrixConfig, type EventDefinition, type FastifyRequestExtras, type FastifyWithAuth, type FastifyWithDecorators, type FieldMetadata, type FieldPermission, type FieldPermissionMap, type FieldRule, ForbiddenError, type GracefulShutdownOptions, type Guard, HOOK_OPERATIONS, HOOK_PHASES, type HealthCheck, type HealthOptions, HookOperation, HookPhase, type IController, type IControllerResponse, type IRequestContext, type InferAdapterDoc, type InferDocType, type InferResourceDoc, type Interceptor, type IntrospectionData, type IntrospectionPluginOptions, type JWTPayload, MAX_FILTER_DEPTH, MAX_REGEX_LENGTH, MAX_SEARCH_LENGTH, MUTATION_OPERATIONS, type MiddlewareConfig, MongooseAdapter, MutationOperation, type NamedMiddleware, NotFoundError, type OwnershipCheck, type PaginatedResult, type PermissionCheck, type PermissionContext, type PermissionResult, type PipelineConfig, type PipelineContext, type PipelineStep, type PresetFunction, type PresetResult, PrismaAdapter, type QueryOptions, RESERVED_QUERY_PARAMS, type RateLimitConfig, type RegistryEntry, type RegistryStats, type RelationMetadata, type RepositoryLike, type RequestContext, type RequestIdOptions, type RequestStore, type RequestWithExtras, type ResourceConfig, ResourceDefinition, type ResourceMetadata, type RouteHandler, type RouteHandlerMethod, type RouteSchemaOptions, SYSTEM_FIELDS, type SchemaMetadata, type ServiceContext, type Transform, type TypedController, type TypedRepository, type TypedResourceConfig, UnauthorizedError, type UserBase, type UserOrganization, type ValidateOptions, ValidationError, type ValidationResult$1 as ValidationResult, adminOnly, allOf, allowPublic, anyOf, applyFieldReadPermissions, applyFieldWritePermissions, arcLog, assertValidConfig, authenticated, configureArcLogger, createDomainError, createDynamicPermissionMatrix, createMongooseAdapter, createOrgPermissions, createPrismaAdapter, defineResource, denyAll, envelope, fields, formatValidationErrors, fullPublic, getControllerScope, guard, intercept, middleware, ownerWithAdminBypass, presets_d_exports as permissions, pipe, publicRead, publicReadAdminWrite, readOnly, requestContext, requireAuth, requireOrgMembership, requireOrgRole, requireOwnership, requireRoles, requireTeamMembership, sortMiddlewares, transform, validateResourceConfig, version, when };
package/dist/index.mjs CHANGED
@@ -1,11 +1,12 @@
1
1
  import { a as DEFAULT_SORT, c as HOOK_OPERATIONS, d as MAX_REGEX_LENGTH, f as MAX_SEARCH_LENGTH, h as SYSTEM_FIELDS, i as DEFAULT_MAX_LIMIT, l as HOOK_PHASES, m as RESERVED_QUERY_PARAMS, n as DEFAULT_ID_FIELD, o as DEFAULT_TENANT_FIELD, p as MUTATION_OPERATIONS, r as DEFAULT_LIMIT, s as DEFAULT_UPDATE_METHOD, t as CRUD_OPERATIONS, u as MAX_FILTER_DEPTH } from "./constants-Cxde4rpC.mjs";
2
2
  import { a as createMongooseAdapter, i as MongooseAdapter, r as createPrismaAdapter, t as PrismaAdapter } from "./adapters-DTC4Ug66.mjs";
3
- import { t as BaseController } from "./BaseController-CkM5dUh_.mjs";
3
+ import { t as BaseController } from "./BaseController-CNwMYpDW.mjs";
4
+ import { envelope } from "./types/index.mjs";
4
5
  import { n as applyFieldWritePermissions, r as fields, t as applyFieldReadPermissions } from "./fields-ipsbIRPK.mjs";
5
6
  import { t as requestContext } from "./requestContext-DYtmNpm5.mjs";
6
- import { i as NotFoundError, l as UnauthorizedError, r as ForbiddenError, t as ArcError, u as ValidationError } from "./errors-rxhfP7Hf.mjs";
7
- import { a as validateResourceConfig, f as getControllerScope, i as formatValidationErrors, m as pipe, n as defineResource, r as assertValidConfig, t as ResourceDefinition } from "./defineResource-B22gcNvn.mjs";
8
- import { _ as ownerWithAdminBypass, a as createOrgPermissions, b as publicReadAdminWrite, c as requireOrgMembership, d as requireRoles, f as requireTeamMembership, g as fullPublic, h as authenticated, i as createDynamicPermissionMatrix, l as requireOrgRole, m as adminOnly, n as allowPublic, o as denyAll, p as when, r as anyOf, s as requireAuth, t as allOf, u as requireOwnership, v as presets_exports, x as readOnly, y as publicRead } from "./permissions-Jk5x3sxz.mjs";
7
+ import { d as createDomainError, i as NotFoundError, l as UnauthorizedError, r as ForbiddenError, t as ArcError, u as ValidationError } from "./errors-NoQKsbAT.mjs";
8
+ import { a as validateResourceConfig, f as getControllerScope, i as formatValidationErrors, m as pipe, n as defineResource, r as assertValidConfig, t as ResourceDefinition } from "./defineResource-BYm3CIoe.mjs";
9
+ import { _ as ownerWithAdminBypass, a as createOrgPermissions, b as publicReadAdminWrite, c as requireOrgMembership, d as requireRoles, f as requireTeamMembership, g as fullPublic, h as authenticated, i as createDynamicPermissionMatrix, l as requireOrgRole, m as adminOnly, n as allowPublic, o as denyAll, p as when, r as anyOf, s as requireAuth, t as allOf, u as requireOwnership, v as presets_exports, x as readOnly, y as publicRead } from "./permissions-D9_AAtvz.mjs";
9
10
  import { n as configureArcLogger, t as arcLog } from "./logger-Dz3j1ItV.mjs";
10
11
  //#region src/middleware/middleware.ts
11
12
  /**
@@ -126,6 +127,6 @@ function transform(name, handlerOrOptions) {
126
127
  }
127
128
  //#endregion
128
129
  //#region src/index.ts
129
- const version = "2.4.3";
130
+ const version = "2.5.0";
130
131
  //#endregion
131
- export { ArcError, BaseController, CRUD_OPERATIONS, DEFAULT_ID_FIELD, DEFAULT_LIMIT, DEFAULT_MAX_LIMIT, DEFAULT_SORT, DEFAULT_TENANT_FIELD, DEFAULT_UPDATE_METHOD, ForbiddenError, HOOK_OPERATIONS, HOOK_PHASES, MAX_FILTER_DEPTH, MAX_REGEX_LENGTH, MAX_SEARCH_LENGTH, MUTATION_OPERATIONS, MongooseAdapter, NotFoundError, PrismaAdapter, RESERVED_QUERY_PARAMS, ResourceDefinition, SYSTEM_FIELDS, UnauthorizedError, ValidationError, adminOnly, allOf, allowPublic, anyOf, applyFieldReadPermissions, applyFieldWritePermissions, arcLog, assertValidConfig, authenticated, configureArcLogger, createDynamicPermissionMatrix, createMongooseAdapter, createOrgPermissions, createPrismaAdapter, defineResource, denyAll, fields, formatValidationErrors, fullPublic, getControllerScope, guard, intercept, middleware, ownerWithAdminBypass, presets_exports as permissions, pipe, publicRead, publicReadAdminWrite, readOnly, requestContext, requireAuth, requireOrgMembership, requireOrgRole, requireOwnership, requireRoles, requireTeamMembership, sortMiddlewares, transform, validateResourceConfig, version, when };
132
+ export { ArcError, BaseController, CRUD_OPERATIONS, DEFAULT_ID_FIELD, DEFAULT_LIMIT, DEFAULT_MAX_LIMIT, DEFAULT_SORT, DEFAULT_TENANT_FIELD, DEFAULT_UPDATE_METHOD, ForbiddenError, HOOK_OPERATIONS, HOOK_PHASES, MAX_FILTER_DEPTH, MAX_REGEX_LENGTH, MAX_SEARCH_LENGTH, MUTATION_OPERATIONS, MongooseAdapter, NotFoundError, PrismaAdapter, RESERVED_QUERY_PARAMS, ResourceDefinition, SYSTEM_FIELDS, UnauthorizedError, ValidationError, adminOnly, allOf, allowPublic, anyOf, applyFieldReadPermissions, applyFieldWritePermissions, arcLog, assertValidConfig, authenticated, configureArcLogger, createDomainError, createDynamicPermissionMatrix, createMongooseAdapter, createOrgPermissions, createPrismaAdapter, defineResource, denyAll, envelope, fields, formatValidationErrors, fullPublic, getControllerScope, guard, intercept, middleware, ownerWithAdminBypass, presets_exports as permissions, pipe, publicRead, publicReadAdminWrite, readOnly, requestContext, requireAuth, requireOrgMembership, requireOrgRole, requireOwnership, requireRoles, requireTeamMembership, sortMiddlewares, transform, validateResourceConfig, version, when };
@@ -4,7 +4,7 @@ const eventGatewayPluginImpl = async (fastify, opts = {}) => {
4
4
  const { auth = true, orgScoped = false, roomPolicy, maxMessageBytes, maxSubscriptionsPerClient, authenticate } = opts;
5
5
  if (auth && !authenticate && !fastify.hasDecorator("authenticate")) throw new Error("[arc-event-gateway] auth is true but fastify.authenticate is not registered. Register an auth plugin first, provide a custom authenticate function, or set auth: false.");
6
6
  if (opts.sse !== false) {
7
- const { default: ssePlugin } = await import("../sse-BkViJPlT.mjs").then((n) => n.r);
7
+ const { default: ssePlugin } = await import("../sse-BF7GR7IB.mjs").then((n) => n.r);
8
8
  await fastify.register(ssePlugin, {
9
9
  path: opts.sse?.path ?? "/events/stream",
10
10
  requireAuth: auth,
@@ -1,7 +1,7 @@
1
1
  import { WebSocketClient, WebSocketMessage, WebSocketPluginOptions } from "./websocket.mjs";
2
2
  import { EventGatewayOptions } from "./event-gateway.mjs";
3
3
  import { JobDefinition, JobDispatchOptions, JobDispatcher, JobMeta, JobsPluginOptions, QueueStats } from "./jobs.mjs";
4
- import { c as McpResourceConfig, f as ToolAnnotations, i as CrudOperation, l as PromptDefinition, m as ToolDefinition, n as CallToolResult, o as McpAuthResult, p as ToolContext, r as CreateMcpServerConfig, s as McpPluginOptions, t as BetterAuthHandler } from "../types-BJmgxNbF.mjs";
4
+ import { c as McpResourceConfig, f as ToolAnnotations, i as CrudOperation, l as PromptDefinition, m as ToolDefinition, n as CallToolResult, o as McpAuthResult, p as ToolContext, r as CreateMcpServerConfig, s as McpPluginOptions, t as BetterAuthHandler } from "../types-ByCPlfZ1.mjs";
5
5
  import { StreamlinePluginOptions, WorkflowLike, WorkflowRunLike } from "./streamline.mjs";
6
6
  import { WebhookDeliveryRecord, WebhookManager, WebhookPluginOptions, WebhookStore, WebhookSubscription } from "./webhooks.mjs";
7
7
  export { type BetterAuthHandler, type CallToolResult, type CreateMcpServerConfig, type CrudOperation, type EventGatewayOptions, type JobDefinition, type JobDispatchOptions, type JobDispatcher, type JobMeta, type JobsPluginOptions, type McpAuthResult, type McpPluginOptions, type McpResourceConfig, type PromptDefinition, type QueueStats, type StreamlinePluginOptions, type ToolAnnotations, type ToolContext, type ToolDefinition, type WebSocketClient, type WebSocketMessage, type WebSocketPluginOptions, type WebhookDeliveryRecord, type WebhookManager, type WebhookPluginOptions, type WebhookStore, type WebhookSubscription, type WorkflowLike, type WorkflowRunLike };
@@ -1,5 +1,5 @@
1
- import { Lt as ResourceDefinition } from "../../interface-DGmPxakH.mjs";
2
- import { a as McpAuthResolver, c as McpResourceConfig, d as SessionEntry, f as ToolAnnotations, i as CrudOperation, l as PromptDefinition, m as ToolDefinition, n as CallToolResult, o as McpAuthResult, p as ToolContext, r as CreateMcpServerConfig, s as McpPluginOptions, t as BetterAuthHandler, u as PromptResult } from "../../types-BJmgxNbF.mjs";
1
+ import { Bt as ResourceDefinition } from "../../interface-BnNjdl33.mjs";
2
+ import { a as McpAuthResolver, c as McpResourceConfig, d as SessionEntry, f as ToolAnnotations, i as CrudOperation, l as PromptDefinition, m as ToolDefinition, n as CallToolResult, o as McpAuthResult, p as ToolContext, r as CreateMcpServerConfig, s as McpPluginOptions, t as BetterAuthHandler, u as PromptResult } from "../../types-ByCPlfZ1.mjs";
3
3
  import { FastifyPluginAsync } from "fastify";
4
4
  import { z } from "zod";
5
5
 
@@ -1,4 +1,4 @@
1
- import { n as fieldRulesToZod, r as createMcpServer, t as resourceToTools } from "../../resourceToTools-PMFE8HIv.mjs";
1
+ import { n as fieldRulesToZod, r as createMcpServer, t as resourceToTools } from "../../resourceToTools-CN0lwJrL.mjs";
2
2
  import { createHash } from "node:crypto";
3
3
  import fp from "fastify-plugin";
4
4
  //#region src/integrations/mcp/definePrompt.ts
@@ -1,4 +1,4 @@
1
- import { o as McpAuthResult, s as McpPluginOptions } from "../../types-BJmgxNbF.mjs";
1
+ import { o as McpAuthResult, s as McpPluginOptions } from "../../types-ByCPlfZ1.mjs";
2
2
 
3
3
  //#region src/integrations/mcp/testing.d.ts
4
4
  interface TestMcpClientOptions {
@@ -1,4 +1,4 @@
1
- import { r as createMcpServer, t as resourceToTools } from "../../resourceToTools-PMFE8HIv.mjs";
1
+ import { r as createMcpServer, t as resourceToTools } from "../../resourceToTools-CN0lwJrL.mjs";
2
2
  //#region src/integrations/mcp/testing.ts
3
3
  /**
4
4
  * @classytic/arc/mcp/testing — MCP Test Utilities