@cparra/apexdocs 2.25.0 → 3.0.0-alpha.10

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 (431) hide show
  1. package/.github/workflows/ci.yaml +22 -0
  2. package/README.md +73 -12
  3. package/__mocks__/chalk.js +12 -0
  4. package/__mocks__/log-update.js +6 -0
  5. package/dist/cli/generate.js +3181 -0
  6. package/dist/defaults-DGKfeZq-.js +13 -0
  7. package/dist/index.d.ts +117 -0
  8. package/dist/index.js +36 -0
  9. package/eslint.config.mjs +10 -0
  10. package/examples/markdown/.forceignore +12 -0
  11. package/examples/markdown/config/project-scratch-def.json +5 -0
  12. package/examples/markdown/docs/index.md +109 -0
  13. package/examples/markdown/docs/miscellaneous/BaseClass.md +16 -0
  14. package/examples/markdown/docs/miscellaneous/MultiInheritanceClass.md +72 -0
  15. package/examples/markdown/docs/miscellaneous/ParentInterface.md +15 -0
  16. package/examples/markdown/docs/miscellaneous/ReferencedEnum.md +8 -0
  17. package/examples/markdown/docs/miscellaneous/SampleException.md +24 -0
  18. package/examples/markdown/docs/miscellaneous/SampleInterface.md +116 -0
  19. package/examples/markdown/docs/miscellaneous/Url.md +309 -0
  20. package/examples/markdown/docs/sample-enums/SampleEnum.md +36 -0
  21. package/examples/markdown/docs/samplegroup/SampleClass.md +170 -0
  22. package/examples/markdown/force-app/classes/BaseClass.cls +3 -0
  23. package/examples/markdown/force-app/classes/MultiInheritanceClass.cls +1 -0
  24. package/examples/markdown/force-app/classes/ParentInterface.cls +3 -0
  25. package/examples/markdown/force-app/classes/ReferencedEnum.cls +3 -0
  26. package/examples/markdown/force-app/classes/SampleClass.cls +72 -0
  27. package/examples/markdown/force-app/classes/SampleEnum.cls +30 -0
  28. package/examples/markdown/force-app/classes/SampleException.cls +17 -0
  29. package/examples/markdown/force-app/classes/SampleInterface.cls +50 -0
  30. package/examples/markdown/force-app/classes/Url.cls +194 -0
  31. package/examples/markdown/package-lock.json +665 -0
  32. package/examples/markdown/package.json +20 -0
  33. package/examples/markdown/sfdx-project.json +12 -0
  34. package/examples/vitepress/.forceignore +12 -0
  35. package/examples/vitepress/apexdocs.config.ts +106 -0
  36. package/examples/vitepress/config/project-scratch-def.json +13 -0
  37. package/examples/vitepress/docs/.vitepress/cache/deps/@theme_index.js +259 -0
  38. package/examples/vitepress/docs/.vitepress/cache/deps/@theme_index.js.map +7 -0
  39. package/examples/vitepress/docs/.vitepress/cache/deps/_metadata.json +40 -0
  40. package/examples/vitepress/docs/.vitepress/cache/deps/chunk-574YRH25.js +11474 -0
  41. package/examples/vitepress/docs/.vitepress/cache/deps/chunk-574YRH25.js.map +7 -0
  42. package/examples/vitepress/docs/.vitepress/cache/deps/chunk-E5DZZB2I.js +9172 -0
  43. package/examples/vitepress/docs/.vitepress/cache/deps/chunk-E5DZZB2I.js.map +7 -0
  44. package/examples/vitepress/docs/.vitepress/cache/deps/package.json +3 -0
  45. package/examples/vitepress/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js +4339 -0
  46. package/examples/vitepress/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js.map +7 -0
  47. package/examples/vitepress/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js +567 -0
  48. package/examples/vitepress/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js.map +7 -0
  49. package/examples/vitepress/docs/.vitepress/cache/deps/vue.js +323 -0
  50. package/examples/vitepress/docs/.vitepress/cache/deps/vue.js.map +7 -0
  51. package/examples/vitepress/docs/.vitepress/config.mts +21 -0
  52. package/examples/vitepress/docs/.vitepress/sidebar.json +119 -0
  53. package/examples/vitepress/docs/api-examples.md +49 -0
  54. package/examples/vitepress/docs/index-frontmatter.md +16 -0
  55. package/examples/vitepress/docs/index.md +56 -0
  56. package/examples/vitepress/docs/markdown-examples.md +85 -0
  57. package/examples/vitepress/docs/miscellaneous/BaseClass.md +20 -0
  58. package/examples/vitepress/docs/miscellaneous/MultiInheritanceClass.md +76 -0
  59. package/examples/vitepress/docs/miscellaneous/ParentInterface.md +19 -0
  60. package/examples/vitepress/docs/miscellaneous/ReferencedEnum.md +15 -0
  61. package/examples/vitepress/docs/miscellaneous/SampleException.md +28 -0
  62. package/examples/vitepress/docs/miscellaneous/SampleInterface.md +116 -0
  63. package/examples/vitepress/docs/miscellaneous/Url.md +317 -0
  64. package/examples/vitepress/docs/sample-enums/SampleEnum.md +40 -0
  65. package/examples/vitepress/docs/samplegroup/SampleClass.md +174 -0
  66. package/examples/vitepress/force-app/main/default/classes/BaseClass.cls +3 -0
  67. package/examples/vitepress/force-app/main/default/classes/MultiInheritanceClass.cls +1 -0
  68. package/examples/vitepress/force-app/main/default/classes/ParentInterface.cls +3 -0
  69. package/examples/vitepress/force-app/main/default/classes/ReferencedEnum.cls +5 -0
  70. package/examples/vitepress/force-app/main/default/classes/SampleClass.cls +72 -0
  71. package/examples/vitepress/force-app/main/default/classes/SampleEnum.cls +30 -0
  72. package/examples/vitepress/force-app/main/default/classes/SampleException.cls +17 -0
  73. package/examples/vitepress/force-app/main/default/classes/SampleInterface.cls +46 -0
  74. package/examples/vitepress/force-app/main/default/classes/Url.cls +198 -0
  75. package/examples/vitepress/package-lock.json +2574 -0
  76. package/examples/vitepress/package.json +18 -0
  77. package/examples/vitepress/sfdx-project.json +12 -0
  78. package/jest.config.js +6 -1
  79. package/jest.d.ts +7 -0
  80. package/package.json +34 -36
  81. package/src/application/Apexdocs.ts +58 -68
  82. package/src/application/__tests__/apex-file-reader.spec.ts +104 -0
  83. package/src/application/apex-file-reader.ts +55 -0
  84. package/src/application/file-system.ts +69 -0
  85. package/src/application/file-writer.ts +43 -0
  86. package/src/application/generators/markdown.ts +45 -0
  87. package/src/application/generators/openapi.ts +60 -0
  88. package/src/cli/args.ts +43 -0
  89. package/src/cli/commands/markdown.ts +53 -0
  90. package/src/cli/generate.ts +10 -131
  91. package/src/core/manifest.ts +90 -0
  92. package/src/core/markdown/__test__/expect-extensions.ts +32 -0
  93. package/src/core/markdown/__test__/generating-class-docs.spec.ts +733 -0
  94. package/src/core/markdown/__test__/generating-enum-docs.spec.ts +385 -0
  95. package/src/core/markdown/__test__/generating-interface-docs.spec.ts +461 -0
  96. package/src/core/markdown/__test__/generating-reference-guide.spec.ts +180 -0
  97. package/src/core/markdown/__test__/inheritance-chain.test.ts +54 -0
  98. package/src/core/markdown/__test__/test-helpers.ts +23 -0
  99. package/src/core/markdown/adapters/__tests__/documentables.spec.ts +109 -0
  100. package/src/core/markdown/adapters/__tests__/interface-adapter.spec.ts +148 -0
  101. package/src/core/markdown/adapters/__tests__/link-generator.spec.ts +130 -0
  102. package/src/core/markdown/adapters/__tests__/references.spec.ts +136 -0
  103. package/src/core/markdown/adapters/apex-types.ts +238 -0
  104. package/src/core/markdown/adapters/documentables.ts +115 -0
  105. package/src/core/markdown/adapters/fields-and-properties.ts +45 -0
  106. package/src/core/markdown/adapters/generate-link.ts +82 -0
  107. package/src/core/markdown/adapters/inline.ts +143 -0
  108. package/src/core/markdown/adapters/methods-and-constructors.ts +133 -0
  109. package/src/core/markdown/adapters/reference-guide.ts +37 -0
  110. package/src/core/markdown/adapters/renderable-bundle.ts +61 -0
  111. package/src/core/markdown/adapters/renderable-to-page-data.ts +89 -0
  112. package/src/core/markdown/adapters/type-utils.ts +13 -0
  113. package/src/core/markdown/adapters/types.d.ts +180 -0
  114. package/src/core/markdown/generate-docs.ts +212 -0
  115. package/src/core/markdown/reflection/filter-scope.ts +13 -0
  116. package/src/core/markdown/reflection/inheritance-chain-expanion.ts +22 -0
  117. package/src/core/markdown/reflection/inheritance-chain.ts +23 -0
  118. package/src/core/markdown/reflection/inherited-member-expansion.ts +105 -0
  119. package/src/core/markdown/reflection/reflect-source.ts +123 -0
  120. package/src/core/markdown/reflection/sort-members.ts +59 -0
  121. package/src/core/markdown/templates/class-template.ts +75 -0
  122. package/src/core/markdown/templates/constructors-partial-template.ts +32 -0
  123. package/src/core/markdown/templates/documentable-partial-template.ts +26 -0
  124. package/src/core/markdown/templates/enum-template.ts +12 -0
  125. package/src/core/markdown/templates/fieldsPartialTemplate.ts +23 -0
  126. package/src/core/markdown/templates/grouped-members-partial-template.ts +6 -0
  127. package/src/core/markdown/templates/hookable.ts +7 -0
  128. package/src/core/markdown/templates/interface-template.ts +16 -0
  129. package/src/core/markdown/templates/methods-partial-template.ts +43 -0
  130. package/src/core/markdown/templates/reference-guide.ts +14 -0
  131. package/src/core/markdown/templates/template.ts +114 -0
  132. package/src/core/markdown/templates/type-doc-partial.ts +27 -0
  133. package/src/core/markdown/utils.ts +3 -0
  134. package/src/{service → core/openapi}/__tests__/manifest-factory.spec.ts +1 -2
  135. package/src/{transpiler → core}/openapi/__tests__/open-api-docs-processor.spec.ts +1 -1
  136. package/src/{model → core/openapi}/apex-type-wrappers/__tests__/ClassMirrorWrapper.spec.ts +3 -3
  137. package/src/core/openapi/file-container.ts +13 -0
  138. package/src/{service → core/openapi}/manifest-factory.ts +3 -3
  139. package/src/{transpiler → core}/openapi/open-api-docs-processor.ts +10 -11
  140. package/src/{model → core}/openapi/open-api-types.ts +2 -2
  141. package/src/core/openapi/openapi-type-file.ts +12 -0
  142. package/src/{service → core/openapi}/parser.ts +7 -21
  143. package/src/{transpiler → core}/openapi/parsers/Builder.ts +3 -3
  144. package/src/{transpiler → core}/openapi/parsers/MethodParser.ts +6 -6
  145. package/src/{transpiler → core}/openapi/parsers/ParameterObjectBuilder.ts +2 -2
  146. package/src/{transpiler → core}/openapi/parsers/ReferenceBuilder.ts +7 -6
  147. package/src/{transpiler → core}/openapi/parsers/RequestBodyBuilder.ts +2 -2
  148. package/src/{transpiler → core}/openapi/parsers/ResponsesBuilder.ts +2 -2
  149. package/src/{transpiler → core}/openapi/parsers/__tests__/MethodParser.spec.ts +1 -1
  150. package/src/{transpiler → core}/openapi/parsers/__tests__/ParameterObjectBuilder.spec.ts +2 -2
  151. package/src/{transpiler → core}/openapi/parsers/__tests__/ReferenceBuilder.spec.ts +2 -2
  152. package/src/{transpiler → core}/openapi/parsers/__tests__/RequestBodyBuilder.spec.ts +2 -2
  153. package/src/{transpiler → core}/openapi/parsers/__tests__/ResponsesBuilder.spec.ts +1 -1
  154. package/src/{transpiler → core/openapi}/transpiler.ts +2 -6
  155. package/src/{model → core/openapi}/types-repository.ts +0 -9
  156. package/src/core/parse-apex-metadata.ts +30 -0
  157. package/src/core/settings.ts +56 -0
  158. package/src/core/shared/types.d.ts +147 -0
  159. package/src/core/shared/utils.ts +5 -0
  160. package/src/defaults.ts +9 -0
  161. package/src/index.ts +36 -1
  162. package/src/test-helpers/ClassMirrorBuilder.ts +14 -1
  163. package/src/test-helpers/FieldMirrorBuilder.ts +1 -1
  164. package/src/test-helpers/InterfaceMirrorBuilder.ts +39 -0
  165. package/src/test-helpers/MethodMirrorBuilder.ts +46 -6
  166. package/src/test-helpers/SettingsBuilder.ts +1 -4
  167. package/src/util/error-logger.ts +4 -4
  168. package/src/util/fp.ts +3 -0
  169. package/src/util/logger.ts +12 -25
  170. package/src/util/string-utils.ts +0 -4
  171. package/tsconfig.json +8 -3
  172. package/.eslintrc.js +0 -12
  173. package/apexdocs.config.ts +0 -13
  174. package/docs/.nojekyll +0 -0
  175. package/docs/README.md +0 -1
  176. package/docs/index.html +0 -22
  177. package/docs/restapi.json +0 -589
  178. package/docs/types/Classes/nspc.AnotherInterface.md +0 -22
  179. package/docs/types/Classes/nspc.ChildClass.md +0 -97
  180. package/docs/types/Main/nspc.GroupedClass.md +0 -10
  181. package/docs/types/Main/nspc.SampleClass.md +0 -190
  182. package/docs/types/Misc-Group/nspc.EscapedAnnotations.md +0 -4
  183. package/docs/types/Misc-Group/nspc.GrandparentClass.md +0 -13
  184. package/docs/types/Misc-Group/nspc.InterfaceWithInheritance.md +0 -29
  185. package/docs/types/Misc-Group/nspc.MemberGrouping.md +0 -13
  186. package/docs/types/Misc-Group/nspc.ParentClass.md +0 -37
  187. package/docs/types/Misc-Group/nspc.Reference1.md +0 -18
  188. package/docs/types/Misc-Group/nspc.Reference2.md +0 -12
  189. package/docs/types/Misc-Group/nspc.Reference3.md +0 -7
  190. package/docs/types/Misc-Group/nspc.Reference4.md +0 -7
  191. package/docs/types/Misc-Group/nspc.Reference5.md +0 -7
  192. package/docs/types/Misc-Group/nspc.Reference6.md +0 -9
  193. package/docs/types/Misc-Group/nspc.Reference7.md +0 -7
  194. package/docs/types/Misc-Group/nspc.SampleClassWithoutModifier.md +0 -11
  195. package/docs/types/Misc-Group/nspc.SampleRestResource.md +0 -211
  196. package/docs/types/Misc-Group/nspc.SampleRestResourceWithInnerClass.md +0 -34
  197. package/docs/types/Misc-Group/nspc.SampleRestResourceWithoutApexDocs.md +0 -14
  198. package/docs/types/README.md +0 -97
  199. package/docs/types/Sample-Interfaces/nspc.SampleInterface.md +0 -23
  200. package/examples/includes/header.md +0 -3
  201. package/lib/application/Apexdocs.d.ts +0 -13
  202. package/lib/application/Apexdocs.js +0 -77
  203. package/lib/application/Apexdocs.js.map +0 -1
  204. package/lib/cli/generate.d.ts +0 -2
  205. package/lib/cli/generate.js +0 -131
  206. package/lib/cli/generate.js.map +0 -1
  207. package/lib/index.d.ts +0 -1
  208. package/lib/index.js +0 -18
  209. package/lib/index.js.map +0 -1
  210. package/lib/model/apex-bundle.d.ts +0 -6
  211. package/lib/model/apex-bundle.js +0 -11
  212. package/lib/model/apex-bundle.js.map +0 -1
  213. package/lib/model/apex-type-wrappers/ClassMirrorWrapper.d.ts +0 -7
  214. package/lib/model/apex-type-wrappers/ClassMirrorWrapper.js +0 -14
  215. package/lib/model/apex-type-wrappers/ClassMirrorWrapper.js.map +0 -1
  216. package/lib/model/apex-type-wrappers/MethodMirrorWrapper.d.ts +0 -7
  217. package/lib/model/apex-type-wrappers/MethodMirrorWrapper.js +0 -12
  218. package/lib/model/apex-type-wrappers/MethodMirrorWrapper.js.map +0 -1
  219. package/lib/model/inheritance.d.ts +0 -8
  220. package/lib/model/inheritance.js +0 -3
  221. package/lib/model/inheritance.js.map +0 -1
  222. package/lib/model/manifest-diff.d.ts +0 -27
  223. package/lib/model/manifest-diff.js +0 -69
  224. package/lib/model/manifest-diff.js.map +0 -1
  225. package/lib/model/manifest.d.ts +0 -22
  226. package/lib/model/manifest.js +0 -47
  227. package/lib/model/manifest.js.map +0 -1
  228. package/lib/model/markdown-file.d.ts +0 -16
  229. package/lib/model/markdown-file.js +0 -107
  230. package/lib/model/markdown-file.js.map +0 -1
  231. package/lib/model/markdown-generation-util/doc-comment-annotation-util.d.ts +0 -8
  232. package/lib/model/markdown-generation-util/doc-comment-annotation-util.js +0 -44
  233. package/lib/model/markdown-generation-util/doc-comment-annotation-util.js.map +0 -1
  234. package/lib/model/markdown-generation-util/field-declaration-util.d.ts +0 -3
  235. package/lib/model/markdown-generation-util/field-declaration-util.js +0 -55
  236. package/lib/model/markdown-generation-util/field-declaration-util.js.map +0 -1
  237. package/lib/model/markdown-generation-util/index.d.ts +0 -3
  238. package/lib/model/markdown-generation-util/index.js +0 -20
  239. package/lib/model/markdown-generation-util/index.js.map +0 -1
  240. package/lib/model/markdown-generation-util/method-declaration-util.d.ts +0 -4
  241. package/lib/model/markdown-generation-util/method-declaration-util.js +0 -115
  242. package/lib/model/markdown-generation-util/method-declaration-util.js.map +0 -1
  243. package/lib/model/markdown-generation-util/type-declaration-util.d.ts +0 -3
  244. package/lib/model/markdown-generation-util/type-declaration-util.js +0 -82
  245. package/lib/model/markdown-generation-util/type-declaration-util.js.map +0 -1
  246. package/lib/model/markdown-home-file.d.ts +0 -11
  247. package/lib/model/markdown-home-file.js +0 -54
  248. package/lib/model/markdown-home-file.js.map +0 -1
  249. package/lib/model/markdown-type-file.d.ts +0 -26
  250. package/lib/model/markdown-type-file.js +0 -134
  251. package/lib/model/markdown-type-file.js.map +0 -1
  252. package/lib/model/openapi/apex-doc-types.d.ts +0 -19
  253. package/lib/model/openapi/apex-doc-types.js +0 -5
  254. package/lib/model/openapi/apex-doc-types.js.map +0 -1
  255. package/lib/model/openapi/open-api-types.d.ts +0 -93
  256. package/lib/model/openapi/open-api-types.js +0 -3
  257. package/lib/model/openapi/open-api-types.js.map +0 -1
  258. package/lib/model/openapi/open-api.d.ts +0 -16
  259. package/lib/model/openapi/open-api.js +0 -34
  260. package/lib/model/openapi/open-api.js.map +0 -1
  261. package/lib/model/openapi/openapi-type-file.d.ts +0 -7
  262. package/lib/model/openapi/openapi-type-file.js +0 -17
  263. package/lib/model/openapi/openapi-type-file.js.map +0 -1
  264. package/lib/model/outputFile.d.ts +0 -10
  265. package/lib/model/outputFile.js +0 -29
  266. package/lib/model/outputFile.js.map +0 -1
  267. package/lib/model/types-repository.d.ts +0 -16
  268. package/lib/model/types-repository.js +0 -54
  269. package/lib/model/types-repository.js.map +0 -1
  270. package/lib/service/apex-file-reader.d.ts +0 -14
  271. package/lib/service/apex-file-reader.js +0 -46
  272. package/lib/service/apex-file-reader.js.map +0 -1
  273. package/lib/service/file-system.d.ts +0 -14
  274. package/lib/service/file-system.js +0 -25
  275. package/lib/service/file-system.js.map +0 -1
  276. package/lib/service/file-writer.d.ts +0 -6
  277. package/lib/service/file-writer.js +0 -34
  278. package/lib/service/file-writer.js.map +0 -1
  279. package/lib/service/manifest-factory.d.ts +0 -10
  280. package/lib/service/manifest-factory.js +0 -14
  281. package/lib/service/manifest-factory.js.map +0 -1
  282. package/lib/service/metadata-processor.d.ts +0 -3
  283. package/lib/service/metadata-processor.js +0 -17
  284. package/lib/service/metadata-processor.js.map +0 -1
  285. package/lib/service/parser.d.ts +0 -21
  286. package/lib/service/parser.js +0 -135
  287. package/lib/service/parser.js.map +0 -1
  288. package/lib/service/state.d.ts +0 -9
  289. package/lib/service/state.js +0 -20
  290. package/lib/service/state.js.map +0 -1
  291. package/lib/service/walkers/class-walker.d.ts +0 -4
  292. package/lib/service/walkers/class-walker.js +0 -33
  293. package/lib/service/walkers/class-walker.js.map +0 -1
  294. package/lib/service/walkers/enum-walker.d.ts +0 -4
  295. package/lib/service/walkers/enum-walker.js +0 -11
  296. package/lib/service/walkers/enum-walker.js.map +0 -1
  297. package/lib/service/walkers/interface-walker.d.ts +0 -4
  298. package/lib/service/walkers/interface-walker.js +0 -15
  299. package/lib/service/walkers/interface-walker.js.map +0 -1
  300. package/lib/service/walkers/walker-factory.d.ts +0 -5
  301. package/lib/service/walkers/walker-factory.js +0 -21
  302. package/lib/service/walkers/walker-factory.js.map +0 -1
  303. package/lib/service/walkers/walker.d.ts +0 -19
  304. package/lib/service/walkers/walker.js +0 -17
  305. package/lib/service/walkers/walker.js.map +0 -1
  306. package/lib/settings.d.ts +0 -64
  307. package/lib/settings.js +0 -89
  308. package/lib/settings.js.map +0 -1
  309. package/lib/test-helpers/AnnotationBuilder.d.ts +0 -12
  310. package/lib/test-helpers/AnnotationBuilder.js +0 -31
  311. package/lib/test-helpers/AnnotationBuilder.js.map +0 -1
  312. package/lib/test-helpers/ClassMirrorBuilder.d.ts +0 -18
  313. package/lib/test-helpers/ClassMirrorBuilder.js +0 -54
  314. package/lib/test-helpers/ClassMirrorBuilder.js.map +0 -1
  315. package/lib/test-helpers/DocCommentAnnotationBuilder.d.ts +0 -8
  316. package/lib/test-helpers/DocCommentAnnotationBuilder.js +0 -26
  317. package/lib/test-helpers/DocCommentAnnotationBuilder.js.map +0 -1
  318. package/lib/test-helpers/DocCommentBuilder.d.ts +0 -12
  319. package/lib/test-helpers/DocCommentBuilder.js +0 -38
  320. package/lib/test-helpers/DocCommentBuilder.js.map +0 -1
  321. package/lib/test-helpers/FieldMirrorBuilder.d.ts +0 -18
  322. package/lib/test-helpers/FieldMirrorBuilder.js +0 -54
  323. package/lib/test-helpers/FieldMirrorBuilder.js.map +0 -1
  324. package/lib/test-helpers/MethodMirrorBuilder.d.ts +0 -10
  325. package/lib/test-helpers/MethodMirrorBuilder.js +0 -37
  326. package/lib/test-helpers/MethodMirrorBuilder.js.map +0 -1
  327. package/lib/test-helpers/SettingsBuilder.d.ts +0 -8
  328. package/lib/test-helpers/SettingsBuilder.js +0 -27
  329. package/lib/test-helpers/SettingsBuilder.js.map +0 -1
  330. package/lib/transpiler/factory.d.ts +0 -6
  331. package/lib/transpiler/factory.js +0 -32
  332. package/lib/transpiler/factory.js.map +0 -1
  333. package/lib/transpiler/file-container.d.ts +0 -6
  334. package/lib/transpiler/file-container.js +0 -16
  335. package/lib/transpiler/file-container.js.map +0 -1
  336. package/lib/transpiler/generator-choices.d.ts +0 -1
  337. package/lib/transpiler/generator-choices.js +0 -3
  338. package/lib/transpiler/generator-choices.js.map +0 -1
  339. package/lib/transpiler/markdown/class-file-generatorHelper.d.ts +0 -8
  340. package/lib/transpiler/markdown/class-file-generatorHelper.js +0 -56
  341. package/lib/transpiler/markdown/class-file-generatorHelper.js.map +0 -1
  342. package/lib/transpiler/markdown/docsify/docsify-docs-processor.d.ts +0 -6
  343. package/lib/transpiler/markdown/docsify/docsify-docs-processor.js +0 -13
  344. package/lib/transpiler/markdown/docsify/docsify-docs-processor.js.map +0 -1
  345. package/lib/transpiler/markdown/jekyll/jekyll-docsProcessor.d.ts +0 -11
  346. package/lib/transpiler/markdown/jekyll/jekyll-docsProcessor.js +0 -51
  347. package/lib/transpiler/markdown/jekyll/jekyll-docsProcessor.js.map +0 -1
  348. package/lib/transpiler/markdown/markdown-transpiler-base.d.ts +0 -11
  349. package/lib/transpiler/markdown/markdown-transpiler-base.js +0 -24
  350. package/lib/transpiler/markdown/markdown-transpiler-base.js.map +0 -1
  351. package/lib/transpiler/markdown/plain-markdown/plain-docsProcessor.d.ts +0 -6
  352. package/lib/transpiler/markdown/plain-markdown/plain-docsProcessor.js +0 -14
  353. package/lib/transpiler/markdown/plain-markdown/plain-docsProcessor.js.map +0 -1
  354. package/lib/transpiler/openapi/open-api-docs-processor.d.ts +0 -13
  355. package/lib/transpiler/openapi/open-api-docs-processor.js +0 -75
  356. package/lib/transpiler/openapi/open-api-docs-processor.js.map +0 -1
  357. package/lib/transpiler/openapi/parsers/Builder.d.ts +0 -16
  358. package/lib/transpiler/openapi/parsers/Builder.js +0 -30
  359. package/lib/transpiler/openapi/parsers/Builder.js.map +0 -1
  360. package/lib/transpiler/openapi/parsers/MethodParser.d.ts +0 -20
  361. package/lib/transpiler/openapi/parsers/MethodParser.js +0 -167
  362. package/lib/transpiler/openapi/parsers/MethodParser.js.map +0 -1
  363. package/lib/transpiler/openapi/parsers/ParameterObjectBuilder.d.ts +0 -7
  364. package/lib/transpiler/openapi/parsers/ParameterObjectBuilder.js +0 -11
  365. package/lib/transpiler/openapi/parsers/ParameterObjectBuilder.js.map +0 -1
  366. package/lib/transpiler/openapi/parsers/ReferenceBuilder.d.ts +0 -39
  367. package/lib/transpiler/openapi/parsers/ReferenceBuilder.js +0 -226
  368. package/lib/transpiler/openapi/parsers/ReferenceBuilder.js.map +0 -1
  369. package/lib/transpiler/openapi/parsers/RequestBodyBuilder.d.ts +0 -10
  370. package/lib/transpiler/openapi/parsers/RequestBodyBuilder.js +0 -20
  371. package/lib/transpiler/openapi/parsers/RequestBodyBuilder.js.map +0 -1
  372. package/lib/transpiler/openapi/parsers/ResponsesBuilder.d.ts +0 -7
  373. package/lib/transpiler/openapi/parsers/ResponsesBuilder.js +0 -22
  374. package/lib/transpiler/openapi/parsers/ResponsesBuilder.js.map +0 -1
  375. package/lib/transpiler/processor-type-transpiler.d.ts +0 -10
  376. package/lib/transpiler/processor-type-transpiler.js +0 -9
  377. package/lib/transpiler/processor-type-transpiler.js.map +0 -1
  378. package/lib/transpiler/transpiler.d.ts +0 -5
  379. package/lib/transpiler/transpiler.js +0 -27
  380. package/lib/transpiler/transpiler.js.map +0 -1
  381. package/lib/util/error-logger.d.ts +0 -8
  382. package/lib/util/error-logger.js +0 -90
  383. package/lib/util/error-logger.js.map +0 -1
  384. package/lib/util/logger.d.ts +0 -21
  385. package/lib/util/logger.js +0 -58
  386. package/lib/util/logger.js.map +0 -1
  387. package/lib/util/string-utils.d.ts +0 -2
  388. package/lib/util/string-utils.js +0 -15
  389. package/lib/util/string-utils.js.map +0 -1
  390. package/src/model/__tests__/manifest-diff.spec.ts +0 -147
  391. package/src/model/apex-bundle.ts +0 -3
  392. package/src/model/inheritance.ts +0 -7
  393. package/src/model/manifest-diff.ts +0 -94
  394. package/src/model/manifest.ts +0 -74
  395. package/src/model/markdown-file.ts +0 -121
  396. package/src/model/markdown-generation-util/doc-comment-annotation-util.ts +0 -50
  397. package/src/model/markdown-generation-util/field-declaration-util.ts +0 -71
  398. package/src/model/markdown-generation-util/index.ts +0 -3
  399. package/src/model/markdown-generation-util/method-declaration-util.ts +0 -166
  400. package/src/model/markdown-generation-util/type-declaration-util.ts +0 -91
  401. package/src/model/markdown-home-file.ts +0 -58
  402. package/src/model/markdown-type-file.ts +0 -165
  403. package/src/model/openapi/openapi-type-file.ts +0 -14
  404. package/src/model/outputFile.ts +0 -29
  405. package/src/service/__tests__/apex-file-reader.spec.ts +0 -92
  406. package/src/service/apex-file-reader.ts +0 -51
  407. package/src/service/file-system.ts +0 -33
  408. package/src/service/file-writer.ts +0 -34
  409. package/src/service/metadata-processor.ts +0 -16
  410. package/src/service/state.ts +0 -24
  411. package/src/service/walkers/class-walker.ts +0 -30
  412. package/src/service/walkers/enum-walker.ts +0 -7
  413. package/src/service/walkers/interface-walker.ts +0 -12
  414. package/src/service/walkers/walker-factory.ts +0 -19
  415. package/src/service/walkers/walker.ts +0 -42
  416. package/src/settings.ts +0 -147
  417. package/src/transpiler/factory.ts +0 -33
  418. package/src/transpiler/file-container.ts +0 -13
  419. package/src/transpiler/generator-choices.ts +0 -1
  420. package/src/transpiler/markdown/class-file-generatorHelper.ts +0 -58
  421. package/src/transpiler/markdown/docsify/docsify-docs-processor.ts +0 -12
  422. package/src/transpiler/markdown/jekyll/jekyll-docsProcessor.ts +0 -50
  423. package/src/transpiler/markdown/markdown-transpiler-base.ts +0 -28
  424. package/src/transpiler/markdown/plain-markdown/plain-docsProcessor.ts +0 -12
  425. package/src/transpiler/processor-type-transpiler.ts +0 -18
  426. /package/src/{model/__tests__ → core/__test__}/manifest.spec.ts +0 -0
  427. /package/src/{model → core}/openapi/__tests__/open-api.spec.ts +0 -0
  428. /package/src/{model → core}/openapi/apex-doc-types.ts +0 -0
  429. /package/src/{model → core/openapi}/apex-type-wrappers/ClassMirrorWrapper.ts +0 -0
  430. /package/src/{model → core/openapi}/apex-type-wrappers/MethodMirrorWrapper.ts +0 -0
  431. /package/src/{model → core}/openapi/open-api.ts +0 -0
@@ -0,0 +1,461 @@
1
+ import { assertEither, extendExpect } from './expect-extensions';
2
+ import { apexBundleFromRawString, generateDocs } from './test-helpers';
3
+
4
+ describe('Generates interface documentation', () => {
5
+ beforeAll(() => {
6
+ extendExpect();
7
+ });
8
+
9
+ describe('documentation output', () => {
10
+ it('returns the name of the interface', async () => {
11
+ const input = `
12
+ public interface MyInterface {
13
+ }
14
+ `;
15
+
16
+ const result = await generateDocs([apexBundleFromRawString(input)])();
17
+ expect(result).documentationBundleHasLength(1);
18
+ assertEither(result, (data) => expect(data.docs[0].source.name).toBe('MyInterface'));
19
+ });
20
+
21
+ it('returns the type as interface', async () => {
22
+ const input = `
23
+ public interface MyInterface {
24
+ }
25
+ `;
26
+
27
+ const result = await generateDocs([apexBundleFromRawString(input)])();
28
+ expect(result).documentationBundleHasLength(1);
29
+ assertEither(result, (data) => expect(data.docs[0].source.type).toBe('interface'));
30
+ });
31
+
32
+ it('does not return interfaces out of scope', async () => {
33
+ const input1 = `
34
+ global interface MyInterface {}
35
+ `;
36
+
37
+ const input2 = `
38
+ public interface AnotherInterface {}
39
+ `;
40
+
41
+ const result = await generateDocs([apexBundleFromRawString(input1), apexBundleFromRawString(input2)], {
42
+ scope: ['global'],
43
+ })();
44
+ expect(result).documentationBundleHasLength(1);
45
+ });
46
+
47
+ it('does not return interfaces that have an @ignore in the docs', async () => {
48
+ const input = `
49
+ /**
50
+ * @ignore
51
+ */
52
+ public interface MyInterface {}`;
53
+
54
+ const result = await generateDocs([apexBundleFromRawString(input)])();
55
+ expect(result).documentationBundleHasLength(0);
56
+ });
57
+
58
+ it('does not return interface methods that have @ignore in the docs', async () => {
59
+ const input = `
60
+ public interface MyInterface {
61
+ /**
62
+ * @ignore
63
+ */
64
+ void myMethod();
65
+ }`;
66
+
67
+ const result = await generateDocs([apexBundleFromRawString(input)])();
68
+ expect(result).documentationBundleHasLength(1);
69
+ assertEither(result, (data) => expect(data.docs[0].content).not.toContain('myMethod'));
70
+ });
71
+ });
72
+
73
+ describe('documentation content', () => {
74
+ describe('type level information', () => {
75
+ it('generates a heading with the interface name', async () => {
76
+ const input = `
77
+ public interface MyInterface {}
78
+ `;
79
+
80
+ const output = `# MyInterface Interface`;
81
+ const result = await generateDocs([apexBundleFromRawString(input)])();
82
+ expect(result).documentationBundleHasLength(1);
83
+ assertEither(result, (data) => expect(data).firstDocContains(output));
84
+ });
85
+
86
+ it('displays type level annotations', async () => {
87
+ const input = `
88
+ @NamespaceAccessible
89
+ public interface MyInterface {
90
+ @Deprecated
91
+ void myMethod();
92
+ }
93
+ `;
94
+
95
+ const result = await generateDocs([apexBundleFromRawString(input)])();
96
+ expect(result).documentationBundleHasLength(1);
97
+ assertEither(result, (data) => expect(data).firstDocContains('NAMESPACEACCESSIBLE'));
98
+ assertEither(result, (data) => expect(data).firstDocContains('DEPRECATED'));
99
+ });
100
+
101
+ it('displays the description', async () => {
102
+ const input = `
103
+ /**
104
+ * This is a description
105
+ */
106
+ public interface MyInterface {}
107
+ `;
108
+
109
+ const result = await generateDocs([apexBundleFromRawString(input)])();
110
+ expect(result).documentationBundleHasLength(1);
111
+ assertEither(result, (data) => expect(data).firstDocContains('This is a description'));
112
+ });
113
+
114
+ it('display custom documentation tags', async () => {
115
+ const input = `
116
+ /**
117
+ * @custom-tag My Value
118
+ */
119
+ public interface MyInterface {}
120
+ `;
121
+
122
+ const result = await generateDocs([apexBundleFromRawString(input)])();
123
+ expect(result).documentationBundleHasLength(1);
124
+ assertEither(result, (data) => expect(data).firstDocContains('Custom Tag'));
125
+ assertEither(result, (data) => expect(data).firstDocContains('My Value'));
126
+ });
127
+
128
+ it('displays the group', async () => {
129
+ const input = `
130
+ /**
131
+ * @group MyGroup
132
+ */
133
+ public interface MyInterface {}`;
134
+
135
+ const result = await generateDocs([apexBundleFromRawString(input)])();
136
+ expect(result).documentationBundleHasLength(1);
137
+ assertEither(result, (data) => expect(data).firstDocContains('Group'));
138
+ assertEither(result, (data) => expect(data).firstDocContains('MyGroup'));
139
+ });
140
+
141
+ it('displays the author', async () => {
142
+ const input = `
143
+ /**
144
+ * @author John Doe
145
+ */
146
+ public interface MyInterface {}`;
147
+
148
+ const result = await generateDocs([apexBundleFromRawString(input)])();
149
+ expect(result).documentationBundleHasLength(1);
150
+ assertEither(result, (data) => expect(data).firstDocContains('Author'));
151
+ assertEither(result, (data) => expect(data).firstDocContains('John Doe'));
152
+ });
153
+
154
+ it('displays the date', async () => {
155
+ const input = `
156
+ /**
157
+ * @date 2021-01-01
158
+ */
159
+ public interface MyInterface {}`;
160
+
161
+ const result = await generateDocs([apexBundleFromRawString(input)])();
162
+ expect(result).documentationBundleHasLength(1);
163
+ assertEither(result, (data) => expect(data).firstDocContains('Date'));
164
+ assertEither(result, (data) => expect(data).firstDocContains('2021-01-01'));
165
+ });
166
+
167
+ it('displays descriptions', async () => {
168
+ const input = `
169
+ /**
170
+ * @description This is a description
171
+ */
172
+ public interface MyInterface {}`;
173
+
174
+ const result = await generateDocs([apexBundleFromRawString(input)])();
175
+ expect(result).documentationBundleHasLength(1);
176
+ assertEither(result, (data) => expect(data).firstDocContains('This is a description'));
177
+ });
178
+
179
+ it('displays descriptions with links', async () => {
180
+ const input1 = `
181
+ /**
182
+ * @description This is a description with a {@link InterfaceRef} reference
183
+ */
184
+ public enum MyInterface {}
185
+ `;
186
+
187
+ const input2 = 'public interface InterfaceRef {}';
188
+
189
+ const result = await generateDocs([apexBundleFromRawString(input1), apexBundleFromRawString(input2)])();
190
+ expect(result).documentationBundleHasLength(2);
191
+ assertEither(result, (data) =>
192
+ expect(data).firstDocContains('This is a description with a [InterfaceRef](InterfaceRef.md) reference'),
193
+ );
194
+ });
195
+
196
+ it('displays descriptions with emails', async () => {
197
+ const input = `
198
+ /**
199
+ * @description This is a description with an {@email test@testerson.com} email
200
+ */
201
+ public interface MyInterface {}
202
+ `;
203
+
204
+ const result = await generateDocs([apexBundleFromRawString(input)])();
205
+ expect(result).documentationBundleHasLength(1);
206
+ assertEither(result, (data) =>
207
+ expect(data).firstDocContains(
208
+ 'This is a description with an [test@testerson.com](mailto:test@testerson.com) email',
209
+ ),
210
+ );
211
+ });
212
+
213
+ it('displays sees with accurately resolved links', async () => {
214
+ const input1 = `
215
+ /**
216
+ * @see InterfaceRef
217
+ */
218
+ public interface MyInterface {}
219
+ `;
220
+
221
+ const input2 = 'public interface InterfaceRef {}';
222
+
223
+ const result = await generateDocs([apexBundleFromRawString(input1), apexBundleFromRawString(input2)])();
224
+ expect(result).documentationBundleHasLength(2);
225
+ assertEither(result, (data) => expect(data).firstDocContains('See'));
226
+ assertEither(result, (data) => expect(data).firstDocContains('[InterfaceRef](InterfaceRef.md)'));
227
+ });
228
+
229
+ it('displays sees without links when the reference is not found', async () => {
230
+ const input = `
231
+ /**
232
+ * @see InterfaceRef
233
+ */
234
+ public interface MyInterface {}
235
+ `;
236
+
237
+ const result = await generateDocs([apexBundleFromRawString(input)])();
238
+ expect(result).documentationBundleHasLength(1);
239
+ assertEither(result, (data) => expect(data).firstDocContains('See'));
240
+ assertEither(result, (data) => expect(data).firstDocContains('InterfaceRef'));
241
+ });
242
+
243
+ it('displays the namespace if present in the config', async () => {
244
+ const input = 'public interface MyInterface {}';
245
+
246
+ const result = await generateDocs([apexBundleFromRawString(input)], { namespace: 'MyNamespace' })();
247
+ expect(result).documentationBundleHasLength(1);
248
+ assertEither(result, (data) => expect(data).firstDocContains('## Namespace'));
249
+ assertEither(result, (data) => expect(data).firstDocContains('MyNamespace'));
250
+ });
251
+
252
+ it('does not display the namespace if not present in the config', async () => {
253
+ const input = 'public interface MyInterface {}';
254
+
255
+ const result = await generateDocs([apexBundleFromRawString(input)])();
256
+ expect(result).documentationBundleHasLength(1);
257
+ assertEither(result, (data) => expect(data).firstDocContainsNot('## Namespace'));
258
+ });
259
+
260
+ it('displays a mermaid diagram', async () => {
261
+ const input = `
262
+ /**
263
+ * @mermaid
264
+ * \`\`\`mermaid
265
+ * graph TD
266
+ * A[Square Rect] -- Link text --> B((Circle))
267
+ * A --> C(Round Rect)
268
+ * B --> D{Rhombus}
269
+ * C --> D
270
+ * \`\`\`
271
+ */
272
+ public interface MyInterface {}
273
+ `;
274
+
275
+ const result = await generateDocs([apexBundleFromRawString(input)])();
276
+ expect(result).documentationBundleHasLength(1);
277
+ assertEither(result, (data) => expect(data).firstDocContains('```mermaid'));
278
+ assertEither(result, (data) => expect(data).firstDocContains('graph TD'));
279
+ });
280
+
281
+ it('displays an example code block', async () => {
282
+ const input = `
283
+ /**
284
+ * @example
285
+ * \`\`\`apex
286
+ * public class MyClass {
287
+ * public void myMethod() {
288
+ * System.debug('Hello, World!');
289
+ * }
290
+ * }
291
+ * \`\`\`
292
+ */
293
+ public interface MyInterface {}`;
294
+
295
+ const result = await generateDocs([apexBundleFromRawString(input)])();
296
+ expect(result).documentationBundleHasLength(1);
297
+ assertEither(result, (data) => expect(data).firstDocContains('```apex'));
298
+ assertEither(result, (data) => expect(data).firstDocContains('public class MyClass'));
299
+ });
300
+ });
301
+
302
+ describe('method information', () => {
303
+ it('displays the Method heading', async () => {
304
+ const input = `
305
+ public interface MyInterface {
306
+ void myMethod();
307
+ }
308
+ `;
309
+
310
+ const result = await generateDocs([apexBundleFromRawString(input)])();
311
+ expect(result).documentationBundleHasLength(1);
312
+ assertEither(result, (data) => expect(data).firstDocContains('## Methods'));
313
+ });
314
+
315
+ it('displays methods sorted if sortMembersAlphabetically is true', async () => {
316
+ const input = `
317
+ public interface MyInterface {
318
+ void myMethod();
319
+ void anotherMethod();
320
+ }
321
+ `;
322
+
323
+ const result = await generateDocs([apexBundleFromRawString(input)], { sortMembersAlphabetically: true })();
324
+ expect(result).documentationBundleHasLength(1);
325
+ assertEither(result, (data) => {
326
+ expect(data.docs[0].content.indexOf('anotherMethod')).toBeLessThan(data.docs[0].content.indexOf('myMethod'));
327
+ });
328
+ });
329
+
330
+ it('does not display methods sorted if sortMembersAlphabetically is false', async () => {
331
+ const input = `
332
+ public interface MyInterface {
333
+ void myMethod();
334
+ void anotherMethod();
335
+ }
336
+ `;
337
+
338
+ const result = await generateDocs([apexBundleFromRawString(input)], { sortMembersAlphabetically: false })();
339
+ expect(result).documentationBundleHasLength(1);
340
+ assertEither(result, (data) => {
341
+ expect(data.docs[0].content.indexOf('myMethod')).toBeLessThan(data.docs[0].content.indexOf('anotherMethod'));
342
+ });
343
+ });
344
+
345
+ it('supports having mermaid diagrams in method descriptions', async () => {
346
+ const input = `
347
+ public interface MyInterface {
348
+ /**
349
+ * @mermaid
350
+ * \`\`\`mermaid
351
+ * graph TD
352
+ * A[Square Rect] -- Link text --> B((Circle))
353
+ * A --> C(Round Rect)
354
+ * B --> D{Rhombus}
355
+ * C --> D
356
+ * \`\`\`
357
+ */
358
+ void myMethod();
359
+ }
360
+ `;
361
+
362
+ const result = await generateDocs([apexBundleFromRawString(input)])();
363
+ expect(result).documentationBundleHasLength(1);
364
+ assertEither(result, (data) => expect(data).firstDocContains('```mermaid'));
365
+ assertEither(result, (data) => expect(data).firstDocContains('graph TD'));
366
+ });
367
+
368
+ it('supports having example code blocks in method descriptions', async () => {
369
+ const input = `
370
+ public interface MyInterface {
371
+ /**
372
+ * @example
373
+ * public class MyClass {
374
+ * public void myMethod() {
375
+ * System.debug('Hello, World!');
376
+ * }
377
+ * }
378
+ */
379
+ void myMethod();
380
+ }
381
+ `;
382
+
383
+ const result = await generateDocs([apexBundleFromRawString(input)])();
384
+ expect(result).documentationBundleHasLength(1);
385
+ assertEither(result, (data) => expect(data).firstDocContains('```apex'));
386
+ assertEither(result, (data) => expect(data).firstDocContains('public class MyClass'));
387
+ });
388
+
389
+ it('has a signature section', async () => {
390
+ const input = `
391
+ public interface MyInterface {
392
+ void myMethod();
393
+ }
394
+ `;
395
+
396
+ const result = await generateDocs([apexBundleFromRawString(input)])();
397
+ expect(result).documentationBundleHasLength(1);
398
+ assertEither(result, (data) => expect(data).firstDocContains('### Signature'));
399
+ });
400
+
401
+ it('has a parameters section', async () => {
402
+ const input = `
403
+ public interface MyInterface {
404
+ void myMethod(String param1, Integer param2);
405
+ }
406
+ `;
407
+
408
+ const result = await generateDocs([apexBundleFromRawString(input)])();
409
+ expect(result).documentationBundleHasLength(1);
410
+ assertEither(result, (data) => expect(data).firstDocContains('### Parameters'));
411
+ });
412
+
413
+ it('has a return type section', async () => {
414
+ const input = `
415
+ public interface MyInterface {
416
+ String myMethod();
417
+ }
418
+ `;
419
+
420
+ const result = await generateDocs([apexBundleFromRawString(input)])();
421
+ expect(result).documentationBundleHasLength(1);
422
+ assertEither(result, (data) => expect(data).firstDocContains('### Return Type'));
423
+ });
424
+
425
+ it('has a throws section', async () => {
426
+ const input = `
427
+ public interface MyInterface {
428
+ /**
429
+ * @throws MyException
430
+ */
431
+ void myMethod();
432
+ }
433
+ `;
434
+
435
+ const result = await generateDocs([apexBundleFromRawString(input)])();
436
+ expect(result).documentationBundleHasLength(1);
437
+ assertEither(result, (data) => expect(data).firstDocContains('### Throws'));
438
+ });
439
+
440
+ it('displays an "inherited" tag if the method was inherited from a different interface', async () => {
441
+ const input1 = `
442
+ public interface MyInterface {
443
+ void myMethod();
444
+ }
445
+ `;
446
+
447
+ const input2 = `
448
+ public interface AnotherInterface extends MyInterface {}
449
+ `;
450
+
451
+ const result = await generateDocs([apexBundleFromRawString(input1), apexBundleFromRawString(input2)])();
452
+ expect(result).documentationBundleHasLength(2);
453
+ assertEither(result, (data) =>
454
+ expect(data.docs.find((doc) => doc.outputDocPath.includes('AnotherInterface'))?.content).toContain(
455
+ 'Inherited',
456
+ ),
457
+ );
458
+ });
459
+ });
460
+ });
461
+ });
@@ -0,0 +1,180 @@
1
+ import { assertEither, extendExpect } from './expect-extensions';
2
+ import { pipe } from 'fp-ts/function';
3
+ import * as E from 'fp-ts/Either';
4
+ import { apexBundleFromRawString, generateDocs } from './test-helpers';
5
+ import { ReferenceGuidePageData } from '../../shared/types';
6
+
7
+ describe('Generates a Reference Guide', () => {
8
+ beforeAll(() => {
9
+ extendExpect();
10
+ });
11
+
12
+ it('returns a reference guide with links to all other files', async () => {
13
+ const input1 = `
14
+ public enum MyEnum {
15
+ VALUE1,
16
+ VALUE2
17
+ }
18
+ `;
19
+
20
+ const input2 = `
21
+ public class MyClass {}
22
+ `;
23
+
24
+ const result = await generateDocs([apexBundleFromRawString(input1), apexBundleFromRawString(input2)])();
25
+ expect(result).documentationBundleHasLength(2);
26
+
27
+ assertEither(result, (data) =>
28
+ expect((data.referenceGuide as ReferenceGuidePageData).content).toContain('[MyEnum](miscellaneous/MyEnum.md)'),
29
+ );
30
+ assertEither(result, (data) =>
31
+ expect((data.referenceGuide as ReferenceGuidePageData).content).toContain('[MyClass](miscellaneous/MyClass.md)'),
32
+ );
33
+ });
34
+
35
+ it('groups things under Miscellaneous if no group is provided', async () => {
36
+ const input = `
37
+ public enum MyEnum {
38
+ VALUE1,
39
+ VALUE2
40
+ }
41
+ `;
42
+
43
+ const result = await generateDocs([apexBundleFromRawString(input)])();
44
+ expect(result).documentationBundleHasLength(1);
45
+ assertEither(result, (data) =>
46
+ expect((data.referenceGuide as ReferenceGuidePageData).content).toContain('## Miscellaneous'),
47
+ );
48
+ });
49
+
50
+ it('group things under the provided group', async () => {
51
+ const input = `
52
+ /**
53
+ * @group MyGroup
54
+ */
55
+ public enum MyEnum {
56
+ VALUE1,
57
+ VALUE2
58
+ }
59
+ `;
60
+
61
+ const result = await generateDocs([apexBundleFromRawString(input)])();
62
+ expect(result).documentationBundleHasLength(1);
63
+ assertEither(result, (data) =>
64
+ expect((data.referenceGuide as ReferenceGuidePageData).content).toContain('## MyGroup'),
65
+ );
66
+ });
67
+
68
+ it('displays groups in alphabetical order', async () => {
69
+ const input1 = `
70
+ /**
71
+ * @group ZGroup
72
+ */
73
+ public enum MyEnum {
74
+ VALUE1,
75
+ VALUE2
76
+ }
77
+ `;
78
+
79
+ const input2 = `
80
+ /**
81
+ * @group AGroup
82
+ */
83
+ public class MyClass {}
84
+ `;
85
+
86
+ const result = await generateDocs([apexBundleFromRawString(input1), apexBundleFromRawString(input2)])();
87
+ expect(result).documentationBundleHasLength(2);
88
+ pipe(
89
+ result,
90
+ E.map((data) => ({
91
+ aGroupIndex: (data.referenceGuide as ReferenceGuidePageData).content.indexOf('## AGroup'),
92
+ zGroupIndex: (data.referenceGuide as ReferenceGuidePageData).content.indexOf('## ZGroup'),
93
+ })),
94
+ E.match(
95
+ () => fail('Expected data'),
96
+ (data) => expect(data.aGroupIndex).toBeLessThan(data.zGroupIndex),
97
+ ),
98
+ );
99
+ });
100
+
101
+ it('displays references within groups in alphabetical order', async () => {
102
+ const input1 = `
103
+ /**
104
+ * @group Group1
105
+ */
106
+ public enum MyEnum {
107
+ VALUE1,
108
+ VALUE2
109
+ }
110
+ `;
111
+
112
+ const input2 = `
113
+ /**
114
+ * @group Group1
115
+ */
116
+ public class MyClass {}
117
+ `;
118
+
119
+ const result = await generateDocs([apexBundleFromRawString(input1), apexBundleFromRawString(input2)])();
120
+ expect(result).documentationBundleHasLength(2);
121
+ assertEither(result, (data) =>
122
+ expect((data.referenceGuide as ReferenceGuidePageData).content).toContain('## Group1'),
123
+ );
124
+ assertEither(result, (data) =>
125
+ expect((data.referenceGuide as ReferenceGuidePageData).content).toContain('MyClass'),
126
+ );
127
+ assertEither(result, (data) => expect((data.referenceGuide as ReferenceGuidePageData).content).toContain('MyEnum'));
128
+ });
129
+
130
+ it('returns a reference guide with descriptions', async () => {
131
+ const input1 = `
132
+ /**
133
+ * @description This is a description
134
+ */
135
+ public enum MyEnum {
136
+ VALUE1,
137
+ VALUE2
138
+ }
139
+ `;
140
+
141
+ const input2 = `
142
+ /**
143
+ * @description This is a description
144
+ */
145
+ public class MyClass {}
146
+ `;
147
+
148
+ const result = await generateDocs([apexBundleFromRawString(input1), apexBundleFromRawString(input2)])();
149
+ expect(result).documentationBundleHasLength(2);
150
+ assertEither(result, (data) =>
151
+ expect((data.referenceGuide as ReferenceGuidePageData).content).toContain('This is a description'),
152
+ );
153
+ });
154
+
155
+ it('returns a reference guide with descriptions with links to all other files', async () => {
156
+ const input1 = `
157
+ /**
158
+ * @description This is a description with a {@link MyClass}
159
+ * @group Group1
160
+ */
161
+ public enum MyEnum {
162
+ VALUE1,
163
+ VALUE2
164
+ }
165
+ `;
166
+
167
+ const input2 = `
168
+ /**
169
+ * @group Group2
170
+ */
171
+ public class MyClass {}
172
+ `;
173
+
174
+ const result = await generateDocs([apexBundleFromRawString(input1), apexBundleFromRawString(input2)])();
175
+ expect(result).documentationBundleHasLength(2);
176
+ assertEither(result, (data) =>
177
+ expect((data.referenceGuide as ReferenceGuidePageData).content).toContain('with a [MyClass](group2/MyClass.md)'),
178
+ );
179
+ });
180
+ });
@@ -0,0 +1,54 @@
1
+ import { ClassMirrorBuilder } from '../../../test-helpers/ClassMirrorBuilder';
2
+ import { createInheritanceChain } from '../reflection/inheritance-chain';
3
+
4
+ describe('inheritance chain for classes', () => {
5
+ test('returns an empty list of the class does not extend any other class', () => {
6
+ const classMirror = new ClassMirrorBuilder().build();
7
+ const repository = [classMirror];
8
+
9
+ const inheritanceChain = createInheritanceChain(repository, classMirror);
10
+
11
+ expect(inheritanceChain).toEqual([]);
12
+ });
13
+
14
+ test('returns the name of the extended class if it is not found in the repository', () => {
15
+ const classMirror = new ClassMirrorBuilder().withExtendedClass('ExtendedClass').build();
16
+ const repository = [classMirror];
17
+
18
+ const inheritanceChain = createInheritanceChain(repository, classMirror);
19
+
20
+ expect(inheritanceChain).toEqual(['ExtendedClass']);
21
+ });
22
+
23
+ test('returns the extended class when it is present in the repository', () => {
24
+ const classMirror = new ClassMirrorBuilder().withExtendedClass('ExtendedClass').build();
25
+ const extendedClass = new ClassMirrorBuilder().withName('ExtendedClass').build();
26
+ const repository = [classMirror, extendedClass];
27
+
28
+ const inheritanceChain = createInheritanceChain(repository, classMirror);
29
+
30
+ expect(inheritanceChain).toEqual(['ExtendedClass']);
31
+ });
32
+
33
+ test('returns the full inheritance chain when the extended class is also extended', () => {
34
+ const classMirror = new ClassMirrorBuilder().withExtendedClass('ExtendedClass').build();
35
+ const extendedClass = new ClassMirrorBuilder().withName('ExtendedClass').withExtendedClass('SuperClass').build();
36
+ const superClass = new ClassMirrorBuilder().withName('SuperClass').build();
37
+ const repository = [classMirror, extendedClass, superClass];
38
+
39
+ const inheritanceChain = createInheritanceChain(repository, classMirror);
40
+
41
+ expect(inheritanceChain).toEqual(['ExtendedClass', 'SuperClass']);
42
+ });
43
+
44
+ test('returns the inheritance for a class that extends an inner class', () => {
45
+ const classMirror = new ClassMirrorBuilder().withExtendedClass('OuterClass.InnerClass').build();
46
+ const innerClass = new ClassMirrorBuilder().withName('InnerClass').build();
47
+ const outerClass = new ClassMirrorBuilder().withName('OuterClass').addInnerClass(innerClass).build();
48
+ const repository = [classMirror, outerClass];
49
+
50
+ const inheritanceChain = createInheritanceChain(repository, classMirror);
51
+
52
+ expect(inheritanceChain).toEqual(['OuterClass.InnerClass']);
53
+ });
54
+ });