@cparra/apexdocs 3.0.0-rc.0 → 3.0.0

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 (107) hide show
  1. package/README.md +50 -571
  2. package/dist/cli/generate.js +73 -3094
  3. package/dist/defaults-BcE8DTat.js +13 -0
  4. package/dist/defaults-D07y_bq4.js +40 -0
  5. package/dist/defaults-gPzwP66p.js +14 -0
  6. package/dist/index.d.ts +35 -3
  7. package/dist/index.js +90 -2
  8. package/dist/logger-BEbUIfqN.js +3282 -0
  9. package/dist/logger-BGuf1PnL.js +3281 -0
  10. package/dist/logger-CWBRF2za.js +3284 -0
  11. package/dist/logger-CdBmDEN1.js +3283 -0
  12. package/dist/logger-Ce4QqPFR.js +3278 -0
  13. package/dist/logger-CyEVYaAC.js +3284 -0
  14. package/dist/logger-D7a83ycP.js +3277 -0
  15. package/dist/logger-DGaHeBKk.js +3279 -0
  16. package/dist/logger-Dqhl_lO_.js +3278 -0
  17. package/dist/logger-aySSWi0G.js +3280 -0
  18. package/dist/logger-qLCcAtiy.js +3284 -0
  19. package/examples/README.md +5 -0
  20. package/examples/docsify/README.md +17 -0
  21. package/examples/docsify/apexdocs.config.ts +13 -0
  22. package/examples/docsify/classes/ASampleClass.cls +57 -0
  23. package/examples/docsify/classes/CodeControl.cls +19 -0
  24. package/examples/docsify/classes/SampleClass.cls +95 -0
  25. package/examples/docsify/classes/SampleInterface.cls +17 -0
  26. package/examples/docsify/classes/SomeDto.cls +122 -0
  27. package/examples/docsify/docs/.nojekyll +0 -0
  28. package/examples/docsify/docs/README.md +25 -0
  29. package/examples/docsify/docs/_config.yml +1 -0
  30. package/examples/docsify/docs/index.html +22 -0
  31. package/examples/docsify/docs/miscellaneous/ASampleClass.md +88 -0
  32. package/examples/docsify/docs/miscellaneous/CodeControl.md +107 -0
  33. package/examples/docsify/docs/miscellaneous/SomeDto.md +244 -0
  34. package/examples/docsify/docs/sample-classes/SampleClass.md +171 -0
  35. package/examples/docsify/docs/sample-interfaces/SampleInterface.md +36 -0
  36. package/examples/docsify/package-lock.json +2459 -0
  37. package/examples/docsify/package.json +14 -0
  38. package/examples/imported/.forceignore +12 -0
  39. package/examples/imported/README.md +6 -0
  40. package/examples/imported/config/project-scratch-def.json +5 -0
  41. package/examples/imported/docs/index.md +109 -0
  42. package/examples/imported/docs/miscellaneous/BaseClass.md +13 -0
  43. package/examples/imported/docs/miscellaneous/MultiInheritanceClass.md +69 -0
  44. package/examples/imported/docs/miscellaneous/ParentInterface.md +12 -0
  45. package/examples/imported/docs/miscellaneous/ReferencedEnum.md +5 -0
  46. package/examples/imported/docs/miscellaneous/SampleException.md +21 -0
  47. package/examples/imported/docs/miscellaneous/SampleInterface.md +113 -0
  48. package/examples/imported/docs/miscellaneous/Url.md +308 -0
  49. package/examples/imported/docs/sample-enums/SampleEnum.md +33 -0
  50. package/examples/imported/docs/samplegroup/SampleClass.md +167 -0
  51. package/examples/imported/force-app/classes/BaseClass.cls +3 -0
  52. package/examples/imported/force-app/classes/MultiInheritanceClass.cls +1 -0
  53. package/examples/imported/force-app/classes/ParentInterface.cls +3 -0
  54. package/examples/imported/force-app/classes/ReferencedEnum.cls +3 -0
  55. package/examples/imported/force-app/classes/SampleClass.cls +72 -0
  56. package/examples/imported/force-app/classes/SampleInterface.cls +50 -0
  57. package/examples/imported/force-app/classes/Url.cls +196 -0
  58. package/examples/imported/package-lock.json +665 -0
  59. package/examples/imported/package.json +6 -0
  60. package/examples/imported/scripts/process-docs.mjs +16 -0
  61. package/examples/imported/sfdx-project.json +12 -0
  62. package/examples/markdown/README.md +7 -0
  63. package/examples/markdown-jsconfig/README.md +9 -0
  64. package/examples/markdown-jsconfig/apexdocs.config.mjs +1 -0
  65. package/examples/markdown-jsconfig/docs/index.md +1 -1
  66. package/examples/open-api/README.md +5 -0
  67. package/examples/open-api/docs/openapi.json +2 -570
  68. package/examples/vitepress/README.md +25 -0
  69. package/examples/vitepress/apexdocs.config.ts +2 -0
  70. package/examples/vitepress/force-app/main/default/classes/{SampleClass.cls → feature-a/SampleClass.cls} +1 -0
  71. package/examples/vitepress/force-app/main/default/classes/feature-a/SampleEnum.cls +30 -0
  72. package/examples/vitepress/force-app/main/default/classes/feature-a/SampleException.cls +17 -0
  73. package/package.json +2 -2
  74. package/src/application/Apexdocs.ts +16 -19
  75. package/src/application/__tests__/apex-file-reader.spec.ts +108 -67
  76. package/src/application/apex-file-reader.ts +1 -0
  77. package/src/application/generators/openapi.ts +17 -13
  78. package/src/cli/args.ts +12 -3
  79. package/src/cli/commands/markdown.ts +14 -9
  80. package/src/cli/commands/openapi.ts +5 -5
  81. package/src/cli/generate.ts +20 -4
  82. package/src/core/markdown/__test__/generating-class-docs.spec.ts +14 -257
  83. package/src/core/markdown/__test__/generating-docs.spec.ts +271 -4
  84. package/src/core/markdown/__test__/generating-enum-docs.spec.ts +4 -264
  85. package/src/core/markdown/__test__/generating-interface-docs.spec.ts +4 -232
  86. package/src/core/markdown/__test__/generating-reference-guide.spec.ts +17 -1
  87. package/src/core/markdown/__test__/test-helpers.ts +3 -1
  88. package/src/core/markdown/adapters/__tests__/interface-adapter.spec.ts +3 -1
  89. package/src/core/markdown/adapters/renderable-to-page-data.ts +6 -4
  90. package/src/core/markdown/generate-docs.ts +13 -15
  91. package/src/core/markdown/reflection/__test__/filter-scope.spec.ts +2 -18
  92. package/src/core/markdown/reflection/__test__/helpers.ts +18 -0
  93. package/src/core/markdown/reflection/__test__/remove-excluded-tags.spec.ts +200 -0
  94. package/src/core/markdown/reflection/remove-excluded-tags.ts +168 -0
  95. package/src/core/markdown/reflection/{sort-members.ts → sort-types-and-members.ts} +7 -5
  96. package/src/core/markdown/templates/reference-guide.ts +2 -2
  97. package/src/core/openapi/__tests__/open-api-docs-processor.spec.ts +6 -3
  98. package/src/core/openapi/open-api-docs-processor.ts +3 -3
  99. package/src/core/openapi/parser.ts +5 -2
  100. package/src/core/shared/types.d.ts +4 -2
  101. package/src/defaults.ts +15 -3
  102. package/src/index.ts +65 -4
  103. package/src/util/error-logger.ts +36 -36
  104. package/src/util/logger.ts +18 -11
  105. /package/examples/{vitepress/force-app/main/default → imported/force-app}/classes/SampleEnum.cls +0 -0
  106. /package/examples/{vitepress/force-app/main/default → imported/force-app}/classes/SampleException.cls +0 -0
  107. /package/examples/vitepress/force-app/main/default/classes/{SampleInterface.cls → feature-a/SampleInterface.cls} +0 -0
package/src/index.ts CHANGED
@@ -11,29 +11,89 @@ import type {
11
11
  TransformDocPage,
12
12
  TransformReference,
13
13
  ConfigurableDocPageReference,
14
+ UserDefinedOpenApiConfig,
15
+ UserDefinedConfig,
14
16
  } from './core/shared/types';
15
- import { defaults } from './defaults';
17
+ import { markdownDefaults, openApiDefaults } from './defaults';
18
+ import { NoLogger } from '#utils/logger';
19
+ import { Apexdocs } from './application/Apexdocs';
20
+ import * as E from 'fp-ts/Either';
16
21
 
17
22
  type ConfigurableMarkdownConfig = Omit<Partial<UserDefinedMarkdownConfig>, 'targetGenerator'>;
18
23
 
24
+ /**
25
+ * Helper function to define a configuration to generate Markdown documentation.
26
+ * @param config The configuration to use.
27
+ */
19
28
  function defineMarkdownConfig(config: ConfigurableMarkdownConfig): Partial<UserDefinedMarkdownConfig> {
20
29
  return {
21
- ...defaults,
30
+ ...markdownDefaults,
22
31
  ...config,
23
- targetGenerator: 'markdown',
32
+ targetGenerator: 'markdown' as const,
24
33
  };
25
34
  }
26
35
 
36
+ type ConfigurableOpenApiConfig = Omit<Partial<UserDefinedOpenApiConfig>, 'targetGenerator'>;
37
+
38
+ /**
39
+ * Helper function to define a configuration to generate OpenAPI documentation.
40
+ * @param config The configuration to use.
41
+ */
42
+ function defineOpenApiConfig(config: ConfigurableOpenApiConfig): Partial<UserDefinedOpenApiConfig> {
43
+ return {
44
+ ...openApiDefaults,
45
+ ...config,
46
+ targetGenerator: 'openapi' as const,
47
+ };
48
+ }
49
+
50
+ /**
51
+ * Represents a file to be skipped.
52
+ */
27
53
  function skip(): Skip {
28
54
  return {
29
55
  _tag: 'Skip',
30
56
  };
31
57
  }
32
58
 
33
- // Exports
59
+ type CallableConfig = Partial<UserDefinedConfig> & { sourceDir: string; targetGenerator: 'markdown' | 'openapi' };
60
+
61
+ async function process(config: CallableConfig): Promise<void> {
62
+ const logger = new NoLogger();
63
+ const configWithDefaults = {
64
+ ...getDefault(config),
65
+ ...config,
66
+ };
67
+
68
+ if (!configWithDefaults.sourceDir) {
69
+ throw new Error('sourceDir is required');
70
+ }
71
+
72
+ const result = await Apexdocs.generate(configWithDefaults as UserDefinedConfig, logger);
73
+ E.match(
74
+ (errors) => {
75
+ throw errors;
76
+ },
77
+ () => {},
78
+ )(result);
79
+ }
80
+
81
+ function getDefault(config: CallableConfig) {
82
+ switch (config.targetGenerator) {
83
+ case 'markdown':
84
+ return markdownDefaults;
85
+ case 'openapi':
86
+ return openApiDefaults;
87
+ default:
88
+ throw new Error('Unknown target generator');
89
+ }
90
+ }
34
91
 
35
92
  export {
36
93
  defineMarkdownConfig,
94
+ ConfigurableMarkdownConfig,
95
+ defineOpenApiConfig,
96
+ ConfigurableOpenApiConfig,
37
97
  skip,
38
98
  TransformReferenceGuide,
39
99
  TransformDocs,
@@ -46,4 +106,5 @@ export {
46
106
  Skip,
47
107
  ConfigurableDocPageData,
48
108
  ConfigurableDocPageReference,
109
+ process,
49
110
  };
@@ -2,90 +2,90 @@ import { ClassMirror, InterfaceMirror, Type } from '@cparra/apex-reflection';
2
2
  import { Logger } from './logger';
3
3
 
4
4
  export default class ErrorLogger {
5
- public static logErrors(types: Type[]): void {
5
+ public static logErrors(logger: Logger, types: Type[]): void {
6
6
  types.forEach((currentType) => {
7
- this.logErrorsForSingleType(currentType);
7
+ this.logErrorsForSingleType(logger, currentType);
8
8
  });
9
9
  }
10
10
 
11
- private static logErrorsForSingleType(currentType: Type): void {
12
- this.logTypeErrors(currentType);
11
+ private static logErrorsForSingleType(logger: Logger, currentType: Type): void {
12
+ this.logTypeErrors(logger, currentType);
13
13
 
14
14
  if (currentType.type_name === 'class') {
15
- this.logErrorsForClass(currentType as ClassMirror);
15
+ this.logErrorsForClass(logger, currentType as ClassMirror);
16
16
  } else if (currentType.type_name === 'interface') {
17
- this.logErrorsForInterface(currentType as InterfaceMirror);
17
+ this.logErrorsForInterface(logger, currentType as InterfaceMirror);
18
18
  }
19
19
  }
20
20
 
21
- private static logTypeErrors(currentType: Type, parentType?: Type) {
21
+ private static logTypeErrors(logger: Logger, currentType: Type, parentType?: Type) {
22
22
  if (currentType.docComment?.error) {
23
23
  const typeName = parentType ? `${parentType!.name}.${currentType.name}` : currentType.name;
24
- Logger.error(`${typeName} - Doc comment parsing error. Level: Type`);
25
- Logger.error(`Comment:\n ${currentType.docComment.rawDeclaration}`);
26
- Logger.error(currentType.docComment.error);
27
- Logger.error('=================================');
24
+ logger.error(`${typeName} - Doc comment parsing error. Level: Type`);
25
+ logger.error(`Comment:\n ${currentType.docComment.rawDeclaration}`);
26
+ logger.error(currentType.docComment.error);
27
+ logger.error('=================================');
28
28
  }
29
29
  }
30
30
 
31
- private static logErrorsForClass(classMirror: ClassMirror, parentType?: Type): void {
31
+ private static logErrorsForClass(logger: Logger, classMirror: ClassMirror, parentType?: Type): void {
32
32
  const typeName = parentType ? `${parentType!.name}.${classMirror.name}` : classMirror.name;
33
33
  classMirror.constructors.forEach((currentConstructor) => {
34
34
  if (currentConstructor.docComment?.error) {
35
- Logger.error(`${typeName} - Doc comment parsing error. Level: Constructor`);
36
- Logger.error(`Comment:\n ${currentConstructor.docComment.rawDeclaration}`);
37
- Logger.error(currentConstructor.docComment.error);
38
- Logger.error('=================================');
35
+ logger.error(`${typeName} - Doc comment parsing error. Level: Constructor`);
36
+ logger.error(`Comment:\n ${currentConstructor.docComment.rawDeclaration}`);
37
+ logger.error(currentConstructor.docComment.error);
38
+ logger.error('=================================');
39
39
  }
40
40
  });
41
41
 
42
42
  classMirror.fields.forEach((currentField) => {
43
43
  if (currentField.docComment?.error) {
44
- Logger.error(`${typeName} - Doc comment parsing error. Level: Field`);
45
- Logger.error(`Comment:\n ${currentField.docComment.rawDeclaration}`);
46
- Logger.error(currentField.docComment.error);
47
- Logger.error('=================================');
44
+ logger.error(`${typeName} - Doc comment parsing error. Level: Field`);
45
+ logger.error(`Comment:\n ${currentField.docComment.rawDeclaration}`);
46
+ logger.error(currentField.docComment.error);
47
+ logger.error('=================================');
48
48
  }
49
49
  });
50
50
 
51
51
  classMirror.properties.forEach((currentProperty) => {
52
52
  if (currentProperty.docComment?.error) {
53
- Logger.error(`${typeName} - Doc comment parsing error. Level: Property`);
54
- Logger.error(`Comment:\n ${currentProperty.docComment.rawDeclaration}`);
55
- Logger.error(currentProperty.docComment.error);
56
- Logger.error('=================================');
53
+ logger.error(`${typeName} - Doc comment parsing error. Level: Property`);
54
+ logger.error(`Comment:\n ${currentProperty.docComment.rawDeclaration}`);
55
+ logger.error(currentProperty.docComment.error);
56
+ logger.error('=================================');
57
57
  }
58
58
  });
59
59
 
60
60
  classMirror.methods.forEach((currentMethod) => {
61
61
  if (currentMethod.docComment?.error) {
62
- Logger.error(`${typeName} - Doc comment parsing error. Level: Method`);
63
- Logger.error(`Comment:\n ${currentMethod.docComment.rawDeclaration}`);
64
- Logger.error(currentMethod.docComment.error);
65
- Logger.error('=================================');
62
+ logger.error(`${typeName} - Doc comment parsing error. Level: Method`);
63
+ logger.error(`Comment:\n ${currentMethod.docComment.rawDeclaration}`);
64
+ logger.error(currentMethod.docComment.error);
65
+ logger.error('=================================');
66
66
  }
67
67
  });
68
68
 
69
69
  classMirror.enums.forEach((currentEnum) => {
70
- this.logErrorsForSingleType(currentEnum);
70
+ this.logErrorsForSingleType(logger, currentEnum);
71
71
  });
72
72
 
73
73
  classMirror.interfaces.forEach((currentInterface) => {
74
- this.logErrorsForSingleType(currentInterface);
74
+ this.logErrorsForSingleType(logger, currentInterface);
75
75
  });
76
76
 
77
77
  classMirror.classes.forEach((currentClass) => {
78
- this.logErrorsForSingleType(currentClass);
78
+ this.logErrorsForSingleType(logger, currentClass);
79
79
  });
80
80
  }
81
81
 
82
- private static logErrorsForInterface(interfaceMirror: InterfaceMirror): void {
82
+ private static logErrorsForInterface(logger: Logger, interfaceMirror: InterfaceMirror): void {
83
83
  interfaceMirror.methods.forEach((currentMethod) => {
84
84
  if (currentMethod.docComment?.error) {
85
- Logger.error(`${interfaceMirror.name} - Doc comment parsing error. Level: Method`);
86
- Logger.error(`Comment: ${currentMethod.docComment.rawDeclaration}`);
87
- Logger.error(currentMethod.docComment.error);
88
- Logger.error('=================================');
85
+ logger.error(`${interfaceMirror.name} - Doc comment parsing error. Level: Method`);
86
+ logger.error(`Comment: ${currentMethod.docComment.rawDeclaration}`);
87
+ logger.error(currentMethod.docComment.error);
88
+ logger.error('=================================');
89
89
  }
90
90
  });
91
91
  }
@@ -1,16 +1,21 @@
1
1
  import chalk from 'chalk';
2
+
3
+ export interface Logger {
4
+ log(message: string, ...args: string[]): void;
5
+ error(message: unknown, ...args: string[]): void;
6
+ logSingle(text: unknown, color?: 'green' | 'red'): void;
7
+ }
8
+
2
9
  /**
3
10
  * Logs messages to the console.
4
11
  */
5
- export class Logger {
6
- static currentFrame = 0;
7
-
12
+ export class StdOutLogger {
8
13
  /**
9
14
  * Logs a message with optional arguments.
10
15
  * @param message The message to log.
11
16
  * @param args Optional arguments.
12
17
  */
13
- public static log(message: string, ...args: string[]) {
18
+ public log(message: string, ...args: string[]) {
14
19
  this.logSingle(message);
15
20
  args.forEach((arg) => {
16
21
  this.logSingle(arg);
@@ -22,23 +27,25 @@ export class Logger {
22
27
  * @param message The error message to log.
23
28
  * @param args Optional arguments.
24
29
  */
25
- public static error(message: unknown, ...args: string[]) {
30
+ public error(message: unknown, ...args: string[]) {
26
31
  this.logSingle(message, 'red');
27
32
  args.forEach(() => {
28
33
  this.logSingle(message, 'red');
29
34
  });
30
35
  }
31
36
 
32
- public static logSingle(text: unknown, color: 'green' | 'red' = 'green') {
33
- if (this.currentFrame > 9) {
34
- this.currentFrame = 0;
35
- }
36
-
37
+ public logSingle(text: unknown, color: 'green' | 'red' = 'green') {
37
38
  const logMessage = `${this.getChalkFn(color)(new Date().toLocaleString() + ': ')}${text}\n`;
38
39
  process.stdout.write(logMessage);
39
40
  }
40
41
 
41
- private static getChalkFn(color: 'green' | 'red') {
42
+ private getChalkFn(color: 'green' | 'red') {
42
43
  return color === 'green' ? chalk.green : chalk.red;
43
44
  }
44
45
  }
46
+
47
+ export class NoLogger implements Logger {
48
+ public log() {}
49
+ public error() {}
50
+ public logSingle() {}
51
+ }