joist-codegen 2.3.0-next.42 → 2.3.0-next.43

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