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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (337) hide show
  1. package/build/EntityDbMetadata.cjs +608 -0
  2. package/build/EntityDbMetadata.cjs.map +1 -0
  3. package/build/EntityDbMetadata.d.cts +274 -0
  4. package/build/EntityDbMetadata.d.cts.map +1 -0
  5. package/build/EntityDbMetadata.d.mts +274 -0
  6. package/build/EntityDbMetadata.d.mts.map +1 -0
  7. package/build/EntityDbMetadata.js +485 -664
  8. package/build/EntityDbMetadata.js.map +1 -1
  9. package/build/_virtual/_rolldown/runtime.cjs +23 -0
  10. package/build/_virtual/_rolldown/runtime.js +5 -0
  11. package/build/assignTags.cjs +45 -0
  12. package/build/assignTags.cjs.map +1 -0
  13. package/build/{assignTags.d.ts → assignTags.d.cts} +8 -3
  14. package/build/assignTags.d.cts.map +1 -0
  15. package/build/assignTags.d.mts +16 -0
  16. package/build/assignTags.d.mts.map +1 -0
  17. package/build/assignTags.js +37 -59
  18. package/build/assignTags.js.map +1 -1
  19. package/build/codemods/Codemod.cjs +2 -0
  20. package/build/codemods/Codemod.d.cts +17 -0
  21. package/build/codemods/Codemod.d.cts.map +1 -0
  22. package/build/codemods/Codemod.d.mts +17 -0
  23. package/build/codemods/Codemod.d.mts.map +1 -0
  24. package/build/codemods/Codemod.js +2 -3
  25. package/build/codemods/JscodeshiftMod.cjs +42 -0
  26. package/build/codemods/JscodeshiftMod.cjs.map +1 -0
  27. package/build/codemods/JscodeshiftMod.d.cts +14 -0
  28. package/build/codemods/JscodeshiftMod.d.cts.map +1 -0
  29. package/build/codemods/JscodeshiftMod.d.mts +14 -0
  30. package/build/codemods/JscodeshiftMod.d.mts.map +1 -0
  31. package/build/codemods/JscodeshiftMod.js +33 -33
  32. package/build/codemods/JscodeshiftMod.js.map +1 -1
  33. package/build/codemods/codemod_0001-rename_has_async_property.cjs +30 -0
  34. package/build/codemods/codemod_0001-rename_has_async_property.cjs.map +1 -0
  35. package/build/codemods/codemod_0001-rename_has_async_property.d.cts +9 -0
  36. package/build/codemods/codemod_0001-rename_has_async_property.d.cts.map +1 -0
  37. package/build/codemods/codemod_0001-rename_has_async_property.d.mts +9 -0
  38. package/build/codemods/codemod_0001-rename_has_async_property.d.mts.map +1 -0
  39. package/build/codemods/codemod_0001-rename_has_async_property.js +21 -25
  40. package/build/codemods/codemod_0001-rename_has_async_property.js.map +1 -1
  41. package/build/codemods/codemod_0002-rename_async_query_fields.cjs +50 -0
  42. package/build/codemods/codemod_0002-rename_async_query_fields.cjs.map +1 -0
  43. package/build/codemods/codemod_0002-rename_async_query_fields.d.cts +9 -0
  44. package/build/codemods/codemod_0002-rename_async_query_fields.d.cts.map +1 -0
  45. package/build/codemods/codemod_0002-rename_async_query_fields.d.mts +9 -0
  46. package/build/codemods/codemod_0002-rename_async_query_fields.d.mts.map +1 -0
  47. package/build/codemods/codemod_0002-rename_async_query_fields.js +38 -46
  48. package/build/codemods/codemod_0002-rename_async_query_fields.js.map +1 -1
  49. package/build/codemods/codemod_0003-rename_find_paginated.cjs +25 -0
  50. package/build/codemods/codemod_0003-rename_find_paginated.cjs.map +1 -0
  51. package/build/codemods/codemod_0003-rename_find_paginated.d.cts +9 -0
  52. package/build/codemods/codemod_0003-rename_find_paginated.d.cts.map +1 -0
  53. package/build/codemods/codemod_0003-rename_find_paginated.d.mts +9 -0
  54. package/build/codemods/codemod_0003-rename_find_paginated.d.mts.map +1 -0
  55. package/build/codemods/codemod_0003-rename_find_paginated.js +17 -26
  56. package/build/codemods/codemod_0003-rename_find_paginated.js.map +1 -1
  57. package/build/codemods/index.cjs +49 -0
  58. package/build/codemods/index.cjs.map +1 -0
  59. package/build/codemods/index.d.cts +12 -0
  60. package/build/codemods/index.d.cts.map +1 -0
  61. package/build/codemods/index.d.mts +12 -0
  62. package/build/codemods/index.d.mts.map +1 -0
  63. package/build/codemods/index.js +34 -42
  64. package/build/codemods/index.js.map +1 -1
  65. package/build/config.cjs +377 -0
  66. package/build/config.cjs.map +1 -0
  67. package/build/config.d.cts +181 -0
  68. package/build/config.d.cts.map +1 -0
  69. package/build/config.d.mts +181 -0
  70. package/build/config.d.mts.map +1 -0
  71. package/build/config.js +300 -382
  72. package/build/config.js.map +1 -1
  73. package/build/docs/cache.cjs +62 -0
  74. package/build/docs/cache.cjs.map +1 -0
  75. package/build/docs/cache.d.cts +17 -0
  76. package/build/docs/cache.d.cts.map +1 -0
  77. package/build/docs/cache.d.mts +17 -0
  78. package/build/docs/cache.d.mts.map +1 -0
  79. package/build/docs/cache.js +52 -53
  80. package/build/docs/cache.js.map +1 -1
  81. package/build/docs/generate-metadata-docs.cjs +32 -0
  82. package/build/docs/generate-metadata-docs.cjs.map +1 -0
  83. package/build/docs/generate-metadata-docs.d.cts +9 -0
  84. package/build/docs/generate-metadata-docs.d.cts.map +1 -0
  85. package/build/docs/generate-metadata-docs.d.mts +9 -0
  86. package/build/docs/generate-metadata-docs.d.mts.map +1 -0
  87. package/build/docs/generate-metadata-docs.js +18 -20
  88. package/build/docs/generate-metadata-docs.js.map +1 -1
  89. package/build/docs/index.cjs +90 -0
  90. package/build/docs/index.cjs.map +1 -0
  91. package/build/docs/index.d.cts +16 -0
  92. package/build/docs/index.d.cts.map +1 -0
  93. package/build/docs/index.d.mts +16 -0
  94. package/build/docs/index.d.mts.map +1 -0
  95. package/build/docs/index.js +72 -91
  96. package/build/docs/index.js.map +1 -1
  97. package/build/docs/markdown.cjs +181 -0
  98. package/build/docs/markdown.cjs.map +1 -0
  99. package/build/docs/{markdown.d.ts → markdown.d.cts} +14 -11
  100. package/build/docs/markdown.d.cts.map +1 -0
  101. package/build/docs/markdown.d.mts +32 -0
  102. package/build/docs/markdown.d.mts.map +1 -0
  103. package/build/docs/markdown.js +152 -220
  104. package/build/docs/markdown.js.map +1 -1
  105. package/build/docs/parsing.cjs +117 -0
  106. package/build/docs/parsing.cjs.map +1 -0
  107. package/build/docs/parsing.d.cts +48 -0
  108. package/build/docs/parsing.d.cts.map +1 -0
  109. package/build/docs/parsing.d.mts +48 -0
  110. package/build/docs/parsing.d.mts.map +1 -0
  111. package/build/docs/parsing.js +86 -91
  112. package/build/docs/parsing.js.map +1 -1
  113. package/build/findEntityScopes.cjs +119 -0
  114. package/build/findEntityScopes.cjs.map +1 -0
  115. package/build/findEntityScopes.d.cts +14 -0
  116. package/build/findEntityScopes.d.cts.map +1 -0
  117. package/build/findEntityScopes.d.mts +14 -0
  118. package/build/findEntityScopes.d.mts.map +1 -0
  119. package/build/findEntityScopes.js +79 -121
  120. package/build/findEntityScopes.js.map +1 -1
  121. package/build/foreignKeyOrdering.cjs +52 -0
  122. package/build/foreignKeyOrdering.cjs.map +1 -0
  123. package/build/foreignKeyOrdering.d.cts +8 -0
  124. package/build/foreignKeyOrdering.d.cts.map +1 -0
  125. package/build/foreignKeyOrdering.d.mts +8 -0
  126. package/build/foreignKeyOrdering.d.mts.map +1 -0
  127. package/build/foreignKeyOrdering.js +46 -55
  128. package/build/foreignKeyOrdering.js.map +1 -1
  129. package/build/generate.cjs +127 -0
  130. package/build/generate.cjs.map +1 -0
  131. package/build/generate.d.cts +17 -0
  132. package/build/generate.d.cts.map +1 -0
  133. package/build/generate.d.mts +17 -0
  134. package/build/generate.d.mts.map +1 -0
  135. package/build/generate.js +109 -129
  136. package/build/generate.js.map +1 -1
  137. package/build/generateEntitiesFile.cjs +46 -0
  138. package/build/generateEntitiesFile.cjs.map +1 -0
  139. package/build/generateEntitiesFile.d.cts +11 -0
  140. package/build/generateEntitiesFile.d.cts.map +1 -0
  141. package/build/generateEntitiesFile.d.mts +11 -0
  142. package/build/generateEntitiesFile.d.mts.map +1 -0
  143. package/build/generateEntitiesFile.js +28 -25
  144. package/build/generateEntitiesFile.js.map +1 -1
  145. package/build/generateEntityCodegenFile.cjs +936 -0
  146. package/build/generateEntityCodegenFile.cjs.map +1 -0
  147. package/build/generateEntityCodegenFile.d.cts +16 -0
  148. package/build/generateEntityCodegenFile.d.cts.map +1 -0
  149. package/build/generateEntityCodegenFile.d.mts +16 -0
  150. package/build/generateEntityCodegenFile.d.mts.map +1 -0
  151. package/build/generateEntityCodegenFile.js +707 -852
  152. package/build/generateEntityCodegenFile.js.map +1 -1
  153. package/build/generateEntityFile.cjs +23 -0
  154. package/build/generateEntityFile.cjs.map +1 -0
  155. package/build/generateEntityFile.d.cts +9 -0
  156. package/build/generateEntityFile.d.cts.map +1 -0
  157. package/build/generateEntityFile.d.mts +9 -0
  158. package/build/generateEntityFile.d.mts.map +1 -0
  159. package/build/generateEntityFile.js +11 -8
  160. package/build/generateEntityFile.js.map +1 -1
  161. package/build/generateEntityTestFile.cjs +25 -0
  162. package/build/generateEntityTestFile.cjs.map +1 -0
  163. package/build/generateEntityTestFile.d.cts +9 -0
  164. package/build/generateEntityTestFile.d.cts.map +1 -0
  165. package/build/generateEntityTestFile.d.mts +9 -0
  166. package/build/generateEntityTestFile.d.mts.map +1 -0
  167. package/build/generateEntityTestFile.js +10 -7
  168. package/build/generateEntityTestFile.js.map +1 -1
  169. package/build/generateEnumFile.cjs +73 -0
  170. package/build/generateEnumFile.cjs.map +1 -0
  171. package/build/generateEnumFile.d.cts +9 -0
  172. package/build/generateEnumFile.d.cts.map +1 -0
  173. package/build/generateEnumFile.d.mts +9 -0
  174. package/build/generateEnumFile.d.mts.map +1 -0
  175. package/build/generateEnumFile.js +33 -43
  176. package/build/generateEnumFile.js.map +1 -1
  177. package/build/generateFactoriesFiles.cjs +28 -0
  178. package/build/generateFactoriesFiles.cjs.map +1 -0
  179. package/build/generateFactoriesFiles.d.cts +7 -0
  180. package/build/generateFactoriesFiles.d.cts.map +1 -0
  181. package/build/generateFactoriesFiles.d.mts +7 -0
  182. package/build/generateFactoriesFiles.d.mts.map +1 -0
  183. package/build/generateFactoriesFiles.js +21 -16
  184. package/build/generateFactoriesFiles.js.map +1 -1
  185. package/build/generateFlushFunction.cjs +61 -0
  186. package/build/generateFlushFunction.cjs.map +1 -0
  187. package/build/{generateFlushFunction.d.ts → generateFlushFunction.d.cts} +8 -4
  188. package/build/generateFlushFunction.d.cts.map +1 -0
  189. package/build/generateFlushFunction.d.mts +23 -0
  190. package/build/generateFlushFunction.d.mts.map +1 -0
  191. package/build/generateFlushFunction.js +32 -73
  192. package/build/generateFlushFunction.js.map +1 -1
  193. package/build/generateMetadataFile.cjs +290 -0
  194. package/build/generateMetadataFile.cjs.map +1 -0
  195. package/build/generateMetadataFile.d.cts +8 -0
  196. package/build/generateMetadataFile.d.cts.map +1 -0
  197. package/build/generateMetadataFile.d.mts +8 -0
  198. package/build/generateMetadataFile.d.mts.map +1 -0
  199. package/build/generateMetadataFile.js +111 -142
  200. package/build/generateMetadataFile.js.map +1 -1
  201. package/build/generatePgEnumFile.cjs +21 -0
  202. package/build/generatePgEnumFile.cjs.map +1 -0
  203. package/build/generatePgEnumFile.d.cts +9 -0
  204. package/build/generatePgEnumFile.d.cts.map +1 -0
  205. package/build/generatePgEnumFile.d.mts +9 -0
  206. package/build/generatePgEnumFile.d.mts.map +1 -0
  207. package/build/generatePgEnumFile.js +12 -9
  208. package/build/generatePgEnumFile.js.map +1 -1
  209. package/build/index.cjs +135 -0
  210. package/build/index.cjs.map +1 -0
  211. package/build/index.d.cts +12 -0
  212. package/build/index.d.cts.map +1 -0
  213. package/build/index.d.mts +12 -0
  214. package/build/index.d.mts.map +1 -0
  215. package/build/index.js +105 -147
  216. package/build/index.js.map +1 -1
  217. package/build/inheritance.cjs +213 -0
  218. package/build/inheritance.cjs.map +1 -0
  219. package/build/inheritance.d.cts +12 -0
  220. package/build/inheritance.d.cts.map +1 -0
  221. package/build/inheritance.d.mts +12 -0
  222. package/build/inheritance.d.mts.map +1 -0
  223. package/build/inheritance.js +193 -247
  224. package/build/inheritance.js.map +1 -1
  225. package/build/installSkills.cjs +68 -0
  226. package/build/installSkills.cjs.map +1 -0
  227. package/build/{installSkills.d.ts → installSkills.d.cts} +5 -1
  228. package/build/installSkills.d.cts.map +1 -0
  229. package/build/installSkills.d.mts +16 -0
  230. package/build/installSkills.d.mts.map +1 -0
  231. package/build/installSkills.js +55 -57
  232. package/build/installSkills.js.map +1 -1
  233. package/build/keywords.cjs +7 -0
  234. package/build/keywords.cjs.map +1 -0
  235. package/build/keywords.d.cts +5 -0
  236. package/build/keywords.d.cts.map +1 -0
  237. package/build/keywords.d.mts +5 -0
  238. package/build/keywords.d.mts.map +1 -0
  239. package/build/keywords.js +5 -4
  240. package/build/keywords.js.map +1 -1
  241. package/build/loadMetadata.cjs +39 -0
  242. package/build/loadMetadata.cjs.map +1 -0
  243. package/build/loadMetadata.d.cts +31 -0
  244. package/build/loadMetadata.d.cts.map +1 -0
  245. package/build/loadMetadata.d.mts +31 -0
  246. package/build/loadMetadata.d.mts.map +1 -0
  247. package/build/loadMetadata.js +32 -39
  248. package/build/loadMetadata.js.map +1 -1
  249. package/build/logger.cjs +28 -0
  250. package/build/logger.cjs.map +1 -0
  251. package/build/logger.d.cts +13 -0
  252. package/build/logger.d.cts.map +1 -0
  253. package/build/logger.d.mts +13 -0
  254. package/build/logger.d.mts.map +1 -0
  255. package/build/logger.js +17 -16
  256. package/build/logger.js.map +1 -1
  257. package/build/scanEntityFiles.cjs +46 -0
  258. package/build/scanEntityFiles.cjs.map +1 -0
  259. package/build/scanEntityFiles.d.cts +8 -0
  260. package/build/scanEntityFiles.d.cts.map +1 -0
  261. package/build/scanEntityFiles.d.mts +8 -0
  262. package/build/scanEntityFiles.d.mts.map +1 -0
  263. package/build/scanEntityFiles.js +37 -42
  264. package/build/scanEntityFiles.js.map +1 -1
  265. package/build/sortForeignKeys.cjs +99 -0
  266. package/build/sortForeignKeys.cjs.map +1 -0
  267. package/build/{sortForeignKeys.d.ts → sortForeignKeys.d.cts} +8 -4
  268. package/build/sortForeignKeys.d.cts.map +1 -0
  269. package/build/sortForeignKeys.d.mts +35 -0
  270. package/build/sortForeignKeys.d.mts.map +1 -0
  271. package/build/sortForeignKeys.js +88 -117
  272. package/build/sortForeignKeys.js.map +1 -1
  273. package/build/symbols.cjs +226 -0
  274. package/build/symbols.cjs.map +1 -0
  275. package/build/symbols.d.cts +114 -0
  276. package/build/symbols.d.cts.map +1 -0
  277. package/build/symbols.d.mts +114 -0
  278. package/build/symbols.d.mts.map +1 -0
  279. package/build/symbols.js +115 -116
  280. package/build/symbols.js.map +1 -1
  281. package/build/tsdoc.cjs +22 -0
  282. package/build/tsdoc.cjs.map +1 -0
  283. package/build/tsdoc.d.cts +15 -0
  284. package/build/tsdoc.d.cts.map +1 -0
  285. package/build/tsdoc.d.mts +15 -0
  286. package/build/tsdoc.d.mts.map +1 -0
  287. package/build/tsdoc.js +18 -15
  288. package/build/tsdoc.js.map +1 -1
  289. package/build/utils.cjs +173 -0
  290. package/build/utils.cjs.map +1 -0
  291. package/build/utils.d.cts +34 -0
  292. package/build/utils.d.cts.map +1 -0
  293. package/build/utils.d.mts +34 -0
  294. package/build/utils.d.mts.map +1 -0
  295. package/build/utils.js +112 -166
  296. package/build/utils.js.map +1 -1
  297. package/build/write-json-schema.cjs +23 -0
  298. package/build/write-json-schema.cjs.map +1 -0
  299. package/build/write-json-schema.d.cts +1 -0
  300. package/build/write-json-schema.d.mts +1 -0
  301. package/build/write-json-schema.js +19 -13
  302. package/build/write-json-schema.js.map +1 -1
  303. package/package.json +28 -5
  304. package/build/EntityDbMetadata.d.ts +0 -271
  305. package/build/codemods/Codemod.d.ts +0 -13
  306. package/build/codemods/Codemod.js.map +0 -1
  307. package/build/codemods/JscodeshiftMod.d.ts +0 -10
  308. package/build/codemods/codemod_0001-rename_has_async_property.d.ts +0 -6
  309. package/build/codemods/codemod_0002-rename_async_query_fields.d.ts +0 -6
  310. package/build/codemods/codemod_0003-rename_find_paginated.d.ts +0 -6
  311. package/build/codemods/index.d.ts +0 -8
  312. package/build/config.d.ts +0 -178
  313. package/build/docs/cache.d.ts +0 -13
  314. package/build/docs/generate-metadata-docs.d.ts +0 -5
  315. package/build/docs/index.d.ts +0 -13
  316. package/build/docs/parsing.d.ts +0 -45
  317. package/build/findEntityScopes.d.ts +0 -10
  318. package/build/foreignKeyOrdering.d.ts +0 -2
  319. package/build/generate.d.ts +0 -11
  320. package/build/generateEntitiesFile.d.ts +0 -6
  321. package/build/generateEntityCodegenFile.d.ts +0 -11
  322. package/build/generateEntityFile.d.ts +0 -5
  323. package/build/generateEntityTestFile.d.ts +0 -5
  324. package/build/generateEnumFile.d.ts +0 -4
  325. package/build/generateFactoriesFiles.d.ts +0 -3
  326. package/build/generateMetadataFile.d.ts +0 -4
  327. package/build/generatePgEnumFile.d.ts +0 -4
  328. package/build/index.d.ts +0 -11
  329. package/build/inheritance.d.ts +0 -9
  330. package/build/keywords.d.ts +0 -1
  331. package/build/loadMetadata.d.ts +0 -25
  332. package/build/logger.d.ts +0 -9
  333. package/build/scanEntityFiles.d.ts +0 -4
  334. package/build/symbols.d.ts +0 -110
  335. package/build/tsdoc.d.ts +0 -11
  336. package/build/utils.d.ts +0 -30
  337. package/build/write-json-schema.d.ts +0 -1
@@ -1,241 +1,173 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.testing = void 0;
37
- exports.maybeReadMarkdownFile = maybeReadMarkdownFile;
38
- exports.parseMarkdownContent = parseMarkdownContent;
39
- exports.writeMarkdownDoc = writeMarkdownDoc;
40
- exports.updateMarkdownDoc = updateMarkdownDoc;
41
- exports.getMarkdownFilePath = getMarkdownFilePath;
42
- const fs_1 = require("fs");
43
- const path_1 = require("path");
44
- const prettier_1 = __importStar(require("prettier"));
1
+ import { promises } from "fs";
2
+ import { join } from "path";
3
+ import prettier, { resolveConfig } from "prettier";
4
+ //#region src/docs/markdown.ts
45
5
  /** Read and parse a .md file if it exists, returning undefined if it doesn't. */
46
6
  async function maybeReadMarkdownFile(filePath) {
47
- try {
48
- const content = await fs_1.promises.readFile(filePath, "utf-8");
49
- return parseMarkdownContent(content);
50
- }
51
- catch {
52
- return undefined;
53
- }
7
+ try {
8
+ return parseMarkdownContent(await promises.readFile(filePath, "utf-8"));
9
+ } catch {
10
+ return;
11
+ }
54
12
  }
55
13
  /** Reads a basic `overview` and per-field docs out of md content. */
56
14
  function parseMarkdownContent(content) {
57
- const lines = content.split("\n");
58
- let currentSection = null;
59
- let currentField = null;
60
- const overviewLines = [];
61
- const fields = {};
62
- for (const line of lines) {
63
- if (/^## Overview\s*$/.test(line)) {
64
- currentSection = "overview";
65
- currentField = null;
66
- continue;
67
- }
68
- if (/^## Fields\s*$/.test(line)) {
69
- currentSection = "fields";
70
- currentField = null;
71
- continue;
72
- }
73
- // Any other ## resets us out of known sections
74
- if (/^## /.test(line)) {
75
- currentSection = null;
76
- currentField = null;
77
- continue;
78
- }
79
- if (currentSection === "fields") {
80
- const fieldMatch = line.match(/^### (\w+)\s*$/);
81
- if (fieldMatch) {
82
- currentField = fieldMatch[1];
83
- fields[currentField] = [];
84
- continue;
85
- }
86
- }
87
- if (currentSection === "overview") {
88
- overviewLines.push(line);
89
- }
90
- else if (currentSection === "fields" && currentField) {
91
- fields[currentField].push(line);
92
- }
93
- }
94
- return {
95
- overview: trimBlankLines(overviewLines).join("\n"),
96
- fields: Object.fromEntries(Object.entries(fields).map(([k, v]) => [k, trimBlankLines(v).join("\n")])),
97
- };
15
+ const lines = content.split("\n");
16
+ let currentSection = null;
17
+ let currentField = null;
18
+ const overviewLines = [];
19
+ const fields = {};
20
+ for (const line of lines) {
21
+ if (/^## Overview\s*$/.test(line)) {
22
+ currentSection = "overview";
23
+ currentField = null;
24
+ continue;
25
+ }
26
+ if (/^## Fields\s*$/.test(line)) {
27
+ currentSection = "fields";
28
+ currentField = null;
29
+ continue;
30
+ }
31
+ if (line.startsWith("## ")) {
32
+ currentSection = null;
33
+ currentField = null;
34
+ continue;
35
+ }
36
+ if (currentSection === "fields") {
37
+ const fieldMatch = line.match(/^### (\w+)\s*$/);
38
+ if (fieldMatch) {
39
+ currentField = fieldMatch[1];
40
+ fields[currentField] = [];
41
+ continue;
42
+ }
43
+ }
44
+ if (currentSection === "overview") overviewLines.push(line);
45
+ else if (currentSection === "fields" && currentField) fields[currentField].push(line);
46
+ }
47
+ return {
48
+ overview: trimBlankLines(overviewLines).join("\n"),
49
+ fields: Object.fromEntries(Object.entries(fields).map(([k, v]) => [k, trimBlankLines(v).join("\n")]))
50
+ };
98
51
  }
99
52
  /** Create a new .md file from scratch (used only for initial backfill when no .md exists). */
100
53
  async function writeMarkdownDoc(filePath, overview, fields) {
101
- const parts = [];
102
- parts.push("## Overview");
103
- parts.push(overview || "");
104
- parts.push("");
105
- if (fields && Object.keys(fields).length > 0) {
106
- parts.push("## Fields");
107
- parts.push("");
108
- for (const [fieldName, fieldDoc] of Object.entries(fields)) {
109
- parts.push(`### ${fieldName}`);
110
- parts.push("");
111
- parts.push(fieldDoc);
112
- parts.push("");
113
- }
114
- }
115
- const prettierConfig = await (0, prettier_1.resolveConfig)(filePath);
116
- const content = await prettier_1.default.format(parts.join("\n"), {
117
- ...prettierConfig,
118
- parser: "markdown",
119
- plugins: [],
120
- });
121
- await fs_1.promises.writeFile(filePath, content, "utf-8");
54
+ const parts = [];
55
+ parts.push("## Overview");
56
+ parts.push(overview || "");
57
+ parts.push("");
58
+ if (fields && Object.keys(fields).length > 0) {
59
+ parts.push("## Fields");
60
+ parts.push("");
61
+ for (const [fieldName, fieldDoc] of Object.entries(fields)) {
62
+ parts.push(`### ${fieldName}`);
63
+ parts.push("");
64
+ parts.push(fieldDoc);
65
+ parts.push("");
66
+ }
67
+ }
68
+ const prettierConfig = await resolveConfig(filePath);
69
+ const content = await prettier.format(parts.join("\n"), {
70
+ ...prettierConfig,
71
+ parser: "markdown",
72
+ plugins: []
73
+ });
74
+ await promises.writeFile(filePath, content, "utf-8");
122
75
  }
123
76
  /**
124
- * Update an existing .md file, merging in new/changed content without stomping user content.
125
- * If the file doesn't exist, creates it from scratch.
126
- */
77
+ * Update an existing .md file, merging in new/changed content without stomping user content.
78
+ * If the file doesn't exist, creates it from scratch.
79
+ */
127
80
  async function updateMarkdownDoc(filePath, overview, fields) {
128
- let existing = null;
129
- try {
130
- existing = await fs_1.promises.readFile(filePath, "utf-8");
131
- }
132
- catch {
133
- // File doesn't exist
134
- }
135
- if (existing !== null) {
136
- const updated = mergeMarkdownContent(existing, overview, fields);
137
- if (updated !== existing) {
138
- await fs_1.promises.writeFile(filePath, updated, "utf-8");
139
- }
140
- }
141
- else {
142
- await writeMarkdownDoc(filePath, overview ?? "", Object.keys(fields).length > 0 ? fields : undefined);
143
- }
81
+ let existing = null;
82
+ try {
83
+ existing = await promises.readFile(filePath, "utf-8");
84
+ } catch {}
85
+ if (existing !== null) {
86
+ const updated = mergeMarkdownContent(existing, overview, fields);
87
+ if (updated !== existing) await promises.writeFile(filePath, updated, "utf-8");
88
+ } else await writeMarkdownDoc(filePath, overview ?? "", Object.keys(fields).length > 0 ? fields : void 0);
144
89
  }
145
90
  function getMarkdownFilePath(entitiesDir, entityName) {
146
- return (0, path_1.join)(entitiesDir, `${entityName}.md`);
91
+ return join(entitiesDir, `${entityName}.md`);
147
92
  }
148
93
  /** Trim leading/trailing blank lines but preserve internal blank lines. */
149
94
  function trimBlankLines(lines) {
150
- let start = 0;
151
- while (start < lines.length && lines[start].trim() === "")
152
- start++;
153
- let end = lines.length - 1;
154
- while (end >= start && lines[end].trim() === "")
155
- end--;
156
- return lines.slice(start, end + 1);
95
+ let start = 0;
96
+ while (start < lines.length && lines[start].trim() === "") start++;
97
+ let end = lines.length - 1;
98
+ while (end >= start && lines[end].trim() === "") end--;
99
+ return lines.slice(start, end + 1);
157
100
  }
158
101
  /**
159
- * Merge updates into an existing .md file, preserving all user content.
160
- *
161
- * - If `overview` is provided and the file has `## Overview`, replaces its body
162
- * - For each field in `fields`, if `### fieldName` exists, replaces its body;
163
- * otherwise appends it to the `## Fields` section (creating the section if needed)
164
- * - All other content (custom sections, tables, etc.) is preserved verbatim
165
- */
102
+ * Merge updates into an existing .md file, preserving all user content.
103
+ *
104
+ * - If `overview` is provided and the file has `## Overview`, replaces its body
105
+ * - For each field in `fields`, if `### fieldName` exists, replaces its body;
106
+ * otherwise appends it to the `## Fields` section (creating the section if needed)
107
+ * - All other content (custom sections, tables, etc.) is preserved verbatim
108
+ */
166
109
  function mergeMarkdownContent(existing, overview, fields) {
167
- const lines = existing.split("\n");
168
- const result = [];
169
- // Track which fields we've already merged so we know what to append
170
- const mergedFields = new Set();
171
- let fieldsEndIndex = -1;
172
- let i = 0;
173
- while (i < lines.length) {
174
- const line = lines[i];
175
- // Replace ## Overview body
176
- if (/^## Overview\s*$/.test(line) && overview !== undefined) {
177
- result.push(line);
178
- i++;
179
- // Skip over old overview body (until next ## or EOF)
180
- while (i < lines.length && !/^## /.test(lines[i]))
181
- i++;
182
- // Write new overview body
183
- result.push(overview || "");
184
- result.push("");
185
- continue;
186
- }
187
- // Track where ## Fields section ends (for appending new fields)
188
- if (/^## Fields\s*$/.test(line)) {
189
- result.push(line);
190
- i++;
191
- // Process the fields section line by line
192
- while (i < lines.length && !/^## /.test(lines[i])) {
193
- const fieldMatch = lines[i].match(/^### (\w+)\s*$/);
194
- if (fieldMatch && fieldMatch[1] in fields) {
195
- const fieldName = fieldMatch[1];
196
- mergedFields.add(fieldName);
197
- result.push(lines[i]); // ### fieldName
198
- i++;
199
- // Skip old field body (until next ### or ## or EOF)
200
- while (i < lines.length && !/^###? /.test(lines[i]) && !/^## /.test(lines[i]))
201
- i++;
202
- // Write new field body
203
- result.push("");
204
- result.push(fields[fieldName]);
205
- result.push("");
206
- }
207
- else {
208
- // Keep any line that isn't a field we're replacing (other ### fields, blank lines, etc.)
209
- result.push(lines[i]);
210
- i++;
211
- }
212
- }
213
- fieldsEndIndex = result.length;
214
- continue;
215
- }
216
- result.push(line);
217
- i++;
218
- }
219
- // Append any fields that weren't already in the file
220
- const newFields = Object.entries(fields).filter(([name]) => !mergedFields.has(name));
221
- if (newFields.length > 0) {
222
- if (fieldsEndIndex === -1) {
223
- // No ## Fields section existed, create one
224
- result.push("");
225
- result.push("## Fields");
226
- result.push("");
227
- fieldsEndIndex = result.length;
228
- }
229
- const toInsert = [];
230
- for (const [fieldName, fieldDoc] of newFields) {
231
- toInsert.push(`### ${fieldName}`);
232
- toInsert.push("");
233
- toInsert.push(fieldDoc);
234
- toInsert.push("");
235
- }
236
- result.splice(fieldsEndIndex, 0, ...toInsert);
237
- }
238
- return result.join("\n");
110
+ const lines = existing.split("\n");
111
+ const result = [];
112
+ const mergedFields = /* @__PURE__ */ new Set();
113
+ let fieldsEndIndex = -1;
114
+ let i = 0;
115
+ while (i < lines.length) {
116
+ const line = lines[i];
117
+ if (/^## Overview\s*$/.test(line) && overview !== void 0) {
118
+ result.push(line);
119
+ i++;
120
+ while (i < lines.length && !lines[i].startsWith("## ")) i++;
121
+ result.push(overview || "");
122
+ result.push("");
123
+ continue;
124
+ }
125
+ if (/^## Fields\s*$/.test(line)) {
126
+ result.push(line);
127
+ i++;
128
+ while (i < lines.length && !lines[i].startsWith("## ")) {
129
+ const fieldMatch = lines[i].match(/^### (\w+)\s*$/);
130
+ if (fieldMatch && fieldMatch[1] in fields) {
131
+ const fieldName = fieldMatch[1];
132
+ mergedFields.add(fieldName);
133
+ result.push(lines[i]);
134
+ i++;
135
+ while (i < lines.length && !/^###? /.test(lines[i]) && !lines[i].startsWith("## ")) i++;
136
+ result.push("");
137
+ result.push(fields[fieldName]);
138
+ result.push("");
139
+ } else {
140
+ result.push(lines[i]);
141
+ i++;
142
+ }
143
+ }
144
+ fieldsEndIndex = result.length;
145
+ continue;
146
+ }
147
+ result.push(line);
148
+ i++;
149
+ }
150
+ const newFields = Object.entries(fields).filter(([name]) => !mergedFields.has(name));
151
+ if (newFields.length > 0) {
152
+ if (fieldsEndIndex === -1) {
153
+ result.push("");
154
+ result.push("## Fields");
155
+ result.push("");
156
+ fieldsEndIndex = result.length;
157
+ }
158
+ const toInsert = [];
159
+ for (const [fieldName, fieldDoc] of newFields) {
160
+ toInsert.push(`### ${fieldName}`);
161
+ toInsert.push("");
162
+ toInsert.push(fieldDoc);
163
+ toInsert.push("");
164
+ }
165
+ result.splice(fieldsEndIndex, 0, ...toInsert);
166
+ }
167
+ return result.join("\n");
239
168
  }
240
- exports.testing = { mergeMarkdownContent };
169
+ const testing = { mergeMarkdownContent };
170
+ //#endregion
171
+ export { getMarkdownFilePath, maybeReadMarkdownFile, parseMarkdownContent, testing, updateMarkdownDoc, writeMarkdownDoc };
172
+
241
173
  //# sourceMappingURL=markdown.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/docs/markdown.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"markdown.js","names":["fs"],"sources":["../../src/docs/markdown.ts"],"sourcesContent":["import { promises as fs } from \"fs\";\nimport { join } from \"path\";\n\nimport prettier, { resolveConfig } from \"prettier\";\n\nexport interface ParsedDoc {\n overview: string;\n fields: Record<string, string>;\n}\n\n/** Read and parse a .md file if it exists, returning undefined if it doesn't. */\nexport async function maybeReadMarkdownFile(filePath: string): Promise<ParsedDoc | undefined> {\n try {\n const content = await fs.readFile(filePath, \"utf-8\");\n return parseMarkdownContent(content);\n } catch {\n return undefined;\n }\n}\n\n/** Reads a basic `overview` and per-field docs out of md content. */\nexport function parseMarkdownContent(content: string): ParsedDoc {\n const lines = content.split(\"\\n\");\n let currentSection: \"overview\" | \"fields\" | null = null;\n let currentField: string | null = null;\n\n const overviewLines: string[] = [];\n const fields: Record<string, string[]> = {};\n\n for (const line of lines) {\n if (/^## Overview\\s*$/.test(line)) {\n currentSection = \"overview\";\n currentField = null;\n continue;\n }\n if (/^## Fields\\s*$/.test(line)) {\n currentSection = \"fields\";\n currentField = null;\n continue;\n }\n // Any other ## resets us out of known sections\n if (line.startsWith(\"## \")) {\n currentSection = null;\n currentField = null;\n continue;\n }\n\n if (currentSection === \"fields\") {\n const fieldMatch = line.match(/^### (\\w+)\\s*$/);\n if (fieldMatch) {\n currentField = fieldMatch[1];\n fields[currentField] = [];\n continue;\n }\n }\n\n if (currentSection === \"overview\") {\n overviewLines.push(line);\n } else if (currentSection === \"fields\" && currentField) {\n fields[currentField].push(line);\n }\n }\n\n return {\n overview: trimBlankLines(overviewLines).join(\"\\n\"),\n fields: Object.fromEntries(Object.entries(fields).map(([k, v]) => [k, trimBlankLines(v).join(\"\\n\")])),\n };\n}\n\n/** Create a new .md file from scratch (used only for initial backfill when no .md exists). */\nexport async function writeMarkdownDoc(\n filePath: string,\n overview: string,\n fields?: Record<string, string>,\n): Promise<void> {\n const parts: string[] = [];\n\n parts.push(\"## Overview\");\n parts.push(overview || \"\");\n parts.push(\"\");\n\n if (fields && Object.keys(fields).length > 0) {\n parts.push(\"## Fields\");\n parts.push(\"\");\n for (const [fieldName, fieldDoc] of Object.entries(fields)) {\n parts.push(`### ${fieldName}`);\n parts.push(\"\");\n parts.push(fieldDoc);\n parts.push(\"\");\n }\n }\n\n const prettierConfig = await resolveConfig(filePath);\n const content = await prettier.format(parts.join(\"\\n\"), {\n ...prettierConfig,\n parser: \"markdown\",\n plugins: [],\n });\n\n await fs.writeFile(filePath, content, \"utf-8\");\n}\n\n/**\n * Update an existing .md file, merging in new/changed content without stomping user content.\n * If the file doesn't exist, creates it from scratch.\n */\nexport async function updateMarkdownDoc(\n filePath: string,\n overview: string | undefined,\n fields: Record<string, string>,\n): Promise<void> {\n let existing: string | null = null;\n try {\n existing = await fs.readFile(filePath, \"utf-8\");\n } catch {\n // File doesn't exist\n }\n\n if (existing !== null) {\n const updated = mergeMarkdownContent(existing, overview, fields);\n if (updated !== existing) {\n await fs.writeFile(filePath, updated, \"utf-8\");\n }\n } else {\n await writeMarkdownDoc(filePath, overview ?? \"\", Object.keys(fields).length > 0 ? fields : undefined);\n }\n}\n\nexport function getMarkdownFilePath(entitiesDir: string, entityName: string): string {\n return join(entitiesDir, `${entityName}.md`);\n}\n\n/** Trim leading/trailing blank lines but preserve internal blank lines. */\nfunction trimBlankLines(lines: string[]): string[] {\n let start = 0;\n while (start < lines.length && lines[start].trim() === \"\") start++;\n let end = lines.length - 1;\n while (end >= start && lines[end].trim() === \"\") end--;\n return lines.slice(start, end + 1);\n}\n\n/**\n * Merge updates into an existing .md file, preserving all user content.\n *\n * - If `overview` is provided and the file has `## Overview`, replaces its body\n * - For each field in `fields`, if `### fieldName` exists, replaces its body;\n * otherwise appends it to the `## Fields` section (creating the section if needed)\n * - All other content (custom sections, tables, etc.) is preserved verbatim\n */\nfunction mergeMarkdownContent(existing: string, overview: string | undefined, fields: Record<string, string>): string {\n const lines = existing.split(\"\\n\");\n const result: string[] = [];\n\n // Track which fields we've already merged so we know what to append\n const mergedFields = new Set<string>();\n let fieldsEndIndex = -1;\n\n let i = 0;\n while (i < lines.length) {\n const line = lines[i];\n\n // Replace ## Overview body\n if (/^## Overview\\s*$/.test(line) && overview !== undefined) {\n result.push(line);\n i++;\n // Skip over old overview body (until next ## or EOF)\n while (i < lines.length && !lines[i].startsWith(\"## \")) i++;\n // Write new overview body\n result.push(overview || \"\");\n result.push(\"\");\n continue;\n }\n\n // Track where ## Fields section ends (for appending new fields)\n if (/^## Fields\\s*$/.test(line)) {\n result.push(line);\n i++;\n // Process the fields section line by line\n while (i < lines.length && !lines[i].startsWith(\"## \")) {\n const fieldMatch = lines[i].match(/^### (\\w+)\\s*$/);\n if (fieldMatch && fieldMatch[1] in fields) {\n const fieldName = fieldMatch[1];\n mergedFields.add(fieldName);\n result.push(lines[i]); // ### fieldName\n i++;\n // Skip old field body (until next ### or ## or EOF)\n while (i < lines.length && !/^###? /.test(lines[i]) && !lines[i].startsWith(\"## \")) i++;\n // Write new field body\n result.push(\"\");\n result.push(fields[fieldName]);\n result.push(\"\");\n } else {\n // Keep any line that isn't a field we're replacing (other ### fields, blank lines, etc.)\n result.push(lines[i]);\n i++;\n }\n }\n fieldsEndIndex = result.length;\n continue;\n }\n\n result.push(line);\n i++;\n }\n\n // Append any fields that weren't already in the file\n const newFields = Object.entries(fields).filter(([name]) => !mergedFields.has(name));\n if (newFields.length > 0) {\n if (fieldsEndIndex === -1) {\n // No ## Fields section existed, create one\n result.push(\"\");\n result.push(\"## Fields\");\n result.push(\"\");\n fieldsEndIndex = result.length;\n }\n const toInsert: string[] = [];\n for (const [fieldName, fieldDoc] of newFields) {\n toInsert.push(`### ${fieldName}`);\n toInsert.push(\"\");\n toInsert.push(fieldDoc);\n toInsert.push(\"\");\n }\n result.splice(fieldsEndIndex, 0, ...toInsert);\n }\n\n return result.join(\"\\n\");\n}\n\nexport const testing = { mergeMarkdownContent };\n"],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
3
+ let jscodeshift = require("jscodeshift");
4
+ jscodeshift = require_runtime.__toESM(jscodeshift, 1);
5
+ //#region src/docs/parsing.ts
6
+ const j = jscodeshift.default.withParser("ts");
7
+ /** Parse an entity .ts file and extract class + member JSDoc. */
8
+ function parseEntityJSDocs(source) {
9
+ const root = j(source);
10
+ let classDoc;
11
+ let classNode;
12
+ const members = [];
13
+ root.find(j.ExportNamedDeclaration).forEach((p) => {
14
+ if (p.node.declaration?.type === "ClassDeclaration") {
15
+ classDoc = extractJSDoc(p.node);
16
+ classNode = p.node;
17
+ }
18
+ });
19
+ root.find(j.ClassProperty).forEach((p) => {
20
+ const name = p.node.key?.name;
21
+ if (name) members.push({
22
+ name,
23
+ kind: "property",
24
+ doc: extractJSDoc(p.node),
25
+ node: p.node
26
+ });
27
+ });
28
+ root.find(j.ClassMethod).forEach((p) => {
29
+ const name = p.node.key?.name;
30
+ if (name) members.push({
31
+ name,
32
+ kind: classMethodKind(p.node),
33
+ doc: extractJSDoc(p.node),
34
+ node: p.node
35
+ });
36
+ });
37
+ return {
38
+ classDoc,
39
+ classNode,
40
+ members,
41
+ fieldDocs: collectFieldDocs(members)
42
+ };
43
+ }
44
+ /**
45
+ * Collect field docs from members for backfill.
46
+ * When a getter and setter share the same name, prefer the getter's doc.
47
+ */
48
+ function collectFieldDocs(members) {
49
+ const result = {};
50
+ for (const m of members) {
51
+ if (!m.doc || m.kind === "method") continue;
52
+ if (result[m.name] && m.kind === "setter") continue;
53
+ result[m.name] = m.doc;
54
+ }
55
+ return result;
56
+ }
57
+ /**
58
+ * Build a source edit that sets the JSDoc on a node (replacing existing or inserting new).
59
+ *
60
+ * (This is bizarre, but this `SourceEdit` + `applyEdits` leaves all existing formatting
61
+ * alone better than doing a `node.toSource()` or other AST-based updates. :grimmacing:)
62
+ */
63
+ function buildJSDocEdit(node, text) {
64
+ const column = node.loc.start.column;
65
+ const existingComment = node.comments?.find((c) => c.leading && "value" in c && c.value.startsWith("*"));
66
+ if (existingComment) return {
67
+ start: existingComment.start,
68
+ end: existingComment.end,
69
+ text: buildJSDocBlock(text, column)
70
+ };
71
+ const indent = " ".repeat(column);
72
+ return {
73
+ start: node.start,
74
+ end: node.start,
75
+ text: buildJSDocBlock(text, column) + "\n" + indent
76
+ };
77
+ }
78
+ /** Apply edits to source by splicing in reverse order. */
79
+ function applyEdits(source, edits) {
80
+ const sorted = [...edits].sort((a, b) => b.start - a.start);
81
+ let result = source;
82
+ for (const edit of sorted) result = result.slice(0, edit.start) + edit.text + result.slice(edit.end);
83
+ return result;
84
+ }
85
+ /** Build a JSDoc block comment string from plain text. */
86
+ function buildJSDocBlock(text, indent) {
87
+ const pad = " ".repeat(indent);
88
+ const lines = text.split("\n");
89
+ if (lines.length === 1) return `/** ${lines[0]} */`;
90
+ return `/**\n` + lines.map((l) => l ? `${pad} * ${l}` : `${pad} *`).join("\n") + `\n${pad} */`;
91
+ }
92
+ /** The `@generated Entity.md` marker, i.e. so readers know a JSDoc is sourced from (and edited in) the `.md`. */
93
+ function generatedTag(entityName) {
94
+ return `@generated ${entityName}.md`;
95
+ }
96
+ /** Extract text from a JSDoc-style leading block comment (i.e. one starting with `*`). */
97
+ function extractJSDoc(node) {
98
+ const block = node.comments?.find((c) => c.leading && "value" in c && c.value.startsWith("*"));
99
+ if (!block || !("value" in block)) return void 0;
100
+ const lines = block.value.split("\n").map((l) => l.replace(/^\s*\*\s?/, "").trimEnd());
101
+ while (lines.length > 0 && lines[0].trim() === "") lines.shift();
102
+ while (lines.length > 0 && lines[lines.length - 1].trim() === "") lines.pop();
103
+ return lines.join("\n") || void 0;
104
+ }
105
+ function classMethodKind(node) {
106
+ if (node.kind === "get") return "getter";
107
+ if (node.kind === "set") return "setter";
108
+ return "method";
109
+ }
110
+ //#endregion
111
+ exports.applyEdits = applyEdits;
112
+ exports.buildJSDocBlock = buildJSDocBlock;
113
+ exports.buildJSDocEdit = buildJSDocEdit;
114
+ exports.generatedTag = generatedTag;
115
+ exports.parseEntityJSDocs = parseEntityJSDocs;
116
+
117
+ //# sourceMappingURL=parsing.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsing.cjs","names":[],"sources":["../../src/docs/parsing.ts"],"sourcesContent":["import type { namedTypes } from \"ast-types\";\nimport jscodeshift, { type ASTNode } from \"jscodeshift\";\n\nconst j = jscodeshift.withParser(\"ts\");\n\ntype CommentKind = (namedTypes.CommentBlock | namedTypes.CommentLine | namedTypes.Block | namedTypes.Line) & {\n start?: number;\n end?: number;\n};\nj;\ntype Commented = ASTNode & {\n comments?: CommentKind[] | null;\n start?: number;\n end?: number;\n loc?: namedTypes.SourceLocation | null;\n};\n\nexport type MemberKind = \"property\" | \"getter\" | \"setter\" | \"method\";\n\nexport interface MemberInfo {\n kind: MemberKind;\n name: string;\n doc: string | undefined;\n node: Commented;\n}\n\nexport interface SourceEdit {\n start: number;\n end: number;\n text: string;\n}\n\n/** Parse an entity .ts file and extract class + member JSDoc. */\nexport function parseEntityJSDocs(source: string) {\n const root = j(source);\n let classDoc: string | undefined;\n let classNode: Commented | undefined;\n const members: MemberInfo[] = [];\n\n root.find(j.ExportNamedDeclaration).forEach((p) => {\n if (p.node.declaration?.type === \"ClassDeclaration\") {\n classDoc = extractJSDoc(p.node as Commented);\n classNode = p.node as Commented;\n }\n });\n\n root.find(j.ClassProperty).forEach((p) => {\n const name = (p.node.key as namedTypes.Identifier)?.name;\n if (name) {\n members.push({ name, kind: \"property\", doc: extractJSDoc(p.node as Commented), node: p.node as Commented });\n }\n });\n\n root.find(j.ClassMethod).forEach((p) => {\n const name = (p.node.key as namedTypes.Identifier)?.name;\n if (name) {\n members.push({\n name,\n kind: classMethodKind(p.node),\n doc: extractJSDoc(p.node as Commented),\n node: p.node as Commented,\n });\n }\n });\n\n return { classDoc, classNode, members, fieldDocs: collectFieldDocs(members) };\n}\n\n/**\n * Collect field docs from members for backfill.\n * When a getter and setter share the same name, prefer the getter's doc.\n */\nfunction collectFieldDocs(members: MemberInfo[]): Record<string, string> {\n const result: Record<string, string> = {};\n for (const m of members) {\n if (!m.doc || m.kind === \"method\") continue;\n if (result[m.name] && m.kind === \"setter\") continue;\n result[m.name] = m.doc;\n }\n return result;\n}\n\n/**\n * Build a source edit that sets the JSDoc on a node (replacing existing or inserting new).\n *\n * (This is bizarre, but this `SourceEdit` + `applyEdits` leaves all existing formatting\n * alone better than doing a `node.toSource()` or other AST-based updates. :grimmacing:)\n */\nexport function buildJSDocEdit(node: Commented, text: string): SourceEdit {\n const column = node.loc!.start.column;\n const existingComment = node.comments?.find((c) => c.leading && \"value\" in c && c.value.startsWith(\"*\"));\n if (existingComment) {\n return { start: existingComment.start!, end: existingComment.end!, text: buildJSDocBlock(text, column) };\n }\n const indent = \" \".repeat(column);\n return { start: node.start!, end: node.start!, text: buildJSDocBlock(text, column) + \"\\n\" + indent };\n}\n\n/** Apply edits to source by splicing in reverse order. */\nexport function applyEdits(source: string, edits: SourceEdit[]): string {\n const sorted = [...edits].sort((a, b) => b.start - a.start);\n let result = source;\n for (const edit of sorted) {\n result = result.slice(0, edit.start) + edit.text + result.slice(edit.end);\n }\n return result;\n}\n\n/** Build a JSDoc block comment string from plain text. */\nexport function buildJSDocBlock(text: string, indent: number): string {\n const pad = \" \".repeat(indent);\n const lines = text.split(\"\\n\");\n if (lines.length === 1) return `/** ${lines[0]} */`;\n return `/**\\n` + lines.map((l) => (l ? `${pad} * ${l}` : `${pad} *`)).join(\"\\n\") + `\\n${pad} */`;\n}\n\n/** The `@generated Entity.md` marker, i.e. so readers know a JSDoc is sourced from (and edited in) the `.md`. */\nexport function generatedTag(entityName: string): string {\n return `@generated ${entityName}.md`;\n}\n\n/** Extract text from a JSDoc-style leading block comment (i.e. one starting with `*`). */\nfunction extractJSDoc(node: Commented): string | undefined {\n const block = node.comments?.find((c) => c.leading && \"value\" in c && c.value.startsWith(\"*\"));\n if (!block || !(\"value\" in block)) return undefined;\n const lines = block.value.split(\"\\n\").map((l) => l.replace(/^\\s*\\*\\s?/, \"\").trimEnd());\n while (lines.length > 0 && lines[0].trim() === \"\") lines.shift();\n while (lines.length > 0 && lines[lines.length - 1].trim() === \"\") lines.pop();\n return lines.join(\"\\n\") || undefined;\n}\n\nfunction classMethodKind(node: namedTypes.ClassMethod): MemberKind {\n if (node.kind === \"get\") return \"getter\";\n if (node.kind === \"set\") return \"setter\";\n return \"method\";\n}\n"],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import { ASTNode } from "jscodeshift";
2
+ import { namedTypes } from "ast-types";
3
+ //#region src/docs/parsing.d.ts
4
+ type CommentKind = (namedTypes.CommentBlock | namedTypes.CommentLine | namedTypes.Block | namedTypes.Line) & {
5
+ start?: number;
6
+ end?: number;
7
+ };
8
+ type Commented = ASTNode & {
9
+ comments?: CommentKind[] | null;
10
+ start?: number;
11
+ end?: number;
12
+ loc?: namedTypes.SourceLocation | null;
13
+ };
14
+ type MemberKind = "property" | "getter" | "setter" | "method";
15
+ interface MemberInfo {
16
+ kind: MemberKind;
17
+ name: string;
18
+ doc: string | undefined;
19
+ node: Commented;
20
+ }
21
+ interface SourceEdit {
22
+ start: number;
23
+ end: number;
24
+ text: string;
25
+ }
26
+ /** Parse an entity .ts file and extract class + member JSDoc. */
27
+ declare function parseEntityJSDocs(source: string): {
28
+ classDoc: string | undefined;
29
+ classNode: Commented | undefined;
30
+ members: MemberInfo[];
31
+ fieldDocs: Record<string, string>;
32
+ };
33
+ /**
34
+ * Build a source edit that sets the JSDoc on a node (replacing existing or inserting new).
35
+ *
36
+ * (This is bizarre, but this `SourceEdit` + `applyEdits` leaves all existing formatting
37
+ * alone better than doing a `node.toSource()` or other AST-based updates. :grimmacing:)
38
+ */
39
+ declare function buildJSDocEdit(node: Commented, text: string): SourceEdit;
40
+ /** Apply edits to source by splicing in reverse order. */
41
+ declare function applyEdits(source: string, edits: SourceEdit[]): string;
42
+ /** Build a JSDoc block comment string from plain text. */
43
+ declare function buildJSDocBlock(text: string, indent: number): string;
44
+ /** The `@generated Entity.md` marker, i.e. so readers know a JSDoc is sourced from (and edited in) the `.md`. */
45
+ declare function generatedTag(entityName: string): string;
46
+ //#endregion
47
+ export { MemberInfo, MemberKind, SourceEdit, applyEdits, buildJSDocBlock, buildJSDocEdit, generatedTag, parseEntityJSDocs };
48
+ //# sourceMappingURL=parsing.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsing.d.cts","names":[],"sources":["../../src/docs/parsing.ts"],"mappings":";;;KAKK,eAAe,WAAW,eAAe,WAAW,cAAc,WAAW,QAAQ,WAAW;EACnG;EACA;;KAGG,YAAY;EACf,WAAW;EACX;EACA;EACA,MAAM,WAAW;;KAGP;UAEK;EACf,MAAM;EACN;EACA;EACA,MAAM;;UAGS;EACf;EACA;EACA;;;iBAIc,kBAAkB;;;;;;;;;;;;iBAuDlB,eAAe,MAAM,WAAW,eAAe;;iBAW/C,WAAW,gBAAgB,OAAO;;iBAUlC,gBAAgB,cAAc;;iBAQ9B,aAAa"}