@cparra/apexdocs 3.0.0 → 3.1.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 (264) hide show
  1. package/README.md +11 -5
  2. package/dist/cli/generate.js +1 -1
  3. package/dist/index.js +1 -1
  4. package/dist/logger-BATX7-be.js +3278 -0
  5. package/package.json +4 -1
  6. package/.github/workflows/ci.yaml +0 -22
  7. package/.github/workflows/close_stale.yml +0 -22
  8. package/.prettierrc.js +0 -7
  9. package/__mocks__/chalk.js +0 -12
  10. package/__mocks__/log-update.js +0 -6
  11. package/eslint.config.mjs +0 -10
  12. package/examples/README.md +0 -5
  13. package/examples/docsify/README.md +0 -17
  14. package/examples/docsify/apexdocs.config.ts +0 -13
  15. package/examples/docsify/classes/ASampleClass.cls +0 -57
  16. package/examples/docsify/classes/CodeControl.cls +0 -19
  17. package/examples/docsify/classes/SampleClass.cls +0 -95
  18. package/examples/docsify/classes/SampleInterface.cls +0 -17
  19. package/examples/docsify/classes/SomeDto.cls +0 -122
  20. package/examples/docsify/docs/.nojekyll +0 -0
  21. package/examples/docsify/docs/README.md +0 -25
  22. package/examples/docsify/docs/_config.yml +0 -1
  23. package/examples/docsify/docs/index.html +0 -22
  24. package/examples/docsify/docs/miscellaneous/ASampleClass.md +0 -88
  25. package/examples/docsify/docs/miscellaneous/CodeControl.md +0 -107
  26. package/examples/docsify/docs/miscellaneous/SomeDto.md +0 -244
  27. package/examples/docsify/docs/sample-classes/SampleClass.md +0 -171
  28. package/examples/docsify/docs/sample-interfaces/SampleInterface.md +0 -36
  29. package/examples/docsify/package-lock.json +0 -2459
  30. package/examples/docsify/package.json +0 -14
  31. package/examples/imported/.forceignore +0 -12
  32. package/examples/imported/README.md +0 -6
  33. package/examples/imported/config/project-scratch-def.json +0 -5
  34. package/examples/imported/docs/index.md +0 -109
  35. package/examples/imported/docs/miscellaneous/BaseClass.md +0 -13
  36. package/examples/imported/docs/miscellaneous/MultiInheritanceClass.md +0 -69
  37. package/examples/imported/docs/miscellaneous/ParentInterface.md +0 -12
  38. package/examples/imported/docs/miscellaneous/ReferencedEnum.md +0 -5
  39. package/examples/imported/docs/miscellaneous/SampleException.md +0 -21
  40. package/examples/imported/docs/miscellaneous/SampleInterface.md +0 -113
  41. package/examples/imported/docs/miscellaneous/Url.md +0 -308
  42. package/examples/imported/docs/sample-enums/SampleEnum.md +0 -33
  43. package/examples/imported/docs/samplegroup/SampleClass.md +0 -167
  44. package/examples/imported/force-app/classes/BaseClass.cls +0 -3
  45. package/examples/imported/force-app/classes/MultiInheritanceClass.cls +0 -1
  46. package/examples/imported/force-app/classes/ParentInterface.cls +0 -3
  47. package/examples/imported/force-app/classes/ReferencedEnum.cls +0 -3
  48. package/examples/imported/force-app/classes/SampleClass.cls +0 -72
  49. package/examples/imported/force-app/classes/SampleEnum.cls +0 -30
  50. package/examples/imported/force-app/classes/SampleException.cls +0 -17
  51. package/examples/imported/force-app/classes/SampleInterface.cls +0 -50
  52. package/examples/imported/force-app/classes/Url.cls +0 -196
  53. package/examples/imported/package-lock.json +0 -665
  54. package/examples/imported/package.json +0 -6
  55. package/examples/imported/scripts/process-docs.mjs +0 -16
  56. package/examples/imported/sfdx-project.json +0 -12
  57. package/examples/markdown/.forceignore +0 -12
  58. package/examples/markdown/README.md +0 -7
  59. package/examples/markdown/config/project-scratch-def.json +0 -5
  60. package/examples/markdown/docs/index.md +0 -109
  61. package/examples/markdown/docs/miscellaneous/BaseClass.md +0 -16
  62. package/examples/markdown/docs/miscellaneous/MultiInheritanceClass.md +0 -72
  63. package/examples/markdown/docs/miscellaneous/ParentInterface.md +0 -15
  64. package/examples/markdown/docs/miscellaneous/ReferencedEnum.md +0 -8
  65. package/examples/markdown/docs/miscellaneous/SampleException.md +0 -24
  66. package/examples/markdown/docs/miscellaneous/SampleInterface.md +0 -116
  67. package/examples/markdown/docs/miscellaneous/Url.md +0 -311
  68. package/examples/markdown/docs/sample-enums/SampleEnum.md +0 -36
  69. package/examples/markdown/docs/samplegroup/SampleClass.md +0 -170
  70. package/examples/markdown/force-app/classes/BaseClass.cls +0 -3
  71. package/examples/markdown/force-app/classes/MultiInheritanceClass.cls +0 -1
  72. package/examples/markdown/force-app/classes/ParentInterface.cls +0 -3
  73. package/examples/markdown/force-app/classes/ReferencedEnum.cls +0 -3
  74. package/examples/markdown/force-app/classes/SampleClass.cls +0 -72
  75. package/examples/markdown/force-app/classes/SampleEnum.cls +0 -30
  76. package/examples/markdown/force-app/classes/SampleException.cls +0 -17
  77. package/examples/markdown/force-app/classes/SampleInterface.cls +0 -50
  78. package/examples/markdown/force-app/classes/Url.cls +0 -196
  79. package/examples/markdown/package-lock.json +0 -665
  80. package/examples/markdown/package.json +0 -20
  81. package/examples/markdown/sfdx-project.json +0 -12
  82. package/examples/markdown-jsconfig/.forceignore +0 -12
  83. package/examples/markdown-jsconfig/README.md +0 -9
  84. package/examples/markdown-jsconfig/apexdocs.config.mjs +0 -22
  85. package/examples/markdown-jsconfig/config/project-scratch-def.json +0 -5
  86. package/examples/markdown-jsconfig/docs/index.md +0 -12
  87. package/examples/markdown-jsconfig/docs/miscellaneous/Url.md +0 -315
  88. package/examples/markdown-jsconfig/force-app/classes/Url.cls +0 -196
  89. package/examples/markdown-jsconfig/package-lock.json +0 -665
  90. package/examples/markdown-jsconfig/package.json +0 -15
  91. package/examples/markdown-jsconfig/sfdx-project.json +0 -12
  92. package/examples/open-api/README.md +0 -5
  93. package/examples/open-api/config/project-scratch-def.json +0 -13
  94. package/examples/open-api/docs/openapi.json +0 -14
  95. package/examples/open-api/force-app/main/default/classes/ChildClass.cls +0 -42
  96. package/examples/open-api/force-app/main/default/classes/SampleClass.cls +0 -167
  97. package/examples/open-api/force-app/main/default/restapi/SampleRestResource.cls +0 -195
  98. package/examples/open-api/force-app/main/default/restapi/SampleRestResourceToSkip.cls +0 -35
  99. package/examples/open-api/force-app/main/default/restapi/SampleRestResourceWithInnerClass.cls +0 -24
  100. package/examples/open-api/force-app/main/default/restapi/SampleRestResourceWithoutApexDocs.cls +0 -15
  101. package/examples/open-api/force-app/main/default/restapi/references/Reference1.cls +0 -9
  102. package/examples/open-api/force-app/main/default/restapi/references/Reference2.cls +0 -9
  103. package/examples/open-api/force-app/main/default/restapi/references/Reference3.cls +0 -3
  104. package/examples/open-api/force-app/main/default/restapi/references/Reference4.cls +0 -3
  105. package/examples/open-api/force-app/main/default/restapi/references/Reference5.cls +0 -3
  106. package/examples/open-api/force-app/main/default/restapi/references/Reference6.cls +0 -6
  107. package/examples/open-api/force-app/main/default/restapi/references/Reference7.cls +0 -3
  108. package/examples/open-api/package-lock.json +0 -724
  109. package/examples/open-api/package.json +0 -20
  110. package/examples/open-api/sfdx-project.json +0 -12
  111. package/examples/vitepress/.forceignore +0 -12
  112. package/examples/vitepress/README.md +0 -25
  113. package/examples/vitepress/apexdocs.config.ts +0 -113
  114. package/examples/vitepress/config/project-scratch-def.json +0 -13
  115. package/examples/vitepress/docs/.vitepress/cache/deps/@theme_index.js +0 -259
  116. package/examples/vitepress/docs/.vitepress/cache/deps/@theme_index.js.map +0 -7
  117. package/examples/vitepress/docs/.vitepress/cache/deps/_metadata.json +0 -40
  118. package/examples/vitepress/docs/.vitepress/cache/deps/chunk-574YRH25.js +0 -11474
  119. package/examples/vitepress/docs/.vitepress/cache/deps/chunk-574YRH25.js.map +0 -7
  120. package/examples/vitepress/docs/.vitepress/cache/deps/chunk-E5DZZB2I.js +0 -9172
  121. package/examples/vitepress/docs/.vitepress/cache/deps/chunk-E5DZZB2I.js.map +0 -7
  122. package/examples/vitepress/docs/.vitepress/cache/deps/package.json +0 -3
  123. package/examples/vitepress/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js +0 -4339
  124. package/examples/vitepress/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js.map +0 -7
  125. package/examples/vitepress/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js +0 -567
  126. package/examples/vitepress/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js.map +0 -7
  127. package/examples/vitepress/docs/.vitepress/cache/deps/vue.js +0 -323
  128. package/examples/vitepress/docs/.vitepress/cache/deps/vue.js.map +0 -7
  129. package/examples/vitepress/docs/.vitepress/config.mts +0 -21
  130. package/examples/vitepress/docs/.vitepress/sidebar.json +0 -119
  131. package/examples/vitepress/docs/api-examples.md +0 -49
  132. package/examples/vitepress/docs/index-frontmatter.md +0 -16
  133. package/examples/vitepress/docs/index.md +0 -56
  134. package/examples/vitepress/docs/markdown-examples.md +0 -85
  135. package/examples/vitepress/docs/miscellaneous/BaseClass.md +0 -20
  136. package/examples/vitepress/docs/miscellaneous/MultiInheritanceClass.md +0 -76
  137. package/examples/vitepress/docs/miscellaneous/ParentInterface.md +0 -19
  138. package/examples/vitepress/docs/miscellaneous/ReferencedEnum.md +0 -15
  139. package/examples/vitepress/docs/miscellaneous/SampleException.md +0 -28
  140. package/examples/vitepress/docs/miscellaneous/SampleInterface.md +0 -116
  141. package/examples/vitepress/docs/miscellaneous/Url.md +0 -317
  142. package/examples/vitepress/docs/sample-enums/SampleEnum.md +0 -40
  143. package/examples/vitepress/docs/samplegroup/SampleClass.md +0 -174
  144. package/examples/vitepress/force-app/main/default/classes/BaseClass.cls +0 -3
  145. package/examples/vitepress/force-app/main/default/classes/MultiInheritanceClass.cls +0 -1
  146. package/examples/vitepress/force-app/main/default/classes/ParentInterface.cls +0 -3
  147. package/examples/vitepress/force-app/main/default/classes/ReferencedEnum.cls +0 -5
  148. package/examples/vitepress/force-app/main/default/classes/Url.cls +0 -198
  149. package/examples/vitepress/force-app/main/default/classes/feature-a/SampleClass.cls +0 -73
  150. package/examples/vitepress/force-app/main/default/classes/feature-a/SampleEnum.cls +0 -30
  151. package/examples/vitepress/force-app/main/default/classes/feature-a/SampleException.cls +0 -17
  152. package/examples/vitepress/force-app/main/default/classes/feature-a/SampleInterface.cls +0 -46
  153. package/examples/vitepress/package-lock.json +0 -2574
  154. package/examples/vitepress/package.json +0 -18
  155. package/examples/vitepress/sfdx-project.json +0 -12
  156. package/jest.config.js +0 -10
  157. package/jest.d.ts +0 -7
  158. package/src/application/Apexdocs.ts +0 -69
  159. package/src/application/__tests__/apex-file-reader.spec.ts +0 -128
  160. package/src/application/apex-file-reader.ts +0 -56
  161. package/src/application/file-system.ts +0 -69
  162. package/src/application/file-writer.ts +0 -43
  163. package/src/application/generators/markdown.ts +0 -45
  164. package/src/application/generators/openapi.ts +0 -75
  165. package/src/cli/args.ts +0 -55
  166. package/src/cli/commands/markdown.ts +0 -56
  167. package/src/cli/commands/openapi.ts +0 -36
  168. package/src/cli/generate.ts +0 -32
  169. package/src/core/__test__/manifest.spec.ts +0 -16
  170. package/src/core/manifest.ts +0 -90
  171. package/src/core/markdown/__test__/expect-extensions.ts +0 -32
  172. package/src/core/markdown/__test__/generating-class-docs.spec.ts +0 -362
  173. package/src/core/markdown/__test__/generating-docs.spec.ts +0 -378
  174. package/src/core/markdown/__test__/generating-enum-docs.spec.ts +0 -61
  175. package/src/core/markdown/__test__/generating-interface-docs.spec.ts +0 -169
  176. package/src/core/markdown/__test__/generating-reference-guide.spec.ts +0 -196
  177. package/src/core/markdown/__test__/inheritance-chain.test.ts +0 -54
  178. package/src/core/markdown/__test__/test-helpers.ts +0 -25
  179. package/src/core/markdown/adapters/__tests__/documentables.spec.ts +0 -109
  180. package/src/core/markdown/adapters/__tests__/interface-adapter.spec.ts +0 -150
  181. package/src/core/markdown/adapters/__tests__/link-generator.spec.ts +0 -130
  182. package/src/core/markdown/adapters/__tests__/references.spec.ts +0 -136
  183. package/src/core/markdown/adapters/apex-types.ts +0 -238
  184. package/src/core/markdown/adapters/documentables.ts +0 -115
  185. package/src/core/markdown/adapters/fields-and-properties.ts +0 -45
  186. package/src/core/markdown/adapters/generate-link.ts +0 -82
  187. package/src/core/markdown/adapters/inline.ts +0 -143
  188. package/src/core/markdown/adapters/methods-and-constructors.ts +0 -133
  189. package/src/core/markdown/adapters/reference-guide.ts +0 -37
  190. package/src/core/markdown/adapters/renderable-bundle.ts +0 -61
  191. package/src/core/markdown/adapters/renderable-to-page-data.ts +0 -91
  192. package/src/core/markdown/adapters/type-utils.ts +0 -13
  193. package/src/core/markdown/adapters/types.d.ts +0 -180
  194. package/src/core/markdown/generate-docs.ts +0 -210
  195. package/src/core/markdown/reflection/__test__/filter-scope.spec.ts +0 -290
  196. package/src/core/markdown/reflection/__test__/helpers.ts +0 -18
  197. package/src/core/markdown/reflection/__test__/remove-excluded-tags.spec.ts +0 -200
  198. package/src/core/markdown/reflection/filter-scope.ts +0 -13
  199. package/src/core/markdown/reflection/inheritance-chain-expanion.ts +0 -22
  200. package/src/core/markdown/reflection/inheritance-chain.ts +0 -23
  201. package/src/core/markdown/reflection/inherited-member-expansion.ts +0 -105
  202. package/src/core/markdown/reflection/reflect-source.ts +0 -123
  203. package/src/core/markdown/reflection/remove-excluded-tags.ts +0 -168
  204. package/src/core/markdown/reflection/sort-types-and-members.ts +0 -61
  205. package/src/core/markdown/templates/class-template.ts +0 -75
  206. package/src/core/markdown/templates/constructors-partial-template.ts +0 -32
  207. package/src/core/markdown/templates/documentable-partial-template.ts +0 -26
  208. package/src/core/markdown/templates/enum-template.ts +0 -12
  209. package/src/core/markdown/templates/fieldsPartialTemplate.ts +0 -23
  210. package/src/core/markdown/templates/grouped-members-partial-template.ts +0 -6
  211. package/src/core/markdown/templates/hookable.ts +0 -7
  212. package/src/core/markdown/templates/interface-template.ts +0 -16
  213. package/src/core/markdown/templates/methods-partial-template.ts +0 -43
  214. package/src/core/markdown/templates/reference-guide.ts +0 -14
  215. package/src/core/markdown/templates/template.ts +0 -114
  216. package/src/core/markdown/templates/type-doc-partial.ts +0 -27
  217. package/src/core/markdown/utils.ts +0 -3
  218. package/src/core/openApiSettings.ts +0 -41
  219. package/src/core/openapi/__tests__/manifest-factory.spec.ts +0 -16
  220. package/src/core/openapi/__tests__/open-api-docs-processor.spec.ts +0 -59
  221. package/src/core/openapi/__tests__/open-api.spec.ts +0 -22
  222. package/src/core/openapi/apex-doc-types.ts +0 -26
  223. package/src/core/openapi/apex-type-wrappers/ClassMirrorWrapper.ts +0 -12
  224. package/src/core/openapi/apex-type-wrappers/MethodMirrorWrapper.ts +0 -11
  225. package/src/core/openapi/apex-type-wrappers/__tests__/ClassMirrorWrapper.spec.ts +0 -15
  226. package/src/core/openapi/file-container.ts +0 -13
  227. package/src/core/openapi/manifest-factory.ts +0 -16
  228. package/src/core/openapi/open-api-docs-processor.ts +0 -93
  229. package/src/core/openapi/open-api-types.ts +0 -119
  230. package/src/core/openapi/open-api.ts +0 -45
  231. package/src/core/openapi/openapi-type-file.ts +0 -12
  232. package/src/core/openapi/parser.ts +0 -163
  233. package/src/core/openapi/parsers/Builder.ts +0 -40
  234. package/src/core/openapi/parsers/MethodParser.ts +0 -249
  235. package/src/core/openapi/parsers/ParameterObjectBuilder.ts +0 -13
  236. package/src/core/openapi/parsers/ReferenceBuilder.ts +0 -299
  237. package/src/core/openapi/parsers/RequestBodyBuilder.ts +0 -19
  238. package/src/core/openapi/parsers/ResponsesBuilder.ts +0 -21
  239. package/src/core/openapi/parsers/__tests__/MethodParser.spec.ts +0 -44
  240. package/src/core/openapi/parsers/__tests__/ParameterObjectBuilder.spec.ts +0 -68
  241. package/src/core/openapi/parsers/__tests__/ReferenceBuilder.spec.ts +0 -751
  242. package/src/core/openapi/parsers/__tests__/RequestBodyBuilder.spec.ts +0 -64
  243. package/src/core/openapi/parsers/__tests__/ResponsesBuilder.spec.ts +0 -55
  244. package/src/core/openapi/transpiler.ts +0 -17
  245. package/src/core/openapi/types-repository.ts +0 -54
  246. package/src/core/parse-apex-metadata.ts +0 -30
  247. package/src/core/shared/types.d.ts +0 -150
  248. package/src/core/shared/utils.ts +0 -5
  249. package/src/defaults.ts +0 -21
  250. package/src/index.ts +0 -110
  251. package/src/test-helpers/AnnotationBuilder.ts +0 -29
  252. package/src/test-helpers/ClassMirrorBuilder.ts +0 -69
  253. package/src/test-helpers/DocCommentAnnotationBuilder.ts +0 -24
  254. package/src/test-helpers/DocCommentBuilder.ts +0 -36
  255. package/src/test-helpers/FieldMirrorBuilder.ts +0 -59
  256. package/src/test-helpers/InterfaceMirrorBuilder.ts +0 -39
  257. package/src/test-helpers/MethodMirrorBuilder.ts +0 -77
  258. package/src/test-helpers/SettingsBuilder.ts +0 -17
  259. package/src/util/error-logger.ts +0 -92
  260. package/src/util/fp.ts +0 -3
  261. package/src/util/logger.ts +0 -51
  262. package/src/util/string-utils.ts +0 -7
  263. package/tsconfig.json +0 -25
  264. package/tslint.json +0 -6
@@ -1,299 +0,0 @@
1
- import * as yaml from 'js-yaml';
2
- import {
3
- PropertiesObject,
4
- ReferenceObject,
5
- SchemaObject,
6
- SchemaObjectArray,
7
- SchemaObjectObject,
8
- } from '../../../core/openapi/open-api-types';
9
- import { TypeBundle, TypesRepository } from '../../../core/openapi/types-repository';
10
- import { ClassMirror, DocCommentAnnotation, FieldMirror, PropertyMirror } from '@cparra/apex-reflection';
11
- import { ListObjectType, ReferencedType } from '@cparra/apex-reflection';
12
- import { ApexDocSchemaObject } from '../../../core/openapi/apex-doc-types';
13
-
14
- type TypeBundleWithIsCollectionAndReferenceOverrides = TypeBundle & {
15
- originalTypeName: string;
16
- isCollection: boolean;
17
- referenceOverrides: ReferenceOverride[];
18
- };
19
-
20
- export class ReferenceBuilder {
21
- build(referencedTypeName: string): Reference {
22
- const originalTypeName = referencedTypeName;
23
-
24
- // Checking for inline overrides of the type: [memberName:ClassOverrideName]
25
- const regexForSchemaOverrides = /\[(.*?)]/g;
26
- const schemaOverrides = referencedTypeName.match(regexForSchemaOverrides);
27
- let referenceOverrides: ReferenceOverride[] = [];
28
- if (schemaOverrides && schemaOverrides.length > 0) {
29
- referenceOverrides = ReferenceOverrides.build(schemaOverrides[0]);
30
- referencedTypeName = referencedTypeName.replace(regexForSchemaOverrides, '');
31
- }
32
-
33
- const [parsedReferencedType, isCollection] = this.handlePossibleCollectionReference(referencedTypeName);
34
- const referencedTypeBundle = TypesRepository.getInstance().getFromAllByName(parsedReferencedType);
35
-
36
- if (!referencedTypeBundle) {
37
- throw new Error(`The referenced type ${referencedTypeName} was not found.`);
38
- }
39
- if (referencedTypeBundle.type.type_name !== 'class') {
40
- throw new Error(
41
- `Expected the referenced type to be a class, but found a ${referencedTypeBundle.type.type_name}.`,
42
- );
43
- }
44
- const typeBundleWithIsCollection = {
45
- ...referencedTypeBundle,
46
- originalTypeName: originalTypeName,
47
- isCollection: isCollection,
48
- referenceOverrides: referenceOverrides,
49
- };
50
- return this.buildReferenceFromType(typeBundleWithIsCollection);
51
- }
52
-
53
- /**
54
- * Returns a tuple where the first value is the name of the reference without any collection related values
55
- * and the second is a boolean representing if we are dealing with a collection or not.
56
- * @param referencedTypeName The received raw type name.
57
- * @private
58
- */
59
- private handlePossibleCollectionReference(referencedTypeName: string): [string, boolean] {
60
- referencedTypeName = referencedTypeName.toLowerCase();
61
- if (referencedTypeName.startsWith('list<') && referencedTypeName.endsWith('>')) {
62
- referencedTypeName = referencedTypeName.replace('list<', '');
63
- referencedTypeName = referencedTypeName.replace('>', '');
64
- return [referencedTypeName, true];
65
- }
66
- if (referencedTypeName.startsWith('set<') && referencedTypeName.endsWith('>')) {
67
- referencedTypeName = referencedTypeName.replace('set<', '');
68
- referencedTypeName = referencedTypeName.replace('>', '');
69
- return [referencedTypeName, true];
70
- }
71
- return [referencedTypeName, false];
72
- }
73
-
74
- private buildReferenceFromType(typeBundle: TypeBundleWithIsCollectionAndReferenceOverrides): Reference {
75
- // Filtering based on Salesforce's documentation:
76
- // https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_rest_methods.htm#ApexRESTUserDefinedTypes
77
- // We assume that the class only contains object types allowed by Apex Rest:
78
- // "Note that the public, private, or global class member variables must be types allowed by Apex REST"
79
- const propertiesAndFields: (FieldMirror | PropertyMirror)[] = [
80
- ...(typeBundle.type as ClassMirror).properties,
81
- ...(typeBundle.type as ClassMirror).fields,
82
- ]
83
- .filter((current) => !current.memberModifiers.includes('static'))
84
- .filter((current) => !current.memberModifiers.includes('transient'));
85
-
86
- const properties: PropertiesObject = {};
87
- let referencedComponents: ReferenceComponent[] = [];
88
- propertiesAndFields.forEach((current) => {
89
- // Check if there are reference overrides for the current property, this takes priority over anything else.
90
- const referenceOverride = typeBundle.referenceOverrides.find((currentOverride) => {
91
- return currentOverride.propertyName.toLowerCase() === current.name.toLowerCase();
92
- });
93
- if (referenceOverride) {
94
- const reference = this.build(referenceOverride.referenceName);
95
- properties[current.name] = reference.entrypointReferenceObject;
96
- reference.referenceComponents.forEach((current) => referencedComponents.push(current));
97
- } else {
98
- // Check for "@http-schema" annotations within properties themselves. If these are specified they
99
- // take precedence over the property type itself.
100
- const manuallyDefinedHttpSchema = current.docComment?.annotations.find(
101
- (annotation) => annotation.name.toLowerCase() === 'http-schema',
102
- );
103
- if (manuallyDefinedHttpSchema) {
104
- this.handleOverriddenSchema(manuallyDefinedHttpSchema, properties, current, referencedComponents);
105
- } else {
106
- const pair = this.getReferenceType(current.typeReference);
107
- properties[current.name] = pair.schema;
108
- referencedComponents.push(...pair.referenceComponents);
109
- }
110
- }
111
-
112
- properties[current.name].description = current.docComment?.description;
113
- });
114
- const mainReferenceComponents = this.buildMainReferenceComponent(typeBundle, properties);
115
-
116
- // Make sure to add the "main" reference first
117
- referencedComponents = [...mainReferenceComponents, ...referencedComponents];
118
-
119
- return {
120
- entrypointReferenceObject: {
121
- $ref: `#/components/schemas/${this.getReferenceName(typeBundle)}`,
122
- },
123
- referenceComponents: referencedComponents,
124
- };
125
- }
126
-
127
- private handleOverriddenSchema(
128
- manuallyDefinedHttpSchema: DocCommentAnnotation,
129
- properties: PropertiesObject,
130
- current: FieldMirror | PropertyMirror,
131
- referencedComponents: ReferenceComponent[],
132
- ) {
133
- // This can be of type ApexDocSchemaObject
134
- const inYaml = manuallyDefinedHttpSchema?.bodyLines.reduce((prev, current) => prev + '\n' + current);
135
- const asJson = yaml.load(inYaml) as ApexDocSchemaObject;
136
- const isReferenceString = this.isReferenceString(asJson);
137
-
138
- if (isReferenceString) {
139
- const reference = this.build(asJson);
140
- properties[current.name] = reference.entrypointReferenceObject;
141
- reference.referenceComponents.forEach((current) => referencedComponents.push(current));
142
- } else {
143
- // If we are dealing with a manually defined schema object, we can add it directly to the "properties" map,
144
- // because we don't need to add a reference component.
145
- properties[current.name] = asJson;
146
- }
147
- }
148
-
149
- private getReferenceName(typeBundle: TypeBundleWithIsCollectionAndReferenceOverrides): string {
150
- let referenceName = typeBundle.type.name;
151
- if (typeBundle.isChild) {
152
- referenceName = `${typeBundle.parentType?.name}.${typeBundle.type.name}`;
153
- }
154
- if (typeBundle.isCollection) {
155
- referenceName = `${referenceName}_array`;
156
- }
157
- if (typeBundle.referenceOverrides.length) {
158
- referenceName = `${referenceName}_${typeBundle.originalTypeName}`;
159
- }
160
- return referenceName;
161
- }
162
-
163
- private buildMainReferenceComponent(
164
- typeBundle: TypeBundleWithIsCollectionAndReferenceOverrides,
165
- properties: PropertiesObject,
166
- ): ReferenceComponent[] {
167
- // For the main reference, we always want to get the reference of the object without the collection part,
168
- // so we pass the typeBundle to `getReferenceName` but with the isCollection flag set to false.
169
- const mainReferenceName = this.getReferenceName({ ...typeBundle, isCollection: false });
170
- const mainReference: ReferenceComponent = {
171
- referencedClass: mainReferenceName,
172
- schema: {
173
- type: 'object',
174
- properties: properties,
175
- },
176
- };
177
- const referencedComponents = [mainReference];
178
- if (!typeBundle.isCollection) {
179
- return referencedComponents;
180
- }
181
-
182
- return [
183
- {
184
- referencedClass: this.getReferenceName(typeBundle),
185
- schema: {
186
- type: 'array',
187
- items: {
188
- $ref: `#/components/schemas/${mainReferenceName}`,
189
- },
190
- },
191
- },
192
- ...referencedComponents,
193
- ];
194
- }
195
-
196
- public getReferenceType(typeInMirror: ReferencedType): SchemaObjectReferencePair {
197
- // Returns a valid type supported by OpenApi from a received Apex type.
198
- const typeName = typeInMirror.type.toLowerCase();
199
- switch (typeName) {
200
- case 'boolean':
201
- return { schema: { type: 'boolean' }, referenceComponents: [] };
202
- case 'date':
203
- return { schema: { type: 'string', format: 'date' }, referenceComponents: [] };
204
- case 'datetime':
205
- return { schema: { type: 'string', format: 'date-time' }, referenceComponents: [] };
206
- case 'decimal':
207
- return { schema: { type: 'number' }, referenceComponents: [] };
208
- case 'double':
209
- return { schema: { type: 'number' }, referenceComponents: [] };
210
- case 'id':
211
- return { schema: { type: 'string' }, referenceComponents: [] };
212
- case 'integer':
213
- return { schema: { type: 'integer' }, referenceComponents: [] };
214
- case 'long':
215
- return { schema: { type: 'integer', format: 'int64' }, referenceComponents: [] };
216
- case 'string':
217
- return { schema: { type: 'string' }, referenceComponents: [] };
218
- case 'time':
219
- return { schema: { type: 'string', format: 'time' }, referenceComponents: [] };
220
- case 'list':
221
- return this.buildCollectionPair(typeInMirror);
222
- case 'set':
223
- return this.buildCollectionPair(typeInMirror);
224
- case 'map':
225
- // For Maps, we treat them as objects but do not try to define their shape, because their keys can vary
226
- // at runtime.
227
- return { schema: { type: 'object' }, referenceComponents: [] };
228
- case 'object':
229
- return { schema: { type: 'object' }, referenceComponents: [] };
230
- default: {
231
- // If we got here we are dealing with a non-primitive (most likely a custom class or an SObject).
232
- const referencedType = TypesRepository.getInstance().getFromAllByName(typeName);
233
- if (!referencedType) {
234
- return { schema: { type: 'object' }, referenceComponents: [] };
235
- }
236
- const reference = this.buildReferenceFromType({
237
- ...referencedType,
238
- isCollection: false,
239
- referenceOverrides: [],
240
- originalTypeName: typeName,
241
- });
242
- return {
243
- schema: reference.entrypointReferenceObject,
244
- referenceComponents: [...reference.referenceComponents],
245
- };
246
- }
247
- }
248
- }
249
-
250
- private buildCollectionPair(typeInMirror: ReferencedType) {
251
- const innerReference = this.getReferenceType((typeInMirror as ListObjectType).ofType);
252
- return {
253
- schema: { type: 'array', items: innerReference.schema },
254
- referenceComponents: [...innerReference.referenceComponents],
255
- };
256
- }
257
-
258
- private isReferenceString = (targetObject: unknown): targetObject is string => {
259
- return typeof targetObject === 'string' || targetObject instanceof String;
260
- };
261
- }
262
-
263
- type SchemaObjectReferencePair = {
264
- schema: SchemaObject;
265
- referenceComponents: ReferenceComponent[];
266
- };
267
-
268
- class ReferenceOverrides {
269
- static build(referenceAsString: string): ReferenceOverride[] {
270
- const cleanedUpReference = referenceAsString.replace(/[[\]]/g, '');
271
- const referenceStrings = cleanedUpReference.split(',').map((item) => item.replace(/\s/g, ''));
272
- return referenceStrings.map((item) => {
273
- const [propertyName, referenceName] = item.split(':');
274
- return { propertyName, referenceName };
275
- });
276
- }
277
- }
278
-
279
- type ReferenceOverride = {
280
- propertyName: string;
281
- referenceName: string;
282
- };
283
-
284
- /**
285
- * In case where the Request Body contains a reference, this contains information about the handled reference
286
- */
287
- export type Reference = {
288
- /** OpenApi style reference object for the parent caller */
289
- entrypointReferenceObject: ReferenceObject;
290
- /** List of objects that contain all component references identified by a call to this builder **/
291
- referenceComponents: ReferenceComponent[];
292
- };
293
-
294
- export type ReferenceComponent = {
295
- /** Name of the class being referenced */
296
- referencedClass: string;
297
- /** Parsed representation of the referenced object as an OpenApi Schema object */
298
- schema: SchemaObjectObject | SchemaObjectArray;
299
- };
@@ -1,19 +0,0 @@
1
- import { RequestBody } from '../../../core/openapi/open-api-types';
2
- import { Reference } from './ReferenceBuilder';
3
- import { ApexDocHttpRequestBody } from '../../../core/openapi/apex-doc-types';
4
- import { Builder } from './Builder';
5
-
6
- /**
7
- * Parses and builds OpenApi Request Body objects.
8
- */
9
- export class RequestBodyBuilder extends Builder<RequestBody, ApexDocHttpRequestBody> {
10
- buildBody(apexRequestBody: ApexDocHttpRequestBody, reference?: Reference): RequestBody {
11
- return {
12
- description: apexRequestBody.description,
13
- content: {
14
- 'application/json': { schema: this.getOpenApiSchemaFromApexDocSchema(apexRequestBody, reference) },
15
- },
16
- required: apexRequestBody.required,
17
- };
18
- }
19
- }
@@ -1,21 +0,0 @@
1
- import { ResponseObject } from '../../../core/openapi/open-api-types';
2
- import { Reference } from './ReferenceBuilder';
3
- import { ApexDocHttpResponse } from '../../../core/openapi/apex-doc-types';
4
- import { Builder } from './Builder';
5
-
6
- export class ResponsesBuilder extends Builder<ResponseObject, ApexDocHttpResponse> {
7
- buildBody(apexDocResponseDefinition: ApexDocHttpResponse, reference?: Reference): ResponseObject {
8
- let description = `Status code ${apexDocResponseDefinition.statusCode}`;
9
- if (apexDocResponseDefinition.description) {
10
- description = apexDocResponseDefinition.description;
11
- }
12
- return {
13
- description: description,
14
- content: {
15
- 'application/json': {
16
- schema: this.getOpenApiSchemaFromApexDocSchema(apexDocResponseDefinition, reference),
17
- },
18
- },
19
- };
20
- }
21
- }
@@ -1,44 +0,0 @@
1
- import { ClassMirrorBuilder } from '../../../../test-helpers/ClassMirrorBuilder';
2
- import { MethodMirrorBuilder } from '../../../../test-helpers/MethodMirrorBuilder';
3
- import { AnnotationBuilder } from '../../../../test-helpers/AnnotationBuilder';
4
- import { OpenApi } from '../../../../core/openapi/open-api';
5
- import { MethodParser } from '../MethodParser';
6
- import { DocCommentBuilder } from '../../../../test-helpers/DocCommentBuilder';
7
-
8
- it('should add an endpoint when there is an HTTP method', function () {
9
- const urlEndpoint = '/accounts';
10
-
11
- const classWithGetMethod = new ClassMirrorBuilder()
12
- .addMethod(new MethodMirrorBuilder().addAnnotation(new AnnotationBuilder().withName('httpget').build()).build())
13
- .build();
14
-
15
- const openApi = new OpenApi('Title', '1.0');
16
- openApi.paths[urlEndpoint] = {};
17
-
18
- expect(openApi.paths[urlEndpoint]).not.toHaveProperty('get');
19
-
20
- new MethodParser(openApi).parseMethod(classWithGetMethod, urlEndpoint, 'get', '');
21
-
22
- expect(openApi.paths[urlEndpoint]).toHaveProperty('get');
23
- });
24
-
25
- it('should add an endpoint with a description when the method has an ApexDoc', function () {
26
- const urlEndpoint = '/accounts';
27
-
28
- const classWithGetMethod = new ClassMirrorBuilder()
29
- .addMethod(
30
- new MethodMirrorBuilder()
31
- .addAnnotation(new AnnotationBuilder().withName('httpget').build())
32
- .withDocComment(new DocCommentBuilder().withDescription('Sample Description').build())
33
- .build(),
34
- )
35
- .build();
36
-
37
- const openApi = new OpenApi('Title', '1.0');
38
- openApi.paths[urlEndpoint] = {};
39
-
40
- new MethodParser(openApi).parseMethod(classWithGetMethod, urlEndpoint, 'get', '');
41
-
42
- expect(openApi.paths[urlEndpoint]).toHaveProperty('get');
43
- expect(openApi.paths[urlEndpoint]['get']!.description).toBe('Sample Description');
44
- });
@@ -1,68 +0,0 @@
1
- import { ParameterObjectBuilder } from '../ParameterObjectBuilder';
2
- import { Reference } from '../ReferenceBuilder';
3
- import { ReferenceObject } from '../../../../core/openapi/open-api-types';
4
- import { ApexDocParameterObject } from '../../../../core/openapi/apex-doc-types';
5
-
6
- jest.mock('../ReferenceBuilder', () => {
7
- return {
8
- ReferenceBuilder: jest.fn().mockImplementation(() => {
9
- return {
10
- build: (): Reference => {
11
- return {
12
- referenceComponents: [
13
- {
14
- referencedClass: 'MySampleClass',
15
- schema: {
16
- type: 'string',
17
- },
18
- },
19
- ],
20
- entrypointReferenceObject: {
21
- $ref: '/mySampleClass',
22
- },
23
- };
24
- },
25
- };
26
- }),
27
- };
28
- });
29
-
30
- it('should build a ParameterObject based on the received schema', function () {
31
- const apexDocParameter: ApexDocParameterObject = {
32
- name: 'limit',
33
- in: 'query',
34
- description: 'Sample description',
35
- required: true,
36
- schema: {
37
- type: 'string',
38
- },
39
- };
40
-
41
- const response = new ParameterObjectBuilder().build(apexDocParameter);
42
-
43
- expect(response.reference).toBeUndefined();
44
- expect(response.body.name).toBe('limit');
45
- expect(response.body.in).toBe('query');
46
- expect(response.body.description).toBe('Sample description');
47
- expect(response.body.required).toBe(true);
48
- expect(response.body.schema).toBe(apexDocParameter.schema);
49
- });
50
-
51
- it('should build a ParameterObject with a reference when referencing a different class', function () {
52
- const apexDocParameter: ApexDocParameterObject = {
53
- name: 'limit',
54
- in: 'query',
55
- description: 'Sample description',
56
- required: true,
57
- schema: 'SomeClass',
58
- };
59
-
60
- const response = new ParameterObjectBuilder().build(apexDocParameter);
61
-
62
- expect(response.reference).not.toBeUndefined();
63
- expect(response.body.name).toBe('limit');
64
- expect(response.body.in).toBe('query');
65
- expect(response.body.description).toBe('Sample description');
66
- expect(response.body.required).toBe(true);
67
- expect((response.body.schema as ReferenceObject).$ref).toBe('/mySampleClass');
68
- });