The purpose of this library is to visualize using Neo4J, metadata dependencies in a Salesforce Org. This can be extremely useful in trying to determine the Package boundaries for very large and complex Orgs.
The library uses the sfdc-soup library to get the Dependencies and Usages of the metadata. It then determines which of those dependencies are already packaged and creates a dependency to the package instead. This considerably reduces the complexity of the Neo4J Graph that is generated and the Graph is much easier to work it.
The Dependencies and Usages of the metadata are exported in 2 formats:
- JSON
- CYPHER Statements for importing into a Neo4J Database
Click here or on the image below to watch how to use this package
-
Install NodeJs
-
Install Salesforce CLI
-
Install Neo4J
-
Login to your Salesforce Org and enable Classic Mode
-
Authenticate to your Salesforce Org using the Salesforce CLI
-
Run the following command to get your Salesforce Access Token
sfdx org display user -o <YOUR_SALESFORCE_USERNAME> --json
Run npm install
npm run object-graph -- \
--sbxUrl <SANDBOX_URL> \
--accessToken <ACCESS_TOKEN> \
--objName <OBJECT_NAME> \ # e.g. HelloWorld
--objType <OBJECT_TYPE> \ # e.g. ApexClass
--objId <18_CHAR_OBJECT_ID> \
--outputDir <OUTPUT_DIR> # Make sure directory exists
If you have access to the source, e.g., if all your Apex classes where in a filesystem directory, you could run the following command
npm run objects-graph -- \
--sbxUrl <SANDBOX_URL> \
--sbxUser <SANDBOX_USER> \
--accessToken <ACCESS_TOKEN> \
--inputDir <INPUT_DIR> \
--objType <OBJECT_TYPE> \ # e.g. ApexClass
--outputDir <OUTPUT_DIR> # Make sure directory exists
Once the previous command has generated the cypher statement(s), the following script can be used to import multiple cypher statements into a Neo4J database:
CYPHER_DIR="" # Use the <OUTPUT_DIR> from the previous command
total_count=$(ls $CYPHER_DIR/*.cypher | wc -l)
counter=1
for cypher_file in $CYPHER_DIR/*.cypher;
do
echo "Processing [$counter] of [$total_count]: $cypher_file"
cat $cypher_file | cypher-shell -u neo4j -p '<db-password>'
counter=$[$counter +1]
done
-
The library can determine if a metadata is part of a package, only for the following metadata:
- ApexClass
- ApexTrigger
- CustomField
- CustomObject
-
The following types of metadata are EXCLUDED from the Dependency and Usage Graph:
- AssignmentRule
- CustomNotificationType
- CustomPermission
- EmailTemplate
- Layout
- PermissionSet
- PermissionSetGroup
- PermissionSetLicense
- Profile
- Queue
- RecordType
- Report
- Role
- Skill
- User
- UserLicense