From 9b96be7bfe16b6f8cf61a8af4fcda48d0ab634d6 Mon Sep 17 00:00:00 2001 From: cesarParra Date: Mon, 25 Nov 2024 10:48:02 -0400 Subject: [PATCH 1/4] Initial commit --- .gitignore | 9 ++ .idea/apexdocs.iml | 1 + src/core/changelog/generate-change-log.ts | 104 +++++++++++++++++- .../sobject/parse-picklist-values.ts | 4 +- src/core/shared/types.d.ts | 25 +++++ 5 files changed, 139 insertions(+), 4 deletions(-) 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/src/core/changelog/generate-change-log.ts b/src/core/changelog/generate-change-log.ts index a19564d5..4b5880b7 100644 --- a/src/core/changelog/generate-change-log.ts +++ b/src/core/changelog/generate-change-log.ts @@ -1,7 +1,9 @@ import { ChangeLogPageData, + FileChange, ParsedFile, Skip, + SourceChangelog, TransformChangelogPage, UnparsedApexBundle, UnparsedSourceBundle, @@ -38,7 +40,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,14 +110,110 @@ 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`, }; } +function changelogToSourceChangelog(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, + ], + }; +} + function transformChangelogPageHook(config: Config) { return (page: ChangeLogPageData | Skip) => TE.tryCatch( 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; From 4b5efb075e1ffadf384b118f3ec4db81f29acaa1 Mon Sep 17 00:00:00 2001 From: cesarParra Date: Mon, 25 Nov 2024 10:56:08 -0400 Subject: [PATCH 2/4] Releasing alpha version for testing --- package-lock.json | 4 +- package.json | 2 +- src/core/changelog/generate-change-log.ts | 98 +---------------- .../helpers/changelog-to-source-changelog.ts | 103 ++++++++++++++++++ src/index.ts | 2 + 5 files changed, 109 insertions(+), 100 deletions(-) create mode 100644 src/core/changelog/helpers/changelog-to-source-changelog.ts 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..9637b174 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@cparra/apexdocs", - "version": "3.6.0", + "version": "3.7.0-alpha.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 4b5880b7..a11d7daa 100644 --- a/src/core/changelog/generate-change-log.ts +++ b/src/core/changelog/generate-change-log.ts @@ -1,9 +1,7 @@ import { ChangeLogPageData, - FileChange, ParsedFile, Skip, - SourceChangelog, TransformChangelogPage, UnparsedApexBundle, UnparsedSourceBundle, @@ -26,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; @@ -119,101 +118,6 @@ function toPageData(fileName: string, content: string, changelog: Changelog): Ch }; } -function changelogToSourceChangelog(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, - ], - }; -} - function transformChangelogPageHook(config: Config) { return (page: ChangeLogPageData | Skip) => TE.tryCatch( 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/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, From 5e560a0448e4b1c1a2296e287f593b166dca4583 Mon Sep 17 00:00:00 2001 From: cesarParra Date: Tue, 26 Nov 2024 08:50:40 -0400 Subject: [PATCH 3/4] Improved hooks documentation update --- README.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) 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 From cb07dc04098b15e32cdd859e68a16428c100d19a Mon Sep 17 00:00:00 2001 From: cesarParra Date: Tue, 26 Nov 2024 08:51:14 -0400 Subject: [PATCH 4/4] Releasing 3.7.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9637b174..9928cf98 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@cparra/apexdocs", - "version": "3.7.0-alpha.0", + "version": "3.7.0", "description": "Library with CLI capabilities to generate documentation for Salesforce Apex classes.", "keywords": [ "apex",