@cparra/apexdocs 2.25.0-alpha.0 → 2.25.0-alpha.1

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 (191) hide show
  1. package/__mocks__/chalk.js +12 -0
  2. package/__mocks__/log-update.js +6 -0
  3. package/eslint.config.mjs +10 -0
  4. package/examples/plain-markdown/docs/Miscellaneous/ns.BaseClass.md +16 -0
  5. package/examples/plain-markdown/docs/Miscellaneous/ns.ParentInterface.md +15 -0
  6. package/examples/plain-markdown/docs/Miscellaneous/ns.ReferencedEnum.md +8 -0
  7. package/examples/plain-markdown/docs/Miscellaneous/ns.SampleException.md +7 -0
  8. package/examples/plain-markdown/docs/Miscellaneous/ns.SampleInterface.md +115 -0
  9. package/examples/plain-markdown/docs/Sample-Enums/ns.SampleEnum.md +36 -0
  10. package/examples/plain-markdown/docs/SampleGroup/ns.SampleClass.md +173 -0
  11. package/examples/plain-markdown/docs/index.md +36 -0
  12. package/examples/plain-markdown/force-app/classes/SampleClass.cls +37 -0
  13. package/examples/plain-markdown/package.json +2 -6
  14. package/jest.config.js +4 -0
  15. package/jest.d.ts +7 -0
  16. package/lib/__spec__/core/expect-extensions.d.ts +3 -0
  17. package/lib/__spec__/core/expect-extensions.js +54 -0
  18. package/lib/__spec__/core/expect-extensions.js.map +1 -0
  19. package/lib/__spec__/core/generating-class-docs.spec.d.ts +1 -0
  20. package/lib/__spec__/core/generating-class-docs.spec.js +427 -0
  21. package/lib/__spec__/core/generating-class-docs.spec.js.map +1 -0
  22. package/lib/__spec__/core/generating-enum-docs.spec.d.ts +1 -0
  23. package/lib/__spec__/core/generating-enum-docs.spec.js +303 -0
  24. package/lib/__spec__/core/generating-enum-docs.spec.js.map +1 -0
  25. package/lib/__spec__/core/generating-interface-docs.spec.d.ts +1 -0
  26. package/lib/__spec__/core/generating-interface-docs.spec.js +361 -0
  27. package/lib/__spec__/core/generating-interface-docs.spec.js.map +1 -0
  28. package/lib/__spec__/core/generating-reference-guide.spec.d.ts +1 -0
  29. package/lib/__spec__/core/generating-reference-guide.spec.js +161 -0
  30. package/lib/__spec__/core/generating-reference-guide.spec.js.map +1 -0
  31. package/lib/adapters/apex-types.d.ts +7 -5
  32. package/lib/adapters/apex-types.js +99 -21
  33. package/lib/adapters/apex-types.js.map +1 -1
  34. package/lib/adapters/documentables.d.ts +4 -3
  35. package/lib/adapters/documentables.js +23 -8
  36. package/lib/adapters/documentables.js.map +1 -1
  37. package/lib/adapters/fields-and-properties.d.ts +4 -3
  38. package/lib/adapters/fields-and-properties.js +26 -4
  39. package/lib/adapters/fields-and-properties.js.map +1 -1
  40. package/lib/adapters/methods-and-constructors.d.ts +4 -3
  41. package/lib/adapters/methods-and-constructors.js +52 -9
  42. package/lib/adapters/methods-and-constructors.js.map +1 -1
  43. package/lib/adapters/references.d.ts +1 -1
  44. package/lib/adapters/references.js +3 -3
  45. package/lib/adapters/references.js.map +1 -1
  46. package/lib/adapters/type-utils.d.ts +1 -1
  47. package/lib/adapters/type-utils.js +1 -2
  48. package/lib/adapters/type-utils.js.map +1 -1
  49. package/lib/application/Apexdocs.js.map +1 -1
  50. package/lib/cli/generate.js +7 -7
  51. package/lib/cli/generate.js.map +1 -1
  52. package/lib/core/generate-docs.d.ts +23 -0
  53. package/lib/core/generate-docs.js +241 -0
  54. package/lib/core/generate-docs.js.map +1 -0
  55. package/lib/core/template.d.ts +10 -0
  56. package/lib/core/template.js +92 -0
  57. package/lib/core/template.js.map +1 -0
  58. package/lib/core/templates/reference-guide.d.ts +1 -0
  59. package/lib/core/templates/reference-guide.js +18 -0
  60. package/lib/core/templates/reference-guide.js.map +1 -0
  61. package/lib/index.d.ts +2 -1
  62. package/lib/index.js +14 -3
  63. package/lib/index.js.map +1 -1
  64. package/lib/model/manifest.js +8 -2
  65. package/lib/model/manifest.js.map +1 -1
  66. package/lib/model/markdown-file.d.ts +2 -2
  67. package/lib/model/markdown-file.js +5 -4
  68. package/lib/model/markdown-file.js.map +1 -1
  69. package/lib/model/markdown-generation-util/doc-comment-annotation-util.js +3 -4
  70. package/lib/model/markdown-generation-util/doc-comment-annotation-util.js.map +1 -1
  71. package/lib/model/markdown-generation-util/field-declaration-util.js +1 -2
  72. package/lib/model/markdown-generation-util/field-declaration-util.js.map +1 -1
  73. package/lib/model/markdown-generation-util/method-declaration-util.js +2 -3
  74. package/lib/model/markdown-generation-util/method-declaration-util.js.map +1 -1
  75. package/lib/model/markdown-generation-util/type-declaration-util.js +1 -2
  76. package/lib/model/markdown-generation-util/type-declaration-util.js.map +1 -1
  77. package/lib/model/markdown-home-file.js.map +1 -1
  78. package/lib/model/markdown-type-file.js.map +1 -1
  79. package/lib/model/openapi/open-api.js.map +1 -1
  80. package/lib/model/outputFile.d.ts +1 -1
  81. package/lib/model/outputFile.js +2 -9
  82. package/lib/model/outputFile.js.map +1 -1
  83. package/lib/model/types-repository.js.map +1 -1
  84. package/lib/service/apex-file-reader.js.map +1 -1
  85. package/lib/service/file-writer.js.map +1 -1
  86. package/lib/service/manifest-factory.js +1 -2
  87. package/lib/service/manifest-factory.js.map +1 -1
  88. package/lib/service/metadata-processor.js.map +1 -1
  89. package/lib/service/parser.js +1 -1
  90. package/lib/service/parser.js.map +1 -1
  91. package/lib/service/state.js.map +1 -1
  92. package/lib/service/walkers/class-walker.js.map +1 -1
  93. package/lib/service/walkers/interface-walker.js.map +1 -1
  94. package/lib/service/walkers/walker-factory.js.map +1 -1
  95. package/lib/service/walkers/walker.js.map +1 -1
  96. package/lib/settings.d.ts +0 -6
  97. package/lib/settings.js +0 -11
  98. package/lib/settings.js.map +1 -1
  99. package/lib/transpiler/factory.js.map +1 -1
  100. package/lib/transpiler/markdown/class-file-generatorHelper.d.ts +1 -1
  101. package/lib/transpiler/markdown/class-file-generatorHelper.js.map +1 -1
  102. package/lib/transpiler/markdown/jekyll/jekyll-docsProcessor.js.map +1 -1
  103. package/lib/transpiler/markdown/plain-markdown/class-template.js +51 -10
  104. package/lib/transpiler/markdown/plain-markdown/class-template.js.map +1 -1
  105. package/lib/transpiler/markdown/plain-markdown/constructors-partial-template.js +13 -16
  106. package/lib/transpiler/markdown/plain-markdown/constructors-partial-template.js.map +1 -1
  107. package/lib/transpiler/markdown/plain-markdown/documentable-partial-template.js +11 -8
  108. package/lib/transpiler/markdown/plain-markdown/documentable-partial-template.js.map +1 -1
  109. package/lib/transpiler/markdown/plain-markdown/enum-template.js +7 -6
  110. package/lib/transpiler/markdown/plain-markdown/enum-template.js.map +1 -1
  111. package/lib/transpiler/markdown/plain-markdown/fieldsPartialTemplate.js +9 -6
  112. package/lib/transpiler/markdown/plain-markdown/fieldsPartialTemplate.js.map +1 -1
  113. package/lib/transpiler/markdown/plain-markdown/grouped-members-partial-template.d.ts +1 -0
  114. package/lib/transpiler/markdown/plain-markdown/grouped-members-partial-template.js +10 -0
  115. package/lib/transpiler/markdown/plain-markdown/grouped-members-partial-template.js.map +1 -0
  116. package/lib/transpiler/markdown/plain-markdown/interface-template.js +4 -4
  117. package/lib/transpiler/markdown/plain-markdown/methods-partial-template.js +18 -20
  118. package/lib/transpiler/markdown/plain-markdown/methods-partial-template.js.map +1 -1
  119. package/lib/transpiler/markdown/plain-markdown/plain-docsProcessor.d.ts +0 -4
  120. package/lib/transpiler/markdown/plain-markdown/plain-docsProcessor.js +6 -86
  121. package/lib/transpiler/markdown/plain-markdown/plain-docsProcessor.js.map +1 -1
  122. package/lib/transpiler/markdown/plain-markdown/type-doc-partial.d.ts +1 -0
  123. package/lib/transpiler/markdown/plain-markdown/type-doc-partial.js +31 -0
  124. package/lib/transpiler/markdown/plain-markdown/type-doc-partial.js.map +1 -0
  125. package/lib/transpiler/openapi/open-api-docs-processor.js.map +1 -1
  126. package/lib/transpiler/openapi/parsers/Builder.js.map +1 -1
  127. package/lib/transpiler/openapi/parsers/MethodParser.js.map +1 -1
  128. package/lib/transpiler/openapi/parsers/ReferenceBuilder.js +3 -2
  129. package/lib/transpiler/openapi/parsers/ReferenceBuilder.js.map +1 -1
  130. package/lib/transpiler/openapi/parsers/ResponsesBuilder.js.map +1 -1
  131. package/lib/transpiler/transpiler.js.map +1 -1
  132. package/lib/util/error-logger.js.map +1 -1
  133. package/lib/util/logger.js.map +1 -1
  134. package/lib/util/string-utils.js +2 -2
  135. package/lib/util/string-utils.js.map +1 -1
  136. package/package.json +19 -19
  137. package/src/__spec__/core/expect-extensions.ts +32 -0
  138. package/src/__spec__/core/generating-class-docs.spec.ts +511 -0
  139. package/src/__spec__/core/generating-enum-docs.spec.ts +355 -0
  140. package/src/__spec__/core/generating-interface-docs.spec.ts +431 -0
  141. package/src/__spec__/core/generating-reference-guide.spec.ts +163 -0
  142. package/src/adapters/__tests__/interface-adapter.spec.ts +15 -11
  143. package/src/adapters/__tests__/references.spec.ts +1 -1
  144. package/src/adapters/apex-types.ts +196 -39
  145. package/src/adapters/documentables.ts +44 -9
  146. package/src/adapters/fields-and-properties.ts +31 -7
  147. package/src/adapters/methods-and-constructors.ts +57 -18
  148. package/src/adapters/references.ts +1 -1
  149. package/src/adapters/type-utils.ts +1 -1
  150. package/src/cli/generate.ts +96 -96
  151. package/src/core/generate-docs.ts +357 -0
  152. package/src/core/renderable/types.d.ts +131 -0
  153. package/src/core/template.ts +108 -0
  154. package/src/core/templates/reference-guide.ts +14 -0
  155. package/src/index.ts +3 -1
  156. package/src/model/manifest.ts +12 -2
  157. package/src/model/markdown-file.ts +5 -4
  158. package/src/model/markdown-generation-util/doc-comment-annotation-util.ts +1 -1
  159. package/src/model/markdown-generation-util/method-declaration-util.ts +1 -1
  160. package/src/model/outputFile.ts +2 -11
  161. package/src/service/parser.ts +1 -1
  162. package/src/settings.ts +0 -15
  163. package/src/transpiler/markdown/class-file-generatorHelper.ts +1 -1
  164. package/src/transpiler/markdown/plain-markdown/class-template.ts +51 -10
  165. package/src/transpiler/markdown/plain-markdown/constructors-partial-template.ts +13 -16
  166. package/src/transpiler/markdown/plain-markdown/documentable-partial-template.ts +11 -8
  167. package/src/transpiler/markdown/plain-markdown/enum-template.ts +7 -6
  168. package/src/transpiler/markdown/plain-markdown/fieldsPartialTemplate.ts +9 -6
  169. package/src/transpiler/markdown/plain-markdown/grouped-members-partial-template.ts +6 -0
  170. package/src/transpiler/markdown/plain-markdown/interface-template.ts +4 -4
  171. package/src/transpiler/markdown/plain-markdown/methods-partial-template.ts +18 -20
  172. package/src/transpiler/markdown/plain-markdown/plain-docsProcessor.ts +8 -100
  173. package/src/transpiler/markdown/plain-markdown/type-doc-partial.ts +27 -0
  174. package/src/transpiler/openapi/parsers/ReferenceBuilder.ts +3 -2
  175. package/tsconfig.json +1 -1
  176. package/.eslintrc.js +0 -12
  177. package/examples/plain-markdown/README.md +0 -301
  178. package/lib/templating/compile.d.ts +0 -7
  179. package/lib/templating/compile.js +0 -98
  180. package/lib/templating/compile.js.map +0 -1
  181. package/lib/templating/helpers.d.ts +0 -2
  182. package/lib/templating/helpers.js +0 -18
  183. package/lib/templating/helpers.js.map +0 -1
  184. package/lib/transpiler/markdown/plain-markdown/type-level-apex-doc-partial-template.d.ts +0 -1
  185. package/lib/transpiler/markdown/plain-markdown/type-level-apex-doc-partial-template.js +0 -31
  186. package/lib/transpiler/markdown/plain-markdown/type-level-apex-doc-partial-template.js.map +0 -1
  187. package/src/templating/__tests__/compile.spec.ts +0 -741
  188. package/src/templating/compile.ts +0 -187
  189. package/src/templating/helpers.ts +0 -14
  190. package/src/templating/types.d.ts +0 -104
  191. package/src/transpiler/markdown/plain-markdown/type-level-apex-doc-partial-template.ts +0 -27
@@ -1,67 +1,224 @@
1
1
  import { ClassMirror, EnumMirror, InterfaceMirror, Type } from '@cparra/apex-reflection';
2
- import { BaseTypeSource, ClassSource, EnumSource, InterfaceSource } from '../templating/types';
2
+ import {
3
+ RenderableType,
4
+ RenderableClass,
5
+ RenderableEnum,
6
+ RenderableInterface,
7
+ Renderable,
8
+ RenderableSection,
9
+ GroupedMember,
10
+ } from '../core/renderable/types';
3
11
  import { adaptDescribable, adaptDocumentable } from './documentables';
4
- import { linkFromTypeNameGenerator } from './references';
5
- import { FieldMirrorWithInheritance } from '../model/inheritance';
12
+ import { GetRenderableContentByTypeName, linkFromTypeNameGenerator } from './references';
13
+ import { FieldMirrorWithInheritance, PropertyMirrorWithInheritance } from '../model/inheritance';
6
14
  import { adaptConstructor, adaptMethod } from './methods-and-constructors';
7
- import { adaptField } from './fields-and-properties';
15
+ import { adaptFieldOrProperty } from './fields-and-properties';
8
16
 
9
- function baseTypeAdapter(type: EnumMirror | InterfaceMirror | ClassMirror): BaseTypeSource {
10
- function extractAnnotationBody(type: Type, annotationName: string): string | undefined {
11
- return type.docComment?.annotations.find(
12
- (currentAnnotation) => currentAnnotation.name.toLowerCase() === annotationName,
13
- )?.body;
14
- }
17
+ function baseTypeAdapter(
18
+ type: EnumMirror | InterfaceMirror | ClassMirror,
19
+ linkGenerator: GetRenderableContentByTypeName,
20
+ baseHeadingLevel: number,
21
+ ): RenderableType {
22
+ function getHeading(type: Type): string {
23
+ const suffixMap = {
24
+ class: 'Class',
25
+ interface: 'Interface',
26
+ enum: 'Enum',
27
+ };
15
28
 
16
- function extractSeeAnnotations(type: Type): string[] {
17
- return (
18
- type.docComment?.annotations
19
- .filter((currentAnnotation) => currentAnnotation.name.toLowerCase() === 'see')
20
- .map((currentAnnotation) => currentAnnotation.body) ?? []
21
- );
29
+ return `${type.name} ${suffixMap[type.type_name]}`;
22
30
  }
23
31
 
24
32
  return {
25
- ...adaptDocumentable(type),
26
- accessModifier: type.access_modifier,
33
+ headingLevel: baseHeadingLevel,
34
+ heading: getHeading(type),
35
+ doc: adaptDocumentable(type, linkGenerator, baseHeadingLevel + 1),
27
36
  name: type.name,
28
- group: extractAnnotationBody(type, 'group'),
29
- author: extractAnnotationBody(type, 'author'),
30
- date: extractAnnotationBody(type, 'date'),
31
- sees: extractSeeAnnotations(type).map(linkFromTypeNameGenerator),
37
+ meta: {
38
+ accessModifier: type.access_modifier,
39
+ },
40
+ };
41
+ }
42
+
43
+ export function typeToRenderableType(
44
+ type: Type,
45
+ linkGenerator: GetRenderableContentByTypeName,
46
+ namespace?: string,
47
+ ): Renderable {
48
+ function getRenderable() {
49
+ switch (type.type_name) {
50
+ case 'enum':
51
+ return enumTypeToEnumSource(type as EnumMirror, linkGenerator);
52
+ case 'interface':
53
+ return interfaceTypeToInterfaceSource(type as InterfaceMirror, linkGenerator);
54
+ case 'class':
55
+ return classTypeToClassSource(type as ClassMirror, linkGenerator);
56
+ }
57
+ }
58
+
59
+ return {
60
+ ...getRenderable(),
61
+ namespace,
32
62
  };
33
63
  }
34
64
 
35
- export function enumTypeToEnumSource(enumType: EnumMirror): EnumSource {
65
+ export function enumTypeToEnumSource(
66
+ enumType: EnumMirror,
67
+ linkGenerator: GetRenderableContentByTypeName,
68
+ baseHeadingLevel: number = 1,
69
+ ): RenderableEnum {
36
70
  return {
37
- __type: 'enum',
38
- ...baseTypeAdapter(enumType),
39
- values: enumType.values.map((value) => ({
40
- ...adaptDescribable(value.docComment?.descriptionLines),
41
- value: value.name,
42
- })),
71
+ type: 'enum',
72
+ ...baseTypeAdapter(enumType, linkGenerator, baseHeadingLevel),
73
+ values: {
74
+ headingLevel: baseHeadingLevel + 1,
75
+ heading: 'Values',
76
+ value: enumType.values.map((value) => ({
77
+ ...adaptDescribable(value.docComment?.descriptionLines, linkGenerator),
78
+ value: value.name,
79
+ })),
80
+ },
43
81
  };
44
82
  }
45
83
 
46
- export function interfaceTypeToInterfaceSource(interfaceType: InterfaceMirror): InterfaceSource {
84
+ export function interfaceTypeToInterfaceSource(
85
+ interfaceType: InterfaceMirror,
86
+ linkGenerator: GetRenderableContentByTypeName,
87
+ baseHeadingLevel: number = 1,
88
+ ): RenderableInterface {
47
89
  return {
48
- __type: 'interface',
49
- ...baseTypeAdapter(interfaceType),
90
+ type: 'interface',
91
+ ...baseTypeAdapter(interfaceType, linkGenerator, baseHeadingLevel),
50
92
  extends: interfaceType.extended_interfaces.map(linkFromTypeNameGenerator),
51
- methods: interfaceType.methods.map(adaptMethod),
93
+ methods: {
94
+ headingLevel: baseHeadingLevel + 1,
95
+ heading: 'Methods',
96
+ value: interfaceType.methods.map((method) => adaptMethod(method, linkGenerator, baseHeadingLevel + 2)),
97
+ },
52
98
  };
53
99
  }
54
100
 
55
- export function classTypeToClassSource(classType: ClassMirror): ClassSource {
101
+ export function classTypeToClassSource(
102
+ classType: ClassMirror,
103
+ linkGenerator: GetRenderableContentByTypeName,
104
+ baseHeadingLevel: number = 1,
105
+ ): RenderableClass {
56
106
  return {
57
- __type: 'class',
58
- ...baseTypeAdapter(classType),
107
+ type: 'class',
108
+ ...baseTypeAdapter(classType, linkGenerator, baseHeadingLevel),
59
109
  classModifier: classType.classModifier,
60
110
  sharingModifier: classType.sharingModifier,
61
111
  implements: classType.implemented_interfaces.map(linkFromTypeNameGenerator),
62
112
  extends: classType.extended_class ? linkFromTypeNameGenerator(classType.extended_class) : undefined,
63
- methods: classType.methods.map(adaptMethod),
64
- constructors: classType.constructors.map((constructor) => adaptConstructor(classType.name, constructor)),
65
- fields: classType.fields.map((field) => adaptField(field as FieldMirrorWithInheritance)),
113
+ methods: adaptMembers('Methods', classType.methods, adaptMethod, linkFromTypeNameGenerator, baseHeadingLevel + 1),
114
+ constructors: adaptMembers(
115
+ 'Constructors',
116
+ classType.constructors,
117
+ (constructor, linkGenerator, baseHeadingLevel) =>
118
+ adaptConstructor(classType.name, constructor, linkGenerator, baseHeadingLevel),
119
+ linkFromTypeNameGenerator,
120
+ baseHeadingLevel + 1,
121
+ ),
122
+ fields: adaptMembers(
123
+ 'Fields',
124
+ classType.fields as FieldMirrorWithInheritance[],
125
+ adaptFieldOrProperty,
126
+ linkFromTypeNameGenerator,
127
+ baseHeadingLevel + 1,
128
+ ),
129
+ properties: adaptMembers(
130
+ 'Properties',
131
+ classType.properties as PropertyMirrorWithInheritance[],
132
+ adaptFieldOrProperty,
133
+ linkFromTypeNameGenerator,
134
+ baseHeadingLevel + 1,
135
+ ),
136
+ innerClasses: {
137
+ headingLevel: baseHeadingLevel + 1,
138
+ heading: 'Classes',
139
+ value: classType.classes.map((innerClass) =>
140
+ classTypeToClassSource(innerClass, linkGenerator, baseHeadingLevel + 2),
141
+ ),
142
+ },
143
+ innerEnums: {
144
+ headingLevel: baseHeadingLevel + 1,
145
+ heading: 'Enums',
146
+ value: classType.enums.map((innerEnum) => enumTypeToEnumSource(innerEnum, linkGenerator, baseHeadingLevel + 2)),
147
+ },
148
+ innerInterfaces: {
149
+ headingLevel: baseHeadingLevel + 1,
150
+ heading: 'Interfaces',
151
+ value: classType.interfaces.map((innerInterface) =>
152
+ interfaceTypeToInterfaceSource(innerInterface, linkGenerator, baseHeadingLevel + 2),
153
+ ),
154
+ },
155
+ };
156
+ }
157
+
158
+ type Groupable = { group?: string; groupDescription?: string };
159
+
160
+ function adaptMembers<T extends Groupable, K>(
161
+ heading: string,
162
+ members: T[],
163
+ adapter: (member: T, linkGenerator: GetRenderableContentByTypeName, baseHeadingLevel: number) => K,
164
+ linkFromTypeNameGenerator: GetRenderableContentByTypeName,
165
+ headingLevel: number,
166
+ ): RenderableSection<K[] | GroupedMember<K>[]> & { isGrouped: boolean } {
167
+ return {
168
+ headingLevel,
169
+ heading,
170
+ isGrouped: hasGroup(members),
171
+ value: hasGroup(members)
172
+ ? toGroupedMembers(members, adapter, linkFromTypeNameGenerator, headingLevel + 1)
173
+ : toFlat(members, adapter, linkFromTypeNameGenerator, headingLevel + 1),
174
+ };
175
+ }
176
+
177
+ function hasGroup(members: Groupable[]): boolean {
178
+ return members.some((member) => member.group);
179
+ }
180
+
181
+ function toFlat<T extends Groupable, K>(
182
+ members: T[],
183
+ adapter: (member: T, linkGenerator: GetRenderableContentByTypeName, baseHeadingLevel: number) => K,
184
+ linkGenerator: GetRenderableContentByTypeName,
185
+ baseHeadingLevel: number,
186
+ ): K[] {
187
+ return members.map((member) => adapter(member, linkGenerator, baseHeadingLevel));
188
+ }
189
+
190
+ function toGroupedMembers<T extends Groupable, K>(
191
+ members: T[],
192
+ adapter: (member: T, linkGenerator: GetRenderableContentByTypeName, baseHeadingLevel: number) => K,
193
+ linkGenerator: GetRenderableContentByTypeName,
194
+ baseHeadingLevel: number,
195
+ ): GroupedMember<K>[] {
196
+ const groupedMembers = groupByGroupName(members);
197
+ return Object.entries(groupedMembers).map(([groupName, members]) =>
198
+ singleGroup(baseHeadingLevel, groupName, adapter, members, linkGenerator),
199
+ );
200
+ }
201
+
202
+ function groupByGroupName<T extends Groupable>(members: T[]): Record<string, T[]> {
203
+ return members.reduce((acc, member) => {
204
+ const groupName = member.group ?? 'Other';
205
+ acc[groupName] = acc[groupName] ?? [];
206
+ acc[groupName].push(member);
207
+ return acc;
208
+ }, {} as Record<string, T[]>);
209
+ }
210
+
211
+ function singleGroup<T extends Groupable, K>(
212
+ headingLevel: number,
213
+ groupName: string,
214
+ adapter: (member: T, linkGenerator: GetRenderableContentByTypeName, baseHeadingLevel: number) => K,
215
+ members: T[],
216
+ linkGenerator: GetRenderableContentByTypeName,
217
+ ): GroupedMember<K> {
218
+ return {
219
+ headingLevel: headingLevel,
220
+ heading: groupName,
221
+ groupDescription: members[0].groupDescription, // All fields in the group have the same description
222
+ value: toFlat(members, adapter, linkGenerator, headingLevel + 1),
66
223
  };
67
224
  }
@@ -1,9 +1,14 @@
1
- import { CustomTag, DocumentableSource, RenderableContent } from '../templating/types';
1
+ import { CustomTag, RenderableDocumentation, RenderableContent } from '../core/renderable/types';
2
2
  import { Describable, Documentable } from './types';
3
- import { replaceInlineReferences } from './references';
3
+ import { GetRenderableContentByTypeName, replaceInlineReferences } from './references';
4
4
  import { isEmptyLine } from './type-utils';
5
5
 
6
- export function adaptDescribable(describable: Describable): { description?: RenderableContent[] } {
6
+ export function adaptDescribable(
7
+ describable: Describable,
8
+ linkGenerator: GetRenderableContentByTypeName,
9
+ ): {
10
+ description?: RenderableContent[];
11
+ } {
7
12
  function describableToRenderableContent(describable: Describable): RenderableContent[] | undefined {
8
13
  if (!describable) {
9
14
  return;
@@ -12,7 +17,7 @@ export function adaptDescribable(describable: Describable): { description?: Rend
12
17
  return (
13
18
  describable
14
19
  .map<RenderableContent[]>((line) => [
15
- ...replaceInlineReferences(line),
20
+ ...replaceInlineReferences(line, linkGenerator),
16
21
  {
17
22
  type: 'empty-line',
18
23
  },
@@ -28,7 +33,11 @@ export function adaptDescribable(describable: Describable): { description?: Rend
28
33
  };
29
34
  }
30
35
 
31
- export function adaptDocumentable(documentable: Documentable): DocumentableSource {
36
+ export function adaptDocumentable(
37
+ documentable: Documentable,
38
+ linkGenerator: GetRenderableContentByTypeName,
39
+ subHeadingLevel: number,
40
+ ): RenderableDocumentation {
32
41
  function extractCustomTags(type: Documentable): CustomTag[] {
33
42
  const baseTags = ['description', 'group', 'author', 'date', 'see', 'example', 'mermaid', 'throws', 'exception'];
34
43
 
@@ -36,7 +45,7 @@ export function adaptDocumentable(documentable: Documentable): DocumentableSourc
36
45
  type.docComment?.annotations
37
46
  .filter((currentAnnotation) => !baseTags.includes(currentAnnotation.name.toLowerCase()))
38
47
  .map<CustomTag>((currentAnnotation) => ({
39
- ...adaptDescribable(currentAnnotation.bodyLines),
48
+ ...adaptDescribable(currentAnnotation.bodyLines, linkGenerator),
40
49
  name: currentAnnotation.name,
41
50
  })) ?? []
42
51
  );
@@ -48,11 +57,37 @@ export function adaptDocumentable(documentable: Documentable): DocumentableSourc
48
57
  )?.bodyLines;
49
58
  }
50
59
 
60
+ function extractAnnotationBody(type: Documentable, annotationName: string): string | undefined {
61
+ return type.docComment?.annotations.find(
62
+ (currentAnnotation) => currentAnnotation.name.toLowerCase() === annotationName,
63
+ )?.body;
64
+ }
65
+
66
+ function extractSeeAnnotations(type: Documentable): string[] {
67
+ return (
68
+ type.docComment?.annotations
69
+ .filter((currentAnnotation) => currentAnnotation.name.toLowerCase() === 'see')
70
+ .map((currentAnnotation) => currentAnnotation.body) ?? []
71
+ );
72
+ }
73
+
51
74
  return {
52
- ...adaptDescribable(documentable.docComment?.descriptionLines),
75
+ ...adaptDescribable(documentable.docComment?.descriptionLines, linkGenerator),
53
76
  annotations: documentable.annotations.map((annotation) => annotation.type.toUpperCase()),
54
77
  customTags: extractCustomTags(documentable),
55
- mermaid: extractAnnotationBodyLines(documentable, 'mermaid'),
56
- example: documentable.docComment?.exampleAnnotation?.bodyLines,
78
+ mermaid: {
79
+ headingLevel: subHeadingLevel,
80
+ heading: 'Diagram',
81
+ value: extractAnnotationBodyLines(documentable, 'mermaid'),
82
+ },
83
+ example: {
84
+ headingLevel: subHeadingLevel,
85
+ heading: 'Example',
86
+ value: documentable.docComment?.exampleAnnotation?.bodyLines,
87
+ },
88
+ group: extractAnnotationBody(documentable, 'group'),
89
+ author: extractAnnotationBody(documentable, 'author'),
90
+ date: extractAnnotationBody(documentable, 'date'),
91
+ sees: extractSeeAnnotations(documentable).map(linkGenerator),
57
92
  };
58
93
  }
@@ -1,14 +1,38 @@
1
- import { FieldMirrorWithInheritance } from '../model/inheritance';
2
- import { FieldSource } from '../templating/types';
1
+ import { FieldMirrorWithInheritance, PropertyMirrorWithInheritance } from '../model/inheritance';
2
+ import { RenderableField } from '../core/renderable/types';
3
3
  import { adaptDocumentable } from './documentables';
4
- import { linkFromTypeNameGenerator } from './references';
4
+ import { GetRenderableContentByTypeName, linkFromTypeNameGenerator } from './references';
5
+
6
+ export function adaptFieldOrProperty(
7
+ field: FieldMirrorWithInheritance | PropertyMirrorWithInheritance,
8
+ linkGenerator: GetRenderableContentByTypeName,
9
+ baseHeadingLevel: number,
10
+ ): RenderableField {
11
+ function buildSignature() {
12
+ const { access_modifier, name } = field;
13
+ const memberModifiers = field.memberModifiers.join(' ');
14
+ return (
15
+ `${access_modifier} ${memberModifiers} ${name}`
16
+ // remove double spaces
17
+ .replace(/ {2}/g, ' ')
18
+ );
19
+ }
5
20
 
6
- export function adaptField(field: FieldMirrorWithInheritance): FieldSource {
7
21
  return {
8
- ...adaptDocumentable(field),
9
- name: field.name,
10
- type: linkFromTypeNameGenerator(field.typeReference.rawDeclaration),
22
+ headingLevel: baseHeadingLevel,
23
+ doc: adaptDocumentable(field, linkGenerator, baseHeadingLevel + 1),
24
+ heading: field.name,
25
+ type: {
26
+ headingLevel: baseHeadingLevel + 1,
27
+ heading: 'Type',
28
+ value: linkFromTypeNameGenerator(field.typeReference.rawDeclaration),
29
+ },
11
30
  inherited: field.inherited,
12
31
  accessModifier: field.access_modifier,
32
+ signature: {
33
+ headingLevel: baseHeadingLevel + 1,
34
+ heading: 'Signature',
35
+ value: [buildSignature()],
36
+ },
13
37
  };
14
38
  }
@@ -1,11 +1,15 @@
1
1
  import { ConstructorMirror, MethodMirror, ParameterMirror, ThrowsAnnotation } from '@cparra/apex-reflection';
2
- import { ConstructorSource, MethodSource } from '../templating/types';
2
+ import { RenderableConstructor, RenderableMethod } from '../core/renderable/types';
3
3
  import { MethodMirrorWithInheritance } from '../model/inheritance';
4
4
  import { adaptDescribable, adaptDocumentable } from './documentables';
5
- import { linkFromTypeNameGenerator } from './references';
5
+ import { GetRenderableContentByTypeName, linkFromTypeNameGenerator } from './references';
6
6
  import { Documentable } from './types';
7
7
 
8
- export function adaptMethod(method: MethodMirror): MethodSource {
8
+ export function adaptMethod(
9
+ method: MethodMirror,
10
+ linkGenerator: GetRenderableContentByTypeName,
11
+ baseHeadingLevel: number,
12
+ ): RenderableMethod {
9
13
  function buildTitle(method: MethodMirrorWithInheritance): string {
10
14
  const { name, parameters } = method;
11
15
  const parametersString = parameters.map((param) => param.name).join(', ');
@@ -22,20 +26,42 @@ export function adaptMethod(method: MethodMirror): MethodSource {
22
26
  }
23
27
 
24
28
  return {
25
- ...adaptDocumentable(method),
26
- title: buildTitle(method as MethodMirrorWithInheritance),
27
- signature: buildSignature(method as MethodMirrorWithInheritance),
29
+ headingLevel: baseHeadingLevel,
30
+ doc: adaptDocumentable(method, linkGenerator, baseHeadingLevel + 1),
31
+ heading: buildTitle(method as MethodMirrorWithInheritance),
32
+ signature: {
33
+ headingLevel: baseHeadingLevel + 1,
34
+ heading: 'Signature',
35
+ value: [buildSignature(method as MethodMirrorWithInheritance)],
36
+ },
28
37
  returnType: {
29
- ...adaptDescribable(method.docComment?.returnAnnotation?.bodyLines),
30
- type: linkFromTypeNameGenerator(method.typeReference.rawDeclaration),
38
+ headingLevel: baseHeadingLevel + 1,
39
+ heading: 'Return Type',
40
+ value: {
41
+ ...adaptDescribable(method.docComment?.returnAnnotation?.bodyLines, linkGenerator),
42
+ type: linkFromTypeNameGenerator(method.typeReference.rawDeclaration),
43
+ },
44
+ },
45
+ throws: {
46
+ headingLevel: baseHeadingLevel + 1,
47
+ heading: 'Throws',
48
+ value: method.docComment?.throwsAnnotations.map((thrown) => mapThrows(thrown)),
49
+ },
50
+ parameters: {
51
+ headingLevel: baseHeadingLevel + 1,
52
+ heading: 'Parameters',
53
+ value: method.parameters.map((param) => mapParameters(method, param)),
31
54
  },
32
- throws: method.docComment?.throwsAnnotations.map((thrown) => mapThrows(thrown)),
33
- parameters: method.parameters.map((param) => mapParameters(method, param)),
34
55
  inherited: (method as MethodMirrorWithInheritance).inherited,
35
56
  };
36
57
  }
37
58
 
38
- export function adaptConstructor(typeName: string, constructor: ConstructorMirror): ConstructorSource {
59
+ export function adaptConstructor(
60
+ typeName: string,
61
+ constructor: ConstructorMirror,
62
+ linkGenerator: GetRenderableContentByTypeName,
63
+ baseHeadingLevel: number,
64
+ ): RenderableConstructor {
39
65
  function buildTitle(name: string, constructor: ConstructorMirror): string {
40
66
  const { parameters } = constructor;
41
67
  const parametersString = parameters.map((param) => param.name).join(', ');
@@ -51,11 +77,24 @@ export function adaptConstructor(typeName: string, constructor: ConstructorMirro
51
77
  }
52
78
 
53
79
  return {
54
- ...adaptDocumentable(constructor),
55
- title: buildTitle(typeName, constructor),
56
- signature: buildSignature(typeName, constructor),
57
- parameters: constructor.parameters.map((param) => mapParameters(constructor, param)),
58
- throws: constructor.docComment?.throwsAnnotations.map((thrown) => mapThrows(thrown)),
80
+ doc: adaptDocumentable(constructor, linkGenerator, baseHeadingLevel + 1),
81
+ headingLevel: baseHeadingLevel,
82
+ heading: buildTitle(typeName, constructor),
83
+ signature: {
84
+ headingLevel: baseHeadingLevel + 1,
85
+ heading: 'Signature',
86
+ value: [buildSignature(typeName, constructor)],
87
+ },
88
+ parameters: {
89
+ headingLevel: baseHeadingLevel + 1,
90
+ heading: 'Parameters',
91
+ value: constructor.parameters.map((param) => mapParameters(constructor, param)),
92
+ },
93
+ throws: {
94
+ headingLevel: baseHeadingLevel + 1,
95
+ heading: 'Throws',
96
+ value: constructor.docComment?.throwsAnnotations.map((thrown) => mapThrows(thrown)),
97
+ },
59
98
  };
60
99
  }
61
100
 
@@ -64,7 +103,7 @@ function mapParameters(documentable: Documentable, param: ParameterMirror) {
64
103
  (pa) => pa.paramName.toLowerCase() === param.name.toLowerCase(),
65
104
  );
66
105
  return {
67
- ...adaptDescribable(paramAnnotation?.bodyLines),
106
+ ...adaptDescribable(paramAnnotation?.bodyLines, linkFromTypeNameGenerator),
68
107
  name: param.name,
69
108
  type: linkFromTypeNameGenerator(param.typeReference.rawDeclaration),
70
109
  };
@@ -72,7 +111,7 @@ function mapParameters(documentable: Documentable, param: ParameterMirror) {
72
111
 
73
112
  function mapThrows(thrown: ThrowsAnnotation) {
74
113
  return {
75
- ...adaptDescribable(thrown.bodyLines),
114
+ ...adaptDescribable(thrown.bodyLines, linkFromTypeNameGenerator),
76
115
  type: linkFromTypeNameGenerator(thrown.exceptionName),
77
116
  };
78
117
  }
@@ -1,5 +1,5 @@
1
1
  import ClassFileGeneratorHelper from '../transpiler/markdown/class-file-generatorHelper';
2
- import { Link, RenderableContent, StringOrLink } from '../templating/types';
2
+ import { Link, RenderableContent, StringOrLink } from '../core/renderable/types';
3
3
 
4
4
  export type GetRenderableContentByTypeName = (typeName: string) => StringOrLink;
5
5
 
@@ -1,4 +1,4 @@
1
- import { EmptyLine, RenderableContent } from '../templating/types';
1
+ import { EmptyLine, RenderableContent } from '../core/renderable/types';
2
2
 
3
3
  export function isEmptyLine(content: RenderableContent): content is EmptyLine {
4
4
  return Object.keys(content).includes('type') && (content as { type: string }).type === 'empty-line';