@jayree/sfdx-plugin-manifest 2.6.3 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +48 -53
  3. package/lib/SDR-extra/collections/componentSetExtra.d.ts +2 -3
  4. package/lib/SDR-extra/collections/componentSetExtra.js +32 -15
  5. package/lib/SDR-extra/collections/componentSetExtra.js.map +1 -1
  6. package/lib/SDR-extra/collections/index.d.ts +1 -0
  7. package/lib/SDR-extra/collections/index.js +8 -0
  8. package/lib/SDR-extra/collections/index.js.map +1 -0
  9. package/lib/SDR-extra/index.d.ts +3 -0
  10. package/lib/SDR-extra/index.js +10 -0
  11. package/lib/SDR-extra/index.js.map +1 -0
  12. package/lib/SDR-extra/resolve/gitDiffResolver.d.ts +9 -4
  13. package/lib/SDR-extra/resolve/gitDiffResolver.js +88 -79
  14. package/lib/SDR-extra/resolve/gitDiffResolver.js.map +1 -1
  15. package/lib/SDR-extra/resolve/index.d.ts +2 -0
  16. package/lib/SDR-extra/resolve/index.js +9 -0
  17. package/lib/SDR-extra/resolve/index.js.map +1 -0
  18. package/lib/SDR-extra/resolve/treeContainersExtra.d.ts +2 -1
  19. package/lib/SDR-extra/resolve/treeContainersExtra.js +9 -7
  20. package/lib/SDR-extra/resolve/treeContainersExtra.js.map +1 -1
  21. package/lib/SDR-extra/utils/index.d.ts +1 -0
  22. package/lib/SDR-extra/utils/index.js +8 -0
  23. package/lib/SDR-extra/utils/index.js.map +1 -0
  24. package/lib/SDR-extra/utils/localGitRepo.d.ts +39 -0
  25. package/lib/SDR-extra/utils/localGitRepo.js +239 -0
  26. package/lib/SDR-extra/utils/localGitRepo.js.map +1 -0
  27. package/lib/commands/jayree/manifest/beta/git/diff.d.ts +18 -14
  28. package/lib/commands/jayree/manifest/beta/git/diff.js +44 -35
  29. package/lib/commands/jayree/manifest/beta/git/diff.js.map +1 -1
  30. package/lib/commands/jayree/manifest/cleanup.d.ts +1 -2
  31. package/lib/commands/jayree/manifest/cleanup.js +1 -1
  32. package/lib/commands/jayree/manifest/cleanup.js.map +1 -1
  33. package/lib/commands/jayree/manifest/git/diff.d.ts +5 -2
  34. package/lib/commands/jayree/manifest/git/diff.js.map +1 -1
  35. package/lib/utils/gitdiff.js +10 -2
  36. package/lib/utils/gitdiff.js.map +1 -1
  37. package/messages/gitdiffbeta.md +67 -0
  38. package/oclif.manifest.json +1 -1
  39. package/package.json +9 -5
  40. package/schemas/jayree-manifest-beta-git-diff.json +38 -0
  41. package/schemas/jayree-manifest-generate.json +51 -0
  42. package/schemas/jayree-manifest-git-diff.json +19 -0
  43. package/lib/SDR-extra/utils/git-extra.d.ts +0 -65
  44. package/lib/SDR-extra/utils/git-extra.js +0 -198
  45. package/lib/SDR-extra/utils/git-extra.js.map +0 -1
  46. package/messages/gitdiffbeta.json +0 -17
package/CHANGELOG.md CHANGED
@@ -1,3 +1,23 @@
1
+ # [2.7.0](https://github.com/jayree/sfdx-plugin-manifest/compare/v2.6.4...v2.7.0) (2023-01-09)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **manifest:beta:git:diff:** fix output if ref2 is set ([9886831](https://github.com/jayree/sfdx-plugin-manifest/commit/9886831f7533d2b9d2bfdba2f1da5f94f2eb3caa))
7
+
8
+
9
+ ### Features
10
+
11
+ * **manifest:beta:git:diff:** more enhancements and new sf flags. -d is now used for --source-dir ([1c6be65](https://github.com/jayree/sfdx-plugin-manifest/commit/1c6be65967f6c1fd0afa6ae590466563347d80aa))
12
+
13
+ ## [2.6.4](https://github.com/jayree/sfdx-plugin-manifest/compare/v2.6.3...v2.6.4) (2023-01-09)
14
+
15
+
16
+ ### Bug Fixes
17
+
18
+ * **manifest:beta:git:diff:** fix sourcepath parameter ([0cc68bf](https://github.com/jayree/sfdx-plugin-manifest/commit/0cc68bf9547cc3ea67c0b6b591c2166f2debc852))
19
+ * **manifest:git:diff:** ignore modified forceignored metadata ([a264829](https://github.com/jayree/sfdx-plugin-manifest/commit/a26482954f18cb316b71e79d53191f2e6307b4c6))
20
+
1
21
  ## [2.6.3](https://github.com/jayree/sfdx-plugin-manifest/compare/v2.6.2...v2.6.3) (2023-01-06)
2
22
 
3
23
 
package/README.md CHANGED
@@ -3,32 +3,16 @@
3
3
  A Salesforce CLI plugin containing commands for creating manifest files from Salesforce orgs or git commits of sfdx projects.
4
4
 
5
5
  [![sfdx](https://img.shields.io/badge/cli-sfdx-brightgreen.svg)](https://developer.salesforce.com/tools/sfdxcli)
6
- [![Version](https://img.shields.io/npm/v/@jayree/sfdx-plugin-manifest.svg)](https://npmjs.org/package/@jayree/sfdx-plugin-manifest)
6
+ [![NPM](https://img.shields.io/npm/v/@jayree/sfdx-plugin-manifest.svg?label=@jayree/sfdx-plugin-manifest)](https://npmjs.org/package/@jayree/sfdx-plugin-manifest)
7
7
  [![test-and-release](https://github.com/jayree/sfdx-plugin-manifest/actions/workflows/release.yml/badge.svg)](https://github.com/jayree/sfdx-plugin-manifest/actions/workflows/release.yml)
8
8
  [![Downloads/week](https://img.shields.io/npm/dw/@jayree/sfdx-plugin-manifest.svg)](https://npmjs.org/package/@jayree/sfdx-plugin-manifest)
9
9
  [![License](https://img.shields.io/npm/l/@jayree/sfdx-plugin-manifest.svg)](https://github.com/jayree-plugins/sfdx-plugin-manifest/blob/main/package.json)
10
10
 
11
- <!-- toc -->
12
- * [Usage](#usage)
13
- * [Commands](#commands)
14
- <!-- tocstop -->
15
- <!-- install -->
16
-
17
- ## Usage
18
-
19
- <!-- usage -->
20
- ```sh-session
21
- $ sfdx plugins:install @jayree/sfdx-plugin-manifest
22
- $ sfdx jayree:[COMMAND]
23
- running command...
24
- $ sfdx plugins
25
- @jayree/sfdx-plugin-manifest 2.6.3
26
- $ sfdx help jayree:[COMMAND]
27
- USAGE
28
- $ sfdx jayree:COMMAND
29
- ...
11
+ ## Install
12
+
13
+ ```bash
14
+ sfdx plugins:install @jayree/sfdx-plugin-manifest
30
15
  ```
31
- <!-- usagestop -->
32
16
 
33
17
  ## Commands
34
18
 
@@ -40,61 +24,72 @@ USAGE
40
24
 
41
25
  ### `sfdx jayree:manifest:beta:git:diff`
42
26
 
43
- create a project manifest and destructiveChanges manifest that lists the metadata components you want to deploy or delete based on changes in your git history
27
+ Create a project manifest and destructiveChanges manifest that lists the metadata components you want to deploy or delete based on changes in your git history.
44
28
 
45
29
  ```
46
30
  USAGE
47
- $ sfdx jayree:manifest:beta:git:diff [-p <array>] [-o <string>] [-d] [--apiversion <string>] [--json] [--loglevel
48
- trace|debug|info|warn|error|fatal|TRACE|DEBUG|INFO|WARN|ERROR|FATAL]
31
+ $ sfdx jayree:manifest:beta:git:diff [REF1] [REF2] [--json] [--api-version <value>] [-d <value>] [--output-dir <value>]
32
+ [--destructive-changes-only]
49
33
 
50
34
  ARGUMENTS
51
35
  REF1 base commit or branch
52
36
  REF2 commit or branch to compare to the base commit
53
37
 
54
38
  FLAGS
55
- -d, --destructivechangesonly create a destructiveChanges manifest
56
- only (package.xml will be empty)
57
- -o, --outputdir=<value> directory to save the created
58
- manifest files
59
- -p, --sourcepath=<value> comma-separated list of paths to the
60
- local source files to include in the
61
- manifest
62
- --apiversion=<value> override the api version used for
63
- api requests made by this command
64
- --json format output as json
65
- --loglevel=(trace|debug|info|warn|error|fatal|TRACE|DEBUG|INFO|WARN|ERROR|FATAL) [default: warn] logging level for
66
- this command invocation
39
+ -d, --source-dir=<value>... Path to the local source files to include in the manifest.
40
+ --api-version=<value> Override the api version used for api requests made by this command
41
+ --destructive-changes-only Create a destructiveChanges manifest only.
42
+ --output-dir=<value> Directory to save the created manifest files.
43
+
44
+ GLOBAL FLAGS
45
+ --json Format output as json.
67
46
 
68
47
  DESCRIPTION
69
- create a project manifest and destructiveChanges manifest that lists the metadata components you want to deploy or
70
- delete based on changes in your git history
48
+ Create a project manifest and destructiveChanges manifest that lists the metadata components you want to deploy or
49
+ delete based on changes in your git history.
50
+
71
51
  Use this command to create a manifest and destructiveChanges manifest file based on the difference (git diff) of two
72
52
  git refs.
73
53
 
74
- You can use all ways to spell <commit> which are valid for 'git diff'.
75
- (See https://git-scm.com/docs/git-diff)
54
+ You can use all ways to spell <commit> which are valid for 'git diff' (See https://git-scm.com/docs/git-diff).
76
55
 
77
56
  EXAMPLES
78
- $ sfdx jayree:manifest:beta:git:diff <commit> <commit>
57
+ Uses the changes between two arbitrary <commit>.
79
58
 
80
- $ sfdx jayree:manifest:git:diff <commit>..<commit>
59
+ $ sfdx jayree:manifest:beta:git:diff <commit> <commit>
60
+ $ sfdx jayree:manifest:beta:git:diff <commit>..<commit>
81
61
 
82
- uses the changes between two arbitrary <commit>
62
+ Uses the changes on the branch containing and up to the second <commit>, starting at a common ancestor of both
63
+ <commit>.
83
64
 
84
- $ sfdx jayree:manifest:beta:git:diff <commit>...<commit>
65
+ $ sfdx jayree:manifest:beta:git:diff <commit>...<commit>
85
66
 
86
- uses the changes on the branch containing and up to the second <commit>, starting at a common ancestor of both <commit>.
67
+ Uses the diff of what is unique in branchB (REF2) and unique in branchA (REF1).
87
68
 
88
- $ sfdx jayree:manifest:beta:git:diff branchA..branchB
69
+ $ sfdx jayree:manifest:beta:git:diff branchA..branchB
89
70
 
90
- uses the diff of what is unique in branchB (REF2) and unique in branchA (REF1)
71
+ Uses the diff of what is unique in branchB (REF2).
91
72
 
92
- $ sfdx jayree:manifest:beta:git:diff branchA...branchB
73
+ $ sfdx jayree:manifest:beta:git:diff branchA...branchB
93
74
 
94
- uses the diff of what is unique in branchB (REF2)
75
+ FLAG DESCRIPTIONS
76
+ -d, --source-dir=<value>... Path to the local source files to include in the manifest.
77
+
78
+ The supplied path can be to a single file (in which case the operation is applied to only one file) or to a folder
79
+ (in which case the operation is applied to all metadata types in the directory and its subdirectories).
80
+
81
+ You can specify this flag more than once.
82
+
83
+ --destructive-changes-only Create a destructiveChanges manifest only.
84
+
85
+ Use this flag to create a 'destructiveChanges.xml' and a blank 'package.xml'.
86
+
87
+ --output-dir=<value> Directory to save the created manifest files.
88
+
89
+ The location can be an absolute path or relative to the current working directory.
95
90
  ```
96
91
 
97
- _See code: [src/commands/jayree/manifest/beta/git/diff.ts](https://github.com/jayree/sfdx-plugin-manifest/blob/v2.6.3/src/commands/jayree/manifest/beta/git/diff.ts)_
92
+ _See code: [src/commands/jayree/manifest/beta/git/diff.ts](https://github.com/jayree/sfdx-plugin-manifest/blob/v2.7.0/src/commands/jayree/manifest/beta/git/diff.ts)_
98
93
 
99
94
  ### `sfdx jayree:manifest:cleanup`
100
95
 
@@ -122,7 +117,7 @@ EXAMPLES
122
117
  $ sfdx jayree:manifest:cleanup --manifest=package.xml --file=packageignore.xml
123
118
  ```
124
119
 
125
- _See code: [src/commands/jayree/manifest/cleanup.ts](https://github.com/jayree/sfdx-plugin-manifest/blob/v2.6.3/src/commands/jayree/manifest/cleanup.ts)_
120
+ _See code: [src/commands/jayree/manifest/cleanup.ts](https://github.com/jayree/sfdx-plugin-manifest/blob/v2.7.0/src/commands/jayree/manifest/cleanup.ts)_
126
121
 
127
122
  ### `sfdx jayree:manifest:generate`
128
123
 
@@ -165,7 +160,7 @@ EXAMPLES
165
160
  <Package xmlns='http://soap.sforce.com/2006/04/metadata'>...</Package>
166
161
  ```
167
162
 
168
- _See code: [src/commands/jayree/manifest/generate.ts](https://github.com/jayree/sfdx-plugin-manifest/blob/v2.6.3/src/commands/jayree/manifest/generate.ts)_
163
+ _See code: [src/commands/jayree/manifest/generate.ts](https://github.com/jayree/sfdx-plugin-manifest/blob/v2.7.0/src/commands/jayree/manifest/generate.ts)_
169
164
 
170
165
  ### `sfdx jayree:manifest:git:diff`
171
166
 
@@ -219,5 +214,5 @@ EXAMPLES
219
214
  uses the diff of what is unique in branchB (REF2)
220
215
  ```
221
216
 
222
- _See code: [src/commands/jayree/manifest/git/diff.ts](https://github.com/jayree/sfdx-plugin-manifest/blob/v2.6.3/src/commands/jayree/manifest/git/diff.ts)_
217
+ _See code: [src/commands/jayree/manifest/git/diff.ts](https://github.com/jayree/sfdx-plugin-manifest/blob/v2.7.0/src/commands/jayree/manifest/git/diff.ts)_
223
218
  <!-- commandsstop -->
@@ -1,7 +1,5 @@
1
1
  import { ComponentSet, OptionalTreeRegistryOptions } from '@salesforce/source-deploy-retrieve';
2
- import Debug from 'debug';
3
- export declare const debug: Debug.Debugger;
4
- export interface FromGitDiffOptions extends OptionalTreeRegistryOptions {
2
+ interface FromGitDiffOptions extends OptionalTreeRegistryOptions {
5
3
  /**
6
4
  * Git ref to resolve components against
7
5
  */
@@ -36,3 +34,4 @@ export declare class ComponentSetExtra extends ComponentSet {
36
34
  */
37
35
  static fromGitDiff(options: FromGitDiffOptions): Promise<ComponentSet>;
38
36
  }
37
+ export {};
@@ -4,11 +4,13 @@
4
4
  * Licensed under the BSD 3-Clause license.
5
5
  * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
6
6
  */
7
+ import path from 'path';
7
8
  import { ComponentSet, DestructiveChangesType, registry as untypedRegistry, } from '@salesforce/source-deploy-retrieve';
8
- import { SfProject } from '@salesforce/core';
9
+ import { SfProject, Lifecycle } from '@salesforce/core';
9
10
  import Debug from 'debug';
10
- import { GitDiffResolver } from '../resolve/gitDiffResolver.js';
11
- export const debug = Debug('sf:gitDiff:ComponentSetExtra');
11
+ import fs from 'graceful-fs';
12
+ import { GitDiffResolver } from '../resolve/index.js';
13
+ const debug = Debug('sf:gitDiff:ComponentSetExtra');
12
14
  export class ComponentSetExtra extends ComponentSet {
13
15
  static async fromGitDiff(input) {
14
16
  let fsPaths;
@@ -35,29 +37,44 @@ export class ComponentSetExtra extends ComponentSet {
35
37
  else {
36
38
  ref1 = input;
37
39
  }
38
- const proj = await SfProject.resolve();
39
- fsPaths = fsPaths || proj.getUniquePackageDirectories().map((pDir) => pDir.fullPath);
40
- const gitDiffResolver = new GitDiffResolver();
40
+ const project = await SfProject.resolve();
41
+ const gitDiffResolver = new GitDiffResolver(project);
41
42
  const inclusiveFilter = await gitDiffResolver.resolve(ref1, ref2, fsPaths);
42
- const components = ComponentSet.fromSource({
43
- fsPaths,
44
- include: inclusiveFilter,
45
- tree,
46
- registry,
47
- });
48
43
  const childsTobeReplacedByParent = [
49
44
  ...Object.keys(untypedRegistry.types.workflow.children.types),
50
45
  ...Object.keys(untypedRegistry.types.sharingrules.children.types),
51
46
  ...Object.keys(untypedRegistry.types.customobjecttranslation.children.types),
52
47
  ...Object.keys(untypedRegistry.types.bot.children.types),
53
48
  ];
49
+ for (const component of inclusiveFilter.getSourceComponents()) {
50
+ if (childsTobeReplacedByParent.includes(component.type.id)) {
51
+ debug(`add parent ${component.parent.type.name}:${component.parent.fullName} of ${component.type.name}:${component.fullName} to manifest`);
52
+ inclusiveFilter.add(component.parent);
53
+ }
54
+ }
55
+ fsPaths =
56
+ fsPaths?.map((filepath) => path.resolve(filepath)).filter((filepath) => fs.existsSync(filepath)) ||
57
+ project.getUniquePackageDirectories().map((pDir) => pDir.fullPath);
58
+ debug({ fsPaths });
59
+ const components = ComponentSet.fromSource({
60
+ fsPaths,
61
+ include: inclusiveFilter,
62
+ tree,
63
+ registry,
64
+ });
54
65
  for (const component of inclusiveFilter.getSourceComponents()) {
55
66
  if (component.isMarkedForDelete()) {
56
67
  components.add(component, DestructiveChangesType.POST);
57
68
  }
58
- else if (childsTobeReplacedByParent.includes(component.type.id)) {
59
- debug(`add parent ${component.parent.type.name}:${component.parent.fullName} of ${component.type.name}:${component.fullName} to manifest`);
60
- components.add(component.parent);
69
+ }
70
+ for await (const component of inclusiveFilter.getSourceComponents()) {
71
+ if (!components
72
+ .getSourceComponents()
73
+ .find((localComponent) => !!localComponent
74
+ .getChildren()
75
+ .find((localChild) => component.type.name === localChild.type.name && component.fullName === localChild.fullName) ||
76
+ (component.type.name === localComponent.type.name && component.fullName === localComponent.fullName))) {
77
+ await Lifecycle.getInstance().emitWarning(`The component "${component.type.name}:${component.fullName}" was not found locally.`);
61
78
  }
62
79
  }
63
80
  return components;
@@ -1 +1 @@
1
- {"version":3,"file":"componentSetExtra.js","sourceRoot":"","sources":["../../../src/SDR-extra/collections/componentSetExtra.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EACL,YAAY,EAGZ,sBAAsB,EAEtB,QAAQ,IAAI,eAAe,GAC5B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,CAAC,8BAA8B,CAAC,CAAC;AAa3D,MAAM,OAAO,iBAAkB,SAAQ,YAAY;IA0B1C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,KAA6C;QAC3E,IAAI,OAAiB,CAAC;QACtB,IAAI,QAAwB,CAAC;QAC7B,IAAI,IAAmB,CAAC;QACxB,IAAI,IAAuB,CAAC;QAC5B,IAAI,IAAY,CAAC;QAEjB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACxB,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAChB,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;SACjB;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YACpC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;gBAC5B,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACpB,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;aACrB;iBAAM;gBACL,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC;aAClB;YACD,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;YACxB,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,QAAQ,CAAC;YACtC,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC;SAC3B;aAAM;YACL,IAAI,GAAG,KAAK,CAAC;SACd;QAED,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC;QACvC,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC,2BAA2B,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAErF,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAC9C,MAAM,eAAe,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAE3E,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC;YACzC,OAAO;YACP,OAAO,EAAE,eAAe;YACxB,IAAI;YACJ,QAAQ;SACT,CAAC,CAAC;QAEH,MAAM,0BAA0B,GAAG;YACjC,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;YAC7D,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC;YACjE,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,uBAAuB,CAAC,QAAQ,CAAC,KAAK,CAAC;YAC5E,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;SACzD,CAAC;QAEF,KAAK,MAAM,SAAS,IAAI,eAAe,CAAC,mBAAmB,EAAE,EAAE;YAC7D,IAAI,SAAS,CAAC,iBAAiB,EAAE,EAAE;gBACjC,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE,sBAAsB,CAAC,IAAI,CAAC,CAAC;aACxD;iBAAM,IAAI,0BAA0B,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;gBACjE,KAAK,CACH,cAAc,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC,MAAM,CAAC,QAAQ,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC,QAAQ,cAAc,CACpI,CAAC;gBACF,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;aAClC;SACF;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;CACF"}
1
+ {"version":3,"file":"componentSetExtra.js","sourceRoot":"","sources":["../../../src/SDR-extra/collections/componentSetExtra.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export * from './componentSetExtra.js';
@@ -0,0 +1,8 @@
1
+ /*
2
+ * Copyright (c) 2022, jayree
3
+ * All rights reserved.
4
+ * Licensed under the BSD 3-Clause license.
5
+ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
6
+ */
7
+ export * from './componentSetExtra.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/SDR-extra/collections/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './collections/index.js';
2
+ export * from './resolve/index.js';
3
+ export * from './utils/index.js';
@@ -0,0 +1,10 @@
1
+ /*
2
+ * Copyright (c) 2022, jayree
3
+ * All rights reserved.
4
+ * Licensed under the BSD 3-Clause license.
5
+ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
6
+ */
7
+ export * from './collections/index.js';
8
+ export * from './resolve/index.js';
9
+ export * from './utils/index.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/SDR-extra/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC"}
@@ -1,18 +1,23 @@
1
1
  import { ComponentSet } from '@salesforce/source-deploy-retrieve';
2
- import Debug from 'debug';
3
- export declare const debug: Debug.Debugger;
2
+ import { SfProject } from '@salesforce/core';
4
3
  /**
5
4
  * Resolver for metadata type and component objects from a git diff result
6
5
  *
7
6
  * @internal
8
7
  */
9
8
  export declare class GitDiffResolver {
10
- private ref1VirtualTreeContainer;
11
9
  private ref2VirtualTreeContainer;
12
10
  private ref1Resolver;
13
11
  private ref2Resolver;
14
- private static getFileStatus;
12
+ private gitDir;
13
+ private uniquePackageDirectories;
14
+ private localRepo;
15
+ /**
16
+ * @param dir SFDX project directory
17
+ */
18
+ constructor(project: SfProject);
15
19
  resolve(ref1: string, ref2: string, fsPaths: string[]): Promise<ComponentSet>;
20
+ private getFileStatus;
16
21
  private getComponentSet;
17
22
  private getChildComponentStatus;
18
23
  }
@@ -6,14 +6,12 @@
6
6
  */
7
7
  import path from 'path';
8
8
  import { ComponentSet, RegistryAccess, MetadataResolver, SourceComponent, DestructiveChangesType, } from '@salesforce/source-deploy-retrieve';
9
- import { SfProject, SfError } from '@salesforce/core';
10
- import fs from 'fs-extra';
11
- import { parseMetadataXml } from '@salesforce/source-deploy-retrieve/lib/src/utils/index.js';
9
+ import { SfError, Lifecycle } from '@salesforce/core';
12
10
  import equal from 'fast-deep-equal';
13
11
  import Debug from 'debug';
14
- import { resolveMultiRefString, resolveSingleRefString, getFileState, getStatus } from '../utils/git-extra.js';
15
- import { VirtualTreeContainerExtra } from './treeContainersExtra.js';
16
- export const debug = Debug('sf:gitDiff:resolver');
12
+ import { GitRepo } from '../utils/localGitRepo.js';
13
+ import { VirtualTreeContainerExtra, parseMetadataXml } from './index.js';
14
+ const debug = Debug('sf:gitDiff:resolver');
17
15
  const registryAccess = new RegistryAccess();
18
16
  /**
19
17
  * Resolver for metadata type and component objects from a git diff result
@@ -21,104 +19,111 @@ const registryAccess = new RegistryAccess();
21
19
  * @internal
22
20
  */
23
21
  export class GitDiffResolver {
24
- static async getFileStatus(ref1, ref2, dir, resolveSourcePaths) {
25
- let files;
26
- if (ref2) {
27
- files = (await getFileState(ref1, ref2, dir)).filter((l) => resolveSourcePaths.some((f) => l.path.startsWith(f)));
28
- }
29
- else {
30
- files = await getStatus(dir, ref1);
31
- files = files.filter((l) => resolveSourcePaths.some((f) => l.path.startsWith(f)));
32
- }
33
- files = files.filter((file) => {
34
- if (file.status === 'D') {
35
- for (const sourcePath of resolveSourcePaths) {
36
- const defaultFolder = path.join(sourcePath, 'main', 'default');
37
- const filePath = file.path.replace(file.path.startsWith(defaultFolder) ? defaultFolder : sourcePath, '');
38
- const target = files.find((t) => t.path.endsWith(filePath) && t.status === 'A');
39
- if (target) {
40
- return false;
41
- }
42
- }
43
- }
44
- return true;
22
+ /**
23
+ * @param dir SFDX project directory
24
+ */
25
+ constructor(project) {
26
+ this.gitDir = project.getPath();
27
+ this.uniquePackageDirectories = project.getUniquePackageDirectories().map((pDir) => pDir.fullPath);
28
+ this.localRepo = GitRepo.getInstance({
29
+ gitDir: this.gitDir,
30
+ packageDirs: this.uniquePackageDirectories,
45
31
  });
46
- return files;
47
32
  }
48
33
  async resolve(ref1, ref2, fsPaths) {
49
- const proj = await SfProject.resolve();
50
34
  if (ref2 === undefined) {
51
- const { ref1: r1, ref2: r2 } = await resolveMultiRefString({ ref: ref1, dir: proj.getPath(), fs });
35
+ const { ref1: r1, ref2: r2 } = await this.localRepo.resolveMultiRefString(ref1);
52
36
  ref1 = r1;
53
37
  ref2 = r2;
54
38
  }
55
39
  else {
56
40
  const [r1, r2] = await Promise.all([
57
- resolveSingleRefString({ ref: ref1, dir: proj.getPath(), fs }),
58
- resolveSingleRefString({ ref: ref2, dir: proj.getPath(), fs }),
41
+ this.localRepo.resolveSingleRefString(ref1),
42
+ this.localRepo.resolveSingleRefString(ref2),
59
43
  ]);
60
44
  ref1 = r1;
61
45
  ref2 = r2;
62
46
  }
63
47
  debug({ ref1, ref2 });
64
- const fileStatus = await GitDiffResolver.getFileStatus(ref1, ref2, proj.getPath(), fsPaths);
48
+ const fileStatus = await this.getFileStatus(ref1, ref2);
65
49
  debug({ fileStatus });
66
50
  const [ref1VirtualTreeContainer, ref2VirtualTreeContainer] = await Promise.all([
67
- VirtualTreeContainerExtra.fromGitRef(ref1, proj.getPath(), fileStatus.filter((l) => l.status === 'M').map((l) => l.path)),
68
- VirtualTreeContainerExtra.fromGitRef(ref2, proj.getPath(), fileStatus.filter((l) => l.status === 'M').map((l) => l.path)),
51
+ VirtualTreeContainerExtra.fromGitRef(ref1, this.gitDir, fileStatus.filter((l) => l.status === 'M').map((l) => l.path)),
52
+ VirtualTreeContainerExtra.fromGitRef(ref2, this.gitDir, fileStatus.filter((l) => l.status === 'M').map((l) => l.path)),
69
53
  ]);
70
- this.ref1VirtualTreeContainer = ref1VirtualTreeContainer;
54
+ if (fsPaths) {
55
+ fsPaths.map((filepath) => {
56
+ filepath = path.resolve(filepath);
57
+ if (!ref1VirtualTreeContainer.exists(filepath) && !ref2VirtualTreeContainer.exists(filepath)) {
58
+ throw new SfError(`The sourcepath "${filepath}" is not a valid source file path.`);
59
+ }
60
+ });
61
+ }
71
62
  this.ref2VirtualTreeContainer = ref2VirtualTreeContainer;
72
- fsPaths = fsPaths.map((filepath) => {
73
- filepath = path.resolve(filepath);
74
- if (!this.ref1VirtualTreeContainer.exists(filepath) && !this.ref2VirtualTreeContainer.exists(filepath)) {
75
- throw new SfError(`The sourcepath "${filepath}" is not a valid source file path.`);
63
+ this.ref1Resolver = new MetadataResolver(registryAccess, ref1VirtualTreeContainer);
64
+ this.ref2Resolver = new MetadataResolver(registryAccess, this.ref2VirtualTreeContainer);
65
+ return this.getComponentSet(fileStatus);
66
+ }
67
+ async getFileStatus(ref1, ref2) {
68
+ let files;
69
+ if (ref2) {
70
+ files = (await this.localRepo.getFileState({ ref1, ref2 })).filter((l) => this.uniquePackageDirectories.some((f) => l.path.startsWith(f)));
71
+ }
72
+ else {
73
+ files = await this.localRepo.getStatus(ref1);
74
+ }
75
+ files = files.filter((file) => {
76
+ if (file.status === 'D') {
77
+ for (const sourcePath of this.uniquePackageDirectories) {
78
+ const defaultFolder = path.join(sourcePath, 'main', 'default');
79
+ const filePath = file.path.replace(file.path.startsWith(defaultFolder) ? defaultFolder : sourcePath, '');
80
+ const target = files.find((t) => t.path.endsWith(filePath) && t.status === 'A');
81
+ // debug({ target, file, sourcePath, filePath });
82
+ if (target) {
83
+ return false;
84
+ }
85
+ }
76
86
  }
77
- return filepath;
87
+ return true;
78
88
  });
79
- debug({ fsPaths });
80
- this.ref1Resolver = new MetadataResolver(registryAccess, this.ref1VirtualTreeContainer);
81
- this.ref2Resolver = new MetadataResolver(registryAccess, this.ref2VirtualTreeContainer);
82
- return this.getComponentSet(fileStatus, fsPaths);
89
+ return files;
83
90
  }
84
- async getComponentSet(gitLines, fsPaths) {
91
+ async getComponentSet(gitLines) {
85
92
  const results = new ComponentSet(undefined, registryAccess);
86
93
  const childComponentPromises = [];
87
94
  for (const [, { status, path: fpath }] of gitLines.entries()) {
88
- if (!fsPaths || fsPaths.some((fsPath) => path.resolve(fpath).startsWith(fsPath))) {
89
- if (status === 'D') {
90
- for (const c of this.ref1Resolver.getComponentsFromPath(fpath)) {
91
- // if the component supports partial delete AND there are files that are not deleted,
92
- // set the component for deploy, not for delete.
93
- // https://github.com/forcedotcom/source-tracking/blob/5cb32bef2e5860c0f8fc2afa3ea65432fe511a99/src/shared/localComponentSetArray.ts#L81
94
- if (!!c.type.supportsPartialDelete && c.content && this.ref2VirtualTreeContainer.exists(c.content)) {
95
- // all bundle types have a directory name
96
- try {
97
- this.ref2Resolver
98
- .getComponentsFromPath(path.resolve(c.content))
99
- .filter((input) => input instanceof SourceComponent)
100
- .map((nonDeletedComponent) => {
101
- results.add(nonDeletedComponent);
102
- });
103
- }
104
- catch (e) {
105
- debug(`unable to find component at ${c.content}. That's ok if it was supposed to be deleted`);
106
- }
95
+ if (status === 'D') {
96
+ for (const c of this.ref1Resolver.getComponentsFromPath(fpath)) {
97
+ // if the component supports partial delete AND there are files that are not deleted,
98
+ // set the component for deploy, not for delete.
99
+ // https://github.com/forcedotcom/source-tracking/blob/5cb32bef2e5860c0f8fc2afa3ea65432fe511a99/src/shared/localComponentSetArray.ts#L81
100
+ if (!!c.type.supportsPartialDelete && c.content && this.ref2VirtualTreeContainer.exists(c.content)) {
101
+ // all bundle types have a directory name
102
+ try {
103
+ this.ref2Resolver
104
+ .getComponentsFromPath(path.resolve(c.content))
105
+ .filter((input) => input instanceof SourceComponent)
106
+ .map((nonDeletedComponent) => {
107
+ results.add(nonDeletedComponent);
108
+ });
107
109
  }
108
- else {
109
- results.add(c, DestructiveChangesType.POST);
110
+ catch (e) {
111
+ debug(`unable to find component at ${c.content}. That's ok if it was supposed to be deleted`);
110
112
  }
111
113
  }
112
- }
113
- else if (status === 'A') {
114
- for (const c of this.ref2Resolver.getComponentsFromPath(fpath)) {
115
- results.add(c);
114
+ else {
115
+ results.add(c, DestructiveChangesType.POST);
116
116
  }
117
117
  }
118
- else {
119
- childComponentPromises.push(this.getChildComponentStatus(fpath));
118
+ }
119
+ else if (status === 'A') {
120
+ for (const c of this.ref2Resolver.getComponentsFromPath(fpath)) {
121
+ results.add(c);
120
122
  }
121
123
  }
124
+ else {
125
+ childComponentPromises.push(this.getChildComponentStatus(fpath));
126
+ }
122
127
  }
123
128
  for await (const check of childComponentPromises) {
124
129
  if (check.status === 0) {
@@ -129,6 +134,9 @@ export class GitDiffResolver {
129
134
  else if (check.status === -1) {
130
135
  // unchanged file
131
136
  }
137
+ else if (check.status === -2) {
138
+ // forceignored file
139
+ }
132
140
  else {
133
141
  for (const c of check.toDestructiveChanges) {
134
142
  results.add(c, DestructiveChangesType.POST);
@@ -138,12 +146,10 @@ export class GitDiffResolver {
138
146
  }
139
147
  }
140
148
  }
141
- debug({
142
- forceIgnoredPaths: {
143
- ref1: Array.from(this.ref1Resolver.forceIgnoredPaths),
144
- ref2: Array.from(this.ref2Resolver.forceIgnoredPaths),
145
- },
146
- });
149
+ const forceIgnored = Array.from(new Set([...this.ref1Resolver.forceIgnoredPaths, ...this.ref2Resolver.forceIgnoredPaths]));
150
+ for await (const file of forceIgnored) {
151
+ await Lifecycle.getInstance().emitWarning(`The forceignored file "${file}" was ignored.`);
152
+ }
147
153
  return results;
148
154
  }
149
155
  async getChildComponentStatus(fpath) {
@@ -152,6 +158,9 @@ export class GitDiffResolver {
152
158
  }
153
159
  const [ref2Component] = this.ref2Resolver.getComponentsFromPath(fpath); // git path only conaints files
154
160
  const [ref1Component] = this.ref1Resolver.getComponentsFromPath(fpath); // git path only conaints files
161
+ if (this.ref1Resolver.forceIgnoredPaths.has(fpath) || this.ref2Resolver.forceIgnoredPaths.has(fpath)) {
162
+ return { path: fpath, status: -2 };
163
+ }
155
164
  if (equal(await ref1Component.parseXml(), await ref2Component.parseXml())) {
156
165
  return { path: fpath, status: -1 };
157
166
  }