sonamu 0.10.11 → 0.10.13

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 (519) hide show
  1. package/dist/ai/agents/agent.d.ts +1 -1
  2. package/dist/ai/agents/agent.d.ts.map +1 -1
  3. package/dist/ai/agents/agent.js +5 -6
  4. package/dist/ai/agents/types.d.ts +1 -1
  5. package/dist/ai/agents/types.d.ts.map +1 -1
  6. package/dist/ai/providers/rtzr/api.js +18 -18
  7. package/dist/ai/providers/rtzr/error.d.ts.map +1 -1
  8. package/dist/ai/providers/rtzr/error.js +17 -15
  9. package/dist/ai/providers/rtzr/model.d.ts.map +1 -1
  10. package/dist/ai/providers/rtzr/model.js +3 -2
  11. package/dist/ai/providers/rtzr/options.d.ts.map +1 -1
  12. package/dist/ai/providers/rtzr/options.js +16 -16
  13. package/dist/ai/providers/rtzr/provider.d.ts.map +1 -1
  14. package/dist/ai/providers/rtzr/provider.js +9 -9
  15. package/dist/ai/providers/rtzr/utils.d.ts.map +1 -1
  16. package/dist/ai/providers/rtzr/utils.js +1 -1
  17. package/dist/api/caster.d.ts.map +1 -1
  18. package/dist/api/caster.js +17 -17
  19. package/dist/api/code-converters.d.ts +4 -2
  20. package/dist/api/code-converters.d.ts.map +1 -1
  21. package/dist/api/code-converters.js +100 -19
  22. package/dist/api/config.d.ts +16 -1
  23. package/dist/api/config.d.ts.map +1 -1
  24. package/dist/api/config.js +28 -21
  25. package/dist/api/context.d.ts +2 -2
  26. package/dist/api/context.d.ts.map +1 -1
  27. package/dist/api/context.js +1 -1
  28. package/dist/api/decorators.d.ts.map +1 -1
  29. package/dist/api/decorators.js +18 -11
  30. package/dist/api/http-validator.d.ts +36 -0
  31. package/dist/api/http-validator.d.ts.map +1 -0
  32. package/dist/api/http-validator.js +72 -0
  33. package/dist/api/index.js +6 -4
  34. package/dist/api/sonamu.d.ts +59 -20
  35. package/dist/api/sonamu.d.ts.map +1 -1
  36. package/dist/api/sonamu.js +250 -106
  37. package/dist/api/websocket-helpers.d.ts +7 -5
  38. package/dist/api/websocket-helpers.d.ts.map +1 -1
  39. package/dist/api/websocket-helpers.js +6 -6
  40. package/dist/auth/audit-log/builders.d.ts.map +1 -1
  41. package/dist/auth/audit-log/builders.js +1 -1
  42. package/dist/auth/audit-log/client-ip.d.ts +1 -1
  43. package/dist/auth/audit-log/client-ip.d.ts.map +1 -1
  44. package/dist/auth/audit-log/client-ip.js +4 -2
  45. package/dist/auth/audit-log/events.d.ts +5 -1
  46. package/dist/auth/audit-log/events.d.ts.map +1 -1
  47. package/dist/auth/audit-log/events.js +1 -1
  48. package/dist/auth/audit-log/plugin.d.ts +0 -8
  49. package/dist/auth/audit-log/plugin.d.ts.map +1 -1
  50. package/dist/auth/audit-log/plugin.js +48 -52
  51. package/dist/auth/audit-log-ingestor.d.ts.map +1 -1
  52. package/dist/auth/audit-log-ingestor.js +16 -12
  53. package/dist/auth/auth-generator.d.ts.map +1 -1
  54. package/dist/auth/auth-generator.js +1 -1
  55. package/dist/auth/better-auth-request.d.ts.map +1 -1
  56. package/dist/auth/better-auth-request.js +6 -5
  57. package/dist/auth/knex-adapter.js +1 -1
  58. package/dist/auth/plugins/entity-definitions/index.d.ts +13 -1
  59. package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -1
  60. package/dist/auth/plugins/entity-definitions/index.js +1 -1
  61. package/dist/auth/plugins/wrappers/admin.d.ts +1 -1
  62. package/dist/bin/build-config.d.ts +25 -0
  63. package/dist/bin/build-config.d.ts.map +1 -1
  64. package/dist/bin/build-config.js +105 -2
  65. package/dist/bin/cli.js +133 -29
  66. package/dist/bin/compiler-policy.d.ts +3 -0
  67. package/dist/bin/compiler-policy.d.ts.map +1 -0
  68. package/dist/bin/compiler-policy.js +24 -0
  69. package/dist/bin/fixture.d.ts.map +1 -1
  70. package/dist/bin/fixture.js +5 -3
  71. package/dist/bin/test-command.d.ts +22 -1
  72. package/dist/bin/test-command.d.ts.map +1 -1
  73. package/dist/bin/test-command.js +18 -10
  74. package/dist/bin/ts-loader-registration.d.ts +7 -1
  75. package/dist/bin/ts-loader-registration.d.ts.map +1 -1
  76. package/dist/bin/ts-loader-registration.js +13 -4
  77. package/dist/cache/decorator.d.ts.map +1 -1
  78. package/dist/cache/decorator.js +11 -4
  79. package/dist/compress/compress.d.ts.map +1 -1
  80. package/dist/compress/compress.js +1 -1
  81. package/dist/cone/cone-generator.d.ts +14 -1
  82. package/dist/cone/cone-generator.d.ts.map +1 -1
  83. package/dist/cone/cone-generator.js +13 -9
  84. package/dist/database/_batch_update.js +1 -1
  85. package/dist/database/base-model.d.ts +22 -10
  86. package/dist/database/base-model.d.ts.map +1 -1
  87. package/dist/database/base-model.js +26 -16
  88. package/dist/database/base-model.types.d.ts +15 -3
  89. package/dist/database/base-model.types.d.ts.map +1 -1
  90. package/dist/database/db.d.ts +12 -2
  91. package/dist/database/db.d.ts.map +1 -1
  92. package/dist/database/db.js +10 -7
  93. package/dist/database/knex.d.ts.map +1 -1
  94. package/dist/database/knex.js +17 -14
  95. package/dist/database/puri.d.ts +11 -9
  96. package/dist/database/puri.d.ts.map +1 -1
  97. package/dist/database/puri.js +93 -79
  98. package/dist/database/puri.types.d.ts +21 -21
  99. package/dist/database/puri.types.d.ts.map +1 -1
  100. package/dist/database/puri.types.js +1 -1
  101. package/dist/database/upsert-builder.d.ts +12 -10
  102. package/dist/database/upsert-builder.d.ts.map +1 -1
  103. package/dist/database/upsert-builder.js +20 -12
  104. package/dist/dict/sd.d.ts.map +1 -1
  105. package/dist/dict/sd.js +1 -1
  106. package/dist/dict/sonamu-dictionary.d.ts.map +1 -1
  107. package/dist/dict/sonamu-dictionary.js +1 -1
  108. package/dist/dict/utils.d.ts.map +1 -1
  109. package/dist/dict/utils.js +7 -2
  110. package/dist/entity/entity-manager.d.ts +13 -4
  111. package/dist/entity/entity-manager.d.ts.map +1 -1
  112. package/dist/entity/entity-manager.js +19 -11
  113. package/dist/entity/entity-template-cone.d.ts +73 -5
  114. package/dist/entity/entity-template-cone.d.ts.map +1 -1
  115. package/dist/entity/entity-template-cone.js +4 -2
  116. package/dist/entity/entity.d.ts +6 -2
  117. package/dist/entity/entity.d.ts.map +1 -1
  118. package/dist/entity/entity.js +30 -28
  119. package/dist/env.d.ts +3 -1
  120. package/dist/env.d.ts.map +1 -1
  121. package/dist/env.js +1 -1
  122. package/dist/exceptions/error-handler.d.ts.map +1 -1
  123. package/dist/exceptions/error-handler.js +7 -2
  124. package/dist/exceptions/so-exceptions.d.ts +24 -20
  125. package/dist/exceptions/so-exceptions.d.ts.map +1 -1
  126. package/dist/exceptions/so-exceptions.js +4 -2
  127. package/dist/filter/utils.d.ts +7 -2
  128. package/dist/filter/utils.d.ts.map +1 -1
  129. package/dist/filter/utils.js +8 -6
  130. package/dist/index.d.ts +3 -0
  131. package/dist/index.d.ts.map +1 -1
  132. package/dist/index.js +13 -7
  133. package/dist/logger/configure.d.ts.map +1 -1
  134. package/dist/logger/configure.js +10 -10
  135. package/dist/migration/code-generation.d.ts.map +1 -1
  136. package/dist/migration/code-generation.js +50 -46
  137. package/dist/migration/index-where-predicate.d.ts.map +1 -1
  138. package/dist/migration/index-where-predicate.js +22 -8
  139. package/dist/migration/migration-set.d.ts.map +1 -1
  140. package/dist/migration/migration-set.js +1 -1
  141. package/dist/migration/migrator.d.ts +61 -36
  142. package/dist/migration/migrator.d.ts.map +1 -1
  143. package/dist/migration/migrator.js +276 -167
  144. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  145. package/dist/migration/postgresql-schema-reader.js +51 -36
  146. package/dist/migration/slack-confirm.d.ts.map +1 -1
  147. package/dist/migration/slack-confirm.js +1 -1
  148. package/dist/migration/types.d.ts +54 -0
  149. package/dist/migration/types.d.ts.map +1 -1
  150. package/dist/naite/naite-reporter.js +2 -2
  151. package/dist/naite/naite.d.ts +74 -15
  152. package/dist/naite/naite.d.ts.map +1 -1
  153. package/dist/naite/naite.js +5 -19
  154. package/dist/runtime-type.d.ts +6 -0
  155. package/dist/runtime-type.d.ts.map +1 -0
  156. package/dist/runtime-type.js +26 -0
  157. package/dist/ssr/hmr-opt-out.d.ts +26 -0
  158. package/dist/ssr/hmr-opt-out.d.ts.map +1 -0
  159. package/dist/ssr/hmr-opt-out.js +59 -0
  160. package/dist/ssr/renderer.d.ts.map +1 -1
  161. package/dist/ssr/renderer.js +4 -1
  162. package/dist/storage/base-file.js +14 -14
  163. package/dist/storage/buffered-file.d.ts +2 -2
  164. package/dist/storage/buffered-file.d.ts.map +1 -1
  165. package/dist/storage/buffered-file.js +12 -12
  166. package/dist/storage/s3-driver.d.ts.map +1 -1
  167. package/dist/storage/s3-driver.js +1 -1
  168. package/dist/storage/uploaded-file.d.ts +2 -2
  169. package/dist/storage/uploaded-file.d.ts.map +1 -1
  170. package/dist/storage/uploaded-file.js +8 -8
  171. package/dist/stream/sse.js +11 -11
  172. package/dist/stream/ws-core.d.ts +1 -1
  173. package/dist/stream/ws-core.d.ts.map +1 -1
  174. package/dist/stream/ws-delivery.d.ts +1 -1
  175. package/dist/stream/ws-delivery.d.ts.map +1 -1
  176. package/dist/stream/ws-delivery.js +6 -4
  177. package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
  178. package/dist/stream/ws-local-connection-store.js +4 -2
  179. package/dist/stream/ws-presence-store.js +1 -1
  180. package/dist/stream/ws-registry.d.ts +4 -4
  181. package/dist/stream/ws-registry.d.ts.map +1 -1
  182. package/dist/stream/ws-registry.js +4 -2
  183. package/dist/stream/ws-telemetry.d.ts +16 -12
  184. package/dist/stream/ws-telemetry.d.ts.map +1 -1
  185. package/dist/stream/ws-telemetry.js +22 -18
  186. package/dist/stream/ws.d.ts +18 -12
  187. package/dist/stream/ws.d.ts.map +1 -1
  188. package/dist/stream/ws.js +26 -22
  189. package/dist/syncer/api-parser.js +1 -1
  190. package/dist/syncer/checksum.d.ts.map +1 -1
  191. package/dist/syncer/checksum.js +7 -8
  192. package/dist/syncer/code-generator.d.ts.map +1 -1
  193. package/dist/syncer/code-generator.js +13 -14
  194. package/dist/syncer/entity-operations.d.ts.map +1 -1
  195. package/dist/syncer/entity-operations.js +5 -6
  196. package/dist/syncer/file-copy.d.ts +5 -0
  197. package/dist/syncer/file-copy.d.ts.map +1 -0
  198. package/dist/syncer/file-copy.js +36 -0
  199. package/dist/syncer/file-patterns.d.ts +1 -0
  200. package/dist/syncer/file-patterns.d.ts.map +1 -1
  201. package/dist/syncer/file-patterns.js +5 -2
  202. package/dist/syncer/file-tracking.d.ts.map +1 -1
  203. package/dist/syncer/file-tracking.js +5 -4
  204. package/dist/syncer/filesystem-dependencies.d.ts +15 -0
  205. package/dist/syncer/filesystem-dependencies.d.ts.map +1 -0
  206. package/dist/syncer/filesystem-dependencies.js +53 -0
  207. package/dist/syncer/module-loader.d.ts +1 -1
  208. package/dist/syncer/module-loader.d.ts.map +1 -1
  209. package/dist/syncer/module-loader.js +6 -4
  210. package/dist/syncer/syncer-actions.d.ts +4 -0
  211. package/dist/syncer/syncer-actions.d.ts.map +1 -1
  212. package/dist/syncer/syncer-actions.js +34 -17
  213. package/dist/syncer/syncer.d.ts +17 -6
  214. package/dist/syncer/syncer.d.ts.map +1 -1
  215. package/dist/syncer/syncer.js +71 -29
  216. package/dist/syncer/watcher.d.ts.map +1 -1
  217. package/dist/syncer/watcher.js +3 -3
  218. package/dist/tasks/decorator.d.ts +6 -6
  219. package/dist/tasks/decorator.d.ts.map +1 -1
  220. package/dist/tasks/decorator.js +4 -4
  221. package/dist/tasks/step-wrapper.d.ts +6 -4
  222. package/dist/tasks/step-wrapper.d.ts.map +1 -1
  223. package/dist/tasks/step-wrapper.js +5 -5
  224. package/dist/tasks/workflow-manager.d.ts.map +1 -1
  225. package/dist/tasks/workflow-manager.js +13 -7
  226. package/dist/template/entity-converter.d.ts +1 -1
  227. package/dist/template/entity-converter.d.ts.map +1 -1
  228. package/dist/template/entity-converter.js +2 -2
  229. package/dist/template/helpers.d.ts +8 -6
  230. package/dist/template/helpers.d.ts.map +1 -1
  231. package/dist/template/helpers.js +1 -1
  232. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  233. package/dist/template/implementations/generated.template.js +4 -4
  234. package/dist/template/implementations/generated_http.template.d.ts +7 -4
  235. package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
  236. package/dist/template/implementations/generated_http.template.js +21 -21
  237. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  238. package/dist/template/implementations/generated_sso.template.js +6 -3
  239. package/dist/template/implementations/http_validators.template.d.ts +18 -0
  240. package/dist/template/implementations/http_validators.template.d.ts.map +1 -0
  241. package/dist/template/implementations/http_validators.template.js +127 -0
  242. package/dist/template/implementations/model.template.d.ts.map +1 -1
  243. package/dist/template/implementations/model.template.js +1 -1
  244. package/dist/template/implementations/queries.template.js +1 -1
  245. package/dist/template/implementations/sd.template.d.ts.map +1 -1
  246. package/dist/template/implementations/sd.template.js +79 -39
  247. package/dist/template/implementations/services.template.d.ts.map +1 -1
  248. package/dist/template/implementations/services.template.js +6 -4
  249. package/dist/template/implementations/view_form.template.d.ts +6 -1
  250. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  251. package/dist/template/implementations/view_form.template.js +23 -15
  252. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  253. package/dist/template/implementations/view_list.template.js +11 -6
  254. package/dist/template/template-manager.d.ts.map +1 -1
  255. package/dist/template/template-manager.js +9 -7
  256. package/dist/template/template-types.d.ts +12 -5
  257. package/dist/template/template-types.d.ts.map +1 -1
  258. package/dist/template/template-types.js +1 -1
  259. package/dist/template/template.d.ts +2 -2
  260. package/dist/template/template.d.ts.map +1 -1
  261. package/dist/template/template.js +6 -4
  262. package/dist/template/zod-converter.d.ts +0 -19
  263. package/dist/template/zod-converter.d.ts.map +1 -1
  264. package/dist/template/zod-converter.js +100 -84
  265. package/dist/testing/_relation-graph.d.ts.map +1 -1
  266. package/dist/testing/_relation-graph.js +2 -1
  267. package/dist/testing/bootstrap.d.ts.map +1 -1
  268. package/dist/testing/bootstrap.js +9 -6
  269. package/dist/testing/data-explorer.d.ts +32 -7
  270. package/dist/testing/data-explorer.d.ts.map +1 -1
  271. package/dist/testing/data-explorer.js +77 -31
  272. package/dist/testing/dev-test-routes.d.ts +8 -1
  273. package/dist/testing/dev-test-routes.d.ts.map +1 -1
  274. package/dist/testing/dev-test-routes.js +125 -108
  275. package/dist/testing/dev-vitest-manager.d.ts +54 -8
  276. package/dist/testing/dev-vitest-manager.d.ts.map +1 -1
  277. package/dist/testing/dev-vitest-manager.js +24 -9
  278. package/dist/testing/faker-mappings.d.ts +412 -1
  279. package/dist/testing/faker-mappings.d.ts.map +1 -1
  280. package/dist/testing/faker-mappings.js +1 -1
  281. package/dist/testing/filesystem.d.ts +2 -0
  282. package/dist/testing/filesystem.d.ts.map +1 -0
  283. package/dist/testing/filesystem.js +7 -0
  284. package/dist/testing/fixture-generator.d.ts +25 -8
  285. package/dist/testing/fixture-generator.d.ts.map +1 -1
  286. package/dist/testing/fixture-generator.js +132 -73
  287. package/dist/testing/fixture-loader.d.ts +3 -1
  288. package/dist/testing/fixture-loader.d.ts.map +1 -1
  289. package/dist/testing/fixture-loader.js +1 -20
  290. package/dist/testing/fixture-manager.d.ts +8 -7
  291. package/dist/testing/fixture-manager.d.ts.map +1 -1
  292. package/dist/testing/fixture-manager.js +91 -59
  293. package/dist/testing/global-setup.d.ts.map +1 -1
  294. package/dist/testing/global-setup.js +5 -2
  295. package/dist/testing/index.d.ts +2 -0
  296. package/dist/testing/index.d.ts.map +1 -1
  297. package/dist/testing/index.js +6 -3
  298. package/dist/types/types.d.ts +101 -99
  299. package/dist/types/types.d.ts.map +1 -1
  300. package/dist/types/types.js +234 -225
  301. package/dist/ui/ai-api.d.ts.map +1 -1
  302. package/dist/ui/ai-api.js +1 -1
  303. package/dist/ui/ai-client.d.ts.map +1 -1
  304. package/dist/ui/ai-client.js +28 -18
  305. package/dist/ui/api.d.ts.map +1 -1
  306. package/dist/ui/api.js +146 -210
  307. package/dist/ui/async-route.d.ts +3 -0
  308. package/dist/ui/async-route.d.ts.map +1 -0
  309. package/dist/ui/async-route.js +12 -0
  310. package/dist/ui/cdd-service.d.ts +9 -7
  311. package/dist/ui/cdd-service.d.ts.map +1 -1
  312. package/dist/ui/cdd-service.js +7 -5
  313. package/dist/ui/migrations-api.d.ts +3 -0
  314. package/dist/ui/migrations-api.d.ts.map +1 -0
  315. package/dist/ui/migrations-api.js +215 -0
  316. package/dist/ui-web/assets/index-D3QNH-Dv.css +1 -0
  317. package/dist/ui-web/assets/index-DV1AAq6W.js +178 -0
  318. package/dist/ui-web/index.html +2 -2
  319. package/dist/utils/formatter.d.ts.map +1 -1
  320. package/dist/utils/formatter.js +7 -5
  321. package/dist/utils/fs-utils.d.ts +3 -3
  322. package/dist/utils/fs-utils.d.ts.map +1 -1
  323. package/dist/utils/fs-utils.js +6 -6
  324. package/dist/utils/model.d.ts +3 -5
  325. package/dist/utils/model.d.ts.map +1 -1
  326. package/dist/utils/model.js +1 -1
  327. package/dist/utils/object-utils.d.ts +1 -1
  328. package/dist/utils/object-utils.d.ts.map +1 -1
  329. package/dist/utils/object-utils.js +17 -16
  330. package/dist/utils/process-utils.d.ts.map +1 -1
  331. package/dist/utils/process-utils.js +4 -2
  332. package/dist/utils/runtime-value.d.ts +13 -0
  333. package/dist/utils/runtime-value.d.ts.map +1 -0
  334. package/dist/utils/runtime-value.js +40 -0
  335. package/dist/utils/sql-parser.d.ts +8 -1
  336. package/dist/utils/sql-parser.d.ts.map +1 -1
  337. package/dist/utils/sql-parser.js +6 -3
  338. package/dist/utils/type-utils.d.ts.map +1 -1
  339. package/dist/utils/type-utils.js +10 -8
  340. package/dist/utils/utils.d.ts +2 -2
  341. package/dist/utils/utils.d.ts.map +1 -1
  342. package/dist/utils/utils.js +11 -8
  343. package/dist/utils/zod-error.d.ts.map +1 -1
  344. package/dist/utils/zod-error.js +7 -4
  345. package/dist/vector/chunking.d.ts.map +1 -1
  346. package/dist/vector/chunking.js +1 -1
  347. package/dist/vector/embedding.d.ts.map +1 -1
  348. package/dist/vector/embedding.js +1 -1
  349. package/dist/vector/types.d.ts +3 -2
  350. package/dist/vector/types.d.ts.map +1 -1
  351. package/package.json +11 -7
  352. package/src/ai/agents/agent.ts +5 -5
  353. package/src/ai/agents/types.ts +1 -1
  354. package/src/ai/providers/rtzr/__tests__/model.test.ts +2 -2
  355. package/src/ai/providers/rtzr/error.ts +5 -3
  356. package/src/ai/providers/rtzr/model.ts +3 -2
  357. package/src/ai/providers/rtzr/options.ts +10 -5
  358. package/src/ai/providers/rtzr/provider.ts +10 -10
  359. package/src/ai/providers/rtzr/utils.ts +3 -1
  360. package/src/api/__tests__/config.test.ts +11 -21
  361. package/src/api/__tests__/sonamu.http-validator.test.ts +512 -0
  362. package/src/api/__tests__/sonamu.websocket.test.ts +51 -41
  363. package/src/api/__tests__/zod-compiler-policy.test.ts +95 -0
  364. package/src/api/caster.ts +6 -8
  365. package/src/api/code-converters.ts +136 -36
  366. package/src/api/config.ts +62 -4
  367. package/src/api/context.ts +3 -3
  368. package/src/api/decorators.ts +28 -17
  369. package/src/api/http-validator.ts +149 -0
  370. package/src/api/sonamu.ts +459 -152
  371. package/src/api/websocket-helpers.ts +24 -17
  372. package/src/auth/audit-log/builders.ts +3 -2
  373. package/src/auth/audit-log/client-ip.ts +4 -2
  374. package/src/auth/audit-log/events.ts +15 -1
  375. package/src/auth/audit-log/plugin.ts +129 -200
  376. package/src/auth/audit-log-ingestor.ts +19 -15
  377. package/src/auth/auth-generator.ts +10 -5
  378. package/src/auth/better-auth-request.ts +4 -3
  379. package/src/auth/knex-adapter.ts +8 -2
  380. package/src/auth/plugins/entity-definitions/index.ts +6 -5
  381. package/src/bin/__tests__/http-validator-benchmark.test.ts +94 -0
  382. package/src/bin/__tests__/test-command.test.ts +9 -15
  383. package/src/bin/__tests__/ts-loader-register.test.ts +15 -17
  384. package/src/bin/__tests__/zod-compiler-build.test.ts +307 -0
  385. package/src/bin/build-config.ts +167 -0
  386. package/src/bin/cli.ts +155 -38
  387. package/src/bin/compiler-policy.ts +35 -0
  388. package/src/bin/fixture.ts +14 -3
  389. package/src/bin/test-command.ts +74 -29
  390. package/src/bin/ts-loader-registration.ts +22 -4
  391. package/src/cache/decorator.ts +10 -3
  392. package/src/compress/compress.ts +17 -4
  393. package/src/cone/cone-generator.ts +34 -6
  394. package/src/database/__tests__/db.test.ts +1 -0
  395. package/src/database/__tests__/puri.test.ts +16 -15
  396. package/src/database/__tests__/transaction-scope.test.ts +5 -0
  397. package/src/database/_batch_update.ts +1 -0
  398. package/src/database/base-model.ts +81 -50
  399. package/src/database/base-model.types.ts +6 -6
  400. package/src/database/db.ts +29 -19
  401. package/src/database/knex.ts +30 -17
  402. package/src/database/puri-subset.test-d.ts +17 -0
  403. package/src/database/puri.ts +181 -143
  404. package/src/database/puri.types.test-d.ts +31 -1
  405. package/src/database/puri.types.ts +23 -21
  406. package/src/database/upsert-builder.ts +75 -53
  407. package/src/dict/sd.ts +15 -5
  408. package/src/dict/sonamu-dictionary.ts +6 -6
  409. package/src/dict/utils.ts +9 -1
  410. package/src/entity/entity-manager.ts +26 -9
  411. package/src/entity/entity-template-cone.ts +5 -10
  412. package/src/entity/entity.ts +50 -34
  413. package/src/env.ts +7 -3
  414. package/src/exceptions/error-handler.ts +17 -2
  415. package/src/exceptions/so-exceptions.ts +26 -20
  416. package/src/filter/utils.ts +21 -11
  417. package/src/index.ts +3 -0
  418. package/src/logger/configure.ts +26 -18
  419. package/src/migration/__tests__/migrator.test.ts +50 -57
  420. package/src/migration/code-generation.ts +132 -104
  421. package/src/migration/index-where-predicate.ts +51 -24
  422. package/src/migration/migration-set.ts +11 -5
  423. package/src/migration/migrator.ts +392 -244
  424. package/src/migration/postgresql-schema-reader.ts +52 -47
  425. package/src/migration/slack-confirm.ts +17 -15
  426. package/src/migration/types.ts +57 -0
  427. package/src/naite/naite-reporter.ts +1 -1
  428. package/src/naite/naite.ts +97 -24
  429. package/src/runtime-type.ts +34 -0
  430. package/src/ssr/hmr-opt-out.ts +78 -0
  431. package/src/ssr/renderer.ts +6 -0
  432. package/src/storage/base-file.ts +13 -13
  433. package/src/storage/buffered-file.ts +11 -11
  434. package/src/storage/s3-driver.ts +4 -1
  435. package/src/storage/uploaded-file.ts +8 -8
  436. package/src/stream/__tests__/ws-contracts.test.ts +4 -2
  437. package/src/stream/__tests__/ws-telemetry.test.ts +1 -1
  438. package/src/stream/__tests__/ws.test.ts +30 -6
  439. package/src/stream/sse.ts +12 -11
  440. package/src/stream/ws-core.ts +1 -1
  441. package/src/stream/ws-delivery.ts +16 -7
  442. package/src/stream/ws-local-connection-store.ts +2 -3
  443. package/src/stream/ws-presence-store.ts +6 -1
  444. package/src/stream/ws-registry.ts +16 -7
  445. package/src/stream/ws-telemetry.ts +66 -43
  446. package/src/stream/ws.ts +73 -39
  447. package/src/syncer/__tests__/api-parser.websocket-type-ref.test.ts +3 -2
  448. package/src/syncer/__tests__/http-validator-registry.test.ts +137 -0
  449. package/src/syncer/api-parser.ts +67 -27
  450. package/src/syncer/checksum.ts +17 -11
  451. package/src/syncer/code-generator.ts +25 -17
  452. package/src/syncer/entity-operations.ts +3 -5
  453. package/src/syncer/file-copy.ts +46 -0
  454. package/src/syncer/file-patterns.ts +11 -8
  455. package/src/syncer/file-tracking.ts +3 -4
  456. package/src/syncer/filesystem-dependencies.ts +73 -0
  457. package/src/syncer/module-loader.ts +8 -4
  458. package/src/syncer/syncer-actions.ts +56 -18
  459. package/src/syncer/syncer.ts +116 -43
  460. package/src/syncer/watcher.ts +8 -4
  461. package/src/tasks/decorator.ts +20 -12
  462. package/src/tasks/step-wrapper.ts +19 -9
  463. package/src/tasks/workflow-manager.ts +15 -9
  464. package/src/template/__tests__/http_validators.template.test.ts +160 -0
  465. package/src/template/__tests__/services.template.mutation.test.ts +24 -23
  466. package/src/template/__tests__/services.template.websocket.test.ts +21 -25
  467. package/src/template/entity-converter.ts +5 -2
  468. package/src/template/helpers.ts +8 -9
  469. package/src/template/implementations/generated.template.ts +5 -4
  470. package/src/template/implementations/generated_http.template.ts +61 -15
  471. package/src/template/implementations/generated_sso.template.ts +15 -4
  472. package/src/template/implementations/http_validators.template.ts +175 -0
  473. package/src/template/implementations/model.template.ts +3 -1
  474. package/src/template/implementations/sd.template.ts +81 -41
  475. package/src/template/implementations/services.template.ts +2 -2
  476. package/src/template/implementations/view_form.template.ts +56 -39
  477. package/src/template/implementations/view_list.template.ts +31 -23
  478. package/src/template/template-manager.ts +15 -13
  479. package/src/template/template-types.ts +13 -5
  480. package/src/template/template.ts +4 -3
  481. package/src/template/zod-converter.ts +206 -91
  482. package/src/testing/__tests__/dev-test-routes.test.ts +85 -25
  483. package/src/testing/__tests__/dev-vitest-manager.test.ts +15 -15
  484. package/src/testing/_relation-graph.ts +4 -1
  485. package/src/testing/bootstrap.ts +12 -5
  486. package/src/testing/data-explorer.ts +102 -53
  487. package/src/testing/dev-test-routes.ts +87 -50
  488. package/src/testing/dev-vitest-manager.ts +88 -32
  489. package/src/testing/faker-mappings.ts +2 -2
  490. package/src/testing/filesystem.ts +1 -0
  491. package/src/testing/fixture-generator.ts +191 -131
  492. package/src/testing/fixture-loader.ts +5 -1
  493. package/src/testing/fixture-manager.ts +129 -90
  494. package/src/testing/global-setup.ts +7 -3
  495. package/src/testing/index.ts +5 -0
  496. package/src/types/__tests__/entity-json-schema-search-text.test.ts +9 -3
  497. package/src/types/types.ts +184 -158
  498. package/src/ui/ai-api.ts +9 -7
  499. package/src/ui/ai-client.ts +61 -56
  500. package/src/ui/api.ts +726 -770
  501. package/src/ui/async-route.ts +4 -0
  502. package/src/ui/cdd-service.ts +35 -12
  503. package/src/ui/migrations-api.ts +381 -0
  504. package/src/utils/formatter.ts +7 -3
  505. package/src/utils/fs-utils.ts +5 -5
  506. package/src/utils/model.ts +4 -5
  507. package/src/utils/object-utils.ts +32 -22
  508. package/src/utils/process-utils.ts +4 -1
  509. package/src/utils/runtime-value.ts +43 -0
  510. package/src/utils/sql-parser.ts +13 -6
  511. package/src/utils/type-utils.ts +9 -7
  512. package/src/utils/utils.ts +19 -21
  513. package/src/utils/zod-error.ts +4 -2
  514. package/src/vector/chunking.ts +6 -1
  515. package/src/vector/embedding.ts +2 -1
  516. package/src/vector/types.ts +4 -2
  517. package/tsdown.api.config.ts +5 -2
  518. package/dist/ui-web/assets/index-CJf8uJYf.js +0 -176
  519. package/dist/ui-web/assets/index-GMMIVGja.css +0 -1
@@ -0,0 +1,307 @@
1
+ import { mkdir, mkdtemp, readFile, rm, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { pathToFileURL } from "node:url";
4
+
5
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
6
+
7
+ import { isFunctionValue, isObjectValue } from "../../utils/runtime-value";
8
+ import {
9
+ assertApiZodCompilerBuildOutput,
10
+ assertApiZodCompilerSourceRegistry,
11
+ composeApiZodCompilerBuildConfig,
12
+ createApiZodCompilerBuildWrapper,
13
+ } from "../build-config";
14
+
15
+ const compilerPluginFake = vi.fn();
16
+ const compilerDependencies = {
17
+ async loadCompilerPlugin() {
18
+ return compilerPluginFake;
19
+ },
20
+ };
21
+
22
+ describe("API zod-compiler 빌드 정책", () => {
23
+ const tempRoots: string[] = [];
24
+
25
+ beforeEach(() => {
26
+ compilerPluginFake.mockReset();
27
+ });
28
+
29
+ afterEach(async () => {
30
+ await Promise.all(
31
+ tempRoots.splice(0).map((rootPath) => rm(rootPath, { recursive: true, force: true })),
32
+ );
33
+ });
34
+
35
+ it.each([false, "jit"] as const)(
36
+ "%s 정책은 registry 없이 기존 tsdown 설정을 유지한다",
37
+ async (api) => {
38
+ const baseConfig = {
39
+ entry: ["src/index.ts"],
40
+ plugins: [{ name: "custom" }],
41
+ };
42
+
43
+ expect(
44
+ await composeApiZodCompilerBuildConfig(baseConfig, {
45
+ policy: { api, targets: {} },
46
+ }),
47
+ ).toEqual(baseConfig);
48
+ expect(compilerPluginFake).not.toHaveBeenCalled();
49
+ },
50
+ );
51
+
52
+ it("기본 설정과 사용자 설정에 registry 전용 explicit compact inline plugin을 합성한다", async () => {
53
+ const registryPath = "/project/api/src/application/sonamu.validators.generated.ts";
54
+ const compilerPlugin = { name: "zod-compiler" };
55
+ const customPlugin = { name: "custom" };
56
+ compilerPluginFake.mockReturnValue(compilerPlugin);
57
+
58
+ const defaultConfig = await composeApiZodCompilerBuildConfig(
59
+ { entry: ["src/index.ts"] },
60
+ {
61
+ policy: { api: "aot", targets: {} },
62
+ registryPath,
63
+ },
64
+ compilerDependencies,
65
+ );
66
+ const customConfig = await composeApiZodCompilerBuildConfig(
67
+ { entry: ["src/index.ts"], plugins: [customPlugin] },
68
+ {
69
+ policy: { api: "aot", targets: {} },
70
+ registryPath,
71
+ },
72
+ compilerDependencies,
73
+ );
74
+
75
+ expect(compilerPluginFake).toHaveBeenNthCalledWith(1, {
76
+ codegenMode: "inline",
77
+ include: [registryPath],
78
+ output: "compact",
79
+ schemas: "explicit",
80
+ });
81
+ expect(compilerPluginFake).toHaveBeenNthCalledWith(2, {
82
+ codegenMode: "inline",
83
+ include: [registryPath],
84
+ output: "compact",
85
+ schemas: "explicit",
86
+ });
87
+ expect(defaultConfig.plugins).toEqual([compilerPlugin]);
88
+ expect(customConfig.plugins).toEqual([customPlugin, compilerPlugin]);
89
+ });
90
+
91
+ it("실제 build wrapper가 사용자 object entry와 plugin을 보존하면서 registry entry를 추가한다", async () => {
92
+ const apiRootPath = await mkdtemp(path.join(process.cwd(), ".sonamu-build-wrapper-test-"));
93
+ tempRoots.push(apiRootPath);
94
+ const registryPath = path.join(apiRootPath, "src/application/sonamu.validators.generated.ts");
95
+ const baseConfigPath = path.join(apiRootPath, "tsdown.config.mjs");
96
+ await mkdir(path.dirname(registryPath), { recursive: true });
97
+ await writeFile(
98
+ registryPath,
99
+ `export const fingerprint = "${"a".repeat(64)}";\nexport const validator = compile(schema);\n`,
100
+ );
101
+ await writeFile(
102
+ baseConfigPath,
103
+ `export default { entry: { index: "src/index.ts" }, plugins: [{ name: "custom" }] };\n`,
104
+ );
105
+ const wrapperPath = await createApiZodCompilerBuildWrapper({
106
+ apiRootPath,
107
+ baseConfigPath,
108
+ policy: { api: "aot", targets: {} },
109
+ registryPath,
110
+ });
111
+ const wrapperModule: unknown = await import(`${pathToFileURL(wrapperPath).href}?test=entry`);
112
+ if (
113
+ !isObjectValue(wrapperModule) ||
114
+ wrapperModule === null ||
115
+ !("default" in wrapperModule) ||
116
+ !isFunctionValue(wrapperModule.default)
117
+ ) {
118
+ throw new Error("build wrapper가 default config factory를 내보내지 않았습니다");
119
+ }
120
+ const resolvedConfig: unknown = await wrapperModule.default();
121
+ if (!isObjectValue(resolvedConfig) || resolvedConfig === null) {
122
+ throw new Error("build wrapper가 tsdown config object를 반환하지 않았습니다");
123
+ }
124
+ const entry = "entry" in resolvedConfig ? resolvedConfig.entry : undefined;
125
+ const plugins = "plugins" in resolvedConfig ? resolvedConfig.plugins : undefined;
126
+
127
+ expect(entry).toMatchObject({ index: "src/index.ts" });
128
+ expect(isObjectValue(entry) && entry !== null ? Object.values(entry) : []).toContain(
129
+ registryPath,
130
+ );
131
+ expect(plugins).toEqual([
132
+ { name: "custom" },
133
+ expect.objectContaining({ name: "zod-compiler" }),
134
+ ]);
135
+ });
136
+
137
+ it("entry가 undefined인 사용자 설정은 tsdown 기본 entry와 registry entry를 함께 보존한다", async () => {
138
+ const apiRootPath = await mkdtemp(path.join(process.cwd(), ".sonamu-default-entry-test-"));
139
+ tempRoots.push(apiRootPath);
140
+ const registryPath = path.join(apiRootPath, "src/application/sonamu.validators.generated.ts");
141
+ const baseConfigPath = path.join(apiRootPath, "tsdown.config.mjs");
142
+ await mkdir(path.dirname(registryPath), { recursive: true });
143
+ await writeFile(
144
+ registryPath,
145
+ `export const fingerprint = "${"c".repeat(64)}";\nexport const validator = compile(schema);\n`,
146
+ );
147
+ await writeFile(
148
+ baseConfigPath,
149
+ `export default { entry: undefined, plugins: [{ name: "custom" }] };\n`,
150
+ );
151
+ const wrapperPath = await createApiZodCompilerBuildWrapper({
152
+ apiRootPath,
153
+ baseConfigPath,
154
+ policy: { api: "aot", targets: {} },
155
+ registryPath,
156
+ });
157
+ const wrapperModule: unknown = await import(`${pathToFileURL(wrapperPath).href}?test=default`);
158
+ if (
159
+ !isObjectValue(wrapperModule) ||
160
+ wrapperModule === null ||
161
+ !("default" in wrapperModule) ||
162
+ !isFunctionValue(wrapperModule.default)
163
+ ) {
164
+ throw new Error("build wrapper가 default config factory를 내보내지 않았습니다");
165
+ }
166
+ const resolvedConfig: unknown = await wrapperModule.default();
167
+ if (
168
+ !isObjectValue(resolvedConfig) ||
169
+ resolvedConfig === null ||
170
+ !("entry" in resolvedConfig) ||
171
+ !isObjectValue(resolvedConfig.entry) ||
172
+ resolvedConfig.entry === null
173
+ ) {
174
+ throw new Error("build wrapper가 기본 entry를 포함한 object entry를 반환하지 않았습니다");
175
+ }
176
+
177
+ expect(resolvedConfig.entry).toMatchObject({
178
+ index: "src/index.ts",
179
+ "application/sonamu.validators.generated": registryPath,
180
+ });
181
+ expect("plugins" in resolvedConfig ? resolvedConfig.plugins : undefined).toEqual([
182
+ { name: "custom" },
183
+ expect.objectContaining({ name: "zod-compiler" }),
184
+ ]);
185
+ });
186
+
187
+ it("canonical registry key의 상대 entry는 같은 registry로 해석해 충돌 없이 보존한다", async () => {
188
+ const apiRootPath = await mkdtemp(path.join(process.cwd(), ".sonamu-relative-entry-test-"));
189
+ tempRoots.push(apiRootPath);
190
+ const relativeRegistryPath = "./src/application/sonamu.validators.generated.ts";
191
+ const registryPath = path.join(apiRootPath, "src/application/sonamu.validators.generated.ts");
192
+ const baseConfigPath = path.join(apiRootPath, "tsdown.config.mjs");
193
+ await mkdir(path.dirname(registryPath), { recursive: true });
194
+ await writeFile(
195
+ registryPath,
196
+ `export const fingerprint = "${"b".repeat(64)}";\nexport const validator = compile(schema);\n`,
197
+ );
198
+ await writeFile(
199
+ baseConfigPath,
200
+ [
201
+ "export default {",
202
+ ' entry: { index: "src/index.ts",',
203
+ ` "application/sonamu.validators.generated": ${JSON.stringify(relativeRegistryPath)} },`,
204
+ "};",
205
+ "",
206
+ ].join("\n"),
207
+ );
208
+ const wrapperPath = await createApiZodCompilerBuildWrapper({
209
+ apiRootPath,
210
+ baseConfigPath,
211
+ policy: { api: "aot", targets: {} },
212
+ registryPath,
213
+ });
214
+ const wrapperModule: unknown = await import(`${pathToFileURL(wrapperPath).href}?test=relative`);
215
+ if (
216
+ !isObjectValue(wrapperModule) ||
217
+ wrapperModule === null ||
218
+ !("default" in wrapperModule) ||
219
+ !isFunctionValue(wrapperModule.default)
220
+ ) {
221
+ throw new Error("build wrapper가 default config factory를 내보내지 않았습니다");
222
+ }
223
+ const resolvedConfig: unknown = await wrapperModule.default();
224
+ if (
225
+ !isObjectValue(resolvedConfig) ||
226
+ resolvedConfig === null ||
227
+ !("entry" in resolvedConfig) ||
228
+ !isObjectValue(resolvedConfig.entry) ||
229
+ resolvedConfig.entry === null
230
+ ) {
231
+ throw new Error("build wrapper가 object entry를 반환하지 않았습니다");
232
+ }
233
+
234
+ expect(resolvedConfig.entry).toMatchObject({
235
+ index: "src/index.ts",
236
+ "application/sonamu.validators.generated": relativeRegistryPath,
237
+ });
238
+ });
239
+
240
+ it("REST API가 0개인 AOT registry를 compile 경계 없이 검증하고 wrapper로 내보낸다", async () => {
241
+ const apiRootPath = await mkdtemp(path.join(process.cwd(), ".sonamu-zero-registry-test-"));
242
+ tempRoots.push(apiRootPath);
243
+ const registryPath = path.join(apiRootPath, "src/application/sonamu.validators.generated.ts");
244
+ const baseConfigPath = path.join(apiRootPath, "tsdown.config.mjs");
245
+ await mkdir(path.dirname(registryPath), { recursive: true });
246
+ await writeFile(
247
+ registryPath,
248
+ [
249
+ `export const fingerprint = "${"0".repeat(64)}";`,
250
+ "export const routeIds = {};",
251
+ "export const validators = new Map();",
252
+ "",
253
+ ].join("\n"),
254
+ );
255
+ await writeFile(baseConfigPath, `export default { entry: { index: "src/index.ts" } };\n`);
256
+
257
+ await expect(assertApiZodCompilerSourceRegistry(registryPath)).resolves.toBeUndefined();
258
+ const wrapperPath = await createApiZodCompilerBuildWrapper({
259
+ apiRootPath,
260
+ baseConfigPath,
261
+ policy: { api: "aot", targets: {} },
262
+ registryPath,
263
+ });
264
+
265
+ await expect(readFile(wrapperPath, "utf8")).resolves.toContain(registryPath);
266
+ const registrySource = await readFile(registryPath, "utf8");
267
+ expect(() =>
268
+ assertApiZodCompilerBuildOutput([
269
+ {
270
+ code: registrySource,
271
+ path: registryPath,
272
+ },
273
+ ]),
274
+ ).not.toThrow();
275
+ });
276
+
277
+ it.each([
278
+ {
279
+ code: "export const validator = compile(schema);",
280
+ label: "적용되지 않은 compile 경계",
281
+ },
282
+ {
283
+ code: 'import { parse } from "virtual:zod-compiler/runtime";',
284
+ label: "해석되지 않은 virtual runtime import",
285
+ },
286
+ ])("$label가 남은 AOT 산출물을 거부한다", ({ code }) => {
287
+ expect(() =>
288
+ assertApiZodCompilerBuildOutput([
289
+ {
290
+ code,
291
+ path: "dist/application/sonamu.validators.generated.js",
292
+ },
293
+ ]),
294
+ ).toThrow();
295
+ });
296
+
297
+ it("compile 경계와 virtual import가 제거된 AOT 산출물을 허용한다", () => {
298
+ expect(() =>
299
+ assertApiZodCompilerBuildOutput([
300
+ {
301
+ code: "export const validator = { parse(input) { return input; } };",
302
+ path: "dist/application/sonamu.validators.generated.js",
303
+ },
304
+ ]),
305
+ ).not.toThrow();
306
+ });
307
+ });
@@ -1,3 +1,12 @@
1
+ import { readFile, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { pathToFileURL } from "node:url";
4
+
5
+ import { type UserConfig } from "tsdown";
6
+
7
+ import { type NormalizedZodCompilerPolicy } from "../api/config";
8
+ import { exists } from "../utils/fs-utils";
9
+
1
10
  export type BuildArtifact<BuildCommandArgs = {}> = {
2
11
  name: string;
3
12
  description: string;
@@ -7,6 +16,164 @@ export type BuildArtifact<BuildCommandArgs = {}> = {
7
16
  postBuildCommand?: () => string;
8
17
  };
9
18
 
19
+ export type ApiTsdownBuildConfig = Pick<UserConfig, "entry" | "plugins">;
20
+
21
+ type ZodCompilerPluginFactory = (typeof import("zod-compiler/rolldown"))["default"];
22
+
23
+ export interface ApiZodCompilerBuildDependencies {
24
+ loadCompilerPlugin: () => Promise<ZodCompilerPluginFactory>;
25
+ }
26
+
27
+ const apiZodCompilerBuildDependencies: ApiZodCompilerBuildDependencies = {
28
+ async loadCompilerPlugin() {
29
+ return (await import("zod-compiler/rolldown")).default;
30
+ },
31
+ };
32
+
33
+ export async function composeApiZodCompilerBuildConfig<T extends ApiTsdownBuildConfig>(
34
+ baseConfig: T,
35
+ options: {
36
+ policy: NormalizedZodCompilerPolicy;
37
+ registryPath?: string;
38
+ },
39
+ dependencies: ApiZodCompilerBuildDependencies = apiZodCompilerBuildDependencies,
40
+ ): Promise<T & ApiTsdownBuildConfig> {
41
+ if (options.policy.api !== "aot") {
42
+ return baseConfig;
43
+ }
44
+ if (options.registryPath === undefined) {
45
+ throw new Error("validation.zodCompiler.api requires the generated HTTP validator registry");
46
+ }
47
+
48
+ const zodCompiler = await dependencies.loadCompilerPlugin();
49
+ const compilerPlugin = zodCompiler({
50
+ codegenMode: "inline",
51
+ include: [options.registryPath],
52
+ output: "compact",
53
+ schemas: "explicit",
54
+ });
55
+
56
+ let configuredPlugins: Exclude<UserConfig["plugins"], undefined>[];
57
+ if (Array.isArray(baseConfig.plugins)) {
58
+ configuredPlugins = baseConfig.plugins;
59
+ } else if (baseConfig.plugins === undefined) {
60
+ configuredPlugins = [];
61
+ } else {
62
+ configuredPlugins = [baseConfig.plugins];
63
+ }
64
+
65
+ return {
66
+ ...baseConfig,
67
+ plugins: [...configuredPlugins, compilerPlugin],
68
+ };
69
+ }
70
+
71
+ export function assertApiZodCompilerBuildOutput(
72
+ outputs: readonly { code: string; path: string }[],
73
+ ): void {
74
+ for (const output of outputs) {
75
+ if (/\bcompile\s*\(/.test(output.code)) {
76
+ throw new Error(`zod-compiler compile boundary remains in ${output.path}`);
77
+ }
78
+ if (output.code.includes("virtual:zod-compiler/runtime")) {
79
+ throw new Error(`zod-compiler virtual runtime import remains in ${output.path}`);
80
+ }
81
+ }
82
+ }
83
+
84
+ export const HTTP_VALIDATOR_REGISTRY_SOURCE_PATH = "src/application/sonamu.validators.generated.ts";
85
+ export const HTTP_VALIDATOR_REGISTRY_BUILD_PATH = "dist/application/sonamu.validators.generated.js";
86
+
87
+ export async function assertApiZodCompilerSourceRegistry(registryPath: string): Promise<void> {
88
+ if (!(await exists(registryPath))) {
89
+ throw new Error(`Generated HTTP validator registry not found: ${registryPath}`);
90
+ }
91
+ const source = await readFile(registryPath, "utf8");
92
+ if (!/fingerprint\s*=\s*["'][a-f0-9]{64}["']/.test(source)) {
93
+ throw new Error(`Generated HTTP validator registry fingerprint is invalid: ${registryPath}`);
94
+ }
95
+ const declaresZeroRoutes = /\brouteIds\s*=\s*\{\s*\}\s*;/.test(source);
96
+ if (!declaresZeroRoutes && !/\bcompile\s*\(/.test(source)) {
97
+ throw new Error(`Generated HTTP validator registry has no compile boundary: ${registryPath}`);
98
+ }
99
+ }
100
+
101
+ export async function createApiZodCompilerBuildWrapper(options: {
102
+ apiRootPath: string;
103
+ baseConfigPath: string;
104
+ policy: NormalizedZodCompilerPolicy;
105
+ registryPath: string;
106
+ }): Promise<string> {
107
+ if (options.policy.api !== "aot") {
108
+ return options.baseConfigPath;
109
+ }
110
+
111
+ await assertApiZodCompilerSourceRegistry(options.registryPath);
112
+ const wrapperPath = path.join(
113
+ options.apiRootPath,
114
+ `.sonamu-zod-compiler-${process.pid}-${Date.now()}.mjs`,
115
+ );
116
+ const baseConfigUrl = pathToFileURL(options.baseConfigPath).href;
117
+ const source = [
118
+ `import path from "node:path";`,
119
+ `import baseConfig from ${JSON.stringify(baseConfigUrl)};`,
120
+ `import zodCompiler from "zod-compiler/rolldown";`,
121
+ "",
122
+ `const compilerPlugin = zodCompiler(${JSON.stringify({
123
+ codegenMode: "inline",
124
+ include: [options.registryPath],
125
+ output: "compact",
126
+ schemas: "explicit",
127
+ })});`,
128
+ `const registryPath = ${JSON.stringify(options.registryPath)};`,
129
+ `const apiRootPath = ${JSON.stringify(options.apiRootPath)};`,
130
+ `const canonicalOutDir = path.join(apiRootPath, "dist");`,
131
+ `const registryEntryName = "application/sonamu.validators.generated";`,
132
+ `const defaultEntry = { index: "src/index.ts" };`,
133
+ "const resolvesToRegistry = (entry) =>",
134
+ ' typeof entry === "string" && path.resolve(apiRootPath, entry) === registryPath;',
135
+ "const appendRegistryEntry = (entry) => {",
136
+ " if (Array.isArray(entry)) {",
137
+ " return entry.some(resolvesToRegistry) ? entry : [...entry, registryPath];",
138
+ " }",
139
+ ' if (typeof entry === "string") {',
140
+ " return resolvesToRegistry(entry) ? entry : [entry, registryPath];",
141
+ " }",
142
+ ' if (typeof entry === "object" && entry !== null) {',
143
+ " if (Object.values(entry).some(resolvesToRegistry)) return entry;",
144
+ " if (registryEntryName in entry) {",
145
+ " throw new Error(`tsdown entry collision: ${registryEntryName}`);",
146
+ " }",
147
+ " return { ...entry, [registryEntryName]: registryPath };",
148
+ " }",
149
+ " if (entry === undefined) {",
150
+ " return { ...defaultEntry, [registryEntryName]: registryPath };",
151
+ " }",
152
+ " return { [registryEntryName]: registryPath };",
153
+ "};",
154
+ "const appendPlugin = (config) => ({",
155
+ " ...config,",
156
+ " // 런타임 loader가 참조하는 registry 경로를 빌드 설정과 일치시킵니다.",
157
+ " outDir: canonicalOutDir,",
158
+ " fixedExtension: false,",
159
+ " entry: appendRegistryEntry(config.entry),",
160
+ " plugins: [...(config.plugins ?? []), compilerPlugin],",
161
+ "});",
162
+ "const appendToResolvedConfig = (config) =>",
163
+ " Array.isArray(config) ? config.map(appendPlugin) : appendPlugin(config);",
164
+ "",
165
+ "export default async (...args) => {",
166
+ ' const resolved = typeof baseConfig === "function"',
167
+ " ? await baseConfig(...args)",
168
+ " : await baseConfig;",
169
+ " return appendToResolvedConfig(resolved);",
170
+ "};",
171
+ "",
172
+ ].join("\n");
173
+ await writeFile(wrapperPath, source, "utf8");
174
+ return wrapperPath;
175
+ }
176
+
10
177
  /**
11
178
  * API 프로젝트 빌드 산출물에 대한 규칙들.
12
179
  * cli.ts의 build_api 함수가 이것을 보고 그대로 실행합니다.