diff --git a/.gitignore b/.gitignore
index 4c28f20d..18a056fc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,3 +8,12 @@ npm-debug.log
/dist/
/lib/
.sfdx/
+
+# Added by Illuminated Cloud
+.localdev/
+/IlluminatedCloud/
+/out/
+target/
+/.illuminatedCloud/
+**/tsconfig*.json
+**/*.tsbuildinfo
\ No newline at end of file
diff --git a/.idea/apexdocs.iml b/.idea/apexdocs.iml
index 953fab95..231d18d7 100644
--- a/.idea/apexdocs.iml
+++ b/.idea/apexdocs.iml
@@ -38,5 +38,6 @@
+
\ No newline at end of file
diff --git a/README.md b/README.md
index 1b683a41..7f0ed99e 100644
--- a/README.md
+++ b/README.md
@@ -463,6 +463,39 @@ Allows changing the frontmatter and content of the changelog page.
type TransformChangeLogPage = (
changelog: ChangeLogPageData,
) => Partial | Promise>
+
+// Supporting types
+
+type ChangeLogPageData = {
+ source: SourceChangelog;
+ frontmatter: string | Record;
+ content: string;
+ outputDocPath: string;
+};
+
+type SourceChangelog = {
+ fileChanges: FileChange[];
+};
+
+type FileChange = {
+ name: string;
+ fileType: 'apex' | 'customobject';
+ changeType: 'added' | 'removed' | 'changed';
+ changes?: {
+ addedMethods?: string[];
+ removedMethods?: string[];
+ addedFields?: string[];
+ removedFields?: string[];
+ addedProperties?: string[];
+ removedProperties?: string[];
+ addedCustomFields?: string[];
+ removedCustomFields?: string[];
+ addedSubtypes?: string[];
+ removedSubtypes?: string[];
+ addedEnumValues?: string[];
+ removedEnumValues?: string[];
+ };
+};
```
Example
diff --git a/package-lock.json b/package-lock.json
index b0db8aca..57df2ebb 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@cparra/apexdocs",
- "version": "3.5.1",
+ "version": "3.7.2-alpha.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@cparra/apexdocs",
- "version": "3.5.1",
+ "version": "3.7.2-alpha.0",
"license": "MIT",
"dependencies": {
"@cparra/apex-reflection": "2.16.0",
diff --git a/package.json b/package.json
index 4893cd04..9928cf98 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@cparra/apexdocs",
- "version": "3.6.0",
+ "version": "3.7.0",
"description": "Library with CLI capabilities to generate documentation for Salesforce Apex classes.",
"keywords": [
"apex",
diff --git a/src/core/changelog/generate-change-log.ts b/src/core/changelog/generate-change-log.ts
index a19564d5..a11d7daa 100644
--- a/src/core/changelog/generate-change-log.ts
+++ b/src/core/changelog/generate-change-log.ts
@@ -24,6 +24,7 @@ import { Type } from '@cparra/apex-reflection';
import { filterApexSourceFiles, filterCustomObjectsAndFields } from '#utils/source-bundle-utils';
import { CustomFieldMetadata } from '../reflection/sobject/reflect-custom-field-source';
import { hookableTemplate } from '../markdown/templates/hookable';
+import changelogToSourceChangelog from './helpers/changelog-to-source-changelog';
type Config = Omit;
@@ -38,7 +39,9 @@ export function generateChangeLog(
if (config.skipIfNoChanges && !hasChanges(changelog)) {
return skip();
}
- return pipe(convertToRenderableChangelog(changelog, newManifest.types), compile, convertToPageData);
+ return pipe(convertToRenderableChangelog(changelog, newManifest.types), compile, (content) =>
+ convertToPageData(content, changelog),
+ );
}
return pipe(
@@ -106,8 +109,9 @@ function compile(renderable: RenderableChangelog): string {
return Template.getInstance().compile(compilationRequest);
}
-function toPageData(fileName: string, content: string): ChangeLogPageData {
+function toPageData(fileName: string, content: string, changelog: Changelog): ChangeLogPageData {
return {
+ source: changelogToSourceChangelog(changelog),
frontmatter: null,
content,
outputDocPath: `${fileName}.md`,
diff --git a/src/core/changelog/helpers/changelog-to-source-changelog.ts b/src/core/changelog/helpers/changelog-to-source-changelog.ts
new file mode 100644
index 00000000..2da4d4a9
--- /dev/null
+++ b/src/core/changelog/helpers/changelog-to-source-changelog.ts
@@ -0,0 +1,103 @@
+import { Changelog } from '../process-changelog';
+import { FileChange, SourceChangelog } from '../../shared/types';
+
+/**
+ * Converts a Changelog to a SourceChangelog, which is a version of a Changelog that is exposed through the hook.
+ * We have this conversion to avoid exposing the internal Changelog structure to the hook.
+ * @param changelog The Changelog to convert.
+ * @returns The SourceChangelog.
+ */
+export default function (changelog: Changelog): SourceChangelog {
+ const newApexTypes = changelog.newApexTypes.map((newType) => {
+ return {
+ name: newType,
+ fileType: 'apex',
+ changeType: 'added',
+ };
+ });
+
+ const removedApexTypes = changelog.removedApexTypes.map((removedType) => {
+ return {
+ name: removedType,
+ fileType: 'apex',
+ changeType: 'removed',
+ };
+ });
+
+ const newCustomObjects = changelog.newCustomObjects.map((newType) => {
+ return {
+ name: newType,
+ fileType: 'customobject',
+ changeType: 'added',
+ };
+ });
+
+ const removedCustomObjects = changelog.removedCustomObjects.map((removedType) => {
+ return {
+ name: removedType,
+ fileType: 'customobject',
+ changeType: 'removed',
+ };
+ });
+
+ const modifiedApexTypes = changelog.newOrModifiedApexMembers.map((modifiedType) => {
+ return {
+ name: modifiedType.typeName,
+ fileType: 'apex',
+ changeType: 'changed',
+ changes: {
+ addedMethods: modifiedType.modifications.filter((mod) => mod.__typename === 'NewMethod').map((mod) => mod.name),
+ removedMethods: modifiedType.modifications
+ .filter((mod) => mod.__typename === 'RemovedMethod')
+ .map((mod) => mod.name),
+ addedFields: modifiedType.modifications.filter((mod) => mod.__typename === 'NewField').map((mod) => mod.name),
+ removedFields: modifiedType.modifications
+ .filter((mod) => mod.__typename === 'RemovedField')
+ .map((mod) => mod.name),
+ addedProperties: modifiedType.modifications
+ .filter((mod) => mod.__typename === 'NewProperty')
+ .map((mod) => mod.name),
+ removedProperties: modifiedType.modifications
+ .filter((mod) => mod.__typename === 'RemovedProperty')
+ .map((mod) => mod.name),
+ addedSubtypes: modifiedType.modifications.filter((mod) => mod.__typename === 'NewType').map((mod) => mod.name),
+ removedSubtypes: modifiedType.modifications
+ .filter((mod) => mod.__typename === 'RemovedType')
+ .map((mod) => mod.name),
+ addedEnumValues: modifiedType.modifications
+ .filter((mod) => mod.__typename === 'NewEnumValue')
+ .map((mod) => mod.name),
+ removedEnumValues: modifiedType.modifications
+ .filter((mod) => mod.__typename === 'RemovedEnumValue')
+ .map((mod) => mod.name),
+ },
+ };
+ });
+
+ const modifiedCustomObjects = changelog.customObjectModifications.map((modifiedType) => {
+ return {
+ name: modifiedType.typeName,
+ fileType: 'customobject',
+ changeType: 'changed',
+ changes: {
+ addedCustomFields: modifiedType.modifications
+ .filter((mod) => mod.__typename === 'NewField')
+ .map((mod) => mod.name),
+ removedCustomFields: modifiedType.modifications
+ .filter((mod) => mod.__typename === 'RemovedField')
+ .map((mod) => mod.name),
+ },
+ };
+ });
+
+ return {
+ fileChanges: [
+ ...newApexTypes,
+ ...removedApexTypes,
+ ...newCustomObjects,
+ ...removedCustomObjects,
+ ...modifiedApexTypes,
+ ...modifiedCustomObjects,
+ ],
+ };
+}
diff --git a/src/core/reflection/sobject/parse-picklist-values.ts b/src/core/reflection/sobject/parse-picklist-values.ts
index 1316b752..c9a47dfb 100644
--- a/src/core/reflection/sobject/parse-picklist-values.ts
+++ b/src/core/reflection/sobject/parse-picklist-values.ts
@@ -22,8 +22,8 @@ function toPickListValues(customField: MaybeTyped): string[] | undefined {
if ('valueSetDefinition' in valueSet) {
const valueSetDefinition = valueSet.valueSetDefinition as object;
if ('value' in valueSetDefinition) {
- const pickListValues = valueSetDefinition.value as object[];
- return pickListValues.filter((each) => 'fullName' in each).map((each) => each.fullName as string);
+ const pickListValues = valueSetDefinition.value as Record<'fullName', string>[];
+ return pickListValues.filter((each) => 'fullName' in each).map((current) => current.fullName);
}
}
}
diff --git a/src/core/shared/types.d.ts b/src/core/shared/types.d.ts
index 70c7c1fd..0e3157db 100644
--- a/src/core/shared/types.d.ts
+++ b/src/core/shared/types.d.ts
@@ -143,7 +143,32 @@ export type DocPageData = {
export type OpenApiPageData = Omit;
+export type FileChange = {
+ name: string;
+ fileType: 'apex' | 'customobject';
+ changeType: 'added' | 'removed' | 'changed';
+ changes?: {
+ addedMethods?: string[];
+ removedMethods?: string[];
+ addedFields?: string[];
+ removedFields?: string[];
+ addedProperties?: string[];
+ removedProperties?: string[];
+ addedCustomFields?: string[];
+ removedCustomFields?: string[];
+ addedSubtypes?: string[];
+ removedSubtypes?: string[];
+ addedEnumValues?: string[];
+ removedEnumValues?: string[];
+ };
+};
+
+export type SourceChangelog = {
+ fileChanges: FileChange[];
+};
+
export type ChangeLogPageData = {
+ source: SourceChangelog;
frontmatter: Frontmatter;
content: string;
outputDocPath: string;
diff --git a/src/index.ts b/src/index.ts
index ed38ae86..557aa5a4 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -6,6 +6,7 @@ import type {
DocPageData,
DocPageReference,
ChangeLogPageData,
+ SourceChangelog,
ConfigurableDocPageData,
TransformReferenceGuide,
TransformDocs,
@@ -79,6 +80,7 @@ export {
ReferenceGuidePageData,
DocPageData,
ChangeLogPageData,
+ SourceChangelog,
DocPageReference,
Skip,
ConfigurableDocPageData,