Skip to content

Commit

Permalink
feat: allow destructive changes with MetadataOptions (#1294)
Browse files Browse the repository at this point in the history
* feat: allow destructive changes with MetadataOptions

* test: add a test for only destructive

* chore: update core dep

* chore: update kit dep
  • Loading branch information
shetzel authored Apr 23, 2024
1 parent 1750d02 commit 7dad1c7
Show file tree
Hide file tree
Showing 37 changed files with 1,442 additions and 2,073 deletions.
1,828 changes: 378 additions & 1,450 deletions CHANGELOG.md

Large diffs are not rendered by default.

1,234 changes: 616 additions & 618 deletions METADATA_SUPPORT.md

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@
"node": ">=18.0.0"
},
"dependencies": {
"@salesforce/core": "^7.3.0",
"@salesforce/kit": "^3.1.0",
"@salesforce/core": "^7.3.1",
"@salesforce/kit": "^3.1.1",
"@salesforce/ts-types": "^2.0.9",
"fast-levenshtein": "^3.0.0",
"fast-xml-parser": "^4.3.6",
Expand Down
42 changes: 39 additions & 3 deletions src/collections/componentSetBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,12 @@ import { StateAggregator, Logger, SfError, Messages } from '@salesforce/core';
import fs from 'graceful-fs';
import minimatch from 'minimatch';
import { MetadataComponent } from '../resolve/types';
import { SourceComponent } from '../resolve/sourceComponent';
import { ComponentSet } from '../collections/componentSet';
import { RegistryAccess } from '../registry/registryAccess';
import type { FileProperties } from '../client/types';
import { MetadataType } from '../registry/types';
import { FromConnectionOptions } from './types';
import { DestructiveChangesType, FromConnectionOptions } from './types';

Messages.importMessagesDirectory(__dirname);
const messages = Messages.loadMessages('@salesforce/source-deploy-retrieve', 'sdr');
Expand All @@ -29,6 +30,14 @@ export type ManifestOption = {
type MetadataOption = {
metadataEntries: string[];
directoryPaths: string[];
/**
* Array of metadata type:name pairs to delete before the deploy. Use of wildcards is not allowed.
*/
destructiveEntriesPre?: string[];
/**
* Array of metadata type:name pairs to delete after the deploy. Use of wildcards is not allowed.
*/
destructiveEntriesPost?: string[];
};

type OrgOption = {
Expand Down Expand Up @@ -114,6 +123,26 @@ export class ComponentSetBuilder {
.map(addToComponentSet(componentSetFilter));

logger.debug(`Searching for matching metadata in directories: ${directoryPaths.join(', ')}`);

// add destructive changes if defined. Because these are deletes, all entries
// are resolved to SourceComponents
if (metadata.destructiveEntriesPre) {
metadata.destructiveEntriesPre
.map(entryToTypeAndName(registryAccess))
.map(assertNoWildcardInDestructiveEntries)
.flatMap(typeAndNameToMetadataComponents({ directoryPaths, registry: registryAccess }))
.map((mdComponent) => new SourceComponent({ type: mdComponent.type, name: mdComponent.fullName }))
.map(addToComponentSet(componentSet, DestructiveChangesType.PRE));
}
if (metadata.destructiveEntriesPost) {
metadata.destructiveEntriesPost
.map(entryToTypeAndName(registryAccess))
.map(assertNoWildcardInDestructiveEntries)
.flatMap(typeAndNameToMetadataComponents({ directoryPaths, registry: registryAccess }))
.map((mdComponent) => new SourceComponent({ type: mdComponent.type, name: mdComponent.fullName }))
.map(addToComponentSet(componentSet, DestructiveChangesType.POST));
}

const resolvedComponents = ComponentSet.fromSource({
fsPaths: directoryPaths,
include: componentSetFilter,
Expand Down Expand Up @@ -162,9 +191,9 @@ export class ComponentSetBuilder {
}

const addToComponentSet =
(cs: ComponentSet) =>
(cs: ComponentSet, deletionType?: DestructiveChangesType) =>
(cmp: MetadataComponent): MetadataComponent => {
cs.add(cmp);
cs.add(cmp, deletionType);
return cmp;
};

Expand Down Expand Up @@ -195,6 +224,13 @@ const assertComponentSetIsNotUndefined = (componentSet: ComponentSet | undefined
return componentSet;
};

const assertNoWildcardInDestructiveEntries = (mdEntry: MetadataTypeAndMetadataName): MetadataTypeAndMetadataName => {
if (mdEntry.metadataName.includes('*')) {
throw SfError.create({ message: 'Wildcards are not supported when providing destructive metadata entries' });
}
return mdEntry;
};

/** This is only for debug output of matched files based on the command flags.
* It will log up to 20 file matches. */
const logComponents = (logger: Logger, componentSet: ComponentSet): void => {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
public with sharing class OneClass {
public OneClass() {

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
<apiVersion>59.0</apiVersion>
<status>Active</status>
</ApexClass>
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>RedClass</members>
<name>ApexClass</name>
</types>
<version>60.0</version>
</Package>
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>OneClass</members>
<name>ApexClass</name>
</types>
<version>60.0</version>
</Package>
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>RedClass</members>
<name>ApexClass</name>
</types>
<version>60.0</version>
</Package>
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<version>60.0</version>
</Package>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
public with sharing class OneClass {
public OneClass() {

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
<apiVersion>59.0</apiVersion>
<status>Active</status>
</ApexClass>
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>RedClass</members>
<name>ApexClass</name>
</types>
<version>60.0</version>
</Package>
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>OneClass</members>
<name>ApexClass</name>
</types>
<version>60.0</version>
</Package>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
public with sharing class OneClass {
public OneClass() {

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
<apiVersion>59.0</apiVersion>
<status>Active</status>
</ApexClass>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
public with sharing class TwoClass {
public TwoClass() {

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
<apiVersion>59.0</apiVersion>
<status>Active</status>
</ApexClass>
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>BlueClass</members>
<members>RedClass</members>
<name>ApexClass</name>
</types>
<version>60.0</version>
</Package>
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>OneClass</members>
<members>TwoClass</members>
<name>ApexClass</name>
</types>
<version>60.0</version>
</Package>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
public with sharing class OneClass {
public OneClass() {

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
<apiVersion>59.0</apiVersion>
<status>Active</status>
</ApexClass>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
public with sharing class TwoClass {
public TwoClass() {

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
<apiVersion>59.0</apiVersion>
<status>Active</status>
</ApexClass>
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>BlueClass</members>
<members>RedClass</members>
<name>ApexClass</name>
</types>
<version>60.0</version>
</Package>
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>OneClass</members>
<members>TwoClass</members>
<name>ApexClass</name>
</types>
<version>60.0</version>
</Package>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
public with sharing class BlueClass {
public BlueClass() {

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
<apiVersion>59.0</apiVersion>
<status>Active</status>
</ApexClass>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
public with sharing class OneClass {
public OneClass() {

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
<apiVersion>59.0</apiVersion>
<status>Active</status>
</ApexClass>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
public with sharing class RedClass {
public RedClass() {

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
<apiVersion>59.0</apiVersion>
<status>Active</status>
</ApexClass>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
public with sharing class TwoClass {
public TwoClass() {

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
<apiVersion>59.0</apiVersion>
<status>Active</status>
</ApexClass>
12 changes: 12 additions & 0 deletions test/snapshot/sampleProjects/destructiveCompSets/sfdx-project.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"name": "destructiveCompSetsProject",
"namespace": "",
"packageDirectories": [
{
"default": true,
"path": "force-app"
}
],
"sfdcLoginUrl": "https://login.salesforce.com",
"sourceApiVersion": "52.0"
}
Loading

0 comments on commit 7dad1c7

Please sign in to comment.