@classytic/arc 2.31.0 → 2.32.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 (151) hide show
  1. package/dist/{BaseController-De7GqHck.mjs → BaseController-Dk34dxhI.mjs} +16 -13
  2. package/dist/{EventTransport-9mlTgqzE.mjs → EventTransport-BV10D0oG.mjs} +1 -1
  3. package/dist/{HookSystem-BcmPyq5I.mjs → HookSystem-vimw5D7Z.mjs} +2 -2
  4. package/dist/{ResourceRegistry-qq0mn2s9.mjs → ResourceRegistry-BVr7PgA0.mjs} +17 -15
  5. package/dist/{actionPermissions-BE5NwaQk.mjs → actionPermissions-Dti7ebyv.mjs} +1 -1
  6. package/dist/audit/index.mjs +2 -2
  7. package/dist/auth/audit.mjs +1 -1
  8. package/dist/auth/index.mjs +11 -10
  9. package/dist/auth/redis-session.mjs +1 -1
  10. package/dist/{authorizationDecision-ChvUQGG1.mjs → authorizationDecision-__T3EJDA.mjs} +2 -2
  11. package/dist/{buildHandler-CDrCJzmB.mjs → buildHandler-Dn7rzUJo.mjs} +6 -5
  12. package/dist/cache/index.mjs +4 -4
  13. package/dist/{caching-BFHA6Scf.mjs → caching-DFJqHyFs.mjs} +2 -2
  14. package/dist/cleanup/index.d.mts +36 -14
  15. package/dist/cleanup/index.mjs +45 -29
  16. package/dist/cli/commands/describe.mjs +4 -6
  17. package/dist/cli/commands/docs.mjs +3 -3
  18. package/dist/cli/commands/doctor.mjs +1 -1
  19. package/dist/cli/commands/generate.mjs +2 -2
  20. package/dist/cli/commands/init.mjs +2 -2
  21. package/dist/cli/commands/introspect.mjs +2 -2
  22. package/dist/cli/index.mjs +3 -3
  23. package/dist/{constants-D3Dv4LAV.mjs → constants-J99LGTJI.mjs} +1 -1
  24. package/dist/context/index.mjs +3 -3
  25. package/dist/core/index.d.mts +1 -1
  26. package/dist/core/index.mjs +7 -7
  27. package/dist/{core-BGpIxINN.mjs → core-BwwmNSp7.mjs} +3 -3
  28. package/dist/{createActionRouter-CDXEdasl.mjs → createActionRouter-DkJZWo0m.mjs} +14 -11
  29. package/dist/{createAggregationRouter-KrQDzx-k.mjs → createAggregationRouter-B1exOVD8.mjs} +10 -8
  30. package/dist/{createApp-Df89BEni.mjs → createApp-Bv0m-Q6_.mjs} +182 -61
  31. package/dist/{defineAggregation-DbPPS8RI.mjs → defineAggregation-gX4No1gt.mjs} +1 -1
  32. package/dist/{defineResource-Bv6EtN1x.mjs → defineResource-XFPPUu2c.mjs} +41 -32
  33. package/dist/discovery/index.mjs +1 -1
  34. package/dist/docs/index.mjs +3 -3
  35. package/dist/{elevation-D2l1mh4g.mjs → elevation-DNXXxgjl.mjs} +4 -4
  36. package/dist/encryption/index.mjs +5 -4
  37. package/dist/{errorHandler-C5NeD6bT.mjs → errorHandler-B2AZUJUj.mjs} +3 -3
  38. package/dist/{errors-Cj42AntO.mjs → errors-Bh1KK5ps.mjs} +1 -1
  39. package/dist/{eventPlugin-CkffEihm.mjs → eventPlugin-Dk_TyXeE.mjs} +8 -7
  40. package/dist/events/index.d.mts +108 -41
  41. package/dist/events/index.mjs +166 -142
  42. package/dist/events/transports/redis-stream-entry.mjs +14 -10
  43. package/dist/events/transports/redis.mjs +1 -1
  44. package/dist/factory/index.d.mts +5 -5
  45. package/dist/factory/index.mjs +131 -8
  46. package/dist/fastify-augmentation-BppG5bMT.d.mts +179 -0
  47. package/dist/{fields-CB5Cuzk9.mjs → fields-DEi65pGj.mjs} +6 -11
  48. package/dist/{generate-EcA6ui4i.mjs → generate-CRSG0jTv.mjs} +2 -2
  49. package/dist/{headers-3zvE0rM3.mjs → headers-BXjQYbeC.mjs} +2 -2
  50. package/dist/{health-DjZYjM7H.mjs → health-5XnTa2uo.mjs} +1 -1
  51. package/dist/hooks/index.mjs +2 -2
  52. package/dist/idempotency/index.mjs +8 -6
  53. package/dist/idempotency/redis.mjs +1 -1
  54. package/dist/{index-Bc2ox8_U.d.mts → index-DXlHwvuE.d.mts} +1 -1
  55. package/dist/{index-CFThn1K9.d.mts → index-ZWhLTp_s.d.mts} +70 -4
  56. package/dist/{index-CEJNZFtX.d.mts → index-zq6VrjaB.d.mts} +70 -1
  57. package/dist/index.d.mts +3 -3
  58. package/dist/index.mjs +11 -11
  59. package/dist/{init-BEiNZBsJ.mjs → init-BbfP8aky.mjs} +7 -5
  60. package/dist/integrations/event-gateway.mjs +2 -2
  61. package/dist/integrations/index.mjs +1 -1
  62. package/dist/integrations/jobs/index.mjs +3 -3
  63. package/dist/integrations/mcp/index.mjs +2 -2
  64. package/dist/integrations/mcp/testing.mjs +2 -2
  65. package/dist/integrations/streamline.mjs +3 -3
  66. package/dist/integrations/webhooks.mjs +1 -1
  67. package/dist/integrations/websocket-pushref-redis.mjs +1 -1
  68. package/dist/integrations/websocket-redis.mjs +1 -1
  69. package/dist/integrations/websocket.mjs +38 -35
  70. package/dist/{interface-DYzM0q-u.mjs → interface-BP4IJCBO.mjs} +1 -1
  71. package/dist/{jsonBody-BYbLDi5D.mjs → jsonBody-DDSR2HFl.mjs} +2 -2
  72. package/dist/{keys-C0_pa1tY.mjs → keys-B-HBTGXl.mjs} +1 -1
  73. package/dist/{loadResources-yawi9tAE.mjs → loadResources-DisEAmkm.mjs} +4 -3
  74. package/dist/{loadResourcesFromEntry-BAjYZonx.mjs → loadResourcesFromEntry-D1MJp13f.mjs} +2 -2
  75. package/dist/logger/index.mjs +1 -1
  76. package/dist/{mcpPlugin-B_es0hiF.mjs → mcpPlugin-CpfVpKHE.mjs} +32 -31
  77. package/dist/{memory-DR6wpa9F.mjs → memory-DsuWnj4T.mjs} +5 -5
  78. package/dist/{metrics-CUdw_wLB.mjs → metrics-DdQL8syd.mjs} +2 -2
  79. package/dist/middleware/index.mjs +3 -3
  80. package/dist/migrations/index.mjs +3 -3
  81. package/dist/{module-0pFJA6YW.mjs → module-Br81am6m.mjs} +1 -1
  82. package/dist/{multipartBody-wOgj_fnj.mjs → multipartBody-BnkBLN7v.mjs} +3 -3
  83. package/dist/{openapi-B2L4js1v.mjs → openapi-DIRzvxC0.mjs} +6 -6
  84. package/dist/outbox-admin/index.d.mts +85 -0
  85. package/dist/outbox-admin/index.mjs +115 -0
  86. package/dist/permissions/index.d.mts +2 -2
  87. package/dist/permissions/index.mjs +6 -6
  88. package/dist/{permissions-L--QDAir.mjs → permissions-Dl_m0NCe.mjs} +101 -8
  89. package/dist/{pipe-DRDNsI2T.mjs → pipe-ELHCP3zj.mjs} +3 -5
  90. package/dist/pipeline/index.mjs +2 -2
  91. package/dist/{pipeline-UPQFatit.mjs → pipeline-CPA-jx0M.mjs} +17 -15
  92. package/dist/plugins/index.d.mts +2 -2
  93. package/dist/plugins/index.mjs +16 -16
  94. package/dist/plugins/response-cache.mjs +2 -2
  95. package/dist/plugins/tracing-entry.mjs +2 -2
  96. package/dist/{pluralize-O0FZgESl.mjs → pluralize-C2ZkKbsn.mjs} +1 -1
  97. package/dist/{preloadResources-Dz6BjzM6.mjs → preloadResources-CDs87fTw.mjs} +1 -1
  98. package/dist/{preloadResources-CyoJMSiO.d.mts → preloadResources-T1hmlTEZ.d.mts} +2 -2
  99. package/dist/presets/filesUpload.mjs +6 -6
  100. package/dist/presets/index.mjs +2 -2
  101. package/dist/presets/multiTenant.mjs +3 -3
  102. package/dist/presets/search.mjs +2 -2
  103. package/dist/{presets-C4-g4_4P.mjs → presets-Dntd_pUO.mjs} +6 -5
  104. package/dist/{projection-BHw6xlOQ.mjs → projection-CjHhM5W1.mjs} +2 -2
  105. package/dist/{queryCachePlugin-BZr8v46E.mjs → queryCachePlugin-Dhps-Ldt.mjs} +6 -6
  106. package/dist/{rateLimit-CMPY5Qms.mjs → rateLimit-C7mmAGs3.mjs} +2 -2
  107. package/dist/{rateLimitKey-Dn5JNmkj.mjs → rateLimitKey-CccEFBfk.mjs} +1 -1
  108. package/dist/{realtime-C5NoxWFY.mjs → realtime-DVvVZZFz.mjs} +10 -10
  109. package/dist/{registerRoute-CBN84fc7.mjs → registerRoute-B_QrjYZS.mjs} +10 -8
  110. package/dist/registry/index.d.mts +1 -1
  111. package/dist/registry/index.mjs +3 -3
  112. package/dist/{registry-4213U4zb.mjs → registry-DqUmzA9W.mjs} +2 -2
  113. package/dist/{renewingLease-Dll8mGgc.mjs → renewingLease-BpP9wwj7.mjs} +1 -1
  114. package/dist/{replyHelpers-DIiZKGUt.mjs → replyHelpers-DS-P0b32.mjs} +2 -2
  115. package/dist/{repositoryFilter-f9eAfq_l.mjs → repositoryFilter-DotlxG3L.mjs} +1 -1
  116. package/dist/{requestContext-2TxXOJ7T.mjs → requestContext-B6vQF-sy.mjs} +1 -1
  117. package/dist/{rolldown-runtime-CUsjNX9R.mjs → rolldown-runtime-BhflRrBs.mjs} +1 -1
  118. package/dist/{schedules-DdtlICTf.mjs → schedules-C2Q3uv2d.mjs} +3 -3
  119. package/dist/{schemaConverter-D--wdJM-.mjs → schemaConverter-Crjvczi_.mjs} +1 -1
  120. package/dist/{schemaIR-Bm2enbnh.mjs → schemaIR-CnyKK_1j.mjs} +2 -2
  121. package/dist/schemas/index.mjs +1 -1
  122. package/dist/scim/index.mjs +2 -2
  123. package/dist/scope/index.mjs +5 -5
  124. package/dist/{scope-DHx5Fous.mjs → scope-afz_Ieek.mjs} +4 -4
  125. package/dist/{simpleEqualityMatcher-DjQJ7FKA.mjs → simpleEqualityMatcher-C4KiMWUa.mjs} +1 -1
  126. package/dist/{sse-CUTo9y0X.mjs → sse-B9P4Y-UI.mjs} +7 -6
  127. package/dist/{sseStream-B_5XcVVd.mjs → sseStream-B3zb_d1h.mjs} +2 -2
  128. package/dist/{store-helpers-D1MP_gRG.mjs → store-helpers-DmEMHlPQ.mjs} +1 -1
  129. package/dist/{streaming-PSZwi8JV.mjs → streaming-DPZdQmDz.mjs} +1 -1
  130. package/dist/{subscribe-helpers-C0Tb2aUp.mjs → subscribe-helpers-sp5xTDVA.mjs} +2 -2
  131. package/dist/sync/changelog.mjs +1 -1
  132. package/dist/testing/cleanupStoreContract.mjs +10 -6
  133. package/dist/testing/index.d.mts +31 -4
  134. package/dist/testing/index.mjs +97 -39
  135. package/dist/testing/outboxStoreContract.d.mts +11 -2
  136. package/dist/testing/outboxStoreContract.mjs +110 -21
  137. package/dist/testing/storageContract.mjs +11 -6
  138. package/dist/{transactionContext-dAfBVUrk.mjs → transactionContext-BvLKvOIL.mjs} +1 -1
  139. package/dist/{typeGuards-B0ryPo3I.mjs → typeGuards-B_5-hKjJ.mjs} +1 -1
  140. package/dist/types/index.mjs +1 -1
  141. package/dist/types/storage.mjs +1 -1
  142. package/dist/{types-CBgvkp8O.d.mts → types-CT5vu6M0.d.mts} +87 -11
  143. package/dist/{types-Cys0ko9Z.mjs → types-DXYX7dIR.mjs} +4 -4
  144. package/dist/usage/index.mjs +0 -0
  145. package/dist/{userHelpers-ChYJ6CdK.mjs → userHelpers-BNsOXzOd.mjs} +1 -1
  146. package/dist/utils/index.mjs +10 -10
  147. package/dist/{utils-vL8BrDE2.mjs → utils-BtOha_Sp.mjs} +3 -3
  148. package/dist/{validate-_KbifpHF.mjs → validate-PMCPR9El.mjs} +2 -2
  149. package/dist/{versioning-CHDTor3P.mjs → versioning-CKv2jz_U.mjs} +4 -4
  150. package/package.json +23 -13
  151. package/dist/fastify-augmentation-zh0_AYHa.d.mts +0 -85
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@classytic/arc",
3
- "version": "2.31.0",
3
+ "version": "2.32.0",
4
4
  "description": "Resource-oriented backend framework for Fastify - clean, minimal, powerful, tree-shakable",
5
5
  "type": "module",
6
6
  "exports": {
@@ -220,6 +220,10 @@
220
220
  "types": "./dist/cleanup/index.d.mts",
221
221
  "default": "./dist/cleanup/index.mjs"
222
222
  },
223
+ "./outbox-admin": {
224
+ "types": "./dist/outbox-admin/index.d.mts",
225
+ "default": "./dist/outbox-admin/index.mjs"
226
+ },
223
227
  "./testing/outbox": {
224
228
  "types": "./dist/testing/outboxStoreContract.d.mts",
225
229
  "default": "./dist/testing/outboxStoreContract.mjs"
@@ -290,7 +294,8 @@
290
294
  "./auth/audit": "stable",
291
295
  "./sync": "experimental",
292
296
  "./usage": "experimental",
293
- "./testing/outbox": "stable"
297
+ "./testing/outbox": "stable",
298
+ "./outbox-admin": "experimental"
294
299
  }
295
300
  },
296
301
  "files": [
@@ -337,14 +342,15 @@
337
342
  "check:peer-skew": "node scripts/check-peer-skew.mjs",
338
343
  "check:docs-drift": "node scripts/check-docs-drift.mjs",
339
344
  "check:boundaries": "node scripts/check-boundaries.mjs",
340
- "prepublishOnly": "npm run check:peer-skew && npm run check:docs-drift && npm run check:route-api && npm run check:boundaries && npm run typecheck && npm run lint && npm run build && npm run check:api-surface && npm run check:package && npm run test:ci && npm run smoke:consumer",
341
- "check:route-api": "node scripts/check-removed-route-api.mjs"
345
+ "prepublishOnly": "npm run check:peer-skew && npm run check:docs-drift && npm run check:route-api && npm run check:boundaries && npm run typecheck && npm run lint && npm run build && npm run check:api-surface && npm run check:forgotten-exports && npm run check:package && npm run test:ci && npm run smoke:consumer",
346
+ "check:route-api": "node scripts/check-removed-route-api.mjs",
347
+ "check:forgotten-exports": "node scripts/check-forgotten-exports.mjs"
342
348
  },
343
349
  "engines": {
344
350
  "node": ">=22"
345
351
  },
346
352
  "peerDependencies": {
347
- "@classytic/primitives": ">=0.18.0",
353
+ "@classytic/primitives": ">=0.20.0",
348
354
  "@classytic/repo-core": ">=0.17.0",
349
355
  "@classytic/streamline": ">=2.8.0",
350
356
  "@fastify/cors": ">=11.0.0",
@@ -373,7 +379,8 @@
373
379
  "pino-pretty": ">=13.0.0",
374
380
  "typebox": ">=1.0.0",
375
381
  "zod": ">=4.4.0",
376
- "@fastify/static": ">=8.0.0"
382
+ "@fastify/static": ">=8.0.0",
383
+ "vitest": ">=3.0.0"
377
384
  },
378
385
  "peerDependenciesMeta": {
379
386
  "better-auth": {
@@ -456,6 +463,9 @@
456
463
  },
457
464
  "@fastify/static": {
458
465
  "optional": true
466
+ },
467
+ "vitest": {
468
+ "optional": true
459
469
  }
460
470
  },
461
471
  "dependencies": {
@@ -467,13 +477,13 @@
467
477
  "@arethetypeswrong/cli": "^0.18.5",
468
478
  "@better-auth/drizzle-adapter": "^1.6.19",
469
479
  "@better-auth/mongo-adapter": "^1.6.19",
470
- "@biomejs/biome": "^2.5.5",
480
+ "@biomejs/biome": "^2.5.7",
471
481
  "@classytic/dev-tools": "^0.2.0",
472
482
  "@classytic/gitkit": ">=0.1.0",
473
- "@classytic/mongokit": "^3.28.0",
483
+ "@classytic/mongokit": "^3.30.0",
474
484
  "@classytic/pgkit": "^0.1.0",
475
- "@classytic/primitives": "^0.18.0",
476
- "@classytic/repo-core": "^0.17.0",
485
+ "@classytic/primitives": "^0.20.0",
486
+ "@classytic/repo-core": "^0.20.0",
477
487
  "@classytic/sqlitekit": "^0.6.0",
478
488
  "@classytic/streamline": "^2.8.2",
479
489
  "@electric-sql/pglite": "^0.5.4",
@@ -499,16 +509,16 @@
499
509
  "dotenv": "^17.4.2",
500
510
  "drizzle-orm": "^0.45.2",
501
511
  "fast-check": "^4.8.0",
502
- "fastify": "^5.10.0",
512
+ "fastify": "^5.11.2",
503
513
  "fastify-raw-body": "^5.0.0",
504
514
  "h3-js": "^4.4.0",
505
515
  "ioredis": "^5.11.1",
506
516
  "jose": "^6.2.3",
507
517
  "jsonwebtoken": "^9.0.3",
508
- "knip": "^6.17.1",
518
+ "knip": "^6.31.0",
509
519
  "mongodb": "^7.3.0",
510
520
  "mongodb-memory-server": "^11.2.0",
511
- "mongoose": "^9.7.1",
521
+ "mongoose": "^9.9.1",
512
522
  "publint": "^0.3.21",
513
523
  "tsdown": "^0.22.14",
514
524
  "typebox": "^1.3.6",
@@ -1,85 +0,0 @@
1
-
2
- import { hn as HookSystem, z as ResourceRegistry } from "./index-CpzxqePp.mjs";
3
- import { t as ExternalOpenApiPaths } from "./externalPaths-CmGOxOtD.mjs";
4
- import { h as HealthCheck, r as ArcModuleRegistry, t as ArcModule, u as ScheduleDefinition } from "./types-CBgvkp8O.mjs";
5
- import { s as ModuleState } from "./index-CFThn1K9.mjs";
6
- import { FastifyPluginAsync } from "fastify";
7
- //#region src/core/arcCorePlugin.d.ts
8
- interface ArcCorePluginOptions {
9
- /** Enable event emission for CRUD operations (requires eventPlugin) */
10
- emitEvents?: boolean;
11
- /** Hook system instance (for testing/custom setup) */
12
- hookSystem?: HookSystem;
13
- /** Resource registry instance (for testing/custom setup) */
14
- registry?: ResourceRegistry;
15
- }
16
- interface PluginMeta {
17
- name: string;
18
- version?: string;
19
- options?: Record<string, unknown>;
20
- registeredAt: string;
21
- }
22
- interface ArcCore {
23
- /** Instance-scoped hook system */
24
- hooks: HookSystem;
25
- /** Instance-scoped resource registry */
26
- registry: ResourceRegistry;
27
- /** Whether event emission is enabled */
28
- emitEvents: boolean;
29
- /** External OpenAPI paths contributed by auth adapters or third-party integrations */
30
- externalOpenApiPaths: ExternalOpenApiPaths[];
31
- /** Registered plugins for introspection */
32
- plugins: Map<string, PluginMeta>;
33
- /**
34
- * Module public exports — `bootstrap()` return values keyed by module name
35
- * (see `src/factory/module.ts`). Read via `getModuleExports(fastify, name)`:
36
- * augment `ArcModuleRegistry` once and the name infers the export type;
37
- * otherwise pass it inline. `Partial<ArcModuleRegistry>` gives augmented
38
- * apps typed direct access (`fastify.arc.modules.order`), while the
39
- * `Record<string, unknown>` intersection keeps un-augmented reads open.
40
- * Populated lazily by `registerResources` — absent until a module exports.
41
- */
42
- modules?: Partial<ArcModuleRegistry> & Record<string, unknown>;
43
- /**
44
- * Lifecycle state per composed module (null-proto map, populated by
45
- * `registerResources` the moment the graph is validated — so it answers
46
- * "is this module composed?" even for resource-only modules that never
47
- * record an export). Read via `hasModule(fastify, name)` /
48
- * `getModuleState(fastify, name)`; the map itself is internal.
49
- */
50
- moduleStates?: Record<string, ModuleState>;
51
- /**
52
- * Module-contributed readiness checks, collected in dependency order and
53
- * frozen by `createApp`. The API role merges these into its `healthPlugin`;
54
- * `createWorker` reads this to give its probe listener the identical union
55
- * (the worker preset disables the main health plugin, so this is how module
56
- * checks reach the probe without a double registration). Empty until
57
- * `createApp` populates it.
58
- */
59
- healthChecks?: readonly HealthCheck[];
60
- /**
61
- * The resolved, dependency-ordered module definitions (frozen by createApp).
62
- * Integrations that collect a module arm at their OWN init time — e.g. the
63
- * streamline integration calling `collectModuleWorkflows(fastify, defs)` after
64
- * it has created + decorated its container — read the list from here. Empty
65
- * until createApp populates it.
66
- */
67
- moduleDefinitions?: readonly ArcModule[];
68
- /**
69
- * Module-contributed recurring schedules, resolved once in dependency order
70
- * and frozen after bootstraps. The same definitions are executed by Arc's
71
- * schedules plugin and exposed here for introspection. Empty until collection.
72
- */
73
- scheduledJobs?: readonly Readonly<ScheduleDefinition>[];
74
- }
75
- declare const arcCorePlugin: FastifyPluginAsync<ArcCorePluginOptions>;
76
- declare const _default: FastifyPluginAsync<ArcCorePluginOptions>;
77
- //#endregion
78
- //#region src/types/fastify-augmentation.d.ts
79
- declare module "fastify" {
80
- interface FastifyInstance {
81
- arc?: ArcCore;
82
- }
83
- }
84
- //#endregion
85
- export { arcCorePlugin as a, _default as i, ArcCorePluginOptions as n, PluginMeta as r, ArcCore as t };