@classytic/arc 2.41.1 → 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.
Files changed (230) hide show
  1. package/dist/{EventTransport-CbUKDzZZ.d.mts → EventTransport-CiicKz2Z.d.mts} +1 -1
  2. package/dist/{EventTransport-DSqD_Xsg.mjs → EventTransport-tzA7CAB4.mjs} +22 -17
  3. package/dist/{HookSystem-CMF94SEA.mjs → HookSystem-B6UaKRbF.mjs} +2 -2
  4. package/dist/{QueryCache-DFA-QrU9.d.mts → QueryCache--5uAuYPW.d.mts} +7 -3
  5. package/dist/{ResourceRegistry-MGpXoxHZ.mjs → ResourceRegistry-CuCARu2B.mjs} +44 -13
  6. package/dist/actionPermissions-BotX1YOa.mjs +776 -0
  7. package/dist/audit/index.d.mts +43 -5
  8. package/dist/audit/index.mjs +48 -26
  9. package/dist/auth/audit.mjs +1 -1
  10. package/dist/auth/index.d.mts +43 -13
  11. package/dist/auth/index.mjs +130 -155
  12. package/dist/auth/redis-session.mjs +1 -1
  13. package/dist/{authorizationDecision-DawKGoXb.mjs → authorizationDecision-DQYrkl5f.mjs} +7 -102
  14. package/dist/{base-CxrV1LmG.d.mts → base-CZyixEQR.d.mts} +27 -5
  15. package/dist/boundedMap-BULzfXYU.mjs +57 -0
  16. package/dist/{buildHandler-CvxKOc0m.mjs → buildHandler-CRQ8EcX5.mjs} +4 -4
  17. package/dist/cache/index.d.mts +22 -34
  18. package/dist/cache/index.mjs +4 -4
  19. package/dist/{caching-DbCBxlgw.mjs → caching-Cc2M1DwO.mjs} +3 -3
  20. package/dist/claimed-B10RTfkM.mjs +8 -0
  21. package/dist/cleanup/index.d.mts +6 -10
  22. package/dist/cleanup/index.mjs +27 -73
  23. package/dist/cli/commands/describe.d.mts +4 -2
  24. package/dist/cli/commands/describe.mjs +7 -4
  25. package/dist/cli/commands/docs.mjs +3 -3
  26. package/dist/cli/commands/doctor.mjs +1 -1
  27. package/dist/cli/commands/generate.mjs +2 -2
  28. package/dist/cli/commands/init.mjs +2 -2
  29. package/dist/cli/commands/introspect.mjs +2 -2
  30. package/dist/cli/index.mjs +3 -3
  31. package/dist/{constants-D5Ubn1fe.mjs → constants-Cu7Mx7_U.mjs} +4 -2
  32. package/dist/context/index.d.mts +2 -5
  33. package/dist/context/index.mjs +18 -38
  34. package/dist/core/index.d.mts +3 -3
  35. package/dist/core/index.mjs +8 -8
  36. package/dist/{core-5lazhva9.mjs → core-Cb0LjccA.mjs} +5 -4
  37. package/dist/{createActionRouter-DNqoaK81.mjs → createActionRouter-xjqonMRO.mjs} +87 -39
  38. package/dist/{createAggregationRouter-BcbQJf10.mjs → createAggregationRouter-zRYWw_5D.mjs} +11 -8
  39. package/dist/{preloadResources-f3boenVZ.mjs → createApp-D-953ZAq.mjs} +299 -390
  40. package/dist/{createMcpServer-CbDWkZ1T.d.mts → createMcpServer-C9cxS8zt.d.mts} +1 -1
  41. package/dist/{defineAggregation-D_eJjm5A.mjs → defineAggregation-Bm8RjMbq.mjs} +1 -1
  42. package/dist/{defineResource-DxkMTjRn.mjs → defineResource-DIC7JZGU.mjs} +118 -1024
  43. package/dist/discovery/index.mjs +1 -1
  44. package/dist/docs/index.d.mts +10 -4
  45. package/dist/docs/index.mjs +4 -4
  46. package/dist/{elevation-BXCfVcNG.d.mts → elevation-BW2J3tNj.d.mts} +1 -2
  47. package/dist/{elevation-CkvG0LG2.mjs → elevation-DG8SrLN-.mjs} +41 -12
  48. package/dist/encryption/index.mjs +3 -3
  49. package/dist/{errorHandler-D1GHKGlV.mjs → errorHandler-BnfDviL1.mjs} +26 -5
  50. package/dist/{errors-BH7YU_9O.mjs → errors-CtrywMHP.mjs} +58 -23
  51. package/dist/{errors-BGdVwP25.d.mts → errors-JYc9vwqE.d.mts} +9 -0
  52. package/dist/{eventPlugin-B52abJ8W.d.mts → eventPlugin-BtmA4-3P.d.mts} +65 -9
  53. package/dist/{eventPlugin-zZY-unhr.mjs → eventPlugin-Q6BhzHzs.mjs} +82 -21
  54. package/dist/{subscribe-helpers-DatDkcuG.mjs → eventTypes-Cdhm6ZlV.mjs} +151 -17
  55. package/dist/events/index.d.mts +33 -8
  56. package/dist/events/index.mjs +49 -53
  57. package/dist/events/transports/redis-stream-entry.d.mts +1 -1
  58. package/dist/events/transports/redis-stream-entry.mjs +139 -157
  59. package/dist/events/transports/redis.d.mts +1 -1
  60. package/dist/events/transports/redis.mjs +2 -2
  61. package/dist/factory/index.d.mts +32 -17
  62. package/dist/factory/index.mjs +213 -32
  63. package/dist/{fastify-augmentation-Cq2nHVaW.d.mts → fastify-augmentation-DhUJ-mvo.d.mts} +11 -25
  64. package/dist/{fields-I_EeRWND.d.mts → fields-BBSpf8pS.d.mts} +1 -1
  65. package/dist/{fields-BHrkoF5y.mjs → fields-ToPYpMqS.mjs} +1 -1
  66. package/dist/filter-merge-IpGywvym.mjs +99 -0
  67. package/dist/{generate-BLRf2m3y.mjs → generate-DRTkLlIl.mjs} +2 -2
  68. package/dist/{headers-BIXWKrzQ.mjs → headers-BbkIF6vA.mjs} +2 -2
  69. package/dist/health-D-Ft6JM6.mjs +22 -0
  70. package/dist/{health-ZRHeDHXH.mjs → health-DqbsG-_w.mjs} +115 -55
  71. package/dist/hooks/index.d.mts +2 -2
  72. package/dist/hooks/index.mjs +2 -2
  73. package/dist/idempotency/index.d.mts +31 -7
  74. package/dist/idempotency/index.mjs +155 -98
  75. package/dist/idempotency/redis.d.mts +1 -1
  76. package/dist/idempotency/redis.mjs +48 -11
  77. package/dist/{index-BHdZD8zK.d.mts → index-Bxriq3so.d.mts} +84 -21
  78. package/dist/{preloadResources-CjS2OfpU.d.mts → index-C8zVGYsk.d.mts} +37 -38
  79. package/dist/{index-D4u76eQW.d.mts → index-CRoPtISf.d.mts} +23 -73
  80. package/dist/{index-CbJiYrfv.d.mts → index-Chgz3d0i.d.mts} +1 -1
  81. package/dist/index-JdbZAIsm.d.mts +510 -0
  82. package/dist/{index-DHbyPo5j.d.mts → index-mqaqZNpe.d.mts} +253 -254
  83. package/dist/index.d.mts +8 -8
  84. package/dist/index.mjs +11 -11
  85. package/dist/{init-CpLkjU18.mjs → init-B_oUYDXI.mjs} +1 -1
  86. package/dist/integrations/event-gateway.d.mts +8 -3
  87. package/dist/integrations/event-gateway.mjs +4 -4
  88. package/dist/integrations/index.d.mts +3 -3
  89. package/dist/integrations/index.mjs +1 -1
  90. package/dist/integrations/jobs/index.d.mts +1 -1
  91. package/dist/integrations/jobs/index.mjs +18 -5
  92. package/dist/integrations/mcp/index.d.mts +72 -59
  93. package/dist/integrations/mcp/index.mjs +19 -4
  94. package/dist/integrations/mcp/testing.d.mts +2 -2
  95. package/dist/integrations/mcp/testing.mjs +2 -2
  96. package/dist/integrations/streamline.d.mts +78 -136
  97. package/dist/integrations/streamline.mjs +116 -54
  98. package/dist/integrations/webhooks.d.mts +60 -120
  99. package/dist/integrations/webhooks.mjs +36 -80
  100. package/dist/integrations/websocket-pushref-redis.d.mts +1 -1
  101. package/dist/integrations/websocket-pushref-redis.mjs +1 -1
  102. package/dist/integrations/websocket-redis.d.mts +1 -1
  103. package/dist/integrations/websocket-redis.mjs +1 -1
  104. package/dist/integrations/websocket.d.mts +3 -3
  105. package/dist/integrations/websocket.mjs +2 -2
  106. package/dist/{interface-DEWNOMza.d.mts → interface-C0395yUN.d.mts} +13 -1
  107. package/dist/{jsonBody-ELR9lfeU.mjs → jsonBody-B4YVGcql.mjs} +2 -2
  108. package/dist/{keys-cpZCtcIE.mjs → keys-B2KtgMLJ.mjs} +7 -18
  109. package/dist/{loadResources-BPfWiI5s.mjs → loadResources-Dn4lalw2.mjs} +3 -3
  110. package/dist/{loadResourcesFromEntry-ixtfL3J2.mjs → loadResourcesFromEntry-3sLYbuse.mjs} +2 -2
  111. package/dist/logger/index.d.mts +1 -8
  112. package/dist/logger/index.mjs +3 -153
  113. package/dist/logger-DXjfIqjV.mjs +160 -0
  114. package/dist/{mcpPlugin-BX5PujI0.mjs → mcpPlugin-C08HalN5.mjs} +433 -170
  115. package/dist/{memory-Iotz0cCx.mjs → memory-9Cp7611C.mjs} +36 -34
  116. package/dist/{metrics-NMsmpRmY.mjs → metrics-CWI11eRu.mjs} +39 -72
  117. package/dist/middleware/index.d.mts +2 -2
  118. package/dist/middleware/index.mjs +3 -3
  119. package/dist/migrations/index.mjs +2 -2
  120. package/dist/{module-DpLJG2_N.mjs → module-BSvOQC7E.mjs} +8 -8
  121. package/dist/multiTenant-cY0FkDiA.d.mts +104 -0
  122. package/dist/{multipartBody-DtRWM6_U.mjs → multipartBody-CXM2a-Dy.mjs} +46 -7
  123. package/dist/{openapi-CmFf3yq_.mjs → openapi-DT_G4VhY.mjs} +48 -10
  124. package/dist/outbox-admin/index.d.mts +3 -3
  125. package/dist/outbox-admin/index.mjs +6 -18
  126. package/dist/{outbox-module-D2z5WkDY.mjs → outbox-module-Bjgzl6tg.mjs} +203 -33
  127. package/dist/{outbox-module-BHdUnuuK.d.mts → outbox-module-gZCHoE4H.d.mts} +79 -6
  128. package/dist/permissions/index.d.mts +5 -4
  129. package/dist/permissions/index.mjs +8 -6
  130. package/dist/{permissions-D8TBH44E.mjs → permissions-Cm0uYHvd.mjs} +149 -33
  131. package/dist/{pipe-FMWNheSO.mjs → pipe-BqeGT6UO.mjs} +2 -2
  132. package/dist/pipeline/index.d.mts +2 -2
  133. package/dist/pipeline/index.mjs +2 -2
  134. package/dist/plan-FVR6LP59.mjs +565 -0
  135. package/dist/{BaseController-CYEwjyjN.mjs → plugin-BccET1tL.mjs} +1256 -345
  136. package/dist/plugins/index.d.mts +14 -11
  137. package/dist/plugins/index.mjs +44 -22
  138. package/dist/plugins/response-cache.mjs +8 -14
  139. package/dist/plugins/tracing-entry.mjs +2 -2
  140. package/dist/{pluralize-CXWZIzTv.mjs → pluralize-CVIOcgMF.mjs} +1 -1
  141. package/dist/presets/filesUpload.d.mts +2 -2
  142. package/dist/presets/filesUpload.mjs +5 -5
  143. package/dist/presets/index.d.mts +26 -31
  144. package/dist/presets/index.mjs +4 -4
  145. package/dist/presets/multiTenant.d.mts +2 -107
  146. package/dist/presets/multiTenant.mjs +22 -162
  147. package/dist/presets/search.d.mts +2 -2
  148. package/dist/presets/search.mjs +2 -2
  149. package/dist/{presets-ZJSPgmT2.mjs → presets-Cpvj6fGO.mjs} +99 -107
  150. package/dist/{projection-BzIgzoKZ.mjs → projection-Ce4aQhQk.mjs} +2 -2
  151. package/dist/{pushref-registry-Dov9l4qE.d.mts → pushref-registry-UxCkoA4C.d.mts} +1 -1
  152. package/dist/{queryCachePlugin-BzqxconG.d.mts → queryCachePlugin-C2lZjTxk.d.mts} +1 -1
  153. package/dist/{queryCachePlugin-DZHPOm9p.mjs → queryCachePlugin-CFWNH8aT.mjs} +12 -14
  154. package/dist/{rateLimitKey-BvOvcBDi.mjs → rateLimitKey-C4O-kPm0.mjs} +1 -1
  155. package/dist/{realtime-8tIQWZz4.mjs → realtime-DmPE9S54.mjs} +25 -21
  156. package/dist/redis-stream-BMk-bpQS.d.mts +219 -0
  157. package/dist/{redis-Bzi1y3F9.d.mts → redis-vLvtcGy_.d.mts} +13 -24
  158. package/dist/redisShapes-CQksY67q.d.mts +55 -0
  159. package/dist/registry/index.d.mts +9 -4
  160. package/dist/registry/index.mjs +4 -4
  161. package/dist/{registry-DNkgGQcK.mjs → registry-Bcz9G1bh.mjs} +10 -8
  162. package/dist/{renewingLease-yF8BdW4b.mjs → renewingLease-qODa7KJQ.mjs} +1 -1
  163. package/dist/{replyHelpers-CNdvMfM4.mjs → replyHelpers-CG_VtVgS.mjs} +2 -2
  164. package/dist/{requestContext-cDkAUr-P.mjs → requestContext-Dsu9P1bV.mjs} +1 -1
  165. package/dist/requirement-CbiLdQ1n.d.mts +22 -0
  166. package/dist/requirement-KDdoRcOP.mjs +35 -0
  167. package/dist/resourceRateLimit-Wf6d6FL9.d.mts +30 -0
  168. package/dist/resourceRateLimit-dSjVr1pk.mjs +180 -0
  169. package/dist/{rolldown-runtime-eysyzFAF.mjs → rolldown-runtime-D1w9Y1VJ.mjs} +1 -1
  170. package/dist/routeValidator-D36SW8qt.mjs +70 -0
  171. package/dist/{runtimeCapabilities-CkhS6jn6.mjs → runtimeCapabilities-0tccjRlj.mjs} +1 -1
  172. package/dist/{schedules-j6uXXAeJ.mjs → schedules-C-OpmHBq.mjs} +46 -37
  173. package/dist/{schemaConverter-BVA7cFRG.mjs → schemaConverter-BORek3O-.mjs} +2 -2
  174. package/dist/{schemaIR-CTvPDoPB.mjs → schemaIR-C7Vbp71I.mjs} +2 -2
  175. package/dist/schemas/index.d.mts +10 -0
  176. package/dist/schemas/index.mjs +8 -3
  177. package/dist/scim/index.mjs +2 -2
  178. package/dist/scope/index.d.mts +2 -2
  179. package/dist/scope/index.mjs +6 -6
  180. package/dist/{scope-BUi1xV1I.mjs → scope-DQthe88b.mjs} +4 -4
  181. package/dist/shutdown-MqA81z_P.mjs +59 -0
  182. package/dist/{simpleEqualityMatcher-C9bzq2gO.mjs → simpleEqualityMatcher-auW8QjXN.mjs} +1 -1
  183. package/dist/{sse-BeqVKQKu.mjs → sse-CYzQBVFe.mjs} +11 -15
  184. package/dist/{sseStream-Ppzo-WUH.mjs → sseStream-B5_Afiqn.mjs} +2 -2
  185. package/dist/{store-helpers-dW71XVWL.mjs → store-helpers-BOzk-CuX.mjs} +1 -1
  186. package/dist/{streaming-IcRFjWQU.mjs → streaming-DjTQhZrN.mjs} +1 -1
  187. package/dist/subscriberIdentity-CW39uA8G.mjs +28 -0
  188. package/dist/tenancy--ed9eH_z.mjs +43 -0
  189. package/dist/tenantPreparation-BKon6Yox.mjs +67 -0
  190. package/dist/testing/cleanupStoreContract.mjs +1 -1
  191. package/dist/testing/index.d.mts +193 -175
  192. package/dist/testing/index.mjs +286 -212
  193. package/dist/testing/outboxStoreContract.mjs +137 -2
  194. package/dist/testing/requiredPorts.d.mts +17 -0
  195. package/dist/testing/requiredPorts.mjs +65 -0
  196. package/dist/testing/storageContract.mjs +1 -1
  197. package/dist/timing-qczZ0YC-.mjs +46 -0
  198. package/dist/{transactionContext-CPbdlnVw.mjs → transactionContext-DjFkrNG6.mjs} +1 -1
  199. package/dist/{typeGuards-BLjPgVBm.mjs → typeGuards-CySF12G-.mjs} +1 -1
  200. package/dist/types/index.d.mts +4 -4
  201. package/dist/types/index.mjs +1 -1
  202. package/dist/types/storage.mjs +1 -1
  203. package/dist/{types-CWQn9-IC.d.mts → types-B4Aq4Sdj.d.mts} +22 -9
  204. package/dist/{types-DfVDvkdP.d.mts → types-BJ-2XqVF.d.mts} +189 -204
  205. package/dist/{types-CgenB1gv.mjs → types-Bk9NOgOC.mjs} +4 -4
  206. package/dist/usage/index.d.mts +2 -3
  207. package/dist/usage/index.mjs +5 -5
  208. package/dist/{userHelpers-ChRvkuSZ.mjs → userHelpers-aklawRaK.mjs} +1 -1
  209. package/dist/utils/index.d.mts +84 -223
  210. package/dist/utils/index.mjs +13 -12
  211. package/dist/{utils-CxcctrAh.mjs → utils-ec1oTo1n.mjs} +315 -404
  212. package/dist/{validate-DrYWnOzI.mjs → validate-9yzHC1e2.mjs} +6 -14
  213. package/dist/{versioning-D6JIK8Tk.d.mts → versioning-Bsb51gGT.d.mts} +28 -13
  214. package/dist/{versioning-DKkT4hNJ.mjs → versioning-fhhWHV74.mjs} +4 -4
  215. package/dist/{websocket-BOXVggMf.d.mts → websocket-Cs4awVyD.d.mts} +1 -1
  216. package/dist/{workScope-CxKqoIFn.mjs → workScope-zpPyge4t.mjs} +2 -2
  217. package/package.json +16 -12
  218. package/skills/arc/SKILL.md +13 -4
  219. package/skills/arc/references/auth.md +8 -5
  220. package/skills/arc/references/integrations.md +1 -1
  221. package/skills/arc/references/mcp.md +8 -6
  222. package/skills/arc/references/multi-tenancy.md +19 -14
  223. package/skills/arc/references/production.md +27 -10
  224. package/dist/actionPermissions-BoPGQ5-4.mjs +0 -350
  225. package/dist/index-CFfLKMH4.d.mts +0 -290
  226. package/dist/interface-YzIbF7Ii.mjs +0 -17
  227. package/dist/redis-stream-BPKscsTB.d.mts +0 -260
  228. package/dist/registerRoute-Bsnk6NiZ.mjs +0 -364
  229. package/dist/sync/changelog.d.mts +0 -3
  230. package/dist/sync/changelog.mjs +0 -3
@@ -1,6 +1,6 @@
1
- /*! @classytic/arc v2.41.1 | MIT | https://classytic.com */
2
- import { t as __exportAll } from "./rolldown-runtime-eysyzFAF.mjs";
3
- import { arcLog } from "./logger/index.mjs";
1
+ /*! @classytic/arc v2.43.0 | MIT | https://classytic.com */
2
+ import { t as __exportAll } from "./rolldown-runtime-D1w9Y1VJ.mjs";
3
+ import { t as arcLog } from "./logger-DXjfIqjV.mjs";
4
4
  import { readdir } from "node:fs/promises";
5
5
  import { dirname, join, resolve } from "node:path";
6
6
  import { fileURLToPath, pathToFileURL } from "node:url";
@@ -1,5 +1,5 @@
1
- /*! @classytic/arc v2.41.1 | MIT | https://classytic.com */
2
- import { t as ResourceRegistry } from "./ResourceRegistry-MGpXoxHZ.mjs";
1
+ /*! @classytic/arc v2.43.0 | MIT | https://classytic.com */
2
+ import { t as ResourceRegistry } from "./ResourceRegistry-CuCARu2B.mjs";
3
3
  import { resolve } from "node:path";
4
4
  import { pathToFileURL } from "node:url";
5
5
  //#region src/cli/utils/loadResourcesFromEntry.ts
@@ -62,13 +62,6 @@ interface ArcLogger {
62
62
  * post-construction boot warning to the console instead of the app's logger.
63
63
  */
64
64
  declare function runWithArcLogger<T>(options: ArcLoggerOptions, fn: () => T): T;
65
- /**
66
- * Enter `options` for the remainder of the current async context.
67
- *
68
- * For Fastify's `onRequest` hook, where `run(store, done)` wraps the rest of
69
- * the request lifecycle. Outside a hook, prefer {@link runWithArcLogger}.
70
- */
71
- declare function enterArcLoggerScope(options: ArcLoggerOptions, done: () => void): void;
72
65
  /**
73
66
  * Configure the PROCESS-GLOBAL Arc logger — the fallback used outside any app.
74
67
  *
@@ -123,4 +116,4 @@ interface PinoLike {
123
116
  */
124
117
  declare function createPinoWriter(logger: PinoLike): ArcLogWriter;
125
118
  //#endregion
126
- export { ArcLogWriter, ArcLogger, ArcLoggerOptions, PinoLike, arcLog, configureArcLogger, createPinoWriter, enterArcLoggerScope, runWithArcLogger };
119
+ export { ArcLogWriter, ArcLogger, ArcLoggerOptions, PinoLike, arcLog, configureArcLogger, createPinoWriter, runWithArcLogger };
@@ -1,153 +1,3 @@
1
- /*! @classytic/arc v2.41.1 | MIT | https://classytic.com */
2
- import { AsyncLocalStorage } from "node:async_hooks";
3
- //#region src/logger/index.ts
4
- /**
5
- * Per-app logger options, resolved from the async context.
6
- *
7
- * The process-global below is a FALLBACK, not the source of truth. It used to
8
- * be both, and `configureArcLogger` overwrote it on every boot — so the
9
- * last-created app owned the writer for every app in the process. One app's
10
- * framework warnings then surfaced through another app's transports, level,
11
- * and redaction config. Fine for one-app-per-process; wrong for multi-app test
12
- * files and for serverless containers that reuse a warm process across apps.
13
- *
14
- * Follows the same shape as `requestContext`: the scope is entered once and
15
- * wraps everything downstream, so the 23 `arcLog()` call sites keep their
16
- * zero-argument signature and resolve correctly without threading a logger.
17
- */
18
- const scope = new AsyncLocalStorage();
19
- let globalOptions = {};
20
- /** Active options: the app's if we're inside one, else the process fallback. */
21
- function resolveOptions() {
22
- return scope.getStore() ?? globalOptions;
23
- }
24
- /**
25
- * Run `fn` with `options` as the active logger config.
26
- *
27
- * `options` is held BY REFERENCE deliberately: `createApp` enters the scope
28
- * before Fastify exists, then fills in the pino writer once `fastify.log` is
29
- * constructed. Copying here would freeze the pre-Fastify view and send every
30
- * post-construction boot warning to the console instead of the app's logger.
31
- */
32
- function runWithArcLogger(options, fn) {
33
- return scope.run(options, fn);
34
- }
35
- /**
36
- * Enter `options` for the remainder of the current async context.
37
- *
38
- * For Fastify's `onRequest` hook, where `run(store, done)` wraps the rest of
39
- * the request lifecycle. Outside a hook, prefer {@link runWithArcLogger}.
40
- */
41
- function enterArcLoggerScope(options, done) {
42
- scope.run(options, done);
43
- }
44
- /**
45
- * Configure the PROCESS-GLOBAL Arc logger — the fallback used outside any app.
46
- *
47
- * `createApp` no longer routes its writer through here; each app carries its
48
- * own scoped options (see {@link runWithArcLogger}) so two apps in one process
49
- * cannot overwrite each other's. This remains the way to configure arcLog for
50
- * standalone use — `defineResource()` at module import, CLI commands, and any
51
- * code running before or outside a `createApp` boot.
52
- */
53
- function configureArcLogger(options) {
54
- globalOptions = { ...options };
55
- }
56
- /**
57
- * Create a module-scoped logger.
58
- *
59
- * Debug and info messages are gated by the `ARC_DEBUG` env var or
60
- * `createApp({ debug })` option. Warnings always show (unless
61
- * `ARC_SUPPRESS_WARNINGS=1`). Errors always show.
62
- *
63
- * @param module - Module name (e.g., 'scope', 'elevation', 'sse', 'preset')
64
- * @returns Logger instance for that module
65
- *
66
- * @example
67
- * ```typescript
68
- * const log = arcLog('elevation');
69
- * log.debug('Checking elevation header');
70
- * log.warn('No authenticate decorator found');
71
- * ```
72
- */
73
- function arcLog(module) {
74
- const prefix = `[arc:${module}]`;
75
- return {
76
- debug(...args) {
77
- if (isDebugEnabled(module)) getWriter().debug(prefix, ...args);
78
- },
79
- info(...args) {
80
- if (isDebugEnabled(module)) getWriter().info(prefix, ...args);
81
- },
82
- warn(...args) {
83
- if (isSuppressed()) return;
84
- getWriter().warn(prefix, ...args);
85
- },
86
- error(...args) {
87
- getWriter().error(prefix, ...args);
88
- }
89
- };
90
- }
91
- /**
92
- * Bridge an `ArcLogWriter` onto a pino-style logger (`fastify.log`).
93
- *
94
- * arcLog call sites use the console convention — positional args like
95
- * `log.warn("message", { userId })` — which pino would silently drop
96
- * (extra args are printf interpolation values there). The bridge folds
97
- * string args into the message, merges object args into the pino merge
98
- * object, and maps `Error` instances to `{ err }` so pino's error
99
- * serializer applies.
100
- *
101
- * `createApp` installs this automatically so arc-internal warnings flow
102
- * through the host's transports, level, and redaction config.
103
- */
104
- function createPinoWriter(logger) {
105
- const emit = (level) => (...args) => {
106
- const parts = [];
107
- let merge;
108
- for (const arg of args) if (typeof arg === "string") parts.push(arg);
109
- else if (arg instanceof Error) merge = {
110
- ...merge ?? {},
111
- err: arg
112
- };
113
- else if (arg !== null && typeof arg === "object") merge = {
114
- ...merge ?? {},
115
- ...arg
116
- };
117
- else parts.push(String(arg));
118
- const msg = parts.join(" ");
119
- if (merge) logger[level](merge, msg);
120
- else logger[level](msg);
121
- };
122
- return {
123
- debug: emit("debug"),
124
- info: emit("info"),
125
- warn: emit("warn"),
126
- error: emit("error")
127
- };
128
- }
129
- function getWriter() {
130
- return resolveOptions().writer ?? console;
131
- }
132
- function isDebugEnabled(module) {
133
- const configDebug = resolveOptions().debug;
134
- if (configDebug !== void 0 && configDebug !== false) return matchesModule(configDebug, module);
135
- const envDebug = typeof process !== "undefined" ? process.env?.ARC_DEBUG : void 0;
136
- if (envDebug) return matchesModule(envDebug, module);
137
- return false;
138
- }
139
- function matchesModule(debug, module) {
140
- if (debug === true) return true;
141
- if (typeof debug === "string") {
142
- const normalized = debug.trim();
143
- if (normalized === "1" || normalized === "true" || normalized === "*") return true;
144
- return normalized.split(",").map((s) => s.trim()).includes(module);
145
- }
146
- return false;
147
- }
148
- function isSuppressed() {
149
- const env = typeof process !== "undefined" ? process.env?.ARC_SUPPRESS_WARNINGS : void 0;
150
- return env === "1" || env === "true";
151
- }
152
- //#endregion
153
- export { arcLog, configureArcLogger, createPinoWriter, enterArcLoggerScope, runWithArcLogger };
1
+ /*! @classytic/arc v2.43.0 | MIT | https://classytic.com */
2
+ import { i as runWithArcLogger, n as configureArcLogger, r as createPinoWriter, t as arcLog } from "../logger-DXjfIqjV.mjs";
3
+ export { arcLog, configureArcLogger, createPinoWriter, runWithArcLogger };
@@ -0,0 +1,160 @@
1
+ /*! @classytic/arc v2.43.0 | MIT | https://classytic.com */
2
+ import { AsyncLocalStorage } from "node:async_hooks";
3
+ //#region src/logger/scope.ts
4
+ /**
5
+ * Internal — NOT a package entry. The per-app logger scope that
6
+ * `@classytic/arc/logger` resolves against, plus the one hook-shaped entry
7
+ * point `createApp` needs. Kept off the public barrel: hosts use
8
+ * `runWithArcLogger` from `@classytic/arc/logger`.
9
+ *
10
+ * Per-app logger options, resolved from the async context.
11
+ *
12
+ * The process-global in `./index.ts` is a FALLBACK, not the source of truth. It
13
+ * used to be both, and `configureArcLogger` overwrote it on every boot — so the
14
+ * last-created app owned the writer for every app in the process. One app's
15
+ * framework warnings then surfaced through another app's transports, level,
16
+ * and redaction config. Fine for one-app-per-process; wrong for multi-app test
17
+ * files and for serverless containers that reuse a warm process across apps.
18
+ *
19
+ * Follows the same shape as `requestContext`: the scope is entered once and
20
+ * wraps everything downstream, so the `arcLog()` call sites keep their
21
+ * zero-argument signature and resolve correctly without threading a logger.
22
+ */
23
+ const arcLoggerScope = new AsyncLocalStorage();
24
+ /**
25
+ * Enter `options` for the remainder of the current async context.
26
+ *
27
+ * For Fastify's `onRequest` hook, where `run(store, done)` wraps the rest of
28
+ * the request lifecycle. Outside a hook, use `runWithArcLogger`.
29
+ */
30
+ function enterArcLoggerScope(options, done) {
31
+ arcLoggerScope.run(options, done);
32
+ }
33
+ //#endregion
34
+ //#region src/logger/index.ts
35
+ let globalOptions = {};
36
+ /** Active options: the app's if we're inside one, else the process fallback. */
37
+ function resolveOptions() {
38
+ return arcLoggerScope.getStore() ?? globalOptions;
39
+ }
40
+ /**
41
+ * Run `fn` with `options` as the active logger config.
42
+ *
43
+ * `options` is held BY REFERENCE deliberately: `createApp` enters the scope
44
+ * before Fastify exists, then fills in the pino writer once `fastify.log` is
45
+ * constructed. Copying here would freeze the pre-Fastify view and send every
46
+ * post-construction boot warning to the console instead of the app's logger.
47
+ */
48
+ function runWithArcLogger(options, fn) {
49
+ return arcLoggerScope.run(options, fn);
50
+ }
51
+ /**
52
+ * Configure the PROCESS-GLOBAL Arc logger — the fallback used outside any app.
53
+ *
54
+ * `createApp` no longer routes its writer through here; each app carries its
55
+ * own scoped options (see {@link runWithArcLogger}) so two apps in one process
56
+ * cannot overwrite each other's. This remains the way to configure arcLog for
57
+ * standalone use — `defineResource()` at module import, CLI commands, and any
58
+ * code running before or outside a `createApp` boot.
59
+ */
60
+ function configureArcLogger(options) {
61
+ globalOptions = { ...options };
62
+ }
63
+ /**
64
+ * Create a module-scoped logger.
65
+ *
66
+ * Debug and info messages are gated by the `ARC_DEBUG` env var or
67
+ * `createApp({ debug })` option. Warnings always show (unless
68
+ * `ARC_SUPPRESS_WARNINGS=1`). Errors always show.
69
+ *
70
+ * @param module - Module name (e.g., 'scope', 'elevation', 'sse', 'preset')
71
+ * @returns Logger instance for that module
72
+ *
73
+ * @example
74
+ * ```typescript
75
+ * const log = arcLog('elevation');
76
+ * log.debug('Checking elevation header');
77
+ * log.warn('No authenticate decorator found');
78
+ * ```
79
+ */
80
+ function arcLog(module) {
81
+ const prefix = `[arc:${module}]`;
82
+ return {
83
+ debug(...args) {
84
+ if (isDebugEnabled(module)) getWriter().debug(prefix, ...args);
85
+ },
86
+ info(...args) {
87
+ if (isDebugEnabled(module)) getWriter().info(prefix, ...args);
88
+ },
89
+ warn(...args) {
90
+ if (isSuppressed()) return;
91
+ getWriter().warn(prefix, ...args);
92
+ },
93
+ error(...args) {
94
+ getWriter().error(prefix, ...args);
95
+ }
96
+ };
97
+ }
98
+ /**
99
+ * Bridge an `ArcLogWriter` onto a pino-style logger (`fastify.log`).
100
+ *
101
+ * arcLog call sites use the console convention — positional args like
102
+ * `log.warn("message", { userId })` — which pino would silently drop
103
+ * (extra args are printf interpolation values there). The bridge folds
104
+ * string args into the message, merges object args into the pino merge
105
+ * object, and maps `Error` instances to `{ err }` so pino's error
106
+ * serializer applies.
107
+ *
108
+ * `createApp` installs this automatically so arc-internal warnings flow
109
+ * through the host's transports, level, and redaction config.
110
+ */
111
+ function createPinoWriter(logger) {
112
+ const emit = (level) => (...args) => {
113
+ const parts = [];
114
+ let merge;
115
+ for (const arg of args) if (typeof arg === "string") parts.push(arg);
116
+ else if (arg instanceof Error) merge = {
117
+ ...merge ?? {},
118
+ err: arg
119
+ };
120
+ else if (arg !== null && typeof arg === "object") merge = {
121
+ ...merge ?? {},
122
+ ...arg
123
+ };
124
+ else parts.push(String(arg));
125
+ const msg = parts.join(" ");
126
+ if (merge) logger[level](merge, msg);
127
+ else logger[level](msg);
128
+ };
129
+ return {
130
+ debug: emit("debug"),
131
+ info: emit("info"),
132
+ warn: emit("warn"),
133
+ error: emit("error")
134
+ };
135
+ }
136
+ function getWriter() {
137
+ return resolveOptions().writer ?? console;
138
+ }
139
+ function isDebugEnabled(module) {
140
+ const configDebug = resolveOptions().debug;
141
+ if (configDebug !== void 0 && configDebug !== false) return matchesModule(configDebug, module);
142
+ const envDebug = typeof process !== "undefined" ? process.env?.ARC_DEBUG : void 0;
143
+ if (envDebug) return matchesModule(envDebug, module);
144
+ return false;
145
+ }
146
+ function matchesModule(debug, module) {
147
+ if (debug === true) return true;
148
+ if (typeof debug === "string") {
149
+ const normalized = debug.trim();
150
+ if (normalized === "1" || normalized === "true" || normalized === "*") return true;
151
+ return normalized.split(",").map((s) => s.trim()).includes(module);
152
+ }
153
+ return false;
154
+ }
155
+ function isSuppressed() {
156
+ const env = typeof process !== "undefined" ? process.env?.ARC_SUPPRESS_WARNINGS : void 0;
157
+ return env === "1" || env === "true";
158
+ }
159
+ //#endregion
160
+ export { enterArcLoggerScope as a, runWithArcLogger as i, configureArcLogger as n, createPinoWriter as r, arcLog as t };