sonamu 0.5.7 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (529) hide show
  1. package/.swcrc.project-default +18 -0
  2. package/bin/cli.js +24 -0
  3. package/dist/ai/agents/agent.d.ts +11 -0
  4. package/dist/ai/agents/agent.d.ts.map +1 -0
  5. package/dist/ai/agents/agent.js +65 -0
  6. package/dist/ai/agents/index.d.ts +3 -0
  7. package/dist/ai/agents/index.d.ts.map +1 -0
  8. package/dist/ai/agents/index.js +4 -0
  9. package/dist/ai/agents/types.d.ts +43 -0
  10. package/dist/ai/agents/types.d.ts.map +1 -0
  11. package/dist/ai/agents/types.js +3 -0
  12. package/dist/ai/index.d.ts +2 -0
  13. package/dist/ai/index.d.ts.map +1 -0
  14. package/dist/ai/index.js +3 -0
  15. package/dist/ai/providers/rtzr/api.d.ts +22 -0
  16. package/dist/ai/providers/rtzr/api.d.ts.map +1 -0
  17. package/dist/ai/providers/rtzr/api.js +28 -0
  18. package/dist/ai/providers/rtzr/error.d.ts +18 -0
  19. package/dist/ai/providers/rtzr/error.d.ts.map +1 -0
  20. package/dist/ai/providers/rtzr/error.js +29 -0
  21. package/dist/ai/providers/rtzr/index.d.ts +5 -0
  22. package/dist/ai/providers/rtzr/index.d.ts.map +1 -0
  23. package/dist/ai/providers/rtzr/index.js +6 -0
  24. package/dist/ai/providers/rtzr/model.d.ts +52 -0
  25. package/dist/ai/providers/rtzr/model.d.ts.map +1 -0
  26. package/dist/ai/providers/rtzr/model.js +137 -0
  27. package/dist/ai/providers/rtzr/options.d.ts +7 -0
  28. package/dist/ai/providers/rtzr/options.d.ts.map +1 -0
  29. package/dist/ai/providers/rtzr/options.js +47 -0
  30. package/dist/ai/providers/rtzr/provider.d.ts +18 -0
  31. package/dist/ai/providers/rtzr/provider.d.ts.map +1 -0
  32. package/dist/ai/providers/rtzr/provider.js +54 -0
  33. package/dist/ai/providers/rtzr/utils.d.ts +19 -0
  34. package/dist/ai/providers/rtzr/utils.d.ts.map +1 -0
  35. package/dist/ai/providers/rtzr/utils.js +88 -0
  36. package/dist/api/base-frame.d.ts +2 -2
  37. package/dist/api/base-frame.d.ts.map +1 -1
  38. package/dist/api/base-frame.js +13 -2
  39. package/dist/api/caster.d.ts.map +1 -1
  40. package/dist/api/caster.js +71 -2
  41. package/dist/api/code-converters.d.ts +58 -14
  42. package/dist/api/code-converters.d.ts.map +1 -1
  43. package/dist/api/code-converters.js +258 -2
  44. package/dist/api/config.d.ts +90 -0
  45. package/dist/api/config.d.ts.map +1 -0
  46. package/dist/api/config.js +25 -0
  47. package/dist/api/context.d.ts +4 -2
  48. package/dist/api/context.d.ts.map +1 -1
  49. package/dist/api/context.js +3 -2
  50. package/dist/api/decorators.d.ts +20 -6
  51. package/dist/api/decorators.d.ts.map +1 -1
  52. package/dist/api/decorators.js +235 -2
  53. package/dist/api/index.d.ts +2 -2
  54. package/dist/api/index.d.ts.map +1 -1
  55. package/dist/api/index.js +9 -2
  56. package/dist/api/sonamu.d.ts +10 -24
  57. package/dist/api/sonamu.d.ts.map +1 -1
  58. package/dist/api/sonamu.js +514 -2
  59. package/dist/api/validator.d.ts +6 -0
  60. package/dist/api/validator.d.ts.map +1 -0
  61. package/dist/api/validator.js +81 -0
  62. package/dist/bin/build-config.d.ts +6 -1
  63. package/dist/bin/build-config.d.ts.map +1 -1
  64. package/dist/bin/build-config.js +15 -2
  65. package/dist/bin/cli.js +519 -2
  66. package/dist/bin/hot-hook-register.d.ts +11 -0
  67. package/dist/bin/hot-hook-register.d.ts.map +1 -0
  68. package/dist/bin/hot-hook-register.js +21 -0
  69. package/dist/bin/loader-register.d.ts +2 -0
  70. package/dist/bin/loader-register.d.ts.map +1 -0
  71. package/dist/bin/loader-register.js +34 -0
  72. package/dist/database/_batch_update.d.ts +5 -3
  73. package/dist/database/_batch_update.d.ts.map +1 -1
  74. package/dist/database/_batch_update.js +95 -2
  75. package/dist/database/base-model.d.ts +96 -10
  76. package/dist/database/base-model.d.ts.map +1 -1
  77. package/dist/database/base-model.js +390 -2
  78. package/dist/database/base-model.types.d.ts +93 -0
  79. package/dist/database/base-model.types.d.ts.map +1 -0
  80. package/dist/database/base-model.types.js +10 -0
  81. package/dist/database/code-generator.d.ts +1 -1
  82. package/dist/database/code-generator.d.ts.map +1 -1
  83. package/dist/database/code-generator.js +54 -2
  84. package/dist/database/db.d.ts +6 -21
  85. package/dist/database/db.d.ts.map +1 -1
  86. package/dist/database/db.js +129 -2
  87. package/dist/database/puri-subset.test-d.js +81 -0
  88. package/dist/database/puri-subset.types.d.ts +123 -0
  89. package/dist/database/puri-subset.types.d.ts.map +1 -0
  90. package/dist/database/puri-subset.types.js +16 -0
  91. package/dist/database/puri-wrapper.d.ts +13 -11
  92. package/dist/database/puri-wrapper.d.ts.map +1 -1
  93. package/dist/database/puri-wrapper.js +109 -2
  94. package/dist/database/puri.d.ts +41 -23
  95. package/dist/database/puri.d.ts.map +1 -1
  96. package/dist/database/puri.js +601 -2
  97. package/dist/database/puri.types.d.ts +25 -6
  98. package/dist/database/puri.types.d.ts.map +1 -1
  99. package/dist/database/puri.types.js +6 -2
  100. package/dist/database/transaction-context.d.ts +1 -1
  101. package/dist/database/transaction-context.d.ts.map +1 -1
  102. package/dist/database/transaction-context.js +14 -2
  103. package/dist/database/upsert-builder.d.ts +9 -3
  104. package/dist/database/upsert-builder.d.ts.map +1 -1
  105. package/dist/database/upsert-builder.js +365 -2
  106. package/dist/entity/entity-manager.d.ts +167 -2
  107. package/dist/entity/entity-manager.d.ts.map +1 -1
  108. package/dist/entity/entity-manager.js +130 -2
  109. package/dist/entity/entity.d.ts +5 -3
  110. package/dist/entity/entity.d.ts.map +1 -1
  111. package/dist/entity/entity.js +750 -2
  112. package/dist/exceptions/error-handler.d.ts +1 -1
  113. package/dist/exceptions/error-handler.d.ts.map +1 -1
  114. package/dist/exceptions/error-handler.js +29 -2
  115. package/dist/exceptions/so-exceptions.d.ts +1 -1
  116. package/dist/exceptions/so-exceptions.d.ts.map +1 -1
  117. package/dist/exceptions/so-exceptions.js +85 -2
  118. package/dist/file-storage/driver.d.ts +1 -1
  119. package/dist/file-storage/driver.d.ts.map +1 -1
  120. package/dist/file-storage/driver.js +79 -2
  121. package/dist/file-storage/file-storage.js +75 -2
  122. package/dist/index.d.ts +18 -9
  123. package/dist/index.d.ts.map +1 -1
  124. package/dist/index.js +34 -2
  125. package/dist/migration/code-generation.d.ts +1 -1
  126. package/dist/migration/code-generation.d.ts.map +1 -1
  127. package/dist/migration/code-generation.js +614 -2
  128. package/dist/migration/migration-set.d.ts +2 -10
  129. package/dist/migration/migration-set.d.ts.map +1 -1
  130. package/dist/migration/migration-set.js +213 -2
  131. package/dist/migration/migrator.d.ts +24 -82
  132. package/dist/migration/migrator.d.ts.map +1 -1
  133. package/dist/migration/migrator.js +330 -2
  134. package/dist/migration/postgresql-schema-reader.d.ts +51 -0
  135. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -0
  136. package/dist/migration/postgresql-schema-reader.js +245 -0
  137. package/dist/migration/types.d.ts +6 -38
  138. package/dist/migration/types.d.ts.map +1 -1
  139. package/dist/migration/types.js +3 -2
  140. package/dist/naite/messaging-types.d.ts +43 -0
  141. package/dist/naite/messaging-types.d.ts.map +1 -0
  142. package/dist/naite/messaging-types.js +7 -0
  143. package/dist/naite/naite-reporter.d.ts +41 -0
  144. package/dist/naite/naite-reporter.d.ts.map +1 -0
  145. package/dist/naite/naite-reporter.js +102 -0
  146. package/dist/naite/naite.d.ts +95 -0
  147. package/dist/naite/naite.d.ts.map +1 -0
  148. package/dist/naite/naite.js +316 -0
  149. package/dist/stream/index.js +3 -2
  150. package/dist/stream/sse.d.ts +2 -2
  151. package/dist/stream/sse.d.ts.map +1 -1
  152. package/dist/stream/sse.js +38 -2
  153. package/dist/syncer/api-parser.d.ts +10 -0
  154. package/dist/syncer/api-parser.d.ts.map +1 -0
  155. package/dist/syncer/api-parser.js +240 -0
  156. package/dist/syncer/checksum.d.ts +21 -0
  157. package/dist/syncer/checksum.d.ts.map +1 -0
  158. package/dist/syncer/checksum.js +98 -0
  159. package/dist/syncer/code-generator.d.ts +20 -0
  160. package/dist/syncer/code-generator.d.ts.map +1 -0
  161. package/dist/syncer/code-generator.js +161 -0
  162. package/dist/syncer/entity-operations.d.ts +17 -0
  163. package/dist/syncer/entity-operations.d.ts.map +1 -0
  164. package/dist/syncer/entity-operations.js +59 -0
  165. package/dist/syncer/file-patterns.d.ts +29 -0
  166. package/dist/syncer/file-patterns.d.ts.map +1 -0
  167. package/dist/syncer/file-patterns.js +38 -0
  168. package/dist/syncer/index.d.ts +6 -0
  169. package/dist/syncer/index.d.ts.map +1 -1
  170. package/dist/syncer/index.js +9 -2
  171. package/dist/syncer/module-loader.d.ts +35 -0
  172. package/dist/syncer/module-loader.d.ts.map +1 -0
  173. package/dist/syncer/module-loader.js +87 -0
  174. package/dist/syncer/syncer.d.ts +98 -106
  175. package/dist/syncer/syncer.d.ts.map +1 -1
  176. package/dist/syncer/syncer.js +422 -2
  177. package/dist/template/entity-converter.d.ts +14 -0
  178. package/dist/template/entity-converter.d.ts.map +1 -0
  179. package/dist/template/entity-converter.js +108 -0
  180. package/dist/template/helpers.d.ts +23 -0
  181. package/dist/template/helpers.d.ts.map +1 -0
  182. package/dist/template/helpers.js +64 -0
  183. package/dist/{templates → template/implementations}/entity.template.d.ts +3 -3
  184. package/dist/template/implementations/entity.template.d.ts.map +1 -0
  185. package/dist/template/implementations/entity.template.js +86 -0
  186. package/dist/{templates → template/implementations}/generated.template.d.ts +3 -4
  187. package/dist/template/implementations/generated.template.d.ts.map +1 -0
  188. package/dist/template/implementations/generated.template.js +249 -0
  189. package/dist/{templates → template/implementations}/generated_http.template.d.ts +3 -4
  190. package/dist/template/implementations/generated_http.template.d.ts.map +1 -0
  191. package/dist/template/implementations/generated_http.template.js +131 -0
  192. package/dist/{templates → template/implementations}/generated_sso.template.d.ts +4 -5
  193. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -0
  194. package/dist/template/implementations/generated_sso.template.js +134 -0
  195. package/dist/{templates → template/implementations}/init_types.template.d.ts +3 -3
  196. package/dist/template/implementations/init_types.template.d.ts.map +1 -0
  197. package/dist/template/implementations/init_types.template.js +38 -0
  198. package/dist/template/implementations/model.template.d.ts +17 -0
  199. package/dist/template/implementations/model.template.d.ts.map +1 -0
  200. package/dist/template/implementations/model.template.js +181 -0
  201. package/dist/{templates → template/implementations}/model_test.template.d.ts +3 -3
  202. package/dist/template/implementations/model_test.template.d.ts.map +1 -0
  203. package/dist/template/implementations/model_test.template.js +35 -0
  204. package/dist/{templates → template/implementations}/service.template.d.ts +6 -6
  205. package/dist/template/implementations/service.template.d.ts.map +1 -0
  206. package/dist/template/implementations/service.template.js +201 -0
  207. package/dist/{templates → template/implementations}/view_enums_buttonset.template.d.ts +3 -3
  208. package/dist/template/implementations/view_enums_buttonset.template.d.ts.map +1 -0
  209. package/dist/template/implementations/view_enums_buttonset.template.js +31 -0
  210. package/dist/{templates → template/implementations}/view_enums_dropdown.template.d.ts +3 -4
  211. package/dist/template/implementations/view_enums_dropdown.template.d.ts.map +1 -0
  212. package/dist/template/implementations/view_enums_dropdown.template.js +50 -0
  213. package/dist/{templates → template/implementations}/view_enums_select.template.d.ts +3 -3
  214. package/dist/template/implementations/view_enums_select.template.d.ts.map +1 -0
  215. package/dist/template/implementations/view_enums_select.template.js +55 -0
  216. package/dist/{templates → template/implementations}/view_form.template.d.ts +5 -5
  217. package/dist/template/implementations/view_form.template.d.ts.map +1 -0
  218. package/dist/template/implementations/view_form.template.js +337 -0
  219. package/dist/{templates → template/implementations}/view_id_all_select.template.d.ts +3 -3
  220. package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -0
  221. package/dist/template/implementations/view_id_all_select.template.js +31 -0
  222. package/dist/{templates → template/implementations}/view_id_async_select.template.d.ts +3 -3
  223. package/dist/template/implementations/view_id_async_select.template.d.ts.map +1 -0
  224. package/dist/template/implementations/view_id_async_select.template.js +105 -0
  225. package/dist/{templates → template/implementations}/view_list.template.d.ts +5 -13
  226. package/dist/template/implementations/view_list.template.d.ts.map +1 -0
  227. package/dist/template/implementations/view_list.template.js +475 -0
  228. package/dist/template/implementations/view_list_columns.template.d.ts +17 -0
  229. package/dist/template/implementations/view_list_columns.template.d.ts.map +1 -0
  230. package/dist/template/implementations/view_list_columns.template.js +49 -0
  231. package/dist/{templates → template/implementations}/view_search_input.template.d.ts +3 -3
  232. package/dist/template/implementations/view_search_input.template.d.ts.map +1 -0
  233. package/dist/template/implementations/view_search_input.template.js +64 -0
  234. package/dist/template/index.d.ts +7 -0
  235. package/dist/template/index.d.ts.map +1 -0
  236. package/dist/template/index.js +8 -0
  237. package/dist/template/template-manager.d.ts +56 -0
  238. package/dist/template/template-manager.d.ts.map +1 -0
  239. package/dist/template/template-manager.js +125 -0
  240. package/dist/template/template-types.d.ts +16 -0
  241. package/dist/template/template-types.d.ts.map +1 -0
  242. package/dist/template/template-types.js +7 -0
  243. package/dist/template/template.d.ts +49 -0
  244. package/dist/template/template.d.ts.map +1 -0
  245. package/dist/template/template.js +60 -0
  246. package/dist/template/zod-converter.d.ts +51 -0
  247. package/dist/template/zod-converter.d.ts.map +1 -0
  248. package/dist/template/zod-converter.js +449 -0
  249. package/dist/testing/_relation-graph.d.ts +1 -1
  250. package/dist/testing/_relation-graph.d.ts.map +1 -1
  251. package/dist/testing/_relation-graph.js +89 -2
  252. package/dist/testing/fixture-manager.d.ts +42 -11
  253. package/dist/testing/fixture-manager.d.ts.map +1 -1
  254. package/dist/testing/fixture-manager.js +623 -2
  255. package/dist/types/types.d.ts +747 -143
  256. package/dist/types/types.d.ts.map +1 -1
  257. package/dist/types/types.js +546 -2
  258. package/dist/typings/knex.d.js +3 -2
  259. package/dist/utils/async-utils.d.ts +7 -0
  260. package/dist/utils/async-utils.d.ts.map +1 -1
  261. package/dist/utils/async-utils.js +57 -2
  262. package/dist/utils/console-util.d.ts +2 -0
  263. package/dist/utils/console-util.d.ts.map +1 -0
  264. package/dist/utils/console-util.js +6 -0
  265. package/dist/utils/controller.d.ts +1 -0
  266. package/dist/utils/controller.d.ts.map +1 -1
  267. package/dist/utils/controller.js +29 -2
  268. package/dist/utils/esm-utils.d.ts +39 -0
  269. package/dist/utils/esm-utils.d.ts.map +1 -0
  270. package/dist/utils/esm-utils.js +49 -0
  271. package/dist/utils/formatter.d.ts +3 -0
  272. package/dist/utils/formatter.d.ts.map +1 -0
  273. package/dist/utils/formatter.js +110 -0
  274. package/dist/utils/fs-utils.d.ts +1 -1
  275. package/dist/utils/fs-utils.d.ts.map +1 -1
  276. package/dist/utils/fs-utils.js +17 -2
  277. package/dist/utils/lodash-able.d.ts.map +1 -1
  278. package/dist/utils/lodash-able.js +6 -2
  279. package/dist/utils/model.js +22 -2
  280. package/dist/utils/object-utils.d.ts +44 -0
  281. package/dist/utils/object-utils.d.ts.map +1 -0
  282. package/dist/utils/object-utils.js +191 -0
  283. package/dist/utils/path-utils.d.ts +89 -0
  284. package/dist/utils/path-utils.d.ts.map +1 -0
  285. package/dist/utils/path-utils.js +60 -0
  286. package/dist/utils/process-utils.d.ts +13 -0
  287. package/dist/utils/process-utils.d.ts.map +1 -0
  288. package/dist/utils/process-utils.js +36 -0
  289. package/dist/utils/sql-parser.d.ts +5 -1
  290. package/dist/utils/sql-parser.d.ts.map +1 -1
  291. package/dist/utils/sql-parser.js +46 -2
  292. package/dist/utils/type-utils.d.ts +23 -0
  293. package/dist/utils/type-utils.d.ts.map +1 -0
  294. package/dist/utils/type-utils.js +45 -0
  295. package/dist/utils/utils.d.ts +10 -7
  296. package/dist/utils/utils.d.ts.map +1 -1
  297. package/dist/utils/utils.js +72 -2
  298. package/dist/utils/zod-error.d.ts +1 -1
  299. package/dist/utils/zod-error.d.ts.map +1 -1
  300. package/dist/utils/zod-error.js +19 -2
  301. package/package.json +65 -27
  302. package/src/ai/agents/agent.ts +87 -0
  303. package/src/ai/agents/index.ts +2 -0
  304. package/src/ai/agents/types.ts +47 -0
  305. package/src/ai/index.ts +1 -0
  306. package/src/ai/providers/rtzr/api.ts +37 -0
  307. package/src/ai/providers/rtzr/error.ts +34 -0
  308. package/src/ai/providers/rtzr/index.ts +4 -0
  309. package/src/ai/providers/rtzr/model.ts +201 -0
  310. package/src/ai/providers/rtzr/options.ts +49 -0
  311. package/src/ai/providers/rtzr/provider.ts +91 -0
  312. package/src/ai/providers/rtzr/utils.ts +127 -0
  313. package/src/api/base-frame.ts +4 -2
  314. package/src/api/caster.ts +17 -23
  315. package/src/api/code-converters.ts +178 -535
  316. package/src/api/config.ts +125 -0
  317. package/src/api/context.ts +7 -17
  318. package/src/api/decorators.ts +176 -46
  319. package/src/api/index.ts +2 -2
  320. package/src/api/sonamu.ts +190 -167
  321. package/src/api/validator.ts +83 -0
  322. package/src/bin/build-config.ts +8 -1
  323. package/src/bin/cli.ts +258 -124
  324. package/src/bin/hot-hook-register.ts +22 -0
  325. package/src/bin/loader-register.ts +38 -0
  326. package/src/database/_batch_update.ts +46 -31
  327. package/src/database/base-model.ts +390 -182
  328. package/src/database/base-model.types.ts +155 -0
  329. package/src/database/code-generator.ts +13 -32
  330. package/src/database/db.ts +40 -96
  331. package/src/database/puri-subset.test-d.ts +471 -0
  332. package/src/database/puri-subset.types.ts +195 -0
  333. package/src/database/puri-wrapper.ts +58 -67
  334. package/src/database/puri.ts +229 -148
  335. package/src/database/puri.types.ts +76 -30
  336. package/src/database/transaction-context.ts +1 -1
  337. package/src/database/upsert-builder.ts +262 -132
  338. package/src/entity/entity-manager.ts +48 -36
  339. package/src/entity/entity.ts +330 -248
  340. package/src/exceptions/error-handler.ts +3 -3
  341. package/src/exceptions/so-exceptions.ts +11 -11
  342. package/src/file-storage/driver.ts +5 -5
  343. package/src/file-storage/file-storage.ts +2 -2
  344. package/src/index.ts +18 -10
  345. package/src/migration/code-generation.ts +185 -172
  346. package/src/migration/migration-set.ts +80 -293
  347. package/src/migration/migrator.ts +199 -571
  348. package/src/migration/mysql-schema-reader.ts.txt +272 -0
  349. package/src/migration/postgresql-schema-reader.ts +310 -0
  350. package/src/migration/types.ts +6 -39
  351. package/src/naite/messaging-types.ts +51 -0
  352. package/src/naite/naite-reporter.ts +128 -0
  353. package/src/naite/naite.ts +415 -0
  354. package/src/shared/web.shared.ts.txt +20 -24
  355. package/src/stream/sse.ts +5 -5
  356. package/src/syncer/api-parser.ts +282 -0
  357. package/src/syncer/checksum.ts +140 -0
  358. package/src/syncer/code-generator.ts +198 -0
  359. package/src/syncer/entity-operations.ts +65 -0
  360. package/src/syncer/file-patterns.ts +56 -0
  361. package/src/syncer/index.ts +6 -0
  362. package/src/syncer/module-loader.ts +128 -0
  363. package/src/syncer/syncer.ts +389 -1453
  364. package/src/template/entity-converter.ts +114 -0
  365. package/src/template/helpers.ts +81 -0
  366. package/src/{templates → template/implementations}/entity.template.ts +7 -7
  367. package/src/{templates → template/implementations}/generated.template.ts +101 -101
  368. package/src/{templates → template/implementations}/generated_http.template.ts +27 -57
  369. package/src/template/implementations/generated_sso.template.ts +151 -0
  370. package/src/{templates → template/implementations}/init_types.template.ts +5 -7
  371. package/src/{templates → template/implementations}/model.template.ts +52 -43
  372. package/src/{templates → template/implementations}/model_test.template.ts +5 -5
  373. package/src/{templates → template/implementations}/service.template.ts +66 -82
  374. package/src/{templates → template/implementations}/view_enums_buttonset.template.ts +3 -3
  375. package/src/{templates → template/implementations}/view_enums_dropdown.template.ts +4 -20
  376. package/src/{templates → template/implementations}/view_enums_select.template.ts +4 -4
  377. package/src/{templates → template/implementations}/view_form.template.ts +40 -83
  378. package/src/{templates → template/implementations}/view_id_all_select.template.ts +3 -3
  379. package/src/{templates → template/implementations}/view_id_async_select.template.ts +10 -24
  380. package/src/{templates → template/implementations}/view_list.template.ts +60 -152
  381. package/src/{templates → template/implementations}/view_list_columns.template.ts +5 -11
  382. package/src/{templates → template/implementations}/view_search_input.template.ts +3 -3
  383. package/src/template/index.ts +6 -0
  384. package/src/template/template-manager.ts +166 -0
  385. package/src/template/template-types.ts +16 -0
  386. package/src/template/template.ts +105 -0
  387. package/src/template/zod-converter.ts +525 -0
  388. package/src/testing/_relation-graph.ts +18 -11
  389. package/src/testing/fixture-manager.ts +472 -359
  390. package/src/types/types.ts +553 -308
  391. package/src/typings/knex.d.ts +7 -9
  392. package/src/utils/async-utils.ts +23 -10
  393. package/src/utils/console-util.ts +4 -0
  394. package/src/utils/controller.ts +3 -0
  395. package/src/utils/esm-utils.ts +59 -0
  396. package/src/utils/formatter.ts +109 -0
  397. package/src/utils/fs-utils.ts +1 -1
  398. package/src/utils/lodash-able.ts +1 -4
  399. package/src/utils/object-utils.ts +217 -0
  400. package/src/utils/path-utils.ts +99 -0
  401. package/src/utils/process-utils.ts +46 -0
  402. package/src/utils/sql-parser.ts +23 -5
  403. package/src/utils/type-utils.ts +83 -0
  404. package/src/utils/utils.ts +66 -43
  405. package/src/utils/zod-error.ts +3 -4
  406. package/dist/api/base-frame.js.map +0 -1
  407. package/dist/api/caster.js.map +0 -1
  408. package/dist/api/code-converters.js.map +0 -1
  409. package/dist/api/context.js.map +0 -1
  410. package/dist/api/decorators.js.map +0 -1
  411. package/dist/api/index.js.map +0 -1
  412. package/dist/api/sonamu.js.map +0 -1
  413. package/dist/bin/build-config.js.map +0 -1
  414. package/dist/bin/cli-wrapper.d.ts +0 -3
  415. package/dist/bin/cli-wrapper.d.ts.map +0 -1
  416. package/dist/bin/cli-wrapper.js +0 -3
  417. package/dist/bin/cli-wrapper.js.map +0 -1
  418. package/dist/bin/cli.js.map +0 -1
  419. package/dist/database/_batch_update.js.map +0 -1
  420. package/dist/database/base-model.js.map +0 -1
  421. package/dist/database/code-generator.js.map +0 -1
  422. package/dist/database/db.js.map +0 -1
  423. package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts +0 -2
  424. package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts.map +0 -1
  425. package/dist/database/knex-plugins/knex-on-duplicate-update.js +0 -2
  426. package/dist/database/knex-plugins/knex-on-duplicate-update.js.map +0 -1
  427. package/dist/database/puri-wrapper.js.map +0 -1
  428. package/dist/database/puri.js.map +0 -1
  429. package/dist/database/puri.types.js.map +0 -1
  430. package/dist/database/transaction-context.js.map +0 -1
  431. package/dist/database/upsert-builder.js.map +0 -1
  432. package/dist/entity/entity-manager.js.map +0 -1
  433. package/dist/entity/entity-utils.d.ts +0 -61
  434. package/dist/entity/entity-utils.d.ts.map +0 -1
  435. package/dist/entity/entity-utils.js +0 -2
  436. package/dist/entity/entity-utils.js.map +0 -1
  437. package/dist/entity/entity.js.map +0 -1
  438. package/dist/exceptions/error-handler.js.map +0 -1
  439. package/dist/exceptions/so-exceptions.js.map +0 -1
  440. package/dist/file-storage/driver.js.map +0 -1
  441. package/dist/file-storage/file-storage.js.map +0 -1
  442. package/dist/index.js.map +0 -1
  443. package/dist/migration/code-generation.js.map +0 -1
  444. package/dist/migration/migration-set.js.map +0 -1
  445. package/dist/migration/migrator.js.map +0 -1
  446. package/dist/migration/types.js.map +0 -1
  447. package/dist/stream/index.js.map +0 -1
  448. package/dist/stream/sse.js.map +0 -1
  449. package/dist/syncer/index.js.map +0 -1
  450. package/dist/syncer/syncer.js.map +0 -1
  451. package/dist/templates/base-template.d.ts +0 -13
  452. package/dist/templates/base-template.d.ts.map +0 -1
  453. package/dist/templates/base-template.js +0 -2
  454. package/dist/templates/base-template.js.map +0 -1
  455. package/dist/templates/entity.template.d.ts.map +0 -1
  456. package/dist/templates/entity.template.js +0 -2
  457. package/dist/templates/entity.template.js.map +0 -1
  458. package/dist/templates/generated.template.d.ts.map +0 -1
  459. package/dist/templates/generated.template.js +0 -2
  460. package/dist/templates/generated.template.js.map +0 -1
  461. package/dist/templates/generated_http.template.d.ts.map +0 -1
  462. package/dist/templates/generated_http.template.js +0 -2
  463. package/dist/templates/generated_http.template.js.map +0 -1
  464. package/dist/templates/generated_sso.template.d.ts.map +0 -1
  465. package/dist/templates/generated_sso.template.js +0 -2
  466. package/dist/templates/generated_sso.template.js.map +0 -1
  467. package/dist/templates/index.d.ts +0 -2
  468. package/dist/templates/index.d.ts.map +0 -1
  469. package/dist/templates/index.js +0 -2
  470. package/dist/templates/index.js.map +0 -1
  471. package/dist/templates/init_types.template.d.ts.map +0 -1
  472. package/dist/templates/init_types.template.js +0 -2
  473. package/dist/templates/init_types.template.js.map +0 -1
  474. package/dist/templates/model.template.d.ts +0 -17
  475. package/dist/templates/model.template.d.ts.map +0 -1
  476. package/dist/templates/model.template.js +0 -2
  477. package/dist/templates/model.template.js.map +0 -1
  478. package/dist/templates/model_test.template.d.ts.map +0 -1
  479. package/dist/templates/model_test.template.js +0 -2
  480. package/dist/templates/model_test.template.js.map +0 -1
  481. package/dist/templates/service.template.d.ts.map +0 -1
  482. package/dist/templates/service.template.js +0 -2
  483. package/dist/templates/service.template.js.map +0 -1
  484. package/dist/templates/view_enums_buttonset.template.d.ts.map +0 -1
  485. package/dist/templates/view_enums_buttonset.template.js +0 -2
  486. package/dist/templates/view_enums_buttonset.template.js.map +0 -1
  487. package/dist/templates/view_enums_dropdown.template.d.ts.map +0 -1
  488. package/dist/templates/view_enums_dropdown.template.js +0 -2
  489. package/dist/templates/view_enums_dropdown.template.js.map +0 -1
  490. package/dist/templates/view_enums_select.template.d.ts.map +0 -1
  491. package/dist/templates/view_enums_select.template.js +0 -2
  492. package/dist/templates/view_enums_select.template.js.map +0 -1
  493. package/dist/templates/view_form.template.d.ts.map +0 -1
  494. package/dist/templates/view_form.template.js +0 -2
  495. package/dist/templates/view_form.template.js.map +0 -1
  496. package/dist/templates/view_id_all_select.template.d.ts.map +0 -1
  497. package/dist/templates/view_id_all_select.template.js +0 -2
  498. package/dist/templates/view_id_all_select.template.js.map +0 -1
  499. package/dist/templates/view_id_async_select.template.d.ts.map +0 -1
  500. package/dist/templates/view_id_async_select.template.js +0 -2
  501. package/dist/templates/view_id_async_select.template.js.map +0 -1
  502. package/dist/templates/view_list.template.d.ts.map +0 -1
  503. package/dist/templates/view_list.template.js +0 -2
  504. package/dist/templates/view_list.template.js.map +0 -1
  505. package/dist/templates/view_list_columns.template.d.ts +0 -17
  506. package/dist/templates/view_list_columns.template.d.ts.map +0 -1
  507. package/dist/templates/view_list_columns.template.js +0 -2
  508. package/dist/templates/view_list_columns.template.js.map +0 -1
  509. package/dist/templates/view_search_input.template.d.ts.map +0 -1
  510. package/dist/templates/view_search_input.template.js +0 -2
  511. package/dist/templates/view_search_input.template.js.map +0 -1
  512. package/dist/testing/_relation-graph.js.map +0 -1
  513. package/dist/testing/fixture-manager.js.map +0 -1
  514. package/dist/types/types.js.map +0 -1
  515. package/dist/typings/knex.d.js.map +0 -1
  516. package/dist/utils/async-utils.js.map +0 -1
  517. package/dist/utils/controller.js.map +0 -1
  518. package/dist/utils/fs-utils.js.map +0 -1
  519. package/dist/utils/lodash-able.js.map +0 -1
  520. package/dist/utils/model.js.map +0 -1
  521. package/dist/utils/sql-parser.js.map +0 -1
  522. package/dist/utils/utils.js.map +0 -1
  523. package/dist/utils/zod-error.js.map +0 -1
  524. package/src/bin/cli-wrapper.ts +0 -75
  525. package/src/database/knex-plugins/knex-on-duplicate-update.ts +0 -45
  526. package/src/entity/entity-utils.ts +0 -291
  527. package/src/templates/base-template.ts +0 -19
  528. package/src/templates/generated_sso.template.ts +0 -138
  529. package/src/templates/index.ts +0 -1
@@ -0,0 +1,83 @@
1
+ export const RESERVED_KEYWORDS = new Set([
2
+ "abstract",
3
+ "arguments",
4
+ "async",
5
+ "await",
6
+ "boolean",
7
+ "break",
8
+ "byte",
9
+ "case",
10
+ "catch",
11
+ "char",
12
+ "class",
13
+ "const",
14
+ "continue",
15
+ "debugger",
16
+ "default",
17
+ "delete",
18
+ "do",
19
+ "double",
20
+ "else",
21
+ "enum",
22
+ "eval",
23
+ "export",
24
+ "extends",
25
+ "false",
26
+ "final",
27
+ "finally",
28
+ "float",
29
+ "for",
30
+ "function",
31
+ "goto",
32
+ "if",
33
+ "implements",
34
+ "import",
35
+ "in",
36
+ "instanceof",
37
+ "int",
38
+ "interface",
39
+ "let",
40
+ "long",
41
+ "native",
42
+ "new",
43
+ "null",
44
+ "package",
45
+ "private",
46
+ "protected",
47
+ "public",
48
+ "return",
49
+ "short",
50
+ "static",
51
+ "super",
52
+ "switch",
53
+ "synchronized",
54
+ "this",
55
+ "throw",
56
+ "throws",
57
+ "transient",
58
+ "true",
59
+ "try",
60
+ "typeof",
61
+ "using",
62
+ "var",
63
+ "void",
64
+ "volatile",
65
+ "while",
66
+ "with",
67
+ "yield",
68
+ ]);
69
+
70
+ export class ApiValidationError extends Error {
71
+ constructor(message: string) {
72
+ super(`[Sonamu API Validation] ${message}`);
73
+ this.name = "ApiValidationError";
74
+ }
75
+ }
76
+
77
+ export function validateMethodName(methodName: string) {
78
+ if (RESERVED_KEYWORDS.has(methodName)) {
79
+ throw new ApiValidationError(
80
+ `Method name ${methodName} is a reserved keyword. Please choose a different name.`,
81
+ );
82
+ }
83
+ }
@@ -1,3 +1,8 @@
1
+ /**
2
+ * 소스 코드가 담길 디렉토리 경로
3
+ */
4
+ export const SRC_DIR = "src";
5
+
1
6
  /**
2
7
  * 빌드 결과물이 담길 디렉토리 경로
3
8
  */
@@ -5,8 +10,10 @@ export const BUILD_DIR = "dist";
5
10
 
6
11
  /**
7
12
  * SWC 빌드 명령어
13
+ * .swcrc 설정 사용
8
14
  */
9
- export const SWC_BUILD_COMMAND = `swc src -d ${BUILD_DIR} --strip-leading-paths --source-maps -C module.type=commonjs -C jsc.parser.syntax=typescript -C jsc.parser.decorators=true -C jsc.target=es5`;
15
+ export const SWC_BUILD_COMMAND = (configFilePath: string) =>
16
+ `swc ${SRC_DIR} -d ${BUILD_DIR} --config-file ${configFilePath} --strip-leading-paths`;
10
17
 
11
18
  /**
12
19
  * TSC 타입 체크 명령어
package/src/bin/cli.ts CHANGED
@@ -1,27 +1,29 @@
1
1
  import chalk from "chalk";
2
2
  import dotenv from "dotenv";
3
+
3
4
  dotenv.config();
4
5
 
6
+ import { execSync, spawn } from "child_process";
7
+ import { mkdir, readdir, rm, writeFile } from "fs/promises";
8
+ import knex, { type Knex } from "knex";
9
+ import { createRequire } from "module";
5
10
  import path from "path";
6
- import { tsicli } from "tsicli";
7
- import { execSync } from "child_process";
8
- import { mkdir, readdir, readFile, writeFile } from "fs/promises";
9
- import { exists } from "../utils/fs-utils";
10
11
  import process from "process";
12
+ import { tsicli } from "tsicli";
11
13
  import { Sonamu } from "../api";
12
- import knex, { Knex } from "knex";
13
- import { findApiRootPath } from "../utils/utils";
14
+ import type { SonamuDBConfig } from "../database/db";
14
15
  import { EntityManager } from "../entity/entity-manager";
15
16
  import { Migrator } from "../migration/migrator";
16
17
  import { FixtureManager } from "../testing/fixture-manager";
17
- // import { SWC_BUILD_COMMAND } from "./build-config";
18
- import { NodemonSettings } from "nodemon";
18
+ import { exists } from "../utils/fs-utils";
19
+ import { findApiRootPath } from "../utils/utils";
20
+ import { BUILD_DIR, SWC_BUILD_COMMAND, TSC_TYPE_CHECK_COMMAND } from "./build-config";
19
21
 
20
22
  let migrator: Migrator;
21
23
 
22
24
  async function bootstrap() {
23
- // dev:serve 명령어가 아닌 경우에만 Sonamu 초기화
24
- if (process.argv[2] !== "dev:serve") {
25
+ const notToInit = ["dev", "build", "start"].includes(process.argv[2] ?? "");
26
+ if (!notToInit) {
25
27
  await Sonamu.init(false, false);
26
28
  }
27
29
 
@@ -56,16 +58,14 @@ async function bootstrap() {
56
58
  ["scaffold", "view_list", "#entityId"],
57
59
  ["scaffold", "view_form", "#entityId"],
58
60
  ["ui"],
59
- ["dev:serve"],
60
- ["serve"],
61
+ ["sync"],
62
+ ["dev"],
63
+ ["build"],
64
+ ["start"],
61
65
  ],
62
66
  runners: {
63
- migrate_run,
64
- migrate_check,
65
- migrate_rollback,
66
- migrate_clear,
67
- migrate_reset,
68
67
  migrate_status,
68
+ migrate_run,
69
69
  fixture_init,
70
70
  fixture_import,
71
71
  fixture_sync,
@@ -76,70 +76,203 @@ async function bootstrap() {
76
76
  ui,
77
77
  // scaffold_view_list,
78
78
  // scaffold_view_form,
79
- "dev:serve": dev_serve,
80
- serve,
79
+ sync,
80
+ dev,
81
+ build,
82
+ start,
81
83
  },
82
84
  });
83
85
  }
86
+
84
87
  bootstrap().finally(async () => {
85
- if (migrator) {
86
- await migrator.destroy();
87
- }
88
88
  await FixtureManager.destroy();
89
89
  });
90
90
 
91
- async function dev_serve() {
92
- const nodemon = await import("nodemon");
93
-
94
- const nodemonConfig = await (async () => {
95
- const projectNodemonPath = path.join(findApiRootPath(), "nodemon.json");
96
- const hasProjectNodemon = await exists(projectNodemonPath);
91
+ /**
92
+ * pnpm sync 하면 실행되는 함수입니다.
93
+ * 프로젝트를 싱크합니다.
94
+ */
95
+ async function sync() {
96
+ await Sonamu.syncer.sync();
97
+ }
97
98
 
98
- if (hasProjectNodemon) {
99
- return JSON.parse(await readFile(projectNodemonPath, "utf8"));
100
- }
99
+ /**
100
+ * pnpm dev 하면 실행되는 함수입니다.
101
+ * 프로젝트에 대해 HMR 지원하는 개발 서버를 띄워줍니다.
102
+ *
103
+ * TypeScript를 바로 실행할 수 있도록 @sonamu-kit/loader를,
104
+ * HMR을 지원하기 위해 @sonamu-kit/hot-hook을 import하며,
105
+ * 소스맵 지원을 위해 --enable-source-maps 플래그를 포함하여 실행합니다.
106
+ *
107
+ * 이때 @sonamu-kit/loader와 @sonamu-kit/hot-hook는 sonamu가 자체적으로 가지고 있는 dependency입니다.
108
+ * 또한 실행에 사용하는 @sonamu-kit/hot-runner도 마찬가지로 sonamu가 자체적으로 가지고 있는 dependency입니다.
109
+ * 따라서 사용자 프로젝트에서는 이 세 패키지를 직접 설치할 필요가 없습니다.
110
+ *
111
+ * Sonamu.init 없이 호출될 것을 상정하여 구현되었습니다.
112
+ */
113
+ async function dev() {
114
+ const apiRoot = findApiRootPath();
115
+ const entryPoint = "src/index.ts";
116
+
117
+ console.log(chalk.yellow.bold("🚀 Starting Sonamu dev server...\n"));
118
+
119
+ // 이 sonamu 패키지가 dependencies로 가지고 있는 @sonamu-kit/hot-runner의 bin/run.js를 사용합니다.
120
+ // 이 경로(/bin/run.js)는 @sonamu-kit/hot-runner의 package.json의 bin 필드에 명시되어 있는 그것과 같습니다.
121
+ const hotRunnerBinPath = createRequire(import.meta.url).resolve(
122
+ "@sonamu-kit/hot-runner/bin/run.js",
123
+ );
101
124
 
102
- return {
103
- watch: ["src/index.ts"],
104
- ignore: ["dist/**", "**/*.js", "**/*.d.ts"],
105
- exec: [
106
- // SWC_BUILD_COMMAND,
107
- "node --no-warnings -r source-map-support/register -r dotenv/config dist/index.js",
108
- ].join(" && "),
109
- } as NodemonSettings;
110
- })();
111
- nodemon.default(nodemonConfig);
125
+ const serverProcess = spawn(
126
+ process.execPath, // node
127
+ [
128
+ hotRunnerBinPath, // 이렇게 해서 hot-runner를 실행하구요
129
+ "--clear-screen=false", // 이하 hot-runner에게 넘겨줄 인자들입니다.
130
+ "--node-args=--import=sonamu/loader-register", // TypeScript 서포트를 위한 로더,
131
+ "--node-args=--import=sonamu/hot-hook-register", // HMR을 지원하기 위한 hot-hook,
132
+ "--node-args=--enable-source-maps", // 그리고 소스맵 지원을 위한 플래그입니다.
133
+ "--on-key=r:restart:Restart server", // r 누르면 서버 재시작하게 해줘요.
134
+ `--on-key=f:shell(rm ${path.join(apiRoot, "sonamu.lock")}):restart:Force restart`, // f 누르면 sonamu.lock 파일을 지우고 서버 재시작하게 해줘요.
135
+
136
+ "--on-key=enter:shell(echo hi):Key binding test", // enter를 key로 쓸 수 있음을 보이기 위한 테스트입니다.
137
+ "--on-key=ctrl+f ctrl+f:shell(git pull && pnpm install && pnpm --filter sonamu build && echo 'Sonamu is now up-to-date!'):restart:Pull & install & build & restart", // modifier와의 조합, 그리고 두 개의 chord를 사용할 수 있음을 보이기 위한 테스트입니다.
138
+ entryPoint, // 마지막으로 실제 실행할 스크립트의 경로를 넘겨줍니다.
139
+ ],
140
+ {
141
+ cwd: apiRoot,
142
+ stdio: "inherit",
143
+ env: {
144
+ ...process.env,
145
+ NODE_ENV: "development",
146
+ HOT: "yes", // 얘가 있어야 HMR이 활성화됩니다.
147
+ API_ROOT_PATH: apiRoot, // 이 경로가 hot-hook의 루트 디렉토리가 됩니다.
148
+ },
149
+ },
150
+ );
112
151
 
113
- // 프로세스 종료 처리
114
- const cleanup = async () => {
115
- await Sonamu.server?.close();
152
+ // 종료 처리
153
+ const cleanup = () => {
154
+ console.log(chalk.yellow("\n\n👋 Shutting down..."));
155
+ serverProcess.kill("SIGTERM");
116
156
  process.exit(0);
117
157
  };
118
158
 
119
159
  process.on("SIGINT", cleanup);
120
160
  process.on("SIGTERM", cleanup);
121
- process.on("SIGUSR2", cleanup);
161
+
162
+ serverProcess.on("exit", (code) => {
163
+ if (code !== 0) {
164
+ console.error(chalk.red(`❌ Server exited with code ${code}`));
165
+ process.exit(code || 1);
166
+ }
167
+ });
122
168
  }
123
169
 
124
- async function serve() {
125
- const distIndexPath = path.join(Sonamu.apiRootPath, "dist", "index.js");
170
+ /**
171
+ * pnpm build 하면 실행되는 함수입니다.
172
+ * 프로젝트를 빌드합니다.
173
+ *
174
+ * 빌드에 필요한 .swcrc는 프로젝트 루트에서 찾고, 없으면 sonamu가 관리하는 .swcrc.project-default를 사용합니다.
175
+ * sonamu.config.ts는 src에 들어있지 않기 때문에 SWC_BUILD_COMMAND로 빌드되지 않습니다.
176
+ * 따라서 따로 빌드해줍니다.
177
+ *
178
+ * Sonamu.init 없이 호출될 것을 상정하여 구현되었습니다.
179
+ */
180
+ async function build() {
181
+ const apiRoot = findApiRootPath();
182
+
183
+ // 출력 디렉토리를 제거합니다.
184
+ try {
185
+ console.log(chalk.blue("Removing build directory..."));
186
+ if (await exists(BUILD_DIR)) {
187
+ await rm(BUILD_DIR, { recursive: true, force: true });
188
+ }
189
+ } catch (error) {
190
+ console.error(chalk.red("Remove build directory failed."), error);
191
+ process.exit(1);
192
+ }
126
193
 
127
- if (!(await exists(distIndexPath))) {
128
- console.log(
129
- chalk.red("dist/index.js not found. Please build your project first.")
130
- );
194
+ // .swcrc 파일을 지정합니다.
195
+ let swcFilePath = ".swcrc";
196
+ try {
197
+ if (await exists(swcFilePath)) {
198
+ // 사용자 프로젝트에 .swcrc가 있으면 우선으로 사용합니다.
199
+ console.log(chalk.blue("Using .swcrc from project root..."));
200
+ } else {
201
+ // 아니라면 sonamu가 관리하는 .swcrc.project-default를 가져다 씁니다.
202
+ console.log(chalk.blue("Using default .swcrc from sonamu package..."));
203
+ swcFilePath = path.join(import.meta.dirname, "..", "..", ".swcrc.project-default");
204
+ }
205
+ } catch (error) {
206
+ console.error(chalk.red("Setting up swc config file failed."), error);
207
+ process.exit(1);
208
+ }
209
+
210
+ // 소스 디렉토리를 빌드합니다.
211
+ try {
212
+ console.log(chalk.blue("Building with swc..."));
213
+ execSync(SWC_BUILD_COMMAND(swcFilePath), { cwd: apiRoot, stdio: "inherit" });
214
+ } catch (error) {
215
+ console.error(chalk.red("Build failed."), error);
216
+ process.exit(1);
217
+ }
218
+
219
+ // sonamu.config.ts만 따로 빌드합니다.
220
+ // 이 친구는 src에 들어있지 않기 때문에 SWC_BUILD_COMMAND로 빌드되지 않습니다.
221
+ // 따라서 따로 빌드해줍니다.
222
+ try {
223
+ const configPath = path.join(apiRoot, "sonamu.config.ts");
224
+ if (await exists(configPath)) {
225
+ console.log(chalk.blue("Building sonamu.config.ts..."));
226
+ execSync(`swc ${configPath} -o ${BUILD_DIR}/sonamu.config.js`, {
227
+ cwd: apiRoot,
228
+ stdio: "inherit",
229
+ });
230
+ }
231
+ } catch (error) {
232
+ console.error(chalk.red("Building sonamu.config.ts failed."), error);
233
+ process.exit(1);
234
+ }
235
+
236
+ // 마지막에는 타입 체크를 해요.
237
+ try {
238
+ console.log(chalk.blue("Checking types with tsc..."));
239
+ execSync(TSC_TYPE_CHECK_COMMAND, {
240
+ cwd: apiRoot,
241
+ stdio: "inherit",
242
+ });
243
+ } catch (error) {
244
+ console.error(chalk.red("Type check failed."), error);
245
+ process.exit(1);
246
+ }
247
+ }
248
+
249
+ /**
250
+ * pnpm start 하면 실행되는 함수입니다.
251
+ * 빌드된 프로젝트를 실행합니다.
252
+ *
253
+ * 빌드된 결과물(dist 디렉토리의 index.js 엔트리포인트)이 없다면 실행을 중단합니다.
254
+ * 소스맵 지원과 dotenv 지원을 포함하여 실행합니다.
255
+ *
256
+ * Sonamu.init 없이 호출될 것을 상정하여 구현되었습니다.
257
+ */
258
+ async function start() {
259
+ const apiRoot = findApiRootPath();
260
+ const entryPoint = "dist/index.js";
261
+
262
+ if (!(await exists(entryPoint))) {
263
+ console.log(chalk.red(`${entryPoint} not found. Please build your project first.`));
131
264
  console.log(chalk.blue("Run: yarn sonamu build"));
132
265
  return;
133
266
  }
134
267
 
135
268
  const { spawn } = await import("child_process");
136
269
  const serverProcess = spawn(
137
- "node",
138
- ["-r", "source-map-support/register", "-r", "dotenv/config", distIndexPath],
270
+ process.execPath,
271
+ ["--enable-source-maps", "-r", "dotenv/config", entryPoint],
139
272
  {
140
- cwd: Sonamu.apiRootPath,
273
+ cwd: apiRoot,
141
274
  stdio: "inherit",
142
- }
275
+ },
143
276
  );
144
277
 
145
278
  process.on("SIGINT", () => {
@@ -150,9 +283,7 @@ async function serve() {
150
283
 
151
284
  async function setupMigrator() {
152
285
  // migrator
153
- migrator = new Migrator({
154
- mode: "dev",
155
- });
286
+ migrator = new Migrator();
156
287
  }
157
288
 
158
289
  async function setupFixtureManager() {
@@ -162,15 +293,10 @@ async function setupFixtureManager() {
162
293
  async function migrate_run() {
163
294
  await setupMigrator();
164
295
 
165
- await migrator.cleanUpDist();
166
- await migrator.run();
167
- }
168
-
169
- async function migrate_check() {
170
- await setupMigrator();
171
-
172
- await migrator.cleanUpDist();
173
- await migrator.check();
296
+ await migrator.runAction(
297
+ "apply",
298
+ Object.keys(Sonamu.dbConfig) as (keyof SonamuDBConfig)[] /*싹 다!*/,
299
+ );
174
300
  }
175
301
 
176
302
  async function migrate_status() {
@@ -181,24 +307,6 @@ async function migrate_status() {
181
307
  console.log(status);
182
308
  }
183
309
 
184
- async function migrate_rollback() {
185
- await setupMigrator();
186
-
187
- await migrator.rollback();
188
- }
189
-
190
- async function migrate_clear() {
191
- await setupMigrator();
192
-
193
- await migrator.clearPendingList();
194
- }
195
-
196
- async function migrate_reset() {
197
- await setupMigrator();
198
-
199
- await migrator.resetAll();
200
- }
201
-
202
310
  async function fixture_init() {
203
311
  const srcConfig = Sonamu.dbConfig.development_master;
204
312
  const targets = [
@@ -206,23 +314,14 @@ async function fixture_init() {
206
314
  label: "(REMOTE) Fixture DB",
207
315
  config: Sonamu.dbConfig.fixture_remote,
208
316
  },
209
- {
210
- label: "(LOCAL) Fixture DB",
211
- config: Sonamu.dbConfig.fixture_local,
212
- toSkip: (() => {
213
- const remoteConn = Sonamu.dbConfig.fixture_remote
214
- .connection as Knex.ConnectionConfig;
215
- const localConn = Sonamu.dbConfig.fixture_local
216
- .connection as Knex.ConnectionConfig;
217
- return (
218
- remoteConn.host === localConn.host &&
219
- remoteConn.database === localConn.database
220
- );
221
- })(),
222
- },
223
317
  {
224
318
  label: "(LOCAL) Testing DB",
225
319
  config: Sonamu.dbConfig.test,
320
+ toSkip: (() => {
321
+ const remoteConn = Sonamu.dbConfig.fixture_remote.connection as Knex.ConnectionConfig;
322
+ const localConn = Sonamu.dbConfig.test.connection as Knex.ConnectionConfig;
323
+ return remoteConn.host === localConn.host && remoteConn.database === localConn.database;
324
+ })(),
226
325
  },
227
326
  ] as {
228
327
  label: string;
@@ -236,16 +335,16 @@ async function fixture_init() {
236
335
  const srcConn = srcConfig.connection as Knex.ConnectionConfig;
237
336
  const migrationsDump = `/tmp/sonamu-fixture-init-migrations-${Date.now()}.sql`;
238
337
  execSync(
239
- `mysqldump -h${srcConn.host} -u${srcConn.user} -p${srcConn.password} --single-transaction -d --no-create-db --triggers ${srcConn.database} > ${dumpFilename}`
338
+ `mysqldump -h${srcConn.host} -u${srcConn.user} -p${srcConn.password} --single-transaction -d --no-create-db --triggers ${srcConn.database} > ${dumpFilename}`,
240
339
  );
241
340
  const _db = knex(srcConfig);
242
341
  const [[migrations]] = await _db.raw(
243
342
  "SELECT COUNT(*) as count FROM information_schema.tables WHERE table_schema = ? AND table_name = 'knex_migrations'",
244
- [srcConn.database]
343
+ [srcConn.database],
245
344
  );
246
345
  if (migrations.count > 0) {
247
346
  execSync(
248
- `mysqldump -h${srcConn.host} -u${srcConn.user} -p${srcConn.password} --single-transaction --no-create-db --triggers ${srcConn.database} knex_migrations knex_migrations_lock > ${migrationsDump}`
347
+ `mysqldump -h${srcConn.host} -u${srcConn.user} -p${srcConn.password} --single-transaction --no-create-db --triggers ${srcConn.database} knex_migrations knex_migrations_lock > ${migrationsDump}`,
249
348
  );
250
349
  }
251
350
 
@@ -267,9 +366,7 @@ async function fixture_init() {
267
366
  });
268
367
  const [[row]] = await db.raw(`SHOW DATABASES LIKE "${conn.database}"`);
269
368
  if (row) {
270
- console.log(
271
- chalk.yellow(`${label}: Database "${conn.database}" Already exists`)
272
- );
369
+ console.log(chalk.yellow(`${label}: Database "${conn.database}" Already exists`));
273
370
  await db.destroy();
274
371
  continue;
275
372
  }
@@ -312,11 +409,9 @@ async function stub_practice(name: string) {
312
409
  }
313
410
 
314
411
  const filteredSeqs = fileNames
315
- .filter(
316
- (fileName) => fileName.startsWith("p") && fileName.endsWith(".ts")
317
- )
412
+ .filter((fileName) => fileName.startsWith("p") && fileName.endsWith(".ts"))
318
413
  .map((fileName) => {
319
- const [, seqNo] = fileName.match(/^p([0-9]+)\-/) ?? ["0", "0"];
414
+ const [, seqNo] = fileName.match(/^p([0-9]+)-/) ?? ["0", "0"];
320
415
  return parseInt(seqNo);
321
416
  })
322
417
  .sort((a, b) => b - a);
@@ -347,16 +442,16 @@ async function stub_practice(name: string) {
347
442
 
348
443
  execSync(`code ${dstPath}`);
349
444
 
350
- const runCode = `yarn node -r dotenv/config -r source-map-support/register dist/practices/${fileName.replace(
445
+ const runCode = `yarn node -r dotenv/config --enable-source-maps dist/practices/${fileName.replace(
351
446
  ".ts",
352
- ".js"
447
+ ".js",
353
448
  )}`;
354
449
  console.log(`${chalk.blue(runCode)} copied to clipboard.`);
355
450
  execSync(`echo "${runCode}" | pbcopy`);
356
451
  }
357
452
 
358
453
  async function stub_entity(entityId: string) {
359
- await Sonamu.syncer.createEntity({ entityId });
454
+ await Sonamu.syncer.createEntity({ entityId, title: entityId });
360
455
  }
361
456
 
362
457
  async function scaffold_model(entityId: string) {
@@ -373,19 +468,58 @@ async function scaffold_model_test(entityId: string) {
373
468
 
374
469
  async function ui() {
375
470
  try {
376
- type StartServersOptions = {
377
- projectName: string;
378
- apiRootPath: string;
379
- port: number;
471
+ // 사용자 프로젝트의 패키지들 중에서 @sonamu-kit/ui를 찾습니다.
472
+ // 이를 위해서 createRequire를 사용하여 프로젝트 경로 기준으로 resolve합니다.
473
+ const projectRequire = createRequire(path.join(Sonamu.apiRootPath, "package.json"));
474
+ const uiPackagePath = projectRequire.resolve("@sonamu-kit/ui"); // 없으면 여기서 터져요(MODULE_NOT_FOUND)
475
+ const uiNodePath = path.join(path.dirname(uiPackagePath), "run-ui.js");
476
+
477
+ if (!(await exists(uiNodePath))) {
478
+ console.log(
479
+ chalk.red(`UI runner script not found at ${uiNodePath}. Please rebuild @sonamu-kit/ui.`),
480
+ );
481
+ return;
482
+ }
483
+
484
+ // UI를 별도 프로세스로 실행 (hot-hook 활성화)
485
+ const uiProcess = spawn(
486
+ process.execPath,
487
+ [
488
+ "--import",
489
+ "sonamu/loader-register",
490
+ "--import",
491
+ "sonamu/hot-hook-register",
492
+ "--enable-source-maps",
493
+ "--no-warnings",
494
+ uiNodePath,
495
+ ],
496
+ {
497
+ stdio: "inherit",
498
+ env: {
499
+ ...process.env,
500
+ HOT: "yes",
501
+ PROJECT_NAME: Sonamu.config.projectName ?? path.basename(Sonamu.apiRootPath),
502
+ API_ROOT_PATH: Sonamu.apiRootPath,
503
+ UI_PORT: (Sonamu.config.ui?.port ?? 57000).toString(),
504
+ },
505
+ },
506
+ );
507
+
508
+ // 종료 처리
509
+ const cleanup = () => {
510
+ console.log(chalk.yellow("\n\n👋 Shutting down UI server..."));
511
+ uiProcess.kill("SIGTERM");
512
+ process.exit(0);
380
513
  };
381
- const sonamuUI: {
382
- startServers: (options: StartServersOptions) => void;
383
- } = await import("@sonamu-kit/ui" as string);
384
- sonamuUI.startServers({
385
- projectName:
386
- Sonamu.config.projectName ?? path.basename(Sonamu.apiRootPath),
387
- apiRootPath: Sonamu.apiRootPath,
388
- port: Sonamu.config.ui?.port ?? 57000,
514
+
515
+ process.on("SIGINT", cleanup);
516
+ process.on("SIGTERM", cleanup);
517
+
518
+ uiProcess.on("exit", (code) => {
519
+ if (code !== 0) {
520
+ console.error(chalk.red(`❌ UI server exited with code ${code}`));
521
+ process.exit(code || 1);
522
+ }
389
523
  });
390
524
  } catch (e: unknown) {
391
525
  if (e instanceof Error && e.message.includes("isn't declared")) {
@@ -0,0 +1,22 @@
1
+ /**
2
+ * hot-hook 초기화하는 모듈입니다.
3
+ *
4
+ * 이 파일은 --import 플래그로 프로세스 시작 시 로드되어야 합니다.
5
+ *
6
+ * 환경변수:
7
+ * - API_ROOT_PATH: 사용자 프로젝트의 API 루트 경로
8
+ * - HOT: 'yes'일 때만 hot-hook 활성화
9
+ */
10
+
11
+ if (process.env.HOT === "yes" && process.env.API_ROOT_PATH) {
12
+ const { hot } = await import("@sonamu-kit/hot-hook");
13
+
14
+ await hot.init({
15
+ rootDirectory: process.env.API_ROOT_PATH, // 이 친구가 프로젝트 API 경로로 잘 설정되어야 아래 바운더리가 작동합니다.
16
+ boundaries: [`./src/**/*.ts`], // 프로젝트의 이 친구들이 바운더리가 됩니다.
17
+ });
18
+
19
+ console.log("🔥 Hot-hook initialized");
20
+ }
21
+
22
+ export {};
@@ -0,0 +1,38 @@
1
+ import { register } from "node:module";
2
+ import * as path from "node:path";
3
+ import { exists } from "../utils/fs-utils.js";
4
+ import { findApiRootPath } from "../utils/utils.js";
5
+
6
+ /**
7
+ * @sonamu-kit/loader/loader를 등록하는 스크립트입니다.
8
+ * 이 스크립트는 sonamu cli로 dev 실행할 때 --import로 실행됩니다.
9
+ */
10
+ async function setupSwcConfig() {
11
+ try {
12
+ const apiRoot = findApiRootPath();
13
+
14
+ // 프로젝트 루트에서 .swcrc 찾기
15
+ const projectSwcrcPath = path.join(apiRoot, ".swcrc");
16
+ if (await exists(projectSwcrcPath)) {
17
+ // 사용자 프로젝트에 .swcrc가 있으면 우선으로 사용합니다.
18
+ process.env.SWCRC_PATH = projectSwcrcPath;
19
+ return;
20
+ }
21
+
22
+ // 아니라면 sonamu가 관리하는 .swcrc.project-default를 가져다 씁니다.
23
+ const sonamuSwcrcPath = path.join(import.meta.dirname, "..", "..", ".swcrc.project-default");
24
+ if (await exists(sonamuSwcrcPath)) {
25
+ process.env.SWCRC_PATH = sonamuSwcrcPath;
26
+ return;
27
+ }
28
+ } catch {
29
+ // 환경 변수 설정 실패는 무시 (loader가 기본 설정 사용)
30
+ }
31
+ }
32
+
33
+ // swc 설정 파일 경로를 환경 변수로 설정
34
+ await setupSwcConfig();
35
+
36
+ register("@sonamu-kit/loader/loader", {
37
+ parentURL: import.meta.url,
38
+ });