@zyno-io/dk-server-foundation 26.216.430

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 (663) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +458 -0
  3. package/dist/devconsole/assets/index-CKF3C3kv.css +1 -0
  4. package/dist/devconsole/assets/index-CsHdomhM.js +27 -0
  5. package/dist/devconsole/index.html +13 -0
  6. package/dist/resources/proto/generated/devconsole/devconsole.d.ts +320 -0
  7. package/dist/resources/proto/generated/devconsole/devconsole.d.ts.map +1 -0
  8. package/dist/resources/proto/generated/devconsole/devconsole.js +3751 -0
  9. package/dist/resources/proto/generated/devconsole/devconsole.js.map +1 -0
  10. package/dist/src/app/base.d.ts +36 -0
  11. package/dist/src/app/base.d.ts.map +1 -0
  12. package/dist/src/app/base.js +240 -0
  13. package/dist/src/app/base.js.map +1 -0
  14. package/dist/src/app/config.d.ts +90 -0
  15. package/dist/src/app/config.d.ts.map +1 -0
  16. package/dist/src/app/config.js +33 -0
  17. package/dist/src/app/config.js.map +1 -0
  18. package/dist/src/app/config.loader.d.ts +14 -0
  19. package/dist/src/app/config.loader.d.ts.map +1 -0
  20. package/dist/src/app/config.loader.js +67 -0
  21. package/dist/src/app/config.loader.js.map +1 -0
  22. package/dist/src/app/const.d.ts +3 -0
  23. package/dist/src/app/const.d.ts.map +1 -0
  24. package/dist/src/app/const.js +6 -0
  25. package/dist/src/app/const.js.map +1 -0
  26. package/dist/src/app/dev.d.ts +7 -0
  27. package/dist/src/app/dev.d.ts.map +1 -0
  28. package/dist/src/app/dev.js +105 -0
  29. package/dist/src/app/dev.js.map +1 -0
  30. package/dist/src/app/index.d.ts +7 -0
  31. package/dist/src/app/index.d.ts.map +1 -0
  32. package/dist/src/app/index.js +12 -0
  33. package/dist/src/app/index.js.map +1 -0
  34. package/dist/src/app/openapi.d.ts +4 -0
  35. package/dist/src/app/openapi.d.ts.map +1 -0
  36. package/dist/src/app/openapi.js +6 -0
  37. package/dist/src/app/openapi.js.map +1 -0
  38. package/dist/src/app/resolver.d.ts +11 -0
  39. package/dist/src/app/resolver.d.ts.map +1 -0
  40. package/dist/src/app/resolver.js +60 -0
  41. package/dist/src/app/resolver.js.map +1 -0
  42. package/dist/src/app/shutdown.d.ts +12 -0
  43. package/dist/src/app/shutdown.d.ts.map +1 -0
  44. package/dist/src/app/shutdown.js +63 -0
  45. package/dist/src/app/shutdown.js.map +1 -0
  46. package/dist/src/app/state.d.ts +16 -0
  47. package/dist/src/app/state.d.ts.map +1 -0
  48. package/dist/src/app/state.js +12 -0
  49. package/dist/src/app/state.js.map +1 -0
  50. package/dist/src/auth/index.d.ts +3 -0
  51. package/dist/src/auth/index.d.ts.map +1 -0
  52. package/dist/src/auth/index.js +6 -0
  53. package/dist/src/auth/index.js.map +1 -0
  54. package/dist/src/auth/jwt.d.ts +76 -0
  55. package/dist/src/auth/jwt.d.ts.map +1 -0
  56. package/dist/src/auth/jwt.js +218 -0
  57. package/dist/src/auth/jwt.js.map +1 -0
  58. package/dist/src/auth/provider.d.ts +15 -0
  59. package/dist/src/auth/provider.d.ts.map +1 -0
  60. package/dist/src/auth/provider.js +50 -0
  61. package/dist/src/auth/provider.js.map +1 -0
  62. package/dist/src/cli/dksf-dev.d.ts +3 -0
  63. package/dist/src/cli/dksf-dev.d.ts.map +1 -0
  64. package/dist/src/cli/dksf-dev.js +408 -0
  65. package/dist/src/cli/dksf-dev.js.map +1 -0
  66. package/dist/src/cli/dksf-gen-proto.d.ts +3 -0
  67. package/dist/src/cli/dksf-gen-proto.d.ts.map +1 -0
  68. package/dist/src/cli/dksf-gen-proto.js +164 -0
  69. package/dist/src/cli/dksf-gen-proto.js.map +1 -0
  70. package/dist/src/cli/dksf-install.d.ts +3 -0
  71. package/dist/src/cli/dksf-install.d.ts.map +1 -0
  72. package/dist/src/cli/dksf-install.js +10 -0
  73. package/dist/src/cli/dksf-install.js.map +1 -0
  74. package/dist/src/cli/dksf-test.d.ts +3 -0
  75. package/dist/src/cli/dksf-test.d.ts.map +1 -0
  76. package/dist/src/cli/dksf-test.js +78 -0
  77. package/dist/src/cli/dksf-test.js.map +1 -0
  78. package/dist/src/cli/dksf-update.d.ts +3 -0
  79. package/dist/src/cli/dksf-update.d.ts.map +1 -0
  80. package/dist/src/cli/dksf-update.js +86 -0
  81. package/dist/src/cli/dksf-update.js.map +1 -0
  82. package/dist/src/database/common.d.ts +84 -0
  83. package/dist/src/database/common.d.ts.map +1 -0
  84. package/dist/src/database/common.js +380 -0
  85. package/dist/src/database/common.js.map +1 -0
  86. package/dist/src/database/dialect.d.ts +10 -0
  87. package/dist/src/database/dialect.d.ts.map +1 -0
  88. package/dist/src/database/dialect.js +56 -0
  89. package/dist/src/database/dialect.js.map +1 -0
  90. package/dist/src/database/entity.d.ts +62 -0
  91. package/dist/src/database/entity.d.ts.map +1 -0
  92. package/dist/src/database/entity.js +198 -0
  93. package/dist/src/database/entity.js.map +1 -0
  94. package/dist/src/database/index.d.ts +8 -0
  95. package/dist/src/database/index.d.ts.map +1 -0
  96. package/dist/src/database/index.js +15 -0
  97. package/dist/src/database/index.js.map +1 -0
  98. package/dist/src/database/migration/MigrationResetCommand.d.ts +9 -0
  99. package/dist/src/database/migration/MigrationResetCommand.d.ts.map +1 -0
  100. package/dist/src/database/migration/MigrationResetCommand.js +75 -0
  101. package/dist/src/database/migration/MigrationResetCommand.js.map +1 -0
  102. package/dist/src/database/migration/MigrationRunCommand.d.ts +11 -0
  103. package/dist/src/database/migration/MigrationRunCommand.d.ts.map +1 -0
  104. package/dist/src/database/migration/MigrationRunCommand.js +118 -0
  105. package/dist/src/database/migration/MigrationRunCommand.js.map +1 -0
  106. package/dist/src/database/migration/characters.d.ts +14 -0
  107. package/dist/src/database/migration/characters.d.ts.map +1 -0
  108. package/dist/src/database/migration/characters.js +56 -0
  109. package/dist/src/database/migration/characters.js.map +1 -0
  110. package/dist/src/database/migration/create/MigrationCreateCommand.d.ts +11 -0
  111. package/dist/src/database/migration/create/MigrationCreateCommand.d.ts.map +1 -0
  112. package/dist/src/database/migration/create/MigrationCreateCommand.js +106 -0
  113. package/dist/src/database/migration/create/MigrationCreateCommand.js.map +1 -0
  114. package/dist/src/database/migration/create/comparator.d.ts +3 -0
  115. package/dist/src/database/migration/create/comparator.d.ts.map +1 -0
  116. package/dist/src/database/migration/create/comparator.js +408 -0
  117. package/dist/src/database/migration/create/comparator.js.map +1 -0
  118. package/dist/src/database/migration/create/db-reader.d.ts +5 -0
  119. package/dist/src/database/migration/create/db-reader.d.ts.map +1 -0
  120. package/dist/src/database/migration/create/db-reader.js +473 -0
  121. package/dist/src/database/migration/create/db-reader.js.map +1 -0
  122. package/dist/src/database/migration/create/ddl-generator.d.ts +3 -0
  123. package/dist/src/database/migration/create/ddl-generator.d.ts.map +1 -0
  124. package/dist/src/database/migration/create/ddl-generator.js +725 -0
  125. package/dist/src/database/migration/create/ddl-generator.js.map +1 -0
  126. package/dist/src/database/migration/create/entity-reader.d.ts +4 -0
  127. package/dist/src/database/migration/create/entity-reader.d.ts.map +1 -0
  128. package/dist/src/database/migration/create/entity-reader.js +417 -0
  129. package/dist/src/database/migration/create/entity-reader.js.map +1 -0
  130. package/dist/src/database/migration/create/file-generator.d.ts +3 -0
  131. package/dist/src/database/migration/create/file-generator.d.ts.map +1 -0
  132. package/dist/src/database/migration/create/file-generator.js +62 -0
  133. package/dist/src/database/migration/create/file-generator.js.map +1 -0
  134. package/dist/src/database/migration/create/prompt.d.ts +4 -0
  135. package/dist/src/database/migration/create/prompt.d.ts.map +1 -0
  136. package/dist/src/database/migration/create/prompt.js +55 -0
  137. package/dist/src/database/migration/create/prompt.js.map +1 -0
  138. package/dist/src/database/migration/create/schema-model.d.ts +109 -0
  139. package/dist/src/database/migration/create/schema-model.d.ts.map +1 -0
  140. package/dist/src/database/migration/create/schema-model.js +24 -0
  141. package/dist/src/database/migration/create/schema-model.js.map +1 -0
  142. package/dist/src/database/migration/helpers.d.ts +3 -0
  143. package/dist/src/database/migration/helpers.d.ts.map +1 -0
  144. package/dist/src/database/migration/helpers.js +13 -0
  145. package/dist/src/database/migration/helpers.js.map +1 -0
  146. package/dist/src/database/migration/index.d.ts +9 -0
  147. package/dist/src/database/migration/index.d.ts.map +1 -0
  148. package/dist/src/database/migration/index.js +43 -0
  149. package/dist/src/database/migration/index.js.map +1 -0
  150. package/dist/src/database/migration/migration.entity.d.ts +8 -0
  151. package/dist/src/database/migration/migration.entity.d.ts.map +1 -0
  152. package/dist/src/database/migration/migration.entity.js +16 -0
  153. package/dist/src/database/migration/migration.entity.js.map +1 -0
  154. package/dist/src/database/mysql.d.ts +16 -0
  155. package/dist/src/database/mysql.d.ts.map +1 -0
  156. package/dist/src/database/mysql.js +140 -0
  157. package/dist/src/database/mysql.js.map +1 -0
  158. package/dist/src/database/postgres.d.ts +16 -0
  159. package/dist/src/database/postgres.d.ts.map +1 -0
  160. package/dist/src/database/postgres.js +91 -0
  161. package/dist/src/database/postgres.js.map +1 -0
  162. package/dist/src/database/types.d.ts +21 -0
  163. package/dist/src/database/types.d.ts.map +1 -0
  164. package/dist/src/database/types.js +27 -0
  165. package/dist/src/database/types.js.map +1 -0
  166. package/dist/src/devconsole/devconsole.controller.d.ts +7 -0
  167. package/dist/src/devconsole/devconsole.controller.d.ts.map +1 -0
  168. package/dist/src/devconsole/devconsole.controller.js +82 -0
  169. package/dist/src/devconsole/devconsole.controller.js.map +1 -0
  170. package/dist/src/devconsole/devconsole.middleware.d.ts +12 -0
  171. package/dist/src/devconsole/devconsole.middleware.d.ts.map +1 -0
  172. package/dist/src/devconsole/devconsole.middleware.js +28 -0
  173. package/dist/src/devconsole/devconsole.middleware.js.map +1 -0
  174. package/dist/src/devconsole/devconsole.srpc.d.ts +14 -0
  175. package/dist/src/devconsole/devconsole.srpc.d.ts.map +1 -0
  176. package/dist/src/devconsole/devconsole.srpc.js +94 -0
  177. package/dist/src/devconsole/devconsole.srpc.js.map +1 -0
  178. package/dist/src/devconsole/devconsole.store.d.ts +101 -0
  179. package/dist/src/devconsole/devconsole.store.d.ts.map +1 -0
  180. package/dist/src/devconsole/devconsole.store.js +125 -0
  181. package/dist/src/devconsole/devconsole.store.js.map +1 -0
  182. package/dist/src/devconsole/devconsole.ws.d.ts +18 -0
  183. package/dist/src/devconsole/devconsole.ws.d.ts.map +1 -0
  184. package/dist/src/devconsole/devconsole.ws.js +470 -0
  185. package/dist/src/devconsole/devconsole.ws.js.map +1 -0
  186. package/dist/src/devconsole/index.d.ts +2 -0
  187. package/dist/src/devconsole/index.d.ts.map +1 -0
  188. package/dist/src/devconsole/index.js +6 -0
  189. package/dist/src/devconsole/index.js.map +1 -0
  190. package/dist/src/devconsole/patches.d.ts +6 -0
  191. package/dist/src/devconsole/patches.d.ts.map +1 -0
  192. package/dist/src/devconsole/patches.js +397 -0
  193. package/dist/src/devconsole/patches.js.map +1 -0
  194. package/dist/src/health/health.module.d.ts +6 -0
  195. package/dist/src/health/health.module.d.ts.map +1 -0
  196. package/dist/src/health/health.module.js +32 -0
  197. package/dist/src/health/health.module.js.map +1 -0
  198. package/dist/src/health/healthcheck.controller.d.ts +10 -0
  199. package/dist/src/health/healthcheck.controller.d.ts.map +1 -0
  200. package/dist/src/health/healthcheck.controller.js +30 -0
  201. package/dist/src/health/healthcheck.controller.js.map +1 -0
  202. package/dist/src/health/healthcheck.service.d.ts +13 -0
  203. package/dist/src/health/healthcheck.service.d.ts.map +1 -0
  204. package/dist/src/health/healthcheck.service.js +33 -0
  205. package/dist/src/health/healthcheck.service.js.map +1 -0
  206. package/dist/src/health/index.d.ts +3 -0
  207. package/dist/src/health/index.d.ts.map +1 -0
  208. package/dist/src/health/index.js +6 -0
  209. package/dist/src/health/index.js.map +1 -0
  210. package/dist/src/helpers/async/context.d.ts +11 -0
  211. package/dist/src/helpers/async/context.d.ts.map +1 -0
  212. package/dist/src/helpers/async/context.js +75 -0
  213. package/dist/src/helpers/async/context.js.map +1 -0
  214. package/dist/src/helpers/async/process.d.ts +16 -0
  215. package/dist/src/helpers/async/process.d.ts.map +1 -0
  216. package/dist/src/helpers/async/process.js +44 -0
  217. package/dist/src/helpers/async/process.js.map +1 -0
  218. package/dist/src/helpers/async/promise.d.ts +5 -0
  219. package/dist/src/helpers/async/promise.d.ts.map +1 -0
  220. package/dist/src/helpers/async/promise.js +27 -0
  221. package/dist/src/helpers/async/promise.js.map +1 -0
  222. package/dist/src/helpers/data/array.d.ts +3 -0
  223. package/dist/src/helpers/data/array.d.ts.map +1 -0
  224. package/dist/src/helpers/data/array.js +17 -0
  225. package/dist/src/helpers/data/array.js.map +1 -0
  226. package/dist/src/helpers/data/objects.d.ts +12 -0
  227. package/dist/src/helpers/data/objects.d.ts.map +1 -0
  228. package/dist/src/helpers/data/objects.js +75 -0
  229. package/dist/src/helpers/data/objects.js.map +1 -0
  230. package/dist/src/helpers/data/serialization.d.ts +4 -0
  231. package/dist/src/helpers/data/serialization.d.ts.map +1 -0
  232. package/dist/src/helpers/data/serialization.js +15 -0
  233. package/dist/src/helpers/data/serialization.js.map +1 -0
  234. package/dist/src/helpers/data/transformer.d.ts +13 -0
  235. package/dist/src/helpers/data/transformer.d.ts.map +1 -0
  236. package/dist/src/helpers/data/transformer.js +55 -0
  237. package/dist/src/helpers/data/transformer.js.map +1 -0
  238. package/dist/src/helpers/framework/decorators.d.ts +5 -0
  239. package/dist/src/helpers/framework/decorators.d.ts.map +1 -0
  240. package/dist/src/helpers/framework/decorators.js +39 -0
  241. package/dist/src/helpers/framework/decorators.js.map +1 -0
  242. package/dist/src/helpers/framework/event.d.ts +3 -0
  243. package/dist/src/helpers/framework/event.d.ts.map +1 -0
  244. package/dist/src/helpers/framework/event.js +20 -0
  245. package/dist/src/helpers/framework/event.js.map +1 -0
  246. package/dist/src/helpers/framework/injection.d.ts +7 -0
  247. package/dist/src/helpers/framework/injection.d.ts.map +1 -0
  248. package/dist/src/helpers/framework/injection.js +52 -0
  249. package/dist/src/helpers/framework/injection.js.map +1 -0
  250. package/dist/src/helpers/index.d.ts +22 -0
  251. package/dist/src/helpers/index.d.ts.map +1 -0
  252. package/dist/src/helpers/index.js +32 -0
  253. package/dist/src/helpers/index.js.map +1 -0
  254. package/dist/src/helpers/io/package.d.ts +5 -0
  255. package/dist/src/helpers/io/package.d.ts.map +1 -0
  256. package/dist/src/helpers/io/package.js +31 -0
  257. package/dist/src/helpers/io/package.js.map +1 -0
  258. package/dist/src/helpers/io/stream.d.ts +18 -0
  259. package/dist/src/helpers/io/stream.d.ts.map +1 -0
  260. package/dist/src/helpers/io/stream.js +91 -0
  261. package/dist/src/helpers/io/stream.js.map +1 -0
  262. package/dist/src/helpers/redis/broadcast.d.ts +13 -0
  263. package/dist/src/helpers/redis/broadcast.d.ts.map +1 -0
  264. package/dist/src/helpers/redis/broadcast.js +100 -0
  265. package/dist/src/helpers/redis/broadcast.js.map +1 -0
  266. package/dist/src/helpers/redis/cache.d.ts +7 -0
  267. package/dist/src/helpers/redis/cache.d.ts.map +1 -0
  268. package/dist/src/helpers/redis/cache.js +28 -0
  269. package/dist/src/helpers/redis/cache.js.map +1 -0
  270. package/dist/src/helpers/redis/mutex.d.ts +24 -0
  271. package/dist/src/helpers/redis/mutex.d.ts.map +1 -0
  272. package/dist/src/helpers/redis/mutex.js +240 -0
  273. package/dist/src/helpers/redis/mutex.js.map +1 -0
  274. package/dist/src/helpers/redis/redis.d.ts +11 -0
  275. package/dist/src/helpers/redis/redis.d.ts.map +1 -0
  276. package/dist/src/helpers/redis/redis.js +59 -0
  277. package/dist/src/helpers/redis/redis.js.map +1 -0
  278. package/dist/src/helpers/security/crypto.d.ts +26 -0
  279. package/dist/src/helpers/security/crypto.d.ts.map +1 -0
  280. package/dist/src/helpers/security/crypto.js +121 -0
  281. package/dist/src/helpers/security/crypto.js.map +1 -0
  282. package/dist/src/helpers/security/validation.d.ts +4 -0
  283. package/dist/src/helpers/security/validation.d.ts.map +1 -0
  284. package/dist/src/helpers/security/validation.js +25 -0
  285. package/dist/src/helpers/security/validation.js.map +1 -0
  286. package/dist/src/helpers/utils/date.d.ts +4 -0
  287. package/dist/src/helpers/utils/date.d.ts.map +1 -0
  288. package/dist/src/helpers/utils/date.js +23 -0
  289. package/dist/src/helpers/utils/date.js.map +1 -0
  290. package/dist/src/helpers/utils/error.d.ts +24 -0
  291. package/dist/src/helpers/utils/error.d.ts.map +1 -0
  292. package/dist/src/helpers/utils/error.js +168 -0
  293. package/dist/src/helpers/utils/error.js.map +1 -0
  294. package/dist/src/helpers/utils/jsx.d.ts +3 -0
  295. package/dist/src/helpers/utils/jsx.d.ts.map +1 -0
  296. package/dist/src/helpers/utils/jsx.js +13 -0
  297. package/dist/src/helpers/utils/jsx.js.map +1 -0
  298. package/dist/src/helpers/utils/uuid.d.ts +3 -0
  299. package/dist/src/helpers/utils/uuid.d.ts.map +1 -0
  300. package/dist/src/helpers/utils/uuid.js +14 -0
  301. package/dist/src/helpers/utils/uuid.js.map +1 -0
  302. package/dist/src/http/auth.d.ts +46 -0
  303. package/dist/src/http/auth.d.ts.map +1 -0
  304. package/dist/src/http/auth.js +162 -0
  305. package/dist/src/http/auth.js.map +1 -0
  306. package/dist/src/http/context.d.ts +5 -0
  307. package/dist/src/http/context.d.ts.map +1 -0
  308. package/dist/src/http/context.js +22 -0
  309. package/dist/src/http/context.js.map +1 -0
  310. package/dist/src/http/cors.d.ts +36 -0
  311. package/dist/src/http/cors.d.ts.map +1 -0
  312. package/dist/src/http/cors.js +171 -0
  313. package/dist/src/http/cors.js.map +1 -0
  314. package/dist/src/http/errors.d.ts +3 -0
  315. package/dist/src/http/errors.d.ts.map +1 -0
  316. package/dist/src/http/errors.js +10 -0
  317. package/dist/src/http/errors.js.map +1 -0
  318. package/dist/src/http/index.d.ts +24 -0
  319. package/dist/src/http/index.d.ts.map +1 -0
  320. package/dist/src/http/index.js +25 -0
  321. package/dist/src/http/index.js.map +1 -0
  322. package/dist/src/http/kernel.d.ts +17 -0
  323. package/dist/src/http/kernel.d.ts.map +1 -0
  324. package/dist/src/http/kernel.js +133 -0
  325. package/dist/src/http/kernel.js.map +1 -0
  326. package/dist/src/http/middleware.d.ts +12 -0
  327. package/dist/src/http/middleware.d.ts.map +1 -0
  328. package/dist/src/http/middleware.js +61 -0
  329. package/dist/src/http/middleware.js.map +1 -0
  330. package/dist/src/http/overrides.d.ts +2 -0
  331. package/dist/src/http/overrides.d.ts.map +1 -0
  332. package/dist/src/http/overrides.js +19 -0
  333. package/dist/src/http/overrides.js.map +1 -0
  334. package/dist/src/http/store.d.ts +33 -0
  335. package/dist/src/http/store.d.ts.map +1 -0
  336. package/dist/src/http/store.js +102 -0
  337. package/dist/src/http/store.js.map +1 -0
  338. package/dist/src/http/uploads.d.ts +7 -0
  339. package/dist/src/http/uploads.d.ts.map +1 -0
  340. package/dist/src/http/uploads.js +8 -0
  341. package/dist/src/http/uploads.js.map +1 -0
  342. package/dist/src/http/workflow.d.ts +18 -0
  343. package/dist/src/http/workflow.d.ts.map +1 -0
  344. package/dist/src/http/workflow.js +181 -0
  345. package/dist/src/http/workflow.js.map +1 -0
  346. package/dist/src/index.d.ts +13 -0
  347. package/dist/src/index.d.ts.map +1 -0
  348. package/dist/src/index.js +25 -0
  349. package/dist/src/index.js.map +1 -0
  350. package/dist/src/services/cli/invoke.d.ts +5 -0
  351. package/dist/src/services/cli/invoke.d.ts.map +1 -0
  352. package/dist/src/services/cli/invoke.js +45 -0
  353. package/dist/src/services/cli/invoke.js.map +1 -0
  354. package/dist/src/services/cli/repl-context.d.ts +13 -0
  355. package/dist/src/services/cli/repl-context.d.ts.map +1 -0
  356. package/dist/src/services/cli/repl-context.js +60 -0
  357. package/dist/src/services/cli/repl-context.js.map +1 -0
  358. package/dist/src/services/cli/repl.d.ts +5 -0
  359. package/dist/src/services/cli/repl.d.ts.map +1 -0
  360. package/dist/src/services/cli/repl.js +32 -0
  361. package/dist/src/services/cli/repl.js.map +1 -0
  362. package/dist/src/services/cli.d.ts +12 -0
  363. package/dist/src/services/cli.d.ts.map +1 -0
  364. package/dist/src/services/cli.js +76 -0
  365. package/dist/src/services/cli.js.map +1 -0
  366. package/dist/src/services/index.d.ts +7 -0
  367. package/dist/src/services/index.d.ts.map +1 -0
  368. package/dist/src/services/index.js +10 -0
  369. package/dist/src/services/index.js.map +1 -0
  370. package/dist/src/services/leader.d.ts +32 -0
  371. package/dist/src/services/leader.d.ts.map +1 -0
  372. package/dist/src/services/leader.js +174 -0
  373. package/dist/src/services/leader.js.map +1 -0
  374. package/dist/src/services/logger.d.ts +35 -0
  375. package/dist/src/services/logger.d.ts.map +1 -0
  376. package/dist/src/services/logger.js +245 -0
  377. package/dist/src/services/logger.js.map +1 -0
  378. package/dist/src/services/mail/index.d.ts +61 -0
  379. package/dist/src/services/mail/index.d.ts.map +1 -0
  380. package/dist/src/services/mail/index.js +90 -0
  381. package/dist/src/services/mail/index.js.map +1 -0
  382. package/dist/src/services/mail/postmark.d.ts +11 -0
  383. package/dist/src/services/mail/postmark.d.ts.map +1 -0
  384. package/dist/src/services/mail/postmark.js +42 -0
  385. package/dist/src/services/mail/postmark.js.map +1 -0
  386. package/dist/src/services/mail/smtp.d.ts +11 -0
  387. package/dist/src/services/mail/smtp.d.ts.map +1 -0
  388. package/dist/src/services/mail/smtp.js +61 -0
  389. package/dist/src/services/mail/smtp.js.map +1 -0
  390. package/dist/src/services/mesh.d.ts +65 -0
  391. package/dist/src/services/mesh.d.ts.map +1 -0
  392. package/dist/src/services/mesh.js +422 -0
  393. package/dist/src/services/mesh.js.map +1 -0
  394. package/dist/src/services/worker/bootstrap.d.ts +3 -0
  395. package/dist/src/services/worker/bootstrap.d.ts.map +1 -0
  396. package/dist/src/services/worker/bootstrap.js +64 -0
  397. package/dist/src/services/worker/bootstrap.js.map +1 -0
  398. package/dist/src/services/worker/cli.d.ts +11 -0
  399. package/dist/src/services/worker/cli.d.ts.map +1 -0
  400. package/dist/src/services/worker/cli.js +43 -0
  401. package/dist/src/services/worker/cli.js.map +1 -0
  402. package/dist/src/services/worker/entity.d.ts +18 -0
  403. package/dist/src/services/worker/entity.d.ts.map +1 -0
  404. package/dist/src/services/worker/entity.js +16 -0
  405. package/dist/src/services/worker/entity.js.map +1 -0
  406. package/dist/src/services/worker/index.d.ts +9 -0
  407. package/dist/src/services/worker/index.d.ts.map +1 -0
  408. package/dist/src/services/worker/index.js +40 -0
  409. package/dist/src/services/worker/index.js.map +1 -0
  410. package/dist/src/services/worker/queue.d.ts +8 -0
  411. package/dist/src/services/worker/queue.d.ts.map +1 -0
  412. package/dist/src/services/worker/queue.js +32 -0
  413. package/dist/src/services/worker/queue.js.map +1 -0
  414. package/dist/src/services/worker/recorder.d.ts +16 -0
  415. package/dist/src/services/worker/recorder.d.ts.map +1 -0
  416. package/dist/src/services/worker/recorder.js +168 -0
  417. package/dist/src/services/worker/recorder.js.map +1 -0
  418. package/dist/src/services/worker/runner.d.ts +21 -0
  419. package/dist/src/services/worker/runner.d.ts.map +1 -0
  420. package/dist/src/services/worker/runner.js +156 -0
  421. package/dist/src/services/worker/runner.js.map +1 -0
  422. package/dist/src/services/worker/types.d.ts +26 -0
  423. package/dist/src/services/worker/types.d.ts.map +1 -0
  424. package/dist/src/services/worker/types.js +29 -0
  425. package/dist/src/services/worker/types.js.map +1 -0
  426. package/dist/src/srpc/SrpcByteStream.d.ts +67 -0
  427. package/dist/src/srpc/SrpcByteStream.d.ts.map +1 -0
  428. package/dist/src/srpc/SrpcByteStream.js +319 -0
  429. package/dist/src/srpc/SrpcByteStream.js.map +1 -0
  430. package/dist/src/srpc/SrpcClient.d.ts +75 -0
  431. package/dist/src/srpc/SrpcClient.d.ts.map +1 -0
  432. package/dist/src/srpc/SrpcClient.js +445 -0
  433. package/dist/src/srpc/SrpcClient.js.map +1 -0
  434. package/dist/src/srpc/SrpcServer.d.ts +80 -0
  435. package/dist/src/srpc/SrpcServer.d.ts.map +1 -0
  436. package/dist/src/srpc/SrpcServer.js +561 -0
  437. package/dist/src/srpc/SrpcServer.js.map +1 -0
  438. package/dist/src/srpc/index.d.ts +7 -0
  439. package/dist/src/srpc/index.d.ts.map +1 -0
  440. package/dist/src/srpc/index.js +12 -0
  441. package/dist/src/srpc/index.js.map +1 -0
  442. package/dist/src/srpc/types.d.ts +131 -0
  443. package/dist/src/srpc/types.d.ts.map +1 -0
  444. package/dist/src/srpc/types.js +65 -0
  445. package/dist/src/srpc/types.js.map +1 -0
  446. package/dist/src/telemetry/index.d.ts +2 -0
  447. package/dist/src/telemetry/index.d.ts.map +1 -0
  448. package/dist/src/telemetry/index.js +5 -0
  449. package/dist/src/telemetry/index.js.map +1 -0
  450. package/dist/src/telemetry/otel/MariaDBInstrumentation.d.ts +22 -0
  451. package/dist/src/telemetry/otel/MariaDBInstrumentation.d.ts.map +1 -0
  452. package/dist/src/telemetry/otel/MariaDBInstrumentation.js +248 -0
  453. package/dist/src/telemetry/otel/MariaDBInstrumentation.js.map +1 -0
  454. package/dist/src/telemetry/otel/helpers.d.ts +27 -0
  455. package/dist/src/telemetry/otel/helpers.d.ts.map +1 -0
  456. package/dist/src/telemetry/otel/helpers.js +126 -0
  457. package/dist/src/telemetry/otel/helpers.js.map +1 -0
  458. package/dist/src/telemetry/otel/index.d.ts +14 -0
  459. package/dist/src/telemetry/otel/index.d.ts.map +1 -0
  460. package/dist/src/telemetry/otel/index.js +132 -0
  461. package/dist/src/telemetry/otel/index.js.map +1 -0
  462. package/dist/src/telemetry/otel/metrics.controller.d.ts +6 -0
  463. package/dist/src/telemetry/otel/metrics.controller.d.ts.map +1 -0
  464. package/dist/src/telemetry/otel/metrics.controller.js +63 -0
  465. package/dist/src/telemetry/otel/metrics.controller.js.map +1 -0
  466. package/dist/src/telemetry/sentry.d.ts +9 -0
  467. package/dist/src/telemetry/sentry.d.ts.map +1 -0
  468. package/dist/src/telemetry/sentry.js +62 -0
  469. package/dist/src/telemetry/sentry.js.map +1 -0
  470. package/dist/src/testing/expect.d.ts +25 -0
  471. package/dist/src/testing/expect.d.ts.map +1 -0
  472. package/dist/src/testing/expect.js +151 -0
  473. package/dist/src/testing/expect.js.map +1 -0
  474. package/dist/src/testing/fixtures.d.ts +19 -0
  475. package/dist/src/testing/fixtures.d.ts.map +1 -0
  476. package/dist/src/testing/fixtures.js +69 -0
  477. package/dist/src/testing/fixtures.js.map +1 -0
  478. package/dist/src/testing/index.d.ts +260 -0
  479. package/dist/src/testing/index.d.ts.map +1 -0
  480. package/dist/src/testing/index.js +345 -0
  481. package/dist/src/testing/index.js.map +1 -0
  482. package/dist/src/testing/requests.d.ts +10 -0
  483. package/dist/src/testing/requests.d.ts.map +1 -0
  484. package/dist/src/testing/requests.js +56 -0
  485. package/dist/src/testing/requests.js.map +1 -0
  486. package/dist/src/testing/sql.d.ts +11 -0
  487. package/dist/src/testing/sql.d.ts.map +1 -0
  488. package/dist/src/testing/sql.js +55 -0
  489. package/dist/src/testing/sql.js.map +1 -0
  490. package/dist/src/types/index.d.ts +57 -0
  491. package/dist/src/types/index.d.ts.map +1 -0
  492. package/dist/src/types/index.js +73 -0
  493. package/dist/src/types/index.js.map +1 -0
  494. package/dist/src/types/phone.d.ts +11 -0
  495. package/dist/src/types/phone.d.ts.map +1 -0
  496. package/dist/src/types/phone.js +73 -0
  497. package/dist/src/types/phone.js.map +1 -0
  498. package/docs/.vitepress/config.mts +79 -0
  499. package/docs/.yarnrc.yml +1 -0
  500. package/docs/content/CONTRIBUTING.md +140 -0
  501. package/docs/content/README-DEV.md +142 -0
  502. package/docs/content/README.md +39 -0
  503. package/docs/content/authentication.md +215 -0
  504. package/docs/content/cli.md +335 -0
  505. package/docs/content/configuration.md +175 -0
  506. package/docs/content/database.md +422 -0
  507. package/docs/content/devconsole.md +123 -0
  508. package/docs/content/getting-started.md +154 -0
  509. package/docs/content/guides/test-migration-guide.md +351 -0
  510. package/docs/content/health.md +54 -0
  511. package/docs/content/helpers.md +322 -0
  512. package/docs/content/http.md +253 -0
  513. package/docs/content/index.md +147 -0
  514. package/docs/content/leader-service.md +98 -0
  515. package/docs/content/logging.md +150 -0
  516. package/docs/content/mail.md +161 -0
  517. package/docs/content/mesh-service.md +204 -0
  518. package/docs/content/public/images/devconsole/01-dashboard.png +0 -0
  519. package/docs/content/public/images/devconsole/02-routes.png +0 -0
  520. package/docs/content/public/images/devconsole/03-openapi.png +0 -0
  521. package/docs/content/public/images/devconsole/04-requests.png +0 -0
  522. package/docs/content/public/images/devconsole/05-srpc.png +0 -0
  523. package/docs/content/public/images/devconsole/06-database.png +0 -0
  524. package/docs/content/public/images/devconsole/07-health.png +0 -0
  525. package/docs/content/public/images/devconsole/08-mutex.png +0 -0
  526. package/docs/content/public/images/devconsole/09-repl.png +0 -0
  527. package/docs/content/public/images/devconsole/10-workers.png +0 -0
  528. package/docs/content/redis.md +168 -0
  529. package/docs/content/srpc.md +261 -0
  530. package/docs/content/telemetry.md +166 -0
  531. package/docs/content/testing.md +222 -0
  532. package/docs/content/types.md +215 -0
  533. package/docs/content/worker.md +177 -0
  534. package/docs/package.json +16 -0
  535. package/docs/scripts/README-SCREENSHOTS.md +145 -0
  536. package/docs/scripts/capture-devconsole-screenshots.js +184 -0
  537. package/docs/yarn.lock +2408 -0
  538. package/package.json +144 -0
  539. package/patches/@deepkit+type+1.0.19.patch +38 -0
  540. package/patches/deepkit-openapi-core+0.0.9.patch +62 -0
  541. package/src/app/base.ts +253 -0
  542. package/src/app/config.loader.ts +66 -0
  543. package/src/app/config.ts +119 -0
  544. package/src/app/const.ts +4 -0
  545. package/src/app/dev.ts +92 -0
  546. package/src/app/index.ts +6 -0
  547. package/src/app/openapi.ts +3 -0
  548. package/src/app/resolver.ts +49 -0
  549. package/src/app/shutdown.ts +55 -0
  550. package/src/app/state.ts +19 -0
  551. package/src/auth/index.ts +2 -0
  552. package/src/auth/jwt.ts +275 -0
  553. package/src/auth/provider.ts +57 -0
  554. package/src/cli/dksf-dev.ts +416 -0
  555. package/src/cli/dksf-gen-proto.ts +176 -0
  556. package/src/cli/dksf-install.ts +11 -0
  557. package/src/cli/dksf-test.ts +84 -0
  558. package/src/cli/dksf-update.ts +101 -0
  559. package/src/database/common.ts +385 -0
  560. package/src/database/dialect.ts +43 -0
  561. package/src/database/entity.ts +285 -0
  562. package/src/database/index.ts +7 -0
  563. package/src/database/migration/MigrationResetCommand.ts +72 -0
  564. package/src/database/migration/MigrationRunCommand.ts +118 -0
  565. package/src/database/migration/characters.ts +53 -0
  566. package/src/database/migration/create/MigrationCreateCommand.ts +96 -0
  567. package/src/database/migration/create/comparator.ts +467 -0
  568. package/src/database/migration/create/db-reader.ts +510 -0
  569. package/src/database/migration/create/ddl-generator.ts +755 -0
  570. package/src/database/migration/create/entity-reader.ts +471 -0
  571. package/src/database/migration/create/file-generator.ts +57 -0
  572. package/src/database/migration/create/prompt.ts +49 -0
  573. package/src/database/migration/create/schema-model.ts +102 -0
  574. package/src/database/migration/helpers.ts +7 -0
  575. package/src/database/migration/index.ts +35 -0
  576. package/src/database/migration/migration.entity.ts +10 -0
  577. package/src/database/mysql.ts +140 -0
  578. package/src/database/postgres.ts +97 -0
  579. package/src/database/types.ts +18 -0
  580. package/src/devconsole/devconsole.controller.ts +59 -0
  581. package/src/devconsole/devconsole.middleware.ts +23 -0
  582. package/src/devconsole/devconsole.srpc.ts +94 -0
  583. package/src/devconsole/devconsole.store.ts +190 -0
  584. package/src/devconsole/devconsole.ws.ts +491 -0
  585. package/src/devconsole/index.ts +1 -0
  586. package/src/devconsole/patches.ts +428 -0
  587. package/src/health/health.module.ts +30 -0
  588. package/src/health/healthcheck.controller.ts +17 -0
  589. package/src/health/healthcheck.service.ts +28 -0
  590. package/src/health/index.ts +2 -0
  591. package/src/helpers/async/context.ts +67 -0
  592. package/src/helpers/async/process.ts +49 -0
  593. package/src/helpers/async/promise.ts +16 -0
  594. package/src/helpers/data/array.ts +11 -0
  595. package/src/helpers/data/objects.ts +64 -0
  596. package/src/helpers/data/serialization.ts +11 -0
  597. package/src/helpers/data/transformer.ts +54 -0
  598. package/src/helpers/framework/decorators.ts +27 -0
  599. package/src/helpers/framework/event.ts +11 -0
  600. package/src/helpers/framework/injection.ts +47 -0
  601. package/src/helpers/index.ts +34 -0
  602. package/src/helpers/io/package.ts +26 -0
  603. package/src/helpers/io/stream.ts +79 -0
  604. package/src/helpers/redis/broadcast.ts +96 -0
  605. package/src/helpers/redis/cache.ts +28 -0
  606. package/src/helpers/redis/mutex.ts +260 -0
  607. package/src/helpers/redis/redis.ts +60 -0
  608. package/src/helpers/security/crypto.ts +133 -0
  609. package/src/helpers/security/validation.ts +16 -0
  610. package/src/helpers/utils/date.ts +13 -0
  611. package/src/helpers/utils/error.ts +155 -0
  612. package/src/helpers/utils/jsx.ts +8 -0
  613. package/src/helpers/utils/uuid.ts +8 -0
  614. package/src/http/auth.ts +156 -0
  615. package/src/http/context.ts +15 -0
  616. package/src/http/cors.ts +159 -0
  617. package/src/http/errors.ts +9 -0
  618. package/src/http/index.ts +19 -0
  619. package/src/http/kernel.ts +138 -0
  620. package/src/http/middleware.ts +59 -0
  621. package/src/http/overrides.ts +20 -0
  622. package/src/http/store.ts +86 -0
  623. package/src/http/uploads.ts +6 -0
  624. package/src/http/workflow.ts +167 -0
  625. package/src/index.ts +19 -0
  626. package/src/services/cli/invoke.ts +39 -0
  627. package/src/services/cli/repl-context.ts +63 -0
  628. package/src/services/cli/repl.ts +22 -0
  629. package/src/services/cli.ts +74 -0
  630. package/src/services/index.ts +6 -0
  631. package/src/services/leader.ts +201 -0
  632. package/src/services/logger.ts +258 -0
  633. package/src/services/mail/index.ts +117 -0
  634. package/src/services/mail/postmark.ts +37 -0
  635. package/src/services/mail/smtp.ts +46 -0
  636. package/src/services/mesh.ts +508 -0
  637. package/src/services/worker/bootstrap.ts +53 -0
  638. package/src/services/worker/cli.ts +32 -0
  639. package/src/services/worker/entity.ts +22 -0
  640. package/src/services/worker/index.ts +30 -0
  641. package/src/services/worker/queue.ts +35 -0
  642. package/src/services/worker/recorder.ts +172 -0
  643. package/src/services/worker/runner.ts +179 -0
  644. package/src/services/worker/types.ts +32 -0
  645. package/src/srpc/SrpcByteStream.ts +382 -0
  646. package/src/srpc/SrpcClient.ts +512 -0
  647. package/src/srpc/SrpcServer.ts +681 -0
  648. package/src/srpc/index.ts +15 -0
  649. package/src/srpc/types.ts +146 -0
  650. package/src/telemetry/index.ts +1 -0
  651. package/src/telemetry/otel/MariaDBInstrumentation.ts +297 -0
  652. package/src/telemetry/otel/helpers.ts +117 -0
  653. package/src/telemetry/otel/index.ts +150 -0
  654. package/src/telemetry/otel/metrics.controller.ts +50 -0
  655. package/src/telemetry/sentry.ts +58 -0
  656. package/src/testing/expect.ts +148 -0
  657. package/src/testing/fixtures.ts +62 -0
  658. package/src/testing/index.ts +355 -0
  659. package/src/testing/requests.ts +68 -0
  660. package/src/testing/sql.ts +50 -0
  661. package/src/types/index.ts +64 -0
  662. package/src/types/phone.ts +64 -0
  663. package/types.d.ts +20 -0
@@ -0,0 +1,285 @@
1
+ import { getClassTypeFromInstance } from '@deepkit/core';
2
+ import {
3
+ ActiveRecord,
4
+ ActiveRecordClassType,
5
+ Database,
6
+ DatabaseAdapter,
7
+ DatabaseSession,
8
+ FilterQuery,
9
+ getClassState,
10
+ getInstanceState,
11
+ getInstanceStateFromItem
12
+ } from '@deepkit/orm';
13
+ import { SQLDatabaseAdapter } from '@deepkit/sql';
14
+ import { ReflectionClass } from '@deepkit/type';
15
+ import { compact, groupBy, keyBy, uniq } from 'lodash';
16
+
17
+ import { EntityClassFields, EntityFields, getPKFieldForEntity, getPKFieldForEntityInstance } from './common';
18
+
19
+ export function getDirtyDetails<T extends ActiveRecord, K extends keyof T>(entity: T): Record<K, { original: T[K]; current: T[K] }> {
20
+ const classState = getClassState(ReflectionClass.from(getClassTypeFromInstance(entity)));
21
+ const instanceState = getInstanceState(classState, entity);
22
+ const lastSnapshot = instanceState.getSnapshot();
23
+ const currentSnapshot = classState.snapshot(entity);
24
+ const changeSet = classState.changeDetector(lastSnapshot, currentSnapshot, entity);
25
+ const changedFields = Object.keys(changeSet?.$set || {});
26
+ return Object.fromEntries(
27
+ changedFields.map(f => [
28
+ f,
29
+ {
30
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
31
+ original: (lastSnapshot as any)[f],
32
+ current: currentSnapshot[f]
33
+ }
34
+ ])
35
+ ) as Record<K, { original: T[K]; current: T[K] }>;
36
+ }
37
+
38
+ export function revertDirtyEntity(entity: ActiveRecord) {
39
+ const original = getEntityOriginal(entity);
40
+ for (const [field, value] of Object.entries(original)) {
41
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
42
+ (entity as any)[field] = value;
43
+ }
44
+ }
45
+
46
+ export function getDirtyFields<T extends ActiveRecord>(entity: T): (keyof T)[] {
47
+ return Object.keys(getDirtyDetails(entity)) as (keyof T)[];
48
+ }
49
+
50
+ export function isEntityDirty(entity: ActiveRecord) {
51
+ return getDirtyFields(entity).length > 0;
52
+ }
53
+
54
+ export function isFieldDirty<T extends ActiveRecord>(entity: T, field: keyof T) {
55
+ return getDirtyFields(entity).includes(field);
56
+ }
57
+
58
+ export function getFieldOriginal<T extends ActiveRecord, K extends keyof T>(entity: T, field: K): T[K] | undefined {
59
+ const dirtyDetails = getDirtyDetails(entity);
60
+ const fieldDetails = dirtyDetails[field] as { original: T[K]; current: T[K] } | undefined;
61
+ return fieldDetails?.original;
62
+ }
63
+
64
+ export function getEntityOriginal<T extends ActiveRecord>(entity: T): EntityFields<T> {
65
+ return getInstanceStateFromItem(entity).getSnapshot() as EntityFields<T>;
66
+ }
67
+
68
+ export class BaseEntity extends ActiveRecord {}
69
+
70
+ export type EntityPick<T extends ActiveRecord, K extends keyof EntityFields<T>> = ActiveRecord & Pick<T, K>;
71
+
72
+ interface IGetEntityOptions<Schema extends ActiveRecordClassType, Field extends keyof EntityClassFields<Schema>> {
73
+ schema: Schema;
74
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
75
+ ids: any[];
76
+ keyField?: Field;
77
+ fields?: Field[];
78
+ filter?: FilterQuery<InstanceType<Schema>>;
79
+ txn?: DatabaseSession<DatabaseAdapter>;
80
+ }
81
+
82
+ export async function getKeyedEntities<Schema extends ActiveRecordClassType, Fields extends keyof EntityClassFields<Schema>>(
83
+ options: IGetEntityOptions<Schema, Fields>
84
+ ) {
85
+ const { keyField, entities } = await getEntitiesByIdWithKeyName(options);
86
+ return keyBy(entities, keyField);
87
+ }
88
+
89
+ export async function getKeyedGroupedEntities<Schema extends ActiveRecordClassType, Fields extends keyof EntityClassFields<Schema>>(
90
+ options: IGetEntityOptions<Schema, Fields>
91
+ ) {
92
+ const { keyField, entities } = await getEntitiesByIdWithKeyName(options);
93
+ return groupBy(entities, keyField);
94
+ }
95
+
96
+ export async function getEntitiesById<Schema extends ActiveRecordClassType, Fields extends keyof EntityClassFields<Schema>>(
97
+ options: IGetEntityOptions<Schema, Fields>
98
+ ) {
99
+ const { entities } = await getEntitiesByIdWithKeyName(options);
100
+ return entities;
101
+ }
102
+
103
+ export async function getEntitiesByIdWithKeyName<Schema extends ActiveRecordClassType, Fields extends keyof EntityClassFields<Schema>>({
104
+ schema,
105
+ ids,
106
+ keyField,
107
+ fields,
108
+ filter,
109
+ txn
110
+ }: IGetEntityOptions<Schema, Fields>) {
111
+ type ReturnType = typeof fields extends undefined ? InstanceType<Schema> : EntityPick<InstanceType<Schema>, Fields>;
112
+
113
+ const db: Database<SQLDatabaseAdapter> = schema.getDatabase();
114
+ const resolvedKeyField = keyField ?? getPKFieldForEntity(schema);
115
+
116
+ ids = uniq(compact(ids));
117
+ if (!ids.length) {
118
+ return {
119
+ keyField: resolvedKeyField,
120
+ entities: [] as ReturnType[]
121
+ };
122
+ }
123
+
124
+ const query = txn ? txn.query(schema) : db.query(schema);
125
+
126
+ const entities = fields
127
+ ? await query
128
+ .filter({ [resolvedKeyField]: { $in: ids }, ...filter })
129
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
130
+ .select(...(fields as any))
131
+ .find()
132
+ : await query.filter({ [resolvedKeyField]: { $in: ids }, ...filter }).find();
133
+
134
+ return {
135
+ keyField: resolvedKeyField,
136
+ entities: entities as ReturnType[]
137
+ };
138
+ }
139
+
140
+ interface IResolveRelatedOptions<
141
+ Schema extends ActiveRecord,
142
+ IdKey extends keyof EntityFields<Schema>,
143
+ RelatedSchema extends ActiveRecordClassType,
144
+ RelatedKey extends string,
145
+ RelatedFields extends keyof EntityClassFields<RelatedSchema>
146
+ > {
147
+ src: Schema[];
148
+ srcIdField: IdKey;
149
+ targetField: RelatedKey;
150
+ targetSchema: RelatedSchema;
151
+ targetFields?: RelatedFields[];
152
+ txn?: DatabaseSession<DatabaseAdapter>;
153
+ }
154
+
155
+ export async function resolveRelated<
156
+ Schema extends ActiveRecord,
157
+ IdKey extends keyof EntityFields<Schema>,
158
+ RelatedSchema extends ActiveRecordClassType,
159
+ RelatedKey extends string,
160
+ RelatedFields extends keyof EntityClassFields<RelatedSchema>
161
+ >(options: IResolveRelatedOptions<Schema, IdKey, RelatedSchema, RelatedKey, RelatedFields>) {
162
+ const { src, srcIdField, targetField, targetSchema, targetFields } = options;
163
+
164
+ type RelatedType = typeof targetFields extends undefined ? InstanceType<RelatedSchema> : EntityPick<InstanceType<RelatedSchema>, RelatedFields>;
165
+ type RelatedFieldType = null extends Schema[IdKey] ? { [K in RelatedKey]?: RelatedType } : { [K in RelatedKey]: RelatedType };
166
+ type ReturnType = Omit<Schema, IdKey> & RelatedFieldType;
167
+
168
+ if (!src.length) {
169
+ return [] as ReturnType[];
170
+ }
171
+
172
+ const subentitiesById = await getKeyedEntities({
173
+ ids: src.map(e => e[srcIdField]),
174
+ schema: targetSchema,
175
+ fields: targetFields,
176
+ txn: options.txn
177
+ });
178
+
179
+ src.forEach(e => {
180
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
181
+ (e as any)[targetField] = subentitiesById[e[srcIdField] as any];
182
+ });
183
+
184
+ return src as ReturnType[];
185
+ }
186
+
187
+ interface IResolveRelatedByPivotOptions<
188
+ Schema extends object,
189
+ SrcIdField extends keyof EntityFields<Schema>,
190
+ PivotSchema extends ActiveRecordClassType,
191
+ PivotIdKey extends keyof EntityClassFields<PivotSchema>,
192
+ PivotRelatedKey extends keyof EntityClassFields<PivotSchema>,
193
+ RelatedSchema extends ActiveRecordClassType,
194
+ RelatedKey extends string,
195
+ RelatedFields extends keyof EntityClassFields<RelatedSchema>
196
+ > {
197
+ src: Schema[];
198
+ srcIdField?: SrcIdField;
199
+ pivotSchema: PivotSchema;
200
+ pivotIdKey: PivotIdKey;
201
+ pivotRelatedKey: PivotRelatedKey;
202
+ pivotFilter?: FilterQuery<InstanceType<PivotSchema>>;
203
+ targetField: RelatedKey;
204
+ targetSchema: RelatedSchema;
205
+ targetFields?: RelatedFields[];
206
+ txn?: DatabaseSession<DatabaseAdapter>;
207
+ }
208
+
209
+ export async function resolveRelatedByPivot<
210
+ Schema extends object,
211
+ SrcIdField extends keyof EntityFields<Schema>,
212
+ PivotSchema extends ActiveRecordClassType,
213
+ PivotIdKey extends keyof EntityClassFields<PivotSchema>,
214
+ PivotRelatedKey extends keyof EntityClassFields<PivotSchema>,
215
+ RelatedSchema extends ActiveRecordClassType,
216
+ RelatedKey extends string,
217
+ RelatedFields extends keyof EntityClassFields<RelatedSchema>
218
+ >(options: IResolveRelatedByPivotOptions<Schema, SrcIdField, PivotSchema, PivotIdKey, PivotRelatedKey, RelatedSchema, RelatedKey, RelatedFields>) {
219
+ const { src, srcIdField, pivotSchema, pivotIdKey, pivotRelatedKey, pivotFilter, targetField, targetSchema, targetFields } = options;
220
+
221
+ type RelatedType = typeof targetFields extends undefined ? InstanceType<RelatedSchema> : EntityPick<InstanceType<RelatedSchema>, RelatedFields>;
222
+ type RelatedTypeWithPivot = RelatedType & { pivot: InstanceType<PivotSchema> };
223
+ type RelatedFieldType = { [K in RelatedKey]: RelatedTypeWithPivot[] };
224
+ type ReturnType = Schema & RelatedFieldType;
225
+
226
+ if (!src.length) {
227
+ return [] as ReturnType[];
228
+ }
229
+
230
+ const sourcePkField = srcIdField ?? getPKFieldForEntityInstance(src[0]);
231
+ const pivotEntitiesBySourceId = await getKeyedGroupedEntities({
232
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
233
+ ids: src.map(e => (e as any)[sourcePkField as any]),
234
+ schema: pivotSchema,
235
+ keyField: pivotIdKey,
236
+ filter: pivotFilter,
237
+ txn: options.txn
238
+ });
239
+
240
+ const relatedEntitiesById = await getKeyedEntities({
241
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
242
+ ids: Object.values(pivotEntitiesBySourceId).flatMap(p => p.map(p => (p as any)[pivotRelatedKey])),
243
+ schema: targetSchema,
244
+ fields: targetFields,
245
+ txn: options.txn
246
+ });
247
+
248
+ src.forEach(e => {
249
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
250
+ (e as any)[targetField] =
251
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
252
+ pivotEntitiesBySourceId[(e as any)[sourcePkField as any]]?.map(p => ({
253
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
254
+ ...relatedEntitiesById[(p as any)[pivotRelatedKey]],
255
+ pivot: p
256
+ })) ?? [];
257
+ });
258
+
259
+ return src as ReturnType[];
260
+ }
261
+
262
+ export async function resolveRelatedByPivotForOne<
263
+ Schema extends object,
264
+ SrcIdField extends keyof EntityFields<Schema>,
265
+ PivotSchema extends ActiveRecordClassType,
266
+ PivotIdKey extends keyof EntityClassFields<PivotSchema>,
267
+ PivotRelatedKey extends keyof EntityClassFields<PivotSchema>,
268
+ RelatedSchema extends ActiveRecordClassType,
269
+ RelatedKey extends string,
270
+ RelatedFields extends keyof EntityClassFields<RelatedSchema>
271
+ >(
272
+ options: Omit<
273
+ IResolveRelatedByPivotOptions<Schema, SrcIdField, PivotSchema, PivotIdKey, PivotRelatedKey, RelatedSchema, RelatedKey, RelatedFields>,
274
+ 'src'
275
+ > & {
276
+ src: Schema;
277
+ }
278
+ ) {
279
+ return (
280
+ await resolveRelatedByPivot({
281
+ ...options,
282
+ src: [options.src]
283
+ })
284
+ )[0];
285
+ }
@@ -0,0 +1,7 @@
1
+ export * from './common';
2
+ export * from './dialect';
3
+ export * from './entity';
4
+ export { createMigration, runMigrations, standardizeDbCollation } from './migration';
5
+ export * from './mysql';
6
+ export * from './postgres';
7
+ export * from './types';
@@ -0,0 +1,72 @@
1
+ import { cli } from '@deepkit/app';
2
+ import { SQLDatabaseAdapter } from '@deepkit/sql';
3
+ import { existsSync, mkdirSync, readdirSync, unlinkSync, writeFileSync } from 'fs';
4
+ import path from 'path';
5
+
6
+ import { DBProvider } from '../../app/state';
7
+ import { getAppConfig } from '../../app/resolver';
8
+ import { createLogger } from '../../services';
9
+ import { getDialect } from '../dialect';
10
+ import { getSourceMigrationsDir } from './helpers';
11
+ import { readEntitiesSchema } from './create/entity-reader';
12
+ import { generateDDL } from './create/ddl-generator';
13
+ import { buildFileContent } from './create/file-generator';
14
+ import { SchemaDiff } from './create/schema-model';
15
+
16
+ @cli.controller('migration:reset')
17
+ export class MigrationResetCommand {
18
+ private logger = createLogger('MigrationReset');
19
+ private migrationsDir = getSourceMigrationsDir();
20
+
21
+ constructor(private dbProvider: DBProvider) {}
22
+
23
+ async execute() {
24
+ // Step 1: Ensure migrations directory exists
25
+ if (!existsSync(this.migrationsDir)) {
26
+ this.logger.info(`Creating migrations directory: ${this.migrationsDir}`);
27
+ mkdirSync(this.migrationsDir, { recursive: true });
28
+ }
29
+
30
+ // Step 2: Remove all .ts files from migrations directory
31
+ const files = readdirSync(this.migrationsDir).filter(f => f.endsWith('.ts'));
32
+ this.logger.info(`Removing ${files.length} migration file(s)`);
33
+ for (const file of files) {
34
+ const filePath = path.join(this.migrationsDir, file);
35
+ unlinkSync(filePath);
36
+ this.logger.info(`Removed ${file}`);
37
+ }
38
+
39
+ // Step 3: Read entity schema from code definitions
40
+ const db = this.dbProvider.db;
41
+ const dialect = getDialect(db.adapter as SQLDatabaseAdapter);
42
+ const pgSchema = dialect === 'postgres' ? (getAppConfig().PG_SCHEMA ?? 'public') : 'public';
43
+
44
+ this.logger.info('Reading entity definitions...');
45
+ const entitySchema = readEntitiesSchema(db, dialect);
46
+ const tables = Array.from(entitySchema.values());
47
+ this.logger.info(`Found ${tables.length} entity table(s)`);
48
+
49
+ // Step 4: Generate DDL by treating all entity tables as "added"
50
+ const diff: SchemaDiff = {
51
+ dialect,
52
+ pgSchema: dialect === 'postgres' ? pgSchema : undefined,
53
+ addedTables: tables,
54
+ removedTables: [],
55
+ modifiedTables: []
56
+ };
57
+ const statements = generateDDL(diff);
58
+
59
+ if (statements.length === 0) {
60
+ this.logger.info('No tables found to generate base migration.');
61
+ return;
62
+ }
63
+
64
+ // Step 6: Write migration file
65
+ const migrationContent = buildFileContent(statements);
66
+ const migrationPath = path.join(this.migrationsDir, '00000000_000000_base.ts');
67
+
68
+ writeFileSync(migrationPath, migrationContent, 'utf8');
69
+ this.logger.info(`Created initial migration: ${migrationPath}`);
70
+ this.logger.info(`Migration reset complete with ${tables.length} table(s)`);
71
+ }
72
+ }
@@ -0,0 +1,118 @@
1
+ import { cli } from '@deepkit/app';
2
+ import { SQLDatabaseAdapter } from '@deepkit/sql';
3
+ import { existsSync, readdirSync } from 'fs';
4
+ import { difference } from 'lodash';
5
+ import path from 'path';
6
+
7
+ import { DBProvider, globalState } from '../../app/state';
8
+ import { createLogger } from '../../services';
9
+ import { WorkerQueueRegistry } from '../../services/worker/queue';
10
+ import { createPersistedEntity } from '../common';
11
+ import { getDialect, tableExistsSql } from '../dialect';
12
+ import { getMigrationsDir } from './helpers';
13
+ import { MigrationEntity } from './migration.entity';
14
+
15
+ @cli.controller('migration:run')
16
+ export class MigrationRunCommand {
17
+ private logger = createLogger('Migrator');
18
+ private migrationsDir = getMigrationsDir();
19
+
20
+ constructor(private dbProvider: DBProvider) {}
21
+
22
+ async execute() {
23
+ if (!existsSync(this.migrationsDir)) {
24
+ throw new Error('Migrations directory does not exist');
25
+ }
26
+
27
+ const migrations = readdirSync(this.migrationsDir)
28
+ .filter(f => /\.[jt]s$/.test(f))
29
+ .map(f => f.replace(/\.[jt]s$/, ''));
30
+ migrations.sort();
31
+ this.logger.info(`${migrations.length} migrations found in package`);
32
+
33
+ await this.createMigrationsTableIfNotExists();
34
+
35
+ this.dbProvider.db.registerEntity(MigrationEntity);
36
+
37
+ const executedMigrations = await MigrationEntity.query().select('name').findField('name');
38
+ const unexecutedMigrations = difference(migrations, executedMigrations);
39
+ this.logger.info(`${executedMigrations.length} migrations previously executed`);
40
+ this.logger.info(`${unexecutedMigrations.length} migrations to run`);
41
+
42
+ const executedAt = new Date();
43
+
44
+ for (const migration of unexecutedMigrations) {
45
+ const startTs = Date.now();
46
+ this.logger.info(`Running migration: ${migration}`);
47
+
48
+ await this.runCodeMigration(migration);
49
+
50
+ this.logger.info(`Completed migration: ${migration}`);
51
+ await createPersistedEntity(MigrationEntity, {
52
+ executedAt,
53
+ name: migration,
54
+ durationMs: Date.now() - startTs
55
+ });
56
+ }
57
+
58
+ // this may seem out of place but it makes sense to do during a migration, since
59
+ // the application is about to start and will re-register all jobs with the new schedule
60
+ if (globalState.enableWorker) {
61
+ const queue = WorkerQueueRegistry.getDefaultQueue();
62
+ const repeatableJobs = await queue.getRepeatableJobs();
63
+ for (const job of repeatableJobs) {
64
+ this.logger.info('Removing repeatable job', { job: { name: job.name, key: job.key } });
65
+ await queue.removeRepeatableByKey(job.key);
66
+ }
67
+ await WorkerQueueRegistry.closeQueues();
68
+ }
69
+ }
70
+
71
+ async createMigrationsTableIfNotExists() {
72
+ const dialect = getDialect(this.dbProvider.db.adapter as SQLDatabaseAdapter);
73
+ const tableInfoRows = await this.dbProvider.db.rawQuery(tableExistsSql(dialect, '_migrations'));
74
+ if (tableInfoRows.length) return;
75
+
76
+ if (dialect === 'postgres') {
77
+ await this.dbProvider.db.rawQuery(`
78
+ CREATE TABLE "_migrations" (
79
+ "name" varchar(255) NOT NULL PRIMARY KEY,
80
+ "executedAt" timestamp NOT NULL,
81
+ "durationMs" integer NOT NULL
82
+ )
83
+ `);
84
+ } else {
85
+ await this.dbProvider.db.rawQuery(`
86
+ CREATE TABLE _migrations (
87
+ name varchar(255) NOT NULL,
88
+ executedAt datetime NOT NULL,
89
+ durationMs int unsigned NOT NULL,
90
+ PRIMARY KEY (name)
91
+ ) ENGINE=InnoDB
92
+ `);
93
+ }
94
+ }
95
+
96
+ async runCodeMigration(file: string) {
97
+ let migrationModule;
98
+
99
+ try {
100
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
101
+ migrationModule = require(path.join(process.cwd(), this.migrationsDir, file));
102
+ } catch (err) {
103
+ this.logger.error('Failed to load migration', { file });
104
+ throw err;
105
+ }
106
+
107
+ if (!('default' in migrationModule) || typeof migrationModule.default !== 'function') {
108
+ throw new Error(`Migration ${file} does not export a function`);
109
+ }
110
+
111
+ try {
112
+ await migrationModule.default(this.dbProvider.db);
113
+ } catch (err) {
114
+ this.logger.error('Migration function failed to execute', err, { file });
115
+ throw err;
116
+ }
117
+ }
118
+ }
@@ -0,0 +1,53 @@
1
+ import { cli } from '@deepkit/app';
2
+ import { SQLDatabaseAdapter } from '@deepkit/sql';
3
+
4
+ import { DBProvider } from '../../app/state';
5
+ import { BaseDatabase } from '../common';
6
+ import { getDialect } from '../dialect';
7
+
8
+ interface ICollationOptions {
9
+ charset?: string;
10
+ collation?: string;
11
+ }
12
+
13
+ const DEFAULT_CHARSET = 'utf8mb4';
14
+ const DEFAULT_COLLATION = 'utf8mb4_0900_ai_ci';
15
+
16
+ export async function standardizeDbCollation(db: BaseDatabase, options?: ICollationOptions) {
17
+ const dialect = getDialect(db.adapter as SQLDatabaseAdapter);
18
+ if (dialect === 'postgres') {
19
+ console.warn('standardizeDbCollation is not applicable to PostgreSQL — skipping');
20
+ return;
21
+ }
22
+
23
+ const charset = options?.charset ?? DEFAULT_CHARSET;
24
+ const collation = options?.collation ?? DEFAULT_COLLATION;
25
+
26
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
27
+ const dbNameResult: any[] = await db.rawQuery('SELECT DATABASE()');
28
+ const dbName = Object.values(dbNameResult[0])[0];
29
+
30
+ await db.rawQuery(`ALTER DATABASE ${dbName} CHARACTER SET = ${charset} COLLATE = ${collation}`);
31
+
32
+ const tablesResult = await db.rawQuery('SHOW TABLES');
33
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
34
+ const tables = tablesResult.map((row: any) => Object.values(row)[0]);
35
+
36
+ for (const table of tables) {
37
+ await db.rawQuery(`ALTER TABLE ${table} CONVERT TO CHARACTER SET ${charset} COLLATE ${collation}`);
38
+ }
39
+ }
40
+
41
+ @cli.controller('migration:characters')
42
+ export class MigrationCharactersCommand {
43
+ constructor(private dbProvider: DBProvider) {}
44
+
45
+ async execute(charset: string = DEFAULT_CHARSET, collation: string = DEFAULT_COLLATION) {
46
+ const dialect = getDialect(this.dbProvider.db.adapter as SQLDatabaseAdapter);
47
+ if (dialect === 'postgres') {
48
+ console.warn('Character set standardization is not applicable to PostgreSQL');
49
+ return;
50
+ }
51
+ await standardizeDbCollation(this.dbProvider.db, { charset, collation });
52
+ }
53
+ }
@@ -0,0 +1,96 @@
1
+ import { cli, Flag } from '@deepkit/app';
2
+ import { SQLDatabaseAdapter } from '@deepkit/sql';
3
+
4
+ import { DBProvider } from '../../../app/state';
5
+ import { getAppConfig } from '../../../app/resolver';
6
+ import { createLogger, pinoLogger } from '../../../services';
7
+ import { getDialect } from '../../dialect';
8
+ import { readEntitiesSchema } from './entity-reader';
9
+ import { readAllTableNames, readDatabaseSchema } from './db-reader';
10
+ import { compareSchemas } from './comparator';
11
+ import { generateDDL } from './ddl-generator';
12
+ import { generateMigrationFile } from './file-generator';
13
+ import { promptMigrationDescription, setNonInteractive } from './prompt';
14
+ import { INTERNAL_TABLES } from './schema-model';
15
+
16
+ @cli.controller('migration:create')
17
+ export class MigrationCreateCommand {
18
+ private logger = createLogger('MigrationCreate');
19
+
20
+ constructor(private dbProvider: DBProvider) {}
21
+
22
+ async execute(nonInteractive: boolean & Flag<{ description: 'Skip interactive prompts' }> = false) {
23
+ if (nonInteractive) {
24
+ setNonInteractive(true);
25
+ }
26
+
27
+ try {
28
+ const db = this.dbProvider.db;
29
+ const dialect = getDialect(db.adapter as SQLDatabaseAdapter);
30
+ const pgSchema = dialect === 'postgres' ? (getAppConfig().PG_SCHEMA ?? 'public') : 'public';
31
+
32
+ this.logger.info(`Dialect: ${dialect}`);
33
+
34
+ // Step 1: Read entity schema
35
+ this.logger.info('Reading entity definitions...');
36
+ const entitySchema = readEntitiesSchema(db, dialect);
37
+ const entityTableNames = Array.from(entitySchema.keys());
38
+ this.logger.info(`Found ${entityTableNames.length} entity table(s): ${entityTableNames.join(', ')}`);
39
+
40
+ // Step 2: Discover all DB tables and union with entity table names
41
+ const allDbTableNames = await readAllTableNames(db, dialect, pgSchema);
42
+ const dbOnlyTables = allDbTableNames.filter(n => !entitySchema.has(n) && !INTERNAL_TABLES.has(n));
43
+ const tableNames = [...entityTableNames, ...dbOnlyTables];
44
+
45
+ // Step 3: Read database schema
46
+ this.logger.info('Reading database schema...');
47
+ const dbSchema = await readDatabaseSchema(db, dialect, tableNames, pgSchema);
48
+
49
+ // Step 4: Compare schemas
50
+ this.logger.info('Comparing schemas...');
51
+ const diff = await compareSchemas(entitySchema, dbSchema, dialect, !nonInteractive, pgSchema);
52
+
53
+ // Step 5: Generate DDL
54
+ const statements = generateDDL(diff);
55
+
56
+ if (statements.length === 0) {
57
+ this.logger.info('No schema changes detected.');
58
+ return;
59
+ }
60
+
61
+ // Step 6: Show summary
62
+ this.logger.info(`\nChanges detected:`);
63
+ if (diff.addedTables.length > 0) {
64
+ this.logger.info(` Added tables: ${diff.addedTables.map(t => t.name).join(', ')}`);
65
+ }
66
+ if (diff.removedTables.length > 0) {
67
+ this.logger.info(` Removed tables: ${diff.removedTables.map(t => t.name).join(', ')}`);
68
+ }
69
+ for (const table of diff.modifiedTables) {
70
+ const changes: string[] = [];
71
+ if (table.addedColumns.length > 0) changes.push(`+${table.addedColumns.length} cols`);
72
+ if (table.removedColumns.length > 0) changes.push(`-${table.removedColumns.length} cols`);
73
+ if (table.modifiedColumns.length > 0) changes.push(`~${table.modifiedColumns.length} cols`);
74
+ if (table.renamedColumns.length > 0) changes.push(`${table.renamedColumns.length} renamed`);
75
+ if (table.addedIndexes.length > 0) changes.push(`+${table.addedIndexes.length} idx`);
76
+ if (table.removedIndexes.length > 0) changes.push(`-${table.removedIndexes.length} idx`);
77
+ if (table.primaryKeyChanged) changes.push('PK changed');
78
+ this.logger.info(` ${table.tableName}: ${changes.join(', ')}`);
79
+ }
80
+
81
+ this.logger.info(`\nDDL statements (${statements.length}):`);
82
+ for (const stmt of statements) {
83
+ this.logger.info(` ${stmt}`);
84
+ }
85
+
86
+ // Step 7: Prompt for description and generate file
87
+ pinoLogger.flush();
88
+ await new Promise(resolve => setTimeout(resolve, 100));
89
+ const description = await promptMigrationDescription();
90
+ const filePath = generateMigrationFile(statements, description);
91
+ this.logger.info(`\nMigration file created: ${filePath}`);
92
+ } finally {
93
+ setNonInteractive(false);
94
+ }
95
+ }
96
+ }