@classytic/arc 2.41.0 → 2.43.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{EventTransport-CbUKDzZZ.d.mts → EventTransport-CiicKz2Z.d.mts} +1 -1
- package/dist/{EventTransport-n7qO5Cz3.mjs → EventTransport-tzA7CAB4.mjs} +22 -17
- package/dist/{HookSystem-CxvZBo77.mjs → HookSystem-B6UaKRbF.mjs} +2 -2
- package/dist/{QueryCache-DFA-QrU9.d.mts → QueryCache--5uAuYPW.d.mts} +7 -3
- package/dist/{ResourceRegistry-Cu7uTJp9.mjs → ResourceRegistry-CuCARu2B.mjs} +44 -13
- package/dist/actionPermissions-BotX1YOa.mjs +776 -0
- package/dist/audit/index.d.mts +43 -5
- package/dist/audit/index.mjs +48 -26
- package/dist/auth/audit.mjs +1 -1
- package/dist/auth/index.d.mts +43 -13
- package/dist/auth/index.mjs +130 -155
- package/dist/auth/redis-session.mjs +1 -1
- package/dist/{authorizationDecision-2YY_Kaj1.mjs → authorizationDecision-DQYrkl5f.mjs} +7 -102
- package/dist/{base-CxrV1LmG.d.mts → base-CZyixEQR.d.mts} +27 -5
- package/dist/boundedMap-BULzfXYU.mjs +57 -0
- package/dist/{buildHandler-CUhjGHGZ.mjs → buildHandler-CRQ8EcX5.mjs} +4 -4
- package/dist/cache/index.d.mts +22 -34
- package/dist/cache/index.mjs +4 -4
- package/dist/{caching-DsWDjIxx.mjs → caching-Cc2M1DwO.mjs} +3 -3
- package/dist/claimed-B10RTfkM.mjs +8 -0
- package/dist/cleanup/index.d.mts +6 -10
- package/dist/cleanup/index.mjs +27 -73
- package/dist/cli/commands/describe.d.mts +4 -2
- package/dist/cli/commands/describe.mjs +7 -4
- package/dist/cli/commands/docs.mjs +3 -3
- package/dist/cli/commands/doctor.mjs +1 -1
- package/dist/cli/commands/generate.mjs +2 -2
- package/dist/cli/commands/init.mjs +2 -2
- package/dist/cli/commands/introspect.mjs +2 -2
- package/dist/cli/index.mjs +3 -3
- package/dist/{constants-BxLgNFF7.mjs → constants-Cu7Mx7_U.mjs} +4 -2
- package/dist/context/index.d.mts +2 -5
- package/dist/context/index.mjs +18 -38
- package/dist/core/index.d.mts +3 -3
- package/dist/core/index.mjs +8 -8
- package/dist/{core-iNGqYerO.mjs → core-Cb0LjccA.mjs} +5 -4
- package/dist/{createActionRouter-BBlbPs3k.mjs → createActionRouter-xjqonMRO.mjs} +87 -39
- package/dist/{createAggregationRouter-Dv5SuK2x.mjs → createAggregationRouter-zRYWw_5D.mjs} +11 -8
- package/dist/{preloadResources-Bbp4QJ8V.mjs → createApp-D-953ZAq.mjs} +299 -390
- package/dist/{createMcpServer-CbDWkZ1T.d.mts → createMcpServer-C9cxS8zt.d.mts} +1 -1
- package/dist/{defineAggregation-UyeurGkp.mjs → defineAggregation-Bm8RjMbq.mjs} +1 -1
- package/dist/{defineResource-DzGT-2LP.mjs → defineResource-DIC7JZGU.mjs} +118 -1024
- package/dist/discovery/index.mjs +1 -1
- package/dist/docs/index.d.mts +10 -4
- package/dist/docs/index.mjs +4 -4
- package/dist/{elevation-BXCfVcNG.d.mts → elevation-BW2J3tNj.d.mts} +1 -2
- package/dist/{elevation-BF-vhGxY.mjs → elevation-DG8SrLN-.mjs} +41 -12
- package/dist/encryption/index.mjs +3 -3
- package/dist/{errorHandler-CIMkCOWm.mjs → errorHandler-BnfDviL1.mjs} +26 -5
- package/dist/{errors-C_YhELhe.mjs → errors-CtrywMHP.mjs} +58 -23
- package/dist/{errors-BGdVwP25.d.mts → errors-JYc9vwqE.d.mts} +9 -0
- package/dist/{eventPlugin-B52abJ8W.d.mts → eventPlugin-BtmA4-3P.d.mts} +65 -9
- package/dist/{eventPlugin-CmXaPWLv.mjs → eventPlugin-Q6BhzHzs.mjs} +82 -21
- package/dist/{subscribe-helpers-AVYPgqTl.mjs → eventTypes-Cdhm6ZlV.mjs} +151 -17
- package/dist/events/index.d.mts +33 -8
- package/dist/events/index.mjs +49 -53
- package/dist/events/transports/redis-stream-entry.d.mts +1 -1
- package/dist/events/transports/redis-stream-entry.mjs +139 -157
- package/dist/events/transports/redis.d.mts +1 -1
- package/dist/events/transports/redis.mjs +2 -2
- package/dist/factory/index.d.mts +32 -17
- package/dist/factory/index.mjs +213 -32
- package/dist/{fastify-augmentation-Cq2nHVaW.d.mts → fastify-augmentation-DhUJ-mvo.d.mts} +11 -25
- package/dist/{fields-I_EeRWND.d.mts → fields-BBSpf8pS.d.mts} +1 -1
- package/dist/{fields-BTyPLHK0.mjs → fields-ToPYpMqS.mjs} +1 -1
- package/dist/filter-merge-IpGywvym.mjs +99 -0
- package/dist/{generate-D_YmiCNf.mjs → generate-DRTkLlIl.mjs} +2 -2
- package/dist/{headers-CNECDE6q.mjs → headers-BbkIF6vA.mjs} +2 -2
- package/dist/health-D-Ft6JM6.mjs +22 -0
- package/dist/{health-CxQzbJmr.mjs → health-DqbsG-_w.mjs} +115 -55
- package/dist/hooks/index.d.mts +2 -2
- package/dist/hooks/index.mjs +2 -2
- package/dist/idempotency/index.d.mts +31 -7
- package/dist/idempotency/index.mjs +155 -98
- package/dist/idempotency/redis.d.mts +1 -1
- package/dist/idempotency/redis.mjs +48 -11
- package/dist/{index-BHdZD8zK.d.mts → index-Bxriq3so.d.mts} +84 -21
- package/dist/{preloadResources-CjS2OfpU.d.mts → index-C8zVGYsk.d.mts} +37 -38
- package/dist/{index-D4u76eQW.d.mts → index-CRoPtISf.d.mts} +23 -73
- package/dist/{index-CbJiYrfv.d.mts → index-Chgz3d0i.d.mts} +1 -1
- package/dist/index-JdbZAIsm.d.mts +510 -0
- package/dist/{index-DHbyPo5j.d.mts → index-mqaqZNpe.d.mts} +253 -254
- package/dist/index.d.mts +8 -8
- package/dist/index.mjs +11 -11
- package/dist/{init-Y2MlSN9n.mjs → init-B_oUYDXI.mjs} +1 -1
- package/dist/integrations/event-gateway.d.mts +8 -3
- package/dist/integrations/event-gateway.mjs +4 -4
- package/dist/integrations/index.d.mts +3 -3
- package/dist/integrations/index.mjs +1 -1
- package/dist/integrations/jobs/index.d.mts +1 -1
- package/dist/integrations/jobs/index.mjs +18 -5
- package/dist/integrations/mcp/index.d.mts +72 -59
- package/dist/integrations/mcp/index.mjs +19 -4
- package/dist/integrations/mcp/testing.d.mts +2 -2
- package/dist/integrations/mcp/testing.mjs +2 -2
- package/dist/integrations/streamline.d.mts +78 -136
- package/dist/integrations/streamline.mjs +116 -54
- package/dist/integrations/webhooks.d.mts +60 -120
- package/dist/integrations/webhooks.mjs +36 -80
- package/dist/integrations/websocket-pushref-redis.d.mts +1 -1
- package/dist/integrations/websocket-pushref-redis.mjs +1 -1
- package/dist/integrations/websocket-redis.d.mts +1 -1
- package/dist/integrations/websocket-redis.mjs +1 -1
- package/dist/integrations/websocket.d.mts +3 -3
- package/dist/integrations/websocket.mjs +2 -2
- package/dist/{interface-DEWNOMza.d.mts → interface-C0395yUN.d.mts} +13 -1
- package/dist/{jsonBody-Cq9KYl2Z.mjs → jsonBody-B4YVGcql.mjs} +2 -2
- package/dist/{keys-Cmv4cBRa.mjs → keys-B2KtgMLJ.mjs} +7 -18
- package/dist/{loadResources-CblF7xt2.mjs → loadResources-Dn4lalw2.mjs} +3 -3
- package/dist/{loadResourcesFromEntry-99fIMC3p.mjs → loadResourcesFromEntry-3sLYbuse.mjs} +2 -2
- package/dist/logger/index.d.mts +1 -8
- package/dist/logger/index.mjs +3 -153
- package/dist/logger-DXjfIqjV.mjs +160 -0
- package/dist/{mcpPlugin-xF3Gw-HW.mjs → mcpPlugin-C08HalN5.mjs} +433 -170
- package/dist/{memory-CpDZ9NPw.mjs → memory-9Cp7611C.mjs} +36 -34
- package/dist/{metrics-BaKnq8ag.mjs → metrics-CWI11eRu.mjs} +39 -72
- package/dist/middleware/index.d.mts +2 -2
- package/dist/middleware/index.mjs +3 -3
- package/dist/migrations/index.mjs +2 -2
- package/dist/{module-BkQEesNQ.mjs → module-BSvOQC7E.mjs} +8 -8
- package/dist/multiTenant-cY0FkDiA.d.mts +104 -0
- package/dist/{multipartBody-C92aJ8am.mjs → multipartBody-CXM2a-Dy.mjs} +46 -7
- package/dist/{openapi-C3LFRzPq.mjs → openapi-DT_G4VhY.mjs} +48 -10
- package/dist/outbox-admin/index.d.mts +3 -3
- package/dist/outbox-admin/index.mjs +6 -18
- package/dist/{outbox-module-dsCyLxXH.mjs → outbox-module-Bjgzl6tg.mjs} +203 -33
- package/dist/{outbox-module-BHdUnuuK.d.mts → outbox-module-gZCHoE4H.d.mts} +79 -6
- package/dist/permissions/index.d.mts +5 -4
- package/dist/permissions/index.mjs +8 -6
- package/dist/{permissions-DiHXy8Ck.mjs → permissions-Cm0uYHvd.mjs} +149 -33
- package/dist/{pipe-CBVmUJ-j.mjs → pipe-BqeGT6UO.mjs} +2 -2
- package/dist/pipeline/index.d.mts +2 -2
- package/dist/pipeline/index.mjs +2 -2
- package/dist/plan-FVR6LP59.mjs +565 -0
- package/dist/{BaseController-DYJRZ0EJ.mjs → plugin-BccET1tL.mjs} +1256 -344
- package/dist/plugins/index.d.mts +14 -11
- package/dist/plugins/index.mjs +44 -22
- package/dist/plugins/response-cache.mjs +8 -14
- package/dist/plugins/tracing-entry.mjs +2 -2
- package/dist/{pluralize-2_U6QZQg.mjs → pluralize-CVIOcgMF.mjs} +1 -1
- package/dist/presets/filesUpload.d.mts +2 -2
- package/dist/presets/filesUpload.mjs +5 -5
- package/dist/presets/index.d.mts +26 -31
- package/dist/presets/index.mjs +4 -4
- package/dist/presets/multiTenant.d.mts +2 -107
- package/dist/presets/multiTenant.mjs +22 -162
- package/dist/presets/search.d.mts +2 -2
- package/dist/presets/search.mjs +2 -2
- package/dist/{presets-BdlugYTc.mjs → presets-Cpvj6fGO.mjs} +99 -107
- package/dist/{projection-Uvgp-EEj.mjs → projection-Ce4aQhQk.mjs} +2 -2
- package/dist/{pushref-registry-Dov9l4qE.d.mts → pushref-registry-UxCkoA4C.d.mts} +1 -1
- package/dist/{queryCachePlugin-BzqxconG.d.mts → queryCachePlugin-C2lZjTxk.d.mts} +1 -1
- package/dist/{queryCachePlugin-B5F09bYr.mjs → queryCachePlugin-CFWNH8aT.mjs} +12 -14
- package/dist/{rateLimitKey-CK-EU2L8.mjs → rateLimitKey-C4O-kPm0.mjs} +1 -1
- package/dist/{realtime-FnnD0n3Z.mjs → realtime-DmPE9S54.mjs} +25 -21
- package/dist/redis-stream-BMk-bpQS.d.mts +219 -0
- package/dist/{redis-Bzi1y3F9.d.mts → redis-vLvtcGy_.d.mts} +13 -24
- package/dist/redisShapes-CQksY67q.d.mts +55 -0
- package/dist/registry/index.d.mts +9 -4
- package/dist/registry/index.mjs +4 -4
- package/dist/{registry-D3y8VEJ1.mjs → registry-Bcz9G1bh.mjs} +10 -8
- package/dist/{renewingLease-B3VYh5aU.mjs → renewingLease-qODa7KJQ.mjs} +1 -1
- package/dist/{replyHelpers-DPHsdw-5.mjs → replyHelpers-CG_VtVgS.mjs} +2 -2
- package/dist/{requestContext-cSVKnYPk.mjs → requestContext-Dsu9P1bV.mjs} +1 -1
- package/dist/requirement-CbiLdQ1n.d.mts +22 -0
- package/dist/requirement-KDdoRcOP.mjs +35 -0
- package/dist/resourceRateLimit-Wf6d6FL9.d.mts +30 -0
- package/dist/resourceRateLimit-dSjVr1pk.mjs +180 -0
- package/dist/{rolldown-runtime-DjDuyglE.mjs → rolldown-runtime-D1w9Y1VJ.mjs} +1 -1
- package/dist/routeValidator-D36SW8qt.mjs +70 -0
- package/dist/{runtimeCapabilities-DSA_dH1_.mjs → runtimeCapabilities-0tccjRlj.mjs} +1 -1
- package/dist/{schedules-BktJb3Y3.mjs → schedules-C-OpmHBq.mjs} +46 -37
- package/dist/{schemaConverter-BLCSmNbr.mjs → schemaConverter-BORek3O-.mjs} +2 -2
- package/dist/{schemaIR-K16Bb5BX.mjs → schemaIR-C7Vbp71I.mjs} +2 -2
- package/dist/schemas/index.d.mts +10 -0
- package/dist/schemas/index.mjs +8 -3
- package/dist/scim/index.mjs +2 -2
- package/dist/scope/index.d.mts +2 -2
- package/dist/scope/index.mjs +6 -6
- package/dist/{scope-jSxuBTFM.mjs → scope-DQthe88b.mjs} +4 -4
- package/dist/shutdown-MqA81z_P.mjs +59 -0
- package/dist/{simpleEqualityMatcher-BiOnyflP.mjs → simpleEqualityMatcher-auW8QjXN.mjs} +1 -1
- package/dist/{sse-CH7Slxc1.mjs → sse-CYzQBVFe.mjs} +11 -15
- package/dist/{sseStream-CN-Lh1Tu.mjs → sseStream-B5_Afiqn.mjs} +2 -2
- package/dist/{store-helpers-9DX9-1j_.mjs → store-helpers-BOzk-CuX.mjs} +1 -1
- package/dist/{streaming-dvppnxsr.mjs → streaming-DjTQhZrN.mjs} +1 -1
- package/dist/subscriberIdentity-CW39uA8G.mjs +28 -0
- package/dist/tenancy--ed9eH_z.mjs +43 -0
- package/dist/tenantPreparation-BKon6Yox.mjs +67 -0
- package/dist/testing/cleanupStoreContract.mjs +1 -1
- package/dist/testing/index.d.mts +193 -175
- package/dist/testing/index.mjs +286 -212
- package/dist/testing/outboxStoreContract.mjs +137 -2
- package/dist/testing/requiredPorts.d.mts +17 -0
- package/dist/testing/requiredPorts.mjs +65 -0
- package/dist/testing/storageContract.mjs +1 -1
- package/dist/timing-qczZ0YC-.mjs +46 -0
- package/dist/{transactionContext-DCWMI6hV.mjs → transactionContext-DjFkrNG6.mjs} +1 -1
- package/dist/{typeGuards-D7tHFdH6.mjs → typeGuards-CySF12G-.mjs} +1 -1
- package/dist/types/index.d.mts +4 -4
- package/dist/types/index.mjs +1 -1
- package/dist/types/storage.mjs +1 -1
- package/dist/{types-CWQn9-IC.d.mts → types-B4Aq4Sdj.d.mts} +22 -9
- package/dist/{types-DfVDvkdP.d.mts → types-BJ-2XqVF.d.mts} +189 -204
- package/dist/{types-CDy3-zw1.mjs → types-Bk9NOgOC.mjs} +4 -4
- package/dist/usage/index.d.mts +2 -3
- package/dist/usage/index.mjs +5 -5
- package/dist/{userHelpers-DDMOZ_Pm.mjs → userHelpers-aklawRaK.mjs} +1 -1
- package/dist/utils/index.d.mts +84 -223
- package/dist/utils/index.mjs +13 -12
- package/dist/{utils-B-zj_b__.mjs → utils-ec1oTo1n.mjs} +315 -404
- package/dist/{validate-R0G_JrnK.mjs → validate-9yzHC1e2.mjs} +6 -14
- package/dist/{versioning-D6JIK8Tk.d.mts → versioning-Bsb51gGT.d.mts} +28 -13
- package/dist/{versioning-DuVWcu-F.mjs → versioning-fhhWHV74.mjs} +4 -4
- package/dist/{websocket-BOXVggMf.d.mts → websocket-Cs4awVyD.d.mts} +1 -1
- package/dist/{workScope-BhsWde4k.mjs → workScope-zpPyge4t.mjs} +2 -2
- package/package.json +578 -574
- package/skills/arc/SKILL.md +13 -4
- package/skills/arc/references/auth.md +8 -5
- package/skills/arc/references/integrations.md +1 -1
- package/skills/arc/references/mcp.md +8 -6
- package/skills/arc/references/multi-tenancy.md +19 -14
- package/skills/arc/references/production.md +27 -10
- package/dist/actionPermissions-DPwPWPOV.mjs +0 -350
- package/dist/index-CFfLKMH4.d.mts +0 -290
- package/dist/interface-BIpgzbZl.mjs +0 -17
- package/dist/redis-stream-BPKscsTB.d.mts +0 -260
- package/dist/registerRoute-DRsSHPSM.mjs +0 -364
- package/dist/sync/changelog.d.mts +0 -3
- package/dist/sync/changelog.mjs +0 -3
package/dist/core/index.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
/*! @classytic/arc v2.
|
|
2
|
-
import { a as DEFAULT_SORT, c as
|
|
3
|
-
import {
|
|
4
|
-
import { t as defineAggregation } from "../defineAggregation-
|
|
5
|
-
import {
|
|
6
|
-
import { a as
|
|
7
|
-
import { a as
|
|
8
|
-
export { AccessControl, BaseController, BaseCrudController, BodySanitizer, BulkMixin, 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, SlugMixin, SoftDeleteMixin, TreeMixin, assertValidConfig, collectReadBlockedFields,
|
|
1
|
+
/*! @classytic/arc v2.43.0 | MIT | https://classytic.com */
|
|
2
|
+
import { a as DEFAULT_SORT, c as DEFAULT_VERSION_FIELD, d as MAX_FILTER_DEPTH, f as MAX_REGEX_LENGTH, g as SYSTEM_FIELDS, h as RESERVED_QUERY_PARAMS, i as DEFAULT_MAX_LIMIT, l as HOOK_OPERATIONS, m as MUTATION_OPERATIONS, n as DEFAULT_ID_FIELD, o as DEFAULT_TENANT_FIELD, p as MAX_SEARCH_LENGTH, r as DEFAULT_LIMIT, s as DEFAULT_UPDATE_METHOD, t as CRUD_OPERATIONS, u as HOOK_PHASES } from "../constants-Cu7Mx7_U.mjs";
|
|
3
|
+
import { S as nativePolicyFilter, b as BodySanitizer, c as BaseController, d as SlugMixin, f as BulkMixin, g as isFieldReadable, h as collectReadBlockedFields, l as TreeMixin, m as QueryResolver, o as createCrudRouter, p as BaseCrudController, s as createPermissionMiddleware, u as SoftDeleteMixin, x as AccessControl } from "../plugin-BccET1tL.mjs";
|
|
4
|
+
import { t as defineAggregation } from "../defineAggregation-Bm8RjMbq.mjs";
|
|
5
|
+
import { C as sendControllerResponse, S as getControllerScope, b as createRequestContext, x as getControllerContext, y as createFastifyHandler } from "../actionPermissions-BotX1YOa.mjs";
|
|
6
|
+
import { a as mergeResourceConfig, i as defineResourceVariants, n as getEntityIdField, o as defineAction, r as getEntityQuery, t as getEntityId } from "../core-Cb0LjccA.mjs";
|
|
7
|
+
import { a as ResourceDefinition, i as validateResourceConfig, n as assertValidConfig, r as formatValidationErrors, t as defineResource } from "../defineResource-DIC7JZGU.mjs";
|
|
8
|
+
export { AccessControl, BaseController, BaseCrudController, BodySanitizer, BulkMixin, CRUD_OPERATIONS, DEFAULT_ID_FIELD, DEFAULT_LIMIT, DEFAULT_MAX_LIMIT, DEFAULT_SORT, DEFAULT_TENANT_FIELD, DEFAULT_UPDATE_METHOD, DEFAULT_VERSION_FIELD, HOOK_OPERATIONS, HOOK_PHASES, MAX_FILTER_DEPTH, MAX_REGEX_LENGTH, MAX_SEARCH_LENGTH, MUTATION_OPERATIONS, QueryResolver, RESERVED_QUERY_PARAMS, ResourceDefinition, SYSTEM_FIELDS, SlugMixin, SoftDeleteMixin, TreeMixin, assertValidConfig, collectReadBlockedFields, createCrudRouter, createFastifyHandler, createPermissionMiddleware, createRequestContext, defineAction, defineAggregation, defineResource, defineResourceVariants, formatValidationErrors, getControllerContext, getControllerScope, getEntityId, getEntityIdField, getEntityQuery, isFieldReadable, mergeResourceConfig, nativePolicyFilter, sendControllerResponse, validateResourceConfig };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
/*! @classytic/arc v2.
|
|
2
|
-
import "./constants-
|
|
3
|
-
import { t as defineResource } from "./defineResource-
|
|
1
|
+
/*! @classytic/arc v2.43.0 | MIT | https://classytic.com */
|
|
2
|
+
import "./constants-Cu7Mx7_U.mjs";
|
|
3
|
+
import { t as defineResource } from "./defineResource-DIC7JZGU.mjs";
|
|
4
4
|
//#region src/core/defineAction.ts
|
|
5
5
|
/**
|
|
6
6
|
* Build an `ActionDefinition` with a typed handler. The literal schema
|
|
@@ -19,7 +19,8 @@ function defineAction(config) {
|
|
|
19
19
|
schema: config.schema,
|
|
20
20
|
description: config.description,
|
|
21
21
|
id: config.id,
|
|
22
|
-
mcp: config.mcp
|
|
22
|
+
mcp: config.mcp,
|
|
23
|
+
...config.idempotency ? { idempotency: config.idempotency } : {}
|
|
23
24
|
};
|
|
24
25
|
}
|
|
25
26
|
//#endregion
|
|
@@ -1,16 +1,34 @@
|
|
|
1
|
-
/*! @classytic/arc v2.
|
|
2
|
-
import { t as __exportAll } from "./rolldown-runtime-
|
|
3
|
-
import "./constants-
|
|
4
|
-
import { f as createError } from "./errors-
|
|
5
|
-
import { i as resolvePipelineSteps, n as buildActionPipelineHandler, u as
|
|
6
|
-
import {
|
|
7
|
-
import { n as schemaIRToJsonSchemaBranch, t as normalizeSchemaIR } from "./schemaIR-K16Bb5BX.mjs";
|
|
1
|
+
/*! @classytic/arc v2.43.0 | MIT | https://classytic.com */
|
|
2
|
+
import { t as __exportAll } from "./rolldown-runtime-D1w9Y1VJ.mjs";
|
|
3
|
+
import "./constants-Cu7Mx7_U.mjs";
|
|
4
|
+
import { f as createError, i as NotFoundError, u as ValidationError } from "./errors-CtrywMHP.mjs";
|
|
5
|
+
import { C as sendControllerResponse, _ as buildArcDecorator, a as resolveRouterPluginMw, f as buildRouteHooks, g as buildAuthMiddlewareForPermissions, i as buildRouteConfig, l as resolvePipelineSteps, m as routeHookOptions, n as tryRegisterRoute, o as selectPluginMw, r as buildRateLimitConfig, s as buildActionPipelineHandler, u as buildActionPermissionMw } from "./actionPermissions-BotX1YOa.mjs";
|
|
6
|
+
import { n as schemaIRToJsonSchemaBranch, t as normalizeSchemaIR } from "./schemaIR-C7Vbp71I.mjs";
|
|
8
7
|
//#region src/core/createActionRouter.ts
|
|
9
8
|
var createActionRouter_exports = /* @__PURE__ */ __exportAll({
|
|
10
9
|
buildActionBodySchema: () => buildActionBodySchema,
|
|
11
10
|
createActionRouter: () => createActionRouter
|
|
12
11
|
});
|
|
13
12
|
/**
|
|
13
|
+
* Record a successful action. The actor and organization come from the request's
|
|
14
|
+
* validated scope (`auditContext`); a failed write is logged, never turned into a 500
|
|
15
|
+
* after the action has already happened.
|
|
16
|
+
*/
|
|
17
|
+
async function auditAction(req, resource, id, action) {
|
|
18
|
+
const audit = req.server.audit;
|
|
19
|
+
if (!audit?.custom || audit._noop === true) return;
|
|
20
|
+
try {
|
|
21
|
+
await audit.custom(resource, id, action, { ...req.auditMetadata ?? {} }, req.auditContext);
|
|
22
|
+
} catch (err) {
|
|
23
|
+
req.log.error({
|
|
24
|
+
err,
|
|
25
|
+
resource,
|
|
26
|
+
id,
|
|
27
|
+
action
|
|
28
|
+
}, "[arc] action audit write failed");
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
14
32
|
* Register the unified action endpoint: `POST /:id/action`.
|
|
15
33
|
*
|
|
16
34
|
* Shares every lifecycle primitive with the CRUD router — the preHandler
|
|
@@ -19,7 +37,8 @@ var createActionRouter_exports = /* @__PURE__ */ __exportAll({
|
|
|
19
37
|
* (keyed by `body.action` at request time).
|
|
20
38
|
*/
|
|
21
39
|
function createActionRouter(fastify, config) {
|
|
22
|
-
const { tag, resourceName = tag ?? "action", actions, actionPermissions = {}, actionSchemas = {}, globalAuth, onError, fields: fieldPermissions, schemaOptions, idField = "_id", permissions: resourcePermissions, routeGuards = [], pipeline, rateLimit, idLessActionNames = [], extensions } = config;
|
|
40
|
+
const { tag, resourceName = tag ?? "action", actions, actionPermissions = {}, actionSchemas = {}, globalAuth, onError, fields: fieldPermissions, schemaOptions, idField = "_id", permissions: resourcePermissions, routeGuards = [], tenantMiddlewares = [], pipeline, rateLimit, idLessActionNames = [], extensions, isTargetVisible, handlerScopedActionNames = [], idempotentActionNames = [], handlerDedupOwners = {}, auditActions = false } = config;
|
|
41
|
+
const handlerScoped = new Set(handlerScopedActionNames);
|
|
23
42
|
const allActionNames = Object.keys(actions);
|
|
24
43
|
if (allActionNames.length === 0) {
|
|
25
44
|
fastify.log.warn("[createActionRouter] No actions defined, skipping route creation");
|
|
@@ -82,23 +101,26 @@ function createActionRouter(fastify, config) {
|
|
|
82
101
|
} },
|
|
83
102
|
required: ["id"]
|
|
84
103
|
};
|
|
104
|
+
const actionDispatchCheck = async (req, _reply) => {
|
|
105
|
+
if (!req.validationError) return;
|
|
106
|
+
const body = req.body;
|
|
107
|
+
const submitted = typeof body?.action === "string" ? body.action : void 0;
|
|
108
|
+
if (submitted && subsetSet.has(submitted)) return;
|
|
109
|
+
const wrongMount = submitted && allActionNames.includes(submitted) ? submitted : void 0;
|
|
110
|
+
const otherMount = hasId ? "/action" : "/:id/action";
|
|
111
|
+
const message = wrongMount ? `Action '${wrongMount}' on '${resourceName}' is mounted at 'POST ${otherMount}', not 'POST ${urlPath}'` : submitted ? `Unknown action '${submitted}' on '${resourceName}'. Valid at 'POST ${urlPath}': ${actionSubset.join(", ")}` : `Missing 'action' field on '${resourceName}'. Valid at 'POST ${urlPath}': ${actionSubset.join(", ")}`;
|
|
112
|
+
throw createError(400, message, {
|
|
113
|
+
code: "arc.invalid_action",
|
|
114
|
+
validActions: actionSubset,
|
|
115
|
+
mount: urlPath,
|
|
116
|
+
...submitted ? { submitted } : {},
|
|
117
|
+
...wrongMount ? { mountedAt: otherMount } : {}
|
|
118
|
+
});
|
|
119
|
+
};
|
|
85
120
|
const actionValidationFormatter = async (req, _reply) => {
|
|
86
121
|
const validationError = req.validationError;
|
|
87
122
|
if (!validationError) return;
|
|
88
|
-
const
|
|
89
|
-
const submitted = typeof body?.action === "string" ? body.action : void 0;
|
|
90
|
-
if (!submitted || !subsetSet.has(submitted)) {
|
|
91
|
-
const wrongMount = submitted && allActionNames.includes(submitted) ? submitted : void 0;
|
|
92
|
-
const otherMount = hasId ? "/action" : "/:id/action";
|
|
93
|
-
const message = wrongMount ? `Action '${wrongMount}' on '${resourceName}' is mounted at 'POST ${otherMount}', not 'POST ${urlPath}'` : submitted ? `Unknown action '${submitted}' on '${resourceName}'. Valid at 'POST ${urlPath}': ${actionSubset.join(", ")}` : `Missing 'action' field on '${resourceName}'. Valid at 'POST ${urlPath}': ${actionSubset.join(", ")}`;
|
|
94
|
-
throw createError(400, message, {
|
|
95
|
-
code: "arc.invalid_action",
|
|
96
|
-
validActions: actionSubset,
|
|
97
|
-
mount: urlPath,
|
|
98
|
-
...submitted ? { submitted } : {},
|
|
99
|
-
...wrongMount ? { mountedAt: otherMount } : {}
|
|
100
|
-
});
|
|
101
|
-
}
|
|
123
|
+
const submitted = req.body.action;
|
|
102
124
|
const branchPath = `/oneOf/${actionSubset.indexOf(submitted)}/`;
|
|
103
125
|
const ajvErrors = validationError.validation ?? [];
|
|
104
126
|
const scoped = ajvErrors.filter((e) => e.keyword !== "oneOf" && (e.schemaPath?.includes(branchPath) || !e.schemaPath?.includes("/oneOf/")));
|
|
@@ -111,24 +133,30 @@ function createActionRouter(fastify, config) {
|
|
|
111
133
|
scopedError.meta = { action: submitted };
|
|
112
134
|
throw scopedError;
|
|
113
135
|
};
|
|
136
|
+
const requiredActions = actionSubset.filter((name) => idempotentActionNames.includes(name));
|
|
137
|
+
const handlerDedup = Object.fromEntries(requiredActions.flatMap((name) => {
|
|
138
|
+
const owner = handlerDedupOwners[name];
|
|
139
|
+
return owner === void 0 ? [] : [[name, owner]];
|
|
140
|
+
}));
|
|
114
141
|
const hooks = buildRouteHooks({
|
|
115
142
|
arcDecorator,
|
|
116
143
|
authMw,
|
|
144
|
+
prePermission: actionDispatchCheck,
|
|
117
145
|
permissionMw,
|
|
146
|
+
validationFormatter: actionValidationFormatter,
|
|
118
147
|
pluginMw: selectPluginMw("POST", pluginMw),
|
|
119
|
-
routeGuards
|
|
148
|
+
routeGuards,
|
|
149
|
+
customMws: tenantMiddlewares
|
|
120
150
|
});
|
|
121
|
-
const preHandler = [actionValidationFormatter, ...hooks.preHandler];
|
|
122
151
|
tryRegisterRoute(fastify, {
|
|
123
152
|
method: "POST",
|
|
124
153
|
url: urlPath,
|
|
125
154
|
schema: routeSchema,
|
|
126
|
-
|
|
127
|
-
...
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
}),
|
|
131
|
-
...buildRouteConfig(rateLimitConfig, extensions),
|
|
155
|
+
...routeHookOptions(hooks),
|
|
156
|
+
...buildRouteConfig(rateLimitConfig, extensions, void 0, requiredActions.length > 0 ? {
|
|
157
|
+
requiredActions,
|
|
158
|
+
...Object.keys(handlerDedup).length > 0 ? { handlerDedup } : {}
|
|
159
|
+
} : void 0),
|
|
132
160
|
handler: async (req, reply) => {
|
|
133
161
|
const { action, ...data } = req.body;
|
|
134
162
|
const id = hasId ? req.params.id : "";
|
|
@@ -141,8 +169,10 @@ function createActionRouter(fastify, config) {
|
|
|
141
169
|
}
|
|
142
170
|
const handler = wrappedHandlers.get(action);
|
|
143
171
|
if (!handler) throw createError(400, `Invalid action '${action}'. Valid actions: ${actionSubset.join(", ")}`, { validActions: actionSubset });
|
|
172
|
+
if (hasId && isTargetVisible && !handlerScoped.has(action) && !await isTargetVisible(id, req)) throw new NotFoundError(resourceName);
|
|
144
173
|
try {
|
|
145
174
|
const response = await handler(id, data, req);
|
|
175
|
+
if (auditActions && (response.status ?? 200) < 400) await auditAction(req, resourceName, id, action);
|
|
146
176
|
sendControllerResponse(reply, response, req);
|
|
147
177
|
return reply;
|
|
148
178
|
} catch (error) {
|
|
@@ -150,6 +180,8 @@ function createActionRouter(fastify, config) {
|
|
|
150
180
|
const { statusCode, error: errorMsg, code } = onError(error, action, id);
|
|
151
181
|
throw createError(statusCode, errorMsg, code ? { code } : void 0);
|
|
152
182
|
}
|
|
183
|
+
const validation = zodIssues(error);
|
|
184
|
+
if (validation) throw new ValidationError(`Invalid '${action}' payload`, validation);
|
|
153
185
|
const err = error;
|
|
154
186
|
const statusCode = err.statusCode || err.status || 500;
|
|
155
187
|
const errorCode = err.code || "ACTION_FAILED";
|
|
@@ -190,7 +222,7 @@ function createActionRouter(fastify, config) {
|
|
|
190
222
|
* `action: { const }` and carrying its own `required`.
|
|
191
223
|
*
|
|
192
224
|
* EVERY BRANCH LISTS THE FULL PROPERTY UNION — the non-obvious part. AJV's
|
|
193
|
-
* `removeAdditional
|
|
225
|
+
* `removeAdditional` (Fastify's default strips) strips a field during a
|
|
194
226
|
* branch's evaluation when that branch's `properties` omits it, EVEN IF
|
|
195
227
|
* another branch would have allowed it. The strip mutates the body before
|
|
196
228
|
* `oneOf` finishes discriminating, so the winning branch receives a body that
|
|
@@ -199,11 +231,10 @@ function createActionRouter(fastify, config) {
|
|
|
199
231
|
* every branch makes each walk see every field as its own, so nothing is
|
|
200
232
|
* stripped; `required` stays per-action, so dispatch still gates correctly.
|
|
201
233
|
*
|
|
202
|
-
*
|
|
203
|
-
*
|
|
204
|
-
*
|
|
205
|
-
*
|
|
206
|
-
* (`removeAdditional: false`) strict rejection works normally.
|
|
234
|
+
* Arc compiles this route with its own validator (`removeAdditional: false`, see
|
|
235
|
+
* `./routeValidator.ts`), whatever the host's AJV says — so per-branch
|
|
236
|
+
* `additionalProperties: false` rejects unknown fields on every host. The full
|
|
237
|
+
* property union stays because a host-supplied `validatorCompiler` may still strip.
|
|
207
238
|
*
|
|
208
239
|
* Pinned by `tests/core/action-discriminator-strip.test.ts` and
|
|
209
240
|
* `action-strict-schema-parity.test.ts`. Exported so OpenAPI and MCP tool
|
|
@@ -211,6 +242,7 @@ function createActionRouter(fastify, config) {
|
|
|
211
242
|
*/
|
|
212
243
|
function buildActionBodySchema(actionEnum, actionSchemas = {}) {
|
|
213
244
|
const unionProperties = {};
|
|
245
|
+
const conflicting = /* @__PURE__ */ new Set();
|
|
214
246
|
const irs = [];
|
|
215
247
|
for (const actionName of actionEnum) {
|
|
216
248
|
const ir = normalizeSchemaIR(actionSchemas[actionName]);
|
|
@@ -218,13 +250,19 @@ function buildActionBodySchema(actionEnum, actionSchemas = {}) {
|
|
|
218
250
|
name: actionName,
|
|
219
251
|
ir
|
|
220
252
|
});
|
|
221
|
-
for (const [key, val] of Object.entries(ir.properties))
|
|
253
|
+
for (const [key, val] of Object.entries(ir.properties)) {
|
|
254
|
+
const prior = unionProperties[key];
|
|
255
|
+
if (prior !== void 0 && JSON.stringify(prior) !== JSON.stringify(val)) conflicting.add(key);
|
|
256
|
+
unionProperties[key] = val;
|
|
257
|
+
}
|
|
222
258
|
}
|
|
259
|
+
const topLevelProperties = { ...unionProperties };
|
|
260
|
+
for (const key of conflicting) topLevelProperties[key] = {};
|
|
223
261
|
const branches = [];
|
|
224
262
|
for (const { name, ir } of irs) branches.push(schemaIRToJsonSchemaBranch({
|
|
225
263
|
...ir,
|
|
226
264
|
properties: {
|
|
227
|
-
...
|
|
265
|
+
...topLevelProperties,
|
|
228
266
|
...ir.properties
|
|
229
267
|
}
|
|
230
268
|
}, {
|
|
@@ -242,7 +280,7 @@ function buildActionBodySchema(actionEnum, actionSchemas = {}) {
|
|
|
242
280
|
type: "string",
|
|
243
281
|
enum: [...actionEnum]
|
|
244
282
|
},
|
|
245
|
-
...
|
|
283
|
+
...topLevelProperties
|
|
246
284
|
},
|
|
247
285
|
oneOf: branches
|
|
248
286
|
};
|
|
@@ -261,5 +299,15 @@ function buildActionDescription(actions, actionPermissions) {
|
|
|
261
299
|
}
|
|
262
300
|
return lines.join("\n");
|
|
263
301
|
}
|
|
302
|
+
/** A ZodError's issues as `{ field, message }`, or `undefined` for any other error. */
|
|
303
|
+
function zodIssues(error) {
|
|
304
|
+
if (!(error instanceof Error) || error.name !== "ZodError" || !("issues" in error)) return void 0;
|
|
305
|
+
const issues = error.issues;
|
|
306
|
+
if (!Array.isArray(issues)) return void 0;
|
|
307
|
+
return issues.map((issue) => ({
|
|
308
|
+
field: Array.isArray(issue.path) ? issue.path.map(String).join(".") || "(payload)" : "(payload)",
|
|
309
|
+
message: typeof issue.message === "string" ? issue.message : "invalid"
|
|
310
|
+
}));
|
|
311
|
+
}
|
|
264
312
|
//#endregion
|
|
265
313
|
export { createActionRouter_exports as n, buildActionBodySchema as t };
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
/*! @classytic/arc v2.
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { n as validateAggregations } from "./validate-
|
|
7
|
-
import { t as buildAggregationHandler } from "./buildHandler-
|
|
1
|
+
/*! @classytic/arc v2.43.0 | MIT | https://classytic.com */
|
|
2
|
+
import { f as createError } from "./errors-CtrywMHP.mjs";
|
|
3
|
+
import { u as getRequestScope } from "./types-Bk9NOgOC.mjs";
|
|
4
|
+
import { _ as buildArcDecorator, a as resolveRouterPluginMw, f as buildRouteHooks, h as buildAuthMiddleware, m as routeHookOptions, n as tryRegisterRoute, o as selectPluginMw, r as buildRateLimitConfig } from "./actionPermissions-BotX1YOa.mjs";
|
|
5
|
+
import { n as evaluateAndApplyPermission } from "./authorizationDecision-DQYrkl5f.mjs";
|
|
6
|
+
import { n as validateAggregations } from "./validate-9yzHC1e2.mjs";
|
|
7
|
+
import { t as buildAggregationHandler } from "./buildHandler-CRQ8EcX5.mjs";
|
|
8
8
|
//#region src/core/aggregation/createAggregationRouter.ts
|
|
9
9
|
/**
|
|
10
10
|
* Register one Fastify route per aggregation. No-op when the map is
|
|
@@ -68,7 +68,7 @@ function registerOne(fastify, normalized, ctx) {
|
|
|
68
68
|
summary: config.summary ?? `Aggregation: ${name}`,
|
|
69
69
|
description: config.description ?? "Portable aggregation generated by arc. Filters from query string compose with the declaration's base filter + tenant scope."
|
|
70
70
|
};
|
|
71
|
-
fastify
|
|
71
|
+
tryRegisterRoute(fastify, {
|
|
72
72
|
method: "GET",
|
|
73
73
|
url: `/aggregations/${name}`,
|
|
74
74
|
schema: routeSchema,
|
|
@@ -86,6 +86,9 @@ function registerOne(fastify, normalized, ctx) {
|
|
|
86
86
|
throw createError(500, `Aggregation "${name}" failed: ${message}`);
|
|
87
87
|
}
|
|
88
88
|
}
|
|
89
|
+
}, {
|
|
90
|
+
resourceName: tag ?? name,
|
|
91
|
+
op: `aggregation:${name}`
|
|
89
92
|
});
|
|
90
93
|
}
|
|
91
94
|
/**
|