@archlast/server 0.1.7 → 0.1.9

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 (372) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +14 -10
  3. package/dist/admin/auth.d.ts +24 -5
  4. package/dist/admin/auth.js +49 -25
  5. package/dist/admin/schema.d.ts +122 -32
  6. package/dist/admin/schema.js +131 -95
  7. package/dist/admin/seed.d.ts +1 -1
  8. package/dist/admin/seed.js +79 -47
  9. package/dist/auth/api-key-resolver.d.ts +1 -1
  10. package/dist/auth/api-key-resolver.js +7 -3
  11. package/dist/auth/archlast-auth-adapter.d.ts +2 -5
  12. package/dist/auth/archlast-auth-adapter.js +1 -1
  13. package/dist/auth/better-auth-adapter.d.ts.map +1 -1
  14. package/dist/auth/better-auth-adapter.js +41 -26
  15. package/dist/auth/better-auth-adapter.js.map +1 -1
  16. package/dist/auth/better-auth-admin.d.ts.map +1 -1
  17. package/dist/auth/better-auth-admin.js +1 -1
  18. package/dist/auth/better-auth-admin.js.map +1 -1
  19. package/dist/auth/better-auth-api-key-resolver.js +1 -1
  20. package/dist/auth/better-auth-api-key-resolver.js.map +1 -1
  21. package/dist/auth/better-auth-instance.d.ts +247 -303
  22. package/dist/auth/better-auth-instance.d.ts.map +1 -1
  23. package/dist/auth/better-auth-instance.js +11 -0
  24. package/dist/auth/better-auth-instance.js.map +1 -1
  25. package/dist/auth/better-auth-seed.d.ts +5 -2
  26. package/dist/auth/better-auth-seed.js +31 -22
  27. package/dist/auth/better-auth-session-adapter.d.ts.map +1 -1
  28. package/dist/auth/better-auth-session-adapter.js +14 -10
  29. package/dist/auth/better-auth-session-adapter.js.map +1 -1
  30. package/dist/auth/errors.d.ts.map +1 -1
  31. package/dist/auth/errors.js +11 -11
  32. package/dist/auth/errors.js.map +1 -1
  33. package/dist/auth/oauth-proxy.d.ts +5 -2
  34. package/dist/auth/oauth-proxy.js +23 -27
  35. package/dist/auth/resolver.d.ts.map +1 -1
  36. package/dist/auth/resolver.js.map +1 -1
  37. package/dist/auth/role-helpers.d.ts +1 -1
  38. package/dist/auth/role-helpers.d.ts.map +1 -1
  39. package/dist/auth/role-helpers.js.map +1 -1
  40. package/dist/auth/session-manager.d.ts +2 -5
  41. package/dist/auth/session-manager.js +16 -6
  42. package/dist/auth/system/better-auth-schema.d.ts.map +1 -1
  43. package/dist/auth/system/better-auth-schema.js +6 -23
  44. package/dist/auth/system/better-auth-schema.js.map +1 -1
  45. package/dist/cache/circuit-breaker.d.ts +81 -0
  46. package/dist/cache/circuit-breaker.d.ts.map +1 -0
  47. package/dist/cache/circuit-breaker.js +170 -0
  48. package/dist/cache/circuit-breaker.js.map +1 -0
  49. package/dist/cache/client.d.ts +6 -3
  50. package/dist/cache/client.d.ts.map +1 -1
  51. package/dist/cache/client.js +12 -53
  52. package/dist/cache/client.js.map +1 -1
  53. package/dist/cache/index.d.ts +2 -0
  54. package/dist/cache/index.d.ts.map +1 -1
  55. package/dist/cache/index.js +5 -1
  56. package/dist/cache/index.js.map +1 -1
  57. package/dist/cache/invalidation-queue.d.ts +63 -0
  58. package/dist/cache/invalidation-queue.d.ts.map +1 -0
  59. package/dist/cache/invalidation-queue.js +196 -0
  60. package/dist/cache/invalidation-queue.js.map +1 -0
  61. package/dist/cache/layers.d.ts +14 -4
  62. package/dist/cache/layers.d.ts.map +1 -1
  63. package/dist/cache/layers.js +66 -72
  64. package/dist/cache/layers.js.map +1 -1
  65. package/dist/cache/manager.d.ts.map +1 -1
  66. package/dist/cache/manager.js +6 -41
  67. package/dist/cache/manager.js.map +1 -1
  68. package/dist/cache/protocol.d.ts +4 -39
  69. package/dist/cache/protocol.d.ts.map +1 -1
  70. package/dist/cache/protocol.js.map +1 -1
  71. package/dist/cache/redis-adapter.d.ts +103 -0
  72. package/dist/cache/redis-adapter.d.ts.map +1 -0
  73. package/dist/cache/redis-adapter.js +424 -0
  74. package/dist/cache/redis-adapter.js.map +1 -0
  75. package/dist/cache/run-sidecar.js +10 -1
  76. package/dist/cache/run-sidecar.js.map +1 -1
  77. package/dist/cache/sidecar-server.d.ts +51 -1
  78. package/dist/cache/sidecar-server.d.ts.map +1 -1
  79. package/dist/cache/sidecar-server.js +368 -22
  80. package/dist/cache/sidecar-server.js.map +1 -1
  81. package/dist/cache/store.d.ts +43 -0
  82. package/dist/cache/store.d.ts.map +1 -1
  83. package/dist/cache/store.js +69 -76
  84. package/dist/cache/store.js.map +1 -1
  85. package/dist/cache/strategies.d.ts +2 -9
  86. package/dist/cache/strategies.d.ts.map +1 -1
  87. package/dist/cache/types.d.ts +130 -0
  88. package/dist/cache/types.d.ts.map +1 -0
  89. package/dist/cache/types.js +60 -0
  90. package/dist/cache/types.js.map +1 -0
  91. package/dist/config/bullmq.d.ts +16 -0
  92. package/dist/config/bullmq.d.ts.map +1 -0
  93. package/dist/config/bullmq.js +103 -0
  94. package/dist/config/bullmq.js.map +1 -0
  95. package/dist/config/index.d.ts +1 -0
  96. package/dist/config/index.d.ts.map +1 -1
  97. package/dist/config/index.js +1 -0
  98. package/dist/config/index.js.map +1 -1
  99. package/dist/config/schema.d.ts +80 -6
  100. package/dist/config/schema.d.ts.map +1 -1
  101. package/dist/config/schema.js +71 -6
  102. package/dist/config/schema.js.map +1 -1
  103. package/dist/config/service.d.ts +54 -4
  104. package/dist/config/service.d.ts.map +1 -1
  105. package/dist/config/service.js +56 -2
  106. package/dist/config/service.js.map +1 -1
  107. package/dist/controllers/admin/admin-tokens.controller.d.ts +131 -115
  108. package/dist/controllers/admin/admin-tokens.controller.js +117 -98
  109. package/dist/controllers/admin/api-keys.controller.d.ts +1 -1
  110. package/dist/controllers/admin/api-keys.controller.d.ts.map +1 -1
  111. package/dist/controllers/admin/api-keys.controller.js.map +1 -1
  112. package/dist/controllers/admin/app-users.controller.d.ts +274 -243
  113. package/dist/controllers/admin/app-users.controller.js +301 -257
  114. package/dist/controllers/admin/auth.controller.d.ts +260 -236
  115. package/dist/controllers/admin/auth.controller.js +197 -174
  116. package/dist/controllers/admin/backup.controller.d.ts.map +1 -1
  117. package/dist/controllers/admin/backup.controller.js.map +1 -1
  118. package/dist/controllers/admin/settings.controller.d.ts +1 -1
  119. package/dist/controllers/admin/storage-stats.controller.d.ts +63 -0
  120. package/dist/controllers/admin/storage-stats.controller.d.ts.map +1 -0
  121. package/dist/controllers/admin/storage-stats.controller.js +33 -0
  122. package/dist/controllers/admin/storage-stats.controller.js.map +1 -0
  123. package/dist/controllers/admin/tenants.controller.d.ts.map +1 -1
  124. package/dist/controllers/admin/tenants.controller.js.map +1 -1
  125. package/dist/controllers/admin/users.controller.d.ts +1 -1
  126. package/dist/controllers/admin/users.controller.d.ts.map +1 -1
  127. package/dist/controllers/admin/users.controller.js.map +1 -1
  128. package/dist/controllers/auth.controller.d.ts +289 -271
  129. package/dist/controllers/auth.controller.js +275 -226
  130. package/dist/controllers/crud-generator.controller.d.ts.map +1 -1
  131. package/dist/controllers/crud-generator.controller.js +4 -2
  132. package/dist/controllers/crud-generator.controller.js.map +1 -1
  133. package/dist/controllers/index.d.ts +1 -1
  134. package/dist/controllers/index.d.ts.map +1 -1
  135. package/dist/controllers/index.js.map +1 -1
  136. package/dist/controllers/introspection.controller.d.ts +666 -0
  137. package/dist/controllers/introspection.controller.d.ts.map +1 -1
  138. package/dist/controllers/introspection.controller.js +628 -0
  139. package/dist/controllers/introspection.controller.js.map +1 -1
  140. package/dist/controllers/invite.controller.d.ts +190 -170
  141. package/dist/controllers/invite.controller.js +183 -164
  142. package/dist/controllers/mfa.controller.d.ts +205 -183
  143. package/dist/controllers/mfa.controller.js +131 -111
  144. package/dist/controllers/otp.controller.d.ts +194 -171
  145. package/dist/controllers/otp.controller.js +192 -175
  146. package/dist/controllers/storage.controller.d.ts.map +1 -1
  147. package/dist/controllers/storage.controller.js.map +1 -1
  148. package/dist/controllers/system.controller.d.ts +21 -3
  149. package/dist/controllers/system.controller.d.ts.map +1 -1
  150. package/dist/controllers/system.controller.js +32 -2
  151. package/dist/controllers/system.controller.js.map +1 -1
  152. package/dist/controllers/tenant.controller.d.ts +258 -227
  153. package/dist/controllers/tenant.controller.js +224 -200
  154. package/dist/db/cachedclient.d.ts +6 -11
  155. package/dist/db/cachedclient.d.ts.map +1 -1
  156. package/dist/db/cachedclient.js +79 -43
  157. package/dist/db/cachedclient.js.map +1 -1
  158. package/dist/db/distributed-client.d.ts +79 -24
  159. package/dist/db/distributed-client.js +23 -24
  160. package/dist/db/factory.d.ts +3 -8
  161. package/dist/db/factory.d.ts.map +1 -1
  162. package/dist/db/factory.js +3 -22
  163. package/dist/db/factory.js.map +1 -1
  164. package/dist/db/socket-client.d.ts +7 -0
  165. package/dist/db/socket-client.d.ts.map +1 -1
  166. package/dist/db/socket-client.js +140 -11
  167. package/dist/db/socket-client.js.map +1 -1
  168. package/dist/deployment/handler.d.ts +10 -2
  169. package/dist/deployment/handler.d.ts.map +1 -1
  170. package/dist/deployment/handler.js +103 -21
  171. package/dist/deployment/handler.js.map +1 -1
  172. package/dist/deployment/persistence.d.ts.map +1 -1
  173. package/dist/deployment/persistence.js +6 -1
  174. package/dist/deployment/persistence.js.map +1 -1
  175. package/dist/docker/compose.d.ts.map +1 -1
  176. package/dist/docker/compose.js +76 -0
  177. package/dist/docker/compose.js.map +1 -1
  178. package/dist/engine/runner.d.ts.map +1 -1
  179. package/dist/engine/runner.js +0 -43
  180. package/dist/engine/runner.js.map +1 -1
  181. package/dist/functions/built-in/auth-apikey.d.ts.map +1 -1
  182. package/dist/functions/built-in/auth-apikey.js.map +1 -1
  183. package/dist/functions/built-in/system-cache.d.ts.map +1 -1
  184. package/dist/functions/built-in/system-cache.js +6 -31
  185. package/dist/functions/built-in/system-cache.js.map +1 -1
  186. package/dist/functions/built-in/system-data.d.ts.map +1 -1
  187. package/dist/functions/built-in/system-data.js +4 -2
  188. package/dist/functions/built-in/system-data.js.map +1 -1
  189. package/dist/functions/definition.d.ts.map +1 -1
  190. package/dist/functions/definition.js +6 -2
  191. package/dist/functions/definition.js.map +1 -1
  192. package/dist/http/router.d.ts +1 -0
  193. package/dist/http/router.d.ts.map +1 -1
  194. package/dist/http/router.js +14 -3
  195. package/dist/http/router.js.map +1 -1
  196. package/dist/http/routes/metrics.d.ts +42 -0
  197. package/dist/http/routes/metrics.d.ts.map +1 -0
  198. package/dist/http/routes/metrics.js +29 -0
  199. package/dist/http/routes/metrics.js.map +1 -0
  200. package/dist/http/server.d.ts +1 -0
  201. package/dist/http/server.d.ts.map +1 -1
  202. package/dist/http/server.js +63 -22
  203. package/dist/http/server.js.map +1 -1
  204. package/dist/ipc/socket-bridge.d.ts +1 -0
  205. package/dist/ipc/socket-bridge.d.ts.map +1 -1
  206. package/dist/ipc/socket-bridge.js +5 -1
  207. package/dist/ipc/socket-bridge.js.map +1 -1
  208. package/dist/jobs/bullmq-adapter.d.ts +154 -0
  209. package/dist/jobs/bullmq-adapter.d.ts.map +1 -0
  210. package/dist/jobs/bullmq-adapter.js +688 -0
  211. package/dist/jobs/bullmq-adapter.js.map +1 -0
  212. package/dist/jobs/bullmq-circuit-breaker.d.ts +133 -0
  213. package/dist/jobs/bullmq-circuit-breaker.d.ts.map +1 -0
  214. package/dist/jobs/bullmq-circuit-breaker.js +323 -0
  215. package/dist/jobs/bullmq-circuit-breaker.js.map +1 -0
  216. package/dist/jobs/bullmq-dlq-manager.d.ts +155 -0
  217. package/dist/jobs/bullmq-dlq-manager.d.ts.map +1 -0
  218. package/dist/jobs/bullmq-dlq-manager.js +325 -0
  219. package/dist/jobs/bullmq-dlq-manager.js.map +1 -0
  220. package/dist/jobs/bullmq-metrics.d.ts +104 -0
  221. package/dist/jobs/bullmq-metrics.d.ts.map +1 -0
  222. package/dist/jobs/bullmq-metrics.js +323 -0
  223. package/dist/jobs/bullmq-metrics.js.map +1 -0
  224. package/dist/jobs/bullmq-priority-service.d.ts +173 -0
  225. package/dist/jobs/bullmq-priority-service.d.ts.map +1 -0
  226. package/dist/jobs/bullmq-priority-service.js +390 -0
  227. package/dist/jobs/bullmq-priority-service.js.map +1 -0
  228. package/dist/jobs/bullmq-scheduler.d.ts +111 -0
  229. package/dist/jobs/bullmq-scheduler.d.ts.map +1 -0
  230. package/dist/jobs/bullmq-scheduler.js +300 -0
  231. package/dist/jobs/bullmq-scheduler.js.map +1 -0
  232. package/dist/jobs/bullmq-worker.d.ts +155 -0
  233. package/dist/jobs/bullmq-worker.d.ts.map +1 -0
  234. package/dist/jobs/bullmq-worker.js +651 -0
  235. package/dist/jobs/bullmq-worker.js.map +1 -0
  236. package/dist/jobs/circuit-breaker.d.ts +120 -0
  237. package/dist/jobs/circuit-breaker.d.ts.map +1 -0
  238. package/dist/jobs/circuit-breaker.js +262 -0
  239. package/dist/jobs/circuit-breaker.js.map +1 -0
  240. package/dist/jobs/index.d.ts +1 -1
  241. package/dist/jobs/index.d.ts.map +1 -1
  242. package/dist/jobs/index.js.map +1 -1
  243. package/dist/jobs/queue.d.ts +120 -1
  244. package/dist/jobs/queue.d.ts.map +1 -1
  245. package/dist/jobs/queue.js +487 -9
  246. package/dist/jobs/queue.js.map +1 -1
  247. package/dist/jobs/redis-connection.d.ts +50 -0
  248. package/dist/jobs/redis-connection.d.ts.map +1 -0
  249. package/dist/jobs/redis-connection.js +123 -0
  250. package/dist/jobs/redis-connection.js.map +1 -0
  251. package/dist/jobs/run-scheduler.js +163 -10
  252. package/dist/jobs/run-scheduler.js.map +1 -1
  253. package/dist/jobs/run-worker.js +101 -9
  254. package/dist/jobs/run-worker.js.map +1 -1
  255. package/dist/jobs/worker-thread.d.ts +6 -0
  256. package/dist/jobs/worker-thread.d.ts.map +1 -1
  257. package/dist/jobs/worker-thread.js +37 -8
  258. package/dist/jobs/worker-thread.js.map +1 -1
  259. package/dist/jobs/worker.d.ts +33 -0
  260. package/dist/jobs/worker.d.ts.map +1 -1
  261. package/dist/jobs/worker.js +358 -115
  262. package/dist/jobs/worker.js.map +1 -1
  263. package/dist/linq/async-enumerable.d.ts.map +1 -1
  264. package/dist/linq/async-enumerable.js.map +1 -1
  265. package/dist/linq/enumerable.d.ts.map +1 -1
  266. package/dist/linq/enumerable.js +10 -10
  267. package/dist/linq/enumerable.js.map +1 -1
  268. package/dist/metrics/collector.d.ts +26 -0
  269. package/dist/metrics/collector.d.ts.map +1 -0
  270. package/dist/metrics/collector.js +103 -0
  271. package/dist/metrics/collector.js.map +1 -0
  272. package/dist/polling/updates.controller.d.ts +57 -0
  273. package/dist/polling/updates.controller.d.ts.map +1 -0
  274. package/dist/polling/updates.controller.js +70 -0
  275. package/dist/polling/updates.controller.js.map +1 -0
  276. package/dist/repository/db-set.d.ts.map +1 -1
  277. package/dist/repository/db-set.js +12 -8
  278. package/dist/repository/db-set.js.map +1 -1
  279. package/dist/repository/ef-core.d.ts.map +1 -1
  280. package/dist/repository/ef-core.js +6 -6
  281. package/dist/repository/ef-core.js.map +1 -1
  282. package/dist/repository/factory.d.ts +1 -1
  283. package/dist/repository/factory.d.ts.map +1 -1
  284. package/dist/repository/factory.js.map +1 -1
  285. package/dist/repository/interfaces.d.ts.map +1 -1
  286. package/dist/repository/interfaces.js.map +1 -1
  287. package/dist/repository/queryable.d.ts.map +1 -1
  288. package/dist/repository/queryable.js.map +1 -1
  289. package/dist/rpc/adapter.d.ts.map +1 -1
  290. package/dist/rpc/adapter.js.map +1 -1
  291. package/dist/rpc/router.d.ts +2 -2
  292. package/dist/rpc/router.d.ts.map +1 -1
  293. package/dist/rpc/router.js +1 -1
  294. package/dist/rpc/router.js.map +1 -1
  295. package/dist/schema/input-types.d.ts +1 -1
  296. package/dist/schema/input-types.d.ts.map +1 -1
  297. package/dist/schema/input-types.js +4 -3
  298. package/dist/schema/input-types.js.map +1 -1
  299. package/dist/schema/modifiers.d.ts +2 -1
  300. package/dist/schema/modifiers.d.ts.map +1 -1
  301. package/dist/schema/modifiers.js +41 -5
  302. package/dist/schema/modifiers.js.map +1 -1
  303. package/dist/schema/relationship-types.d.ts +7 -2
  304. package/dist/schema/relationship-types.js +1 -1
  305. package/dist/schema/type-helpers.d.ts +35 -0
  306. package/dist/schema/type-helpers.d.ts.map +1 -1
  307. package/dist/schema/type-helpers.js +32 -21
  308. package/dist/schema/type-helpers.js.map +1 -1
  309. package/dist/schema/types.d.ts.map +1 -1
  310. package/dist/schema/validators.d.ts +1 -1
  311. package/dist/schema/validators.d.ts.map +1 -1
  312. package/dist/schema/validators.js +27 -16
  313. package/dist/schema/validators.js.map +1 -1
  314. package/dist/services/admin/app-users.service.d.ts +1 -1
  315. package/dist/services/admin/app-users.service.js +31 -38
  316. package/dist/services/admin/auth.service.d.ts +1 -1
  317. package/dist/services/admin/auth.service.js +11 -5
  318. package/dist/services/admin/backup/BackupOrchestrator.d.ts.map +1 -1
  319. package/dist/services/admin/backup/BackupOrchestrator.js +4 -7
  320. package/dist/services/admin/backup/BackupOrchestrator.js.map +1 -1
  321. package/dist/services/admin/backup/StorageStreamer.d.ts +3 -3
  322. package/dist/services/admin/backup/StorageStreamer.d.ts.map +1 -1
  323. package/dist/services/admin/backup/StorageStreamer.js +16 -55
  324. package/dist/services/admin/backup/StorageStreamer.js.map +1 -1
  325. package/dist/services/admin/backup/ZipComposer.d.ts +2 -0
  326. package/dist/services/admin/backup/ZipComposer.d.ts.map +1 -1
  327. package/dist/services/admin/backup/ZipComposer.js +23 -0
  328. package/dist/services/admin/backup/ZipComposer.js.map +1 -1
  329. package/dist/services/admin/backup.service.d.ts.map +1 -1
  330. package/dist/services/admin/backup.service.js.map +1 -1
  331. package/dist/services/admin/data.service.d.ts.map +1 -1
  332. package/dist/services/admin/data.service.js +287 -286
  333. package/dist/services/admin/data.service.js.map +1 -1
  334. package/dist/services/admin/tenants.service.d.ts.map +1 -1
  335. package/dist/services/admin/tenants.service.js.map +1 -1
  336. package/dist/services/auth.service.d.ts +2 -3
  337. package/dist/services/auth.service.js +16 -16
  338. package/dist/services/introspection.service.d.ts.map +1 -1
  339. package/dist/services/introspection.service.js +6 -3
  340. package/dist/services/introspection.service.js.map +1 -1
  341. package/dist/services/invite.service.d.ts +1 -1
  342. package/dist/services/invite.service.js +17 -15
  343. package/dist/services/storage.service.d.ts.map +1 -1
  344. package/dist/services/storage.service.js +35 -4
  345. package/dist/services/storage.service.js.map +1 -1
  346. package/dist/services/system.service.d.ts +4 -0
  347. package/dist/services/system.service.d.ts.map +1 -1
  348. package/dist/services/system.service.js +43 -1
  349. package/dist/services/system.service.js.map +1 -1
  350. package/dist/services/tenant.service.d.ts +1 -1
  351. package/dist/services/tenant.service.js +43 -31
  352. package/dist/sse/subscriptions.controller.d.ts +57 -0
  353. package/dist/sse/subscriptions.controller.d.ts.map +1 -0
  354. package/dist/sse/subscriptions.controller.js +127 -0
  355. package/dist/sse/subscriptions.controller.js.map +1 -0
  356. package/dist/startup/bootstrap.d.ts +13 -2
  357. package/dist/startup/bootstrap.d.ts.map +1 -1
  358. package/dist/startup/bootstrap.js +85 -13
  359. package/dist/startup/bootstrap.js.map +1 -1
  360. package/dist/storage/s3-backend.d.ts.map +1 -1
  361. package/dist/storage/s3-backend.js +3 -3
  362. package/dist/storage/s3-backend.js.map +1 -1
  363. package/dist/websocket/server.d.ts.map +1 -1
  364. package/dist/websocket/server.js +14 -3
  365. package/dist/websocket/server.js.map +1 -1
  366. package/docker/README.md +299 -1
  367. package/package.json +5 -1
  368. package/templates/.env.example +76 -16
  369. package/templates/archlast.config.js +15 -1
  370. package/templates/docker-compose.dev.yml +8 -8
  371. package/templates/docker-compose.prod.yml +29 -12
  372. package/templates/docker-compose.yml +112 -28
@@ -183,6 +183,7 @@ function createAdminDataService() {
183
183
  const collectionNames = schema?.tables ? Object.keys(schema.tables) : [];
184
184
  // Create a wrapper function that creates DbSet with proper dependencies
185
185
  const createDbSetWrapper = (collection, changeTracker) => {
186
+ // Return DbSet<DataModel[K]>
186
187
  const { QueryProvider } = require("../../repository/provider.js");
187
188
  const { MutableQueryable } = require("../../repository/queryable.js");
188
189
  const collectionName = String(collection);
@@ -209,20 +210,20 @@ function createAdminDataService() {
209
210
  // Create the script function using AsyncFunction
210
211
  const AsyncFunction = Object.getPrototypeOf(async function () { })
211
212
  .constructor;
212
- const scriptFn = new AsyncFunction("ctx", "console", `
213
- "use strict";
214
- const { repository, List, logger, collections } = ctx;
215
- try {
216
- ${code}
217
- } catch (error) {
218
- return { error: error instanceof Error ? error.message : String(error) };
219
- }
213
+ const scriptFn = new AsyncFunction("ctx", "console", `
214
+ "use strict";
215
+ const { repository, List, logger, collections } = ctx;
216
+ try {
217
+ ${code}
218
+ } catch (error) {
219
+ return { error: error instanceof Error ? error.message : String(error) };
220
+ }
220
221
  `);
221
222
  // Create a safe console proxy
222
223
  const logs = [];
223
224
  const safeConsole = {
224
225
  log: (...args) => logs.push(args
225
- .map((a) => typeof a === "object" ? JSON.stringify(a) : String(a))
226
+ .map((a) => (typeof a === "object" ? JSON.stringify(a) : String(a)))
226
227
  .join(" ")),
227
228
  error: (...args) => logs.push("[ERROR] " +
228
229
  args
@@ -436,283 +437,283 @@ function createAdminDataService() {
436
437
  withRelationsInterfaces.push(generateWithRelationsInterface(name, tableDef, tables));
437
438
  }
438
439
  // Generate TypeScript definitions for the LINQ-style repository API with EF Core and linqts
439
- const typeDefinitions = `${documentInterfaces.join("\n\n")}
440
-
441
- // ==================== Input Types (Create/Update) ====================
442
-
443
- ${createInputInterfaces.join("\n\n")}
444
-
445
- ${updateInputInterfaces.join("\n\n")}
446
-
447
- // ==================== Relationship Types ====================
448
-
449
- ${withRelationsInterfaces.join("\n\n")}
450
-
451
- // ==================== LINQ Query Types ====================
452
-
453
- type Predicate<T> = (item: T) => boolean | Promise<boolean>;
454
- type Projection<TSource, TResult> = (item: TSource) => TResult;
455
-
456
- type WhereOperator<T> =
457
- | { eq: T }
458
- | { ne: T }
459
- | { gt: T }
460
- | { gte: T }
461
- | { lt: T }
462
- | { lte: T }
463
- | { in: T[] }
464
- | { notIn: T[] }
465
- | { contains: string }
466
- | { startsWith: string }
467
- | { endsWith: string }
468
- | { isNull: true }
469
- | { isNotNull: true };
470
-
471
- type WhereClause<T> = {
472
- [K in keyof T]?: T[K] | WhereOperator<T[K]> | { and: WhereClause<T>[] } | { or: WhereClause<T>[] } | { not: WhereClause<T> };
473
- };
474
-
475
- type OrderByClause<T> = {
476
- [K in keyof T]?: "asc" | "desc";
477
- };
478
-
479
- // ==================== Queryable Interfaces ====================
480
-
481
- /**
482
- * Async enumerable for streaming query results without loading all into memory
483
- * Provides O(1) memory usage vs O(n) for ToArrayAsync and supports early termination
484
- */
485
- declare interface IAsyncEnumerable<T> {
486
- /** Async iterator for for await...of loops */
487
- [Symbol.asyncIterator](): AsyncIterator<T>;
488
- /** Filter items based on predicate */
489
- Where(predicate: (item: T) => boolean): IAsyncEnumerable<T>;
490
- /** Project items to new form */
491
- Select<TResult>(selector: (item: T) => TResult): IAsyncEnumerable<TResult>;
492
- /** Take first n items (supports early termination) */
493
- Take(count: number): IAsyncEnumerable<T>;
494
- /** Skip first n items */
495
- Skip(count: number): IAsyncEnumerable<T>;
496
- /** Materialize all items to array (loads entire set into memory) */
497
- ToArrayAsync(): Promise<T[]>;
498
- /** Get first item or throw if empty */
499
- FirstAsync(): Promise<T>;
500
- /** Get first item or undefined if empty */
501
- FirstOrDefaultAsync(): Promise<T | undefined>;
502
- /** Count items in sequence */
503
- CountAsync(): Promise<number>;
504
- /** Check if any item exists (short-circuits on first item) */
505
- AnyAsync(): Promise<boolean>;
506
- }
507
-
508
- declare interface IQueryable<T> {
509
- Where(where: WhereClause<T> | Predicate<T>): IQueryable<T>;
510
- Select<TResult>(selector: Projection<T, TResult>): IQueryable<TResult>;
511
- SelectMany<TResult>(selector: (item: T) => IQueryable<TResult> | TResult[]): IQueryable<TResult>;
512
- OrderBy(orderBy: OrderByClause<T> | Projection<T, any>): IOrderedQueryable<T>;
513
- OrderByDescending(orderBy: OrderByClause<T> | Projection<T, any>): IOrderedQueryable<T>;
514
- Take(count: number): IQueryable<T>;
515
- Skip(count: number): IQueryable<T>;
516
- Distinct(): IQueryable<T>;
517
- CountAsync(): Promise<number>;
518
- CountAsync(predicate: Predicate<T>): Promise<number>;
519
- AnyAsync(): Promise<boolean>;
520
- AnyAsync(predicate: Predicate<T>): Promise<boolean>;
521
- AllAsync(predicate: Predicate<T>): Promise<boolean>;
522
- FirstAsync(): Promise<T>;
523
- FirstAsync(predicate: Predicate<T>): Promise<T>;
524
- FirstOrDefaultAsync(): Promise<T | undefined>;
525
- FirstOrDefaultAsync(predicate: Predicate<T>): Promise<T | undefined>;
526
- ToListAsync(): Promise<List<T>>;
527
- ToArrayAsync(): Promise<T[]>;
528
- /** Returns an async enumerable for streaming without loading all items into memory */
529
- AsAsyncEnumerable(): IAsyncEnumerable<T>;
530
- }
531
-
532
- declare interface IOrderedQueryable<T> extends IQueryable<T> {
533
- ThenBy(orderBy: OrderByClause<T> | Projection<T, any>): IOrderedQueryable<T>;
534
- ThenByDescending(orderBy: OrderByClause<T> | Projection<T, any>): IOrderedQueryable<T>;
535
- }
536
-
537
- declare interface IMutableQueryable<T, TCreateInput = Omit<T, "_id" | "_collection">> extends IQueryable<T> {
538
- Where(where: WhereClause<T> | Predicate<T>): IMutableQueryable<T, TCreateInput>;
539
- Select<TResult>(selector: Projection<T, TResult>): IMutableQueryable<TResult, any>;
540
- Take(count: number): IMutableQueryable<T, TCreateInput>;
541
- Skip(count: number): IMutableQueryable<T, TCreateInput>;
542
- Distinct(): IMutableQueryable<T, TCreateInput>;
543
- OrderBy(orderBy: OrderByClause<T> | Projection<T, any>): IOrderedMutableQueryable<T, TCreateInput>;
544
- OrderByDescending(orderBy: OrderByClause<T> | Projection<T, any>): IOrderedMutableQueryable<T, TCreateInput>;
545
- Insert(data: TCreateInput | Omit<T, "_id" | "_collection">): Promise<string>;
546
- InsertMany(data: (TCreateInput | Omit<T, "_id" | "_collection">)[]): Promise<string[]>;
547
- UpdateMany(data: Partial<Omit<T, "_id" | "_collection">>): Promise<number>;
548
- DeleteMany(): Promise<number>;
549
- AsNoTracking(): IQueryable<T>;
550
- AsAsyncEnumerable(): IAsyncEnumerable<T>;
551
- }
552
-
553
- declare interface IOrderedMutableQueryable<T, TCreateInput = Omit<T, "_id" | "_collection">> extends IOrderedQueryable<T>, IMutableQueryable<T, TCreateInput> {
554
- ThenBy(orderBy: OrderByClause<T> | Projection<T, any>): IOrderedMutableQueryable<T, TCreateInput>;
555
- ThenByDescending(orderBy: OrderByClause<T> | Projection<T, any>): IOrderedMutableQueryable<T, TCreateInput>;
556
- }
557
-
558
- // ==================== EF Core Types ====================
559
-
560
- declare enum EntityState {
561
- Detached = 0,
562
- Unchanged = 1,
563
- Deleted = 2,
564
- Modified = 3,
565
- Added = 4,
566
- }
567
-
568
- declare interface IEntityEntry<T> {
569
- readonly entity: T;
570
- readonly state: EntityState;
571
- readonly originalValues: Partial<T>;
572
- readonly id: string | undefined;
573
- detach(): void;
574
- markDeleted(): void;
575
- markModified(): void;
576
- }
577
-
578
- declare interface IChangeTracker {
579
- track<T>(collection: string, entity: T, state?: EntityState): IEntityEntry<T>;
580
- getEntry<T>(collection: string, id: string | undefined, entity?: T): IEntityEntry<T> | undefined;
581
- entries(state?: EntityState): IEntityEntry<unknown>[];
582
- hasChanges(): boolean;
583
- entriesByCollection(): Map<string, IEntityEntry<unknown>[]>;
584
- acceptAllChanges(): void;
585
- clear(): void;
586
- }
587
-
588
- declare interface IDbSet<
589
- T,
590
- TCreateInput = Omit<T, "_id" | "_collection">,
591
- TUpdateInput = Partial<Omit<T, "_id" | "_collection">>
592
- > extends IMutableQueryable<T, TCreateInput> {
593
- /** Track entity as Added (will INSERT on SaveChangesAsync) - accepts full entity or CreateInput */
594
- Add(entity: T | TCreateInput): IEntityEntry<T>;
595
- /** Track multiple entities as Added */
596
- AddRange(entities: (T | TCreateInput)[]): IEntityEntry<T>[];
597
- /** Mark entity for deletion (will DELETE on SaveChangesAsync) */
598
- Remove(entity: T): IEntityEntry<T> | undefined;
599
- /** Mark entity as Modified (will UPDATE on SaveChangesAsync) - accepts full entity or UpdateInput */
600
- Update(entity: T | TUpdateInput): IEntityEntry<T> | undefined;
601
- /** Immediately execute UPDATE without change tracking */
602
- ExecuteUpdateAsync(update: TUpdateInput | Partial<Omit<T, "_id" | "_collection">>): Promise<number>;
603
- /** Immediately execute DELETE without change tracking */
604
- ExecuteDeleteAsync(): Promise<number>;
605
- /** Return queryable without change tracking */
606
- AsNoTracking(): IQueryable<T>;
607
- /** Find entity by primary key - checks ChangeTracker cache first, then queries database */
608
- FindAsync(id: string): Promise<T | undefined>;
609
- /** Find entity by primary key from ChangeTracker cache only (synchronous, no DB query) */
610
- Find(id: string): T | undefined;
611
- /** Attach existing entity as Unchanged for selective updates */
612
- Attach(entity: T): IEntityEntry<T>;
613
- /** Attach multiple existing entities as Unchanged */
614
- AttachRange(entities: T[]): IEntityEntry<T>[];
615
- /** Returns async enumerable for streaming */
616
- AsAsyncEnumerable(): IAsyncEnumerable<T>;
617
- }
618
-
619
- declare interface IDbContext<DataModel extends Record<string, any>> {
620
- readonly ChangeTracker: IChangeTracker;
621
- Set<K extends keyof DataModel & string>(collection: K): IDbSet<DataModel[K]>;
622
- SaveChangesAsync(): Promise<number>;
623
- /** Get EntityEntry for tracked entity using reference equality */
624
- Entry<T>(entity: T): IEntityEntry<T> | undefined;
625
- }
626
-
627
- // ==================== linqts List<T> Class ====================
628
-
629
- declare class List<T> implements Iterable<T> {
630
- constructor(items?: T[] | Iterable<T>);
631
-
632
- // LINQ Methods
633
- Where(predicate: (item: T) => boolean): List<T>;
634
- Select<TResult>(selector: (item: T) => TResult): List<TResult>;
635
- SelectMany<TResult>(selector: (item: T) => TResult[] | Iterable<TResult>): List<TResult>;
636
- First(): T;
637
- First(predicate: (item: T) => boolean): T;
638
- FirstOrDefault(): T | undefined;
639
- FirstOrDefault(predicate: (item: T) => boolean): T | undefined;
640
- Last(): T;
641
- Last(predicate: (item: T) => boolean): T;
642
- LastOrDefault(): T | undefined;
643
- LastOrDefault(predicate: (item: T) => boolean): T | undefined;
644
- ElementAt(index: number): T;
645
- ElementAtOrDefault(index: number): T | undefined;
646
- Any(predicate?: (item: T) => boolean): boolean;
647
- All(predicate: (item: T) => boolean): boolean;
648
- Contains(item: T): boolean;
649
- Count(): number;
650
- Count(predicate: (item: T) => boolean): number;
651
- Sum(selector?: (item: T) => number): number;
652
- Average(selector?: (item: T) => number): number;
653
- Min(selector?: (item: T) => number): number;
654
- Max(selector?: (item: T) => number): number;
655
- OrderBy(keySelector: (item: T) => any): List<T>;
656
- OrderByDescending(keySelector: (item: T) => any): List<T>;
657
- ThenBy(keySelector: (item: T) => any): List<T>;
658
- ThenByDescending(keySelector: (item: T) => any): List<T>;
659
- GroupBy<TKey>(keySelector: (item: T) => TKey): Record<string, T[]>;
660
- Distinct(): List<T>;
661
- Union(other: List<T>): List<T>;
662
- Intersect(other: List<T>): List<T>;
663
- Except(other: List<T>): List<T>;
664
- Take(count: number): List<T>;
665
- Skip(count: number): List<T>;
666
- TakeWhile(predicate: (item: T) => boolean): List<T>;
667
- SkipWhile(predicate: (item: T) => boolean): List<T>;
668
- Reverse(): List<T>;
669
- ToArray(): T[];
670
- ToList(): List<T>;
671
-
672
- // Mutation methods
673
- Add(item: T): List<T>;
674
- AddRange(items: T[]): List<T>;
675
- Insert(index: number, item: T): List<T>;
676
- Remove(item: T): boolean;
677
- RemoveAt(index: number): void;
678
- RemoveAll(predicate: (item: T) => boolean): number;
679
- Clear(): void;
680
-
681
- // Iteration
682
- forEach(action: (item: T, index: number) => void): void;
683
- map<TResult>(selector: (item: T, index: number) => TResult): TResult[];
684
- filter(predicate: (item: T) => boolean): T[];
685
- reduce<TResult>(accumulator: (acc: TResult, item: T) => TResult, initial: TResult): TResult;
686
-
687
- // Iterator
688
- [Symbol.iterator](): Iterator<T>;
689
- }
690
-
691
- // ==================== Repository & DbContext ====================
692
-
693
- declare interface Repository {
694
- ${collectionNames.map((name) => ` ${name}: IDbSet<${capitalize(name)}Document, ${capitalize(name)}CreateInput, ${capitalize(name)}UpdateInput>;`).join("\n ")}
695
- readonly ChangeTracker: IChangeTracker;
696
- SaveChangesAsync(): Promise<number>;
697
- }
698
-
699
- declare interface LoggerService {
700
- log(data: { timestamp?: number; level: string; kind: string; message: string; context?: any }): void;
701
- }
702
-
703
- declare interface ScriptContext {
704
- repository: Repository & IDbContext<any>;
705
- List: typeof List;
706
- logger: LoggerService;
707
- collections: string[];
708
- }
709
-
710
- // Global declarations for the Action Editor
711
- declare const repository: Repository;
712
- declare const List: typeof List;
713
- declare const logger: LoggerService;
714
- declare const collections: string[];
715
- declare const ctx: ScriptContext;
440
+ const typeDefinitions = `${documentInterfaces.join("\n\n")}
441
+
442
+ // ==================== Input Types (Create/Update) ====================
443
+
444
+ ${createInputInterfaces.join("\n\n")}
445
+
446
+ ${updateInputInterfaces.join("\n\n")}
447
+
448
+ // ==================== Relationship Types ====================
449
+
450
+ ${withRelationsInterfaces.join("\n\n")}
451
+
452
+ // ==================== LINQ Query Types ====================
453
+
454
+ type Predicate<T> = (item: T) => boolean | Promise<boolean>;
455
+ type Projection<TSource, TResult> = (item: TSource) => TResult;
456
+
457
+ type WhereOperator<T> =
458
+ | { eq: T }
459
+ | { ne: T }
460
+ | { gt: T }
461
+ | { gte: T }
462
+ | { lt: T }
463
+ | { lte: T }
464
+ | { in: T[] }
465
+ | { notIn: T[] }
466
+ | { contains: string }
467
+ | { startsWith: string }
468
+ | { endsWith: string }
469
+ | { isNull: true }
470
+ | { isNotNull: true };
471
+
472
+ type WhereClause<T> = {
473
+ [K in keyof T]?: T[K] | WhereOperator<T[K]> | { and: WhereClause<T>[] } | { or: WhereClause<T>[] } | { not: WhereClause<T> };
474
+ };
475
+
476
+ type OrderByClause<T> = {
477
+ [K in keyof T]?: "asc" | "desc";
478
+ };
479
+
480
+ // ==================== Queryable Interfaces ====================
481
+
482
+ /**
483
+ * Async enumerable for streaming query results without loading all into memory
484
+ * Provides O(1) memory usage vs O(n) for ToArrayAsync and supports early termination
485
+ */
486
+ declare interface IAsyncEnumerable<T> {
487
+ /** Async iterator for for await...of loops */
488
+ [Symbol.asyncIterator](): AsyncIterator<T>;
489
+ /** Filter items based on predicate */
490
+ Where(predicate: (item: T) => boolean): IAsyncEnumerable<T>;
491
+ /** Project items to new form */
492
+ Select<TResult>(selector: (item: T) => TResult): IAsyncEnumerable<TResult>;
493
+ /** Take first n items (supports early termination) */
494
+ Take(count: number): IAsyncEnumerable<T>;
495
+ /** Skip first n items */
496
+ Skip(count: number): IAsyncEnumerable<T>;
497
+ /** Materialize all items to array (loads entire set into memory) */
498
+ ToArrayAsync(): Promise<T[]>;
499
+ /** Get first item or throw if empty */
500
+ FirstAsync(): Promise<T>;
501
+ /** Get first item or undefined if empty */
502
+ FirstOrDefaultAsync(): Promise<T | undefined>;
503
+ /** Count items in sequence */
504
+ CountAsync(): Promise<number>;
505
+ /** Check if any item exists (short-circuits on first item) */
506
+ AnyAsync(): Promise<boolean>;
507
+ }
508
+
509
+ declare interface IQueryable<T> {
510
+ Where(where: WhereClause<T> | Predicate<T>): IQueryable<T>;
511
+ Select<TResult>(selector: Projection<T, TResult>): IQueryable<TResult>;
512
+ SelectMany<TResult>(selector: (item: T) => IQueryable<TResult> | TResult[]): IQueryable<TResult>;
513
+ OrderBy(orderBy: OrderByClause<T> | Projection<T, any>): IOrderedQueryable<T>;
514
+ OrderByDescending(orderBy: OrderByClause<T> | Projection<T, any>): IOrderedQueryable<T>;
515
+ Take(count: number): IQueryable<T>;
516
+ Skip(count: number): IQueryable<T>;
517
+ Distinct(): IQueryable<T>;
518
+ CountAsync(): Promise<number>;
519
+ CountAsync(predicate: Predicate<T>): Promise<number>;
520
+ AnyAsync(): Promise<boolean>;
521
+ AnyAsync(predicate: Predicate<T>): Promise<boolean>;
522
+ AllAsync(predicate: Predicate<T>): Promise<boolean>;
523
+ FirstAsync(): Promise<T>;
524
+ FirstAsync(predicate: Predicate<T>): Promise<T>;
525
+ FirstOrDefaultAsync(): Promise<T | undefined>;
526
+ FirstOrDefaultAsync(predicate: Predicate<T>): Promise<T | undefined>;
527
+ ToListAsync(): Promise<List<T>>;
528
+ ToArrayAsync(): Promise<T[]>;
529
+ /** Returns an async enumerable for streaming without loading all items into memory */
530
+ AsAsyncEnumerable(): IAsyncEnumerable<T>;
531
+ }
532
+
533
+ declare interface IOrderedQueryable<T> extends IQueryable<T> {
534
+ ThenBy(orderBy: OrderByClause<T> | Projection<T, any>): IOrderedQueryable<T>;
535
+ ThenByDescending(orderBy: OrderByClause<T> | Projection<T, any>): IOrderedQueryable<T>;
536
+ }
537
+
538
+ declare interface IMutableQueryable<T, TCreateInput = Omit<T, "_id" | "_collection">> extends IQueryable<T> {
539
+ Where(where: WhereClause<T> | Predicate<T>): IMutableQueryable<T, TCreateInput>;
540
+ Select<TResult>(selector: Projection<T, TResult>): IMutableQueryable<TResult, any>;
541
+ Take(count: number): IMutableQueryable<T, TCreateInput>;
542
+ Skip(count: number): IMutableQueryable<T, TCreateInput>;
543
+ Distinct(): IMutableQueryable<T, TCreateInput>;
544
+ OrderBy(orderBy: OrderByClause<T> | Projection<T, any>): IOrderedMutableQueryable<T, TCreateInput>;
545
+ OrderByDescending(orderBy: OrderByClause<T> | Projection<T, any>): IOrderedMutableQueryable<T, TCreateInput>;
546
+ Insert(data: TCreateInput | Omit<T, "_id" | "_collection">): Promise<string>;
547
+ InsertMany(data: (TCreateInput | Omit<T, "_id" | "_collection">)[]): Promise<string[]>;
548
+ UpdateMany(data: Partial<Omit<T, "_id" | "_collection">>): Promise<number>;
549
+ DeleteMany(): Promise<number>;
550
+ AsNoTracking(): IQueryable<T>;
551
+ AsAsyncEnumerable(): IAsyncEnumerable<T>;
552
+ }
553
+
554
+ declare interface IOrderedMutableQueryable<T, TCreateInput = Omit<T, "_id" | "_collection">> extends IOrderedQueryable<T>, IMutableQueryable<T, TCreateInput> {
555
+ ThenBy(orderBy: OrderByClause<T> | Projection<T, any>): IOrderedMutableQueryable<T, TCreateInput>;
556
+ ThenByDescending(orderBy: OrderByClause<T> | Projection<T, any>): IOrderedMutableQueryable<T, TCreateInput>;
557
+ }
558
+
559
+ // ==================== EF Core Types ====================
560
+
561
+ declare enum EntityState {
562
+ Detached = 0,
563
+ Unchanged = 1,
564
+ Deleted = 2,
565
+ Modified = 3,
566
+ Added = 4,
567
+ }
568
+
569
+ declare interface IEntityEntry<T> {
570
+ readonly entity: T;
571
+ readonly state: EntityState;
572
+ readonly originalValues: Partial<T>;
573
+ readonly id: string | undefined;
574
+ detach(): void;
575
+ markDeleted(): void;
576
+ markModified(): void;
577
+ }
578
+
579
+ declare interface IChangeTracker {
580
+ track<T>(collection: string, entity: T, state?: EntityState): IEntityEntry<T>;
581
+ getEntry<T>(collection: string, id: string | undefined, entity?: T): IEntityEntry<T> | undefined;
582
+ entries(state?: EntityState): IEntityEntry<unknown>[];
583
+ hasChanges(): boolean;
584
+ entriesByCollection(): Map<string, IEntityEntry<unknown>[]>;
585
+ acceptAllChanges(): void;
586
+ clear(): void;
587
+ }
588
+
589
+ declare interface IDbSet<
590
+ T,
591
+ TCreateInput = Omit<T, "_id" | "_collection">,
592
+ TUpdateInput = Partial<Omit<T, "_id" | "_collection">>
593
+ > extends IMutableQueryable<T, TCreateInput> {
594
+ /** Track entity as Added (will INSERT on SaveChangesAsync) - accepts full entity or CreateInput */
595
+ Add(entity: T | TCreateInput): IEntityEntry<T>;
596
+ /** Track multiple entities as Added */
597
+ AddRange(entities: (T | TCreateInput)[]): IEntityEntry<T>[];
598
+ /** Mark entity for deletion (will DELETE on SaveChangesAsync) */
599
+ Remove(entity: T): IEntityEntry<T> | undefined;
600
+ /** Mark entity as Modified (will UPDATE on SaveChangesAsync) - accepts full entity or UpdateInput */
601
+ Update(entity: T | TUpdateInput): IEntityEntry<T> | undefined;
602
+ /** Immediately execute UPDATE without change tracking */
603
+ ExecuteUpdateAsync(update: TUpdateInput | Partial<Omit<T, "_id" | "_collection">>): Promise<number>;
604
+ /** Immediately execute DELETE without change tracking */
605
+ ExecuteDeleteAsync(): Promise<number>;
606
+ /** Return queryable without change tracking */
607
+ AsNoTracking(): IQueryable<T>;
608
+ /** Find entity by primary key - checks ChangeTracker cache first, then queries database */
609
+ FindAsync(id: string): Promise<T | undefined>;
610
+ /** Find entity by primary key from ChangeTracker cache only (synchronous, no DB query) */
611
+ Find(id: string): T | undefined;
612
+ /** Attach existing entity as Unchanged for selective updates */
613
+ Attach(entity: T): IEntityEntry<T>;
614
+ /** Attach multiple existing entities as Unchanged */
615
+ AttachRange(entities: T[]): IEntityEntry<T>[];
616
+ /** Returns async enumerable for streaming */
617
+ AsAsyncEnumerable(): IAsyncEnumerable<T>;
618
+ }
619
+
620
+ declare interface IDbContext<DataModel extends Record<string, any>> {
621
+ readonly ChangeTracker: IChangeTracker;
622
+ Set<K extends keyof DataModel & string>(collection: K): IDbSet<DataModel[K]>;
623
+ SaveChangesAsync(): Promise<number>;
624
+ /** Get EntityEntry for tracked entity using reference equality */
625
+ Entry<T>(entity: T): IEntityEntry<T> | undefined;
626
+ }
627
+
628
+ // ==================== linqts List<T> Class ====================
629
+
630
+ declare class List<T> implements Iterable<T> {
631
+ constructor(items?: T[] | Iterable<T>);
632
+
633
+ // LINQ Methods
634
+ Where(predicate: (item: T) => boolean): List<T>;
635
+ Select<TResult>(selector: (item: T) => TResult): List<TResult>;
636
+ SelectMany<TResult>(selector: (item: T) => TResult[] | Iterable<TResult>): List<TResult>;
637
+ First(): T;
638
+ First(predicate: (item: T) => boolean): T;
639
+ FirstOrDefault(): T | undefined;
640
+ FirstOrDefault(predicate: (item: T) => boolean): T | undefined;
641
+ Last(): T;
642
+ Last(predicate: (item: T) => boolean): T;
643
+ LastOrDefault(): T | undefined;
644
+ LastOrDefault(predicate: (item: T) => boolean): T | undefined;
645
+ ElementAt(index: number): T;
646
+ ElementAtOrDefault(index: number): T | undefined;
647
+ Any(predicate?: (item: T) => boolean): boolean;
648
+ All(predicate: (item: T) => boolean): boolean;
649
+ Contains(item: T): boolean;
650
+ Count(): number;
651
+ Count(predicate: (item: T) => boolean): number;
652
+ Sum(selector?: (item: T) => number): number;
653
+ Average(selector?: (item: T) => number): number;
654
+ Min(selector?: (item: T) => number): number;
655
+ Max(selector?: (item: T) => number): number;
656
+ OrderBy(keySelector: (item: T) => any): List<T>;
657
+ OrderByDescending(keySelector: (item: T) => any): List<T>;
658
+ ThenBy(keySelector: (item: T) => any): List<T>;
659
+ ThenByDescending(keySelector: (item: T) => any): List<T>;
660
+ GroupBy<TKey>(keySelector: (item: T) => TKey): Record<string, T[]>;
661
+ Distinct(): List<T>;
662
+ Union(other: List<T>): List<T>;
663
+ Intersect(other: List<T>): List<T>;
664
+ Except(other: List<T>): List<T>;
665
+ Take(count: number): List<T>;
666
+ Skip(count: number): List<T>;
667
+ TakeWhile(predicate: (item: T) => boolean): List<T>;
668
+ SkipWhile(predicate: (item: T) => boolean): List<T>;
669
+ Reverse(): List<T>;
670
+ ToArray(): T[];
671
+ ToList(): List<T>;
672
+
673
+ // Mutation methods
674
+ Add(item: T): List<T>;
675
+ AddRange(items: T[]): List<T>;
676
+ Insert(index: number, item: T): List<T>;
677
+ Remove(item: T): boolean;
678
+ RemoveAt(index: number): void;
679
+ RemoveAll(predicate: (item: T) => boolean): number;
680
+ Clear(): void;
681
+
682
+ // Iteration
683
+ forEach(action: (item: T, index: number) => void): void;
684
+ map<TResult>(selector: (item: T, index: number) => TResult): TResult[];
685
+ filter(predicate: (item: T) => boolean): T[];
686
+ reduce<TResult>(accumulator: (acc: TResult, item: T) => TResult, initial: TResult): TResult;
687
+
688
+ // Iterator
689
+ [Symbol.iterator](): Iterator<T>;
690
+ }
691
+
692
+ // ==================== Repository & DbContext ====================
693
+
694
+ declare interface Repository {
695
+ ${collectionNames.map((name) => ` ${name}: IDbSet<${capitalize(name)}Document, ${capitalize(name)}CreateInput, ${capitalize(name)}UpdateInput>;`).join("\n ")}
696
+ readonly ChangeTracker: IChangeTracker;
697
+ SaveChangesAsync(): Promise<number>;
698
+ }
699
+
700
+ declare interface LoggerService {
701
+ log(data: { timestamp?: number; level: string; kind: string; message: string; context?: any }): void;
702
+ }
703
+
704
+ declare interface ScriptContext {
705
+ repository: Repository & IDbContext<any>;
706
+ List: typeof List;
707
+ logger: LoggerService;
708
+ collections: string[];
709
+ }
710
+
711
+ // Global declarations for the Action Editor
712
+ declare const repository: Repository;
713
+ declare const List: typeof List;
714
+ declare const logger: LoggerService;
715
+ declare const collections: string[];
716
+ declare const ctx: ScriptContext;
716
717
  `;
717
718
  return {
718
719
  collections: collectionNames,