@signal24/dk-server-foundation 26.213.615

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 (666) hide show
  1. package/.gitattributes +2 -0
  2. package/.gitlab-ci.yml +49 -0
  3. package/.oxlintrc.json +40 -0
  4. package/.prettierignore +3 -0
  5. package/.prettierrc.json +15 -0
  6. package/.serena/project.yml +111 -0
  7. package/.vscode/launch.json +15 -0
  8. package/.vscode/settings.json +12 -0
  9. package/.yarnrc.yml +5 -0
  10. package/CLAUDE.md +279 -0
  11. package/LICENSE +21 -0
  12. package/README.md +439 -0
  13. package/TEST_MIGRATION_GUIDE.md +348 -0
  14. package/dist/resources/proto/generated/test/test.d.ts +224 -0
  15. package/dist/resources/proto/generated/test/test.d.ts.map +1 -0
  16. package/dist/resources/proto/generated/test/test.js +2376 -0
  17. package/dist/resources/proto/generated/test/test.js.map +1 -0
  18. package/dist/src/app/base.d.ts +37 -0
  19. package/dist/src/app/base.d.ts.map +1 -0
  20. package/dist/src/app/base.js +244 -0
  21. package/dist/src/app/base.js.map +1 -0
  22. package/dist/src/app/config.d.ts +91 -0
  23. package/dist/src/app/config.d.ts.map +1 -0
  24. package/dist/src/app/config.js +33 -0
  25. package/dist/src/app/config.js.map +1 -0
  26. package/dist/src/app/config.loader.d.ts +14 -0
  27. package/dist/src/app/config.loader.d.ts.map +1 -0
  28. package/dist/src/app/config.loader.js +67 -0
  29. package/dist/src/app/config.loader.js.map +1 -0
  30. package/dist/src/app/const.d.ts +3 -0
  31. package/dist/src/app/const.d.ts.map +1 -0
  32. package/dist/src/app/const.js +6 -0
  33. package/dist/src/app/const.js.map +1 -0
  34. package/dist/src/app/dev.d.ts +6 -0
  35. package/dist/src/app/dev.d.ts.map +1 -0
  36. package/dist/src/app/dev.js +78 -0
  37. package/dist/src/app/dev.js.map +1 -0
  38. package/dist/src/app/index.d.ts +7 -0
  39. package/dist/src/app/index.d.ts.map +1 -0
  40. package/dist/src/app/index.js +12 -0
  41. package/dist/src/app/index.js.map +1 -0
  42. package/dist/src/app/openapi.d.ts +4 -0
  43. package/dist/src/app/openapi.d.ts.map +1 -0
  44. package/dist/src/app/openapi.js +6 -0
  45. package/dist/src/app/openapi.js.map +1 -0
  46. package/dist/src/app/resolver.d.ts +11 -0
  47. package/dist/src/app/resolver.d.ts.map +1 -0
  48. package/dist/src/app/resolver.js +60 -0
  49. package/dist/src/app/resolver.js.map +1 -0
  50. package/dist/src/app/shutdown.d.ts +12 -0
  51. package/dist/src/app/shutdown.d.ts.map +1 -0
  52. package/dist/src/app/shutdown.js +63 -0
  53. package/dist/src/app/shutdown.js.map +1 -0
  54. package/dist/src/app/state.d.ts +16 -0
  55. package/dist/src/app/state.d.ts.map +1 -0
  56. package/dist/src/app/state.js +12 -0
  57. package/dist/src/app/state.js.map +1 -0
  58. package/dist/src/auth/index.d.ts +3 -0
  59. package/dist/src/auth/index.d.ts.map +1 -0
  60. package/dist/src/auth/index.js +6 -0
  61. package/dist/src/auth/index.js.map +1 -0
  62. package/dist/src/auth/jwt.d.ts +76 -0
  63. package/dist/src/auth/jwt.d.ts.map +1 -0
  64. package/dist/src/auth/jwt.js +218 -0
  65. package/dist/src/auth/jwt.js.map +1 -0
  66. package/dist/src/auth/provider.d.ts +15 -0
  67. package/dist/src/auth/provider.d.ts.map +1 -0
  68. package/dist/src/auth/provider.js +50 -0
  69. package/dist/src/auth/provider.js.map +1 -0
  70. package/dist/src/cli/dksf-dev.d.ts +3 -0
  71. package/dist/src/cli/dksf-dev.d.ts.map +1 -0
  72. package/dist/src/cli/dksf-dev.js +359 -0
  73. package/dist/src/cli/dksf-dev.js.map +1 -0
  74. package/dist/src/cli/dksf-gen-proto.d.ts +3 -0
  75. package/dist/src/cli/dksf-gen-proto.d.ts.map +1 -0
  76. package/dist/src/cli/dksf-gen-proto.js +164 -0
  77. package/dist/src/cli/dksf-gen-proto.js.map +1 -0
  78. package/dist/src/cli/dksf-install.d.ts +3 -0
  79. package/dist/src/cli/dksf-install.d.ts.map +1 -0
  80. package/dist/src/cli/dksf-install.js +10 -0
  81. package/dist/src/cli/dksf-install.js.map +1 -0
  82. package/dist/src/cli/dksf-test.d.ts +3 -0
  83. package/dist/src/cli/dksf-test.d.ts.map +1 -0
  84. package/dist/src/cli/dksf-test.js +91 -0
  85. package/dist/src/cli/dksf-test.js.map +1 -0
  86. package/dist/src/cli/dksf-update.d.ts +3 -0
  87. package/dist/src/cli/dksf-update.d.ts.map +1 -0
  88. package/dist/src/cli/dksf-update.js +86 -0
  89. package/dist/src/cli/dksf-update.js.map +1 -0
  90. package/dist/src/database/common.d.ts +84 -0
  91. package/dist/src/database/common.d.ts.map +1 -0
  92. package/dist/src/database/common.js +380 -0
  93. package/dist/src/database/common.js.map +1 -0
  94. package/dist/src/database/dialect.d.ts +10 -0
  95. package/dist/src/database/dialect.d.ts.map +1 -0
  96. package/dist/src/database/dialect.js +56 -0
  97. package/dist/src/database/dialect.js.map +1 -0
  98. package/dist/src/database/entity.d.ts +62 -0
  99. package/dist/src/database/entity.d.ts.map +1 -0
  100. package/dist/src/database/entity.js +198 -0
  101. package/dist/src/database/entity.js.map +1 -0
  102. package/dist/src/database/index.d.ts +8 -0
  103. package/dist/src/database/index.d.ts.map +1 -0
  104. package/dist/src/database/index.js +15 -0
  105. package/dist/src/database/index.js.map +1 -0
  106. package/dist/src/database/migration/MigrationResetCommand.d.ts +11 -0
  107. package/dist/src/database/migration/MigrationResetCommand.d.ts.map +1 -0
  108. package/dist/src/database/migration/MigrationResetCommand.js +149 -0
  109. package/dist/src/database/migration/MigrationResetCommand.js.map +1 -0
  110. package/dist/src/database/migration/MigrationRunCommand.d.ts +11 -0
  111. package/dist/src/database/migration/MigrationRunCommand.d.ts.map +1 -0
  112. package/dist/src/database/migration/MigrationRunCommand.js +118 -0
  113. package/dist/src/database/migration/MigrationRunCommand.js.map +1 -0
  114. package/dist/src/database/migration/characters.d.ts +14 -0
  115. package/dist/src/database/migration/characters.d.ts.map +1 -0
  116. package/dist/src/database/migration/characters.js +56 -0
  117. package/dist/src/database/migration/characters.js.map +1 -0
  118. package/dist/src/database/migration/create/MigrationCreateCommand.d.ts +11 -0
  119. package/dist/src/database/migration/create/MigrationCreateCommand.d.ts.map +1 -0
  120. package/dist/src/database/migration/create/MigrationCreateCommand.js +104 -0
  121. package/dist/src/database/migration/create/MigrationCreateCommand.js.map +1 -0
  122. package/dist/src/database/migration/create/comparator.d.ts +3 -0
  123. package/dist/src/database/migration/create/comparator.d.ts.map +1 -0
  124. package/dist/src/database/migration/create/comparator.js +408 -0
  125. package/dist/src/database/migration/create/comparator.js.map +1 -0
  126. package/dist/src/database/migration/create/db-reader.d.ts +5 -0
  127. package/dist/src/database/migration/create/db-reader.d.ts.map +1 -0
  128. package/dist/src/database/migration/create/db-reader.js +473 -0
  129. package/dist/src/database/migration/create/db-reader.js.map +1 -0
  130. package/dist/src/database/migration/create/ddl-generator.d.ts +3 -0
  131. package/dist/src/database/migration/create/ddl-generator.d.ts.map +1 -0
  132. package/dist/src/database/migration/create/ddl-generator.js +725 -0
  133. package/dist/src/database/migration/create/ddl-generator.js.map +1 -0
  134. package/dist/src/database/migration/create/entity-reader.d.ts +4 -0
  135. package/dist/src/database/migration/create/entity-reader.d.ts.map +1 -0
  136. package/dist/src/database/migration/create/entity-reader.js +408 -0
  137. package/dist/src/database/migration/create/entity-reader.js.map +1 -0
  138. package/dist/src/database/migration/create/file-generator.d.ts +2 -0
  139. package/dist/src/database/migration/create/file-generator.d.ts.map +1 -0
  140. package/dist/src/database/migration/create/file-generator.js +55 -0
  141. package/dist/src/database/migration/create/file-generator.js.map +1 -0
  142. package/dist/src/database/migration/create/prompt.d.ts +4 -0
  143. package/dist/src/database/migration/create/prompt.d.ts.map +1 -0
  144. package/dist/src/database/migration/create/prompt.js +55 -0
  145. package/dist/src/database/migration/create/prompt.js.map +1 -0
  146. package/dist/src/database/migration/create/schema-model.d.ts +109 -0
  147. package/dist/src/database/migration/create/schema-model.d.ts.map +1 -0
  148. package/dist/src/database/migration/create/schema-model.js +24 -0
  149. package/dist/src/database/migration/create/schema-model.js.map +1 -0
  150. package/dist/src/database/migration/helpers.d.ts +2 -0
  151. package/dist/src/database/migration/helpers.d.ts.map +1 -0
  152. package/dist/src/database/migration/helpers.js +8 -0
  153. package/dist/src/database/migration/helpers.js.map +1 -0
  154. package/dist/src/database/migration/index.d.ts +9 -0
  155. package/dist/src/database/migration/index.d.ts.map +1 -0
  156. package/dist/src/database/migration/index.js +43 -0
  157. package/dist/src/database/migration/index.js.map +1 -0
  158. package/dist/src/database/migration/migration.entity.d.ts +8 -0
  159. package/dist/src/database/migration/migration.entity.d.ts.map +1 -0
  160. package/dist/src/database/migration/migration.entity.js +16 -0
  161. package/dist/src/database/migration/migration.entity.js.map +1 -0
  162. package/dist/src/database/mysql.d.ts +16 -0
  163. package/dist/src/database/mysql.d.ts.map +1 -0
  164. package/dist/src/database/mysql.js +140 -0
  165. package/dist/src/database/mysql.js.map +1 -0
  166. package/dist/src/database/postgres.d.ts +16 -0
  167. package/dist/src/database/postgres.d.ts.map +1 -0
  168. package/dist/src/database/postgres.js +91 -0
  169. package/dist/src/database/postgres.js.map +1 -0
  170. package/dist/src/database/types.d.ts +21 -0
  171. package/dist/src/database/types.d.ts.map +1 -0
  172. package/dist/src/database/types.js +27 -0
  173. package/dist/src/database/types.js.map +1 -0
  174. package/dist/src/health/health.module.d.ts +6 -0
  175. package/dist/src/health/health.module.d.ts.map +1 -0
  176. package/dist/src/health/health.module.js +32 -0
  177. package/dist/src/health/health.module.js.map +1 -0
  178. package/dist/src/health/healthcheck.controller.d.ts +10 -0
  179. package/dist/src/health/healthcheck.controller.d.ts.map +1 -0
  180. package/dist/src/health/healthcheck.controller.js +30 -0
  181. package/dist/src/health/healthcheck.controller.js.map +1 -0
  182. package/dist/src/health/healthcheck.service.d.ts +8 -0
  183. package/dist/src/health/healthcheck.service.d.ts.map +1 -0
  184. package/dist/src/health/healthcheck.service.js +20 -0
  185. package/dist/src/health/healthcheck.service.js.map +1 -0
  186. package/dist/src/health/index.d.ts +3 -0
  187. package/dist/src/health/index.d.ts.map +1 -0
  188. package/dist/src/health/index.js +6 -0
  189. package/dist/src/health/index.js.map +1 -0
  190. package/dist/src/helpers/async/context.d.ts +11 -0
  191. package/dist/src/helpers/async/context.d.ts.map +1 -0
  192. package/dist/src/helpers/async/context.js +75 -0
  193. package/dist/src/helpers/async/context.js.map +1 -0
  194. package/dist/src/helpers/async/process.d.ts +16 -0
  195. package/dist/src/helpers/async/process.d.ts.map +1 -0
  196. package/dist/src/helpers/async/process.js +44 -0
  197. package/dist/src/helpers/async/process.js.map +1 -0
  198. package/dist/src/helpers/async/promise.d.ts +5 -0
  199. package/dist/src/helpers/async/promise.d.ts.map +1 -0
  200. package/dist/src/helpers/async/promise.js +27 -0
  201. package/dist/src/helpers/async/promise.js.map +1 -0
  202. package/dist/src/helpers/data/array.d.ts +3 -0
  203. package/dist/src/helpers/data/array.d.ts.map +1 -0
  204. package/dist/src/helpers/data/array.js +17 -0
  205. package/dist/src/helpers/data/array.js.map +1 -0
  206. package/dist/src/helpers/data/objects.d.ts +12 -0
  207. package/dist/src/helpers/data/objects.d.ts.map +1 -0
  208. package/dist/src/helpers/data/objects.js +75 -0
  209. package/dist/src/helpers/data/objects.js.map +1 -0
  210. package/dist/src/helpers/data/serialization.d.ts +4 -0
  211. package/dist/src/helpers/data/serialization.d.ts.map +1 -0
  212. package/dist/src/helpers/data/serialization.js +15 -0
  213. package/dist/src/helpers/data/serialization.js.map +1 -0
  214. package/dist/src/helpers/data/transformer.d.ts +13 -0
  215. package/dist/src/helpers/data/transformer.d.ts.map +1 -0
  216. package/dist/src/helpers/data/transformer.js +55 -0
  217. package/dist/src/helpers/data/transformer.js.map +1 -0
  218. package/dist/src/helpers/framework/decorators.d.ts +5 -0
  219. package/dist/src/helpers/framework/decorators.d.ts.map +1 -0
  220. package/dist/src/helpers/framework/decorators.js +39 -0
  221. package/dist/src/helpers/framework/decorators.js.map +1 -0
  222. package/dist/src/helpers/framework/event.d.ts +3 -0
  223. package/dist/src/helpers/framework/event.d.ts.map +1 -0
  224. package/dist/src/helpers/framework/event.js +20 -0
  225. package/dist/src/helpers/framework/event.js.map +1 -0
  226. package/dist/src/helpers/framework/injection.d.ts +7 -0
  227. package/dist/src/helpers/framework/injection.d.ts.map +1 -0
  228. package/dist/src/helpers/framework/injection.js +52 -0
  229. package/dist/src/helpers/framework/injection.js.map +1 -0
  230. package/dist/src/helpers/index.d.ts +22 -0
  231. package/dist/src/helpers/index.d.ts.map +1 -0
  232. package/dist/src/helpers/index.js +32 -0
  233. package/dist/src/helpers/index.js.map +1 -0
  234. package/dist/src/helpers/io/package.d.ts +5 -0
  235. package/dist/src/helpers/io/package.d.ts.map +1 -0
  236. package/dist/src/helpers/io/package.js +31 -0
  237. package/dist/src/helpers/io/package.js.map +1 -0
  238. package/dist/src/helpers/io/stream.d.ts +18 -0
  239. package/dist/src/helpers/io/stream.d.ts.map +1 -0
  240. package/dist/src/helpers/io/stream.js +91 -0
  241. package/dist/src/helpers/io/stream.js.map +1 -0
  242. package/dist/src/helpers/redis/broadcast.d.ts +12 -0
  243. package/dist/src/helpers/redis/broadcast.d.ts.map +1 -0
  244. package/dist/src/helpers/redis/broadcast.js +99 -0
  245. package/dist/src/helpers/redis/broadcast.js.map +1 -0
  246. package/dist/src/helpers/redis/cache.d.ts +7 -0
  247. package/dist/src/helpers/redis/cache.d.ts.map +1 -0
  248. package/dist/src/helpers/redis/cache.js +28 -0
  249. package/dist/src/helpers/redis/cache.js.map +1 -0
  250. package/dist/src/helpers/redis/mutex.d.ts +24 -0
  251. package/dist/src/helpers/redis/mutex.d.ts.map +1 -0
  252. package/dist/src/helpers/redis/mutex.js +240 -0
  253. package/dist/src/helpers/redis/mutex.js.map +1 -0
  254. package/dist/src/helpers/redis/redis.d.ts +11 -0
  255. package/dist/src/helpers/redis/redis.d.ts.map +1 -0
  256. package/dist/src/helpers/redis/redis.js +59 -0
  257. package/dist/src/helpers/redis/redis.js.map +1 -0
  258. package/dist/src/helpers/security/crypto.d.ts +26 -0
  259. package/dist/src/helpers/security/crypto.d.ts.map +1 -0
  260. package/dist/src/helpers/security/crypto.js +121 -0
  261. package/dist/src/helpers/security/crypto.js.map +1 -0
  262. package/dist/src/helpers/security/validation.d.ts +4 -0
  263. package/dist/src/helpers/security/validation.d.ts.map +1 -0
  264. package/dist/src/helpers/security/validation.js +25 -0
  265. package/dist/src/helpers/security/validation.js.map +1 -0
  266. package/dist/src/helpers/utils/date.d.ts +4 -0
  267. package/dist/src/helpers/utils/date.d.ts.map +1 -0
  268. package/dist/src/helpers/utils/date.js +23 -0
  269. package/dist/src/helpers/utils/date.js.map +1 -0
  270. package/dist/src/helpers/utils/error.d.ts +24 -0
  271. package/dist/src/helpers/utils/error.d.ts.map +1 -0
  272. package/dist/src/helpers/utils/error.js +168 -0
  273. package/dist/src/helpers/utils/error.js.map +1 -0
  274. package/dist/src/helpers/utils/jsx.d.ts +3 -0
  275. package/dist/src/helpers/utils/jsx.d.ts.map +1 -0
  276. package/dist/src/helpers/utils/jsx.js +13 -0
  277. package/dist/src/helpers/utils/jsx.js.map +1 -0
  278. package/dist/src/helpers/utils/uuid.d.ts +3 -0
  279. package/dist/src/helpers/utils/uuid.d.ts.map +1 -0
  280. package/dist/src/helpers/utils/uuid.js +14 -0
  281. package/dist/src/helpers/utils/uuid.js.map +1 -0
  282. package/dist/src/http/auth.d.ts +46 -0
  283. package/dist/src/http/auth.d.ts.map +1 -0
  284. package/dist/src/http/auth.js +162 -0
  285. package/dist/src/http/auth.js.map +1 -0
  286. package/dist/src/http/context.d.ts +5 -0
  287. package/dist/src/http/context.d.ts.map +1 -0
  288. package/dist/src/http/context.js +22 -0
  289. package/dist/src/http/context.js.map +1 -0
  290. package/dist/src/http/cors.d.ts +36 -0
  291. package/dist/src/http/cors.d.ts.map +1 -0
  292. package/dist/src/http/cors.js +171 -0
  293. package/dist/src/http/cors.js.map +1 -0
  294. package/dist/src/http/errors.d.ts +3 -0
  295. package/dist/src/http/errors.d.ts.map +1 -0
  296. package/dist/src/http/errors.js +10 -0
  297. package/dist/src/http/errors.js.map +1 -0
  298. package/dist/src/http/index.d.ts +24 -0
  299. package/dist/src/http/index.d.ts.map +1 -0
  300. package/dist/src/http/index.js +25 -0
  301. package/dist/src/http/index.js.map +1 -0
  302. package/dist/src/http/kernel.d.ts +17 -0
  303. package/dist/src/http/kernel.d.ts.map +1 -0
  304. package/dist/src/http/kernel.js +133 -0
  305. package/dist/src/http/kernel.js.map +1 -0
  306. package/dist/src/http/middleware.d.ts +12 -0
  307. package/dist/src/http/middleware.d.ts.map +1 -0
  308. package/dist/src/http/middleware.js +61 -0
  309. package/dist/src/http/middleware.js.map +1 -0
  310. package/dist/src/http/overrides.d.ts +2 -0
  311. package/dist/src/http/overrides.d.ts.map +1 -0
  312. package/dist/src/http/overrides.js +19 -0
  313. package/dist/src/http/overrides.js.map +1 -0
  314. package/dist/src/http/store.d.ts +33 -0
  315. package/dist/src/http/store.d.ts.map +1 -0
  316. package/dist/src/http/store.js +102 -0
  317. package/dist/src/http/store.js.map +1 -0
  318. package/dist/src/http/uploads.d.ts +7 -0
  319. package/dist/src/http/uploads.d.ts.map +1 -0
  320. package/dist/src/http/uploads.js +8 -0
  321. package/dist/src/http/uploads.js.map +1 -0
  322. package/dist/src/http/workflow.d.ts +18 -0
  323. package/dist/src/http/workflow.d.ts.map +1 -0
  324. package/dist/src/http/workflow.js +181 -0
  325. package/dist/src/http/workflow.js.map +1 -0
  326. package/dist/src/index.d.ts +13 -0
  327. package/dist/src/index.d.ts.map +1 -0
  328. package/dist/src/index.js +25 -0
  329. package/dist/src/index.js.map +1 -0
  330. package/dist/src/services/cli/invoke.d.ts +5 -0
  331. package/dist/src/services/cli/invoke.d.ts.map +1 -0
  332. package/dist/src/services/cli/invoke.js +45 -0
  333. package/dist/src/services/cli/invoke.js.map +1 -0
  334. package/dist/src/services/cli/repl.d.ts +5 -0
  335. package/dist/src/services/cli/repl.d.ts.map +1 -0
  336. package/dist/src/services/cli/repl.js +71 -0
  337. package/dist/src/services/cli/repl.js.map +1 -0
  338. package/dist/src/services/cli.d.ts +12 -0
  339. package/dist/src/services/cli.d.ts.map +1 -0
  340. package/dist/src/services/cli.js +76 -0
  341. package/dist/src/services/cli.js.map +1 -0
  342. package/dist/src/services/index.d.ts +7 -0
  343. package/dist/src/services/index.d.ts.map +1 -0
  344. package/dist/src/services/index.js +10 -0
  345. package/dist/src/services/index.js.map +1 -0
  346. package/dist/src/services/leader.d.ts +32 -0
  347. package/dist/src/services/leader.d.ts.map +1 -0
  348. package/dist/src/services/leader.js +174 -0
  349. package/dist/src/services/leader.js.map +1 -0
  350. package/dist/src/services/logger.d.ts +35 -0
  351. package/dist/src/services/logger.d.ts.map +1 -0
  352. package/dist/src/services/logger.js +245 -0
  353. package/dist/src/services/logger.js.map +1 -0
  354. package/dist/src/services/mail/index.d.ts +61 -0
  355. package/dist/src/services/mail/index.d.ts.map +1 -0
  356. package/dist/src/services/mail/index.js +90 -0
  357. package/dist/src/services/mail/index.js.map +1 -0
  358. package/dist/src/services/mail/postmark.d.ts +11 -0
  359. package/dist/src/services/mail/postmark.d.ts.map +1 -0
  360. package/dist/src/services/mail/postmark.js +42 -0
  361. package/dist/src/services/mail/postmark.js.map +1 -0
  362. package/dist/src/services/mail/smtp.d.ts +11 -0
  363. package/dist/src/services/mail/smtp.d.ts.map +1 -0
  364. package/dist/src/services/mail/smtp.js +61 -0
  365. package/dist/src/services/mail/smtp.js.map +1 -0
  366. package/dist/src/services/mesh.d.ts +65 -0
  367. package/dist/src/services/mesh.d.ts.map +1 -0
  368. package/dist/src/services/mesh.js +422 -0
  369. package/dist/src/services/mesh.js.map +1 -0
  370. package/dist/src/services/worker/bootstrap.d.ts +3 -0
  371. package/dist/src/services/worker/bootstrap.d.ts.map +1 -0
  372. package/dist/src/services/worker/bootstrap.js +70 -0
  373. package/dist/src/services/worker/bootstrap.js.map +1 -0
  374. package/dist/src/services/worker/cli.d.ts +23 -0
  375. package/dist/src/services/worker/cli.d.ts.map +1 -0
  376. package/dist/src/services/worker/cli.js +81 -0
  377. package/dist/src/services/worker/cli.js.map +1 -0
  378. package/dist/src/services/worker/entity.d.ts +18 -0
  379. package/dist/src/services/worker/entity.d.ts.map +1 -0
  380. package/dist/src/services/worker/entity.js +16 -0
  381. package/dist/src/services/worker/entity.js.map +1 -0
  382. package/dist/src/services/worker/index.d.ts +9 -0
  383. package/dist/src/services/worker/index.d.ts.map +1 -0
  384. package/dist/src/services/worker/index.js +40 -0
  385. package/dist/src/services/worker/index.js.map +1 -0
  386. package/dist/src/services/worker/observer.d.ts +18 -0
  387. package/dist/src/services/worker/observer.d.ts.map +1 -0
  388. package/dist/src/services/worker/observer.js +172 -0
  389. package/dist/src/services/worker/observer.js.map +1 -0
  390. package/dist/src/services/worker/queue.d.ts +8 -0
  391. package/dist/src/services/worker/queue.d.ts.map +1 -0
  392. package/dist/src/services/worker/queue.js +31 -0
  393. package/dist/src/services/worker/queue.js.map +1 -0
  394. package/dist/src/services/worker/runner.d.ts +17 -0
  395. package/dist/src/services/worker/runner.d.ts.map +1 -0
  396. package/dist/src/services/worker/runner.js +131 -0
  397. package/dist/src/services/worker/runner.js.map +1 -0
  398. package/dist/src/services/worker/types.d.ts +26 -0
  399. package/dist/src/services/worker/types.d.ts.map +1 -0
  400. package/dist/src/services/worker/types.js +29 -0
  401. package/dist/src/services/worker/types.js.map +1 -0
  402. package/dist/src/srpc/SrpcByteStream.d.ts +67 -0
  403. package/dist/src/srpc/SrpcByteStream.d.ts.map +1 -0
  404. package/dist/src/srpc/SrpcByteStream.js +319 -0
  405. package/dist/src/srpc/SrpcByteStream.js.map +1 -0
  406. package/dist/src/srpc/SrpcClient.d.ts +75 -0
  407. package/dist/src/srpc/SrpcClient.d.ts.map +1 -0
  408. package/dist/src/srpc/SrpcClient.js +445 -0
  409. package/dist/src/srpc/SrpcClient.js.map +1 -0
  410. package/dist/src/srpc/SrpcServer.d.ts +54 -0
  411. package/dist/src/srpc/SrpcServer.d.ts.map +1 -0
  412. package/dist/src/srpc/SrpcServer.js +456 -0
  413. package/dist/src/srpc/SrpcServer.js.map +1 -0
  414. package/dist/src/srpc/index.d.ts +7 -0
  415. package/dist/src/srpc/index.d.ts.map +1 -0
  416. package/dist/src/srpc/index.js +12 -0
  417. package/dist/src/srpc/index.js.map +1 -0
  418. package/dist/src/srpc/types.d.ts +129 -0
  419. package/dist/src/srpc/types.d.ts.map +1 -0
  420. package/dist/src/srpc/types.js +65 -0
  421. package/dist/src/srpc/types.js.map +1 -0
  422. package/dist/src/telemetry/index.d.ts +2 -0
  423. package/dist/src/telemetry/index.d.ts.map +1 -0
  424. package/dist/src/telemetry/index.js +5 -0
  425. package/dist/src/telemetry/index.js.map +1 -0
  426. package/dist/src/telemetry/otel/MariaDBInstrumentation.d.ts +22 -0
  427. package/dist/src/telemetry/otel/MariaDBInstrumentation.d.ts.map +1 -0
  428. package/dist/src/telemetry/otel/MariaDBInstrumentation.js +248 -0
  429. package/dist/src/telemetry/otel/MariaDBInstrumentation.js.map +1 -0
  430. package/dist/src/telemetry/otel/helpers.d.ts +27 -0
  431. package/dist/src/telemetry/otel/helpers.d.ts.map +1 -0
  432. package/dist/src/telemetry/otel/helpers.js +126 -0
  433. package/dist/src/telemetry/otel/helpers.js.map +1 -0
  434. package/dist/src/telemetry/otel/index.d.ts +14 -0
  435. package/dist/src/telemetry/otel/index.d.ts.map +1 -0
  436. package/dist/src/telemetry/otel/index.js +132 -0
  437. package/dist/src/telemetry/otel/index.js.map +1 -0
  438. package/dist/src/telemetry/otel/metrics.controller.d.ts +6 -0
  439. package/dist/src/telemetry/otel/metrics.controller.d.ts.map +1 -0
  440. package/dist/src/telemetry/otel/metrics.controller.js +63 -0
  441. package/dist/src/telemetry/otel/metrics.controller.js.map +1 -0
  442. package/dist/src/telemetry/sentry.d.ts +9 -0
  443. package/dist/src/telemetry/sentry.d.ts.map +1 -0
  444. package/dist/src/telemetry/sentry.js +62 -0
  445. package/dist/src/telemetry/sentry.js.map +1 -0
  446. package/dist/src/testapp/bootstrap.d.ts +1 -0
  447. package/dist/src/testapp/bootstrap.d.ts.map +1 -0
  448. package/dist/src/testapp/bootstrap.js +18 -0
  449. package/dist/src/testapp/bootstrap.js.map +1 -0
  450. package/dist/src/testapp/sample.d.ts +6 -0
  451. package/dist/src/testapp/sample.d.ts.map +1 -0
  452. package/dist/src/testapp/sample.js +228 -0
  453. package/dist/src/testapp/sample.js.map +1 -0
  454. package/dist/src/testapp/srpc-test.d.ts +27 -0
  455. package/dist/src/testapp/srpc-test.d.ts.map +1 -0
  456. package/dist/src/testapp/srpc-test.js +570 -0
  457. package/dist/src/testapp/srpc-test.js.map +1 -0
  458. package/dist/src/testing/expect.d.ts +25 -0
  459. package/dist/src/testing/expect.d.ts.map +1 -0
  460. package/dist/src/testing/expect.js +151 -0
  461. package/dist/src/testing/expect.js.map +1 -0
  462. package/dist/src/testing/fixtures.d.ts +19 -0
  463. package/dist/src/testing/fixtures.d.ts.map +1 -0
  464. package/dist/src/testing/fixtures.js +69 -0
  465. package/dist/src/testing/fixtures.js.map +1 -0
  466. package/dist/src/testing/index.d.ts +260 -0
  467. package/dist/src/testing/index.d.ts.map +1 -0
  468. package/dist/src/testing/index.js +345 -0
  469. package/dist/src/testing/index.js.map +1 -0
  470. package/dist/src/testing/requests.d.ts +10 -0
  471. package/dist/src/testing/requests.d.ts.map +1 -0
  472. package/dist/src/testing/requests.js +56 -0
  473. package/dist/src/testing/requests.js.map +1 -0
  474. package/dist/src/testing/sql.d.ts +11 -0
  475. package/dist/src/testing/sql.d.ts.map +1 -0
  476. package/dist/src/testing/sql.js +55 -0
  477. package/dist/src/testing/sql.js.map +1 -0
  478. package/dist/src/types/index.d.ts +57 -0
  479. package/dist/src/types/index.d.ts.map +1 -0
  480. package/dist/src/types/index.js +73 -0
  481. package/dist/src/types/index.js.map +1 -0
  482. package/dist/src/types/phone.d.ts +11 -0
  483. package/dist/src/types/phone.d.ts.map +1 -0
  484. package/dist/src/types/phone.js +73 -0
  485. package/dist/src/types/phone.js.map +1 -0
  486. package/dist/tsconfig.tsbuildinfo +1 -0
  487. package/docs/README.md +38 -0
  488. package/docs/authentication.md +215 -0
  489. package/docs/cli.md +302 -0
  490. package/docs/configuration.md +176 -0
  491. package/docs/database.md +422 -0
  492. package/docs/getting-started.md +154 -0
  493. package/docs/health.md +53 -0
  494. package/docs/helpers.md +436 -0
  495. package/docs/http.md +253 -0
  496. package/docs/leader-service.md +98 -0
  497. package/docs/logging.md +150 -0
  498. package/docs/mail.md +161 -0
  499. package/docs/mesh-service.md +204 -0
  500. package/docs/srpc.md +261 -0
  501. package/docs/telemetry.md +166 -0
  502. package/docs/testing.md +222 -0
  503. package/docs/types.md +215 -0
  504. package/docs/worker.md +174 -0
  505. package/lefthook.yml +12 -0
  506. package/openapi.yaml +109 -0
  507. package/package.json +133 -0
  508. package/patches/@deepkit+type+1.0.19.patch +38 -0
  509. package/resources/proto/generated/test/test.ts +2721 -0
  510. package/resources/proto/sample.proto +85 -0
  511. package/resources/proto/test.proto +178 -0
  512. package/src/app/base.ts +257 -0
  513. package/src/app/config.loader.ts +66 -0
  514. package/src/app/config.ts +120 -0
  515. package/src/app/const.ts +4 -0
  516. package/src/app/dev.ts +70 -0
  517. package/src/app/index.ts +6 -0
  518. package/src/app/openapi.ts +3 -0
  519. package/src/app/resolver.ts +49 -0
  520. package/src/app/shutdown.ts +55 -0
  521. package/src/app/state.ts +19 -0
  522. package/src/auth/index.ts +2 -0
  523. package/src/auth/jwt.ts +275 -0
  524. package/src/auth/provider.ts +57 -0
  525. package/src/cli/dksf-dev.ts +363 -0
  526. package/src/cli/dksf-gen-proto.ts +176 -0
  527. package/src/cli/dksf-install.ts +11 -0
  528. package/src/cli/dksf-test.ts +95 -0
  529. package/src/cli/dksf-update.ts +101 -0
  530. package/src/database/CLAUDE.md +390 -0
  531. package/src/database/common.ts +385 -0
  532. package/src/database/dialect.ts +43 -0
  533. package/src/database/entity.ts +285 -0
  534. package/src/database/index.ts +7 -0
  535. package/src/database/migration/MigrationResetCommand.ts +152 -0
  536. package/src/database/migration/MigrationRunCommand.ts +118 -0
  537. package/src/database/migration/characters.ts +53 -0
  538. package/src/database/migration/create/MigrationCreateCommand.ts +94 -0
  539. package/src/database/migration/create/comparator.ts +467 -0
  540. package/src/database/migration/create/db-reader.ts +510 -0
  541. package/src/database/migration/create/ddl-generator.ts +755 -0
  542. package/src/database/migration/create/entity-reader.ts +462 -0
  543. package/src/database/migration/create/file-generator.ts +52 -0
  544. package/src/database/migration/create/prompt.ts +49 -0
  545. package/src/database/migration/create/schema-model.ts +102 -0
  546. package/src/database/migration/helpers.ts +3 -0
  547. package/src/database/migration/index.ts +35 -0
  548. package/src/database/migration/migration.entity.ts +10 -0
  549. package/src/database/mysql.ts +140 -0
  550. package/src/database/postgres.ts +97 -0
  551. package/src/database/types.ts +18 -0
  552. package/src/health/health.module.ts +30 -0
  553. package/src/health/healthcheck.controller.ts +17 -0
  554. package/src/health/healthcheck.service.ts +15 -0
  555. package/src/health/index.ts +2 -0
  556. package/src/helpers/CLAUDE.md +71 -0
  557. package/src/helpers/async/context.ts +67 -0
  558. package/src/helpers/async/process.ts +49 -0
  559. package/src/helpers/async/promise.ts +16 -0
  560. package/src/helpers/data/array.ts +11 -0
  561. package/src/helpers/data/objects.ts +64 -0
  562. package/src/helpers/data/serialization.ts +11 -0
  563. package/src/helpers/data/transformer.ts +54 -0
  564. package/src/helpers/framework/decorators.ts +27 -0
  565. package/src/helpers/framework/event.ts +11 -0
  566. package/src/helpers/framework/injection.ts +47 -0
  567. package/src/helpers/index.ts +34 -0
  568. package/src/helpers/io/package.ts +26 -0
  569. package/src/helpers/io/stream.ts +79 -0
  570. package/src/helpers/redis/broadcast.ts +94 -0
  571. package/src/helpers/redis/cache.ts +28 -0
  572. package/src/helpers/redis/mutex.ts +260 -0
  573. package/src/helpers/redis/redis.ts +60 -0
  574. package/src/helpers/security/crypto.ts +133 -0
  575. package/src/helpers/security/validation.ts +16 -0
  576. package/src/helpers/utils/date.ts +13 -0
  577. package/src/helpers/utils/error.ts +155 -0
  578. package/src/helpers/utils/jsx.ts +8 -0
  579. package/src/helpers/utils/uuid.ts +8 -0
  580. package/src/http/auth.ts +156 -0
  581. package/src/http/context.ts +15 -0
  582. package/src/http/cors.ts +159 -0
  583. package/src/http/errors.ts +9 -0
  584. package/src/http/index.ts +19 -0
  585. package/src/http/kernel.ts +138 -0
  586. package/src/http/middleware.ts +59 -0
  587. package/src/http/overrides.ts +20 -0
  588. package/src/http/store.ts +86 -0
  589. package/src/http/uploads.ts +6 -0
  590. package/src/http/workflow.ts +167 -0
  591. package/src/index.ts +19 -0
  592. package/src/services/cli/invoke.ts +39 -0
  593. package/src/services/cli/repl.ts +67 -0
  594. package/src/services/cli.ts +74 -0
  595. package/src/services/index.ts +6 -0
  596. package/src/services/leader.ts +201 -0
  597. package/src/services/logger.ts +258 -0
  598. package/src/services/mail/index.ts +117 -0
  599. package/src/services/mail/postmark.ts +37 -0
  600. package/src/services/mail/smtp.ts +46 -0
  601. package/src/services/mesh.ts +508 -0
  602. package/src/services/worker/CLAUDE.md +77 -0
  603. package/src/services/worker/bootstrap.ts +58 -0
  604. package/src/services/worker/cli.ts +63 -0
  605. package/src/services/worker/entity.ts +22 -0
  606. package/src/services/worker/index.ts +30 -0
  607. package/src/services/worker/observer.ts +180 -0
  608. package/src/services/worker/queue.ts +34 -0
  609. package/src/services/worker/runner.ts +146 -0
  610. package/src/services/worker/types.ts +32 -0
  611. package/src/srpc/CLAUDE.md +194 -0
  612. package/src/srpc/SRPC_MIGRATION_GUIDE.md +348 -0
  613. package/src/srpc/SrpcByteStream.ts +382 -0
  614. package/src/srpc/SrpcClient.ts +512 -0
  615. package/src/srpc/SrpcServer.ts +575 -0
  616. package/src/srpc/index.ts +15 -0
  617. package/src/srpc/types.ts +144 -0
  618. package/src/telemetry/index.ts +1 -0
  619. package/src/telemetry/otel/MariaDBInstrumentation.ts +297 -0
  620. package/src/telemetry/otel/helpers.ts +117 -0
  621. package/src/telemetry/otel/index.ts +150 -0
  622. package/src/telemetry/otel/metrics.controller.ts +50 -0
  623. package/src/telemetry/sentry.ts +58 -0
  624. package/src/testapp/bootstrap.ts +17 -0
  625. package/src/testapp/sample.ts +220 -0
  626. package/src/testapp/srpc-test.ts +684 -0
  627. package/src/testing/expect.ts +148 -0
  628. package/src/testing/fixtures.ts +62 -0
  629. package/src/testing/index.ts +355 -0
  630. package/src/testing/requests.ts +68 -0
  631. package/src/testing/sql.ts +50 -0
  632. package/src/types/index.ts +64 -0
  633. package/src/types/phone.ts +64 -0
  634. package/tests/app/app.spec.ts +53 -0
  635. package/tests/app/type.spec.ts +22 -0
  636. package/tests/auth/jwt.spec.ts +90 -0
  637. package/tests/database/entity.spec.ts +382 -0
  638. package/tests/database/locks.spec.ts +142 -0
  639. package/tests/database/migration-create-integration.spec.ts +234 -0
  640. package/tests/database/migration-create-unit.spec.ts +3896 -0
  641. package/tests/helpers/array.spec.ts +80 -0
  642. package/tests/helpers/cache.spec.ts +202 -0
  643. package/tests/helpers/crypto.spec.ts +236 -0
  644. package/tests/helpers/date.spec.ts +94 -0
  645. package/tests/helpers/error.spec.ts +233 -0
  646. package/tests/helpers/mutex.spec.ts +354 -0
  647. package/tests/helpers/objects.spec.ts +212 -0
  648. package/tests/helpers/package.spec.ts +90 -0
  649. package/tests/helpers/promise.spec.ts +119 -0
  650. package/tests/helpers/redis.spec.ts +50 -0
  651. package/tests/helpers/serialization.spec.ts +150 -0
  652. package/tests/helpers/stream.spec.ts +225 -0
  653. package/tests/helpers/validation.spec.ts +133 -0
  654. package/tests/services/leader.spec.ts +257 -0
  655. package/tests/services/logger.spec.ts +269 -0
  656. package/tests/services/mesh.spec.ts +814 -0
  657. package/tests/shared/db.ts +105 -0
  658. package/tests/shared/globalSetup.ts +48 -0
  659. package/tests/shared/helpers.ts +40 -0
  660. package/tests/srpc/SrpcByteStream.spec.ts +542 -0
  661. package/tests/tsconfig.json +4 -0
  662. package/tests/types/index.spec.ts +60 -0
  663. package/tests/types/phone.spec.ts +140 -0
  664. package/tsconfig.json +106 -0
  665. package/tsconfig.test.json +8 -0
  666. package/types.d.ts +6 -0
@@ -0,0 +1,462 @@
1
+ import {
2
+ ReflectionClass,
3
+ ReflectionKind,
4
+ ReflectionProperty,
5
+ Type,
6
+ TypeClass,
7
+ TypeEnum,
8
+ TypeIntersection,
9
+ TypeLiteral,
10
+ typeAnnotation,
11
+ databaseAnnotation,
12
+ validationAnnotation
13
+ } from '@deepkit/type';
14
+
15
+ import { BaseDatabase } from '../../common';
16
+ import { ColumnSchema, DatabaseSchema, Dialect, IndexSchema, ForeignKeySchema, INTERNAL_TABLES, TableSchema } from './schema-model';
17
+
18
+ export function readEntitiesSchema(db: BaseDatabase, dialect: Dialect): DatabaseSchema {
19
+ const schema: DatabaseSchema = new Map();
20
+ const entities = db.entityRegistry.all();
21
+
22
+ for (const entity of entities) {
23
+ const reflection = ReflectionClass.from(entity);
24
+ const tableName = reflection.getCollectionName() || reflection.name || '';
25
+ if (!tableName) continue;
26
+
27
+ if (INTERNAL_TABLES.has(tableName)) continue;
28
+
29
+ const table = readTableSchema(reflection, tableName, dialect, db);
30
+ schema.set(tableName, table);
31
+ }
32
+
33
+ return schema;
34
+ }
35
+
36
+ function readTableSchema(reflection: ReflectionClass<unknown>, tableName: string, dialect: Dialect, db: BaseDatabase): TableSchema {
37
+ const columns: ColumnSchema[] = [];
38
+ const indexes: IndexSchema[] = [];
39
+ const foreignKeys: ForeignKeySchema[] = [];
40
+ const pkColumns: string[] = [];
41
+ const skippedColumns = new Set<string>();
42
+
43
+ const properties = reflection.getProperties();
44
+ let ordinal = 0;
45
+
46
+ for (const prop of properties) {
47
+ if (prop.isBackReference()) continue;
48
+
49
+ // For references, we handle the FK column, not the object
50
+ if (prop.isReference()) {
51
+ const col = readReferenceColumn(prop, ++ordinal, dialect, db, tableName);
52
+ if (col) {
53
+ columns.push(col);
54
+ if (col.isPrimaryKey) pkColumns.push(col.name);
55
+
56
+ // Create FK
57
+ const fk = readForeignKey(prop, tableName, dialect, db);
58
+ if (fk) foreignKeys.push(fk);
59
+ } else {
60
+ skippedColumns.add(prop.name);
61
+ }
62
+ continue;
63
+ }
64
+
65
+ const col = readColumn(prop, ++ordinal, dialect, tableName);
66
+ if (col) {
67
+ columns.push(col);
68
+ if (col.isPrimaryKey) pkColumns.push(col.name);
69
+
70
+ // Single-column index from property
71
+ const indexInfo = prop.getIndex();
72
+ if (indexInfo) {
73
+ indexes.push({
74
+ name: indexInfo.name || `idx_${tableName}_${col.name}`,
75
+ columns: [col.name],
76
+ unique: indexInfo.unique || false,
77
+ spatial: false
78
+ });
79
+ }
80
+ } else {
81
+ skippedColumns.add(prop.name);
82
+ console.warn(`migration:create: Skipping column '${prop.name}' in '${tableName}' — unsupported type`);
83
+ }
84
+ }
85
+
86
+ // Multi-column indexes from entity-level indexes
87
+ if (reflection.indexes) {
88
+ for (const idx of reflection.indexes) {
89
+ indexes.push({
90
+ name: idx.options.name || `idx_${tableName}_${idx.names.join('_')}`,
91
+ columns: idx.names,
92
+ unique: idx.options.unique || false,
93
+ spatial: dialect === 'mysql' ? idx.options.spatial || false : false
94
+ });
95
+ }
96
+ }
97
+
98
+ return { name: tableName, columns, indexes, foreignKeys, skippedColumns };
99
+ }
100
+
101
+ function readColumn(prop: ReflectionProperty, ordinal: number, dialect: Dialect, tableName?: string): ColumnSchema | null {
102
+ const type = prop.type;
103
+ const resolved = resolveColumnType(type, prop.name, dialect, tableName);
104
+ if (!resolved) return null;
105
+
106
+ const col: ColumnSchema = {
107
+ name: prop.name,
108
+ type: resolved.type,
109
+ size: resolved.size,
110
+ scale: resolved.scale,
111
+ unsigned: resolved.unsigned || false,
112
+ nullable: prop.isNullable(),
113
+ autoIncrement: prop.isAutoIncrement(),
114
+ isPrimaryKey: prop.isPrimaryKey(),
115
+ defaultValue: resolved.defaultValue,
116
+ defaultExpression: resolved.defaultExpression,
117
+ enumValues: resolved.enumValues,
118
+ enumTypeName: resolved.enumTypeName,
119
+ ordinalPosition: ordinal
120
+ };
121
+
122
+ // ON UPDATE expression (MySQL only)
123
+ if (dialect === 'mysql') {
124
+ const onUpdateAnnotation = typeAnnotation.getType(type, 'dksf:onUpdate');
125
+ if (onUpdateAnnotation?.kind === ReflectionKind.literal && typeof onUpdateAnnotation.literal === 'string') {
126
+ col.onUpdateExpression = (onUpdateAnnotation.literal as string).toUpperCase();
127
+ }
128
+ }
129
+
130
+ return col;
131
+ }
132
+
133
+ function readReferenceColumn(
134
+ prop: ReflectionProperty,
135
+ ordinal: number,
136
+ dialect: Dialect,
137
+ _db: BaseDatabase,
138
+ tableName?: string
139
+ ): ColumnSchema | null {
140
+ // A reference property stores the PK of the referenced entity
141
+ const refClass = prop.getResolvedReflectionClass();
142
+
143
+ // Guard: only single-column PKs are supported for references
144
+ const refPkProps = refClass.getProperties().filter(p => p.isPrimaryKey());
145
+ if (refPkProps.length !== 1) {
146
+ console.warn(
147
+ `migration:create: Skipping reference '${prop.name}' in '${tableName ?? '?'}' — ` +
148
+ `referenced entity '${refClass.name}' has ${refPkProps.length === 0 ? 'no' : 'composite'} primary key (unsupported)`
149
+ );
150
+ return null;
151
+ }
152
+
153
+ const refPk = refClass.getPrimary();
154
+ if (!refPk) return null;
155
+
156
+ // Resolve the PK column type of the referenced entity
157
+ const resolved = resolveColumnType(refPk.type, prop.name, dialect, tableName);
158
+ if (!resolved) return null;
159
+
160
+ return {
161
+ name: prop.name,
162
+ type: resolved.type,
163
+ size: resolved.size,
164
+ scale: resolved.scale,
165
+ unsigned: resolved.unsigned || false,
166
+ nullable: prop.isNullable(),
167
+ autoIncrement: false,
168
+ isPrimaryKey: prop.isPrimaryKey(),
169
+ ordinalPosition: ordinal
170
+ };
171
+ }
172
+
173
+ function readForeignKey(prop: ReflectionProperty, tableName: string, _dialect: Dialect, _db: BaseDatabase): ForeignKeySchema | null {
174
+ const refClass = prop.getResolvedReflectionClass();
175
+ const refTableName = refClass.getCollectionName() || refClass.name || '';
176
+
177
+ // Guard: only single-column PKs are supported for FK generation
178
+ const refPkProps = refClass.getProperties().filter(p => p.isPrimaryKey());
179
+ if (refPkProps.length !== 1) {
180
+ // Warning already emitted by readReferenceColumn
181
+ return null;
182
+ }
183
+
184
+ const refPk = refClass.getPrimary();
185
+ if (!refPk || !refTableName) return null;
186
+
187
+ const ref = prop.getReference();
188
+ const onDelete: string = ref?.onDelete ?? 'CASCADE';
189
+ // Deepkit's ReferenceOptions does not expose onUpdate; future-proof with dynamic check.
190
+ // Default is CASCADE to match Deepkit's internal FK default (see @deepkit/sql ForeignKey class).
191
+ const onUpdate: string = (ref as Record<string, unknown>)?.onUpdate ? String((ref as Record<string, unknown>).onUpdate) : 'CASCADE';
192
+
193
+ return {
194
+ name: `fk_${tableName}_${prop.name}`,
195
+ columns: [prop.name],
196
+ referencedTable: refTableName,
197
+ referencedColumns: [refPk.name],
198
+ onDelete: onDelete.toUpperCase(),
199
+ onUpdate: onUpdate.toUpperCase()
200
+ };
201
+ }
202
+
203
+ interface ResolvedType {
204
+ type: string;
205
+ size?: number;
206
+ scale?: number;
207
+ unsigned?: boolean;
208
+ defaultValue?: unknown;
209
+ defaultExpression?: string;
210
+ enumValues?: string[];
211
+ enumTypeName?: string;
212
+ }
213
+
214
+ function resolveColumnType(type: Type, columnName: string, dialect: Dialect, parentTableName?: string): ResolvedType | null {
215
+ // Unwrap unions: filter out undefined/null (they only affect nullable)
216
+ if (type.kind === ReflectionKind.union) {
217
+ const nonNull = type.types.filter(
218
+ t => t.kind !== ReflectionKind.undefined && t.kind !== ReflectionKind.null && !(t.kind === ReflectionKind.literal && t.literal === null)
219
+ );
220
+ if (nonNull.length === 1) {
221
+ return resolveColumnType(nonNull[0], columnName, dialect, parentTableName);
222
+ }
223
+ // Multiple non-null union members -- treat as the first (lossy; warn)
224
+ if (nonNull.length > 0) {
225
+ console.warn(
226
+ `migration:create: Column '${columnName}'${parentTableName ? ` in '${parentTableName}'` : ''} ` +
227
+ `has a union type with ${nonNull.length} non-null members — using the first member only`
228
+ );
229
+ return resolveColumnType(nonNull[0], columnName, dialect, parentTableName);
230
+ }
231
+ return null;
232
+ }
233
+
234
+ // Unwrap intersections: look for base type + annotations
235
+ if (type.kind === ReflectionKind.intersection) {
236
+ return resolveIntersectionType(type, columnName, dialect, parentTableName);
237
+ }
238
+
239
+ // Check dksf:type annotation
240
+ const dksfType = typeAnnotation.getType(type, 'dksf:type');
241
+ if (dksfType?.kind === ReflectionKind.literal) {
242
+ const result = resolveDksfType(dksfType.literal as string, type, dialect);
243
+ if (result) return result;
244
+ }
245
+
246
+ // Check dialect-specific database annotation
247
+ const dbAnnotation = databaseAnnotation.getDatabase<{ type?: string }>(type, dialect);
248
+ if (dbAnnotation?.type) {
249
+ return { type: dbAnnotation.type.toLowerCase() };
250
+ }
251
+
252
+ // Check generic database annotation
253
+ const genericDbAnnotation = databaseAnnotation.getDatabase<{ type?: string }>(type, '*');
254
+ if (genericDbAnnotation?.type) {
255
+ return { type: genericDbAnnotation.type.toLowerCase() };
256
+ }
257
+
258
+ // Check dksf:length annotation
259
+ const lengthAnnotation = typeAnnotation.getType(type, 'dksf:length');
260
+ if (lengthAnnotation?.kind === ReflectionKind.literal && typeof lengthAnnotation.literal === 'number') {
261
+ return { type: 'char', size: lengthAnnotation.literal };
262
+ }
263
+
264
+ // Check validation annotations for MaxLength
265
+ const maxLength = getMaxLength(type);
266
+ if (maxLength !== undefined) {
267
+ return { type: 'varchar', size: maxLength };
268
+ }
269
+
270
+ // Enum types
271
+ if (type.kind === ReflectionKind.enum) {
272
+ return resolveEnumType(type, columnName, dialect, parentTableName);
273
+ }
274
+
275
+ // Primitive type map
276
+ return resolvePrimitiveType(type, dialect);
277
+ }
278
+
279
+ function resolveIntersectionType(type: TypeIntersection, columnName: string, dialect: Dialect, parentTableName?: string): ResolvedType | null {
280
+ // Priority 1: Check for dialect-specific database annotation on the intersection
281
+ const dbAnnotation = databaseAnnotation.getDatabase<{ type?: string }>(type, dialect);
282
+ if (dbAnnotation?.type) {
283
+ return { type: dbAnnotation.type.toLowerCase() };
284
+ }
285
+
286
+ // Priority 2: Check for generic database annotation
287
+ const genericDbAnnotation = databaseAnnotation.getDatabase<{ type?: string }>(type, '*');
288
+ if (genericDbAnnotation?.type) {
289
+ return { type: genericDbAnnotation.type.toLowerCase() };
290
+ }
291
+
292
+ // Priority 3: dksf:type annotation
293
+ const dksfType = typeAnnotation.getType(type, 'dksf:type');
294
+ if (dksfType?.kind === ReflectionKind.literal) {
295
+ const result = resolveDksfType(dksfType.literal as string, type, dialect);
296
+ if (result) return result;
297
+ }
298
+
299
+ // Priority 4: dksf:length annotation
300
+ const lengthAnnotation = typeAnnotation.getType(type, 'dksf:length');
301
+ if (lengthAnnotation?.kind === ReflectionKind.literal && typeof lengthAnnotation.literal === 'number') {
302
+ return { type: 'char', size: lengthAnnotation.literal };
303
+ }
304
+
305
+ // Priority 5: MaxLength validation
306
+ const maxLength = getMaxLength(type);
307
+ if (maxLength !== undefined) {
308
+ return { type: 'varchar', size: maxLength };
309
+ }
310
+
311
+ // Priority 6: Find the base type in the intersection members
312
+ for (const member of type.types) {
313
+ // Skip annotation-only types (PrimaryKey, AutoIncrement, Index, etc.)
314
+ if (
315
+ member.kind === ReflectionKind.class ||
316
+ member.kind === ReflectionKind.string ||
317
+ member.kind === ReflectionKind.number ||
318
+ member.kind === ReflectionKind.boolean ||
319
+ member.kind === ReflectionKind.bigint ||
320
+ member.kind === ReflectionKind.enum
321
+ ) {
322
+ const result = resolveColumnType(member, columnName, dialect, parentTableName);
323
+ if (result) return result;
324
+ }
325
+ }
326
+
327
+ return null;
328
+ }
329
+
330
+ function resolveDksfType(dksfType: string, _type: Type, _dialect: Dialect): ResolvedType | null {
331
+ switch (dksfType) {
332
+ case 'uuid':
333
+ return { type: 'char', size: 36 };
334
+ case 'date':
335
+ return { type: 'date' };
336
+ case 'phone':
337
+ case 'phoneNanp':
338
+ return { type: 'varchar', size: 20 };
339
+ default:
340
+ return null;
341
+ }
342
+ }
343
+
344
+ function resolveEnumType(type: TypeEnum, columnName: string, dialect: Dialect, parentTableName?: string): ResolvedType | null {
345
+ const values = type.values.filter(v => v != null);
346
+
347
+ if (values.length === 0) return null;
348
+
349
+ // String enum
350
+ if (typeof values[0] === 'string') {
351
+ const stringValues = values.filter((v): v is string => typeof v === 'string');
352
+ if (dialect === 'postgres') {
353
+ const typeName = parentTableName ? `${parentTableName}_${columnName}` : columnName;
354
+ return {
355
+ type: 'enum',
356
+ enumValues: stringValues,
357
+ enumTypeName: typeName
358
+ };
359
+ }
360
+ return {
361
+ type: 'enum',
362
+ enumValues: stringValues
363
+ };
364
+ }
365
+
366
+ // Numeric enum
367
+ const numValues = values.filter((v): v is number => typeof v === 'number');
368
+ const minVal = Math.min(...numValues);
369
+ const maxVal = Math.max(...numValues);
370
+ if (dialect === 'mysql') {
371
+ if (minVal >= 0 && maxVal <= 255) return { type: 'tinyint', unsigned: true };
372
+ if (minVal >= -128 && maxVal <= 127) return { type: 'tinyint' };
373
+ if (minVal >= 0 && maxVal <= 65535) return { type: 'smallint', unsigned: true };
374
+ return { type: 'int' };
375
+ }
376
+ if (minVal >= -32768 && maxVal <= 32767) return { type: 'smallint' };
377
+ return { type: 'int' };
378
+ }
379
+
380
+ function getMaxLength(type: Type): number | undefined {
381
+ // Check for Deepkit's MaxLength validation annotation
382
+ try {
383
+ const annotations = validationAnnotation.getAnnotations(type);
384
+ if (annotations) {
385
+ for (const annotation of annotations) {
386
+ if (annotation.name === 'maxLength') {
387
+ const arg = annotation.args?.[0];
388
+ if (arg && arg.kind === ReflectionKind.literal && typeof arg.literal === 'number') {
389
+ return arg.literal;
390
+ }
391
+ }
392
+ }
393
+ }
394
+ } catch {
395
+ // validationAnnotation might not be available
396
+ }
397
+ return undefined;
398
+ }
399
+
400
+ function resolvePrimitiveType(type: Type, dialect: Dialect): ResolvedType | null {
401
+ switch (type.kind) {
402
+ case ReflectionKind.string:
403
+ return { type: 'varchar', size: 255 };
404
+
405
+ case ReflectionKind.number:
406
+ return dialect === 'mysql' ? { type: 'double' } : { type: 'double precision' };
407
+
408
+ case ReflectionKind.boolean:
409
+ return dialect === 'mysql' ? { type: 'tinyint', size: 1 } : { type: 'boolean' };
410
+
411
+ case ReflectionKind.bigint:
412
+ return { type: 'bigint' };
413
+
414
+ case ReflectionKind.class:
415
+ return resolveClassType(type, dialect);
416
+
417
+ case ReflectionKind.objectLiteral:
418
+ case ReflectionKind.array:
419
+ return dialect === 'mysql' ? { type: 'json' } : { type: 'jsonb' };
420
+
421
+ case ReflectionKind.any:
422
+ return dialect === 'mysql' ? { type: 'json' } : { type: 'jsonb' };
423
+
424
+ case ReflectionKind.literal: {
425
+ // literal string → varchar, literal number → int, etc.
426
+ const literal = (type as TypeLiteral).literal;
427
+ if (typeof literal === 'string') return { type: 'varchar', size: 255 };
428
+ if (typeof literal === 'number') return { type: 'int' };
429
+ if (typeof literal === 'boolean') {
430
+ return dialect === 'mysql' ? { type: 'tinyint', size: 1 } : { type: 'boolean' };
431
+ }
432
+ return null;
433
+ }
434
+
435
+ default:
436
+ return null;
437
+ }
438
+ }
439
+
440
+ function resolveClassType(type: TypeClass, dialect: Dialect): ResolvedType | null {
441
+ const className = type.classType?.name;
442
+
443
+ switch (className) {
444
+ case 'Date':
445
+ return dialect === 'mysql' ? { type: 'datetime' } : { type: 'timestamp' };
446
+
447
+ case 'Coordinate':
448
+ if (dialect === 'mysql') {
449
+ return { type: 'point' };
450
+ }
451
+ // PG doesn't support POINT in this framework
452
+ return null;
453
+
454
+ case 'ArrayBuffer':
455
+ case 'Uint8Array':
456
+ return dialect === 'mysql' ? { type: 'blob' } : { type: 'bytea' };
457
+
458
+ default:
459
+ // Unknown class → JSON
460
+ return dialect === 'mysql' ? { type: 'json' } : { type: 'jsonb' };
461
+ }
462
+ }
@@ -0,0 +1,52 @@
1
+ import { existsSync, mkdirSync, writeFileSync } from 'fs';
2
+ import path from 'path';
3
+
4
+ import { getMigrationsDir } from '../helpers';
5
+
6
+ export function generateMigrationFile(statements: string[], description: string): string {
7
+ const migrationsDir = getMigrationsDir();
8
+
9
+ if (!existsSync(migrationsDir)) {
10
+ mkdirSync(migrationsDir, { recursive: true });
11
+ }
12
+
13
+ const timestamp = formatTimestamp(new Date());
14
+ const slug = slugify(description);
15
+ const filename = `${timestamp}_${slug}.ts`;
16
+ const filePath = path.join(migrationsDir, filename);
17
+
18
+ const content = buildFileContent(statements);
19
+ writeFileSync(filePath, content, 'utf8');
20
+
21
+ return filePath;
22
+ }
23
+
24
+ function buildFileContent(statements: string[]): string {
25
+ const execLines = statements
26
+ .map(stmt => {
27
+ const escaped = stmt.replace(/\\/g, '\\\\').replace(/`/g, '\\`').replace(/\$/g, '\\$');
28
+ return ` await db.rawExecute(\`${escaped}\`);`;
29
+ })
30
+ .join('\n');
31
+
32
+ return `import { createMigration } from '@signal24/dk-server-foundation';\n\nexport default createMigration(async db => {\n${execLines}\n});\n`;
33
+ }
34
+
35
+ function formatTimestamp(date: Date): string {
36
+ const y = date.getUTCFullYear();
37
+ const m = String(date.getUTCMonth() + 1).padStart(2, '0');
38
+ const d = String(date.getUTCDate()).padStart(2, '0');
39
+ const h = String(date.getUTCHours()).padStart(2, '0');
40
+ const min = String(date.getUTCMinutes()).padStart(2, '0');
41
+ const s = String(date.getUTCSeconds()).padStart(2, '0');
42
+ const ms = String(date.getUTCMilliseconds()).padStart(3, '0');
43
+ return `${y}${m}${d}_${h}${min}${s}${ms}`;
44
+ }
45
+
46
+ function slugify(text: string): string {
47
+ return text
48
+ .toLowerCase()
49
+ .replace(/[^a-z0-9]+/g, '_')
50
+ .replace(/^_|_$/g, '')
51
+ .substring(0, 50);
52
+ }
@@ -0,0 +1,49 @@
1
+ import { createInterface } from 'readline';
2
+
3
+ let nonInteractive = false;
4
+
5
+ export function setNonInteractive(value: boolean): void {
6
+ nonInteractive = value;
7
+ }
8
+
9
+ export async function promptRename(tableName: string, newName: string, oldCandidates: string[]): Promise<string | null> {
10
+ if (nonInteractive) return null;
11
+
12
+ if (oldCandidates.length === 1) {
13
+ const oldName = oldCandidates[0];
14
+ const answer = await ask(
15
+ `Table \`${tableName}\`: Column \`${oldName}\` was removed and \`${newName}\` was added.\n` +
16
+ `Was \`${oldName}\` renamed to \`${newName}\`? [y/N] `
17
+ );
18
+ return answer.toLowerCase() === 'y' ? oldName : null;
19
+ }
20
+
21
+ // Multiple candidates
22
+ console.log(`\nTable \`${tableName}\`: Column \`${newName}\` was added and these columns were removed:`);
23
+ for (let i = 0; i < oldCandidates.length; i++) {
24
+ console.log(` ${i + 1}. ${oldCandidates[i]}`);
25
+ }
26
+ console.log(` 0. None (treat as new column)`);
27
+
28
+ const answer = await ask(`Was \`${newName}\` renamed from one of these? [0-${oldCandidates.length}] `);
29
+ const choice = parseInt(answer, 10);
30
+ if (isNaN(choice) || choice === 0 || choice > oldCandidates.length) return null;
31
+ return oldCandidates[choice - 1];
32
+ }
33
+
34
+ export async function promptMigrationDescription(): Promise<string> {
35
+ if (nonInteractive) return 'auto';
36
+
37
+ const answer = await ask('Enter a short description for this migration: ');
38
+ return answer.trim() || 'migration';
39
+ }
40
+
41
+ function ask(question: string): Promise<string> {
42
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
43
+ return new Promise(resolve => {
44
+ rl.question(question, answer => {
45
+ rl.close();
46
+ resolve(answer);
47
+ });
48
+ });
49
+ }
@@ -0,0 +1,102 @@
1
+ import { Dialect } from '../../dialect';
2
+
3
+ export { Dialect };
4
+
5
+ /** Tables managed internally by the framework — excluded from migration diff. */
6
+ export const INTERNAL_TABLES = new Set(['_migrations', '_locks', '_jobs']);
7
+
8
+ export interface ColumnSchema {
9
+ name: string;
10
+ type: string; // canonical lowercase: 'varchar', 'int', 'enum', 'point', 'date', 'text', 'boolean', 'timestamp', etc.
11
+ size?: number; // e.g. 255 for varchar(255)
12
+ scale?: number; // e.g. 2 for decimal(10,2)
13
+ unsigned: boolean; // MySQL only; always false for PG
14
+ nullable: boolean;
15
+ autoIncrement: boolean;
16
+ isPrimaryKey: boolean;
17
+ defaultValue?: unknown;
18
+ defaultExpression?: string; // e.g. 'CURRENT_TIMESTAMP', 'NOW()'
19
+ onUpdateExpression?: string; // MySQL only; e.g. 'CURRENT_TIMESTAMP'
20
+ enumValues?: string[]; // ordered values for ENUM type
21
+ enumTypeName?: string; // PG only: name of the enum type
22
+ isIdentity?: boolean; // PG only: true if GENERATED ... AS IDENTITY (vs sequence-backed serial)
23
+ sequenceName?: string; // PG only: actual sequence name from pg_get_serial_sequence()
24
+ ordinalPosition: number; // 1-based column order
25
+ }
26
+
27
+ export interface IndexSchema {
28
+ name: string;
29
+ columns: string[]; // ordered
30
+ unique: boolean;
31
+ spatial: boolean; // MySQL only
32
+ }
33
+
34
+ export interface ForeignKeySchema {
35
+ name: string;
36
+ columns: string[];
37
+ referencedTable: string;
38
+ referencedColumns: string[];
39
+ onDelete: string;
40
+ onUpdate: string;
41
+ }
42
+
43
+ export interface TableSchema {
44
+ name: string;
45
+ columns: ColumnSchema[]; // in ordinal order
46
+ indexes: IndexSchema[];
47
+ foreignKeys: ForeignKeySchema[];
48
+ primaryKeyConstraintName?: string; // PG only: actual constraint name from DB
49
+ skippedColumns?: Set<string>; // columns the entity-reader couldn't resolve (should not be diffed)
50
+ }
51
+
52
+ export type DatabaseSchema = Map<string, TableSchema>;
53
+
54
+ // --- Diff types ---
55
+
56
+ export interface SchemaDiff {
57
+ dialect: Dialect;
58
+ pgSchema?: string; // PG only: schema name for qualified DDL
59
+ addedTables: TableSchema[];
60
+ removedTables: TableSchema[];
61
+ modifiedTables: TableDiff[];
62
+ entityEnumTypes?: Set<string>; // PG only: all enum type names across all entity tables (for safe DROP filtering)
63
+ }
64
+
65
+ export interface TableDiff {
66
+ tableName: string;
67
+ addedColumns: ColumnSchema[];
68
+ removedColumns: ColumnSchema[];
69
+ modifiedColumns: ColumnModification[];
70
+ renamedColumns: { from: string; to: string; column: ColumnSchema }[];
71
+ reorderedColumns: { name: string; after: string | null }[]; // MySQL only; null = FIRST
72
+ addedIndexes: IndexSchema[];
73
+ removedIndexes: IndexSchema[];
74
+ addedForeignKeys: ForeignKeySchema[];
75
+ removedForeignKeys: ForeignKeySchema[];
76
+ primaryKeyChanged: boolean;
77
+ newPrimaryKey?: string[];
78
+ oldPrimaryKey?: string[]; // DB's current PK columns (empty = no existing PK)
79
+ oldPrimaryKeyConstraintName?: string; // PG only: constraint name from DB for DROP
80
+ addedEnumTypes: { typeName: string; values: string[] }[]; // PG only
81
+ removedEnumTypes: string[]; // PG only: old enum type names to DROP
82
+ modifiedEnumTypes: {
83
+ typeName: string;
84
+ added: string[];
85
+ removed: string[];
86
+ newValues: string[];
87
+ tableName: string;
88
+ columnName: string;
89
+ }[]; // PG only
90
+ entityColumns?: ColumnSchema[]; // full entity column list for MySQL reorder DDL
91
+ }
92
+
93
+ export interface ColumnModification {
94
+ name: string;
95
+ oldColumn: ColumnSchema;
96
+ newColumn: ColumnSchema;
97
+ typeChanged: boolean;
98
+ nullableChanged: boolean;
99
+ defaultChanged: boolean;
100
+ autoIncrementChanged: boolean;
101
+ onUpdateChanged: boolean;
102
+ }
@@ -0,0 +1,3 @@
1
+ export function getMigrationsDir() {
2
+ return __filename.endsWith('.ts') && process.env.DKSF_FORCE_DIST_MIGRATIONS !== 'true' ? 'src/migrations' : 'dist/src/migrations';
3
+ }