joist-codegen 2.3.0-next.7 → 2.3.0-next.71

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (420) hide show
  1. package/build/EntityDbMetadata.cjs +642 -0
  2. package/build/EntityDbMetadata.cjs.map +1 -0
  3. package/build/EntityDbMetadata.d.cts +299 -0
  4. package/build/EntityDbMetadata.d.cts.map +1 -0
  5. package/build/EntityDbMetadata.d.mts +299 -0
  6. package/build/EntityDbMetadata.d.mts.map +1 -0
  7. package/build/EntityDbMetadata.js +519 -661
  8. package/build/EntityDbMetadata.js.map +1 -1
  9. package/build/_virtual/_rolldown/runtime.cjs +23 -0
  10. package/build/_virtual/_rolldown/runtime.js +5 -0
  11. package/build/assignTags.cjs +45 -0
  12. package/build/assignTags.cjs.map +1 -0
  13. package/build/{assignTags.d.ts → assignTags.d.cts} +8 -4
  14. package/build/assignTags.d.cts.map +1 -0
  15. package/build/assignTags.d.mts +16 -0
  16. package/build/assignTags.d.mts.map +1 -0
  17. package/build/assignTags.js +37 -59
  18. package/build/assignTags.js.map +1 -1
  19. package/build/codemods/Codemod.cjs +2 -0
  20. package/build/codemods/Codemod.d.cts +17 -0
  21. package/build/codemods/Codemod.d.cts.map +1 -0
  22. package/build/codemods/Codemod.d.mts +17 -0
  23. package/build/codemods/Codemod.d.mts.map +1 -0
  24. package/build/codemods/Codemod.js +2 -3
  25. package/build/codemods/JscodeshiftMod.cjs +42 -0
  26. package/build/codemods/JscodeshiftMod.cjs.map +1 -0
  27. package/build/codemods/JscodeshiftMod.d.cts +14 -0
  28. package/build/codemods/JscodeshiftMod.d.cts.map +1 -0
  29. package/build/codemods/JscodeshiftMod.d.mts +14 -0
  30. package/build/codemods/JscodeshiftMod.d.mts.map +1 -0
  31. package/build/codemods/JscodeshiftMod.js +33 -33
  32. package/build/codemods/JscodeshiftMod.js.map +1 -1
  33. package/build/codemods/codemod_0001-rename_has_async_property.cjs +30 -0
  34. package/build/codemods/codemod_0001-rename_has_async_property.cjs.map +1 -0
  35. package/build/codemods/codemod_0001-rename_has_async_property.d.cts +9 -0
  36. package/build/codemods/codemod_0001-rename_has_async_property.d.cts.map +1 -0
  37. package/build/codemods/codemod_0001-rename_has_async_property.d.mts +9 -0
  38. package/build/codemods/codemod_0001-rename_has_async_property.d.mts.map +1 -0
  39. package/build/codemods/codemod_0001-rename_has_async_property.js +21 -25
  40. package/build/codemods/codemod_0001-rename_has_async_property.js.map +1 -1
  41. package/build/codemods/codemod_0002-rename_async_query_fields.cjs +50 -0
  42. package/build/codemods/codemod_0002-rename_async_query_fields.cjs.map +1 -0
  43. package/build/codemods/codemod_0002-rename_async_query_fields.d.cts +9 -0
  44. package/build/codemods/codemod_0002-rename_async_query_fields.d.cts.map +1 -0
  45. package/build/codemods/codemod_0002-rename_async_query_fields.d.mts +9 -0
  46. package/build/codemods/codemod_0002-rename_async_query_fields.d.mts.map +1 -0
  47. package/build/codemods/codemod_0002-rename_async_query_fields.js +38 -52
  48. package/build/codemods/codemod_0002-rename_async_query_fields.js.map +1 -1
  49. package/build/codemods/codemod_0003-rename_find_paginated.cjs +25 -0
  50. package/build/codemods/codemod_0003-rename_find_paginated.cjs.map +1 -0
  51. package/build/codemods/codemod_0003-rename_find_paginated.d.cts +9 -0
  52. package/build/codemods/codemod_0003-rename_find_paginated.d.cts.map +1 -0
  53. package/build/codemods/codemod_0003-rename_find_paginated.d.mts +9 -0
  54. package/build/codemods/codemod_0003-rename_find_paginated.d.mts.map +1 -0
  55. package/build/codemods/codemod_0003-rename_find_paginated.js +17 -26
  56. package/build/codemods/codemod_0003-rename_find_paginated.js.map +1 -1
  57. package/build/codemods/index.cjs +49 -0
  58. package/build/codemods/index.cjs.map +1 -0
  59. package/build/codemods/index.d.cts +12 -0
  60. package/build/codemods/index.d.cts.map +1 -0
  61. package/build/codemods/index.d.mts +12 -0
  62. package/build/codemods/index.d.mts.map +1 -0
  63. package/build/codemods/index.js +34 -42
  64. package/build/codemods/index.js.map +1 -1
  65. package/build/config.cjs +377 -0
  66. package/build/config.cjs.map +1 -0
  67. package/build/config.d.cts +181 -0
  68. package/build/config.d.cts.map +1 -0
  69. package/build/config.d.mts +181 -0
  70. package/build/config.d.mts.map +1 -0
  71. package/build/config.js +309 -347
  72. package/build/config.js.map +1 -1
  73. package/build/docs/cache.cjs +62 -0
  74. package/build/docs/cache.cjs.map +1 -0
  75. package/build/docs/cache.d.cts +17 -0
  76. package/build/docs/cache.d.cts.map +1 -0
  77. package/build/docs/cache.d.mts +17 -0
  78. package/build/docs/cache.d.mts.map +1 -0
  79. package/build/docs/cache.js +52 -53
  80. package/build/docs/cache.js.map +1 -1
  81. package/build/docs/generate-metadata-docs.cjs +32 -0
  82. package/build/docs/generate-metadata-docs.cjs.map +1 -0
  83. package/build/docs/generate-metadata-docs.d.cts +9 -0
  84. package/build/docs/generate-metadata-docs.d.cts.map +1 -0
  85. package/build/docs/generate-metadata-docs.d.mts +9 -0
  86. package/build/docs/generate-metadata-docs.d.mts.map +1 -0
  87. package/build/docs/generate-metadata-docs.js +19 -24
  88. package/build/docs/generate-metadata-docs.js.map +1 -1
  89. package/build/docs/index.cjs +90 -0
  90. package/build/docs/index.cjs.map +1 -0
  91. package/build/docs/index.d.cts +16 -0
  92. package/build/docs/index.d.cts.map +1 -0
  93. package/build/docs/index.d.mts +16 -0
  94. package/build/docs/index.d.mts.map +1 -0
  95. package/build/docs/index.js +75 -80
  96. package/build/docs/index.js.map +1 -1
  97. package/build/docs/markdown.cjs +181 -0
  98. package/build/docs/markdown.cjs.map +1 -0
  99. package/build/docs/{markdown.d.ts → markdown.d.cts} +14 -12
  100. package/build/docs/markdown.d.cts.map +1 -0
  101. package/build/docs/markdown.d.mts +32 -0
  102. package/build/docs/markdown.d.mts.map +1 -0
  103. package/build/docs/markdown.js +152 -220
  104. package/build/docs/markdown.js.map +1 -1
  105. package/build/docs/parsing.cjs +117 -0
  106. package/build/docs/parsing.cjs.map +1 -0
  107. package/build/docs/parsing.d.cts +48 -0
  108. package/build/docs/parsing.d.cts.map +1 -0
  109. package/build/docs/parsing.d.mts +48 -0
  110. package/build/docs/parsing.d.mts.map +1 -0
  111. package/build/docs/parsing.js +89 -88
  112. package/build/docs/parsing.js.map +1 -1
  113. package/build/findEntityScopes.cjs +119 -0
  114. package/build/findEntityScopes.cjs.map +1 -0
  115. package/build/findEntityScopes.d.cts +14 -0
  116. package/build/findEntityScopes.d.cts.map +1 -0
  117. package/build/findEntityScopes.d.mts +14 -0
  118. package/build/findEntityScopes.d.mts.map +1 -0
  119. package/build/findEntityScopes.js +83 -111
  120. package/build/findEntityScopes.js.map +1 -1
  121. package/build/foreignKeyOrdering.cjs +52 -0
  122. package/build/foreignKeyOrdering.cjs.map +1 -0
  123. package/build/foreignKeyOrdering.d.cts +8 -0
  124. package/build/foreignKeyOrdering.d.cts.map +1 -0
  125. package/build/foreignKeyOrdering.d.mts +8 -0
  126. package/build/foreignKeyOrdering.d.mts.map +1 -0
  127. package/build/foreignKeyOrdering.js +46 -55
  128. package/build/foreignKeyOrdering.js.map +1 -1
  129. package/build/generate.cjs +128 -0
  130. package/build/generate.cjs.map +1 -0
  131. package/build/generate.d.cts +17 -0
  132. package/build/generate.d.cts.map +1 -0
  133. package/build/generate.d.mts +17 -0
  134. package/build/generate.d.mts.map +1 -0
  135. package/build/generate.js +111 -124
  136. package/build/generate.js.map +1 -1
  137. package/build/generateEntitiesFile.cjs +46 -0
  138. package/build/generateEntitiesFile.cjs.map +1 -0
  139. package/build/generateEntitiesFile.d.cts +11 -0
  140. package/build/generateEntitiesFile.d.cts.map +1 -0
  141. package/build/generateEntitiesFile.d.mts +11 -0
  142. package/build/generateEntitiesFile.d.mts.map +1 -0
  143. package/build/generateEntitiesFile.js +28 -25
  144. package/build/generateEntitiesFile.js.map +1 -1
  145. package/build/generateEntityCodegenFile.cjs +1009 -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 +792 -827
  152. package/build/generateEntityCodegenFile.js.map +1 -1
  153. package/build/generateEntityFile.cjs +23 -0
  154. package/build/generateEntityFile.cjs.map +1 -0
  155. package/build/generateEntityFile.d.cts +9 -0
  156. package/build/generateEntityFile.d.cts.map +1 -0
  157. package/build/generateEntityFile.d.mts +9 -0
  158. package/build/generateEntityFile.d.mts.map +1 -0
  159. package/build/generateEntityFile.js +11 -8
  160. package/build/generateEntityFile.js.map +1 -1
  161. package/build/generateEntityTestFile.cjs +25 -0
  162. package/build/generateEntityTestFile.cjs.map +1 -0
  163. package/build/generateEntityTestFile.d.cts +9 -0
  164. package/build/generateEntityTestFile.d.cts.map +1 -0
  165. package/build/generateEntityTestFile.d.mts +9 -0
  166. package/build/generateEntityTestFile.d.mts.map +1 -0
  167. package/build/generateEntityTestFile.js +10 -7
  168. package/build/generateEntityTestFile.js.map +1 -1
  169. package/build/generateEnumFile.cjs +73 -0
  170. package/build/generateEnumFile.cjs.map +1 -0
  171. package/build/generateEnumFile.d.cts +9 -0
  172. package/build/generateEnumFile.d.cts.map +1 -0
  173. package/build/generateEnumFile.d.mts +9 -0
  174. package/build/generateEnumFile.d.mts.map +1 -0
  175. package/build/generateEnumFile.js +33 -43
  176. package/build/generateEnumFile.js.map +1 -1
  177. package/build/generateFactoriesFiles.cjs +28 -0
  178. package/build/generateFactoriesFiles.cjs.map +1 -0
  179. package/build/generateFactoriesFiles.d.cts +7 -0
  180. package/build/generateFactoriesFiles.d.cts.map +1 -0
  181. package/build/generateFactoriesFiles.d.mts +7 -0
  182. package/build/generateFactoriesFiles.d.mts.map +1 -0
  183. package/build/generateFactoriesFiles.js +21 -16
  184. package/build/generateFactoriesFiles.js.map +1 -1
  185. package/build/generateFlushFunction.cjs +61 -0
  186. package/build/generateFlushFunction.cjs.map +1 -0
  187. package/build/{generateFlushFunction.d.ts → generateFlushFunction.d.cts} +8 -5
  188. package/build/generateFlushFunction.d.cts.map +1 -0
  189. package/build/generateFlushFunction.d.mts +23 -0
  190. package/build/generateFlushFunction.d.mts.map +1 -0
  191. package/build/generateFlushFunction.js +32 -78
  192. package/build/generateFlushFunction.js.map +1 -1
  193. package/build/generateMetadataFile.cjs +307 -0
  194. package/build/generateMetadataFile.cjs.map +1 -0
  195. package/build/generateMetadataFile.d.cts +10 -0
  196. package/build/generateMetadataFile.d.cts.map +1 -0
  197. package/build/generateMetadataFile.d.mts +10 -0
  198. package/build/generateMetadataFile.d.mts.map +1 -0
  199. package/build/generateMetadataFile.js +148 -156
  200. package/build/generateMetadataFile.js.map +1 -1
  201. package/build/generatePgEnumFile.cjs +21 -0
  202. package/build/generatePgEnumFile.cjs.map +1 -0
  203. package/build/generatePgEnumFile.d.cts +9 -0
  204. package/build/generatePgEnumFile.d.cts.map +1 -0
  205. package/build/generatePgEnumFile.d.mts +9 -0
  206. package/build/generatePgEnumFile.d.mts.map +1 -0
  207. package/build/generatePgEnumFile.js +12 -9
  208. package/build/generatePgEnumFile.js.map +1 -1
  209. package/build/index.cjs +135 -0
  210. package/build/index.cjs.map +1 -0
  211. package/build/index.d.cts +12 -0
  212. package/build/index.d.cts.map +1 -0
  213. package/build/index.d.mts +12 -0
  214. package/build/index.d.mts.map +1 -0
  215. package/build/index.js +108 -127
  216. package/build/index.js.map +1 -1
  217. package/build/inheritance.cjs +241 -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 +221 -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 +133 -0
  305. package/skills/joist-em-basics/SKILL.md +114 -0
  306. package/skills/joist-partial-updates/SKILL.md +352 -0
  307. package/skills/joist-reactive-hints/SKILL.md +150 -0
  308. package/skills/joist-test-factories/SKILL.md +397 -0
  309. package/skills/joist-upsert/SKILL.md +95 -0
  310. package/build/EntityDbMetadata.d.ts +0 -269
  311. package/build/EntityDbMetadata.d.ts.map +0 -1
  312. package/build/EntityDbMetadata.test.d.ts +0 -2
  313. package/build/EntityDbMetadata.test.d.ts.map +0 -1
  314. package/build/EntityDbMetadata.test.js +0 -211
  315. package/build/EntityDbMetadata.test.js.map +0 -1
  316. package/build/assignTags.d.ts.map +0 -1
  317. package/build/codemods/Codemod.d.ts +0 -14
  318. package/build/codemods/Codemod.d.ts.map +0 -1
  319. package/build/codemods/Codemod.js.map +0 -1
  320. package/build/codemods/JscodeshiftMod.d.ts +0 -11
  321. package/build/codemods/JscodeshiftMod.d.ts.map +0 -1
  322. package/build/codemods/__tests__/codemod_0001-rename_has_async_property.test.d.ts +0 -2
  323. package/build/codemods/__tests__/codemod_0001-rename_has_async_property.test.d.ts.map +0 -1
  324. package/build/codemods/__tests__/codemod_0001-rename_has_async_property.test.js +0 -9
  325. package/build/codemods/__tests__/codemod_0001-rename_has_async_property.test.js.map +0 -1
  326. package/build/codemods/__tests__/codemod_0002-rename_async_query_fields.test.d.ts +0 -2
  327. package/build/codemods/__tests__/codemod_0002-rename_async_query_fields.test.d.ts.map +0 -1
  328. package/build/codemods/__tests__/codemod_0002-rename_async_query_fields.test.js +0 -9
  329. package/build/codemods/__tests__/codemod_0002-rename_async_query_fields.test.js.map +0 -1
  330. package/build/codemods/__tests__/codemod_0003-rename_find_paginated.test.d.ts +0 -2
  331. package/build/codemods/__tests__/codemod_0003-rename_find_paginated.test.d.ts.map +0 -1
  332. package/build/codemods/__tests__/codemod_0003-rename_find_paginated.test.js +0 -9
  333. package/build/codemods/__tests__/codemod_0003-rename_find_paginated.test.js.map +0 -1
  334. package/build/codemods/codemod_0001-rename_has_async_property.d.ts +0 -7
  335. package/build/codemods/codemod_0001-rename_has_async_property.d.ts.map +0 -1
  336. package/build/codemods/codemod_0002-rename_async_query_fields.d.ts +0 -7
  337. package/build/codemods/codemod_0002-rename_async_query_fields.d.ts.map +0 -1
  338. package/build/codemods/codemod_0003-rename_find_paginated.d.ts +0 -7
  339. package/build/codemods/codemod_0003-rename_find_paginated.d.ts.map +0 -1
  340. package/build/codemods/index.d.ts +0 -9
  341. package/build/codemods/index.d.ts.map +0 -1
  342. package/build/codemods/index.test.d.ts +0 -2
  343. package/build/codemods/index.test.d.ts.map +0 -1
  344. package/build/codemods/index.test.js +0 -24
  345. package/build/codemods/index.test.js.map +0 -1
  346. package/build/config.d.ts +0 -167
  347. package/build/config.d.ts.map +0 -1
  348. package/build/config.test.d.ts +0 -2
  349. package/build/config.test.d.ts.map +0 -1
  350. package/build/config.test.js +0 -78
  351. package/build/config.test.js.map +0 -1
  352. package/build/docs/cache.d.ts +0 -14
  353. package/build/docs/cache.d.ts.map +0 -1
  354. package/build/docs/cache.test.d.ts +0 -2
  355. package/build/docs/cache.test.d.ts.map +0 -1
  356. package/build/docs/cache.test.js +0 -47
  357. package/build/docs/cache.test.js.map +0 -1
  358. package/build/docs/generate-metadata-docs.d.ts +0 -6
  359. package/build/docs/generate-metadata-docs.d.ts.map +0 -1
  360. package/build/docs/index.d.ts +0 -9
  361. package/build/docs/index.d.ts.map +0 -1
  362. package/build/docs/index.test.d.ts +0 -2
  363. package/build/docs/index.test.d.ts.map +0 -1
  364. package/build/docs/index.test.js +0 -100
  365. package/build/docs/index.test.js.map +0 -1
  366. package/build/docs/markdown.d.ts.map +0 -1
  367. package/build/docs/markdown.test.d.ts +0 -2
  368. package/build/docs/markdown.test.d.ts.map +0 -1
  369. package/build/docs/markdown.test.js +0 -280
  370. package/build/docs/markdown.test.js.map +0 -1
  371. package/build/docs/parsing.d.ts +0 -42
  372. package/build/docs/parsing.d.ts.map +0 -1
  373. package/build/docs/parsing.test.d.ts +0 -2
  374. package/build/docs/parsing.test.d.ts.map +0 -1
  375. package/build/docs/parsing.test.js +0 -190
  376. package/build/docs/parsing.test.js.map +0 -1
  377. package/build/findEntityScopes.d.ts +0 -11
  378. package/build/findEntityScopes.d.ts.map +0 -1
  379. package/build/foreignKeyOrdering.d.ts +0 -3
  380. package/build/foreignKeyOrdering.d.ts.map +0 -1
  381. package/build/generate.d.ts +0 -12
  382. package/build/generate.d.ts.map +0 -1
  383. package/build/generateEntitiesFile.d.ts +0 -7
  384. package/build/generateEntitiesFile.d.ts.map +0 -1
  385. package/build/generateEntityCodegenFile.d.ts +0 -11
  386. package/build/generateEntityCodegenFile.d.ts.map +0 -1
  387. package/build/generateEntityFile.d.ts +0 -6
  388. package/build/generateEntityFile.d.ts.map +0 -1
  389. package/build/generateEntityTestFile.d.ts +0 -6
  390. package/build/generateEntityTestFile.d.ts.map +0 -1
  391. package/build/generateEnumFile.d.ts +0 -5
  392. package/build/generateEnumFile.d.ts.map +0 -1
  393. package/build/generateFactoriesFiles.d.ts +0 -4
  394. package/build/generateFactoriesFiles.d.ts.map +0 -1
  395. package/build/generateFlushFunction.d.ts.map +0 -1
  396. package/build/generateMetadataFile.d.ts +0 -5
  397. package/build/generateMetadataFile.d.ts.map +0 -1
  398. package/build/generatePgEnumFile.d.ts +0 -5
  399. package/build/generatePgEnumFile.d.ts.map +0 -1
  400. package/build/index.d.ts +0 -11
  401. package/build/index.d.ts.map +0 -1
  402. package/build/inheritance.d.ts +0 -10
  403. package/build/inheritance.d.ts.map +0 -1
  404. package/build/keywords.d.ts +0 -2
  405. package/build/keywords.d.ts.map +0 -1
  406. package/build/loadMetadata.d.ts +0 -26
  407. package/build/loadMetadata.d.ts.map +0 -1
  408. package/build/logger.d.ts +0 -10
  409. package/build/logger.d.ts.map +0 -1
  410. package/build/scanEntityFiles.d.ts +0 -5
  411. package/build/scanEntityFiles.d.ts.map +0 -1
  412. package/build/sortForeignKeys.d.ts.map +0 -1
  413. package/build/symbols.d.ts +0 -108
  414. package/build/symbols.d.ts.map +0 -1
  415. package/build/tsdoc.d.ts +0 -12
  416. package/build/tsdoc.d.ts.map +0 -1
  417. package/build/utils.d.ts +0 -31
  418. package/build/utils.d.ts.map +0 -1
  419. package/build/write-json-schema.d.ts +0 -2
  420. package/build/write-json-schema.d.ts.map +0 -1
@@ -0,0 +1,135 @@
1
+ #!/usr/bin/env node
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const require_runtime = require("./_virtual/_rolldown/runtime.cjs");
4
+ const require_codemods_index = require("./codemods/index.cjs");
5
+ const require_utils = require("./utils.cjs");
6
+ const require_inheritance = require("./inheritance.cjs");
7
+ const require_logger = require("./logger.cjs");
8
+ const require_config = require("./config.cjs");
9
+ const require_assignTags = require("./assignTags.cjs");
10
+ const require_foreignKeyOrdering = require("./foreignKeyOrdering.cjs");
11
+ const require_generate = require("./generate.cjs");
12
+ const require_generateFlushFunction = require("./generateFlushFunction.cjs");
13
+ const require_installSkills = require("./installSkills.cjs");
14
+ const require_scanEntityFiles = require("./scanEntityFiles.cjs");
15
+ const require_loadMetadata = require("./loadMetadata.cjs");
16
+ const require_EntityDbMetadata = require("./EntityDbMetadata.cjs");
17
+ let joist_utils = require("joist-utils");
18
+ let pg_structure = require("pg-structure");
19
+ pg_structure = require_runtime.__toESM(pg_structure, 1);
20
+ let ts_poet = require("ts-poet");
21
+ let pg = require("pg");
22
+ let node_process = require("node:process");
23
+ node_process = require_runtime.__toESM(node_process, 1);
24
+ //#region src/index.ts
25
+ const { default: pgStructure } = pg_structure.default;
26
+ async function joistCodegen() {
27
+ const config = await require_config.loadConfig();
28
+ maybeSetDatabaseUrl(config);
29
+ if (!node_process.default.env.DATABASE_URL && !node_process.default.env.DB_USER) {
30
+ console.log(`Database connection information not found, please set either:`);
31
+ console.log(` - the DATABASE_URL env variable (i.e. using .env and dotenv), or`);
32
+ console.log(` - the databaseUrl key in joist-config.json`);
33
+ return;
34
+ }
35
+ const pgConfig = (0, joist_utils.newPgConnectionConfig)();
36
+ const client = new pg.Client(pgConfig);
37
+ await client.connect();
38
+ const dbMetadata = await loadSchemaMetadata(config, client);
39
+ const { entities, enums, totalTables } = dbMetadata;
40
+ console.log(`Found ${totalTables} total tables, ${entities.length} entity tables, ${Object.entries(enums).length} enum tables`);
41
+ console.log("");
42
+ require_inheritance.applyInheritanceUpdates(config, dbMetadata);
43
+ require_EntityDbMetadata.resolveNameConflicts(config, dbMetadata);
44
+ require_assignTags.assignTags(config, dbMetadata);
45
+ validateTagDelimiter(config, entities);
46
+ await require_scanEntityFiles.scanEntityFiles(config, dbMetadata);
47
+ await require_foreignKeyOrdering.maybeSetForeignKeyOrdering(config, dbMetadata.entities);
48
+ await maybeGenerateFlushFunctions(config, client, pgConfig, dbMetadata);
49
+ await client.end();
50
+ await require_codemods_index.maybeRunTransforms(config);
51
+ for (const entity of entities) require_EntityDbMetadata.failIfOverlappingFieldNames(entity);
52
+ require_config.warnInvalidConfigEntries(config, dbMetadata);
53
+ await generateAndSaveFiles(config, dbMetadata);
54
+ if (config.skills !== false) await require_installSkills.installSkills();
55
+ require_config.stripStiPlaceholders(config, entities);
56
+ await require_config.writeConfig(config);
57
+ }
58
+ /** Uses entities and enums from the `db` schema and saves them into our entities directory. */
59
+ async function generateAndSaveFiles(config, dbMeta) {
60
+ const files = await require_generate.generateFiles(config, dbMeta);
61
+ const esmExt = config.esm ? config.allowImportingTsExtensions ? "ts" : "js" : "";
62
+ await (0, ts_poet.saveFiles)({
63
+ toolName: "joist-codegen",
64
+ directory: config.entitiesDirectory,
65
+ files,
66
+ toStringOpts: { importExtensions: esmExt || false }
67
+ });
68
+ }
69
+ async function maybeGenerateFlushFunctions(config, client, pgConfig, db) {
70
+ if (config.createFlushFunction !== false) {
71
+ if (Array.isArray(config.createFlushFunction)) {
72
+ console.log("Creating flush_database functions");
73
+ await Promise.all(config.createFlushFunction.map(async (dbName) => {
74
+ const client = new pg.Client({
75
+ ...pgConfig,
76
+ database: dbName
77
+ });
78
+ await client.connect();
79
+ await require_generateFlushFunction.createFlushFunction(client, db);
80
+ await client.end();
81
+ }));
82
+ } else {
83
+ console.log("Creating flush_database function");
84
+ await require_generateFlushFunction.createFlushFunction(client, db);
85
+ }
86
+ }
87
+ }
88
+ async function loadSchemaMetadata(config, client) {
89
+ const db = await pgStructure(client);
90
+ const enums = await require_loadMetadata.loadEnumMetadata(db, client, config);
91
+ const pgEnums = await require_loadMetadata.loadPgEnumMetadata(db, client, config);
92
+ const entities = db.tables.filter((t) => require_utils.isEntityTable(config, t)).sortBy("name").map((table) => new require_EntityDbMetadata.EntityDbMetadata(config, table, enums));
93
+ const totalTables = db.tables.length;
94
+ const joinTables = db.tables.filter((t) => require_utils.isJoinTable(config, t)).map((t) => t.name);
95
+ const otherTables = db.tables.filter((t) => !require_utils.isEntityTable(config, t) && !require_utils.isEnumTable(config, t) && !require_utils.isJoinTable(config, t)).map((t) => t.name);
96
+ return {
97
+ entities,
98
+ entitiesByName: Object.fromEntries(entities.map((e) => [e.name, e])),
99
+ enums,
100
+ pgEnums,
101
+ totalTables,
102
+ joinTables,
103
+ otherTables
104
+ };
105
+ }
106
+ function maybeSetDatabaseUrl(config) {
107
+ if (!node_process.default.env.DATABASE_URL && config.databaseUrl) node_process.default.env.DATABASE_URL = config.databaseUrl;
108
+ }
109
+ function maybeSetExitCode() {
110
+ if (!node_process.default.argv.includes("--always-exit-code-zero") && (node_process.default.argv.includes("--strict") && require_logger.loggerMaxWarningLevelHit >= require_logger.LOG_LEVELS.warn || require_logger.loggerMaxWarningLevelHit >= require_logger.LOG_LEVELS.error)) node_process.default.exitCode = 1;
111
+ }
112
+ /** Validates that tags can be parsed unambiguously with the configured delimiter. */
113
+ function validateTagDelimiter(config, entities) {
114
+ const tagDelimiter = config.tagDelimiter ?? ":";
115
+ for (const entity of entities) if (tagDelimiter !== "" && `${entity.tagName}${tagDelimiter}`.indexOf(tagDelimiter) !== entity.tagName.length) throw new Error(`Tagged id delimiter '${tagDelimiter}' cannot occur in or overlap tag '${entity.tagName}' for ${entity.name}`);
116
+ else if (tagDelimiter === "" && !/^[a-z]+$/i.test(entity.tagName)) throw new Error(`Delimiterless ids require an alphabetic tag, got '${entity.tagName}' for ${entity.name}`);
117
+ else if (tagDelimiter === "" && entity.primaryKey.columnType !== "int" && entity.primaryKey.columnType !== "bigint") throw new Error(`Delimiterless ids require an int or bigint primary key, got '${entity.primaryKey.columnType}' for ${entity.name}`);
118
+ }
119
+ if (typeof module !== "undefined" && require.main === module) joistCodegen().then(() => maybeSetExitCode()).catch((err) => {
120
+ console.error(err);
121
+ node_process.default.exit(1);
122
+ });
123
+ //#endregion
124
+ exports.EntityDbMetadata = require_EntityDbMetadata.EntityDbMetadata;
125
+ exports.dateCode = require_utils.dateCode;
126
+ exports.generateAndSaveFiles = generateAndSaveFiles;
127
+ exports.joistCodegen = joistCodegen;
128
+ exports.makeEntity = require_EntityDbMetadata.makeEntity;
129
+ exports.mapSimpleDbTypeToTypescriptType = require_utils.mapSimpleDbTypeToTypescriptType;
130
+ exports.maybeSetExitCode = maybeSetExitCode;
131
+ exports.plainDateCode = require_utils.plainDateCode;
132
+ exports.plainDateTimeCode = require_utils.plainDateTimeCode;
133
+ exports.zonedDateTimeCode = require_utils.zonedDateTimeCode;
134
+
135
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["pgStructureModule","loadConfig","process","newPgConnectionConfig","Client","scanEntityFiles","maybeSetForeignKeyOrdering","maybeRunTransforms","installSkills","writeConfig","generateFiles","saveFiles","createFlushFunction","loadEnumMetadata","loadPgEnumMetadata","isEntityTable","EntityDbMetadata","isJoinTable","isEnumTable","loggerMaxWarningLevelHit","LOG_LEVELS"],"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport process from \"node:process\";\n\nimport { type ConnectionConfig, newPgConnectionConfig } from \"joist-utils\";\nimport { Client } from \"pg\";\nimport pgStructureModule from \"pg-structure\";\nimport { saveFiles } from \"ts-poet\";\n\nimport { assignTags } from \"./assignTags.ts\";\nimport { maybeRunTransforms } from \"./codemods/index.ts\";\nimport { type Config, loadConfig, stripStiPlaceholders, warnInvalidConfigEntries, writeConfig } from \"./config.ts\";\nimport {\n type DbMetadata,\n EntityDbMetadata,\n failIfOverlappingFieldNames,\n resolveNameConflicts,\n} from \"./EntityDbMetadata.ts\";\nimport { maybeSetForeignKeyOrdering } from \"./foreignKeyOrdering.ts\";\nimport { generateFiles } from \"./generate.ts\";\nimport { createFlushFunction } from \"./generateFlushFunction.ts\";\nimport { applyInheritanceUpdates } from \"./inheritance.ts\";\nimport { installSkills } from \"./installSkills.ts\";\nimport { loadEnumMetadata, loadPgEnumMetadata } from \"./loadMetadata.ts\";\nimport { LOG_LEVELS, loggerMaxWarningLevelHit } from \"./logger.ts\";\nimport { scanEntityFiles } from \"./scanEntityFiles.ts\";\nimport { isEntityTable, isEnumTable, isJoinTable, mapSimpleDbTypeToTypescriptType } from \"./utils.ts\";\n\nconst { default: pgStructure } = pgStructureModule;\n\nexport {\n type DbMetadata,\n type EnumField,\n makeEntity,\n type ManyToManyField,\n type ManyToOneField,\n type OneToManyField,\n type OneToOneField,\n type PolymorphicField,\n type PrimitiveField,\n type PrimitiveTypescriptType,\n} from \"./EntityDbMetadata.ts\";\nexport type { EnumMetadata, EnumRow, EnumTableData, PgEnumData, PgEnumMetadata } from \"./loadMetadata.ts\";\nexport { dateCode, plainDateCode, plainDateTimeCode, zonedDateTimeCode } from \"./utils.ts\";\nexport { type Config, EntityDbMetadata, mapSimpleDbTypeToTypescriptType };\n\nexport async function joistCodegen() {\n const config = await loadConfig();\n\n maybeSetDatabaseUrl(config);\n if (!process.env.DATABASE_URL && !process.env.DB_USER) {\n console.log(`Database connection information not found, please set either:`);\n console.log(` - the DATABASE_URL env variable (i.e. using .env and dotenv), or`);\n console.log(` - the databaseUrl key in joist-config.json`);\n return;\n }\n const pgConfig = newPgConnectionConfig();\n\n const client = new Client(pgConfig);\n await client.connect();\n\n const dbMetadata = await loadSchemaMetadata(config, client);\n const { entities, enums, totalTables } = dbMetadata;\n console.log(\n `Found ${totalTables} total tables, ${entities.length} entity tables, ${Object.entries(enums).length} enum tables`,\n );\n console.log(\"\");\n\n // Look for STI tables to synthesize separate metas\n applyInheritanceUpdates(config, dbMetadata);\n\n // Now that all entities (incl. STI subtypes) are known, fix up any colliding codegen'd type names\n resolveNameConflicts(config, dbMetadata);\n\n // Assign any new tags and write them back to the config file\n assignTags(config, dbMetadata);\n validateTagDelimiter(config, entities);\n\n // Scan `*.ts` files after we've expanded `Task` -> `TaskOld.ts`\n await scanEntityFiles(config, dbMetadata);\n\n // If we're not using deferred FKs, determine our DAG insert order\n await maybeSetForeignKeyOrdering(config, dbMetadata.entities);\n\n // Generate the flush function for tests\n await maybeGenerateFlushFunctions(config, client, pgConfig, dbMetadata);\n\n await client.end();\n\n // Apply any codemods to the user's codebase, if we have them\n await maybeRunTransforms(config);\n\n // Do some warnings\n for (const entity of entities) failIfOverlappingFieldNames(entity);\n warnInvalidConfigEntries(config, dbMetadata);\n\n // Finally actually generate the files (even if we found a fatal error)\n await generateAndSaveFiles(config, dbMetadata);\n\n // Install our bundled Agent Skills so coding agents can find them, unless explicitly disabled\n if (config.skills !== false) await installSkills();\n\n stripStiPlaceholders(config, entities);\n await writeConfig(config);\n}\n\n/** Uses entities and enums from the `db` schema and saves them into our entities directory. */\nexport async function generateAndSaveFiles(config: Config, dbMeta: DbMetadata): Promise<void> {\n const files = await generateFiles(config, dbMeta);\n const esmExt = config.esm ? (config.allowImportingTsExtensions ? \"ts\" : \"js\") : \"\";\n await saveFiles({\n toolName: \"joist-codegen\",\n directory: config.entitiesDirectory,\n files,\n toStringOpts: { importExtensions: esmExt || false },\n });\n}\n\nasync function maybeGenerateFlushFunctions(config: Config, client: Client, pgConfig: ConnectionConfig, db: DbMetadata) {\n // In graphql-service we have our own custom flush function, so allow skipping this\n if (config.createFlushFunction !== false) {\n // Look for multiple test databases\n if (Array.isArray(config.createFlushFunction)) {\n console.log(\"Creating flush_database functions\");\n await Promise.all(\n config.createFlushFunction.map(async (dbName) => {\n const client = new Client({ ...pgConfig, database: dbName });\n await client.connect();\n await createFlushFunction(client, db);\n await client.end();\n }),\n );\n } else {\n console.log(\"Creating flush_database function\");\n await createFlushFunction(client, db);\n }\n }\n}\n\nasync function loadSchemaMetadata(config: Config, client: Client): Promise<DbMetadata> {\n // Here we load all schemas, to avoid pg-structure failing on cross-schema foreign keys\n // like our cyanaudit triggers (https://github.com/ozum/pg-structure/issues/85), and then\n // later filter them non-public schema tables out.\n const db = await pgStructure(client);\n const enums = await loadEnumMetadata(db, client, config);\n const pgEnums = await loadPgEnumMetadata(db, client, config);\n const entities = db.tables\n .filter((t) => isEntityTable(config, t))\n .sortBy(\"name\")\n .map((table) => new EntityDbMetadata(config, table, enums));\n const totalTables = db.tables.length;\n const joinTables = db.tables.filter((t) => isJoinTable(config, t)).map((t) => t.name);\n const otherTables = db.tables\n .filter((t) => !isEntityTable(config, t) && !isEnumTable(config, t) && !isJoinTable(config, t))\n .map((t) => t.name);\n const entitiesByName = Object.fromEntries(entities.map((e) => [e.name, e]));\n return { entities, entitiesByName, enums, pgEnums, totalTables, joinTables, otherTables };\n}\n\nfunction maybeSetDatabaseUrl(config: Config): void {\n if (!process.env.DATABASE_URL && config.databaseUrl) {\n process.env.DATABASE_URL = config.databaseUrl;\n }\n}\n\nexport function maybeSetExitCode(): void {\n if (\n !process.argv.includes(\"--always-exit-code-zero\") &&\n // strict mode + warnings or greater\n ((process.argv.includes(\"--strict\") && loggerMaxWarningLevelHit >= LOG_LEVELS.warn) ||\n // otherwise errors or greater\n loggerMaxWarningLevelHit >= LOG_LEVELS.error)\n ) {\n process.exitCode = 1;\n }\n}\n\n/** Validates that tags can be parsed unambiguously with the configured delimiter. */\nfunction validateTagDelimiter(config: Config, entities: EntityDbMetadata[]): void {\n const tagDelimiter = config.tagDelimiter ?? \":\";\n for (const entity of entities) {\n if (tagDelimiter !== \"\" && `${entity.tagName}${tagDelimiter}`.indexOf(tagDelimiter) !== entity.tagName.length) {\n throw new Error(\n `Tagged id delimiter '${tagDelimiter}' cannot occur in or overlap tag '${entity.tagName}' for ${entity.name}`,\n );\n } else if (tagDelimiter === \"\" && !/^[a-z]+$/i.test(entity.tagName)) {\n throw new Error(`Delimiterless ids require an alphabetic tag, got '${entity.tagName}' for ${entity.name}`);\n } else if (\n tagDelimiter === \"\" &&\n entity.primaryKey.columnType !== \"int\" &&\n entity.primaryKey.columnType !== \"bigint\"\n ) {\n throw new Error(\n `Delimiterless ids require an int or bigint primary key, got '${entity.primaryKey.columnType}' for ${entity.name}`,\n );\n }\n }\n}\n\nif (typeof module !== \"undefined\" && require.main === module) {\n joistCodegen()\n .then(() => maybeSetExitCode())\n .catch((err) => {\n console.error(err);\n process.exit(1);\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA4BA,MAAM,EAAE,SAAS,gBAAgBA,aAAAA;AAkBjC,eAAsB,eAAe;CACnC,MAAM,SAAS,MAAMC,eAAAA,WAAW;CAEhC,oBAAoB,MAAM;CAC1B,IAAI,CAACC,aAAAA,QAAQ,IAAI,gBAAgB,CAACA,aAAAA,QAAQ,IAAI,SAAS;EACrD,QAAQ,IAAI,+DAA+D;EAC3E,QAAQ,IAAI,oEAAoE;EAChF,QAAQ,IAAI,8CAA8C;EAC1D;CACF;CACA,MAAM,YAAA,GAAWC,YAAAA,sBAAAA,CAAsB;CAEvC,MAAM,SAAS,IAAIC,GAAAA,OAAO,QAAQ;CAClC,MAAM,OAAO,QAAQ;CAErB,MAAM,aAAa,MAAM,mBAAmB,QAAQ,MAAM;CAC1D,MAAM,EAAE,UAAU,OAAO,gBAAgB;CACzC,QAAQ,IACN,SAAS,YAAY,iBAAiB,SAAS,OAAO,kBAAkB,OAAO,QAAQ,KAAK,CAAC,CAAC,OAAO,aACvG;CACA,QAAQ,IAAI,EAAE;CAGd,oBAAA,wBAAwB,QAAQ,UAAU;CAG1C,yBAAA,qBAAqB,QAAQ,UAAU;CAGvC,mBAAA,WAAW,QAAQ,UAAU;CAC7B,qBAAqB,QAAQ,QAAQ;CAGrC,MAAMC,wBAAAA,gBAAgB,QAAQ,UAAU;CAGxC,MAAMC,2BAAAA,2BAA2B,QAAQ,WAAW,QAAQ;CAG5D,MAAM,4BAA4B,QAAQ,QAAQ,UAAU,UAAU;CAEtE,MAAM,OAAO,IAAI;CAGjB,MAAMC,uBAAAA,mBAAmB,MAAM;CAG/B,KAAK,MAAM,UAAU,UAAU,yBAAA,4BAA4B,MAAM;CACjE,eAAA,yBAAyB,QAAQ,UAAU;CAG3C,MAAM,qBAAqB,QAAQ,UAAU;CAG7C,IAAI,OAAO,WAAW,OAAO,MAAMC,sBAAAA,cAAc;CAEjD,eAAA,qBAAqB,QAAQ,QAAQ;CACrC,MAAMC,eAAAA,YAAY,MAAM;AAC1B;;AAGA,eAAsB,qBAAqB,QAAgB,QAAmC;CAC5F,MAAM,QAAQ,MAAMC,iBAAAA,cAAc,QAAQ,MAAM;CAChD,MAAM,SAAS,OAAO,MAAO,OAAO,6BAA6B,OAAO,OAAQ;CAChF,OAAA,GAAMC,QAAAA,UAAAA,CAAU;EACd,UAAU;EACV,WAAW,OAAO;EAClB;EACA,cAAc,EAAE,kBAAkB,UAAU,MAAM;CACpD,CAAC;AACH;AAEA,eAAe,4BAA4B,QAAgB,QAAgB,UAA4B,IAAgB;CAErH,IAAI,OAAO,wBAAwB,OAAO;EAExC,IAAI,MAAM,QAAQ,OAAO,mBAAmB,GAAG;GAC7C,QAAQ,IAAI,mCAAmC;GAC/C,MAAM,QAAQ,IACZ,OAAO,oBAAoB,IAAI,OAAO,WAAW;IAC/C,MAAM,SAAS,IAAIP,GAAAA,OAAO;KAAE,GAAG;KAAU,UAAU;IAAO,CAAC;IAC3D,MAAM,OAAO,QAAQ;IACrB,MAAMQ,8BAAAA,oBAAoB,QAAQ,EAAE;IACpC,MAAM,OAAO,IAAI;GACnB,CAAC,CACH;EACF,OAAO;GACL,QAAQ,IAAI,kCAAkC;GAC9C,MAAMA,8BAAAA,oBAAoB,QAAQ,EAAE;EACtC;CACF;AACF;AAEA,eAAe,mBAAmB,QAAgB,QAAqC;CAIrF,MAAM,KAAK,MAAM,YAAY,MAAM;CACnC,MAAM,QAAQ,MAAMC,qBAAAA,iBAAiB,IAAI,QAAQ,MAAM;CACvD,MAAM,UAAU,MAAMC,qBAAAA,mBAAmB,IAAI,QAAQ,MAAM;CAC3D,MAAM,WAAW,GAAG,OACjB,QAAQ,MAAMC,cAAAA,cAAc,QAAQ,CAAC,CAAC,CAAC,CACvC,OAAO,MAAM,CAAC,CACd,KAAK,UAAU,IAAIC,yBAAAA,iBAAiB,QAAQ,OAAO,KAAK,CAAC;CAC5D,MAAM,cAAc,GAAG,OAAO;CAC9B,MAAM,aAAa,GAAG,OAAO,QAAQ,MAAMC,cAAAA,YAAY,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,IAAI;CACpF,MAAM,cAAc,GAAG,OACpB,QAAQ,MAAM,CAACF,cAAAA,cAAc,QAAQ,CAAC,KAAK,CAACG,cAAAA,YAAY,QAAQ,CAAC,KAAK,CAACD,cAAAA,YAAY,QAAQ,CAAC,CAAC,CAAC,CAC9F,KAAK,MAAM,EAAE,IAAI;CAEpB,OAAO;EAAE;EAAU,gBADI,OAAO,YAAY,SAAS,KAAK,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CACzC;EAAG;EAAO;EAAS;EAAa;EAAY;CAAY;AAC1F;AAEA,SAAS,oBAAoB,QAAsB;CACjD,IAAI,CAACf,aAAAA,QAAQ,IAAI,gBAAgB,OAAO,aACtC,aAAA,QAAQ,IAAI,eAAe,OAAO;AAEtC;AAEA,SAAgB,mBAAyB;CACvC,IACE,CAACA,aAAAA,QAAQ,KAAK,SAAS,yBAAyB,MAE9CA,aAAAA,QAAQ,KAAK,SAAS,UAAU,KAAKiB,eAAAA,4BAA4BC,eAAAA,WAAW,QAE5ED,eAAAA,4BAA4BC,eAAAA,WAAW,QAEzC,aAAA,QAAA,WAAmB;AAEvB;;AAGA,SAAS,qBAAqB,QAAgB,UAAoC;CAChF,MAAM,eAAe,OAAO,gBAAgB;CAC5C,KAAK,MAAM,UAAU,UACnB,IAAI,iBAAiB,MAAM,GAAG,OAAO,UAAU,eAAe,QAAQ,YAAY,MAAM,OAAO,QAAQ,QACrG,MAAM,IAAI,MACR,wBAAwB,aAAa,oCAAoC,OAAO,QAAQ,QAAQ,OAAO,MACzG;MACK,IAAI,iBAAiB,MAAM,CAAC,YAAY,KAAK,OAAO,OAAO,GAChE,MAAM,IAAI,MAAM,qDAAqD,OAAO,QAAQ,QAAQ,OAAO,MAAM;MACpG,IACL,iBAAiB,MACjB,OAAO,WAAW,eAAe,SACjC,OAAO,WAAW,eAAe,UAEjC,MAAM,IAAI,MACR,gEAAgE,OAAO,WAAW,WAAW,QAAQ,OAAO,MAC9G;AAGN;AAEA,IAAI,OAAO,WAAW,eAAe,QAAQ,SAAS,QACpD,aAAa,CAAC,CACX,WAAW,iBAAiB,CAAC,CAAC,CAC9B,OAAO,QAAQ;CACd,QAAQ,MAAM,GAAG;CACjB,aAAA,QAAQ,KAAK,CAAC;AAChB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { Config } from "./config.cjs";
2
+ import { dateCode, mapSimpleDbTypeToTypescriptType, plainDateCode, plainDateTimeCode, zonedDateTimeCode } from "./utils.cjs";
3
+ import { EnumMetadata, EnumRow, EnumTableData, PgEnumData, PgEnumMetadata } from "./loadMetadata.cjs";
4
+ import { DbMetadata, EntityDbMetadata, EnumField, ManyToManyField, ManyToOneField, OneToManyField, OneToOneField, PolymorphicField, PrimitiveField, PrimitiveTypescriptType, makeEntity } from "./EntityDbMetadata.cjs";
5
+ //#region src/index.d.ts
6
+ declare function joistCodegen(): Promise<void>;
7
+ /** Uses entities and enums from the `db` schema and saves them into our entities directory. */
8
+ declare function generateAndSaveFiles(config: Config, dbMeta: DbMetadata): Promise<void>;
9
+ declare function maybeSetExitCode(): void;
10
+ //#endregion
11
+ export { type Config, type DbMetadata, EntityDbMetadata, type EnumField, type EnumMetadata, type EnumRow, type EnumTableData, type ManyToManyField, type ManyToOneField, type OneToManyField, type OneToOneField, type PgEnumData, type PgEnumMetadata, type PolymorphicField, type PrimitiveField, type PrimitiveTypescriptType, dateCode, generateAndSaveFiles, joistCodegen, makeEntity, mapSimpleDbTypeToTypescriptType, maybeSetExitCode, plainDateCode, plainDateTimeCode, zonedDateTimeCode };
12
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;iBA8CsB,gBAAY;;iBA6DZ,qBAAqB,QAAQ,QAAQ,QAAQ,aAAa;iBA0DhE"}
@@ -0,0 +1,12 @@
1
+ import { Config } from "./config.mjs";
2
+ import { dateCode, mapSimpleDbTypeToTypescriptType, plainDateCode, plainDateTimeCode, zonedDateTimeCode } from "./utils.mjs";
3
+ import { EnumMetadata, EnumRow, EnumTableData, PgEnumData, PgEnumMetadata } from "./loadMetadata.mjs";
4
+ import { DbMetadata, EntityDbMetadata, EnumField, ManyToManyField, ManyToOneField, OneToManyField, OneToOneField, PolymorphicField, PrimitiveField, PrimitiveTypescriptType, makeEntity } from "./EntityDbMetadata.mjs";
5
+ //#region src/index.d.ts
6
+ declare function joistCodegen(): Promise<void>;
7
+ /** Uses entities and enums from the `db` schema and saves them into our entities directory. */
8
+ declare function generateAndSaveFiles(config: Config, dbMeta: DbMetadata): Promise<void>;
9
+ declare function maybeSetExitCode(): void;
10
+ //#endregion
11
+ export { type Config, type DbMetadata, EntityDbMetadata, type EnumField, type EnumMetadata, type EnumRow, type EnumTableData, type ManyToManyField, type ManyToOneField, type OneToManyField, type OneToOneField, type PgEnumData, type PgEnumMetadata, type PolymorphicField, type PrimitiveField, type PrimitiveTypescriptType, dateCode, generateAndSaveFiles, joistCodegen, makeEntity, mapSimpleDbTypeToTypescriptType, maybeSetExitCode, plainDateCode, plainDateTimeCode, zonedDateTimeCode };
12
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;iBA8CsB,gBAAY;;iBA6DZ,qBAAqB,QAAQ,QAAQ,QAAQ,aAAa;iBA0DhE"}
package/build/index.js CHANGED
@@ -1,142 +1,123 @@
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.mapSimpleDbTypeToTypescriptType = exports.EntityDbMetadata = exports.makeEntity = void 0;
7
- exports.joistCodegen = joistCodegen;
8
- exports.generateAndSaveFiles = generateAndSaveFiles;
9
- exports.maybeSetExitCode = maybeSetExitCode;
10
- const joist_utils_1 = require("joist-utils");
11
- const node_process_1 = __importDefault(require("node:process"));
12
- const pg_1 = require("pg");
13
- const pg_structure_1 = __importDefault(require("pg-structure"));
14
- const ts_poet_1 = require("ts-poet");
15
- const EntityDbMetadata_1 = require("./EntityDbMetadata");
16
- Object.defineProperty(exports, "EntityDbMetadata", { enumerable: true, get: function () { return EntityDbMetadata_1.EntityDbMetadata; } });
17
- const assignTags_1 = require("./assignTags");
18
- const codemods_1 = require("./codemods");
19
- const config_1 = require("./config");
20
- const foreignKeyOrdering_1 = require("./foreignKeyOrdering");
21
- const generate_1 = require("./generate");
22
- const generateFlushFunction_1 = require("./generateFlushFunction");
23
- const inheritance_1 = require("./inheritance");
24
- const loadMetadata_1 = require("./loadMetadata");
25
- const logger_1 = require("./logger");
26
- const scanEntityFiles_1 = require("./scanEntityFiles");
27
- const utils_1 = require("./utils");
28
- Object.defineProperty(exports, "mapSimpleDbTypeToTypescriptType", { enumerable: true, get: function () { return utils_1.mapSimpleDbTypeToTypescriptType; } });
29
- var EntityDbMetadata_2 = require("./EntityDbMetadata");
30
- Object.defineProperty(exports, "makeEntity", { enumerable: true, get: function () { return EntityDbMetadata_2.makeEntity; } });
1
+ #!/usr/bin/env node
2
+ import { __require } from "./_virtual/_rolldown/runtime.js";
3
+ import { maybeRunTransforms } from "./codemods/index.js";
4
+ import { dateCode, isEntityTable, isEnumTable, isJoinTable, mapSimpleDbTypeToTypescriptType, plainDateCode, plainDateTimeCode, zonedDateTimeCode } from "./utils.js";
5
+ import { applyInheritanceUpdates } from "./inheritance.js";
6
+ import { LOG_LEVELS, loggerMaxWarningLevelHit } from "./logger.js";
7
+ import { loadConfig, stripStiPlaceholders, warnInvalidConfigEntries, writeConfig } from "./config.js";
8
+ import { assignTags } from "./assignTags.js";
9
+ import { maybeSetForeignKeyOrdering } from "./foreignKeyOrdering.js";
10
+ import { generateFiles } from "./generate.js";
11
+ import { createFlushFunction } from "./generateFlushFunction.js";
12
+ import { installSkills } from "./installSkills.js";
13
+ import { scanEntityFiles } from "./scanEntityFiles.js";
14
+ import { loadEnumMetadata, loadPgEnumMetadata } from "./loadMetadata.js";
15
+ import { EntityDbMetadata, failIfOverlappingFieldNames, makeEntity, resolveNameConflicts } from "./EntityDbMetadata.js";
16
+ import { newPgConnectionConfig } from "joist-utils";
17
+ import pgStructureModule from "pg-structure";
18
+ import { saveFiles } from "ts-poet";
19
+ import { Client } from "pg";
20
+ import process from "node:process";
21
+ //#region src/index.ts
22
+ const { default: pgStructure } = pgStructureModule;
31
23
  async function joistCodegen() {
32
- const config = await (0, config_1.loadConfig)();
33
- maybeSetDatabaseUrl(config);
34
- if (!node_process_1.default.env.DATABASE_URL && !node_process_1.default.env.DB_USER) {
35
- console.log(`Database connection information not found, please set either:`);
36
- console.log(` - the DATABASE_URL env variable (i.e. using .env and dotenv), or`);
37
- console.log(` - the databaseUrl key in joist-config.json`);
38
- return;
39
- }
40
- const pgConfig = (0, joist_utils_1.newPgConnectionConfig)();
41
- const client = new pg_1.Client(pgConfig);
42
- await client.connect();
43
- const dbMetadata = await loadSchemaMetadata(config, client);
44
- const { entities, enums, totalTables } = dbMetadata;
45
- console.log(`Found ${totalTables} total tables, ${entities.length} entity tables, ${Object.entries(enums).length} enum tables`);
46
- console.log("");
47
- // Look for STI tables to synthesize separate metas
48
- (0, inheritance_1.applyInheritanceUpdates)(config, dbMetadata);
49
- // Now that all entities (incl. STI subtypes) are known, fix up any colliding codegen'd type names
50
- (0, EntityDbMetadata_1.resolveNameConflicts)(config, dbMetadata);
51
- // Assign any new tags and write them back to the config file
52
- (0, assignTags_1.assignTags)(config, dbMetadata);
53
- // Scan `*.ts` files after we've expanded `Task` -> `TaskOld.ts`
54
- await (0, scanEntityFiles_1.scanEntityFiles)(config, dbMetadata);
55
- // If we're not using deferred FKs, determine our DAG insert order
56
- await (0, foreignKeyOrdering_1.maybeSetForeignKeyOrdering)(config, dbMetadata.entities);
57
- // Generate the flush function for tests
58
- await maybeGenerateFlushFunctions(config, client, pgConfig, dbMetadata);
59
- await client.end();
60
- // Apply any codemods to the user's codebase, if we have them
61
- await (0, codemods_1.maybeRunTransforms)(config);
62
- // Do some warnings
63
- for (const entity of entities)
64
- (0, EntityDbMetadata_1.failIfOverlappingFieldNames)(entity);
65
- (0, config_1.warnInvalidConfigEntries)(config, dbMetadata);
66
- // Finally actually generate the files (even if we found a fatal error)
67
- await generateAndSaveFiles(config, dbMetadata);
68
- (0, config_1.stripStiPlaceholders)(config, entities);
69
- await (0, config_1.writeConfig)(config);
24
+ const config = await loadConfig();
25
+ maybeSetDatabaseUrl(config);
26
+ if (!process.env.DATABASE_URL && !process.env.DB_USER) {
27
+ console.log(`Database connection information not found, please set either:`);
28
+ console.log(` - the DATABASE_URL env variable (i.e. using .env and dotenv), or`);
29
+ console.log(` - the databaseUrl key in joist-config.json`);
30
+ return;
31
+ }
32
+ const pgConfig = newPgConnectionConfig();
33
+ const client = new Client(pgConfig);
34
+ await client.connect();
35
+ const dbMetadata = await loadSchemaMetadata(config, client);
36
+ const { entities, enums, totalTables } = dbMetadata;
37
+ console.log(`Found ${totalTables} total tables, ${entities.length} entity tables, ${Object.entries(enums).length} enum tables`);
38
+ console.log("");
39
+ applyInheritanceUpdates(config, dbMetadata);
40
+ resolveNameConflicts(config, dbMetadata);
41
+ assignTags(config, dbMetadata);
42
+ validateTagDelimiter(config, entities);
43
+ await scanEntityFiles(config, dbMetadata);
44
+ await maybeSetForeignKeyOrdering(config, dbMetadata.entities);
45
+ await maybeGenerateFlushFunctions(config, client, pgConfig, dbMetadata);
46
+ await client.end();
47
+ await maybeRunTransforms(config);
48
+ for (const entity of entities) failIfOverlappingFieldNames(entity);
49
+ warnInvalidConfigEntries(config, dbMetadata);
50
+ await generateAndSaveFiles(config, dbMetadata);
51
+ if (config.skills !== false) await installSkills();
52
+ stripStiPlaceholders(config, entities);
53
+ await writeConfig(config);
70
54
  }
71
55
  /** Uses entities and enums from the `db` schema and saves them into our entities directory. */
72
56
  async function generateAndSaveFiles(config, dbMeta) {
73
- const files = await (0, generate_1.generateFiles)(config, dbMeta);
74
- const esmExt = config.esm ? (config.allowImportingTsExtensions ? "ts" : "js") : "";
75
- await (0, ts_poet_1.saveFiles)({
76
- toolName: "joist-codegen",
77
- directory: config.entitiesDirectory,
78
- files,
79
- toStringOpts: { importExtensions: esmExt || false },
80
- });
57
+ const files = await generateFiles(config, dbMeta);
58
+ const esmExt = config.esm ? config.allowImportingTsExtensions ? "ts" : "js" : "";
59
+ await saveFiles({
60
+ toolName: "joist-codegen",
61
+ directory: config.entitiesDirectory,
62
+ files,
63
+ toStringOpts: { importExtensions: esmExt || false }
64
+ });
81
65
  }
82
66
  async function maybeGenerateFlushFunctions(config, client, pgConfig, db) {
83
- // In graphql-service we have our own custom flush function, so allow skipping this
84
- if (config.createFlushFunction !== false) {
85
- // Look for multiple test databases
86
- if (Array.isArray(config.createFlushFunction)) {
87
- console.log("Creating flush_database functions");
88
- await Promise.all(config.createFlushFunction.map(async (dbName) => {
89
- const client = new pg_1.Client({ ...pgConfig, database: dbName });
90
- await client.connect();
91
- await (0, generateFlushFunction_1.createFlushFunction)(client, db);
92
- await client.end();
93
- }));
94
- }
95
- else {
96
- console.log("Creating flush_database function");
97
- await (0, generateFlushFunction_1.createFlushFunction)(client, db);
98
- }
99
- }
67
+ if (config.createFlushFunction !== false) {
68
+ if (Array.isArray(config.createFlushFunction)) {
69
+ console.log("Creating flush_database functions");
70
+ await Promise.all(config.createFlushFunction.map(async (dbName) => {
71
+ const client = new Client({
72
+ ...pgConfig,
73
+ database: dbName
74
+ });
75
+ await client.connect();
76
+ await createFlushFunction(client, db);
77
+ await client.end();
78
+ }));
79
+ } else {
80
+ console.log("Creating flush_database function");
81
+ await createFlushFunction(client, db);
82
+ }
83
+ }
100
84
  }
101
85
  async function loadSchemaMetadata(config, client) {
102
- // Here we load all schemas, to avoid pg-structure failing on cross-schema foreign keys
103
- // like our cyanaudit triggers (https://github.com/ozum/pg-structure/issues/85), and then
104
- // later filter them non-public schema tables out.
105
- const db = await (0, pg_structure_1.default)(client);
106
- const enums = await (0, loadMetadata_1.loadEnumMetadata)(db, client, config);
107
- const pgEnums = await (0, loadMetadata_1.loadPgEnumMetadata)(db, client, config);
108
- const entities = db.tables
109
- .filter((t) => (0, utils_1.isEntityTable)(config, t))
110
- .sortBy("name")
111
- .map((table) => new EntityDbMetadata_1.EntityDbMetadata(config, table, enums));
112
- const totalTables = db.tables.length;
113
- const joinTables = db.tables.filter((t) => (0, utils_1.isJoinTable)(config, t)).map((t) => t.name);
114
- const otherTables = db.tables
115
- .filter((t) => !(0, utils_1.isEntityTable)(config, t) && !(0, utils_1.isEnumTable)(config, t) && !(0, utils_1.isJoinTable)(config, t))
116
- .map((t) => t.name);
117
- const entitiesByName = Object.fromEntries(entities.map((e) => [e.name, e]));
118
- return { entities, entitiesByName, enums, pgEnums, totalTables, joinTables, otherTables };
86
+ const db = await pgStructure(client);
87
+ const enums = await loadEnumMetadata(db, client, config);
88
+ const pgEnums = await loadPgEnumMetadata(db, client, config);
89
+ const entities = db.tables.filter((t) => isEntityTable(config, t)).sortBy("name").map((table) => new EntityDbMetadata(config, table, enums));
90
+ const totalTables = db.tables.length;
91
+ const joinTables = db.tables.filter((t) => isJoinTable(config, t)).map((t) => t.name);
92
+ const otherTables = db.tables.filter((t) => !isEntityTable(config, t) && !isEnumTable(config, t) && !isJoinTable(config, t)).map((t) => t.name);
93
+ return {
94
+ entities,
95
+ entitiesByName: Object.fromEntries(entities.map((e) => [e.name, e])),
96
+ enums,
97
+ pgEnums,
98
+ totalTables,
99
+ joinTables,
100
+ otherTables
101
+ };
119
102
  }
120
103
  function maybeSetDatabaseUrl(config) {
121
- if (!node_process_1.default.env.DATABASE_URL && config.databaseUrl) {
122
- node_process_1.default.env.DATABASE_URL = config.databaseUrl;
123
- }
104
+ if (!process.env.DATABASE_URL && config.databaseUrl) process.env.DATABASE_URL = config.databaseUrl;
124
105
  }
125
106
  function maybeSetExitCode() {
126
- if (!node_process_1.default.argv.includes("--always-exit-code-zero") &&
127
- // strict mode + warnings or greater
128
- ((node_process_1.default.argv.includes("--strict") && logger_1.loggerMaxWarningLevelHit >= logger_1.LOG_LEVELS.warn) ||
129
- // otherwise errors or greater
130
- logger_1.loggerMaxWarningLevelHit >= logger_1.LOG_LEVELS.error)) {
131
- node_process_1.default.exitCode = 1;
132
- }
107
+ if (!process.argv.includes("--always-exit-code-zero") && (process.argv.includes("--strict") && loggerMaxWarningLevelHit >= LOG_LEVELS.warn || loggerMaxWarningLevelHit >= LOG_LEVELS.error)) process.exitCode = 1;
133
108
  }
134
- if (require.main === module) {
135
- joistCodegen()
136
- .then(() => maybeSetExitCode())
137
- .catch((err) => {
138
- console.error(err);
139
- node_process_1.default.exit(1);
140
- });
109
+ /** Validates that tags can be parsed unambiguously with the configured delimiter. */
110
+ function validateTagDelimiter(config, entities) {
111
+ const tagDelimiter = config.tagDelimiter ?? ":";
112
+ for (const entity of entities) if (tagDelimiter !== "" && `${entity.tagName}${tagDelimiter}`.indexOf(tagDelimiter) !== entity.tagName.length) throw new Error(`Tagged id delimiter '${tagDelimiter}' cannot occur in or overlap tag '${entity.tagName}' for ${entity.name}`);
113
+ else if (tagDelimiter === "" && !/^[a-z]+$/i.test(entity.tagName)) throw new Error(`Delimiterless ids require an alphabetic tag, got '${entity.tagName}' for ${entity.name}`);
114
+ else if (tagDelimiter === "" && entity.primaryKey.columnType !== "int" && entity.primaryKey.columnType !== "bigint") throw new Error(`Delimiterless ids require an int or bigint primary key, got '${entity.primaryKey.columnType}' for ${entity.name}`);
141
115
  }
116
+ if (typeof module !== "undefined" && __require.main === module) joistCodegen().then(() => maybeSetExitCode()).catch((err) => {
117
+ console.error(err);
118
+ process.exit(1);
119
+ });
120
+ //#endregion
121
+ export { EntityDbMetadata, dateCode, generateAndSaveFiles, joistCodegen, makeEntity, mapSimpleDbTypeToTypescriptType, maybeSetExitCode, plainDateCode, plainDateTimeCode, zonedDateTimeCode };
122
+
142
123
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport process from \"node:process\";\n\nimport { type ConnectionConfig, newPgConnectionConfig } from \"joist-utils\";\nimport { Client } from \"pg\";\nimport pgStructureModule from \"pg-structure\";\nimport { saveFiles } from \"ts-poet\";\n\nimport { assignTags } from \"./assignTags.ts\";\nimport { maybeRunTransforms } from \"./codemods/index.ts\";\nimport { type Config, loadConfig, stripStiPlaceholders, warnInvalidConfigEntries, writeConfig } from \"./config.ts\";\nimport {\n type DbMetadata,\n EntityDbMetadata,\n failIfOverlappingFieldNames,\n resolveNameConflicts,\n} from \"./EntityDbMetadata.ts\";\nimport { maybeSetForeignKeyOrdering } from \"./foreignKeyOrdering.ts\";\nimport { generateFiles } from \"./generate.ts\";\nimport { createFlushFunction } from \"./generateFlushFunction.ts\";\nimport { applyInheritanceUpdates } from \"./inheritance.ts\";\nimport { installSkills } from \"./installSkills.ts\";\nimport { loadEnumMetadata, loadPgEnumMetadata } from \"./loadMetadata.ts\";\nimport { LOG_LEVELS, loggerMaxWarningLevelHit } from \"./logger.ts\";\nimport { scanEntityFiles } from \"./scanEntityFiles.ts\";\nimport { isEntityTable, isEnumTable, isJoinTable, mapSimpleDbTypeToTypescriptType } from \"./utils.ts\";\n\nconst { default: pgStructure } = pgStructureModule;\n\nexport {\n type DbMetadata,\n type EnumField,\n makeEntity,\n type ManyToManyField,\n type ManyToOneField,\n type OneToManyField,\n type OneToOneField,\n type PolymorphicField,\n type PrimitiveField,\n type PrimitiveTypescriptType,\n} from \"./EntityDbMetadata.ts\";\nexport type { EnumMetadata, EnumRow, EnumTableData, PgEnumData, PgEnumMetadata } from \"./loadMetadata.ts\";\nexport { dateCode, plainDateCode, plainDateTimeCode, zonedDateTimeCode } from \"./utils.ts\";\nexport { type Config, EntityDbMetadata, mapSimpleDbTypeToTypescriptType };\n\nexport async function joistCodegen() {\n const config = await loadConfig();\n\n maybeSetDatabaseUrl(config);\n if (!process.env.DATABASE_URL && !process.env.DB_USER) {\n console.log(`Database connection information not found, please set either:`);\n console.log(` - the DATABASE_URL env variable (i.e. using .env and dotenv), or`);\n console.log(` - the databaseUrl key in joist-config.json`);\n return;\n }\n const pgConfig = newPgConnectionConfig();\n\n const client = new Client(pgConfig);\n await client.connect();\n\n const dbMetadata = await loadSchemaMetadata(config, client);\n const { entities, enums, totalTables } = dbMetadata;\n console.log(\n `Found ${totalTables} total tables, ${entities.length} entity tables, ${Object.entries(enums).length} enum tables`,\n );\n console.log(\"\");\n\n // Look for STI tables to synthesize separate metas\n applyInheritanceUpdates(config, dbMetadata);\n\n // Now that all entities (incl. STI subtypes) are known, fix up any colliding codegen'd type names\n resolveNameConflicts(config, dbMetadata);\n\n // Assign any new tags and write them back to the config file\n assignTags(config, dbMetadata);\n validateTagDelimiter(config, entities);\n\n // Scan `*.ts` files after we've expanded `Task` -> `TaskOld.ts`\n await scanEntityFiles(config, dbMetadata);\n\n // If we're not using deferred FKs, determine our DAG insert order\n await maybeSetForeignKeyOrdering(config, dbMetadata.entities);\n\n // Generate the flush function for tests\n await maybeGenerateFlushFunctions(config, client, pgConfig, dbMetadata);\n\n await client.end();\n\n // Apply any codemods to the user's codebase, if we have them\n await maybeRunTransforms(config);\n\n // Do some warnings\n for (const entity of entities) failIfOverlappingFieldNames(entity);\n warnInvalidConfigEntries(config, dbMetadata);\n\n // Finally actually generate the files (even if we found a fatal error)\n await generateAndSaveFiles(config, dbMetadata);\n\n // Install our bundled Agent Skills so coding agents can find them, unless explicitly disabled\n if (config.skills !== false) await installSkills();\n\n stripStiPlaceholders(config, entities);\n await writeConfig(config);\n}\n\n/** Uses entities and enums from the `db` schema and saves them into our entities directory. */\nexport async function generateAndSaveFiles(config: Config, dbMeta: DbMetadata): Promise<void> {\n const files = await generateFiles(config, dbMeta);\n const esmExt = config.esm ? (config.allowImportingTsExtensions ? \"ts\" : \"js\") : \"\";\n await saveFiles({\n toolName: \"joist-codegen\",\n directory: config.entitiesDirectory,\n files,\n toStringOpts: { importExtensions: esmExt || false },\n });\n}\n\nasync function maybeGenerateFlushFunctions(config: Config, client: Client, pgConfig: ConnectionConfig, db: DbMetadata) {\n // In graphql-service we have our own custom flush function, so allow skipping this\n if (config.createFlushFunction !== false) {\n // Look for multiple test databases\n if (Array.isArray(config.createFlushFunction)) {\n console.log(\"Creating flush_database functions\");\n await Promise.all(\n config.createFlushFunction.map(async (dbName) => {\n const client = new Client({ ...pgConfig, database: dbName });\n await client.connect();\n await createFlushFunction(client, db);\n await client.end();\n }),\n );\n } else {\n console.log(\"Creating flush_database function\");\n await createFlushFunction(client, db);\n }\n }\n}\n\nasync function loadSchemaMetadata(config: Config, client: Client): Promise<DbMetadata> {\n // Here we load all schemas, to avoid pg-structure failing on cross-schema foreign keys\n // like our cyanaudit triggers (https://github.com/ozum/pg-structure/issues/85), and then\n // later filter them non-public schema tables out.\n const db = await pgStructure(client);\n const enums = await loadEnumMetadata(db, client, config);\n const pgEnums = await loadPgEnumMetadata(db, client, config);\n const entities = db.tables\n .filter((t) => isEntityTable(config, t))\n .sortBy(\"name\")\n .map((table) => new EntityDbMetadata(config, table, enums));\n const totalTables = db.tables.length;\n const joinTables = db.tables.filter((t) => isJoinTable(config, t)).map((t) => t.name);\n const otherTables = db.tables\n .filter((t) => !isEntityTable(config, t) && !isEnumTable(config, t) && !isJoinTable(config, t))\n .map((t) => t.name);\n const entitiesByName = Object.fromEntries(entities.map((e) => [e.name, e]));\n return { entities, entitiesByName, enums, pgEnums, totalTables, joinTables, otherTables };\n}\n\nfunction maybeSetDatabaseUrl(config: Config): void {\n if (!process.env.DATABASE_URL && config.databaseUrl) {\n process.env.DATABASE_URL = config.databaseUrl;\n }\n}\n\nexport function maybeSetExitCode(): void {\n if (\n !process.argv.includes(\"--always-exit-code-zero\") &&\n // strict mode + warnings or greater\n ((process.argv.includes(\"--strict\") && loggerMaxWarningLevelHit >= LOG_LEVELS.warn) ||\n // otherwise errors or greater\n loggerMaxWarningLevelHit >= LOG_LEVELS.error)\n ) {\n process.exitCode = 1;\n }\n}\n\n/** Validates that tags can be parsed unambiguously with the configured delimiter. */\nfunction validateTagDelimiter(config: Config, entities: EntityDbMetadata[]): void {\n const tagDelimiter = config.tagDelimiter ?? \":\";\n for (const entity of entities) {\n if (tagDelimiter !== \"\" && `${entity.tagName}${tagDelimiter}`.indexOf(tagDelimiter) !== entity.tagName.length) {\n throw new Error(\n `Tagged id delimiter '${tagDelimiter}' cannot occur in or overlap tag '${entity.tagName}' for ${entity.name}`,\n );\n } else if (tagDelimiter === \"\" && !/^[a-z]+$/i.test(entity.tagName)) {\n throw new Error(`Delimiterless ids require an alphabetic tag, got '${entity.tagName}' for ${entity.name}`);\n } else if (\n tagDelimiter === \"\" &&\n entity.primaryKey.columnType !== \"int\" &&\n entity.primaryKey.columnType !== \"bigint\"\n ) {\n throw new Error(\n `Delimiterless ids require an int or bigint primary key, got '${entity.primaryKey.columnType}' for ${entity.name}`,\n );\n }\n }\n}\n\nif (typeof module !== \"undefined\" && require.main === module) {\n joistCodegen()\n .then(() => maybeSetExitCode())\n .catch((err) => {\n console.error(err);\n process.exit(1);\n });\n}\n"],"mappings":"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"}