joist-codegen 2.3.0-next.9 → 2.3.0-next.91

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 (420) hide show
  1. package/build/EntityDbMetadata.cjs +642 -0
  2. package/build/EntityDbMetadata.cjs.map +1 -0
  3. package/build/EntityDbMetadata.d.cts +299 -0
  4. package/build/EntityDbMetadata.d.cts.map +1 -0
  5. package/build/EntityDbMetadata.d.mts +299 -0
  6. package/build/EntityDbMetadata.d.mts.map +1 -0
  7. package/build/EntityDbMetadata.js +519 -661
  8. package/build/EntityDbMetadata.js.map +1 -1
  9. package/build/_virtual/_rolldown/runtime.cjs +23 -0
  10. package/build/_virtual/_rolldown/runtime.js +5 -0
  11. package/build/assignTags.cjs +45 -0
  12. package/build/assignTags.cjs.map +1 -0
  13. package/build/{assignTags.d.ts → assignTags.d.cts} +8 -4
  14. package/build/assignTags.d.cts.map +1 -0
  15. package/build/assignTags.d.mts +16 -0
  16. package/build/assignTags.d.mts.map +1 -0
  17. package/build/assignTags.js +37 -59
  18. package/build/assignTags.js.map +1 -1
  19. package/build/codemods/Codemod.cjs +2 -0
  20. package/build/codemods/Codemod.d.cts +17 -0
  21. package/build/codemods/Codemod.d.cts.map +1 -0
  22. package/build/codemods/Codemod.d.mts +17 -0
  23. package/build/codemods/Codemod.d.mts.map +1 -0
  24. package/build/codemods/Codemod.js +2 -3
  25. package/build/codemods/JscodeshiftMod.cjs +42 -0
  26. package/build/codemods/JscodeshiftMod.cjs.map +1 -0
  27. package/build/codemods/JscodeshiftMod.d.cts +14 -0
  28. package/build/codemods/JscodeshiftMod.d.cts.map +1 -0
  29. package/build/codemods/JscodeshiftMod.d.mts +14 -0
  30. package/build/codemods/JscodeshiftMod.d.mts.map +1 -0
  31. package/build/codemods/JscodeshiftMod.js +33 -33
  32. package/build/codemods/JscodeshiftMod.js.map +1 -1
  33. package/build/codemods/codemod_0001-rename_has_async_property.cjs +30 -0
  34. package/build/codemods/codemod_0001-rename_has_async_property.cjs.map +1 -0
  35. package/build/codemods/codemod_0001-rename_has_async_property.d.cts +9 -0
  36. package/build/codemods/codemod_0001-rename_has_async_property.d.cts.map +1 -0
  37. package/build/codemods/codemod_0001-rename_has_async_property.d.mts +9 -0
  38. package/build/codemods/codemod_0001-rename_has_async_property.d.mts.map +1 -0
  39. package/build/codemods/codemod_0001-rename_has_async_property.js +21 -25
  40. package/build/codemods/codemod_0001-rename_has_async_property.js.map +1 -1
  41. package/build/codemods/codemod_0002-rename_async_query_fields.cjs +50 -0
  42. package/build/codemods/codemod_0002-rename_async_query_fields.cjs.map +1 -0
  43. package/build/codemods/codemod_0002-rename_async_query_fields.d.cts +9 -0
  44. package/build/codemods/codemod_0002-rename_async_query_fields.d.cts.map +1 -0
  45. package/build/codemods/codemod_0002-rename_async_query_fields.d.mts +9 -0
  46. package/build/codemods/codemod_0002-rename_async_query_fields.d.mts.map +1 -0
  47. package/build/codemods/codemod_0002-rename_async_query_fields.js +38 -52
  48. package/build/codemods/codemod_0002-rename_async_query_fields.js.map +1 -1
  49. package/build/codemods/codemod_0003-rename_find_paginated.cjs +25 -0
  50. package/build/codemods/codemod_0003-rename_find_paginated.cjs.map +1 -0
  51. package/build/codemods/codemod_0003-rename_find_paginated.d.cts +9 -0
  52. package/build/codemods/codemod_0003-rename_find_paginated.d.cts.map +1 -0
  53. package/build/codemods/codemod_0003-rename_find_paginated.d.mts +9 -0
  54. package/build/codemods/codemod_0003-rename_find_paginated.d.mts.map +1 -0
  55. package/build/codemods/codemod_0003-rename_find_paginated.js +17 -26
  56. package/build/codemods/codemod_0003-rename_find_paginated.js.map +1 -1
  57. package/build/codemods/index.cjs +49 -0
  58. package/build/codemods/index.cjs.map +1 -0
  59. package/build/codemods/index.d.cts +12 -0
  60. package/build/codemods/index.d.cts.map +1 -0
  61. package/build/codemods/index.d.mts +12 -0
  62. package/build/codemods/index.d.mts.map +1 -0
  63. package/build/codemods/index.js +34 -42
  64. package/build/codemods/index.js.map +1 -1
  65. package/build/config.cjs +377 -0
  66. package/build/config.cjs.map +1 -0
  67. package/build/config.d.cts +181 -0
  68. package/build/config.d.cts.map +1 -0
  69. package/build/config.d.mts +181 -0
  70. package/build/config.d.mts.map +1 -0
  71. package/build/config.js +309 -347
  72. package/build/config.js.map +1 -1
  73. package/build/docs/cache.cjs +62 -0
  74. package/build/docs/cache.cjs.map +1 -0
  75. package/build/docs/cache.d.cts +17 -0
  76. package/build/docs/cache.d.cts.map +1 -0
  77. package/build/docs/cache.d.mts +17 -0
  78. package/build/docs/cache.d.mts.map +1 -0
  79. package/build/docs/cache.js +52 -53
  80. package/build/docs/cache.js.map +1 -1
  81. package/build/docs/generate-metadata-docs.cjs +32 -0
  82. package/build/docs/generate-metadata-docs.cjs.map +1 -0
  83. package/build/docs/generate-metadata-docs.d.cts +9 -0
  84. package/build/docs/generate-metadata-docs.d.cts.map +1 -0
  85. package/build/docs/generate-metadata-docs.d.mts +9 -0
  86. package/build/docs/generate-metadata-docs.d.mts.map +1 -0
  87. package/build/docs/generate-metadata-docs.js +19 -24
  88. package/build/docs/generate-metadata-docs.js.map +1 -1
  89. package/build/docs/index.cjs +90 -0
  90. package/build/docs/index.cjs.map +1 -0
  91. package/build/docs/index.d.cts +16 -0
  92. package/build/docs/index.d.cts.map +1 -0
  93. package/build/docs/index.d.mts +16 -0
  94. package/build/docs/index.d.mts.map +1 -0
  95. package/build/docs/index.js +75 -80
  96. package/build/docs/index.js.map +1 -1
  97. package/build/docs/markdown.cjs +181 -0
  98. package/build/docs/markdown.cjs.map +1 -0
  99. package/build/docs/{markdown.d.ts → markdown.d.cts} +14 -12
  100. package/build/docs/markdown.d.cts.map +1 -0
  101. package/build/docs/markdown.d.mts +32 -0
  102. package/build/docs/markdown.d.mts.map +1 -0
  103. package/build/docs/markdown.js +152 -220
  104. package/build/docs/markdown.js.map +1 -1
  105. package/build/docs/parsing.cjs +117 -0
  106. package/build/docs/parsing.cjs.map +1 -0
  107. package/build/docs/parsing.d.cts +48 -0
  108. package/build/docs/parsing.d.cts.map +1 -0
  109. package/build/docs/parsing.d.mts +48 -0
  110. package/build/docs/parsing.d.mts.map +1 -0
  111. package/build/docs/parsing.js +89 -88
  112. package/build/docs/parsing.js.map +1 -1
  113. package/build/findEntityScopes.cjs +119 -0
  114. package/build/findEntityScopes.cjs.map +1 -0
  115. package/build/findEntityScopes.d.cts +14 -0
  116. package/build/findEntityScopes.d.cts.map +1 -0
  117. package/build/findEntityScopes.d.mts +14 -0
  118. package/build/findEntityScopes.d.mts.map +1 -0
  119. package/build/findEntityScopes.js +83 -111
  120. package/build/findEntityScopes.js.map +1 -1
  121. package/build/foreignKeyOrdering.cjs +52 -0
  122. package/build/foreignKeyOrdering.cjs.map +1 -0
  123. package/build/foreignKeyOrdering.d.cts +8 -0
  124. package/build/foreignKeyOrdering.d.cts.map +1 -0
  125. package/build/foreignKeyOrdering.d.mts +8 -0
  126. package/build/foreignKeyOrdering.d.mts.map +1 -0
  127. package/build/foreignKeyOrdering.js +46 -55
  128. package/build/foreignKeyOrdering.js.map +1 -1
  129. package/build/generate.cjs +128 -0
  130. package/build/generate.cjs.map +1 -0
  131. package/build/generate.d.cts +17 -0
  132. package/build/generate.d.cts.map +1 -0
  133. package/build/generate.d.mts +17 -0
  134. package/build/generate.d.mts.map +1 -0
  135. package/build/generate.js +111 -124
  136. package/build/generate.js.map +1 -1
  137. package/build/generateEntitiesFile.cjs +46 -0
  138. package/build/generateEntitiesFile.cjs.map +1 -0
  139. package/build/generateEntitiesFile.d.cts +11 -0
  140. package/build/generateEntitiesFile.d.cts.map +1 -0
  141. package/build/generateEntitiesFile.d.mts +11 -0
  142. package/build/generateEntitiesFile.d.mts.map +1 -0
  143. package/build/generateEntitiesFile.js +28 -25
  144. package/build/generateEntitiesFile.js.map +1 -1
  145. package/build/generateEntityCodegenFile.cjs +1010 -0
  146. package/build/generateEntityCodegenFile.cjs.map +1 -0
  147. package/build/generateEntityCodegenFile.d.cts +16 -0
  148. package/build/generateEntityCodegenFile.d.cts.map +1 -0
  149. package/build/generateEntityCodegenFile.d.mts +16 -0
  150. package/build/generateEntityCodegenFile.d.mts.map +1 -0
  151. package/build/generateEntityCodegenFile.js +793 -827
  152. package/build/generateEntityCodegenFile.js.map +1 -1
  153. package/build/generateEntityFile.cjs +23 -0
  154. package/build/generateEntityFile.cjs.map +1 -0
  155. package/build/generateEntityFile.d.cts +9 -0
  156. package/build/generateEntityFile.d.cts.map +1 -0
  157. package/build/generateEntityFile.d.mts +9 -0
  158. package/build/generateEntityFile.d.mts.map +1 -0
  159. package/build/generateEntityFile.js +11 -8
  160. package/build/generateEntityFile.js.map +1 -1
  161. package/build/generateEntityTestFile.cjs +25 -0
  162. package/build/generateEntityTestFile.cjs.map +1 -0
  163. package/build/generateEntityTestFile.d.cts +9 -0
  164. package/build/generateEntityTestFile.d.cts.map +1 -0
  165. package/build/generateEntityTestFile.d.mts +9 -0
  166. package/build/generateEntityTestFile.d.mts.map +1 -0
  167. package/build/generateEntityTestFile.js +10 -7
  168. package/build/generateEntityTestFile.js.map +1 -1
  169. package/build/generateEnumFile.cjs +73 -0
  170. package/build/generateEnumFile.cjs.map +1 -0
  171. package/build/generateEnumFile.d.cts +9 -0
  172. package/build/generateEnumFile.d.cts.map +1 -0
  173. package/build/generateEnumFile.d.mts +9 -0
  174. package/build/generateEnumFile.d.mts.map +1 -0
  175. package/build/generateEnumFile.js +33 -43
  176. package/build/generateEnumFile.js.map +1 -1
  177. package/build/generateFactoriesFiles.cjs +28 -0
  178. package/build/generateFactoriesFiles.cjs.map +1 -0
  179. package/build/generateFactoriesFiles.d.cts +7 -0
  180. package/build/generateFactoriesFiles.d.cts.map +1 -0
  181. package/build/generateFactoriesFiles.d.mts +7 -0
  182. package/build/generateFactoriesFiles.d.mts.map +1 -0
  183. package/build/generateFactoriesFiles.js +21 -16
  184. package/build/generateFactoriesFiles.js.map +1 -1
  185. package/build/generateFlushFunction.cjs +61 -0
  186. package/build/generateFlushFunction.cjs.map +1 -0
  187. package/build/{generateFlushFunction.d.ts → generateFlushFunction.d.cts} +8 -5
  188. package/build/generateFlushFunction.d.cts.map +1 -0
  189. package/build/generateFlushFunction.d.mts +23 -0
  190. package/build/generateFlushFunction.d.mts.map +1 -0
  191. package/build/generateFlushFunction.js +32 -78
  192. package/build/generateFlushFunction.js.map +1 -1
  193. package/build/generateMetadataFile.cjs +307 -0
  194. package/build/generateMetadataFile.cjs.map +1 -0
  195. package/build/generateMetadataFile.d.cts +10 -0
  196. package/build/generateMetadataFile.d.cts.map +1 -0
  197. package/build/generateMetadataFile.d.mts +10 -0
  198. package/build/generateMetadataFile.d.mts.map +1 -0
  199. package/build/generateMetadataFile.js +148 -156
  200. package/build/generateMetadataFile.js.map +1 -1
  201. package/build/generatePgEnumFile.cjs +21 -0
  202. package/build/generatePgEnumFile.cjs.map +1 -0
  203. package/build/generatePgEnumFile.d.cts +9 -0
  204. package/build/generatePgEnumFile.d.cts.map +1 -0
  205. package/build/generatePgEnumFile.d.mts +9 -0
  206. package/build/generatePgEnumFile.d.mts.map +1 -0
  207. package/build/generatePgEnumFile.js +12 -9
  208. package/build/generatePgEnumFile.js.map +1 -1
  209. package/build/index.cjs +135 -0
  210. package/build/index.cjs.map +1 -0
  211. package/build/index.d.cts +12 -0
  212. package/build/index.d.cts.map +1 -0
  213. package/build/index.d.mts +12 -0
  214. package/build/index.d.mts.map +1 -0
  215. package/build/index.js +108 -127
  216. package/build/index.js.map +1 -1
  217. package/build/inheritance.cjs +257 -0
  218. package/build/inheritance.cjs.map +1 -0
  219. package/build/inheritance.d.cts +13 -0
  220. package/build/inheritance.d.cts.map +1 -0
  221. package/build/inheritance.d.mts +13 -0
  222. package/build/inheritance.d.mts.map +1 -0
  223. package/build/inheritance.js +237 -247
  224. package/build/inheritance.js.map +1 -1
  225. package/build/installSkills.cjs +68 -0
  226. package/build/installSkills.cjs.map +1 -0
  227. package/build/installSkills.d.cts +16 -0
  228. package/build/installSkills.d.cts.map +1 -0
  229. package/build/installSkills.d.mts +16 -0
  230. package/build/installSkills.d.mts.map +1 -0
  231. package/build/installSkills.js +67 -0
  232. package/build/installSkills.js.map +1 -0
  233. package/build/keywords.cjs +7 -0
  234. package/build/keywords.cjs.map +1 -0
  235. package/build/keywords.d.cts +5 -0
  236. package/build/keywords.d.cts.map +1 -0
  237. package/build/keywords.d.mts +5 -0
  238. package/build/keywords.d.mts.map +1 -0
  239. package/build/keywords.js +5 -4
  240. package/build/keywords.js.map +1 -1
  241. package/build/loadMetadata.cjs +39 -0
  242. package/build/loadMetadata.cjs.map +1 -0
  243. package/build/loadMetadata.d.cts +31 -0
  244. package/build/loadMetadata.d.cts.map +1 -0
  245. package/build/loadMetadata.d.mts +31 -0
  246. package/build/loadMetadata.d.mts.map +1 -0
  247. package/build/loadMetadata.js +32 -39
  248. package/build/loadMetadata.js.map +1 -1
  249. package/build/logger.cjs +28 -0
  250. package/build/logger.cjs.map +1 -0
  251. package/build/logger.d.cts +13 -0
  252. package/build/logger.d.cts.map +1 -0
  253. package/build/logger.d.mts +13 -0
  254. package/build/logger.d.mts.map +1 -0
  255. package/build/logger.js +17 -16
  256. package/build/logger.js.map +1 -1
  257. package/build/scanEntityFiles.cjs +46 -0
  258. package/build/scanEntityFiles.cjs.map +1 -0
  259. package/build/scanEntityFiles.d.cts +8 -0
  260. package/build/scanEntityFiles.d.cts.map +1 -0
  261. package/build/scanEntityFiles.d.mts +8 -0
  262. package/build/scanEntityFiles.d.mts.map +1 -0
  263. package/build/scanEntityFiles.js +37 -42
  264. package/build/scanEntityFiles.js.map +1 -1
  265. package/build/sortForeignKeys.cjs +99 -0
  266. package/build/sortForeignKeys.cjs.map +1 -0
  267. package/build/{sortForeignKeys.d.ts → sortForeignKeys.d.cts} +8 -5
  268. package/build/sortForeignKeys.d.cts.map +1 -0
  269. package/build/sortForeignKeys.d.mts +35 -0
  270. package/build/sortForeignKeys.d.mts.map +1 -0
  271. package/build/sortForeignKeys.js +88 -117
  272. package/build/sortForeignKeys.js.map +1 -1
  273. package/build/symbols.cjs +238 -0
  274. package/build/symbols.cjs.map +1 -0
  275. package/build/symbols.d.cts +120 -0
  276. package/build/symbols.d.cts.map +1 -0
  277. package/build/symbols.d.mts +120 -0
  278. package/build/symbols.d.mts.map +1 -0
  279. package/build/symbols.js +121 -113
  280. package/build/symbols.js.map +1 -1
  281. package/build/tsdoc.cjs +22 -0
  282. package/build/tsdoc.cjs.map +1 -0
  283. package/build/tsdoc.d.cts +15 -0
  284. package/build/tsdoc.d.cts.map +1 -0
  285. package/build/tsdoc.d.mts +15 -0
  286. package/build/tsdoc.d.mts.map +1 -0
  287. package/build/tsdoc.js +18 -15
  288. package/build/tsdoc.js.map +1 -1
  289. package/build/utils.cjs +173 -0
  290. package/build/utils.cjs.map +1 -0
  291. package/build/utils.d.cts +34 -0
  292. package/build/utils.d.cts.map +1 -0
  293. package/build/utils.d.mts +34 -0
  294. package/build/utils.d.mts.map +1 -0
  295. package/build/utils.js +112 -166
  296. package/build/utils.js.map +1 -1
  297. package/build/write-json-schema.cjs +23 -0
  298. package/build/write-json-schema.cjs.map +1 -0
  299. package/build/write-json-schema.d.cts +1 -0
  300. package/build/write-json-schema.d.mts +1 -0
  301. package/build/write-json-schema.js +19 -13
  302. package/build/write-json-schema.js.map +1 -1
  303. package/package.json +37 -17
  304. package/skills/joist-docs/SKILL.md +142 -0
  305. package/skills/joist-em-basics/SKILL.md +114 -0
  306. package/skills/joist-partial-updates/SKILL.md +352 -0
  307. package/skills/joist-reactive-hints/SKILL.md +150 -0
  308. package/skills/joist-test-factories/SKILL.md +397 -0
  309. package/skills/joist-upsert/SKILL.md +95 -0
  310. package/build/EntityDbMetadata.d.ts +0 -269
  311. package/build/EntityDbMetadata.d.ts.map +0 -1
  312. package/build/EntityDbMetadata.test.d.ts +0 -2
  313. package/build/EntityDbMetadata.test.d.ts.map +0 -1
  314. package/build/EntityDbMetadata.test.js +0 -211
  315. package/build/EntityDbMetadata.test.js.map +0 -1
  316. package/build/assignTags.d.ts.map +0 -1
  317. package/build/codemods/Codemod.d.ts +0 -14
  318. package/build/codemods/Codemod.d.ts.map +0 -1
  319. package/build/codemods/Codemod.js.map +0 -1
  320. package/build/codemods/JscodeshiftMod.d.ts +0 -11
  321. package/build/codemods/JscodeshiftMod.d.ts.map +0 -1
  322. package/build/codemods/__tests__/codemod_0001-rename_has_async_property.test.d.ts +0 -2
  323. package/build/codemods/__tests__/codemod_0001-rename_has_async_property.test.d.ts.map +0 -1
  324. package/build/codemods/__tests__/codemod_0001-rename_has_async_property.test.js +0 -9
  325. package/build/codemods/__tests__/codemod_0001-rename_has_async_property.test.js.map +0 -1
  326. package/build/codemods/__tests__/codemod_0002-rename_async_query_fields.test.d.ts +0 -2
  327. package/build/codemods/__tests__/codemod_0002-rename_async_query_fields.test.d.ts.map +0 -1
  328. package/build/codemods/__tests__/codemod_0002-rename_async_query_fields.test.js +0 -9
  329. package/build/codemods/__tests__/codemod_0002-rename_async_query_fields.test.js.map +0 -1
  330. package/build/codemods/__tests__/codemod_0003-rename_find_paginated.test.d.ts +0 -2
  331. package/build/codemods/__tests__/codemod_0003-rename_find_paginated.test.d.ts.map +0 -1
  332. package/build/codemods/__tests__/codemod_0003-rename_find_paginated.test.js +0 -9
  333. package/build/codemods/__tests__/codemod_0003-rename_find_paginated.test.js.map +0 -1
  334. package/build/codemods/codemod_0001-rename_has_async_property.d.ts +0 -7
  335. package/build/codemods/codemod_0001-rename_has_async_property.d.ts.map +0 -1
  336. package/build/codemods/codemod_0002-rename_async_query_fields.d.ts +0 -7
  337. package/build/codemods/codemod_0002-rename_async_query_fields.d.ts.map +0 -1
  338. package/build/codemods/codemod_0003-rename_find_paginated.d.ts +0 -7
  339. package/build/codemods/codemod_0003-rename_find_paginated.d.ts.map +0 -1
  340. package/build/codemods/index.d.ts +0 -9
  341. package/build/codemods/index.d.ts.map +0 -1
  342. package/build/codemods/index.test.d.ts +0 -2
  343. package/build/codemods/index.test.d.ts.map +0 -1
  344. package/build/codemods/index.test.js +0 -24
  345. package/build/codemods/index.test.js.map +0 -1
  346. package/build/config.d.ts +0 -167
  347. package/build/config.d.ts.map +0 -1
  348. package/build/config.test.d.ts +0 -2
  349. package/build/config.test.d.ts.map +0 -1
  350. package/build/config.test.js +0 -78
  351. package/build/config.test.js.map +0 -1
  352. package/build/docs/cache.d.ts +0 -14
  353. package/build/docs/cache.d.ts.map +0 -1
  354. package/build/docs/cache.test.d.ts +0 -2
  355. package/build/docs/cache.test.d.ts.map +0 -1
  356. package/build/docs/cache.test.js +0 -47
  357. package/build/docs/cache.test.js.map +0 -1
  358. package/build/docs/generate-metadata-docs.d.ts +0 -6
  359. package/build/docs/generate-metadata-docs.d.ts.map +0 -1
  360. package/build/docs/index.d.ts +0 -9
  361. package/build/docs/index.d.ts.map +0 -1
  362. package/build/docs/index.test.d.ts +0 -2
  363. package/build/docs/index.test.d.ts.map +0 -1
  364. package/build/docs/index.test.js +0 -100
  365. package/build/docs/index.test.js.map +0 -1
  366. package/build/docs/markdown.d.ts.map +0 -1
  367. package/build/docs/markdown.test.d.ts +0 -2
  368. package/build/docs/markdown.test.d.ts.map +0 -1
  369. package/build/docs/markdown.test.js +0 -280
  370. package/build/docs/markdown.test.js.map +0 -1
  371. package/build/docs/parsing.d.ts +0 -42
  372. package/build/docs/parsing.d.ts.map +0 -1
  373. package/build/docs/parsing.test.d.ts +0 -2
  374. package/build/docs/parsing.test.d.ts.map +0 -1
  375. package/build/docs/parsing.test.js +0 -190
  376. package/build/docs/parsing.test.js.map +0 -1
  377. package/build/findEntityScopes.d.ts +0 -11
  378. package/build/findEntityScopes.d.ts.map +0 -1
  379. package/build/foreignKeyOrdering.d.ts +0 -3
  380. package/build/foreignKeyOrdering.d.ts.map +0 -1
  381. package/build/generate.d.ts +0 -12
  382. package/build/generate.d.ts.map +0 -1
  383. package/build/generateEntitiesFile.d.ts +0 -7
  384. package/build/generateEntitiesFile.d.ts.map +0 -1
  385. package/build/generateEntityCodegenFile.d.ts +0 -11
  386. package/build/generateEntityCodegenFile.d.ts.map +0 -1
  387. package/build/generateEntityFile.d.ts +0 -6
  388. package/build/generateEntityFile.d.ts.map +0 -1
  389. package/build/generateEntityTestFile.d.ts +0 -6
  390. package/build/generateEntityTestFile.d.ts.map +0 -1
  391. package/build/generateEnumFile.d.ts +0 -5
  392. package/build/generateEnumFile.d.ts.map +0 -1
  393. package/build/generateFactoriesFiles.d.ts +0 -4
  394. package/build/generateFactoriesFiles.d.ts.map +0 -1
  395. package/build/generateFlushFunction.d.ts.map +0 -1
  396. package/build/generateMetadataFile.d.ts +0 -5
  397. package/build/generateMetadataFile.d.ts.map +0 -1
  398. package/build/generatePgEnumFile.d.ts +0 -5
  399. package/build/generatePgEnumFile.d.ts.map +0 -1
  400. package/build/index.d.ts +0 -11
  401. package/build/index.d.ts.map +0 -1
  402. package/build/inheritance.d.ts +0 -10
  403. package/build/inheritance.d.ts.map +0 -1
  404. package/build/keywords.d.ts +0 -2
  405. package/build/keywords.d.ts.map +0 -1
  406. package/build/loadMetadata.d.ts +0 -26
  407. package/build/loadMetadata.d.ts.map +0 -1
  408. package/build/logger.d.ts +0 -10
  409. package/build/logger.d.ts.map +0 -1
  410. package/build/scanEntityFiles.d.ts +0 -5
  411. package/build/scanEntityFiles.d.ts.map +0 -1
  412. package/build/sortForeignKeys.d.ts.map +0 -1
  413. package/build/symbols.d.ts +0 -108
  414. package/build/symbols.d.ts.map +0 -1
  415. package/build/tsdoc.d.ts +0 -12
  416. package/build/tsdoc.d.ts.map +0 -1
  417. package/build/utils.d.ts +0 -31
  418. package/build/utils.d.ts.map +0 -1
  419. package/build/write-json-schema.d.ts +0 -2
  420. package/build/write-json-schema.d.ts.map +0 -1
@@ -0,0 +1,1010 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_runtime = require("./_virtual/_rolldown/runtime.cjs");
3
+ const require_utils = require("./utils.cjs");
4
+ const require_inheritance = require("./inheritance.cjs");
5
+ require("./config.cjs");
6
+ const require_docs_parsing = require("./docs/parsing.cjs");
7
+ require("./docs/index.cjs");
8
+ require("./findEntityScopes.cjs");
9
+ const require_keywords = require("./keywords.cjs");
10
+ const require_symbols = require("./symbols.cjs");
11
+ const require_tsdoc = require("./tsdoc.cjs");
12
+ require("./EntityDbMetadata.cjs");
13
+ let change_case = require("change-case");
14
+ let pluralize = require("pluralize");
15
+ pluralize = require_runtime.__toESM(pluralize, 1);
16
+ let ts_poet = require("ts-poet");
17
+ //#region src/generateEntityCodegenFile.ts
18
+ const { plural } = pluralize.default;
19
+ /** Creates the base class with the boilerplate annotations. */
20
+ function generateEntityCodegenFile(config, dbMeta, meta, scopeMembers = [], docs) {
21
+ const { entitiesByName: metasByName } = dbMeta;
22
+ const { entity, tagName } = meta;
23
+ const entityName = entity.name;
24
+ const fieldDocs = docs?.fields ?? {};
25
+ const varName = require_keywords.keywords.includes(tagName) ? require_utils.uncapitalize(entityName) : tagName;
26
+ const primitives = createPrimitives(meta, entity, fieldDocs);
27
+ primitives.push(...createRegularEnums(meta, entity, fieldDocs));
28
+ primitives.push(...createArrayEnums(meta, fieldDocs));
29
+ primitives.push(...createPgEnums(meta, fieldDocs));
30
+ const relations = createRelations(config, meta, entity);
31
+ const configName = `${(0, change_case.camelCase)(entityName)}Config`;
32
+ const scopeFnName = `${(0, change_case.camelCase)(entityName)}Scope`;
33
+ const metadata = (0, ts_poet.imp)(`${(0, change_case.camelCase)(entityName)}Meta@./entities.ts`);
34
+ const contextType = config.contextType ? (0, ts_poet.imp)(`t:${config.contextType}`) : "{}";
35
+ const factoryMethod = (0, ts_poet.imp)(`new${entity.name}@./entities.ts`);
36
+ const idMaybeCode = config.idType === "tagged-string" ? ts_poet.code`return this.idTaggedMaybe;` : ts_poet.code`return ${require_symbols.toIdOf}(${metadata}, this.idTaggedMaybe);`;
37
+ const idType = getIdType(config);
38
+ const maybeSoftDeleteMethods = meta.deletedAt ? ts_poet.code`
39
+ get isSoftDeletedEntity(): boolean {
40
+ return this.${meta.deletedAt.fieldName} !== undefined;
41
+ }
42
+
43
+ softDelete(): void {
44
+ if (this.isSoftDeletedEntity) return;
45
+ this.${meta.deletedAt.fieldName} = ${nowUTCCall(config, meta.deletedAt)};
46
+ }
47
+ ` : "";
48
+ const baseEntity = dbMeta.entities.find((e) => e.name === meta.baseClassName);
49
+ const subEntities = dbMeta.entities.filter((e) => e.baseClassName === meta.name);
50
+ const base = baseEntity?.entity.typeSymbol ?? ts_poet.code`${require_symbols.BaseEntity}<${require_symbols.EntityManager}, ${idType}>`;
51
+ const maybeBaseFields = baseEntity ? ts_poet.code`extends Omit<${(0, ts_poet.imp)("t:" + baseEntity.entity.fieldsName + "@./entities.ts")}, "id"${[
52
+ ...meta.primitives,
53
+ ...meta.enums,
54
+ ...meta.pgEnums,
55
+ ...meta.manyToOnes
56
+ ].filter((field) => [
57
+ ...baseEntity.primitives,
58
+ ...baseEntity.enums,
59
+ ...baseEntity.pgEnums,
60
+ ...baseEntity.manyToOnes
61
+ ].some((baseField) => baseField.fieldName === field.fieldName)).map((field) => ts_poet.code` | "${field.fieldName}"`)}>` : "";
62
+ const maybeBaseOpts = baseEntity ? ts_poet.code`extends ${baseEntity.entity.optsType}` : "";
63
+ const physical = meta.physicalMetadata ?? meta;
64
+ const sharedTable = meta.inheritanceType === "sti" && baseEntity;
65
+ const columns = sharedTable ? {} : generateColumnsType(physical);
66
+ const maybeBaseColumns = sharedTable ? ts_poet.code`extends ${(0, ts_poet.imp)(`t:${baseEntity.name}Columns@./entities.ts`)}` : "";
67
+ const maybeBaseIdOpts = baseEntity ? ts_poet.code`extends ${(0, ts_poet.imp)("t:" + baseEntity.entity.idsOptsName + "@./entities.ts")}` : "";
68
+ const maybeBaseFilter = baseEntity ? ts_poet.code`extends ${(0, ts_poet.imp)("t:" + baseEntity.entity.filterName + "@./entities.ts")}` : "";
69
+ const maybeBaseGqlFilter = baseEntity ? ts_poet.code`extends ${(0, ts_poet.imp)("t:" + baseEntity.entity.graphqlFilterName + "@./entities.ts")}` : "";
70
+ const maybeBaseOrder = baseEntity ? ts_poet.code`extends ${baseEntity.entity.orderType}` : "";
71
+ meta.abstract && ts_poet.code`
72
+ if (this.constructor === ${entity.type} && !(em as any).fakeInstance) {
73
+ throw new Error(\`${entity.type} must be instantiated via a subtype\`);
74
+ }`;
75
+ let maybeOtherTypeChanges;
76
+ if (subEntities.length > 0) maybeOtherTypeChanges = (0, ts_poet.joinCode)([ts_poet.code`, `, ...[meta, ...subEntities].map((e) => ts_poet.code`keyof (${require_symbols.FieldsOf}<${e.entity.type}> & ${require_symbols.RelationsOf}<${e.entity.type}>)`)], { on: "|" });
77
+ else maybeOtherTypeChanges = "";
78
+ let maybeOtherLoaded;
79
+ if (baseEntity) maybeOtherLoaded = ts_poet.code`| ${baseEntity.entity.type}`;
80
+ else maybeOtherLoaded = "";
81
+ return ts_poet.code`
82
+ export type ${entity.idName} = ${require_symbols.Flavor}<${idType}, "${baseEntity ? baseEntity.name : entityName}">;
83
+
84
+ ${generatePolymorphicTypes(meta)}
85
+
86
+ export interface ${entity.fieldsName} ${maybeBaseFields} {
87
+ ${generateFieldsType(meta, idType)}
88
+ }
89
+
90
+ export interface ${entityName}Columns ${maybeBaseColumns} {
91
+ ${Object.entries(columns).map(([name, descriptor]) => ts_poet.code`${JSON.stringify(name)}: ${descriptor};`)}
92
+ }
93
+
94
+ export interface ${entity.optsName} ${maybeBaseOpts} {
95
+ ${generateOptsFields(meta)}
96
+ }
97
+
98
+ export interface ${entity.idsOptsName} ${maybeBaseIdOpts} {
99
+ ${generateOptIdsFields(meta)}
100
+ }
101
+
102
+ export interface ${entity.filterName} ${maybeBaseFilter} {
103
+ ${generateFilterFields(metasByName, meta)}
104
+ }
105
+
106
+ export interface ${entity.graphqlFilterName} ${maybeBaseGqlFilter} {
107
+ ${generateGraphQLFilterFields(metasByName, meta)}
108
+ }
109
+
110
+ export interface ${entity.orderName} ${maybeBaseOrder} {
111
+ ${generateOrderFields(meta)}
112
+ }
113
+
114
+ export interface ${entity.factoryExtrasName} {
115
+ ${generateFactoryExtrasType(meta)}
116
+ }
117
+
118
+ export interface ${entity.scopesName} {
119
+ ${scopeMembers.map((member) => ts_poet.code`${member.name}: ${member.type};`)}
120
+ }
121
+
122
+ export type ${entity.scopeName} = ${require_symbols.Scope}<${entity.type}, ${entity.scopesName}>;
123
+
124
+ export const ${configName} = new ${require_symbols.ConfigApi}<${entity.type}, ${contextType}>();
125
+
126
+ export const ${scopeFnName} = ${require_symbols.newScopeFn}<${entity.type}, ${entity.scopeName}>("${entityName}");
127
+
128
+ ${generateDefaultValidationRules(dbMeta, meta, configName)}
129
+ ${generateDefaultValues(config, meta, configName)};
130
+
131
+ declare module "joist-core" {
132
+ interface TypeMap {
133
+ ${entityName}: {
134
+ entityType: ${entityName};
135
+ filterType: ${entity.filterName};
136
+ gqlFilterType: ${entity.graphqlFilterName};
137
+ orderType: ${entity.orderName};
138
+ optsType: ${entity.optsName};
139
+ fieldsType: ${entity.fieldsName};
140
+ columnsType: ${entityName}Columns;
141
+ inheritanceType: ${meta.inheritanceType ? ts_poet.code`"${meta.inheritanceType}"` : "never"};
142
+ supportsEmExecute: ${!meta.inheritanceType && meta.supportsEmExecute === true};
143
+ optIdsType: ${entity.idsOptsName};
144
+ factoryExtrasType: ${entity.factoryExtrasName};
145
+ factoryOptsType: Parameters<typeof ${factoryMethod}>[1];
146
+ };
147
+ }
148
+ }
149
+
150
+ export abstract class ${entityName}Codegen extends ${base} implements ${require_symbols.ProjectEntity} {
151
+ static readonly tagName = "${tagName}";
152
+ static readonly metadata: ${require_symbols.EntityMetadata}<${entity.type}>;
153
+
154
+ declare readonly __type: {
155
+ ${baseEntity ? `0: "${baseEntity.name}",` : ""}
156
+ ${baseEntity ? 1 : 0}: "${entityName}",
157
+ };
158
+
159
+ ${relations.filter((r) => r.kind === "abstract").map((r) => {
160
+ return ts_poet.code`${relationDocBlock(fieldDocs, r.fieldName, entityName)}${r.line}${maybeComment(r.comment)}`;
161
+ })}
162
+ ${relations.filter((r) => r.kind === "concrete").map((r) => {
163
+ return ts_poet.code`${relationDocBlock(fieldDocs, r.fieldName, entityName)}readonly ${r.fieldName}: ${r.decl} = ${r.init};${maybeComment(r.comment)}`;
164
+ })}
165
+ ${relations.filter((r) => r.kind === "super").map((r) => {
166
+ return ts_poet.code`${relationDocBlock(fieldDocs, r.fieldName, entityName)}declare readonly ${r.fieldName}: ${r.decl};${maybeComment(r.comment)}`;
167
+ })}
168
+
169
+ get id(): ${entity.idName} {
170
+ return this.idMaybe || ${require_symbols.failNoIdYet}("${entityName}");
171
+ }
172
+
173
+ get idMaybe(): ${entity.idName} | undefined {
174
+ ${idMaybeCode}
175
+ }
176
+
177
+ get idTagged(): ${require_symbols.TaggedId} {
178
+ return this.idTaggedMaybe || ${require_symbols.failNoIdYet}("${entityName}");
179
+ }
180
+
181
+ get idTaggedMaybe(): ${require_symbols.TaggedId} | undefined {
182
+ return ${require_symbols.getField}(this, "id");
183
+ }
184
+
185
+ ${primitives}
186
+
187
+ ${require_tsdoc.tsdocComments.entity.setPartial}
188
+ set(opts: Partial<${entity.optsName}>): void {
189
+ ${require_symbols.setOpts}(this as any as ${entityName}, opts);
190
+ }
191
+
192
+ ${require_tsdoc.tsdocComments.entity.setPartial}
193
+ setPartial(opts: ${require_symbols.PartialOrNull}<${entity.optsName}>): void {
194
+ ${require_symbols.setOpts}(this as any as ${entityName}, opts as ${require_symbols.OptsOf}<${entityName}>, { partial: true });
195
+ }
196
+
197
+ ${require_tsdoc.tsdocComments.entity.setDeepPartial}
198
+ setDeepPartial(opts: ${require_symbols.DeepPartialOrNull}<${entityName}>): Promise<void> {
199
+ return ${require_symbols.updatePartial}(this as any as ${entityName}, opts);
200
+ }
201
+
202
+ ${require_tsdoc.tsdocComments.entity.changes}
203
+ get changes(): ${require_symbols.Changes}<${entityName}${maybeOtherTypeChanges}> {
204
+ return ${require_symbols.newChangesProxy}(this) as any;
205
+ }
206
+
207
+ ${maybeSoftDeleteMethods}
208
+
209
+ ${require_tsdoc.tsdocComments.entity.load}
210
+ load<U, V>(fn: (lens: ${require_symbols.Lens}<${entity.type}>) => ${require_symbols.Lens}<U, V>, opts: { sql?: boolean } = {}): Promise<V> {
211
+ return ${require_symbols.loadLens}(this as any as ${entityName}, fn, opts);
212
+ }
213
+
214
+ ${require_tsdoc.tsdocComments.entity.populate}
215
+ populate<const H extends ${require_symbols.LoadHint}<${entityName}>>(hint: H): Promise<${require_symbols.Loaded}<${entityName}, H>>;
216
+ populate<const H extends ${require_symbols.LoadHint}<${entityName}>>(opts: { hint: H, forceReload?: boolean }): Promise<${require_symbols.Loaded}<${entityName}, H>>;
217
+ populate<const H extends ${require_symbols.LoadHint}<${entityName}>, V>(hint: H, fn: (${varName}: Loaded<${entityName}, H>) => V): Promise<V>;
218
+ populate<const H extends ${require_symbols.LoadHint}<${entityName}>, V>(opts: { hint: H, forceReload?: boolean }, fn: (${varName}: Loaded<${entityName}, H>) => V): Promise<V>;
219
+ populate<const H extends ${require_symbols.LoadHint}<${entityName}>, V>(hintOrOpts: any, fn?: (${varName}: Loaded<${entityName}, H>) => V): Promise<${require_symbols.Loaded}<${entityName}, H> | V> {
220
+ return this.em.populate(this as any as ${entityName}, hintOrOpts, fn);
221
+ }
222
+
223
+ ${require_tsdoc.tsdocComments.entity.isLoaded}
224
+ isLoaded<const H extends ${require_symbols.LoadHint}<${entityName}>>(hint: H): this is ${require_symbols.Loaded}<${entityName}${maybeOtherLoaded}, H> {
225
+ return ${require_symbols.isLoaded}(this as any as ${entityName}, hint);
226
+ }
227
+
228
+ ${require_tsdoc.tsdocComments.entity.toJSON}
229
+ toJSON(): object;
230
+ toJSON<const H extends ${require_symbols.ToJsonHint}<${entityName}>>(hint: H): Promise<${require_symbols.JsonPayload}<${entityName}, H>>;
231
+ toJSON(hint?: any): object {
232
+ return !hint || typeof hint === "string" ? super.toJSON() : ${require_symbols.toJSON}(this, hint);
233
+ }
234
+ }
235
+ `;
236
+ }
237
+ function fieldHasDefaultValue(field) {
238
+ let { columnDefault } = field;
239
+ if (columnDefault === null) return false;
240
+ columnDefault = columnDefault.toString();
241
+ const fieldType = field.kind === "primitive" ? field.fieldType : "number";
242
+ return fieldType === "number" && !isNaN(parseInt(columnDefault)) || fieldType === "bigint" && !isNaN(parseInt(columnDefault)) || fieldType === "string" && /^'.*'$/.test(columnDefault) || fieldType === "boolean" && ["true", "false"].includes(columnDefault);
243
+ }
244
+ function generatePolymorphicTypes(meta) {
245
+ return meta.polymorphics.flatMap((pf) => [
246
+ ts_poet.code`export type ${pf.fieldType} = ${pf.components.map((c) => ts_poet.code`| ${c.otherEntity.type}`)};`,
247
+ ts_poet.code`export function get${pf.fieldType}Constructors(): ${require_symbols.MaybeAbstractEntityConstructor}<${pf.fieldType}>[] {
248
+ return [${pf.components.map((c) => ts_poet.code`${c.otherEntity.typeSymbol},`)}];
249
+ }`,
250
+ ts_poet.code`export function is${pf.fieldType}(maybeEntity: unknown): maybeEntity is ${pf.fieldType} {
251
+ return ${require_symbols.isEntity}(maybeEntity) && get${pf.fieldType}Constructors().some((type) => maybeEntity instanceof type);
252
+ }`
253
+ ]);
254
+ }
255
+ function generateDefaultValues(config, meta, configName) {
256
+ function notSync(field) {
257
+ return "derived" in field && field.derived !== "sync";
258
+ }
259
+ const primitives = meta.primitives.filter((field) => fieldHasDefaultValue(field)).filter(notSync).map(({ fieldName, columnDefault }) => {
260
+ return ts_poet.code`${configName}.setDefault("${fieldName}", ${columnDefault});`;
261
+ });
262
+ const pgEnums = meta.pgEnums.filter((field) => !!field.columnDefault).map(({ fieldName, columnDefault }) => {
263
+ return ts_poet.code`${configName}.setDefault("${fieldName}", ${columnDefault});`;
264
+ });
265
+ const enums = meta.enums.filter((field) => !!field.columnDefault && !field.isArray).filter(notSync).map(({ fieldName, columnDefault, enumRows, enumType, columnName }) => {
266
+ const defaultRow = enumRows.find((r) => r.id === Number(columnDefault)) || require_utils.fail(`Invalid default value ${columnDefault} for ${meta.tableName}.${columnName}`);
267
+ return ts_poet.code`${configName}.setDefault("${fieldName}", ${enumType}.${(0, change_case.pascalCase)(defaultRow.code)});`;
268
+ });
269
+ return [
270
+ ...primitives,
271
+ ...enums,
272
+ ...pgEnums
273
+ ];
274
+ }
275
+ function generateDefaultValidationRules(db, meta, configName) {
276
+ const rules = [
277
+ ...meta.primitives,
278
+ ...meta.enums,
279
+ ...meta.manyToOnes,
280
+ ...meta.polymorphics
281
+ ].filter((p) => p.notNull).map((p) => {
282
+ const { fieldName } = p;
283
+ const isReactive = "derived" in p && p.derived === "async";
284
+ if ("lazy" in p && p.lazy) return ts_poet.code`${configName}.addRule(${require_symbols.newRequiredLazyFieldRule}("${fieldName}"));`;
285
+ else if (isReactive) return ts_poet.code`${configName}.addRule("${fieldName}", ${require_symbols.newRequiredRule}("${fieldName}"));`;
286
+ else return ts_poet.code`${configName}.addRule(${require_symbols.newRequiredRule}("${fieldName}"));`;
287
+ });
288
+ if (meta.stiDiscriminatorField) {
289
+ const field = meta.enums.find((e) => e.fieldName === meta.stiDiscriminatorField) ?? require_utils.fail("STI field not found");
290
+ rules.push(ts_poet.code`${configName}.addRule(${require_symbols.cannotBeUpdated}("${field.fieldName}"));`);
291
+ }
292
+ const stiEntities = require_inheritance.getStiEntities(db.entities);
293
+ if (stiEntities.size > 0) for (const m2o of meta.manyToOnes) {
294
+ const target = stiEntities.get(m2o.otherEntity.name);
295
+ if (target && m2o.otherEntity.name !== target.base.name) rules.push(ts_poet.code`${configName}.addRule("${m2o.fieldName}", ${require_symbols.mustBeSubType}("${m2o.fieldName}"));`);
296
+ }
297
+ if (meta.baseType) meta.manyToOnes.filter((m2o) => meta.baseType?.manyToOnes?.find((o) => o.fieldName === m2o.fieldName && o.otherEntity.name !== m2o.otherEntity.name)).forEach((m2o) => {
298
+ rules.push(ts_poet.code`${configName}.addRule("${m2o.fieldName}", ${require_symbols.mustBeSubType}("${m2o.fieldName}"));`);
299
+ });
300
+ return rules;
301
+ }
302
+ function generateOptsFields(meta) {
303
+ const primitives = meta.primitives.map((field) => {
304
+ const { fieldName, fieldType, notNull, derived } = field;
305
+ if (derived) return ts_poet.code``;
306
+ return ts_poet.code`${fieldName}${maybeOptionalOrDefault(field)}: ${fieldType}${maybeUnionNull(notNull)};`;
307
+ });
308
+ const enums = meta.enums.map((field) => {
309
+ const { fieldName, enumType, notNull, isArray, derived } = field;
310
+ if (meta.stiDiscriminatorField === fieldName || derived) return ts_poet.code``;
311
+ else if (isArray) return ts_poet.code`${fieldName}?: ${enumType}[];`;
312
+ else return ts_poet.code`${fieldName}${maybeOptionalOrDefault(field)}: ${enumType}${maybeUnionNull(notNull)};`;
313
+ });
314
+ const pgEnums = meta.pgEnums.map((field) => {
315
+ const { fieldName, enumType, notNull } = field;
316
+ return ts_poet.code`${fieldName}${maybeOptionalOrDefault(field)}: ${enumType}${maybeUnionNull(notNull)};`;
317
+ });
318
+ const m2o = meta.manyToOnes.filter(({ derived }) => !derived).filter(({ fieldName }) => !meta.baseType?.manyToOnes.find((o) => o.fieldName === fieldName)).map((field) => {
319
+ const { fieldName, otherEntity, notNull } = field;
320
+ const maybeNull = maybeUnionNull(notNull);
321
+ return ts_poet.code`${fieldName}${maybeOptionalOrDefault(field)}: ${otherEntity.type} | ${otherEntity.idType} ${maybeNull};`;
322
+ });
323
+ const o2o = meta.oneToOnes.map(({ fieldName, otherEntity }) => {
324
+ return ts_poet.code`${fieldName}?: ${otherEntity.type} | null;`;
325
+ });
326
+ const o2m = meta.oneToManys.map(({ fieldName, otherEntity }) => {
327
+ return ts_poet.code`${fieldName}?: ${otherEntity.type}[];`;
328
+ });
329
+ const m2m = meta.manyToManys.filter(({ derived }) => !derived).map(({ fieldName, otherEntity }) => {
330
+ return ts_poet.code`${fieldName}?: ${otherEntity.type}[];`;
331
+ });
332
+ const m2mEnum = meta.manyToManyEnums.map(({ fieldName, enumType }) => {
333
+ return ts_poet.code`${fieldName}?: ${enumType}[];`;
334
+ });
335
+ const polys = meta.polymorphics.map((field) => {
336
+ const { fieldName, notNull, fieldType } = field;
337
+ return ts_poet.code`${fieldName}${maybeOptionalOrDefault(field)}: ${fieldType};`;
338
+ });
339
+ return [
340
+ ...primitives,
341
+ ...enums,
342
+ ...pgEnums,
343
+ ...m2o,
344
+ ...polys,
345
+ ...o2o,
346
+ ...o2m,
347
+ ...m2m,
348
+ ...m2mEnum
349
+ ];
350
+ }
351
+ function generateFieldsType(meta, idType) {
352
+ const id = ts_poet.code`id: { kind: "primitive"; type: ${idType}; unique: ${true}; nullable: never; };`;
353
+ const primitives = meta.primitives.map((field) => {
354
+ const { fieldName, fieldType, notNull, unique, derived } = field;
355
+ return ts_poet.code`${fieldName}: { kind: "primitive"; type: ${fieldType}; unique: ${unique}; nullable: ${undefinedOrNever(notNull)}, derived: ${derived !== false}; };`;
356
+ });
357
+ const enums = meta.enums.map((field) => {
358
+ const { fieldName, enumType, notNull, isArray } = field;
359
+ if (isArray) return ts_poet.code`${fieldName}: { kind: "enum"; type: ${enumType}[]; nullable: never; };`;
360
+ else return ts_poet.code`${fieldName}: { kind: "enum"; type: ${enumType}; nullable: ${undefinedOrNever(notNull)}; };`;
361
+ });
362
+ const pgEnums = meta.pgEnums.map((field) => {
363
+ const { fieldName, enumType, notNull } = field;
364
+ const nullable = undefinedOrNever(notNull);
365
+ return ts_poet.code`${fieldName}: { kind: "enum"; type: ${enumType}; nullable: ${nullable}; native: true; };`;
366
+ });
367
+ const m2o = meta.manyToOnes.map((field) => {
368
+ const { fieldName, otherEntity, notNull, derived } = field;
369
+ return ts_poet.code`${fieldName}: { kind: "m2o"; type: ${otherEntity.type}; nullable: ${undefinedOrNever(notNull)}, derived: ${derived !== false}; };`;
370
+ });
371
+ const polys = meta.polymorphics.map((field) => {
372
+ const { fieldName, notNull, fieldType } = field;
373
+ return ts_poet.code`${fieldName}: { kind: "poly"; type: ${fieldType}; nullable: ${undefinedOrNever(notNull)} };`;
374
+ });
375
+ const m2m = meta.manyToManys.map(({ fieldName, otherEntity }) => {
376
+ return ts_poet.code`${fieldName}: { kind: "m2m"; type: ${otherEntity.type} };`;
377
+ });
378
+ const m2mEnum = meta.manyToManyEnums.map(({ fieldName, enumType }) => {
379
+ return ts_poet.code`${fieldName}: { kind: "m2mEnum"; type: ${enumType} };`;
380
+ });
381
+ const o2m = meta.oneToManys.map(({ fieldName, otherEntity }) => {
382
+ return ts_poet.code`${fieldName}: { kind: "o2m"; type: ${otherEntity.type} };`;
383
+ });
384
+ const o2o = meta.oneToOnes.map((field) => {
385
+ return ts_poet.code`${field.fieldName}: { kind: "o2o"; type: ${field.otherEntity.type} };`;
386
+ });
387
+ const lo2m = meta.largeOneToManys.map(({ fieldName, otherEntity }) => {
388
+ return ts_poet.code`${fieldName}: { kind: "o2m"; type: ${otherEntity.type} };`;
389
+ });
390
+ return [
391
+ id,
392
+ ...primitives,
393
+ ...enums,
394
+ ...pgEnums,
395
+ ...m2o,
396
+ ...polys,
397
+ ...m2m,
398
+ ...m2mEnum,
399
+ ...o2m,
400
+ ...o2o,
401
+ ...lo2m
402
+ ];
403
+ }
404
+ /**
405
+ * Emits physical columns with domain value types and database nullability.
406
+ * I.e. Comment.parent_book_id is an optional Book reference, not the CommentParent union.
407
+ * fieldName identifies direct local domain filters; polymorphic components have no eligible name.
408
+ * Polymorphic component writes remain unsupported, so their policies are conservative.
409
+ */
410
+ function generateColumnsType(meta) {
411
+ const columns = { id: ts_poet.code`{ fieldName: "id"; type: ${require_symbols.IdOf}<${meta.entity.type}>; entity: ${meta.entity.type}; ${columnPolicyType(meta, meta.primaryKey)} }` };
412
+ for (const field of [
413
+ ...meta.primitives,
414
+ ...meta.enums,
415
+ ...meta.pgEnums,
416
+ ...meta.manyToOnes
417
+ ]) {
418
+ const policy = ts_poet.code`fieldName: "${field.fieldName}"; ${columnPolicyType(meta, field)}`;
419
+ if (field.kind === "primitive") columns[field.columnName] = ts_poet.code`{ type: ${field.fieldType}; ${policy} }`;
420
+ else if (field.kind === "m2o") columns[field.columnName] = ts_poet.code`{ type: ${require_symbols.IdOf}<${field.otherEntity.type}>; entity: ${field.otherEntity.type}; ${policy} }`;
421
+ else {
422
+ const array = field.kind === "enum" && field.isArray ? "[]" : "";
423
+ columns[field.columnName] = ts_poet.code`{ type: ${field.enumType}${array}; ${policy} }`;
424
+ }
425
+ }
426
+ for (const field of meta.polymorphics) for (const component of field.components) columns[component.columnName] = ts_poet.code`{ fieldName: never; type: ${require_symbols.IdOf}<${component.otherEntity.type}>; entity: ${component.otherEntity.type}; nullable: true; insert: "never"; update: false; }`;
427
+ return columns;
428
+ }
429
+ /** Emits SQL write policy without using ORM defaults or derived-field restrictions. */
430
+ function columnPolicyType(meta, column) {
431
+ const primaryKey = column === meta.primaryKey ? meta.primaryKey.columnType : void 0;
432
+ const insert = column.columnGenerated ? "never" : !column.columnNotNull || column.columnDefault != null || column === meta.createdAt || column === meta.updatedAt || primaryKey === "int" || primaryKey === "bigint" ? "optional" : "required";
433
+ return ts_poet.code`nullable: ${!column.columnNotNull}; insert: "${insert}"; update: ${!primaryKey && !column.columnGenerated};`;
434
+ }
435
+ function generateOptIdsFields(meta) {
436
+ const m2o = meta.manyToOnes.filter(({ derived }) => !derived).map(({ fieldName, otherEntity }) => {
437
+ return ts_poet.code`${fieldName}Id?: ${otherEntity.idType} | null;`;
438
+ });
439
+ const o2o = meta.oneToOnes.map(({ fieldName, otherEntity }) => {
440
+ return ts_poet.code`${fieldName}Id?: ${otherEntity.idType} | null;`;
441
+ });
442
+ const o2m = meta.oneToManys.map(({ singularName, otherEntity }) => {
443
+ return ts_poet.code`${singularName}Ids?: ${otherEntity.idType}[] | null;`;
444
+ });
445
+ const m2m = meta.manyToManys.filter(({ derived }) => !derived).map(({ singularName, otherEntity }) => {
446
+ return ts_poet.code`${singularName}Ids?: ${otherEntity.idType}[] | null;`;
447
+ });
448
+ const polys = meta.polymorphics.map(({ fieldName, fieldType }) => {
449
+ return ts_poet.code`${fieldName}Id?: ${require_symbols.IdOf}<${fieldType}> | null;`;
450
+ });
451
+ return [
452
+ ...m2o,
453
+ ...polys,
454
+ ...o2o,
455
+ ...o2m,
456
+ ...m2m
457
+ ];
458
+ }
459
+ function generateFilterFields(metasByName, meta) {
460
+ const maybeId = meta.baseClassName ? [] : [ts_poet.code`id?: ${require_symbols.ValueFilter}<${meta.entity.idName}, never> | null;`];
461
+ const primitives = meta.primitives.map(({ fieldName, fieldType, notNull }) => {
462
+ if (fieldType === "boolean") return ts_poet.code`${fieldName}?: ${require_symbols.BooleanFilter}<${nullOrNever(notNull)}>;`;
463
+ else return ts_poet.code`${fieldName}?: ${require_symbols.ValueFilter}<${fieldType}, ${nullOrNever(notNull)}>;`;
464
+ });
465
+ const enums = meta.enums.map(({ fieldName, enumType, notNull, isArray }) => {
466
+ return ts_poet.code`${fieldName}?: ${require_symbols.ValueFilter}<${enumType}${isArray ? "[]" : ""}, ${nullOrNever(notNull)}>;`;
467
+ });
468
+ const pgEnums = meta.pgEnums.map(({ fieldName, enumType, notNull }) => {
469
+ return ts_poet.code`${fieldName}?: ${require_symbols.ValueFilter}<${enumType}, ${nullOrNever(notNull)}>;`;
470
+ });
471
+ const m2o = meta.manyToOnes.flatMap(({ fieldName, otherEntity, notNull }) => {
472
+ const otherMeta = metasByName[otherEntity.name] ?? require_utils.fail(`Could not find metadata for ${otherEntity.name}`);
473
+ return [ts_poet.code`${fieldName}?: ${require_symbols.EntityFilter}<${otherEntity.type}, ${otherEntity.idType}, ${require_symbols.FilterOf}<${otherEntity.type}>, ${nullOrNever(notNull)}>;`, ...otherMeta.subTypes.map((st) => {
474
+ return ts_poet.code`${fieldName}${st.name}?: ${require_symbols.EntityFilter}<${st.entity.type}, ${st.entity.idType}, ${require_symbols.FilterOf}<${st.entity.type}>, ${nullOrNever(notNull)}>;`;
475
+ })];
476
+ });
477
+ const o2o = meta.oneToOnes.map(({ fieldName, otherEntity }) => {
478
+ return ts_poet.code`${fieldName}?: ${require_symbols.EntityFilter}<${otherEntity.type}, ${otherEntity.idType}, ${require_symbols.FilterOf}<${otherEntity.type}>, null | undefined>;`;
479
+ });
480
+ const o2m = meta.oneToManys.flatMap(({ fieldName, otherEntity, otherColumnNotNull }) => {
481
+ const otherMeta = metasByName[otherEntity.name] ?? require_utils.fail(`Could not find metadata for ${otherEntity.name}`);
482
+ return [ts_poet.code`${fieldName}?: ${require_symbols.EntityFilter}<${otherEntity.type}, ${otherEntity.idType}, ${require_symbols.FilterOf}<${otherEntity.type}>, null | undefined>;`, ...otherMeta.subTypes.map((st) => {
483
+ return ts_poet.code`${fieldName}${st.name}?: ${require_symbols.EntityFilter}<${st.entity.type}, ${st.entity.idType}, ${require_symbols.FilterOf}<${st.entity.type}>, ${nullOrNever(otherColumnNotNull)}>;`;
484
+ })];
485
+ });
486
+ const m2m = meta.manyToManys.map(({ fieldName, otherEntity }) => {
487
+ return ts_poet.code`${fieldName}?: ${require_symbols.EntityFilter}<${otherEntity.type}, ${otherEntity.idType}, ${require_symbols.FilterOf}<${otherEntity.type}>, null | undefined>;`;
488
+ });
489
+ const m2mEnum = meta.manyToManyEnums.map(({ fieldName, enumType }) => {
490
+ return ts_poet.code`${fieldName}?: ${require_symbols.ValueFilter}<${enumType}, null | undefined>;`;
491
+ });
492
+ const polys = meta.polymorphics.flatMap(({ fieldName, fieldType, components, notNull }) => {
493
+ return [ts_poet.code`${fieldName}?: ${require_symbols.EntityFilter}<${fieldType}, ${require_symbols.IdOf}<${fieldType}>, never, ${nullOrNever(notNull)}>;`, ...components.map((comp) => {
494
+ const { type } = comp.otherEntity;
495
+ return ts_poet.code`${fieldName}${type}?: ${require_symbols.EntityFilter}<${type}, ${require_symbols.IdOf}<${type}>, ${require_symbols.FilterOf}<${type}>, null>;`;
496
+ })];
497
+ });
498
+ return [
499
+ ...maybeId,
500
+ ...primitives,
501
+ ...enums,
502
+ ...pgEnums,
503
+ ...m2o,
504
+ ...o2o,
505
+ ...o2m,
506
+ ...m2m,
507
+ ...m2mEnum,
508
+ ...polys
509
+ ];
510
+ }
511
+ function generateGraphQLFilterFields(metasByName, meta) {
512
+ const maybeId = meta.baseClassName ? [] : [ts_poet.code`id?: ${require_symbols.ValueGraphQLFilter}<${meta.entity.idName}>;`];
513
+ const primitives = meta.primitives.map(({ fieldName, fieldType }) => {
514
+ if (fieldType === "boolean") return ts_poet.code`${fieldName}?: ${require_symbols.BooleanGraphQLFilter};`;
515
+ else return ts_poet.code`${fieldName}?: ${require_symbols.ValueGraphQLFilter}<${fieldType}>;`;
516
+ });
517
+ const enums = meta.enums.map(({ fieldName, enumType, isArray }) => {
518
+ return ts_poet.code`${fieldName}?: ${require_symbols.ValueGraphQLFilter}<${enumType}${isArray ? "[]" : ""}>;`;
519
+ });
520
+ const pgEnums = meta.pgEnums.map(({ fieldName, enumType }) => {
521
+ return ts_poet.code`${fieldName}?: ${require_symbols.ValueGraphQLFilter}<${enumType}>;`;
522
+ });
523
+ const m2o = meta.manyToOnes.flatMap(({ fieldName, otherEntity, notNull }) => {
524
+ const otherMeta = metasByName[otherEntity.name];
525
+ return [
526
+ ts_poet.code`${fieldName}?: ${require_symbols.EntityGraphQLFilter}<${otherEntity.type}, ${otherEntity.idType}, ${require_symbols.GraphQLFilterOf}<${otherEntity.type}>, ${nullOrNever(notNull)}>;`,
527
+ ts_poet.code`${fieldName}Id?: ${require_symbols.ValueGraphQLFilter}<${otherEntity.idType}>;`,
528
+ ...otherMeta.subTypes.map((st) => {
529
+ return ts_poet.code`${fieldName}${st.name}?: ${require_symbols.EntityGraphQLFilter}<${st.entity.type}, ${st.entity.idType}, ${require_symbols.GraphQLFilterOf}<${st.entity.type}>, ${nullOrNever(notNull)}>;`;
530
+ })
531
+ ];
532
+ });
533
+ const o2o = meta.oneToOnes.map(({ fieldName, otherEntity }) => {
534
+ return ts_poet.code`${fieldName}?: ${require_symbols.EntityGraphQLFilter}<${otherEntity.type}, ${otherEntity.idType}, ${require_symbols.GraphQLFilterOf}<${otherEntity.type}>, null | undefined>;`;
535
+ });
536
+ const o2m = meta.oneToManys.flatMap(({ fieldName, otherEntity, otherColumnNotNull }) => {
537
+ const otherMeta = metasByName[otherEntity.name] ?? require_utils.fail(`Could not find metadata for ${otherEntity.name}`);
538
+ return [ts_poet.code`${fieldName}?: ${require_symbols.EntityGraphQLFilter}<${otherEntity.type}, ${otherEntity.idType}, ${require_symbols.GraphQLFilterOf}<${otherEntity.type}>, null | undefined>;`, ...otherMeta.subTypes.map((st) => {
539
+ return ts_poet.code`${fieldName}${st.name}?: ${require_symbols.EntityGraphQLFilter}<${st.entity.type}, ${st.entity.idType}, ${require_symbols.GraphQLFilterOf}<${st.entity.type}>, ${nullOrNever(otherColumnNotNull)}>;`;
540
+ })];
541
+ });
542
+ const m2m = meta.manyToManys.map(({ fieldName, otherEntity }) => {
543
+ return ts_poet.code`${fieldName}?: ${require_symbols.EntityGraphQLFilter}<${otherEntity.type}, ${otherEntity.idType}, ${require_symbols.GraphQLFilterOf}<${otherEntity.type}>, null | undefined>;`;
544
+ });
545
+ const m2mEnum = meta.manyToManyEnums.map(({ fieldName, enumType }) => {
546
+ return ts_poet.code`${fieldName}?: ${require_symbols.ValueGraphQLFilter}<${enumType}>;`;
547
+ });
548
+ const polys = meta.polymorphics.flatMap(({ fieldName, fieldType, components, notNull }) => {
549
+ return [
550
+ ts_poet.code`${fieldName}?: ${require_symbols.EntityGraphQLFilter}<${fieldType}, ${require_symbols.IdOf}<${fieldType}>, never, ${nullOrNever(notNull)}>;`,
551
+ ts_poet.code`${fieldName}Id?: ${require_symbols.ValueGraphQLFilter}<${require_symbols.IdOf}<${fieldType}>>;`,
552
+ ...components.map((comp) => {
553
+ const { type } = comp.otherEntity;
554
+ return ts_poet.code`${fieldName}${type}?: ${require_symbols.EntityGraphQLFilter}<${type}, ${require_symbols.IdOf}<${type}>, ${require_symbols.FilterOf}<${type}>, null>;`;
555
+ })
556
+ ];
557
+ });
558
+ return [
559
+ ...maybeId,
560
+ ...primitives,
561
+ ...enums,
562
+ ...pgEnums,
563
+ ...m2o,
564
+ ...o2o,
565
+ ...o2m,
566
+ ...m2m,
567
+ ...m2mEnum,
568
+ ...polys
569
+ ];
570
+ }
571
+ function generateOrderFields(meta) {
572
+ const maybeId = meta.baseClassName ? [] : [ts_poet.code`id?: ${require_symbols.OrderBy};`];
573
+ const primitives = meta.primitives.map(({ fieldName }) => {
574
+ return ts_poet.code`${fieldName}?: ${require_symbols.OrderBy};`;
575
+ });
576
+ const enums = meta.enums.map(({ fieldName }) => {
577
+ return ts_poet.code`${fieldName}?: ${require_symbols.OrderBy};`;
578
+ });
579
+ const pgEnums = meta.pgEnums.map(({ fieldName }) => {
580
+ return ts_poet.code`${fieldName}?: ${require_symbols.OrderBy};`;
581
+ });
582
+ const m2o = meta.manyToOnes.map(({ fieldName, otherEntity }) => {
583
+ return ts_poet.code`${fieldName}?: ${otherEntity.orderType};`;
584
+ });
585
+ return [
586
+ ...maybeId,
587
+ ...primitives,
588
+ ...enums,
589
+ ...pgEnums,
590
+ ...m2o
591
+ ];
592
+ }
593
+ function generateFactoryExtrasType(meta) {
594
+ function withName(fieldName) {
595
+ return `with${fieldName[0].toUpperCase() + fieldName.substring(1)}`;
596
+ }
597
+ const primitives = meta.primitives.filter((f) => f.derived === "async").map((field) => {
598
+ const { fieldName, fieldType, notNull } = field;
599
+ return ts_poet.code`${withName(fieldName)}?: ${fieldType}${maybeUnionNull(notNull)};`;
600
+ });
601
+ const enums = meta.enums.filter((f) => f.derived === "async").map((field) => {
602
+ const { fieldName, enumType, notNull, isArray } = field;
603
+ if (isArray) return ts_poet.code`${withName(fieldName)}?: ${enumType}[];`;
604
+ else return ts_poet.code`${withName(fieldName)}?: ${enumType}${maybeUnionNull(notNull)};`;
605
+ });
606
+ return [...primitives, ...enums];
607
+ }
608
+ function createPrimitives(meta, entity, fieldDocs) {
609
+ return meta.primitives.map((p) => {
610
+ const { fieldName, fieldType, notNull } = p;
611
+ const maybeOptional = notNull ? "" : " | undefined";
612
+ if (p.lazy) return ts_poet.code``;
613
+ let getter;
614
+ if (p.derived === "async") getter = ts_poet.code`
615
+ abstract readonly ${fieldName}: ${require_symbols.ReactiveField}<${entity.name}, ${p.fieldType}${maybeOptional}>;
616
+ `;
617
+ else if (p.derived === "sync") getter = ts_poet.code`
618
+ abstract get ${fieldName}(): ${fieldType}${maybeOptional};
619
+ `;
620
+ else if (p.zodSchema) getter = ts_poet.code`
621
+ get ${fieldName}(): ${require_symbols.Zod}.output<typeof ${p.zodSchema}>${maybeOptional} {
622
+ return ${require_symbols.getField}(this, "${fieldName}");
623
+ }
624
+ `;
625
+ else getter = ts_poet.code`
626
+ get ${fieldName}(): ${fieldType}${maybeOptional} {
627
+ return ${require_symbols.getField}(this, "${fieldName}");
628
+ }
629
+ `;
630
+ let setter;
631
+ const paramName = require_keywords.keywords.includes(fieldName) ? "value" : fieldName;
632
+ if (p.protected) setter = ts_poet.code`
633
+ protected set${(0, change_case.pascalCase)(fieldName)}(${paramName}: ${fieldType}${maybeOptional}) {
634
+ ${require_symbols.setField}(this, "${fieldName}", ${paramName});
635
+ }
636
+ `;
637
+ else if (p.derived) setter = "";
638
+ else if (p.superstruct) setter = ts_poet.code`
639
+ set ${fieldName}(value: ${fieldType}${maybeOptional}) {
640
+ if (value) {
641
+ ${require_symbols.SSAssert}(value, ${p.superstruct});
642
+ }
643
+ ${require_symbols.setField}(this, "${fieldName}", value);
644
+ }
645
+ `;
646
+ else if (p.zodSchema) setter = ts_poet.code`
647
+ set ${fieldName}(value: ${require_symbols.Zod}.input<typeof ${p.zodSchema}>${maybeOptional}) {
648
+ if (value) {
649
+ ${require_symbols.setField}(this, "${fieldName}", ${p.zodSchema}.parse(value));
650
+ } else {
651
+ ${require_symbols.setField}(this, "${fieldName}", value);
652
+ }
653
+ }
654
+ `;
655
+ else setter = ts_poet.code`
656
+ set ${fieldName}(${paramName}: ${fieldType}${maybeOptional}) {
657
+ ${require_symbols.setField}(this, "${fieldName}", ${paramName});
658
+ }
659
+ `;
660
+ return ts_poet.code`${fieldDocBlock(fieldDocs, fieldName, entity.name)}${getter} ${setter}`;
661
+ });
662
+ }
663
+ function createRegularEnums(meta, entity, fieldDocs) {
664
+ return meta.enums.filter((e) => !e.isArray).flatMap((e) => {
665
+ const { fieldName, enumType, enumDetailType, enumDetailsType, notNull, enumRows, derived } = e;
666
+ const maybeOptional = notNull ? "" : " | undefined";
667
+ const getByCode = ts_poet.code`${enumDetailType}.getByCode(this.${fieldName})`;
668
+ let getter;
669
+ if (derived === "async") getter = ts_poet.code`
670
+ abstract readonly ${fieldName}: ${require_symbols.ReactiveField}<${entity.name}, ${enumType}${maybeOptional}>;
671
+ `;
672
+ else if (derived === "sync") getter = ts_poet.code`
673
+ abstract get ${fieldName}(): ${enumType}${maybeOptional};
674
+ `;
675
+ else getter = ts_poet.code`
676
+ get ${fieldName}(): ${enumType}${maybeOptional} {
677
+ return ${require_symbols.getField}(this, "${fieldName}");
678
+ }
679
+
680
+ get ${fieldName}Details(): ${enumDetailsType}${maybeOptional} {
681
+ return ${notNull ? getByCode : ts_poet.code`this.${fieldName} ? ${getByCode} : undefined`};
682
+ }
683
+ `;
684
+ let setter;
685
+ if (derived) setter = ts_poet.code``;
686
+ else setter = ts_poet.code`
687
+ set ${fieldName}(${fieldName}: ${enumType}${maybeOptional}) {
688
+ ${require_symbols.setField}(this, "${fieldName}", ${fieldName});
689
+ }
690
+ `;
691
+ const codes = new Set(enumRows.map((r) => r.code));
692
+ const shouldPrefixAccessors = meta.enums.filter((other) => other !== e).some((other) => other.enumRows.some((r) => codes.has(r.code)));
693
+ const accessors = enumRows.map((row) => ts_poet.code`
694
+ get is${shouldPrefixAccessors ? (0, change_case.pascalCase)(fieldName) : ""}${(0, change_case.pascalCase)(row.code)}(): boolean {
695
+ return ${require_symbols.getField}(this, "${fieldName}") === ${enumType}.${(0, change_case.pascalCase)(row.code)};
696
+ }
697
+ `);
698
+ return [
699
+ ts_poet.code`${fieldDocBlock(fieldDocs, fieldName, entity.name)}${getter}`,
700
+ setter,
701
+ ...accessors
702
+ ];
703
+ });
704
+ }
705
+ function createArrayEnums(meta, fieldDocs) {
706
+ return meta.enums.filter((e) => e.isArray).flatMap((e) => {
707
+ const { fieldName, enumType, enumDetailType, enumDetailsType, enumRows } = e;
708
+ const getter = ts_poet.code`
709
+ get ${fieldName}(): ${enumType}[] {
710
+ return ${require_symbols.getField}(this, "${fieldName}") || [];
711
+ }
712
+
713
+ get ${fieldName}Details(): ${enumDetailsType}[] {
714
+ return this.${fieldName}.map(code => ${enumDetailType}.getByCode(code));
715
+ }
716
+ `;
717
+ const setter = ts_poet.code`
718
+ set ${fieldName}(${fieldName}: ${enumType}[]) {
719
+ ${require_symbols.setField}(this, "${fieldName}", ${fieldName});
720
+ }
721
+ `;
722
+ const codes = new Set(enumRows.map((r) => r.code));
723
+ const shouldPrefixAccessors = meta.enums.filter((other) => other !== e).some((other) => other.enumRows.some((r) => codes.has(r.code)));
724
+ const accessors = enumRows.map((row) => ts_poet.code`
725
+ get is${shouldPrefixAccessors ? (0, change_case.pascalCase)(fieldName) : ""}${(0, change_case.pascalCase)(row.code)}(): boolean {
726
+ return this.${fieldName}.includes(${enumType}.${(0, change_case.pascalCase)(row.code)});
727
+ }
728
+ `);
729
+ return [
730
+ ts_poet.code`${fieldDocBlock(fieldDocs, fieldName, meta.entity.name)}${getter}`,
731
+ setter,
732
+ ...accessors
733
+ ];
734
+ });
735
+ }
736
+ function createPgEnums(meta, fieldDocs) {
737
+ return meta.pgEnums.flatMap((e) => {
738
+ const { fieldName, enumType, enumValues, notNull } = e;
739
+ const maybeOptional = notNull ? "" : " | undefined";
740
+ const getter = ts_poet.code`
741
+ get ${fieldName}(): ${enumType}${maybeOptional} {
742
+ return ${require_symbols.getField}(this, "${fieldName}");
743
+ }
744
+ `;
745
+ const setter = ts_poet.code`
746
+ set ${fieldName}(${fieldName}: ${enumType}${maybeOptional}) {
747
+ ${require_symbols.setField}(this, "${fieldName}", ${fieldName});
748
+ }
749
+ `;
750
+ const codes = new Set(enumValues);
751
+ const shouldPrefixAccessors = meta.pgEnums.filter((other) => other !== e).some((other) => other.enumValues.some((r) => codes.has(r)));
752
+ const accessors = enumValues.map((row) => ts_poet.code`
753
+ get is${shouldPrefixAccessors ? (0, change_case.pascalCase)(fieldName) : ""}${(0, change_case.pascalCase)(row)}(): boolean {
754
+ return this.${fieldName} === ${enumType}.${(0, change_case.pascalCase)(row)};
755
+ }
756
+ `);
757
+ return [
758
+ ts_poet.code`${fieldDocBlock(fieldDocs, fieldName, meta.entity.name)}${getter}`,
759
+ setter,
760
+ ...accessors
761
+ ];
762
+ });
763
+ }
764
+ function createRelations(config, meta, entity) {
765
+ const m2o = meta.manyToOnes.map((m2o) => {
766
+ const { fieldName, otherEntity, otherFieldName, notNull } = m2o;
767
+ const maybeOptional = notNull ? "never" : "undefined";
768
+ if (m2o.derived === "async") return {
769
+ kind: "abstract",
770
+ fieldName,
771
+ line: ts_poet.code`abstract readonly ${fieldName}: ${require_symbols.ReactiveReference}<${entity.name}, ${otherEntity.type}, ${maybeOptional}>;`
772
+ };
773
+ return {
774
+ kind: "concrete",
775
+ fieldName,
776
+ decl: ts_poet.code`${require_symbols.ManyToOneReference}<${entity.type}, ${otherEntity.type}, ${maybeOptional}>`,
777
+ init: ts_poet.code`${require_symbols.hasOne}()`
778
+ };
779
+ });
780
+ const m2oBase = meta.baseType?.manyToOnes.filter((m2o) => !meta.manyToOnes.find((o) => o.fieldName === m2o.fieldName)).filter((m2o) => m2o.derived !== "async").map((m2o) => {
781
+ const { fieldName, otherEntity, notNull } = m2o;
782
+ const maybeOptional = notNull ? "never" : "undefined";
783
+ return {
784
+ kind: "super",
785
+ fieldName,
786
+ decl: ts_poet.code`${require_symbols.ManyToOneReference}<${entity.type}, ${otherEntity.type}, ${maybeOptional}>`
787
+ };
788
+ }) ?? [];
789
+ const m2oRecursive = meta.manyToOnes.filter((m2o) => m2o.otherEntity.name === meta.name).filter((m2o) => !(config.entities[meta.inheritanceType == "sti" && meta.baseClassName ? meta.baseClassName : meta.name]?.relations?.[m2o.fieldName]?.skipRecursiveRelations === true)).filter((m2o) => !m2o.derived).flatMap((m2o) => {
790
+ const { fieldName: m2oName, otherFieldName, otherEntity } = m2o;
791
+ const parentsField = `${plural(m2oName)}Recursive`;
792
+ const childrenField = meta.oneToOnes.find((o2o) => o2o.fieldName === otherFieldName) ? `${plural(otherFieldName)}Recursive` : `${otherFieldName}Recursive`;
793
+ return [{
794
+ kind: "concrete",
795
+ fieldName: parentsField,
796
+ decl: ts_poet.code`${require_symbols.ReadOnlyCollection}<${entity.type}, ${otherEntity.type}>`,
797
+ init: ts_poet.code`${require_symbols.hasRecursiveParents}("${m2oName}", "${childrenField}")`
798
+ }, {
799
+ kind: "concrete",
800
+ fieldName: childrenField,
801
+ decl: ts_poet.code`${require_symbols.ReadOnlyCollection}<${entity.type}, ${otherEntity.type}>`,
802
+ init: ts_poet.code`${require_symbols.hasRecursiveChildren}("${otherFieldName}", "${parentsField}")`
803
+ }];
804
+ });
805
+ const m2mRecursive = meta.manyToManys.filter((m2m) => m2m.otherEntity.name === meta.name).filter((m2m) => !m2m.derived).filter((m2m) => !(config.entities[meta.inheritanceType == "sti" && meta.baseClassName ? meta.baseClassName : meta.name]?.relations?.[m2m.fieldName]?.skipRecursiveRelations === true)).map((m2m) => {
806
+ const { fieldName, otherFieldName, otherEntity } = m2m;
807
+ return {
808
+ kind: "concrete",
809
+ fieldName: `${fieldName}Recursive`,
810
+ decl: ts_poet.code`${require_symbols.ReadOnlyCollection}<${entity.type}, ${otherEntity.type}>`,
811
+ init: ts_poet.code`${require_symbols.hasRecursiveM2m}("${fieldName}", "${otherFieldName}Recursive")`
812
+ };
813
+ });
814
+ return [
815
+ meta.oneToManys.map((o2m) => {
816
+ const { fieldName, otherEntity } = o2m;
817
+ return {
818
+ kind: "concrete",
819
+ fieldName,
820
+ decl: ts_poet.code`${require_symbols.Collection}<${entity.type}, ${otherEntity.type}>`,
821
+ init: ts_poet.code`${require_symbols.hasMany}()`
822
+ };
823
+ }),
824
+ meta.baseType?.oneToManys.filter((o2m) => !meta.oneToManys.find((o) => o.fieldName === o2m.fieldName)).map((o2m) => {
825
+ const { fieldName, otherEntity } = o2m;
826
+ return {
827
+ kind: "super",
828
+ fieldName,
829
+ decl: ts_poet.code`${require_symbols.Collection}<${entity.type}, ${otherEntity.type}>`
830
+ };
831
+ }) ?? [],
832
+ meta.largeOneToManys.map((o2m) => {
833
+ const { fieldName, otherEntity } = o2m;
834
+ return {
835
+ kind: "concrete",
836
+ fieldName,
837
+ decl: ts_poet.code`${require_symbols.LargeCollection}<${entity.type}, ${otherEntity.type}>`,
838
+ init: ts_poet.code`${require_symbols.hasLargeMany}()`
839
+ };
840
+ }),
841
+ m2o,
842
+ m2oBase,
843
+ m2oRecursive,
844
+ m2mRecursive,
845
+ meta.oneToOnes.map((o2o) => {
846
+ const { fieldName, otherEntity } = o2o;
847
+ return {
848
+ kind: "concrete",
849
+ fieldName,
850
+ decl: ts_poet.code`${require_symbols.OneToOneReference}<${entity.type}, ${otherEntity.type}>`,
851
+ init: ts_poet.code`${require_symbols.hasOneToOne}()`
852
+ };
853
+ }),
854
+ meta.baseType?.oneToOnes.map((o2o) => {
855
+ const { fieldName, otherEntity } = o2o;
856
+ return {
857
+ kind: "super",
858
+ fieldName,
859
+ decl: ts_poet.code`${require_symbols.OneToOneReference}<${entity.type}, ${otherEntity.type}>`
860
+ };
861
+ }) ?? [],
862
+ meta.manyToManys.map((m2m) => {
863
+ const { fieldName, otherEntity } = m2m;
864
+ const comment = `// ${m2m.joinTableName} ${m2m.columnName} ${m2m.otherColumnName}`;
865
+ if (m2m.derived === "async") return {
866
+ kind: "abstract",
867
+ fieldName,
868
+ line: ts_poet.code`abstract readonly ${fieldName}: ${require_symbols.ReactiveManyToMany}<${entity.name}, ${otherEntity.type}>;`,
869
+ comment
870
+ };
871
+ else if (m2m.derived === "otherSide") return {
872
+ kind: "concrete",
873
+ fieldName,
874
+ decl: ts_poet.code`${require_symbols.ReactiveManyToManyOtherSide}<${entity.type}, ${otherEntity.type}>`,
875
+ init: ts_poet.code`${require_symbols.hasReactiveManyToManyOtherSide}()`,
876
+ comment
877
+ };
878
+ else if (!m2m.derived) return {
879
+ kind: "concrete",
880
+ fieldName,
881
+ decl: ts_poet.code`${require_symbols.Collection}<${entity.type}, ${otherEntity.type}>`,
882
+ init: ts_poet.code`${require_symbols.hasManyToMany}()`,
883
+ comment
884
+ };
885
+ else require_utils.assertNever(m2m.derived);
886
+ }),
887
+ meta.baseType?.manyToManys.filter((m2m) => !m2m.derived).map((m2m) => {
888
+ const { fieldName, otherEntity } = m2m;
889
+ return {
890
+ kind: "super",
891
+ fieldName,
892
+ decl: ts_poet.code`${require_symbols.Collection}<${entity.type}, ${otherEntity.type}>`
893
+ };
894
+ }) ?? [],
895
+ meta.manyToManyEnums.map((m2m) => {
896
+ const { fieldName, enumType } = m2m;
897
+ const comment = `// ${m2m.joinTableName} ${m2m.columnName} ${m2m.otherColumnName}`;
898
+ return {
899
+ kind: "concrete",
900
+ fieldName,
901
+ decl: ts_poet.code`${require_symbols.EnumCollection}<${entity.type}, ${enumType}>`,
902
+ init: ts_poet.code`${require_symbols.hasEnumCollection}()`,
903
+ comment
904
+ };
905
+ }),
906
+ meta.baseType?.manyToManyEnums.map((m2m) => {
907
+ const { fieldName, enumType } = m2m;
908
+ return {
909
+ kind: "super",
910
+ fieldName,
911
+ decl: ts_poet.code`${require_symbols.EnumCollection}<${entity.type}, ${enumType}>`
912
+ };
913
+ }) ?? [],
914
+ meta.largeManyToManys.map((m2m) => {
915
+ const { joinTableName, fieldName, columnName, otherEntity, otherFieldName, otherColumnName } = m2m;
916
+ return {
917
+ kind: "concrete",
918
+ fieldName,
919
+ decl: ts_poet.code`${require_symbols.LargeCollection}<${entity.type}, ${otherEntity.type}>`,
920
+ init: ts_poet.code`
921
+ ${require_symbols.hasLargeManyToMany}(
922
+ "${joinTableName}",
923
+ "${columnName}",
924
+ "${otherFieldName}",
925
+ "${otherColumnName}",
926
+ ${m2m.hasJoinTableId},
927
+ );
928
+ `
929
+ };
930
+ }),
931
+ meta.polymorphics.map((p) => {
932
+ const { fieldName, notNull, fieldType } = p;
933
+ const maybeOptional = notNull ? "never" : "undefined";
934
+ return {
935
+ kind: "concrete",
936
+ fieldName,
937
+ decl: ts_poet.code`${require_symbols.PolymorphicReference}<${entity.type}, ${fieldType}, ${maybeOptional}>`,
938
+ init: ts_poet.code`${require_symbols.hasOnePolymorphic}()`
939
+ };
940
+ }),
941
+ meta.primitives.filter((p) => p.lazy).map((p) => {
942
+ const { fieldName, fieldType, notNull } = p;
943
+ const maybeOptional = notNull ? "" : " | undefined";
944
+ return {
945
+ kind: "concrete",
946
+ fieldName,
947
+ decl: ts_poet.code`${require_symbols.LazyField}<${entity.type}, ${fieldType}${maybeOptional}>`,
948
+ init: ts_poet.code`${require_symbols.hasLazyField}()`
949
+ };
950
+ })
951
+ ].flat();
952
+ }
953
+ /** Makes the field required if there is a `NOT NULL` and no db-or-config default. */
954
+ function maybeOptionalOrDefault(field) {
955
+ const hasDefault = field.kind !== "m2o" && field.kind !== "poly" && fieldHasDefaultValue(field) || field.hasConfigDefault;
956
+ return !field.notNull || hasDefault ? "?" : "";
957
+ }
958
+ function maybeUnionNull(notNull) {
959
+ return notNull ? "" : " | null";
960
+ }
961
+ function undefinedOrNever(notNull) {
962
+ return notNull ? "never" : "undefined";
963
+ }
964
+ function nullOrNever(notNull) {
965
+ return notNull ? "never" : "null";
966
+ }
967
+ /** Returns the nowUTC call for the deleted-at field's generated timestamp type. */
968
+ function nowUTCCall(config, field) {
969
+ if (!config.temporal) return ts_poet.code`${require_symbols.nowUTC}()`;
970
+ switch (field.columnType) {
971
+ case "date": return ts_poet.code`${require_symbols.nowUTC}("plainDate")`;
972
+ case "timestamp without time zone": return ts_poet.code`${require_symbols.nowUTC}("plainDateTime")`;
973
+ case "timestamp with time zone": return ts_poet.code`${require_symbols.nowUTC}("zonedDateTime")`;
974
+ default: return require_utils.fail(`Unsupported deleted-at column type ${field.columnType}`);
975
+ }
976
+ }
977
+ /** Prefixes the comment with a newline, so it gets its own line. */
978
+ function maybeComment(comment) {
979
+ return comment ? ` ${comment}\n` : "";
980
+ }
981
+ /**
982
+ * Renders a field's `.md` doc (plus its `@generated` tag) as a bare JSDoc block, or `""` if undocumented.
983
+ *
984
+ * Reuses the same {@link buildJSDocBlock} formatter the `.md` sync uses for hand-written `Entity.ts`
985
+ * members. Used directly before a getter template (which supplies its own leading newline), so the
986
+ * JSDoc lands immediately above the getter with no intervening blank line.
987
+ */
988
+ function fieldDocBlock(fieldDocs, fieldName, entityName) {
989
+ const doc = fieldDocs[fieldName];
990
+ return doc ? require_docs_parsing.buildJSDocBlock(`${doc}\n${require_docs_parsing.generatedTag(entityName)}`, 0) : "";
991
+ }
992
+ /** Like {@link fieldDocBlock} but wrapped in newlines, i.e. for inline `readonly x = ...` relation decls. */
993
+ function relationDocBlock(fieldDocs, fieldName, entityName) {
994
+ const block = fieldDocBlock(fieldDocs, fieldName, entityName);
995
+ return block ? `\n${block}\n` : "";
996
+ }
997
+ function getIdType(config) {
998
+ switch (config.idType) {
999
+ case "untagged-string":
1000
+ case "tagged-string":
1001
+ case void 0: return "string";
1002
+ case "number": return "number";
1003
+ default: return require_utils.assertNever(config.idType);
1004
+ }
1005
+ }
1006
+ //#endregion
1007
+ exports.generateEntityCodegenFile = generateEntityCodegenFile;
1008
+ exports.getIdType = getIdType;
1009
+
1010
+ //# sourceMappingURL=generateEntityCodegenFile.cjs.map