@classytic/arc 1.1.0 → 2.1.2

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 (322) hide show
  1. package/README.md +247 -794
  2. package/bin/arc.js +91 -52
  3. package/dist/EventTransport-BD2U0BTc.d.mts +100 -0
  4. package/dist/EventTransport-BD2U0BTc.d.mts.map +1 -0
  5. package/dist/HookSystem-BsGV-j2l.mjs +405 -0
  6. package/dist/HookSystem-BsGV-j2l.mjs.map +1 -0
  7. package/dist/ResourceRegistry-DsN4KJjV.mjs +250 -0
  8. package/dist/ResourceRegistry-DsN4KJjV.mjs.map +1 -0
  9. package/dist/adapters/index.d.mts +5 -0
  10. package/dist/adapters/index.mjs +3 -0
  11. package/dist/audit/index.d.mts +82 -0
  12. package/dist/audit/index.d.mts.map +1 -0
  13. package/dist/audit/index.mjs +276 -0
  14. package/dist/audit/index.mjs.map +1 -0
  15. package/dist/audit/mongodb.d.mts +5 -0
  16. package/dist/audit/mongodb.mjs +3 -0
  17. package/dist/audited-C3T5DTUx.mjs +141 -0
  18. package/dist/audited-C3T5DTUx.mjs.map +1 -0
  19. package/dist/auth/index.d.mts +189 -0
  20. package/dist/auth/index.d.mts.map +1 -0
  21. package/dist/auth/index.mjs +1102 -0
  22. package/dist/auth/index.mjs.map +1 -0
  23. package/dist/auth/redis-session.d.mts +44 -0
  24. package/dist/auth/redis-session.d.mts.map +1 -0
  25. package/dist/auth/redis-session.mjs +76 -0
  26. package/dist/auth/redis-session.mjs.map +1 -0
  27. package/dist/betterAuthOpenApi-BrHKeSAx.mjs +250 -0
  28. package/dist/betterAuthOpenApi-BrHKeSAx.mjs.map +1 -0
  29. package/dist/cache/index.d.mts +146 -0
  30. package/dist/cache/index.d.mts.map +1 -0
  31. package/dist/cache/index.mjs +92 -0
  32. package/dist/cache/index.mjs.map +1 -0
  33. package/dist/caching-Bl28lYsR.mjs +94 -0
  34. package/dist/caching-Bl28lYsR.mjs.map +1 -0
  35. package/dist/chunk-C7Uep-_p.mjs +20 -0
  36. package/dist/circuitBreaker-DeY4FCjs.mjs +1097 -0
  37. package/dist/circuitBreaker-DeY4FCjs.mjs.map +1 -0
  38. package/dist/cli/commands/describe.d.mts +19 -0
  39. package/dist/cli/commands/describe.d.mts.map +1 -0
  40. package/dist/cli/commands/describe.mjs +239 -0
  41. package/dist/cli/commands/describe.mjs.map +1 -0
  42. package/dist/cli/commands/docs.d.mts +14 -0
  43. package/dist/cli/commands/docs.d.mts.map +1 -0
  44. package/dist/cli/commands/docs.mjs +53 -0
  45. package/dist/cli/commands/docs.mjs.map +1 -0
  46. package/dist/cli/commands/{generate.d.ts → generate.d.mts} +3 -1
  47. package/dist/cli/commands/generate.d.mts.map +1 -0
  48. package/dist/cli/commands/generate.mjs +358 -0
  49. package/dist/cli/commands/generate.mjs.map +1 -0
  50. package/dist/cli/commands/{init.d.ts → init.d.mts} +12 -8
  51. package/dist/cli/commands/init.d.mts.map +1 -0
  52. package/dist/cli/commands/{init.js → init.mjs} +807 -616
  53. package/dist/cli/commands/init.mjs.map +1 -0
  54. package/dist/cli/commands/introspect.d.mts +11 -0
  55. package/dist/cli/commands/introspect.d.mts.map +1 -0
  56. package/dist/cli/commands/introspect.mjs +76 -0
  57. package/dist/cli/commands/introspect.mjs.map +1 -0
  58. package/dist/cli/index.d.mts +17 -0
  59. package/dist/cli/index.d.mts.map +1 -0
  60. package/dist/cli/index.mjs +157 -0
  61. package/dist/cli/index.mjs.map +1 -0
  62. package/dist/constants-DdXFXQtN.mjs +85 -0
  63. package/dist/constants-DdXFXQtN.mjs.map +1 -0
  64. package/dist/core/index.d.mts +5 -0
  65. package/dist/core/index.mjs +4 -0
  66. package/dist/createApp-CUgNqegw.mjs +560 -0
  67. package/dist/createApp-CUgNqegw.mjs.map +1 -0
  68. package/dist/defineResource-k0_BDn8v.mjs +2197 -0
  69. package/dist/defineResource-k0_BDn8v.mjs.map +1 -0
  70. package/dist/discovery/index.d.mts +47 -0
  71. package/dist/discovery/index.d.mts.map +1 -0
  72. package/dist/discovery/index.mjs +110 -0
  73. package/dist/discovery/index.mjs.map +1 -0
  74. package/dist/docs/index.d.mts +163 -0
  75. package/dist/docs/index.d.mts.map +1 -0
  76. package/dist/docs/index.mjs +73 -0
  77. package/dist/docs/index.mjs.map +1 -0
  78. package/dist/elevation-BRy3yFWT.mjs +113 -0
  79. package/dist/elevation-BRy3yFWT.mjs.map +1 -0
  80. package/dist/elevation-B_2dRLVP.d.mts +88 -0
  81. package/dist/elevation-B_2dRLVP.d.mts.map +1 -0
  82. package/dist/errorHandler-BbcgBmIH.d.mts +73 -0
  83. package/dist/errorHandler-BbcgBmIH.d.mts.map +1 -0
  84. package/dist/errorHandler-C1okiriz.mjs +109 -0
  85. package/dist/errorHandler-C1okiriz.mjs.map +1 -0
  86. package/dist/errors-B9bZok84.mjs +212 -0
  87. package/dist/errors-B9bZok84.mjs.map +1 -0
  88. package/dist/errors-ChKiFz62.d.mts +125 -0
  89. package/dist/errors-ChKiFz62.d.mts.map +1 -0
  90. package/dist/eventPlugin-CTrLH3mt.d.mts +125 -0
  91. package/dist/eventPlugin-CTrLH3mt.d.mts.map +1 -0
  92. package/dist/eventPlugin-DGR_B2on.mjs +230 -0
  93. package/dist/eventPlugin-DGR_B2on.mjs.map +1 -0
  94. package/dist/events/index.d.mts +54 -0
  95. package/dist/events/index.d.mts.map +1 -0
  96. package/dist/events/index.mjs +52 -0
  97. package/dist/events/index.mjs.map +1 -0
  98. package/dist/events/transports/redis-stream-entry.d.mts +2 -0
  99. package/dist/events/transports/redis-stream-entry.mjs +178 -0
  100. package/dist/events/transports/redis-stream-entry.mjs.map +1 -0
  101. package/dist/events/transports/redis.d.mts +77 -0
  102. package/dist/events/transports/redis.d.mts.map +1 -0
  103. package/dist/events/transports/redis.mjs +125 -0
  104. package/dist/events/transports/redis.mjs.map +1 -0
  105. package/dist/externalPaths-DlINfKbP.d.mts +51 -0
  106. package/dist/externalPaths-DlINfKbP.d.mts.map +1 -0
  107. package/dist/factory/index.d.mts +64 -0
  108. package/dist/factory/index.d.mts.map +1 -0
  109. package/dist/factory/index.mjs +3 -0
  110. package/dist/fastifyAdapter-BkrGrlFi.d.mts +217 -0
  111. package/dist/fastifyAdapter-BkrGrlFi.d.mts.map +1 -0
  112. package/dist/fields-DyaDVX4J.d.mts +110 -0
  113. package/dist/fields-DyaDVX4J.d.mts.map +1 -0
  114. package/dist/fields-iagOozy0.mjs +115 -0
  115. package/dist/fields-iagOozy0.mjs.map +1 -0
  116. package/dist/hooks/index.d.mts +4 -0
  117. package/dist/hooks/index.mjs +3 -0
  118. package/dist/idempotency/index.d.mts +97 -0
  119. package/dist/idempotency/index.d.mts.map +1 -0
  120. package/dist/idempotency/index.mjs +320 -0
  121. package/dist/idempotency/index.mjs.map +1 -0
  122. package/dist/idempotency/mongodb.d.mts +2 -0
  123. package/dist/idempotency/mongodb.mjs +115 -0
  124. package/dist/idempotency/mongodb.mjs.map +1 -0
  125. package/dist/idempotency/redis.d.mts +2 -0
  126. package/dist/idempotency/redis.mjs +104 -0
  127. package/dist/idempotency/redis.mjs.map +1 -0
  128. package/dist/index.d.mts +261 -0
  129. package/dist/index.d.mts.map +1 -0
  130. package/dist/index.mjs +105 -0
  131. package/dist/index.mjs.map +1 -0
  132. package/dist/integrations/event-gateway.d.mts +47 -0
  133. package/dist/integrations/event-gateway.d.mts.map +1 -0
  134. package/dist/integrations/event-gateway.mjs +44 -0
  135. package/dist/integrations/event-gateway.mjs.map +1 -0
  136. package/dist/integrations/index.d.mts +5 -0
  137. package/dist/integrations/index.mjs +1 -0
  138. package/dist/integrations/jobs.d.mts +104 -0
  139. package/dist/integrations/jobs.d.mts.map +1 -0
  140. package/dist/integrations/jobs.mjs +124 -0
  141. package/dist/integrations/jobs.mjs.map +1 -0
  142. package/dist/integrations/streamline.d.mts +61 -0
  143. package/dist/integrations/streamline.d.mts.map +1 -0
  144. package/dist/integrations/streamline.mjs +126 -0
  145. package/dist/integrations/streamline.mjs.map +1 -0
  146. package/dist/integrations/websocket.d.mts +83 -0
  147. package/dist/integrations/websocket.d.mts.map +1 -0
  148. package/dist/integrations/websocket.mjs +289 -0
  149. package/dist/integrations/websocket.mjs.map +1 -0
  150. package/dist/interface-B01JvPVc.d.mts +78 -0
  151. package/dist/interface-B01JvPVc.d.mts.map +1 -0
  152. package/dist/interface-CZe8IkMf.d.mts +55 -0
  153. package/dist/interface-CZe8IkMf.d.mts.map +1 -0
  154. package/dist/interface-Ch8HU9uM.d.mts +1098 -0
  155. package/dist/interface-Ch8HU9uM.d.mts.map +1 -0
  156. package/dist/introspectionPlugin-rFdO8ZUa.mjs +54 -0
  157. package/dist/introspectionPlugin-rFdO8ZUa.mjs.map +1 -0
  158. package/dist/keys-BqNejWup.mjs +43 -0
  159. package/dist/keys-BqNejWup.mjs.map +1 -0
  160. package/dist/logger-Df2O2WsW.mjs +79 -0
  161. package/dist/logger-Df2O2WsW.mjs.map +1 -0
  162. package/dist/memory-cQgelFOj.mjs +144 -0
  163. package/dist/memory-cQgelFOj.mjs.map +1 -0
  164. package/dist/migrations/index.d.mts +157 -0
  165. package/dist/migrations/index.d.mts.map +1 -0
  166. package/dist/migrations/index.mjs +261 -0
  167. package/dist/migrations/index.mjs.map +1 -0
  168. package/dist/mongodb-BfJVlUJH.mjs +94 -0
  169. package/dist/mongodb-BfJVlUJH.mjs.map +1 -0
  170. package/dist/mongodb-CGzRbfAK.d.mts +119 -0
  171. package/dist/mongodb-CGzRbfAK.d.mts.map +1 -0
  172. package/dist/mongodb-JN-9JA7K.d.mts +72 -0
  173. package/dist/mongodb-JN-9JA7K.d.mts.map +1 -0
  174. package/dist/openapi-G3Cw7XuM.mjs +524 -0
  175. package/dist/openapi-G3Cw7XuM.mjs.map +1 -0
  176. package/dist/org/index.d.mts +69 -0
  177. package/dist/org/index.d.mts.map +1 -0
  178. package/dist/org/index.mjs +514 -0
  179. package/dist/org/index.mjs.map +1 -0
  180. package/dist/org/types.d.mts +83 -0
  181. package/dist/org/types.d.mts.map +1 -0
  182. package/dist/org/types.mjs +1 -0
  183. package/dist/permissions/index.d.mts +279 -0
  184. package/dist/permissions/index.d.mts.map +1 -0
  185. package/dist/permissions/index.mjs +579 -0
  186. package/dist/permissions/index.mjs.map +1 -0
  187. package/dist/plugins/index.d.mts +173 -0
  188. package/dist/plugins/index.d.mts.map +1 -0
  189. package/dist/plugins/index.mjs +523 -0
  190. package/dist/plugins/index.mjs.map +1 -0
  191. package/dist/plugins/response-cache.d.mts +88 -0
  192. package/dist/plugins/response-cache.d.mts.map +1 -0
  193. package/dist/plugins/response-cache.mjs +284 -0
  194. package/dist/plugins/response-cache.mjs.map +1 -0
  195. package/dist/plugins/tracing-entry.d.mts +2 -0
  196. package/dist/plugins/tracing-entry.mjs +186 -0
  197. package/dist/plugins/tracing-entry.mjs.map +1 -0
  198. package/dist/pluralize-CEweyOEm.mjs +87 -0
  199. package/dist/pluralize-CEweyOEm.mjs.map +1 -0
  200. package/dist/policies/{index.d.ts → index.d.mts} +204 -169
  201. package/dist/policies/index.d.mts.map +1 -0
  202. package/dist/policies/index.mjs +322 -0
  203. package/dist/policies/index.mjs.map +1 -0
  204. package/dist/presets/{index.d.ts → index.d.mts} +63 -131
  205. package/dist/presets/index.d.mts.map +1 -0
  206. package/dist/presets/index.mjs +144 -0
  207. package/dist/presets/index.mjs.map +1 -0
  208. package/dist/presets/multiTenant.d.mts +25 -0
  209. package/dist/presets/multiTenant.d.mts.map +1 -0
  210. package/dist/presets/multiTenant.mjs +114 -0
  211. package/dist/presets/multiTenant.mjs.map +1 -0
  212. package/dist/presets-BITljm96.mjs +120 -0
  213. package/dist/presets-BITljm96.mjs.map +1 -0
  214. package/dist/presets-DzSMwlKj.d.mts +58 -0
  215. package/dist/presets-DzSMwlKj.d.mts.map +1 -0
  216. package/dist/prisma-DJbMt3yf.mjs +628 -0
  217. package/dist/prisma-DJbMt3yf.mjs.map +1 -0
  218. package/dist/prisma-Dg9GoVdj.d.mts +275 -0
  219. package/dist/prisma-Dg9GoVdj.d.mts.map +1 -0
  220. package/dist/queryCachePlugin-7THaI5mt.d.mts +72 -0
  221. package/dist/queryCachePlugin-7THaI5mt.d.mts.map +1 -0
  222. package/dist/queryCachePlugin-DMBnp2Q0.mjs +139 -0
  223. package/dist/queryCachePlugin-DMBnp2Q0.mjs.map +1 -0
  224. package/dist/redis-D-JAeLtm.d.mts +50 -0
  225. package/dist/redis-D-JAeLtm.d.mts.map +1 -0
  226. package/dist/redis-stream-Bdh_vUU8.d.mts +104 -0
  227. package/dist/redis-stream-Bdh_vUU8.d.mts.map +1 -0
  228. package/dist/registry/index.d.mts +12 -0
  229. package/dist/registry/index.d.mts.map +1 -0
  230. package/dist/registry/index.mjs +4 -0
  231. package/dist/requestContext-QQD6ROJc.mjs +56 -0
  232. package/dist/requestContext-QQD6ROJc.mjs.map +1 -0
  233. package/dist/schemaConverter-BwrmWroW.mjs +99 -0
  234. package/dist/schemaConverter-BwrmWroW.mjs.map +1 -0
  235. package/dist/schemas/index.d.mts +64 -0
  236. package/dist/schemas/index.d.mts.map +1 -0
  237. package/dist/schemas/index.mjs +83 -0
  238. package/dist/schemas/index.mjs.map +1 -0
  239. package/dist/scope/index.d.mts +22 -0
  240. package/dist/scope/index.d.mts.map +1 -0
  241. package/dist/scope/index.mjs +66 -0
  242. package/dist/scope/index.mjs.map +1 -0
  243. package/dist/sessionManager-jPKLbHE0.d.mts +187 -0
  244. package/dist/sessionManager-jPKLbHE0.d.mts.map +1 -0
  245. package/dist/sse-B3c3_yZp.mjs +124 -0
  246. package/dist/sse-B3c3_yZp.mjs.map +1 -0
  247. package/dist/testing/index.d.mts +908 -0
  248. package/dist/testing/index.d.mts.map +1 -0
  249. package/dist/testing/index.mjs +1977 -0
  250. package/dist/testing/index.mjs.map +1 -0
  251. package/dist/tracing-Cc7vVQPp.d.mts +71 -0
  252. package/dist/tracing-Cc7vVQPp.d.mts.map +1 -0
  253. package/dist/typeGuards-DhMNLuvU.mjs +10 -0
  254. package/dist/typeGuards-DhMNLuvU.mjs.map +1 -0
  255. package/dist/types/index.d.mts +947 -0
  256. package/dist/types/index.d.mts.map +1 -0
  257. package/dist/types/index.mjs +15 -0
  258. package/dist/types/index.mjs.map +1 -0
  259. package/dist/types-Beqn1Un7.mjs +39 -0
  260. package/dist/types-Beqn1Un7.mjs.map +1 -0
  261. package/dist/types-CIgB7UUl.d.mts +446 -0
  262. package/dist/types-CIgB7UUl.d.mts.map +1 -0
  263. package/dist/types-aYB4V7uN.d.mts +87 -0
  264. package/dist/types-aYB4V7uN.d.mts.map +1 -0
  265. package/dist/utils/index.d.mts +748 -0
  266. package/dist/utils/index.d.mts.map +1 -0
  267. package/dist/utils/index.mjs +6 -0
  268. package/package.json +194 -68
  269. package/dist/BaseController-DVAiHxEQ.d.ts +0 -233
  270. package/dist/adapters/index.d.ts +0 -237
  271. package/dist/adapters/index.js +0 -668
  272. package/dist/arcCorePlugin-CsShQdyP.d.ts +0 -273
  273. package/dist/audit/index.d.ts +0 -195
  274. package/dist/audit/index.js +0 -319
  275. package/dist/auth/index.d.ts +0 -47
  276. package/dist/auth/index.js +0 -174
  277. package/dist/cli/commands/docs.d.ts +0 -11
  278. package/dist/cli/commands/docs.js +0 -474
  279. package/dist/cli/commands/generate.js +0 -334
  280. package/dist/cli/commands/introspect.d.ts +0 -8
  281. package/dist/cli/commands/introspect.js +0 -338
  282. package/dist/cli/index.d.ts +0 -4
  283. package/dist/cli/index.js +0 -3269
  284. package/dist/core/index.d.ts +0 -220
  285. package/dist/core/index.js +0 -2786
  286. package/dist/createApp-Ce9wl8W9.d.ts +0 -77
  287. package/dist/docs/index.d.ts +0 -166
  288. package/dist/docs/index.js +0 -658
  289. package/dist/errors-8WIxGS_6.d.ts +0 -122
  290. package/dist/events/index.d.ts +0 -117
  291. package/dist/events/index.js +0 -89
  292. package/dist/factory/index.d.ts +0 -38
  293. package/dist/factory/index.js +0 -1652
  294. package/dist/hooks/index.d.ts +0 -4
  295. package/dist/hooks/index.js +0 -199
  296. package/dist/idempotency/index.d.ts +0 -323
  297. package/dist/idempotency/index.js +0 -500
  298. package/dist/index-B4t03KQ0.d.ts +0 -1366
  299. package/dist/index.d.ts +0 -135
  300. package/dist/index.js +0 -4756
  301. package/dist/migrations/index.d.ts +0 -185
  302. package/dist/migrations/index.js +0 -274
  303. package/dist/org/index.d.ts +0 -129
  304. package/dist/org/index.js +0 -220
  305. package/dist/permissions/index.d.ts +0 -144
  306. package/dist/permissions/index.js +0 -103
  307. package/dist/plugins/index.d.ts +0 -46
  308. package/dist/plugins/index.js +0 -1069
  309. package/dist/policies/index.js +0 -196
  310. package/dist/presets/index.js +0 -384
  311. package/dist/presets/multiTenant.d.ts +0 -39
  312. package/dist/presets/multiTenant.js +0 -112
  313. package/dist/registry/index.d.ts +0 -16
  314. package/dist/registry/index.js +0 -253
  315. package/dist/testing/index.d.ts +0 -618
  316. package/dist/testing/index.js +0 -48020
  317. package/dist/types/index.d.ts +0 -4
  318. package/dist/types/index.js +0 -8
  319. package/dist/types-B99TBmFV.d.ts +0 -76
  320. package/dist/types-BvckRbs2.d.ts +0 -143
  321. package/dist/utils/index.d.ts +0 -679
  322. package/dist/utils/index.js +0 -931
@@ -1,112 +0,0 @@
1
- // src/presets/multiTenant.ts
2
- function defaultExtractOrganizationId(request) {
3
- const context = request.context;
4
- if (context?.organizationId) {
5
- return context.organizationId;
6
- }
7
- const user = request.user;
8
- if (user?.organizationId) {
9
- return user.organizationId;
10
- }
11
- if (user?.organization) {
12
- const org = user.organization;
13
- return org._id || org.id || org;
14
- }
15
- return null;
16
- }
17
- function createTenantFilter(tenantField, bypassRoles, extractOrganizationId) {
18
- return async (request, reply) => {
19
- const user = request.user;
20
- if (!user) {
21
- reply.code(401).send({
22
- success: false,
23
- error: "Unauthorized",
24
- message: "Authentication required for multi-tenant resources"
25
- });
26
- return;
27
- }
28
- const userWithRoles = user;
29
- if (userWithRoles.roles && bypassRoles.some((r) => userWithRoles.roles.includes(r))) return;
30
- const orgId = extractOrganizationId(request);
31
- if (!orgId) {
32
- reply.code(403).send({
33
- success: false,
34
- error: "Forbidden",
35
- message: "Organization context required for this operation"
36
- });
37
- return;
38
- }
39
- request.query = request.query ?? {};
40
- request.query._policyFilters = {
41
- ...request.query._policyFilters ?? {},
42
- [tenantField]: orgId
43
- };
44
- };
45
- }
46
- function createFlexibleTenantFilter(tenantField, bypassRoles, extractOrganizationId) {
47
- return async (request, reply) => {
48
- const user = request.user;
49
- const orgId = extractOrganizationId(request);
50
- if (!orgId) {
51
- return;
52
- }
53
- if (!user) {
54
- reply.code(401).send({
55
- success: false,
56
- error: "Unauthorized",
57
- message: "Authentication required for organization-scoped data"
58
- });
59
- return;
60
- }
61
- const userWithRoles = user;
62
- if (userWithRoles.roles && bypassRoles.some((r) => userWithRoles.roles.includes(r))) {
63
- return;
64
- }
65
- request.query = request.query ?? {};
66
- request.query._policyFilters = {
67
- ...request.query._policyFilters ?? {},
68
- [tenantField]: orgId
69
- };
70
- };
71
- }
72
- function createTenantInjection(tenantField, extractOrganizationId) {
73
- return async (request, reply) => {
74
- const orgId = extractOrganizationId(request);
75
- if (!orgId) {
76
- reply.code(403).send({
77
- success: false,
78
- error: "Forbidden",
79
- message: "Organization context required to create resources"
80
- });
81
- return;
82
- }
83
- if (request.body) {
84
- request.body[tenantField] = orgId;
85
- }
86
- };
87
- }
88
- function multiTenantPreset(options = {}) {
89
- const {
90
- tenantField = "organizationId",
91
- bypassRoles = ["superadmin"],
92
- extractOrganizationId = defaultExtractOrganizationId,
93
- allowPublic = []
94
- } = options;
95
- const strictTenantFilter = createTenantFilter(tenantField, bypassRoles, extractOrganizationId);
96
- const flexibleTenantFilter = createFlexibleTenantFilter(tenantField, bypassRoles, extractOrganizationId);
97
- const tenantInjection = createTenantInjection(tenantField, extractOrganizationId);
98
- const getFilter = (route) => allowPublic.includes(route) ? flexibleTenantFilter : strictTenantFilter;
99
- return {
100
- name: "multiTenant",
101
- middlewares: {
102
- list: [getFilter("list")],
103
- get: [getFilter("get")],
104
- create: [tenantInjection],
105
- update: [getFilter("update")],
106
- delete: [getFilter("delete")]
107
- }
108
- };
109
- }
110
- var multiTenant_default = multiTenantPreset;
111
-
112
- export { multiTenant_default as default, multiTenantPreset };
@@ -1,16 +0,0 @@
1
- import { i as IntrospectionPluginOptions } from '../index-B4t03KQ0.js';
2
- export { k as RegisterOptions, j as ResourceRegistry, r as resourceRegistry } from '../index-B4t03KQ0.js';
3
- import { FastifyPluginAsync } from 'fastify';
4
- import 'mongoose';
5
- import '../types-B99TBmFV.js';
6
-
7
- /**
8
- * Introspection Plugin
9
- *
10
- * Exposes resource registry via API endpoints.
11
- */
12
-
13
- declare const introspectionPlugin: FastifyPluginAsync<IntrospectionPluginOptions>;
14
- declare const _default: FastifyPluginAsync<IntrospectionPluginOptions>;
15
-
16
- export { IntrospectionPluginOptions, _default as introspectionPlugin, introspectionPlugin as introspectionPluginFn };
@@ -1,253 +0,0 @@
1
- import fp from 'fastify-plugin';
2
-
3
- // src/registry/ResourceRegistry.ts
4
- var ResourceRegistry = class {
5
- _resources;
6
- _frozen;
7
- constructor() {
8
- this._resources = /* @__PURE__ */ new Map();
9
- this._frozen = false;
10
- }
11
- /**
12
- * Register a resource
13
- */
14
- register(resource, options = {}) {
15
- if (this._frozen) {
16
- throw new Error(
17
- `Registry frozen. Cannot register '${resource.name}' after startup.`
18
- );
19
- }
20
- if (this._resources.has(resource.name)) {
21
- throw new Error(`Resource '${resource.name}' already registered.`);
22
- }
23
- const entry = {
24
- name: resource.name,
25
- displayName: resource.displayName,
26
- tag: resource.tag,
27
- prefix: resource.prefix,
28
- module: options.module ?? void 0,
29
- adapter: resource.adapter ? {
30
- type: resource.adapter.type,
31
- name: resource.adapter.name
32
- } : null,
33
- permissions: resource.permissions,
34
- presets: resource._appliedPresets ?? [],
35
- routes: [],
36
- // Populated later by getIntrospection()
37
- additionalRoutes: resource.additionalRoutes.map((r) => ({
38
- method: r.method,
39
- path: r.path,
40
- handler: typeof r.handler === "string" ? r.handler : r.handler.name || "anonymous",
41
- summary: r.summary,
42
- description: r.description,
43
- permissions: r.permissions,
44
- wrapHandler: r.wrapHandler,
45
- schema: r.schema
46
- // Include schema for OpenAPI docs
47
- })),
48
- events: Object.keys(resource.events ?? {}),
49
- registeredAt: (/* @__PURE__ */ new Date()).toISOString(),
50
- disableDefaultRoutes: resource.disableDefaultRoutes,
51
- openApiSchemas: options.openApiSchemas,
52
- plugin: resource.toPlugin()
53
- // Store plugin factory
54
- };
55
- this._resources.set(resource.name, entry);
56
- return this;
57
- }
58
- /**
59
- * Get resource by name
60
- */
61
- get(name) {
62
- return this._resources.get(name);
63
- }
64
- /**
65
- * Get all resources
66
- */
67
- getAll() {
68
- return Array.from(this._resources.values());
69
- }
70
- /**
71
- * Get resources by module
72
- */
73
- getByModule(moduleName) {
74
- return this.getAll().filter((r) => r.module === moduleName);
75
- }
76
- /**
77
- * Get resources by preset
78
- */
79
- getByPreset(presetName) {
80
- return this.getAll().filter((r) => r.presets.includes(presetName));
81
- }
82
- /**
83
- * Check if resource exists
84
- */
85
- has(name) {
86
- return this._resources.has(name);
87
- }
88
- /**
89
- * Get registry statistics
90
- */
91
- getStats() {
92
- const resources = this.getAll();
93
- const presetCounts = {};
94
- for (const r of resources) {
95
- for (const preset of r.presets) {
96
- presetCounts[preset] = (presetCounts[preset] ?? 0) + 1;
97
- }
98
- }
99
- return {
100
- totalResources: resources.length,
101
- byModule: this._groupBy(resources, "module"),
102
- presetUsage: presetCounts,
103
- totalRoutes: resources.reduce((sum, r) => {
104
- const defaultRouteCount = r.disableDefaultRoutes ? 0 : 5;
105
- return sum + (r.additionalRoutes?.length ?? 0) + defaultRouteCount;
106
- }, 0),
107
- totalEvents: resources.reduce((sum, r) => sum + (r.events?.length ?? 0), 0)
108
- };
109
- }
110
- /**
111
- * Get full introspection data
112
- */
113
- getIntrospection() {
114
- return {
115
- resources: this.getAll().map((r) => {
116
- const defaultRoutes = r.disableDefaultRoutes ? [] : [
117
- { method: "GET", path: r.prefix, operation: "list" },
118
- { method: "GET", path: `${r.prefix}/:id`, operation: "get" },
119
- { method: "POST", path: r.prefix, operation: "create" },
120
- { method: "PATCH", path: `${r.prefix}/:id`, operation: "update" },
121
- { method: "DELETE", path: `${r.prefix}/:id`, operation: "delete" }
122
- ];
123
- return {
124
- name: r.name,
125
- displayName: r.displayName,
126
- prefix: r.prefix,
127
- module: r.module,
128
- presets: r.presets,
129
- permissions: r.permissions,
130
- routes: [
131
- ...defaultRoutes,
132
- ...r.additionalRoutes?.map((ar) => ({
133
- method: ar.method,
134
- path: `${r.prefix}${ar.path}`,
135
- operation: typeof ar.handler === "string" ? ar.handler : "custom",
136
- handler: typeof ar.handler === "string" ? ar.handler : void 0,
137
- summary: ar.summary
138
- })) ?? []
139
- ],
140
- events: r.events
141
- };
142
- }),
143
- stats: this.getStats(),
144
- generatedAt: (/* @__PURE__ */ new Date()).toISOString()
145
- };
146
- }
147
- /**
148
- * Freeze registry (prevent further registrations)
149
- */
150
- freeze() {
151
- this._frozen = true;
152
- }
153
- /**
154
- * Check if frozen
155
- */
156
- isFrozen() {
157
- return this._frozen;
158
- }
159
- /**
160
- * Unfreeze registry (for testing)
161
- */
162
- _unfreeze() {
163
- this._frozen = false;
164
- }
165
- /**
166
- * Clear all resources (for testing)
167
- */
168
- _clear() {
169
- this._resources.clear();
170
- this._frozen = false;
171
- }
172
- /**
173
- * Group by key
174
- */
175
- _groupBy(arr, key) {
176
- const result = {};
177
- for (const item of arr) {
178
- const k = String(item[key] ?? "uncategorized");
179
- result[k] = (result[k] ?? 0) + 1;
180
- }
181
- return result;
182
- }
183
- };
184
- var registryKey = /* @__PURE__ */ Symbol.for("arc.resourceRegistry");
185
- var globalScope = globalThis;
186
- var resourceRegistry = globalScope[registryKey] ?? new ResourceRegistry();
187
- if (!globalScope[registryKey]) {
188
- globalScope[registryKey] = resourceRegistry;
189
- }
190
- var introspectionPlugin = async (fastify, opts = {}) => {
191
- const {
192
- prefix = "/_resources",
193
- authRoles = ["superadmin"],
194
- enabled = process.env.NODE_ENV !== "production" || process.env.ENABLE_INTROSPECTION === "true"
195
- } = opts;
196
- if (!enabled) {
197
- fastify.log?.info?.("Introspection plugin disabled");
198
- return;
199
- }
200
- const typedFastify = fastify;
201
- const authMiddleware = authRoles.length > 0 && typedFastify.authenticate ? [
202
- typedFastify.authenticate,
203
- typedFastify.authorize?.(...authRoles)
204
- ].filter(Boolean) : [];
205
- await fastify.register(async (instance) => {
206
- instance.get(
207
- "/",
208
- {
209
- preHandler: authMiddleware
210
- },
211
- async (_req, _reply) => {
212
- return resourceRegistry.getIntrospection();
213
- }
214
- );
215
- instance.get(
216
- "/stats",
217
- {
218
- preHandler: authMiddleware
219
- },
220
- async (_req, _reply) => {
221
- return resourceRegistry.getStats();
222
- }
223
- );
224
- instance.get(
225
- "/:name",
226
- {
227
- schema: {
228
- params: {
229
- type: "object",
230
- properties: {
231
- name: { type: "string" }
232
- },
233
- required: ["name"]
234
- }
235
- },
236
- preHandler: authMiddleware
237
- },
238
- async (req, reply) => {
239
- const resource = resourceRegistry.get(req.params.name);
240
- if (!resource) {
241
- return reply.code(404).send({
242
- error: `Resource '${req.params.name}' not found`
243
- });
244
- }
245
- return resource;
246
- }
247
- );
248
- }, { prefix });
249
- fastify.log?.info?.(`Introspection API at ${prefix}`);
250
- };
251
- var introspectionPlugin_default = fp(introspectionPlugin, { name: "arc-introspection" });
252
-
253
- export { ResourceRegistry, introspectionPlugin_default as introspectionPlugin, introspectionPlugin as introspectionPluginFn, resourceRegistry };