joist-codegen 2.3.0-next.11 → 2.3.0-next.111

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 -663
  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 +306 -356
  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 +309 -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 +145 -157
  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 -271
  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 -172
  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
package/build/config.js CHANGED
@@ -1,406 +1,356 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.ormMaintainedFields = exports.config = void 0;
7
- exports.warnInvalidConfigEntries = warnInvalidConfigEntries;
8
- exports.isGetterField = isGetterField;
9
- exports.isReactiveField = isReactiveField;
10
- exports.isReactiveReference = isReactiveReference;
11
- exports.isReactiveManyToMany = isReactiveManyToMany;
12
- exports.isProtected = isProtected;
13
- exports.serdeConfig = serdeConfig;
14
- exports.superstructConfig = superstructConfig;
15
- exports.zodSchemaConfig = zodSchemaConfig;
16
- exports.fieldTypeConfig = fieldTypeConfig;
17
- exports.isLargeCollection = isLargeCollection;
18
- exports.softDeletesConfig = softDeletesConfig;
19
- exports.isFieldIgnored = isFieldIgnored;
20
- exports.isFieldHasDefault = isFieldHasDefault;
21
- exports.loadConfig = loadConfig;
22
- exports.writeConfig = writeConfig;
23
- exports.stripStiPlaceholders = stripStiPlaceholders;
24
- exports.getTimestampConfig = getTimestampConfig;
25
- const formatter_1 = require("@dprint/formatter");
26
- const json_1 = require("@dprint/json");
27
- const fs_1 = require("fs");
28
- const joist_utils_1 = require("joist-utils");
29
- const typescript_1 = __importDefault(require("typescript"));
30
- const zod_1 = require("zod");
31
- const codemods_1 = require("./codemods");
32
- const inheritance_1 = require("./inheritance");
33
- const logger_1 = require("./logger");
34
- const utils_1 = require("./utils");
35
- const jsonFormatter = (0, formatter_1.createFromBuffer)((0, fs_1.readFileSync)((0, json_1.getPath)()));
36
- const fieldConfig = zod_1.z
37
- .object({
38
- // For getters & ReactiveFields
39
- derived: zod_1.z.optional(zod_1.z.union([zod_1.z.literal("sync"), zod_1.z.literal("async")])),
40
- protected: zod_1.z.optional(zod_1.z.boolean()),
41
- ignore: zod_1.z.optional(zod_1.z.boolean()),
42
- superstruct: zod_1.z.optional(zod_1.z.string()),
43
- zodSchema: zod_1.z.optional(zod_1.z.string()),
44
- type: zod_1.z.optional(zod_1.z.string()),
45
- serde: zod_1.z.optional(zod_1.z.string()),
46
- stiDiscriminator: zod_1.z.optional(zod_1.z.record(zod_1.z.string(), zod_1.z.string())),
47
- stiType: zod_1.z.optional(zod_1.z.string()),
48
- // Allow subclasses to mark fields as required
49
- notNull: zod_1.z.optional(zod_1.z.boolean()),
50
- // Allow overriding scanEntities default detection for fields with defaults added by helpers
51
- hasDefault: zod_1.z.optional(zod_1.z.boolean()),
52
- })
53
- .strict();
54
- const relationConfig = zod_1.z
55
- .object({
56
- // For ReactiveReferences
57
- derived: zod_1.z.optional(zod_1.z.literal("async")),
58
- polymorphic: zod_1.z.optional(zod_1.z.union([zod_1.z.literal("notNull"), zod_1.z.literal(true)])),
59
- large: zod_1.z.optional(zod_1.z.boolean()),
60
- orderBy: zod_1.z.optional(zod_1.z.string()),
61
- /**
62
- * Controls whether this collection's `.get`/`.load` hide soft-deleted entities.
63
- *
64
- * Defaults to `"exclude"` (soft-deleted entities are hidden); set to `"include"` to have
65
- * this specific o2m/m2m always return soft-deleted entities from `.get`/`.load`.
66
- */
67
- softDeletes: zod_1.z.optional(zod_1.z.union([zod_1.z.literal("include"), zod_1.z.literal("exclude")])),
68
- // Allow pushing m2o/m2m/o2o relations in a base type (Task) down to a subtype (TaskOld)
69
- stiType: zod_1.z.optional(zod_1.z.string()),
70
- /**
71
- * Allow specializing a base type relation (SmallPublisher.group: SmallPublisherGroup).
72
- *
73
- * Self-referential FKs also support `subType: "self"` that means each subtype will point
74
- * at its own subtype.
75
- */
76
- subType: zod_1.z.optional(zod_1.z.string()),
77
- /** Allow skipping self-referential fields getting a `...Recursive` relation. */
78
- skipRecursiveRelations: zod_1.z.optional(zod_1.z.boolean()),
79
- // Allow marking m2o FKs as required on subclasses
80
- notNull: zod_1.z.optional(zod_1.z.boolean()),
81
- // Allow overriding scanEntities default detection for fields with defaults added by helpers
82
- hasDefault: zod_1.z.optional(zod_1.z.boolean()),
83
- })
84
- .strict();
85
- const uniqueByConfig = zod_1.z
86
- .union([zod_1.z.string(), zod_1.z.array(zod_1.z.string()), zod_1.z.array(zod_1.z.array(zod_1.z.string()))])
87
- .transform(normalizeUniqueByConfig);
88
- const entityConfig = zod_1.z
89
- .object({
90
- tag: zod_1.z.string(),
91
- tableName: zod_1.z.optional(zod_1.z.string()),
92
- fields: zod_1.z.optional(zod_1.z.record(zod_1.z.string(), fieldConfig)),
93
- relations: zod_1.z.optional(zod_1.z.record(zod_1.z.string(), relationConfig)),
94
- /** Whether this entity should be abstract, e.g. for inheritance a subtype must be instantiated instead of this type. */
95
- abstract: zod_1.z.optional(zod_1.z.boolean()),
96
- orderBy: zod_1.z.optional(zod_1.z.string()),
97
- uniqueBy: zod_1.z.optional(uniqueByConfig),
98
- })
99
- .strict();
100
- const timestampConfig = zod_1.z
101
- .object({
102
- /** The names to check for this timestamp, i.e. `created_at` `created`, etc. */
103
- names: zod_1.z.array(zod_1.z.string()),
104
- /** Whether this timestamp column is required to consider a table an entity, defaults to `false`. */
105
- required: zod_1.z.optional(zod_1.z.boolean()),
106
- })
107
- .strict();
108
- exports.config = zod_1.z
109
- .object({
110
- /** The _build-time_ database URL for reading database metadata. */
111
- databaseUrl: zod_1.z.optional(zod_1.z.string()),
112
- /** Your application's request-level `Context` type. */
113
- contextType: zod_1.z.optional(zod_1.z.string()),
114
- /** Your application's database client's `Transaction` type. */
115
- transactionType: zod_1.z.optional(zod_1.z.string()),
116
- /**
117
- * Allows the user to specify the `updated_at` / `created_at` column names to look up, and if they're optional.
118
- *
119
- * We default to looking for `updated_at`, `updatedAt`, `created_at`, `createdAt`, and optional to true,
120
- * e.g. tables are not required to have both timestamp columns to be considered entities.
121
- *
122
- * These defaults are the most lenient, to facilitate running Joist against an existing schema and
123
- * seeing all of your entities, regardless of your previous conventions.
124
- */
125
- timestampColumns: zod_1.z.optional(zod_1.z.object({
126
- createdAt: zod_1.z.optional(timestampConfig),
127
- updatedAt: zod_1.z.optional(timestampConfig),
128
- deletedAt: zod_1.z.optional(timestampConfig),
129
- })),
130
- /**
131
- * Allows the user to have codegen output `Temporal` types instead of the base JS `Date`
132
- *
133
- * Additionally, allows for specifying the default time zone for `Temporal` types when converting dates to/from
134
- * the database.
135
- */
136
- temporal: zod_1.z.optional(zod_1.z.union([zod_1.z.boolean(), zod_1.z.object({ timeZone: zod_1.z.string() })])),
137
- /**
138
- * By default, we create a `flush_database` function for fast testing.
139
- *
140
- * However, if you don't want to use this, or you have your own bespoke function like we do
141
- * that is more application-aware, then you can disable Joist's out-of-the-box one.
142
- *
143
- * If you have more than one test database, you can set `createFlushFunction` to the array
144
- * of test database names, i.e. `mydb_test_1`, `mydb_test_2`, etc.
145
- */
146
- createFlushFunction: zod_1.z.optional(zod_1.z.union([zod_1.z.boolean(), zod_1.z.array(zod_1.z.string())])),
147
- entitiesDirectory: zod_1.z.string().default("./src/entities"),
148
- codegenPlugins: zod_1.z.optional(zod_1.z.array(zod_1.z.string())),
149
- entities: zod_1.z.record(zod_1.z.string(), entityConfig).default({}),
150
- ignoredTables: zod_1.z.optional(zod_1.z.array(zod_1.z.string())),
151
- /** The type of entity `id` fields; defaults to `tagged-string`. */
152
- idType: zod_1.z.optional(zod_1.z.union([zod_1.z.literal("tagged-string"), zod_1.z.literal("untagged-string"), zod_1.z.literal("number")])),
153
- /** How we should support non-deferred foreign keys. */
154
- nonDeferredForeignKeys: zod_1.z.optional(zod_1.z.union([zod_1.z.literal("error"), zod_1.z.literal("warn"), zod_1.z.literal("ignore")])),
155
- /** Enables esm output. */
156
- esm: zod_1.z.optional(zod_1.z.boolean()),
157
- /** Controls the style of GraphQL pagination scaffolding. */
158
- paginationStyle: zod_1.z.optional(zod_1.z.union([zod_1.z.literal("cursor"), zod_1.z.literal("limit")])).default("cursor"),
159
- /** Enables documentation syncing between .md files and JSDocs. */
160
- docs: zod_1.z.optional(zod_1.z.boolean()),
161
- /** Output a metadata-docs.ts file with entity/field documentation available at runtime. */
162
- outputDocs: zod_1.z.optional(zod_1.z.boolean()),
163
- /** Auto-set by probing the project's `tsconfig.json` file. */
164
- allowImportingTsExtensions: zod_1.z.optional(zod_1.z.boolean()),
165
- /** The latest Joist codemod counter that has been applied to this project. */
166
- codemodVersion: zod_1.z.number().int().min(0).default(0),
167
- /** A list of postgres schemas to use for finding tables */
168
- schemas: zod_1.z.optional(zod_1.z.array(zod_1.z.string())),
169
- })
170
- .strict();
171
- exports.ormMaintainedFields = ["createdAt", "updatedAt"];
1
+ import { getLatestCodemodVersion } from "./codemods/index.js";
2
+ import { fail, sortKeys, trueIfResolved } from "./utils.js";
3
+ import { getStiEntities } from "./inheritance.js";
4
+ import { logger } from "./logger.js";
5
+ import "./EntityDbMetadata.js";
6
+ import { groupBy } from "joist-utils";
7
+ import { existsSync, promises, readFileSync } from "fs";
8
+ import { dirname, join } from "path";
9
+ import { createFromBuffer } from "@dprint/formatter";
10
+ import { getPath } from "@dprint/json";
11
+ import { parse } from "jsonc-parser";
12
+ import { z } from "zod";
13
+ //#region src/config.ts
14
+ const jsonFormatter = createFromBuffer(readFileSync(getPath()));
15
+ const fieldConfig = z.object({
16
+ derived: z.optional(z.union([z.literal("sync"), z.literal("async")])),
17
+ protected: z.optional(z.boolean()),
18
+ ignore: z.optional(z.boolean()),
19
+ superstruct: z.optional(z.string()),
20
+ zodSchema: z.optional(z.string()),
21
+ type: z.optional(z.string()),
22
+ serde: z.optional(z.string()),
23
+ stiDiscriminator: z.optional(z.record(z.string(), z.string())),
24
+ stiType: z.optional(z.union([z.string(), z.array(z.string())])),
25
+ notNull: z.optional(z.boolean()),
26
+ hasDefault: z.optional(z.boolean()),
27
+ lazy: z.optional(z.boolean())
28
+ }).strict();
29
+ const relationConfig = z.object({
30
+ derived: z.optional(z.literal("async")),
31
+ polymorphic: z.optional(z.union([z.literal("notNull"), z.literal(true)])),
32
+ large: z.optional(z.boolean()),
33
+ orderBy: z.optional(z.string()),
34
+ /**
35
+ * Controls whether this collection's `.get`/`.load` hide soft-deleted entities.
36
+ *
37
+ * Defaults to `"exclude"` (soft-deleted entities are hidden); set to `"include"` to have
38
+ * this specific o2m/m2m always return soft-deleted entities from `.get`/`.load`.
39
+ */
40
+ softDeletes: z.optional(z.union([z.literal("include"), z.literal("exclude")])),
41
+ stiType: z.optional(z.union([z.string(), z.array(z.string())])),
42
+ /**
43
+ * Allow specializing a base type relation (SmallPublisher.group: SmallPublisherGroup).
44
+ *
45
+ * Self-referential FKs also support `subType: "self"` that means each subtype will point
46
+ * at its own subtype.
47
+ */
48
+ subType: z.optional(z.string()),
49
+ /** Allow skipping self-referential fields getting a `...Recursive` relation. */
50
+ skipRecursiveRelations: z.optional(z.boolean()),
51
+ notNull: z.optional(z.boolean()),
52
+ hasDefault: z.optional(z.boolean())
53
+ }).strict();
54
+ const uniqueByConfig = z.union([
55
+ z.string(),
56
+ z.array(z.string()),
57
+ z.array(z.array(z.string()))
58
+ ]).transform(normalizeUniqueByConfig);
59
+ const entityConfig = z.object({
60
+ tag: z.string(),
61
+ tableName: z.optional(z.string()),
62
+ fields: z.optional(z.record(z.string(), fieldConfig)),
63
+ relations: z.optional(z.record(z.string(), relationConfig)),
64
+ /** Whether this entity should be abstract, e.g. for inheritance a subtype must be instantiated instead of this type. */
65
+ abstract: z.optional(z.boolean()),
66
+ orderBy: z.optional(z.string()),
67
+ uniqueBy: z.optional(uniqueByConfig)
68
+ }).strict();
69
+ const timestampConfig = z.object({
70
+ /** The names to check for this timestamp, i.e. `created_at` `created`, etc. */
71
+ names: z.array(z.string()),
72
+ /** Whether this timestamp column is required to consider a table an entity, defaults to `false`. */
73
+ required: z.optional(z.boolean())
74
+ }).strict();
75
+ const config = z.object({
76
+ /** The _build-time_ database URL for reading database metadata. */
77
+ databaseUrl: z.optional(z.string()),
78
+ /** Your application's request-level `Context` type. */
79
+ contextType: z.optional(z.string()),
80
+ /** Your application's database client's `Transaction` type. */
81
+ transactionType: z.optional(z.string()),
82
+ /**
83
+ * Allows the user to specify the `updated_at` / `created_at` column names to look up, and if they're optional.
84
+ *
85
+ * We default to looking for `updated_at`, `updatedAt`, `created_at`, `createdAt`, and optional to true,
86
+ * e.g. tables are not required to have both timestamp columns to be considered entities.
87
+ *
88
+ * These defaults are the most lenient, to facilitate running Joist against an existing schema and
89
+ * seeing all of your entities, regardless of your previous conventions.
90
+ */
91
+ timestampColumns: z.optional(z.object({
92
+ createdAt: z.optional(timestampConfig),
93
+ updatedAt: z.optional(timestampConfig),
94
+ deletedAt: z.optional(timestampConfig)
95
+ })),
96
+ /**
97
+ * Allows the user to have codegen output `Temporal` types instead of the base JS `Date`
98
+ *
99
+ * Additionally, allows for specifying the default time zone for `Temporal` types when converting dates to/from
100
+ * the database.
101
+ */
102
+ temporal: z.optional(z.union([z.boolean(), z.object({ timeZone: z.string() })])),
103
+ /**
104
+ * By default, we create a `flush_database` function for fast testing.
105
+ *
106
+ * However, if you don't want to use this, or you have your own bespoke function like we do
107
+ * that is more application-aware, then you can disable Joist's out-of-the-box one.
108
+ *
109
+ * If you have more than one test database, you can set `createFlushFunction` to the array
110
+ * of test database names, i.e. `mydb_test_1`, `mydb_test_2`, etc.
111
+ */
112
+ createFlushFunction: z.optional(z.union([z.boolean(), z.array(z.string())])),
113
+ entitiesDirectory: z.string().default("./src/entities"),
114
+ codegenPlugins: z.optional(z.array(z.string())),
115
+ entities: z.record(z.string(), entityConfig).default({}),
116
+ ignoredTables: z.optional(z.array(z.string())),
117
+ /** The type of entity `id` fields; defaults to `tagged-string`. */
118
+ idType: z.optional(z.union([
119
+ z.literal("tagged-string"),
120
+ z.literal("untagged-string"),
121
+ z.literal("number")
122
+ ])),
123
+ /** The separator between entity tags and ids; defaults to `:`, and `""` disables the separator. */
124
+ tagDelimiter: z.optional(z.string()),
125
+ /** How we should support non-deferred foreign keys. */
126
+ nonDeferredForeignKeys: z.optional(z.union([
127
+ z.literal("error"),
128
+ z.literal("warn"),
129
+ z.literal("ignore")
130
+ ])),
131
+ /** Enables esm output. */
132
+ esm: z.optional(z.boolean()),
133
+ /** Controls the style of GraphQL pagination scaffolding. */
134
+ paginationStyle: z.optional(z.union([z.literal("cursor"), z.literal("limit")])).default("cursor"),
135
+ /** Enables documentation syncing between .md files and JSDocs. */
136
+ docs: z.optional(z.boolean()),
137
+ /** Installs Joist's bundled Agent Skills into `.claude/skills` and `.agents/skills`; on by default, set `false` to disable. */
138
+ skills: z.optional(z.boolean()),
139
+ /** Output a metadata-docs.ts file with entity/field documentation available at runtime. */
140
+ outputDocs: z.optional(z.boolean()),
141
+ /** Auto-set by probing the project's `tsconfig.json` file. */
142
+ allowImportingTsExtensions: z.optional(z.boolean()),
143
+ /** The latest Joist codemod counter that has been applied to this project. */
144
+ codemodVersion: z.number().int().min(0).default(0),
145
+ /** A list of postgres schemas to use for finding tables */
146
+ schemas: z.optional(z.array(z.string()))
147
+ }).strict();
148
+ const ormMaintainedFields = ["createdAt", "updatedAt"];
172
149
  /** Ensure the user doesn't have any typos in their config. */
173
150
  function warnInvalidConfigEntries(config, db) {
174
- const entitiesByName = (0, joist_utils_1.groupBy)(db.entities, (e) => e.name);
175
- for (const [entityName, entityConfig] of Object.entries(config.entities)) {
176
- const entities = entitiesByName[entityName];
177
- if (!entities) {
178
- logger_1.logger.warn(`Found config for non-existent entity ${entityName}`);
179
- continue;
180
- }
181
- // We don't have keyBy...
182
- const [entity] = entities;
183
- // Check fields
184
- const fields = [...entity.primitives, ...entity.enums];
185
- for (const [name, config] of Object.entries(entityConfig.fields || {})) {
186
- if (config.ignore)
187
- continue;
188
- let field = fields.find((f) => f.fieldName === name);
189
- // STI types might be in the base type
190
- if (!field && entity.stiDiscriminatorField) {
191
- const stiEntities = (0, inheritance_1.getStiEntities)(db.entities).get(entity.name)?.subTypes;
192
- field = stiEntities?.flatMap((st) => [...st.primitives, ...st.enums]).find((f) => f.fieldName === name);
193
- }
194
- if (!field)
195
- logger_1.logger.warn(`Found config for non-existent field ${entityName}.${name}`);
196
- }
197
- // Check relations
198
- const relations = [
199
- ...entity.manyToOnes,
200
- ...entity.oneToManys,
201
- ...entity.manyToManys,
202
- ...entity.manyToManyEnums,
203
- ...entity.oneToOnes,
204
- ...entity.largeOneToManys,
205
- ...entity.largeManyToManys,
206
- ...entity.polymorphics,
207
- ];
208
- for (const [name, _] of Object.entries(entityConfig.relations || {})) {
209
- let relation = relations.find((r) => r.fieldName === name);
210
- // STI types might be in the subtypes
211
- if (!relation && entity.stiDiscriminatorField) {
212
- const stiEntities = (0, inheritance_1.getStiEntities)(db.entities).get(entity.name)?.subTypes;
213
- relation = stiEntities
214
- ?.flatMap((entity) => [
215
- ...entity.manyToOnes,
216
- ...entity.oneToManys,
217
- ...entity.manyToManys,
218
- ...entity.oneToOnes,
219
- ...entity.largeOneToManys,
220
- ...entity.largeManyToManys,
221
- ...entity.polymorphics,
222
- ])
223
- ?.find((f) => f.fieldName === name);
224
- }
225
- // CTI subtype specializations (i.e. SmallPublisher.group: SmallPublisherGroup) need to look in the base type
226
- if (!relation && entity.baseType) {
227
- const baseType = entity.baseType;
228
- relation = [
229
- ...baseType.manyToOnes,
230
- ...baseType.oneToManys,
231
- ...baseType.manyToManys,
232
- ...baseType.oneToOnes,
233
- ...baseType.largeOneToManys,
234
- ...baseType.largeManyToManys,
235
- ...baseType.polymorphics,
236
- ].find((f) => f.fieldName === name);
237
- }
238
- if (!relation)
239
- logger_1.logger.warn(`Found config for non-existent relation ${entityName}.${name}`);
240
- }
241
- const uniqueFields = [
242
- ...entity.primitives,
243
- ...entity.enums,
244
- ...entity.pgEnums,
245
- ...entity.manyToOnes,
246
- ...entity.polymorphics,
247
- ];
248
- for (const uniqueBy of entityConfig.uniqueBy || []) {
249
- for (const name of uniqueBy) {
250
- const field = uniqueFields.find((f) => f.fieldName === name);
251
- if (!field) {
252
- logger_1.logger.warn(`Found uniqueBy for non-existent or non-queryable field ${entityName}.${name}`);
253
- }
254
- else if (field.kind === "primitive" && (field.derived || field.isArray || field.customSerde)) {
255
- logger_1.logger.warn(`Found uniqueBy for unsupported primitive field ${entityName}.${name}`);
256
- }
257
- else if (field.kind === "enum" && (field.derived || field.isArray)) {
258
- logger_1.logger.warn(`Found uniqueBy for unsupported enum field ${entityName}.${name}`);
259
- }
260
- }
261
- }
262
- }
151
+ const entitiesByName = groupBy(db.entities, (e) => e.name);
152
+ for (const [entityName, entityConfig] of Object.entries(config.entities)) {
153
+ const entities = entitiesByName[entityName];
154
+ if (!entities) {
155
+ logger.warn(`Found config for non-existent entity ${entityName}`);
156
+ continue;
157
+ }
158
+ const [entity] = entities;
159
+ const fields = [...entity.primitives, ...entity.enums];
160
+ for (const [name, config] of Object.entries(entityConfig.fields || {})) {
161
+ if (config.ignore) continue;
162
+ let field = fields.find((f) => f.fieldName === name);
163
+ if (!field && entity.stiDiscriminatorField) field = (getStiEntities(db.entities).get(entity.name)?.subTypes)?.flatMap((st) => [...st.primitives, ...st.enums]).find((f) => f.fieldName === name);
164
+ if (!field) logger.warn(`Found config for non-existent field ${entityName}.${name}`);
165
+ }
166
+ const relations = [
167
+ ...entity.manyToOnes,
168
+ ...entity.oneToManys,
169
+ ...entity.manyToManys,
170
+ ...entity.manyToManyEnums,
171
+ ...entity.oneToOnes,
172
+ ...entity.largeOneToManys,
173
+ ...entity.largeManyToManys,
174
+ ...entity.polymorphics
175
+ ];
176
+ for (const [name, _] of Object.entries(entityConfig.relations || {})) {
177
+ let relation = relations.find((r) => r.fieldName === name);
178
+ if (!relation && entity.stiDiscriminatorField) relation = (getStiEntities(db.entities).get(entity.name)?.subTypes)?.flatMap((entity) => [
179
+ ...entity.manyToOnes,
180
+ ...entity.oneToManys,
181
+ ...entity.manyToManys,
182
+ ...entity.oneToOnes,
183
+ ...entity.largeOneToManys,
184
+ ...entity.largeManyToManys,
185
+ ...entity.polymorphics
186
+ ])?.find((f) => f.fieldName === name);
187
+ if (!relation && entity.baseType) {
188
+ const baseType = entity.baseType;
189
+ relation = [
190
+ ...baseType.manyToOnes,
191
+ ...baseType.oneToManys,
192
+ ...baseType.manyToManys,
193
+ ...baseType.oneToOnes,
194
+ ...baseType.largeOneToManys,
195
+ ...baseType.largeManyToManys,
196
+ ...baseType.polymorphics
197
+ ].find((f) => f.fieldName === name);
198
+ }
199
+ if (!relation) logger.warn(`Found config for non-existent relation ${entityName}.${name}`);
200
+ }
201
+ const uniqueFields = [
202
+ ...entity.primitives,
203
+ ...entity.enums,
204
+ ...entity.pgEnums,
205
+ ...entity.manyToOnes,
206
+ ...entity.polymorphics
207
+ ];
208
+ for (const uniqueBy of entityConfig.uniqueBy || []) for (const name of uniqueBy) {
209
+ const field = uniqueFields.find((f) => f.fieldName === name);
210
+ if (!field) logger.warn(`Found uniqueBy for non-existent or non-queryable field ${entityName}.${name}`);
211
+ else if (field.kind === "primitive" && (field.derived || field.isArray || field.customSerde)) logger.warn(`Found uniqueBy for unsupported primitive field ${entityName}.${name}`);
212
+ else if (field.kind === "enum" && (field.derived || field.isArray)) logger.warn(`Found uniqueBy for unsupported enum field ${entityName}.${name}`);
213
+ }
214
+ }
263
215
  }
264
216
  function isGetterField(config, entity, fieldName) {
265
- return config.entities[entity.name]?.fields?.[fieldName]?.derived === "sync";
217
+ return config.entities[entity.name]?.fields?.[fieldName]?.derived === "sync";
266
218
  }
267
219
  function isReactiveField(config, entity, fieldName) {
268
- return config.entities[entity.name]?.fields?.[fieldName]?.derived === "async";
220
+ return config.entities[entity.name]?.fields?.[fieldName]?.derived === "async";
269
221
  }
270
222
  function isReactiveReference(config, entity, fieldName) {
271
- return config.entities[entity.name]?.relations?.[fieldName]?.derived === "async";
223
+ return config.entities[entity.name]?.relations?.[fieldName]?.derived === "async";
272
224
  }
273
225
  /** Returns true if this m2m relation is configured as a ReactiveManyToMany (derived: async). */
274
226
  function isReactiveManyToMany(config, entity, fieldName) {
275
- return config.entities[entity.name]?.relations?.[fieldName]?.derived === "async";
227
+ return config.entities[entity.name]?.relations?.[fieldName]?.derived === "async";
276
228
  }
277
229
  function isProtected(config, entity, fieldName) {
278
- return config.entities[entity.name]?.fields?.[fieldName]?.protected === true;
230
+ return config.entities[entity.name]?.fields?.[fieldName]?.protected === true;
231
+ }
232
+ /** Whether a column should be excluded from the default SELECT and exposed as a lazy-loaded `LazyField`. */
233
+ function isLazyField(config, entity, fieldName) {
234
+ return config.entities[entity.name]?.fields?.[fieldName]?.lazy === true;
279
235
  }
280
236
  function serdeConfig(config, entity, fieldName) {
281
- return config.entities[entity.name]?.fields?.[fieldName]?.serde;
237
+ return config.entities[entity.name]?.fields?.[fieldName]?.serde;
282
238
  }
283
239
  function superstructConfig(config, entity, fieldName) {
284
- return config.entities[entity.name]?.fields?.[fieldName]?.superstruct;
240
+ return config.entities[entity.name]?.fields?.[fieldName]?.superstruct;
285
241
  }
286
242
  function zodSchemaConfig(config, entity, fieldName) {
287
- return config.entities[entity.name]?.fields?.[fieldName]?.zodSchema;
243
+ return config.entities[entity.name]?.fields?.[fieldName]?.zodSchema;
288
244
  }
289
245
  function fieldTypeConfig(config, entity, fieldName) {
290
- return config.entities[entity.name]?.fields?.[fieldName]?.type;
246
+ return config.entities[entity.name]?.fields?.[fieldName]?.type;
291
247
  }
292
248
  function isLargeCollection(config, entity, fieldName) {
293
- return config.entities[entity.name]?.relations?.[fieldName]?.large === true;
249
+ return config.entities[entity.name]?.relations?.[fieldName]?.large === true;
294
250
  }
295
251
  /** Whether a collection should include (or exclude) soft-deleted entities from `.get`/`.load`. */
296
252
  function softDeletesConfig(config, entity, fieldName) {
297
- return config.entities[entity.name]?.relations?.[fieldName]?.softDeletes;
253
+ return config.entities[entity.name]?.relations?.[fieldName]?.softDeletes;
298
254
  }
299
255
  function isFieldIgnored(config, entity, fieldName, notNull = false, hasDefault = false) {
300
- const ignore = config.entities[entity.name]?.fields?.[fieldName]?.ignore === true;
301
- if (ignore && notNull && !hasDefault) {
302
- (0, utils_1.fail)(`notNull field ${entity.name}.${fieldName} cannot be ignored. Alter the column to be optional or have a default value prior to ignoring it.`);
303
- }
304
- return ignore;
256
+ const ignore = config.entities[entity.name]?.fields?.[fieldName]?.ignore === true;
257
+ if (ignore && notNull && !hasDefault) fail(`notNull field ${entity.name}.${fieldName} cannot be ignored. Alter the column to be optional or have a default value prior to ignoring it.`);
258
+ return ignore;
305
259
  }
306
260
  function isFieldHasDefault(config, entity, fieldName) {
307
- const entityConfig = config.entities[entity.name] ?? {};
308
- const fieldConfig = entityConfig.fields?.[fieldName] ?? entityConfig.relations?.[fieldName] ?? {};
309
- return fieldConfig.hasDefault === true;
261
+ const entityConfig = config.entities[entity.name] ?? {};
262
+ return (entityConfig.fields?.[fieldName] ?? entityConfig.relations?.[fieldName] ?? {}).hasDefault === true;
310
263
  }
311
264
  const configPath = "./joist-config.json";
312
265
  async function loadConfig() {
313
- const exists = await (0, utils_1.trueIfResolved)(fs_1.promises.access(configPath));
314
- if (exists) {
315
- const content = await fs_1.promises.readFile(configPath);
316
- const result = exports.config.safeParse(stripLegacyConfigKeys(JSON.parse(content.toString())));
317
- if (!result.success) {
318
- throw new Error(`Invalid joist-config.json: ${result.error.issues
319
- .map((ze) => `${ze.path.map(String).join("/")} ${ze.message}`)
320
- .join("\n")}`);
321
- }
322
- result.data.allowImportingTsExtensions ??= projectIsUsingEsmWithImports();
323
- return result.data;
324
- }
325
- // Brand-new projects should not be prompted to run historical codemods.
326
- const initial = exports.config.parse({ codemodVersion: (0, codemods_1.getLatestCodemodVersion)() });
327
- initial.allowImportingTsExtensions ??= projectIsUsingEsmWithImports();
328
- return initial;
266
+ if (await trueIfResolved(promises.access(configPath))) {
267
+ const content = await promises.readFile(configPath);
268
+ const result = config.safeParse(stripLegacyConfigKeys(JSON.parse(content.toString())));
269
+ if (!result.success) throw new Error(`Invalid joist-config.json: ${result.error.issues.map((ze) => `${ze.path.map(String).join("/")} ${ze.message}`).join("\n")}`);
270
+ result.data.allowImportingTsExtensions ??= projectIsUsingEsmWithImports();
271
+ return result.data;
272
+ }
273
+ const initial = config.parse({ codemodVersion: getLatestCodemodVersion() });
274
+ initial.allowImportingTsExtensions ??= projectIsUsingEsmWithImports();
275
+ return initial;
329
276
  }
330
277
  /**
331
- * Writes the potentially-updated config entry back to `joist-config.json`.
332
- *
333
- * We format the output with prettier so it should both a) look nice and b) be deterministic,
334
- * such that no changes to the config show up as noops to the scm.
335
- */
278
+ * Writes the potentially-updated config entry back to `joist-config.json`.
279
+ *
280
+ * We format the output with prettier so it should both a) look nice and b) be deterministic,
281
+ * such that no changes to the config show up as noops to the scm.
282
+ */
336
283
  async function writeConfig(config) {
337
- const sorted = (0, utils_1.sortKeys)(config);
338
- delete sorted.__tableToEntityName;
339
- delete sorted.allowImportingTsExtensions;
340
- if (sorted.paginationStyle === "cursor") {
341
- delete sorted.paginationStyle;
342
- }
343
- const input = JSON.stringify(sorted);
344
- const content = jsonFormatter.formatText({ filePath: "test.json", fileText: input });
345
- await fs_1.promises.writeFile(configPath, content);
284
+ const sorted = sortKeys(config);
285
+ delete sorted.__tableToEntityName;
286
+ delete sorted.allowImportingTsExtensions;
287
+ if (sorted.paginationStyle === "cursor") delete sorted.paginationStyle;
288
+ const input = JSON.stringify(sorted);
289
+ const content = jsonFormatter.formatText({
290
+ filePath: "test.json",
291
+ fileText: input
292
+ });
293
+ await promises.writeFile(configPath, content);
346
294
  }
347
295
  function stripStiPlaceholders(config, entities) {
348
- // Defacto (with today's setup) the config of STI entities lives on the base entity,
349
- // so don't write confusing subtype-specific entries into the config file.
350
- // ...hopefully we don't have any code accidentally looking for the STI config...
351
- for (const entity of entities) {
352
- if (entity.inheritanceType === "sti" && entity.stiDiscriminatorValue) {
353
- delete config.entities[entity.name];
354
- }
355
- }
296
+ for (const entity of entities) if (entity.inheritanceType === "sti" && entity.stiDiscriminatorValue) delete config.entities[entity.name];
356
297
  }
357
298
  /** Applies defaults to the timestamp config. */
358
299
  function getTimestampConfig(config) {
359
- return {
360
- createdAtConf: {
361
- names: ["created_at", "createdAt"],
362
- required: false,
363
- ...config?.timestampColumns?.createdAt,
364
- },
365
- updatedAtConf: {
366
- names: ["updated_at", "updatedAt"],
367
- required: false,
368
- ...config?.timestampColumns?.updatedAt,
369
- },
370
- deletedAtConf: {
371
- names: ["deleted_at", "deletedAt"],
372
- required: false,
373
- ...config?.timestampColumns?.deletedAt,
374
- },
375
- };
300
+ return {
301
+ createdAtConf: {
302
+ names: ["created_at", "createdAt"],
303
+ required: false,
304
+ ...config?.timestampColumns?.createdAt
305
+ },
306
+ updatedAtConf: {
307
+ names: ["updated_at", "updatedAt"],
308
+ required: false,
309
+ ...config?.timestampColumns?.updatedAt
310
+ },
311
+ deletedAtConf: {
312
+ names: ["deleted_at", "deletedAt"],
313
+ required: false,
314
+ ...config?.timestampColumns?.deletedAt
315
+ }
316
+ };
376
317
  }
377
318
  function projectIsUsingEsmWithImports() {
378
- // Attempt to find the project's tsconfig.json in the current directory or up the directory hierarchy
379
- const configPath = typescript_1.default.findConfigFile("./", typescript_1.default.sys.fileExists, "tsconfig.json");
380
- if (!configPath) {
381
- return false;
382
- }
383
- const configFile = typescript_1.default.readConfigFile(configPath, typescript_1.default.sys.readFile);
384
- if (configFile.error) {
385
- return false;
386
- }
387
- return configFile.config?.compilerOptions?.allowImportingTsExtensions === true;
319
+ const configPath = findTsConfigFile(process.cwd());
320
+ if (!configPath) return false;
321
+ try {
322
+ const errors = [];
323
+ const parsed = parse(readFileSync(configPath, "utf8"), errors, { allowTrailingComma: true });
324
+ if (errors.length > 0 || typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) return false;
325
+ const compilerOptions = parsed.compilerOptions;
326
+ return typeof compilerOptions === "object" && compilerOptions !== null && !Array.isArray(compilerOptions) && compilerOptions.allowImportingTsExtensions === true;
327
+ } catch {
328
+ return false;
329
+ }
388
330
  }
389
331
  /** Normalizes `uniqueBy` config sugar into runtime identity candidates. */
390
332
  function normalizeUniqueByConfig(uniqueBy) {
391
- if (typeof uniqueBy === "string")
392
- return [[uniqueBy]];
393
- if (uniqueBy.every((field) => typeof field === "string"))
394
- return [uniqueBy];
395
- return uniqueBy;
333
+ if (typeof uniqueBy === "string") return [[uniqueBy]];
334
+ if (uniqueBy.every((field) => typeof field === "string")) return [uniqueBy];
335
+ return uniqueBy;
396
336
  }
397
337
  function stripLegacyConfigKeys(raw) {
398
- if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
399
- return raw;
400
- }
401
- // Accept old configs so the deprecated key disappears on the next write.
402
- const parsed = { ...raw };
403
- delete parsed.version;
404
- return parsed;
338
+ if (!raw || typeof raw !== "object" || Array.isArray(raw)) return raw;
339
+ const parsed = { ...raw };
340
+ delete parsed.version;
341
+ return parsed;
342
+ }
343
+ /** Finds the nearest `tsconfig.json` in `directory` or one of its ancestors. */
344
+ function findTsConfigFile(directory) {
345
+ while (true) {
346
+ const fileName = join(directory, "tsconfig.json");
347
+ if (existsSync(fileName)) return fileName;
348
+ const parent = dirname(directory);
349
+ if (parent === directory) return void 0;
350
+ directory = parent;
351
+ }
405
352
  }
353
+ //#endregion
354
+ export { config, fieldTypeConfig, getTimestampConfig, isFieldHasDefault, isFieldIgnored, isGetterField, isLargeCollection, isLazyField, isProtected, isReactiveField, isReactiveManyToMany, isReactiveReference, loadConfig, ormMaintainedFields, serdeConfig, softDeletesConfig, stripStiPlaceholders, superstructConfig, warnInvalidConfigEntries, writeConfig, zodSchemaConfig };
355
+
406
356
  //# sourceMappingURL=config.js.map