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,