joist-codegen 2.3.0-next.8 → 2.3.0-next.80

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (420) hide show
  1. package/build/EntityDbMetadata.cjs +642 -0
  2. package/build/EntityDbMetadata.cjs.map +1 -0
  3. package/build/EntityDbMetadata.d.cts +299 -0
  4. package/build/EntityDbMetadata.d.cts.map +1 -0
  5. package/build/EntityDbMetadata.d.mts +299 -0
  6. package/build/EntityDbMetadata.d.mts.map +1 -0
  7. package/build/EntityDbMetadata.js +519 -661
  8. package/build/EntityDbMetadata.js.map +1 -1
  9. package/build/_virtual/_rolldown/runtime.cjs +23 -0
  10. package/build/_virtual/_rolldown/runtime.js +5 -0
  11. package/build/assignTags.cjs +45 -0
  12. package/build/assignTags.cjs.map +1 -0
  13. package/build/{assignTags.d.ts → assignTags.d.cts} +8 -4
  14. package/build/assignTags.d.cts.map +1 -0
  15. package/build/assignTags.d.mts +16 -0
  16. package/build/assignTags.d.mts.map +1 -0
  17. package/build/assignTags.js +37 -59
  18. package/build/assignTags.js.map +1 -1
  19. package/build/codemods/Codemod.cjs +2 -0
  20. package/build/codemods/Codemod.d.cts +17 -0
  21. package/build/codemods/Codemod.d.cts.map +1 -0
  22. package/build/codemods/Codemod.d.mts +17 -0
  23. package/build/codemods/Codemod.d.mts.map +1 -0
  24. package/build/codemods/Codemod.js +2 -3
  25. package/build/codemods/JscodeshiftMod.cjs +42 -0
  26. package/build/codemods/JscodeshiftMod.cjs.map +1 -0
  27. package/build/codemods/JscodeshiftMod.d.cts +14 -0
  28. package/build/codemods/JscodeshiftMod.d.cts.map +1 -0
  29. package/build/codemods/JscodeshiftMod.d.mts +14 -0
  30. package/build/codemods/JscodeshiftMod.d.mts.map +1 -0
  31. package/build/codemods/JscodeshiftMod.js +33 -33
  32. package/build/codemods/JscodeshiftMod.js.map +1 -1
  33. package/build/codemods/codemod_0001-rename_has_async_property.cjs +30 -0
  34. package/build/codemods/codemod_0001-rename_has_async_property.cjs.map +1 -0
  35. package/build/codemods/codemod_0001-rename_has_async_property.d.cts +9 -0
  36. package/build/codemods/codemod_0001-rename_has_async_property.d.cts.map +1 -0
  37. package/build/codemods/codemod_0001-rename_has_async_property.d.mts +9 -0
  38. package/build/codemods/codemod_0001-rename_has_async_property.d.mts.map +1 -0
  39. package/build/codemods/codemod_0001-rename_has_async_property.js +21 -25
  40. package/build/codemods/codemod_0001-rename_has_async_property.js.map +1 -1
  41. package/build/codemods/codemod_0002-rename_async_query_fields.cjs +50 -0
  42. package/build/codemods/codemod_0002-rename_async_query_fields.cjs.map +1 -0
  43. package/build/codemods/codemod_0002-rename_async_query_fields.d.cts +9 -0
  44. package/build/codemods/codemod_0002-rename_async_query_fields.d.cts.map +1 -0
  45. package/build/codemods/codemod_0002-rename_async_query_fields.d.mts +9 -0
  46. package/build/codemods/codemod_0002-rename_async_query_fields.d.mts.map +1 -0
  47. package/build/codemods/codemod_0002-rename_async_query_fields.js +38 -52
  48. package/build/codemods/codemod_0002-rename_async_query_fields.js.map +1 -1
  49. package/build/codemods/codemod_0003-rename_find_paginated.cjs +25 -0
  50. package/build/codemods/codemod_0003-rename_find_paginated.cjs.map +1 -0
  51. package/build/codemods/codemod_0003-rename_find_paginated.d.cts +9 -0
  52. package/build/codemods/codemod_0003-rename_find_paginated.d.cts.map +1 -0
  53. package/build/codemods/codemod_0003-rename_find_paginated.d.mts +9 -0
  54. package/build/codemods/codemod_0003-rename_find_paginated.d.mts.map +1 -0
  55. package/build/codemods/codemod_0003-rename_find_paginated.js +17 -26
  56. package/build/codemods/codemod_0003-rename_find_paginated.js.map +1 -1
  57. package/build/codemods/index.cjs +49 -0
  58. package/build/codemods/index.cjs.map +1 -0
  59. package/build/codemods/index.d.cts +12 -0
  60. package/build/codemods/index.d.cts.map +1 -0
  61. package/build/codemods/index.d.mts +12 -0
  62. package/build/codemods/index.d.mts.map +1 -0
  63. package/build/codemods/index.js +34 -42
  64. package/build/codemods/index.js.map +1 -1
  65. package/build/config.cjs +377 -0
  66. package/build/config.cjs.map +1 -0
  67. package/build/config.d.cts +181 -0
  68. package/build/config.d.cts.map +1 -0
  69. package/build/config.d.mts +181 -0
  70. package/build/config.d.mts.map +1 -0
  71. package/build/config.js +309 -347
  72. package/build/config.js.map +1 -1
  73. package/build/docs/cache.cjs +62 -0
  74. package/build/docs/cache.cjs.map +1 -0
  75. package/build/docs/cache.d.cts +17 -0
  76. package/build/docs/cache.d.cts.map +1 -0
  77. package/build/docs/cache.d.mts +17 -0
  78. package/build/docs/cache.d.mts.map +1 -0
  79. package/build/docs/cache.js +52 -53
  80. package/build/docs/cache.js.map +1 -1
  81. package/build/docs/generate-metadata-docs.cjs +32 -0
  82. package/build/docs/generate-metadata-docs.cjs.map +1 -0
  83. package/build/docs/generate-metadata-docs.d.cts +9 -0
  84. package/build/docs/generate-metadata-docs.d.cts.map +1 -0
  85. package/build/docs/generate-metadata-docs.d.mts +9 -0
  86. package/build/docs/generate-metadata-docs.d.mts.map +1 -0
  87. package/build/docs/generate-metadata-docs.js +19 -24
  88. package/build/docs/generate-metadata-docs.js.map +1 -1
  89. package/build/docs/index.cjs +90 -0
  90. package/build/docs/index.cjs.map +1 -0
  91. package/build/docs/index.d.cts +16 -0
  92. package/build/docs/index.d.cts.map +1 -0
  93. package/build/docs/index.d.mts +16 -0
  94. package/build/docs/index.d.mts.map +1 -0
  95. package/build/docs/index.js +75 -80
  96. package/build/docs/index.js.map +1 -1
  97. package/build/docs/markdown.cjs +181 -0
  98. package/build/docs/markdown.cjs.map +1 -0
  99. package/build/docs/{markdown.d.ts → markdown.d.cts} +14 -12
  100. package/build/docs/markdown.d.cts.map +1 -0
  101. package/build/docs/markdown.d.mts +32 -0
  102. package/build/docs/markdown.d.mts.map +1 -0
  103. package/build/docs/markdown.js +152 -220
  104. package/build/docs/markdown.js.map +1 -1
  105. package/build/docs/parsing.cjs +117 -0
  106. package/build/docs/parsing.cjs.map +1 -0
  107. package/build/docs/parsing.d.cts +48 -0
  108. package/build/docs/parsing.d.cts.map +1 -0
  109. package/build/docs/parsing.d.mts +48 -0
  110. package/build/docs/parsing.d.mts.map +1 -0
  111. package/build/docs/parsing.js +89 -88
  112. package/build/docs/parsing.js.map +1 -1
  113. package/build/findEntityScopes.cjs +119 -0
  114. package/build/findEntityScopes.cjs.map +1 -0
  115. package/build/findEntityScopes.d.cts +14 -0
  116. package/build/findEntityScopes.d.cts.map +1 -0
  117. package/build/findEntityScopes.d.mts +14 -0
  118. package/build/findEntityScopes.d.mts.map +1 -0
  119. package/build/findEntityScopes.js +83 -111
  120. package/build/findEntityScopes.js.map +1 -1
  121. package/build/foreignKeyOrdering.cjs +52 -0
  122. package/build/foreignKeyOrdering.cjs.map +1 -0
  123. package/build/foreignKeyOrdering.d.cts +8 -0
  124. package/build/foreignKeyOrdering.d.cts.map +1 -0
  125. package/build/foreignKeyOrdering.d.mts +8 -0
  126. package/build/foreignKeyOrdering.d.mts.map +1 -0
  127. package/build/foreignKeyOrdering.js +46 -55
  128. package/build/foreignKeyOrdering.js.map +1 -1
  129. package/build/generate.cjs +128 -0
  130. package/build/generate.cjs.map +1 -0
  131. package/build/generate.d.cts +17 -0
  132. package/build/generate.d.cts.map +1 -0
  133. package/build/generate.d.mts +17 -0
  134. package/build/generate.d.mts.map +1 -0
  135. package/build/generate.js +111 -124
  136. package/build/generate.js.map +1 -1
  137. package/build/generateEntitiesFile.cjs +46 -0
  138. package/build/generateEntitiesFile.cjs.map +1 -0
  139. package/build/generateEntitiesFile.d.cts +11 -0
  140. package/build/generateEntitiesFile.d.cts.map +1 -0
  141. package/build/generateEntitiesFile.d.mts +11 -0
  142. package/build/generateEntitiesFile.d.mts.map +1 -0
  143. package/build/generateEntitiesFile.js +28 -25
  144. package/build/generateEntitiesFile.js.map +1 -1
  145. package/build/generateEntityCodegenFile.cjs +1010 -0
  146. package/build/generateEntityCodegenFile.cjs.map +1 -0
  147. package/build/generateEntityCodegenFile.d.cts +16 -0
  148. package/build/generateEntityCodegenFile.d.cts.map +1 -0
  149. package/build/generateEntityCodegenFile.d.mts +16 -0
  150. package/build/generateEntityCodegenFile.d.mts.map +1 -0
  151. package/build/generateEntityCodegenFile.js +793 -827
  152. package/build/generateEntityCodegenFile.js.map +1 -1
  153. package/build/generateEntityFile.cjs +23 -0
  154. package/build/generateEntityFile.cjs.map +1 -0
  155. package/build/generateEntityFile.d.cts +9 -0
  156. package/build/generateEntityFile.d.cts.map +1 -0
  157. package/build/generateEntityFile.d.mts +9 -0
  158. package/build/generateEntityFile.d.mts.map +1 -0
  159. package/build/generateEntityFile.js +11 -8
  160. package/build/generateEntityFile.js.map +1 -1
  161. package/build/generateEntityTestFile.cjs +25 -0
  162. package/build/generateEntityTestFile.cjs.map +1 -0
  163. package/build/generateEntityTestFile.d.cts +9 -0
  164. package/build/generateEntityTestFile.d.cts.map +1 -0
  165. package/build/generateEntityTestFile.d.mts +9 -0
  166. package/build/generateEntityTestFile.d.mts.map +1 -0
  167. package/build/generateEntityTestFile.js +10 -7
  168. package/build/generateEntityTestFile.js.map +1 -1
  169. package/build/generateEnumFile.cjs +73 -0
  170. package/build/generateEnumFile.cjs.map +1 -0
  171. package/build/generateEnumFile.d.cts +9 -0
  172. package/build/generateEnumFile.d.cts.map +1 -0
  173. package/build/generateEnumFile.d.mts +9 -0
  174. package/build/generateEnumFile.d.mts.map +1 -0
  175. package/build/generateEnumFile.js +33 -43
  176. package/build/generateEnumFile.js.map +1 -1
  177. package/build/generateFactoriesFiles.cjs +28 -0
  178. package/build/generateFactoriesFiles.cjs.map +1 -0
  179. package/build/generateFactoriesFiles.d.cts +7 -0
  180. package/build/generateFactoriesFiles.d.cts.map +1 -0
  181. package/build/generateFactoriesFiles.d.mts +7 -0
  182. package/build/generateFactoriesFiles.d.mts.map +1 -0
  183. package/build/generateFactoriesFiles.js +21 -16
  184. package/build/generateFactoriesFiles.js.map +1 -1
  185. package/build/generateFlushFunction.cjs +61 -0
  186. package/build/generateFlushFunction.cjs.map +1 -0
  187. package/build/{generateFlushFunction.d.ts → generateFlushFunction.d.cts} +8 -5
  188. package/build/generateFlushFunction.d.cts.map +1 -0
  189. package/build/generateFlushFunction.d.mts +23 -0
  190. package/build/generateFlushFunction.d.mts.map +1 -0
  191. package/build/generateFlushFunction.js +32 -78
  192. package/build/generateFlushFunction.js.map +1 -1
  193. package/build/generateMetadataFile.cjs +307 -0
  194. package/build/generateMetadataFile.cjs.map +1 -0
  195. package/build/generateMetadataFile.d.cts +10 -0
  196. package/build/generateMetadataFile.d.cts.map +1 -0
  197. package/build/generateMetadataFile.d.mts +10 -0
  198. package/build/generateMetadataFile.d.mts.map +1 -0
  199. package/build/generateMetadataFile.js +148 -156
  200. package/build/generateMetadataFile.js.map +1 -1
  201. package/build/generatePgEnumFile.cjs +21 -0
  202. package/build/generatePgEnumFile.cjs.map +1 -0
  203. package/build/generatePgEnumFile.d.cts +9 -0
  204. package/build/generatePgEnumFile.d.cts.map +1 -0
  205. package/build/generatePgEnumFile.d.mts +9 -0
  206. package/build/generatePgEnumFile.d.mts.map +1 -0
  207. package/build/generatePgEnumFile.js +12 -9
  208. package/build/generatePgEnumFile.js.map +1 -1
  209. package/build/index.cjs +135 -0
  210. package/build/index.cjs.map +1 -0
  211. package/build/index.d.cts +12 -0
  212. package/build/index.d.cts.map +1 -0
  213. package/build/index.d.mts +12 -0
  214. package/build/index.d.mts.map +1 -0
  215. package/build/index.js +108 -127
  216. package/build/index.js.map +1 -1
  217. package/build/inheritance.cjs +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 @@
1
+ {"version":3,"file":"generateEnumFile.d.cts","names":[],"sources":["../src/generateEnumFile.ts"],"mappings":";;;;;iBAQgB,iBAAiB,QAAQ,QAAQ,UAAU,eAAe,mBAAmB"}
@@ -0,0 +1,9 @@
1
+ import { Config } from "./config.mjs";
2
+ import "./index.mjs";
3
+ import { EnumTableData } from "./loadMetadata.mjs";
4
+ import { Code } from "ts-poet";
5
+ //#region src/generateEnumFile.d.ts
6
+ declare function generateEnumFile(config: Config, enumData: EnumTableData, enumName: string): Code;
7
+ //#endregion
8
+ export { generateEnumFile };
9
+ //# sourceMappingURL=generateEnumFile.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateEnumFile.d.mts","names":[],"sources":["../src/generateEnumFile.ts"],"mappings":";;;;;iBAQgB,iBAAiB,QAAQ,QAAQ,UAAU,eAAe,mBAAmB"}
@@ -1,58 +1,45 @@
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.generateEnumFile = generateEnumFile;
7
- const change_case_1 = require("change-case");
8
- const pluralize_1 = __importDefault(require("pluralize"));
9
- const ts_poet_1 = require("ts-poet");
10
- const symbols_1 = require("./symbols");
1
+ import "./config.js";
2
+ import { EnumMetadata } from "./symbols.js";
3
+ import "./index.js";
4
+ import { pascalCase } from "change-case";
5
+ import pluralize from "pluralize";
6
+ import { code } from "ts-poet";
7
+ //#region src/generateEnumFile.ts
11
8
  function generateEnumFile(config, enumData, enumName) {
12
- const { rows, extraPrimitives } = enumData;
13
- const detailsName = `${enumName}Details`;
14
- const idType = enumData.idType === "uuid" ? "string" : "number";
15
- // Create the `const fooDetails = code -> literal` mapping
16
- const detailsDefinition = [
17
- `id: ${idType};`,
18
- `code: ${enumName};`,
19
- "name: string;",
20
- ...extraPrimitives.map((primitive) => {
21
- // If the extra primitive values are all unique, then allow the type be only that set of values. Otherwise, use `fieldType`
22
- const allValues = rows.map((r) => r[primitive.columnName]);
23
- const uniqueValues = new Set(allValues);
24
- if (uniqueValues.size === allValues.length) {
25
- return `${primitive.fieldName}: ${primitive.fieldType === "string" ? `"${allValues.join('" | "')}"` : allValues.join(" | ")};`;
26
- }
27
- return `${primitive.fieldName}: ${primitive.fieldType};`;
28
- }),
29
- ].join(" ");
30
- return (0, ts_poet_1.code) `
9
+ const { rows, extraPrimitives } = enumData;
10
+ const detailsName = `${enumName}Details`;
11
+ const idType = enumData.idType === "uuid" ? "string" : "number";
12
+ const detailsDefinition = [
13
+ `id: ${idType};`,
14
+ `code: ${enumName};`,
15
+ "name: string;",
16
+ ...extraPrimitives.map((primitive) => {
17
+ const allValues = rows.map((r) => r[primitive.columnName]);
18
+ if (new Set(allValues).size === allValues.length) return `${primitive.fieldName}: ${primitive.fieldType === "string" ? `"${allValues.join("\" | \"")}"` : allValues.join(" | ")};`;
19
+ return `${primitive.fieldName}: ${primitive.fieldType};`;
20
+ })
21
+ ].join(" ");
22
+ return code`
31
23
  export enum ${enumName} {
32
- ${rows.map((row) => `${(0, change_case_1.pascalCase)(row.code)} = '${row.code}'`).join(",\n")}
24
+ ${rows.map((row) => `${pascalCase(row.code)} = '${row.code}'`).join(",\n")}
33
25
  }
34
26
 
35
27
  export type ${detailsName} = {${detailsDefinition}};
36
28
 
37
29
  const details: Record<${enumName}, ${detailsName}> = {
38
- ${rows
39
- .map((row) => {
40
- const code = (0, change_case_1.pascalCase)(row.code);
41
- const safeName = row.name.replace(/(["'])/g, "\\$1");
42
- const extras = extraPrimitives
43
- .map((p) => `${p.fieldName}: ${JSON.stringify(row[p.columnName])}`)
44
- .join(", ");
45
- const id = enumData.idType === "uuid" ? `"${row.id}"` : row.id;
46
- return `[${enumName}.${code}]: { id: ${id}, code: ${enumName}.${code}, name: '${safeName}', ${extras} }`;
47
- })
48
- .join(",")}
30
+ ${rows.map((row) => {
31
+ const code = pascalCase(row.code);
32
+ const safeName = row.name.replace(/(["'])/g, "\\$1");
33
+ const extras = extraPrimitives.map((p) => `${p.fieldName}: ${JSON.stringify(row[p.columnName])}`).join(", ");
34
+ return `[${enumName}.${code}]: { id: ${enumData.idType === "uuid" ? `"${row.id}"` : row.id}, code: ${enumName}.${code}, name: '${safeName}', ${extras} }`;
35
+ }).join(",")}
49
36
  };
50
37
 
51
38
  export const ${detailsName} = {
52
- ${rows.map((row) => `${(0, change_case_1.pascalCase)(row.code)}: details[${enumName}.${(0, change_case_1.pascalCase)(row.code)}]`).join(",")}
39
+ ${rows.map((row) => `${pascalCase(row.code)}: details[${enumName}.${pascalCase(row.code)}]`).join(",")}
53
40
  };
54
41
 
55
- export const ${(0, pluralize_1.default)(enumName)}: ${symbols_1.EnumMetadata}<${enumName}, ${detailsName}, ${idType}> = {
42
+ export const ${pluralize(enumName)}: ${EnumMetadata}<${enumName}, ${detailsName}, ${idType}> = {
56
43
  name: "${enumName}",
57
44
 
58
45
  getByCode(code: ${enumName}): ${detailsName} {
@@ -77,4 +64,7 @@ function generateEnumFile(config, enumData, enumName) {
77
64
  };
78
65
  `;
79
66
  }
67
+ //#endregion
68
+ export { generateEnumFile };
69
+
80
70
  //# sourceMappingURL=generateEnumFile.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generateEnumFile.js","sourceRoot":"","sources":["../src/generateEnumFile.ts"],"names":[],"mappings":";;;;;AAOA,4CAwEC;AA/ED,6CAAyC;AACzC,0DAAkC;AAClC,qCAAqC;AAGrC,uCAAyC;AAEzC,SAAgB,gBAAgB,CAAC,MAAc,EAAE,QAAuB,EAAE,QAAgB;IACxF,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,QAAQ,CAAC;IAC3C,MAAM,WAAW,GAAG,GAAG,QAAQ,SAAS,CAAC;IACzC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IAEhE,0DAA0D;IAC1D,MAAM,iBAAiB,GAAG;QACxB,OAAO,MAAM,GAAG;QAChB,SAAS,QAAQ,GAAG;QACpB,eAAe;QACf,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;YACnC,2HAA2H;YAC3H,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;YAC3D,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;YACxC,IAAI,YAAY,CAAC,IAAI,KAAK,SAAS,CAAC,MAAM,EAAE,CAAC;gBAC3C,OAAO,GAAG,SAAS,CAAC,SAAS,KAC3B,SAAS,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAC1F,GAAG,CAAC;YACN,CAAC;YACD,OAAO,GAAG,SAAS,CAAC,SAAS,KAAK,SAAS,CAAC,SAAS,GAAG,CAAC;QAC3D,CAAC,CAAC;KACH,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEZ,OAAO,IAAA,cAAI,EAAA;kBACK,QAAQ;QAClB,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAA,wBAAU,EAAC,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;;;kBAG9D,WAAW,OAAO,iBAAiB;;4BAEzB,QAAQ,KAAK,WAAW;QAC5C,IAAI;SACH,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACX,MAAM,IAAI,GAAG,IAAA,wBAAU,EAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,eAAe;aAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS,CAAE,GAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;aAC3E,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/D,OAAO,IAAI,QAAQ,IAAI,IAAI,YAAY,EAAE,WAAW,QAAQ,IAAI,IAAI,YAAY,QAAQ,MAAM,MAAM,IAAI,CAAC;IAC3G,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC;;;mBAGC,WAAW;QACtB,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAA,wBAAU,EAAC,GAAG,CAAC,IAAI,CAAC,aAAa,QAAQ,IAAI,IAAA,wBAAU,EAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;;;mBAGzF,IAAA,mBAAS,EAAC,QAAQ,CAAC,KAAK,sBAAY,IAAI,QAAQ,KAAK,WAAW,KAAK,MAAM;eAC/E,QAAQ;;wBAEC,QAAQ,MAAM,WAAW;;;;kCAIf,WAAW;iCACZ,QAAQ;;;qBAGpB,MAAM,MAAM,WAAW;;;;mCAIT,QAAQ;+BACZ,QAAQ;;;oCAGH,WAAW;;;;GAI5C,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"generateEnumFile.js","names":[],"sources":["../src/generateEnumFile.ts"],"sourcesContent":["import { pascalCase } from \"change-case\";\nimport pluralize from \"pluralize\";\nimport { type Code, code } from \"ts-poet\";\n\nimport { type Config } from \"./config.ts\";\nimport { type EnumTableData } from \"./index.ts\";\nimport { EnumMetadata } from \"./symbols.ts\";\n\nexport function generateEnumFile(config: Config, enumData: EnumTableData, enumName: string): Code {\n const { rows, extraPrimitives } = enumData;\n const detailsName = `${enumName}Details`;\n const idType = enumData.idType === \"uuid\" ? \"string\" : \"number\";\n\n // Create the `const fooDetails = code -> literal` mapping\n const detailsDefinition = [\n `id: ${idType};`,\n `code: ${enumName};`,\n \"name: string;\",\n ...extraPrimitives.map((primitive) => {\n // If the extra primitive values are all unique, then allow the type be only that set of values. Otherwise, use `fieldType`\n const allValues = rows.map((r) => r[primitive.columnName]);\n const uniqueValues = new Set(allValues);\n if (uniqueValues.size === allValues.length) {\n return `${primitive.fieldName}: ${\n primitive.fieldType === \"string\" ? `\"${allValues.join('\" | \"')}\"` : allValues.join(\" | \")\n };`;\n }\n return `${primitive.fieldName}: ${primitive.fieldType};`;\n }),\n ].join(\" \");\n\n return code`\n export enum ${enumName} {\n ${rows.map((row) => `${pascalCase(row.code)} = '${row.code}'`).join(\",\\n\")}\n }\n\n export type ${detailsName} = {${detailsDefinition}};\n\n const details: Record<${enumName}, ${detailsName}> = {\n ${rows\n .map((row) => {\n const code = pascalCase(row.code);\n const safeName = row.name.replace(/([\"'])/g, \"\\\\$1\");\n const extras = extraPrimitives\n .map((p) => `${p.fieldName}: ${JSON.stringify((row as any)[p.columnName])}`)\n .join(\", \");\n const id = enumData.idType === \"uuid\" ? `\"${row.id}\"` : row.id;\n return `[${enumName}.${code}]: { id: ${id}, code: ${enumName}.${code}, name: '${safeName}', ${extras} }`;\n })\n .join(\",\")}\n };\n \n export const ${detailsName} = {\n ${rows.map((row) => `${pascalCase(row.code)}: details[${enumName}.${pascalCase(row.code)}]`).join(\",\")}\n };\n\n export const ${pluralize(enumName)}: ${EnumMetadata}<${enumName}, ${detailsName}, ${idType}> = {\n name: \"${enumName}\",\n\n getByCode(code: ${enumName}): ${detailsName} {\n return details[code];\n },\n\n findByCode(code: string): ${detailsName} | undefined {\n return details[code as ${enumName}];\n },\n\n findById(id: ${idType}): ${detailsName} | undefined {\n return Object.values(details).find(d => d.id === id);\n },\n\n getValues(): ReadonlyArray<${enumName}> {\n return Object.values(${enumName});\n },\n\n getDetails(): ReadonlyArray<${detailsName}> {\n return Object.values(details);\n },\n };\n `;\n}\n"],"mappings":";;;;;;;AAQA,SAAgB,iBAAiB,QAAgB,UAAyB,UAAwB;CAChG,MAAM,EAAE,MAAM,oBAAoB;CAClC,MAAM,cAAc,GAAG,SAAS;CAChC,MAAM,SAAS,SAAS,WAAW,SAAS,WAAW;CAGvD,MAAM,oBAAoB;EACxB,OAAO,OAAO;EACd,SAAS,SAAS;EAClB;EACA,GAAG,gBAAgB,KAAK,cAAc;GAEpC,MAAM,YAAY,KAAK,KAAK,MAAM,EAAE,UAAU,WAAW;GAEzD,IAAI,IADqB,IAAI,SACd,CAAC,CAAC,SAAS,UAAU,QAClC,OAAO,GAAG,UAAU,UAAU,IAC5B,UAAU,cAAc,WAAW,IAAI,UAAU,KAAK,SAAO,EAAE,KAAK,UAAU,KAAK,KAAK,EACzF;GAEH,OAAO,GAAG,UAAU,UAAU,IAAI,UAAU,UAAU;EACxD,CAAC;CACH,CAAC,CAAC,KAAK,GAAG;CAEV,OAAO,IAAI;kBACK,SAAS;QACnB,KAAK,KAAK,QAAQ,GAAG,WAAW,IAAI,IAAI,EAAE,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC,KAAK,KAAK,EAAE;;;kBAG/D,YAAY,MAAM,kBAAkB;;4BAE1B,SAAS,IAAI,YAAY;QAC7C,KACC,KAAK,QAAQ;EACZ,MAAM,OAAO,WAAW,IAAI,IAAI;EAChC,MAAM,WAAW,IAAI,KAAK,QAAQ,WAAW,MAAM;EACnD,MAAM,SAAS,gBACZ,KAAK,MAAM,GAAG,EAAE,UAAU,IAAI,KAAK,UAAW,IAAY,EAAE,WAAW,GAAG,CAAC,CAC3E,KAAK,IAAI;EAEZ,OAAO,IAAI,SAAS,GAAG,KAAK,WADjB,SAAS,WAAW,SAAS,IAAI,IAAI,GAAG,KAAK,IAAI,GAClB,UAAU,SAAS,GAAG,KAAK,WAAW,SAAS,KAAK,OAAO;CACvG,CAAC,CAAC,CACD,KAAK,GAAG,EAAE;;;mBAGA,YAAY;QACvB,KAAK,KAAK,QAAQ,GAAG,WAAW,IAAI,IAAI,EAAE,YAAY,SAAS,GAAG,WAAW,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,EAAE;;;mBAG1F,UAAU,QAAQ,EAAE,IAAI,aAAa,GAAG,SAAS,IAAI,YAAY,IAAI,OAAO;eAChF,SAAS;;wBAEA,SAAS,KAAK,YAAY;;;;kCAIhB,YAAY;iCACb,SAAS;;;qBAGrB,OAAO,KAAK,YAAY;;;;mCAIV,SAAS;+BACb,SAAS;;;oCAGJ,YAAY;;;;;AAKhD"}
@@ -0,0 +1,28 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_symbols = require("./symbols.cjs");
3
+ require("./EntityDbMetadata.cjs");
4
+ let change_case = require("change-case");
5
+ let ts_poet = require("ts-poet");
6
+ //#region src/generateFactoriesFiles.ts
7
+ const EntityManager = (0, ts_poet.imp)("t:EntityManager@./entities.ts");
8
+ function generateFactoriesFiles(entities) {
9
+ return entities.map(({ entity }) => {
10
+ const name = (0, change_case.pascalCase)(entity.name);
11
+ const contents = ts_poet.code`
12
+ export function new${name}(
13
+ em: ${EntityManager},
14
+ opts: ${require_symbols.FactoryOpts}<${entity.type}> = {},
15
+ ): ${require_symbols.DeepNew}<${entity.type}> {
16
+ return ${require_symbols.newTestInstance}(em, ${entity.typeSymbol}, opts, {});
17
+ }`;
18
+ return {
19
+ name: `./factories/new${entity.name}.ts`,
20
+ contents,
21
+ overwrite: false
22
+ };
23
+ });
24
+ }
25
+ //#endregion
26
+ exports.generateFactoriesFiles = generateFactoriesFiles;
27
+
28
+ //# sourceMappingURL=generateFactoriesFiles.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateFactoriesFiles.cjs","names":["imp","pascalCase","FactoryOpts","DeepNew","newTestInstance"],"sources":["../src/generateFactoriesFiles.ts"],"sourcesContent":["import { pascalCase } from \"change-case\";\nimport { type CodegenFile, code, imp } from \"ts-poet\";\n\nimport { type EntityDbMetadata } from \"./EntityDbMetadata.ts\";\nimport { DeepNew, FactoryOpts, newTestInstance } from \"./symbols.ts\";\n\nconst EntityManager = imp(\"t:EntityManager@./entities.ts\");\n\nexport function generateFactoriesFiles(entities: EntityDbMetadata[]): CodegenFile[] {\n // One-time create an ./factories/newAuthor.ts for each entity\n return entities.map(({ entity }) => {\n const name = pascalCase(entity.name);\n const contents = code`\n export function new${name}(\n em: ${EntityManager},\n opts: ${FactoryOpts}<${entity.type}> = {},\n ): ${DeepNew}<${entity.type}> {\n return ${newTestInstance}(em, ${entity.typeSymbol}, opts, {});\n }`;\n return { name: `./factories/new${entity.name}.ts`, contents, overwrite: false };\n });\n}\n"],"mappings":";;;;;;AAMA,MAAM,iBAAA,GAAgBA,QAAAA,IAAAA,CAAI,+BAA+B;AAEzD,SAAgB,uBAAuB,UAA6C;CAElF,OAAO,SAAS,KAAK,EAAE,aAAa;EAClC,MAAM,QAAA,GAAOC,YAAAA,WAAAA,CAAW,OAAO,IAAI;EACnC,MAAM,WAAW,QAAA,IAAI;2BACE,KAAK;cAClB,cAAc;gBACZC,gBAAAA,YAAY,GAAG,OAAO,KAAK;WAChCC,gBAAAA,QAAQ,GAAG,OAAO,KAAK;iBACjBC,gBAAAA,gBAAgB,OAAO,OAAO,WAAW;;EAEtD,OAAO;GAAE,MAAM,kBAAkB,OAAO,KAAK;GAAM;GAAU,WAAW;EAAM;CAChF,CAAC;AACH"}
@@ -0,0 +1,7 @@
1
+ import { EntityDbMetadata } from "./EntityDbMetadata.cjs";
2
+ import { CodegenFile } from "ts-poet";
3
+ //#region src/generateFactoriesFiles.d.ts
4
+ declare function generateFactoriesFiles(entities: EntityDbMetadata[]): CodegenFile[];
5
+ //#endregion
6
+ export { generateFactoriesFiles };
7
+ //# sourceMappingURL=generateFactoriesFiles.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateFactoriesFiles.d.cts","names":[],"sources":["../src/generateFactoriesFiles.ts"],"mappings":";;;iBAQgB,uBAAuB,UAAU,qBAAqB"}
@@ -0,0 +1,7 @@
1
+ import { EntityDbMetadata } from "./EntityDbMetadata.mjs";
2
+ import { CodegenFile } from "ts-poet";
3
+ //#region src/generateFactoriesFiles.d.ts
4
+ declare function generateFactoriesFiles(entities: EntityDbMetadata[]): CodegenFile[];
5
+ //#endregion
6
+ export { generateFactoriesFiles };
7
+ //# sourceMappingURL=generateFactoriesFiles.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateFactoriesFiles.d.mts","names":[],"sources":["../src/generateFactoriesFiles.ts"],"mappings":";;;iBAQgB,uBAAuB,UAAU,qBAAqB"}
@@ -1,22 +1,27 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateFactoriesFiles = generateFactoriesFiles;
4
- const change_case_1 = require("change-case");
5
- const ts_poet_1 = require("ts-poet");
6
- const symbols_1 = require("./symbols");
7
- const EntityManager = (0, ts_poet_1.imp)("t:EntityManager@./entities.ts");
1
+ import { DeepNew, FactoryOpts, newTestInstance } from "./symbols.js";
2
+ import "./EntityDbMetadata.js";
3
+ import { pascalCase } from "change-case";
4
+ import { code, imp } from "ts-poet";
5
+ //#region src/generateFactoriesFiles.ts
6
+ const EntityManager = imp("t:EntityManager@./entities.ts");
8
7
  function generateFactoriesFiles(entities) {
9
- // One-time create an ./factories/newAuthor.ts for each entity
10
- return entities.map(({ entity }) => {
11
- const name = (0, change_case_1.pascalCase)(entity.name);
12
- const contents = (0, ts_poet_1.code) `
8
+ return entities.map(({ entity }) => {
9
+ const name = pascalCase(entity.name);
10
+ const contents = code`
13
11
  export function new${name}(
14
12
  em: ${EntityManager},
15
- opts: ${symbols_1.FactoryOpts}<${entity.type}> = {},
16
- ): ${symbols_1.DeepNew}<${entity.type}> {
17
- return ${symbols_1.newTestInstance}(em, ${entity.typeSymbol}, opts, {});
13
+ opts: ${FactoryOpts}<${entity.type}> = {},
14
+ ): ${DeepNew}<${entity.type}> {
15
+ return ${newTestInstance}(em, ${entity.typeSymbol}, opts, {});
18
16
  }`;
19
- return { name: `./factories/new${entity.name}.ts`, contents, overwrite: false };
20
- });
17
+ return {
18
+ name: `./factories/new${entity.name}.ts`,
19
+ contents,
20
+ overwrite: false
21
+ };
22
+ });
21
23
  }
24
+ //#endregion
25
+ export { generateFactoriesFiles };
26
+
22
27
  //# sourceMappingURL=generateFactoriesFiles.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generateFactoriesFiles.js","sourceRoot":"","sources":["../src/generateFactoriesFiles.ts"],"names":[],"mappings":";;AAOA,wDAaC;AApBD,6CAAyC;AACzC,qCAAiD;AAEjD,uCAAkE;AAElE,MAAM,aAAa,GAAG,IAAA,aAAG,EAAC,+BAA+B,CAAC,CAAC;AAE3D,SAAgB,sBAAsB,CAAC,QAA4B;IACjE,8DAA8D;IAC9D,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QACjC,MAAM,IAAI,GAAG,IAAA,wBAAU,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAA,cAAI,EAAA;2BACE,IAAI;cACjB,aAAa;gBACX,qBAAW,IAAI,MAAM,CAAC,IAAI;WAC/B,iBAAO,IAAI,MAAM,CAAC,IAAI;iBAChB,yBAAe,QAAQ,MAAM,CAAC,UAAU;QACjD,CAAC;QACL,OAAO,EAAE,IAAI,EAAE,kBAAkB,MAAM,CAAC,IAAI,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAClF,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"generateFactoriesFiles.js","names":[],"sources":["../src/generateFactoriesFiles.ts"],"sourcesContent":["import { pascalCase } from \"change-case\";\nimport { type CodegenFile, code, imp } from \"ts-poet\";\n\nimport { type EntityDbMetadata } from \"./EntityDbMetadata.ts\";\nimport { DeepNew, FactoryOpts, newTestInstance } from \"./symbols.ts\";\n\nconst EntityManager = imp(\"t:EntityManager@./entities.ts\");\n\nexport function generateFactoriesFiles(entities: EntityDbMetadata[]): CodegenFile[] {\n // One-time create an ./factories/newAuthor.ts for each entity\n return entities.map(({ entity }) => {\n const name = pascalCase(entity.name);\n const contents = code`\n export function new${name}(\n em: ${EntityManager},\n opts: ${FactoryOpts}<${entity.type}> = {},\n ): ${DeepNew}<${entity.type}> {\n return ${newTestInstance}(em, ${entity.typeSymbol}, opts, {});\n }`;\n return { name: `./factories/new${entity.name}.ts`, contents, overwrite: false };\n });\n}\n"],"mappings":";;;;;AAMA,MAAM,gBAAgB,IAAI,+BAA+B;AAEzD,SAAgB,uBAAuB,UAA6C;CAElF,OAAO,SAAS,KAAK,EAAE,aAAa;EAClC,MAAM,OAAO,WAAW,OAAO,IAAI;EACnC,MAAM,WAAW,IAAI;2BACE,KAAK;cAClB,cAAc;gBACZ,YAAY,GAAG,OAAO,KAAK;WAChC,QAAQ,GAAG,OAAO,KAAK;iBACjB,gBAAgB,OAAO,OAAO,WAAW;;EAEtD,OAAO;GAAE,MAAM,kBAAkB,OAAO,KAAK;GAAM;GAAU,WAAW;EAAM;CAChF,CAAC;AACH"}
@@ -0,0 +1,61 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("./EntityDbMetadata.cjs");
3
+ require("pg");
4
+ //#region src/generateFlushFunction.ts
5
+ /** Creates a `flush_database` stored procedure to truncate all the tables between tests. */
6
+ async function createFlushFunction(client, db) {
7
+ const hasAnyNonDeferredFks = db.entities.some((e) => e.nonDeferredFks.length > 0 || e.nonDeferredManyToManyFks.length > 0);
8
+ if (db.entities.some((e) => e.primaryKey.columnType === "uuid") || hasAnyNonDeferredFks) await client.query(generateExplicitFlushFunction(db));
9
+ else await client.query(generateSequenceFlushFunction(db));
10
+ }
11
+ /**
12
+ * Explicitly deletes every entity/m2m table in a deterministic order.
13
+ *
14
+ * We do this for schemas with non-deferred foreign keys (order matters)
15
+ * or schemas with UUID id columns.
16
+ */
17
+ function generateExplicitFlushFunction(db) {
18
+ const deletes = [...db.joinTables, ...[...db.entities].sort((a, b) => {
19
+ const x = a.nonDeferredFkOrder;
20
+ const y = b.nonDeferredFkOrder;
21
+ if (x !== y) return y - x;
22
+ const i = a.baseClassName ? 1 : -1;
23
+ return (b.baseClassName ? 1 : -1) - i;
24
+ }).map((e) => e.tableName)].flatMap((t) => [`DELETE FROM "${t}";`, `ALTER SEQUENCE IF EXISTS "${t}_id_seq" RESTART WITH 1 INCREMENT BY 1;`]);
25
+ return `CREATE OR REPLACE FUNCTION flush_database() RETURNS void AS $$
26
+ BEGIN
27
+ ${[...db.entities.filter((t) => t.nonDeferredFkOrder).flatMap((t) => t.manyToOnes.filter((m2o) => m2o.onDelete !== "SET NULL" && m2o.onDelete !== "CASCADE").filter((m2o) => db.entitiesByName[m2o.otherEntity.name].nonDeferredFkOrder > t.nonDeferredFkOrder).map((m2o) => `UPDATE ${t.tableName} SET "${m2o.columnName}" = NULL;`)), ...deletes].join("\n")}
28
+ END;
29
+ $$ LANGUAGE
30
+ 'plpgsql'`;
31
+ }
32
+ /**
33
+ * A cuter/shorter flush that only DELETEs from tables that were inserted into.
34
+ *
35
+ * The difference between this and the explicit-order function should only be
36
+ * noticeable on 100+ table schemas (specifically, on our production app with ~200 tables
37
+ * and ~5,000 tests, it gave an 8% speed-up vs. the "DELETE every table" approach).
38
+ */
39
+ function generateSequenceFlushFunction(db) {
40
+ const stableTables = [...Object.values(db.enums).map((e) => e.table.name), ...db.otherTables];
41
+ return `CREATE OR REPLACE FUNCTION flush_database() RETURNS void AS $$
42
+ DECLARE seq RECORD;
43
+ BEGIN
44
+ FOR seq IN
45
+ SELECT sequencename AS name
46
+ FROM pg_sequences
47
+ WHERE schemaname = 'public' AND last_value IS NOT NULL AND sequencename LIKE '%_id_seq' ${stableTables.length === 0 ? "" : `AND sequencename NOT IN (${stableTables.map((t) => `'${t}_id_seq'`).join(", ")})`}
48
+ LOOP
49
+ EXECUTE format('DELETE FROM %I', regexp_replace(seq.name, '_id_seq$', ''));
50
+ EXECUTE format('ALTER SEQUENCE %I RESTART WITH 1', seq.name);
51
+ END LOOP;
52
+ END;
53
+ $$ LANGUAGE
54
+ 'plpgsql'`;
55
+ }
56
+ //#endregion
57
+ exports.createFlushFunction = createFlushFunction;
58
+ exports.generateExplicitFlushFunction = generateExplicitFlushFunction;
59
+ exports.generateSequenceFlushFunction = generateSequenceFlushFunction;
60
+
61
+ //# sourceMappingURL=generateFlushFunction.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateFlushFunction.cjs","names":[],"sources":["../src/generateFlushFunction.ts"],"sourcesContent":["import { type Client } from \"pg\";\n\nimport { type DbMetadata } from \"./EntityDbMetadata.ts\";\n\n/** Creates a `flush_database` stored procedure to truncate all the tables between tests. */\nexport async function createFlushFunction(client: Client, db: DbMetadata): Promise<void> {\n // We only check nonDeferredManyToManyFks here (and not other places) b/c we don't really count/track m2ms\n // as true FK dependencies -- they would a) always create cycles, and b) it's easiest enough for us to just\n // always have `flush_database` / `em.flush` delete from m2m tables first, to avoid FK delete constraints\n // errors when we delete from the main entity tables.\n //\n // ...but, because order matters for the m2m tables, then we have to use the `generateExplicitFlushFunction`\n // instead of the cuter `generateSequenceFlushFunction`.\n const hasAnyNonDeferredFks = db.entities.some(\n (e) => e.nonDeferredFks.length > 0 || e.nonDeferredManyToManyFks.length > 0,\n );\n const hasAnyNonSequenceIds = db.entities.some((e) => e.primaryKey.columnType === \"uuid\");\n if (hasAnyNonSequenceIds || hasAnyNonDeferredFks) {\n await client.query(generateExplicitFlushFunction(db));\n } else {\n await client.query(generateSequenceFlushFunction(db));\n }\n}\n\n/**\n * Explicitly deletes every entity/m2m table in a deterministic order.\n *\n * We do this for schemas with non-deferred foreign keys (order matters)\n * or schemas with UUID id columns.\n */\nexport function generateExplicitFlushFunction(db: DbMetadata): string {\n // Leave code/enum tables alone\n const tables = [\n ...db.joinTables,\n ...[...db.entities]\n .sort((a, b) => {\n // Flush books before authors if it has non-deferred FKs\n const x = a.nonDeferredFkOrder;\n const y = b.nonDeferredFkOrder;\n if (x !== y) {\n return y - x;\n }\n // Flush base tables before sub-tables.\n const i = a.baseClassName ? 1 : -1;\n const j = b.baseClassName ? 1 : -1;\n return j - i;\n })\n .map((e) => e.tableName),\n ];\n\n // Note that, for whatever reason, doing DELETEs + ALTER SEQUENCEs is dramatically faster than TRUNCATEs.\n // On even a 40-table schema, TRUNCATEs (either 1 per table or even a single TRUNCATE with all tables) takes\n // 100s of milliseconds, whereas DELETEs takes single-digit milliseconds and DELETEs + ALTER SEQUENCEs is\n // 10s of milliseconds.\n const deletes = tables.flatMap((t) => [\n `DELETE FROM \"${t}\";`,\n `ALTER SEQUENCE IF EXISTS \"${t}_id_seq\" RESTART WITH 1 INCREMENT BY 1;`,\n ]);\n\n // Create `SET NULLs` in schemas that don't have deferred FKs\n const setFksNulls = db.entities\n .filter((t) => t.nonDeferredFkOrder)\n .flatMap((t) =>\n t.manyToOnes\n // These FKs will auto-unset/delete the later row, so don't need explicit unsetting\n .filter((m2o) => m2o.onDelete !== \"SET NULL\" && m2o.onDelete !== \"CASCADE\")\n // Look for FKs to tables whose DELETEs come after us\n .filter((m2o) => db.entitiesByName[m2o.otherEntity.name].nonDeferredFkOrder > t.nonDeferredFkOrder)\n .map((m2o) => `UPDATE ${t.tableName} SET \"${m2o.columnName}\" = NULL;`),\n );\n\n const statements = [...setFksNulls, ...deletes].join(\"\\n\");\n\n return `CREATE OR REPLACE FUNCTION flush_database() RETURNS void AS $$\n BEGIN\n ${statements}\n END;\n $$ LANGUAGE\n 'plpgsql'`;\n}\n\n/**\n * A cuter/shorter flush that only DELETEs from tables that were inserted into.\n *\n * The difference between this and the explicit-order function should only be\n * noticeable on 100+ table schemas (specifically, on our production app with ~200 tables\n * and ~5,000 tests, it gave an 8% speed-up vs. the \"DELETE every table\" approach).\n */\nexport function generateSequenceFlushFunction(db: DbMetadata): string {\n const stableTables = [...Object.values(db.enums).map((e) => e.table.name), ...db.otherTables];\n const maybeSkipStable =\n stableTables.length === 0 ? \"\" : `AND sequencename NOT IN (${stableTables.map((t) => `'${t}_id_seq'`).join(\", \")})`;\n return `CREATE OR REPLACE FUNCTION flush_database() RETURNS void AS $$\n DECLARE seq RECORD;\n BEGIN\n FOR seq IN\n SELECT sequencename AS name\n FROM pg_sequences\n WHERE schemaname = 'public' AND last_value IS NOT NULL AND sequencename LIKE '%_id_seq' ${maybeSkipStable}\n LOOP\n EXECUTE format('DELETE FROM %I', regexp_replace(seq.name, '_id_seq$', ''));\n EXECUTE format('ALTER SEQUENCE %I RESTART WITH 1', seq.name);\n END LOOP;\n END;\n $$ LANGUAGE\n 'plpgsql'`;\n}\n"],"mappings":";;;;;AAKA,eAAsB,oBAAoB,QAAgB,IAA+B;CAQvF,MAAM,uBAAuB,GAAG,SAAS,MACtC,MAAM,EAAE,eAAe,SAAS,KAAK,EAAE,yBAAyB,SAAS,CAC5E;CAEA,IAD6B,GAAG,SAAS,MAAM,MAAM,EAAE,WAAW,eAAe,MAC1D,KAAK,sBAC1B,MAAM,OAAO,MAAM,8BAA8B,EAAE,CAAC;MAEpD,MAAM,OAAO,MAAM,8BAA8B,EAAE,CAAC;AAExD;;;;;;;AAQA,SAAgB,8BAA8B,IAAwB;CAwBpE,MAAM,UAAU,CArBd,GAAG,GAAG,YACN,GAAG,CAAC,GAAG,GAAG,QAAQ,CAAC,CAChB,MAAM,GAAG,MAAM;EAEd,MAAM,IAAI,EAAE;EACZ,MAAM,IAAI,EAAE;EACZ,IAAI,MAAM,GACR,OAAO,IAAI;EAGb,MAAM,IAAI,EAAE,gBAAgB,IAAI;EAEhC,QADU,EAAE,gBAAgB,IAAI,MACrB;CACb,CAAC,CAAC,CACD,KAAK,MAAM,EAAE,SAAS,CAON,CAAC,CAAC,SAAS,MAAM,CACpC,gBAAgB,EAAE,KAClB,6BAA6B,EAAE,wCACjC,CAAC;CAgBD,OAAO;;QAFY,CAAC,GAXA,GAAG,SACpB,QAAQ,MAAM,EAAE,kBAAkB,CAAC,CACnC,SAAS,MACR,EAAE,WAEC,QAAQ,QAAQ,IAAI,aAAa,cAAc,IAAI,aAAa,SAAS,CAAC,CAE1E,QAAQ,QAAQ,GAAG,eAAe,IAAI,YAAY,KAAK,CAAC,qBAAqB,EAAE,kBAAkB,CAAC,CAClG,KAAK,QAAQ,UAAU,EAAE,UAAU,QAAQ,IAAI,WAAW,UAAU,CAG1C,GAAG,GAAG,OAAO,CAAC,CAAC,KAAK,IAItC,EAAE;;;;AAInB;;;;;;;;AASA,SAAgB,8BAA8B,IAAwB;CACpE,MAAM,eAAe,CAAC,GAAG,OAAO,OAAO,GAAG,KAAK,CAAC,CAAC,KAAK,MAAM,EAAE,MAAM,IAAI,GAAG,GAAG,GAAG,WAAW;CAG5F,OAAO;;;;;;kGADL,aAAa,WAAW,IAAI,KAAK,4BAA4B,aAAa,KAAK,MAAM,IAAI,EAAE,SAAS,CAAC,CAAC,KAAK,IAAI,EAAE,GAOH;;;;;;;;AAQlH"}
@@ -1,14 +1,15 @@
1
+ import { DbMetadata } from "./EntityDbMetadata.cjs";
1
2
  import { Client } from "pg";
2
- import { DbMetadata } from "./EntityDbMetadata";
3
+ //#region src/generateFlushFunction.d.ts
3
4
  /** Creates a `flush_database` stored procedure to truncate all the tables between tests. */
4
- export declare function createFlushFunction(client: Client, db: DbMetadata): Promise<void>;
5
+ declare function createFlushFunction(client: Client, db: DbMetadata): Promise<void>;
5
6
  /**
6
7
  * Explicitly deletes every entity/m2m table in a deterministic order.
7
8
  *
8
9
  * We do this for schemas with non-deferred foreign keys (order matters)
9
10
  * or schemas with UUID id columns.
10
11
  */
11
- export declare function generateExplicitFlushFunction(db: DbMetadata): string;
12
+ declare function generateExplicitFlushFunction(db: DbMetadata): string;
12
13
  /**
13
14
  * A cuter/shorter flush that only DELETEs from tables that were inserted into.
14
15
  *
@@ -16,5 +17,7 @@ export declare function generateExplicitFlushFunction(db: DbMetadata): string;
16
17
  * noticeable on 100+ table schemas (specifically, on our production app with ~200 tables
17
18
  * and ~5,000 tests, it gave an 8% speed-up vs. the "DELETE every table" approach).
18
19
  */
19
- export declare function generateSequenceFlushFunction(db: DbMetadata): string;
20
- //# sourceMappingURL=generateFlushFunction.d.ts.map
20
+ declare function generateSequenceFlushFunction(db: DbMetadata): string;
21
+ //#endregion
22
+ export { createFlushFunction, generateExplicitFlushFunction, generateSequenceFlushFunction };
23
+ //# sourceMappingURL=generateFlushFunction.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateFlushFunction.d.cts","names":[],"sources":["../src/generateFlushFunction.ts"],"mappings":";;;;iBAKsB,oBAAoB,QAAQ,QAAQ,IAAI,aAAa;;;;;;;iBAyB3D,8BAA8B,IAAI;;;;;;;;iBA0DlC,8BAA8B,IAAI"}
@@ -0,0 +1,23 @@
1
+ import { DbMetadata } from "./EntityDbMetadata.mjs";
2
+ import { Client } from "pg";
3
+ //#region src/generateFlushFunction.d.ts
4
+ /** Creates a `flush_database` stored procedure to truncate all the tables between tests. */
5
+ declare function createFlushFunction(client: Client, db: DbMetadata): Promise<void>;
6
+ /**
7
+ * Explicitly deletes every entity/m2m table in a deterministic order.
8
+ *
9
+ * We do this for schemas with non-deferred foreign keys (order matters)
10
+ * or schemas with UUID id columns.
11
+ */
12
+ declare function generateExplicitFlushFunction(db: DbMetadata): string;
13
+ /**
14
+ * A cuter/shorter flush that only DELETEs from tables that were inserted into.
15
+ *
16
+ * The difference between this and the explicit-order function should only be
17
+ * noticeable on 100+ table schemas (specifically, on our production app with ~200 tables
18
+ * and ~5,000 tests, it gave an 8% speed-up vs. the "DELETE every table" approach).
19
+ */
20
+ declare function generateSequenceFlushFunction(db: DbMetadata): string;
21
+ //#endregion
22
+ export { createFlushFunction, generateExplicitFlushFunction, generateSequenceFlushFunction };
23
+ //# sourceMappingURL=generateFlushFunction.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateFlushFunction.d.mts","names":[],"sources":["../src/generateFlushFunction.ts"],"mappings":";;;;iBAKsB,oBAAoB,QAAQ,QAAQ,IAAI,aAAa;;;;;;;iBAyB3D,8BAA8B,IAAI;;;;;;;;iBA0DlC,8BAA8B,IAAI"}
@@ -1,98 +1,49 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createFlushFunction = createFlushFunction;
4
- exports.generateExplicitFlushFunction = generateExplicitFlushFunction;
5
- exports.generateSequenceFlushFunction = generateSequenceFlushFunction;
1
+ import "./EntityDbMetadata.js";
2
+ import "pg";
3
+ //#region src/generateFlushFunction.ts
6
4
  /** Creates a `flush_database` stored procedure to truncate all the tables between tests. */
7
5
  async function createFlushFunction(client, db) {
8
- // We only check nonDeferredManyToManyFks here (and not other places) b/c we don't really count/track m2ms
9
- // as true FK dependencies -- they would a) always create cycles, and b) it's easiest enough for us to just
10
- // always have `flush_database` / `em.flush` delete from m2m tables first, to avoid FK delete constraints
11
- // errors when we delete from the main entity tables.
12
- //
13
- // ...but, because order matters for the m2m tables, then we have to use the `generateExplicitFlushFunction`
14
- // instead of the cuter `generateSequenceFlushFunction`.
15
- const hasAnyNonDeferredFks = db.entities.some((e) => e.nonDeferredFks.length > 0 || e.nonDeferredManyToManyFks.length > 0);
16
- const hasAnyNonSequenceIds = db.entities.some((e) => e.primaryKey.columnType === "uuid");
17
- if (hasAnyNonSequenceIds || hasAnyNonDeferredFks) {
18
- await client.query(generateExplicitFlushFunction(db));
19
- }
20
- else {
21
- await client.query(generateSequenceFlushFunction(db));
22
- }
6
+ const hasAnyNonDeferredFks = db.entities.some((e) => e.nonDeferredFks.length > 0 || e.nonDeferredManyToManyFks.length > 0);
7
+ if (db.entities.some((e) => e.primaryKey.columnType === "uuid") || hasAnyNonDeferredFks) await client.query(generateExplicitFlushFunction(db));
8
+ else await client.query(generateSequenceFlushFunction(db));
23
9
  }
24
10
  /**
25
- * Explicitly deletes every entity/m2m table in a deterministic order.
26
- *
27
- * We do this for schemas with non-deferred foreign keys (order matters)
28
- * or schemas with UUID id columns.
29
- */
11
+ * Explicitly deletes every entity/m2m table in a deterministic order.
12
+ *
13
+ * We do this for schemas with non-deferred foreign keys (order matters)
14
+ * or schemas with UUID id columns.
15
+ */
30
16
  function generateExplicitFlushFunction(db) {
31
- // Leave code/enum tables alone
32
- const tables = [
33
- ...db.joinTables,
34
- ...[...db.entities]
35
- .sort((a, b) => {
36
- // Flush books before authors if it has non-deferred FKs
37
- const x = a.nonDeferredFkOrder;
38
- const y = b.nonDeferredFkOrder;
39
- if (x !== y) {
40
- return y - x;
41
- }
42
- // Flush base tables before sub-tables.
43
- const i = a.baseClassName ? 1 : -1;
44
- const j = b.baseClassName ? 1 : -1;
45
- return j - i;
46
- })
47
- .map((e) => e.tableName),
48
- ];
49
- // Note that, for whatever reason, doing DELETEs + ALTER SEQUENCEs is dramatically faster than TRUNCATEs.
50
- // On even a 40-table schema, TRUNCATEs (either 1 per table or even a single TRUNCATE with all tables) takes
51
- // 100s of milliseconds, whereas DELETEs takes single-digit milliseconds and DELETEs + ALTER SEQUENCEs is
52
- // 10s of milliseconds.
53
- const deletes = tables.flatMap((t) => [
54
- `DELETE FROM "${t}";`,
55
- `ALTER SEQUENCE IF EXISTS "${t}_id_seq" RESTART WITH 1 INCREMENT BY 1;`,
56
- ]);
57
- // Create `SET NULLs` in schemas that don't have deferred FKs
58
- const setFksNulls = db.entities
59
- .filter((t) => t.nonDeferredFkOrder)
60
- .flatMap((t) => t.manyToOnes
61
- // These FKs will auto-unset/delete the later row, so don't need explicit unsetting
62
- .filter((m2o) => m2o.onDelete !== "SET NULL" && m2o.onDelete !== "CASCADE")
63
- // Look for FKs to tables whose DELETEs come after us
64
- .filter((m2o) => db.entitiesByName[m2o.otherEntity.name].nonDeferredFkOrder > t.nonDeferredFkOrder)
65
- .map((m2o) => `UPDATE ${t.tableName} SET "${m2o.columnName}" = NULL;`));
66
- const statements = [...setFksNulls, ...deletes].join("\n");
67
- return `CREATE OR REPLACE FUNCTION flush_database() RETURNS void AS $$
17
+ const deletes = [...db.joinTables, ...[...db.entities].sort((a, b) => {
18
+ const x = a.nonDeferredFkOrder;
19
+ const y = b.nonDeferredFkOrder;
20
+ if (x !== y) return y - x;
21
+ const i = a.baseClassName ? 1 : -1;
22
+ return (b.baseClassName ? 1 : -1) - i;
23
+ }).map((e) => e.tableName)].flatMap((t) => [`DELETE FROM "${t}";`, `ALTER SEQUENCE IF EXISTS "${t}_id_seq" RESTART WITH 1 INCREMENT BY 1;`]);
24
+ return `CREATE OR REPLACE FUNCTION flush_database() RETURNS void AS $$
68
25
  BEGIN
69
- ${statements}
26
+ ${[...db.entities.filter((t) => t.nonDeferredFkOrder).flatMap((t) => t.manyToOnes.filter((m2o) => m2o.onDelete !== "SET NULL" && m2o.onDelete !== "CASCADE").filter((m2o) => db.entitiesByName[m2o.otherEntity.name].nonDeferredFkOrder > t.nonDeferredFkOrder).map((m2o) => `UPDATE ${t.tableName} SET "${m2o.columnName}" = NULL;`)), ...deletes].join("\n")}
70
27
  END;
71
28
  $$ LANGUAGE
72
29
  'plpgsql'`;
73
30
  }
74
31
  /**
75
- * A cuter/shorter flush that only DELETEs from tables that were inserted into.
76
- *
77
- * The difference between this and the explicit-order function should only be
78
- * noticeable on 100+ table schemas (specifically, on our production app with ~200 tables
79
- * and ~5,000 tests, it gave an 8% speed-up vs. the "DELETE every table" approach).
80
- */
32
+ * A cuter/shorter flush that only DELETEs from tables that were inserted into.
33
+ *
34
+ * The difference between this and the explicit-order function should only be
35
+ * noticeable on 100+ table schemas (specifically, on our production app with ~200 tables
36
+ * and ~5,000 tests, it gave an 8% speed-up vs. the "DELETE every table" approach).
37
+ */
81
38
  function generateSequenceFlushFunction(db) {
82
- const stableTables = [
83
- ...Object.values(db.enums).map((e) => e.table.name),
84
- ...db.otherTables,
85
- ];
86
- const maybeSkipStable = stableTables.length === 0
87
- ? ""
88
- : `AND sequencename NOT IN (${stableTables.map((t) => `'${t}_id_seq'`).join(", ")})`;
89
- return `CREATE OR REPLACE FUNCTION flush_database() RETURNS void AS $$
39
+ const stableTables = [...Object.values(db.enums).map((e) => e.table.name), ...db.otherTables];
40
+ return `CREATE OR REPLACE FUNCTION flush_database() RETURNS void AS $$
90
41
  DECLARE seq RECORD;
91
42
  BEGIN
92
43
  FOR seq IN
93
44
  SELECT sequencename AS name
94
45
  FROM pg_sequences
95
- WHERE schemaname = 'public' AND last_value IS NOT NULL AND sequencename LIKE '%_id_seq' ${maybeSkipStable}
46
+ WHERE schemaname = 'public' AND last_value IS NOT NULL AND sequencename LIKE '%_id_seq' ${stableTables.length === 0 ? "" : `AND sequencename NOT IN (${stableTables.map((t) => `'${t}_id_seq'`).join(", ")})`}
96
47
  LOOP
97
48
  EXECUTE format('DELETE FROM %I', regexp_replace(seq.name, '_id_seq$', ''));
98
49
  EXECUTE format('ALTER SEQUENCE %I RESTART WITH 1', seq.name);
@@ -101,4 +52,7 @@ function generateSequenceFlushFunction(db) {
101
52
  $$ LANGUAGE
102
53
  'plpgsql'`;
103
54
  }
55
+ //#endregion
56
+ export { createFlushFunction, generateExplicitFlushFunction, generateSequenceFlushFunction };
57
+
104
58
  //# sourceMappingURL=generateFlushFunction.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generateFlushFunction.js","sourceRoot":"","sources":["../src/generateFlushFunction.ts"],"names":[],"mappings":";;AAIA,kDAiBC;AAQD,sEAiDC;AASD,sEAuBC;AA3GD,4FAA4F;AACrF,KAAK,UAAU,mBAAmB,CAAC,MAAc,EAAE,EAAc;IACtE,0GAA0G;IAC1G,2GAA2G;IAC3G,yGAAyG;IACzG,qDAAqD;IACrD,EAAE;IACF,4GAA4G;IAC5G,wDAAwD;IACxD,MAAM,oBAAoB,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAC3C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,wBAAwB,CAAC,MAAM,GAAG,CAAC,CAC5E,CAAC;IACF,MAAM,oBAAoB,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,KAAK,MAAM,CAAC,CAAC;IACzF,IAAI,oBAAoB,IAAI,oBAAoB,EAAE,CAAC;QACjD,MAAM,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,6BAA6B,CAAC,EAAc;IAC1D,+BAA+B;IAC/B,MAAM,MAAM,GAAG;QACb,GAAG,EAAE,CAAC,UAAU;QAChB,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC;aAChB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACb,wDAAwD;YACxD,MAAM,CAAC,GAAG,CAAC,CAAC,kBAAkB,CAAC;YAC/B,MAAM,CAAC,GAAG,CAAC,CAAC,kBAAkB,CAAC;YAC/B,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,CAAC;YACf,CAAC;YACD,uCAAuC;YACvC,MAAM,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,CAAC;QACf,CAAC,CAAC;aACD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;KAC3B,CAAC;IAEF,yGAAyG;IACzG,4GAA4G;IAC5G,yGAAyG;IACzG,uBAAuB;IACvB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACpC,gBAAgB,CAAC,IAAI;QACrB,6BAA6B,CAAC,yCAAyC;KACxE,CAAC,CAAC;IAEH,6DAA6D;IAC7D,MAAM,WAAW,GAAG,EAAE,CAAC,QAAQ;SAC5B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC;SACnC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CACb,CAAC,CAAC,UAAU;QACV,mFAAmF;SAClF,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,KAAK,UAAU,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC;QAC3E,qDAAqD;SACpD,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,kBAAkB,GAAG,CAAC,CAAC,kBAAkB,CAAC;SAClG,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,SAAS,SAAS,GAAG,CAAC,UAAU,WAAW,CAAC,CACzE,CAAC;IAEJ,MAAM,UAAU,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE3D,OAAO;;QAED,UAAU;;;cAGJ,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,6BAA6B,CAAC,EAAc;IAC1D,MAAM,YAAY,GAAG;QACnB,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;QACnD,GAAG,EAAE,CAAC,WAAW;KAClB,CAAC;IACF,MAAM,eAAe,GACnB,YAAY,CAAC,MAAM,KAAK,CAAC;QACvB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,4BAA4B,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IACzF,OAAO;;;;;;kGAMyF,eAAe;;;;;;;cAOnG,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"generateFlushFunction.js","names":[],"sources":["../src/generateFlushFunction.ts"],"sourcesContent":["import { type Client } from \"pg\";\n\nimport { type DbMetadata } from \"./EntityDbMetadata.ts\";\n\n/** Creates a `flush_database` stored procedure to truncate all the tables between tests. */\nexport async function createFlushFunction(client: Client, db: DbMetadata): Promise<void> {\n // We only check nonDeferredManyToManyFks here (and not other places) b/c we don't really count/track m2ms\n // as true FK dependencies -- they would a) always create cycles, and b) it's easiest enough for us to just\n // always have `flush_database` / `em.flush` delete from m2m tables first, to avoid FK delete constraints\n // errors when we delete from the main entity tables.\n //\n // ...but, because order matters for the m2m tables, then we have to use the `generateExplicitFlushFunction`\n // instead of the cuter `generateSequenceFlushFunction`.\n const hasAnyNonDeferredFks = db.entities.some(\n (e) => e.nonDeferredFks.length > 0 || e.nonDeferredManyToManyFks.length > 0,\n );\n const hasAnyNonSequenceIds = db.entities.some((e) => e.primaryKey.columnType === \"uuid\");\n if (hasAnyNonSequenceIds || hasAnyNonDeferredFks) {\n await client.query(generateExplicitFlushFunction(db));\n } else {\n await client.query(generateSequenceFlushFunction(db));\n }\n}\n\n/**\n * Explicitly deletes every entity/m2m table in a deterministic order.\n *\n * We do this for schemas with non-deferred foreign keys (order matters)\n * or schemas with UUID id columns.\n */\nexport function generateExplicitFlushFunction(db: DbMetadata): string {\n // Leave code/enum tables alone\n const tables = [\n ...db.joinTables,\n ...[...db.entities]\n .sort((a, b) => {\n // Flush books before authors if it has non-deferred FKs\n const x = a.nonDeferredFkOrder;\n const y = b.nonDeferredFkOrder;\n if (x !== y) {\n return y - x;\n }\n // Flush base tables before sub-tables.\n const i = a.baseClassName ? 1 : -1;\n const j = b.baseClassName ? 1 : -1;\n return j - i;\n })\n .map((e) => e.tableName),\n ];\n\n // Note that, for whatever reason, doing DELETEs + ALTER SEQUENCEs is dramatically faster than TRUNCATEs.\n // On even a 40-table schema, TRUNCATEs (either 1 per table or even a single TRUNCATE with all tables) takes\n // 100s of milliseconds, whereas DELETEs takes single-digit milliseconds and DELETEs + ALTER SEQUENCEs is\n // 10s of milliseconds.\n const deletes = tables.flatMap((t) => [\n `DELETE FROM \"${t}\";`,\n `ALTER SEQUENCE IF EXISTS \"${t}_id_seq\" RESTART WITH 1 INCREMENT BY 1;`,\n ]);\n\n // Create `SET NULLs` in schemas that don't have deferred FKs\n const setFksNulls = db.entities\n .filter((t) => t.nonDeferredFkOrder)\n .flatMap((t) =>\n t.manyToOnes\n // These FKs will auto-unset/delete the later row, so don't need explicit unsetting\n .filter((m2o) => m2o.onDelete !== \"SET NULL\" && m2o.onDelete !== \"CASCADE\")\n // Look for FKs to tables whose DELETEs come after us\n .filter((m2o) => db.entitiesByName[m2o.otherEntity.name].nonDeferredFkOrder > t.nonDeferredFkOrder)\n .map((m2o) => `UPDATE ${t.tableName} SET \"${m2o.columnName}\" = NULL;`),\n );\n\n const statements = [...setFksNulls, ...deletes].join(\"\\n\");\n\n return `CREATE OR REPLACE FUNCTION flush_database() RETURNS void AS $$\n BEGIN\n ${statements}\n END;\n $$ LANGUAGE\n 'plpgsql'`;\n}\n\n/**\n * A cuter/shorter flush that only DELETEs from tables that were inserted into.\n *\n * The difference between this and the explicit-order function should only be\n * noticeable on 100+ table schemas (specifically, on our production app with ~200 tables\n * and ~5,000 tests, it gave an 8% speed-up vs. the \"DELETE every table\" approach).\n */\nexport function generateSequenceFlushFunction(db: DbMetadata): string {\n const stableTables = [...Object.values(db.enums).map((e) => e.table.name), ...db.otherTables];\n const maybeSkipStable =\n stableTables.length === 0 ? \"\" : `AND sequencename NOT IN (${stableTables.map((t) => `'${t}_id_seq'`).join(\", \")})`;\n return `CREATE OR REPLACE FUNCTION flush_database() RETURNS void AS $$\n DECLARE seq RECORD;\n BEGIN\n FOR seq IN\n SELECT sequencename AS name\n FROM pg_sequences\n WHERE schemaname = 'public' AND last_value IS NOT NULL AND sequencename LIKE '%_id_seq' ${maybeSkipStable}\n LOOP\n EXECUTE format('DELETE FROM %I', regexp_replace(seq.name, '_id_seq$', ''));\n EXECUTE format('ALTER SEQUENCE %I RESTART WITH 1', seq.name);\n END LOOP;\n END;\n $$ LANGUAGE\n 'plpgsql'`;\n}\n"],"mappings":";;;;AAKA,eAAsB,oBAAoB,QAAgB,IAA+B;CAQvF,MAAM,uBAAuB,GAAG,SAAS,MACtC,MAAM,EAAE,eAAe,SAAS,KAAK,EAAE,yBAAyB,SAAS,CAC5E;CAEA,IAD6B,GAAG,SAAS,MAAM,MAAM,EAAE,WAAW,eAAe,MAC1D,KAAK,sBAC1B,MAAM,OAAO,MAAM,8BAA8B,EAAE,CAAC;MAEpD,MAAM,OAAO,MAAM,8BAA8B,EAAE,CAAC;AAExD;;;;;;;AAQA,SAAgB,8BAA8B,IAAwB;CAwBpE,MAAM,UAAU,CArBd,GAAG,GAAG,YACN,GAAG,CAAC,GAAG,GAAG,QAAQ,CAAC,CAChB,MAAM,GAAG,MAAM;EAEd,MAAM,IAAI,EAAE;EACZ,MAAM,IAAI,EAAE;EACZ,IAAI,MAAM,GACR,OAAO,IAAI;EAGb,MAAM,IAAI,EAAE,gBAAgB,IAAI;EAEhC,QADU,EAAE,gBAAgB,IAAI,MACrB;CACb,CAAC,CAAC,CACD,KAAK,MAAM,EAAE,SAAS,CAON,CAAC,CAAC,SAAS,MAAM,CACpC,gBAAgB,EAAE,KAClB,6BAA6B,EAAE,wCACjC,CAAC;CAgBD,OAAO;;QAFY,CAAC,GAXA,GAAG,SACpB,QAAQ,MAAM,EAAE,kBAAkB,CAAC,CACnC,SAAS,MACR,EAAE,WAEC,QAAQ,QAAQ,IAAI,aAAa,cAAc,IAAI,aAAa,SAAS,CAAC,CAE1E,QAAQ,QAAQ,GAAG,eAAe,IAAI,YAAY,KAAK,CAAC,qBAAqB,EAAE,kBAAkB,CAAC,CAClG,KAAK,QAAQ,UAAU,EAAE,UAAU,QAAQ,IAAI,WAAW,UAAU,CAG1C,GAAG,GAAG,OAAO,CAAC,CAAC,KAAK,IAItC,EAAE;;;;AAInB;;;;;;;;AASA,SAAgB,8BAA8B,IAAwB;CACpE,MAAM,eAAe,CAAC,GAAG,OAAO,OAAO,GAAG,KAAK,CAAC,CAAC,KAAK,MAAM,EAAE,MAAM,IAAI,GAAG,GAAG,GAAG,WAAW;CAG5F,OAAO;;;;;;kGADL,aAAa,WAAW,IAAI,KAAK,4BAA4B,aAAa,KAAK,MAAM,IAAI,EAAE,SAAS,CAAC,CAAC,KAAK,IAAI,EAAE,GAOH;;;;;;;;AAQlH"}