sfdx-git-delta 7.4.1 → 7.4.2
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.
- package/README.md +1 -1
- package/lib/constant/metadataConstants.d.ts +3 -0
- package/lib/constant/metadataConstants.js +11 -0
- package/lib/constant/metadataConstants.js.map +1 -1
- package/lib/post-processor/changesManifestProcessor.js +14 -1
- package/lib/post-processor/changesManifestProcessor.js.map +1 -1
- package/lib/utils/changeSet.d.ts +3 -0
- package/lib/utils/changeSet.js +64 -39
- package/lib/utils/changeSet.js.map +1 -1
- package/lib/utils/metadataBoundaryResolver.d.ts +4 -0
- package/lib/utils/metadataBoundaryResolver.js +40 -29
- package/lib/utils/metadataBoundaryResolver.js.map +1 -1
- package/lib/utils/metadataDiff/deepEqualJson.js +51 -44
- package/lib/utils/metadataDiff/deepEqualJson.js.map +1 -1
- package/lib/utils/metadataDiff/xmlEventReader.js +59 -49
- package/lib/utils/metadataDiff/xmlEventReader.js.map +1 -1
- package/lib/utils/repoGitDiff.d.ts +3 -0
- package/lib/utils/repoGitDiff.js +66 -53
- package/lib/utils/repoGitDiff.js.map +1 -1
- package/lib/utils/treeIndexScope.js +20 -23
- package/lib/utils/treeIndexScope.js.map +1 -1
- package/oclif.manifest.json +1 -1
- package/package.json +8 -8
package/README.md
CHANGED
|
@@ -214,7 +214,7 @@ FLAG DESCRIPTIONS
|
|
|
214
214
|
`--source-dir force-app` does not match `nested/force-app/...`.
|
|
215
215
|
```
|
|
216
216
|
|
|
217
|
-
_See code: [src/commands/sgd/source/delta.ts](https://github.com/scolladon/sfdx-git-delta/blob/v7.4.
|
|
217
|
+
_See code: [src/commands/sgd/source/delta.ts](https://github.com/scolladon/sfdx-git-delta/blob/v7.4.2/src/commands/sgd/source/delta.ts)_
|
|
218
218
|
<!-- commandsstop -->
|
|
219
219
|
|
|
220
220
|
### Windows users
|
|
@@ -2,6 +2,7 @@ export declare const BOT_TYPE = "Bot";
|
|
|
2
2
|
export declare const BOT_VERSION_TYPE = "BotVersion";
|
|
3
3
|
export declare const CUSTOM_APPLICATION_SUFFIX = "app";
|
|
4
4
|
export declare const CUSTOM_METADATA_SUFFIX = "md";
|
|
5
|
+
export declare const DASHBOARD_TYPE = "Dashboard";
|
|
5
6
|
export declare const DEFAULT_CONTAINER_DEPTH = 1;
|
|
6
7
|
export declare const DIGITAL_EXPERIENCE_ADAPTER = "digitalExperience";
|
|
7
8
|
export declare const CONTENT_CONTAINER_ADAPTERS: Set<string>;
|
|
@@ -23,6 +24,8 @@ export declare const OBJECT_TRANSLATION_META_XML_SUFFIX = "objectTranslation-met
|
|
|
23
24
|
export declare const OBJECT_TRANSLATION_TYPE = "CustomObjectTranslation";
|
|
24
25
|
export declare const OBJECT_TYPE = "CustomObject";
|
|
25
26
|
export declare const PERMISSIONSET_TYPE = "PermissionSet";
|
|
27
|
+
export declare const REPORT_TYPE = "Report";
|
|
28
|
+
export declare const FOLDER_MOVE_ON_DEPLOY_TYPES: ReadonlySet<string>;
|
|
26
29
|
export declare const SHARING_RULE_TYPE = "SharingRules";
|
|
27
30
|
export declare const SUB_OBJECT_TYPES: string[];
|
|
28
31
|
export declare const TRANSLATION_EXTENSION = "translation";
|
|
@@ -3,6 +3,7 @@ export const BOT_TYPE = 'Bot';
|
|
|
3
3
|
export const BOT_VERSION_TYPE = 'BotVersion';
|
|
4
4
|
export const CUSTOM_APPLICATION_SUFFIX = 'app';
|
|
5
5
|
export const CUSTOM_METADATA_SUFFIX = 'md';
|
|
6
|
+
export const DASHBOARD_TYPE = 'Dashboard';
|
|
6
7
|
// A component named by the single segment below its type directory: every
|
|
7
8
|
// content-container adapter except digitalExperience (depths below), and the
|
|
8
9
|
// holder-scoped composed types, whose every file keys on that one segment.
|
|
@@ -39,6 +40,16 @@ export const OBJECT_TRANSLATION_META_XML_SUFFIX = `objectTranslation${METAFILE_S
|
|
|
39
40
|
export const OBJECT_TRANSLATION_TYPE = 'CustomObjectTranslation';
|
|
40
41
|
export const OBJECT_TYPE = 'CustomObject';
|
|
41
42
|
export const PERMISSIONSET_TYPE = 'PermissionSet';
|
|
43
|
+
export const REPORT_TYPE = 'Report';
|
|
44
|
+
// The Metadata API relocates these when the package lists them under a new
|
|
45
|
+
// folder, so their former path must not be destroyed alongside the move.
|
|
46
|
+
// Declared out of alphabetical order on purpose: the Set dereferences both
|
|
47
|
+
// members at module evaluation, so filing it under F would read REPORT_TYPE
|
|
48
|
+
// before its initialiser has run.
|
|
49
|
+
export const FOLDER_MOVE_ON_DEPLOY_TYPES = new Set([
|
|
50
|
+
REPORT_TYPE,
|
|
51
|
+
DASHBOARD_TYPE,
|
|
52
|
+
]);
|
|
42
53
|
export const SHARING_RULE_TYPE = 'SharingRules';
|
|
43
54
|
export const SUB_OBJECT_TYPES = [
|
|
44
55
|
'BusinessProcess',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadataConstants.js","sourceRoot":"","sources":["../../src/constant/metadataConstants.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AACZ,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,CAAA;AAC7B,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAA;AAC5C,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,CAAA;AAC9C,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAA;AAC1C,0EAA0E;AAC1E,6EAA6E;AAC7E,2EAA2E;AAC3E,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAA;AACxC,MAAM,CAAC,MAAM,0BAA0B,GAAG,mBAAmB,CAAA;AAC7D,+EAA+E;AAC/E,2EAA2E;AAC3E,8EAA8E;AAC9E,+EAA+E;AAC/E,6DAA6D;AAC7D,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAAC;IAChD,QAAQ;IACR,0BAA0B;IAC1B,cAAc;CACf,CAAC,CAAA;AACF,MAAM,CAAC,MAAM,8BAA8B,GAAG,yBAAyB,CAAA;AACvE,wDAAwD;AACxD,yEAAyE;AACzE,0EAA0E;AAC1E,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,CAAA;AAChD,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,CAAA;AACjD,MAAM,CAAC,MAAM,uBAAuB,GAAG,mBAAmB,CAAA;AAC1D,MAAM,CAAC,MAAM,8BAA8B,GAAG,KAAK,CAAA;AACnD,MAAM,CAAC,MAAM,oBAAoB,GAAG,QAAQ,CAAA;AAC5C,MAAM,CAAC,MAAM,oBAAoB,GAAG,iBAAiB,CAAA;AACrD,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAA;AACnC,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAA;AACvC,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,MAAM,CAAC,GAAG,eAAe,GAAG,CAAC,CAAA;AACtE,MAAM,CAAC,MAAM,uBAAuB,GAAG,OAAO,CAAA;AAC9C,MAAM,CAAC,MAAM,iBAAiB,GAAG,2BAA2B,CAAA;AAC5D,MAAM,CAAC,MAAM,eAAe,GAAG,WAAW,CAAA;AAC1C,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,GAAG,eAAe,GAAG,CAAC,CAAA;AAC3D,MAAM,CAAC,MAAM,kCAAkC,GAAG,oBAAoB,eAAe,EAAE,CAAA;AACvF,MAAM,CAAC,MAAM,uBAAuB,GAAG,yBAAyB,CAAA;AAChE,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAA;AACzC,MAAM,CAAC,MAAM,kBAAkB,GAAG,eAAe,CAAA;AACjD,MAAM,CAAC,MAAM,iBAAiB,GAAG,cAAc,CAAA;AAC/C,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,iBAAiB;IACjB,eAAe;IACf,aAAa;IACb,UAAU;IACV,OAAO;IACP,UAAU;IACV,YAAY;IACZ,qBAAqB;IACrB,kBAAkB;IAClB,kBAAkB;IAClB,eAAe;IACf,YAAY;IACZ,gBAAgB;IAChB,gBAAgB;IAChB,SAAS;IACT,eAAe;IACf,qBAAqB;IACrB,oBAAoB;IACpB,0BAA0B;IAC1B,yBAAyB;IACzB,cAAc;IACd,cAAc;IACd,cAAc;CACf,CAAA;AACD,MAAM,CAAC,MAAM,qBAAqB,GAAG,aAAa,CAAA;AAClD,MAAM,CAAC,MAAM,gBAAgB,GAAG,cAAc,CAAA;AAC9C,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAA;AAC5C,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAA"}
|
|
1
|
+
{"version":3,"file":"metadataConstants.js","sourceRoot":"","sources":["../../src/constant/metadataConstants.ts"],"names":[],"mappings":"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"}
|
|
@@ -44,7 +44,20 @@ export default class ChangesManifestProcessor extends BaseProcessor {
|
|
|
44
44
|
for (const type of [...renames.keys()].sort()) {
|
|
45
45
|
const pairs = [...renames.get(type).values()]
|
|
46
46
|
.map(({ from, to }) => ({ from, to }))
|
|
47
|
-
|
|
47
|
+
// Code-unit order, matching the bare .sort() on the type keys above:
|
|
48
|
+
// a locale-aware comparison would order the emitted manifest
|
|
49
|
+
// differently depending on the machine that generated it. Written
|
|
50
|
+
// branchlessly so the equal case needs no separate arm.
|
|
51
|
+
// The `>` term only ever needs to signal "not before" (0 or
|
|
52
|
+
// positive) to Array.prototype.sort's swap-iff-negative contract, so
|
|
53
|
+
// forcing it to `false`/0 or widening it to `>=` changes no
|
|
54
|
+
// reachable pairwise swap decision and thus no output order —
|
|
55
|
+
// confirmed empirically against the unmutated comparator over
|
|
56
|
+
// randomised arrays from 8 to 2000 entries, spanning the size at
|
|
57
|
+
// which the engine stops using insertion sort and starts merging.
|
|
58
|
+
// The `<` term is the one load-bearing half; it is covered by the
|
|
59
|
+
// equal-`to` stability test below.
|
|
60
|
+
.sort((a, b) => Number(a.to > b.to) - Number(a.to < b.to));
|
|
48
61
|
bucket[type] = pairs;
|
|
49
62
|
}
|
|
50
63
|
return bucket;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"changesManifestProcessor.js","sourceRoot":"","sources":["../../src/post-processor/changesManifestProcessor.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;;;;;;;AAEZ,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAItD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,GAAG,EAAE,MAAM,8BAA8B,CAAA;AAClD,OAAO,aAAa,EAAE,EACpB,YAAY,GAEb,MAAM,oBAAoB,CAAA;AAY3B,MAAM,CAAC,OAAO,OAAO,wBAAyB,SAAQ,aAAa;IAE3C,AAAN,KAAK,CAAC,OAAO,CAAC,OAAkB;QAC9C,sDAAsD;QACtD,2EAA2E;QAC3E,sEAAsE;QACtE,yDAAyD;QACzD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAA;QAC9C,IAAI,CAAC,UAAU;YAAE,OAAO,YAAY,EAAE,CAAA;QAEtC,uEAAuE;QACvE,yEAAyE;QACzE,sDAAsD;QACtD,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,EAAE,CAAA;QACnC,MAAM,OAAO,GAA0B;YACrC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAC7D,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACnE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACnE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;SACtE,CAAA;QACD,MAAM,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QAC9D,OAAO,YAAY,EAAE,CAAA;IACvB,CAAC;IAES,gBAAgB,CAAC,QAAkB;QAC3C,MAAM,MAAM,GAAe,EAAE,CAAA;QAC7B,4EAA4E;QAC5E,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YAC/C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,CAAC,IAAI,EAAE,CAAA;QAChD,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IAES,kBAAkB,CAAC,OAAqB;QAChD,MAAM,MAAM,GAAqB,EAAE,CAAA;QACnC,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YAC9C,MAAM,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,MAAM,EAAE,CAAC;iBAC3C,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"changesManifestProcessor.js","sourceRoot":"","sources":["../../src/post-processor/changesManifestProcessor.ts"],"names":[],"mappings":"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"}
|
package/lib/utils/changeSet.d.ts
CHANGED
|
@@ -34,10 +34,13 @@ export default class ChangeSet {
|
|
|
34
34
|
static from(elements: readonly ManifestElement[], renames?: readonly RenameTriple[]): ChangeSet;
|
|
35
35
|
private _addElement;
|
|
36
36
|
toElements(): ManifestElement[];
|
|
37
|
+
private _targetElements;
|
|
38
|
+
private _memberElements;
|
|
37
39
|
private _recordRename;
|
|
38
40
|
forPackageManifest(): Manifest;
|
|
39
41
|
forDestructiveManifest(): Manifest;
|
|
40
42
|
private _suppressVersionsOfDeletedBots;
|
|
43
|
+
private _suppressMovedFolderMembers;
|
|
41
44
|
isEmpty(): boolean;
|
|
42
45
|
byChangeKind(): Readonly<{
|
|
43
46
|
[ChangeKind.Add]: Manifest;
|
package/lib/utils/changeSet.js
CHANGED
|
@@ -1,9 +1,25 @@
|
|
|
1
1
|
'use strict';
|
|
2
|
-
import { DOT } from '../constant/fsConstants.js';
|
|
3
|
-
import { BOT_TYPE, BOT_VERSION_TYPE } from '../constant/metadataConstants.js';
|
|
2
|
+
import { DOT, PATH_SEP } from '../constant/fsConstants.js';
|
|
3
|
+
import { BOT_TYPE, BOT_VERSION_TYPE, FOLDER_MOVE_ON_DEPLOY_TYPES, } from '../constant/metadataConstants.js';
|
|
4
4
|
import { ChangeKind, ManifestTarget, } from '../types/handlerResult.js';
|
|
5
5
|
const KEY_SEPARATOR = '\0';
|
|
6
|
+
const MANIFEST_TARGETS = [
|
|
7
|
+
ManifestTarget.Package,
|
|
8
|
+
ManifestTarget.DestructiveChanges,
|
|
9
|
+
];
|
|
10
|
+
const ADD_KINDS = [
|
|
11
|
+
ChangeKind.Add,
|
|
12
|
+
ChangeKind.Modify,
|
|
13
|
+
ChangeKind.Delete,
|
|
14
|
+
];
|
|
6
15
|
const renameKey = (from, to) => `${from}${KEY_SEPARATOR}${to}`;
|
|
16
|
+
// Locale-invariant on purpose: Salesforce API names are ASCII and the
|
|
17
|
+
// manifest must not depend on the machine that generated it.
|
|
18
|
+
// The direction is load-bearing, not a coin flip: upper-casing is not
|
|
19
|
+
// injective, so it would merge distinct components (both 'ss' and 'ß' fold
|
|
20
|
+
// to 'SS', and 'ff' and 'ff' to 'FF') and suppress a deletion that must
|
|
21
|
+
// survive. Lower-casing keeps them apart.
|
|
22
|
+
const developerName = (member) => member.slice(member.lastIndexOf(PATH_SEP) + 1).toLowerCase();
|
|
7
23
|
/**
|
|
8
24
|
* Domain object that collects every component change observed in a diff and
|
|
9
25
|
* derives the views consumed downstream:
|
|
@@ -59,35 +75,18 @@ export default class ChangeSet {
|
|
|
59
75
|
// maintained as a hot-path structure, so call it once per pass, not per
|
|
60
76
|
// element.
|
|
61
77
|
toElements() {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
];
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
for (const member of members) {
|
|
75
|
-
let kind;
|
|
76
|
-
for (const k of kinds) {
|
|
77
|
-
if (this.byKind[k].get(type)?.has(member)) {
|
|
78
|
-
kind = k;
|
|
79
|
-
break;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
// Stryker disable next-line ConditionalExpression -- equivalent: see v8 ignore — the kind === undefined branch is unreachable because addElement keeps byTarget and byKind in lockstep
|
|
83
|
-
/* v8 ignore next -- defensive: addElement always pairs byTarget and byKind, so every (type, member) in byTarget has a corresponding byKind entry */
|
|
84
|
-
if (kind !== undefined) {
|
|
85
|
-
out.push({ target, type, member, changeKind: kind });
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
return out;
|
|
78
|
+
return MANIFEST_TARGETS.flatMap(target => this._targetElements(target));
|
|
79
|
+
}
|
|
80
|
+
_targetElements(target) {
|
|
81
|
+
return [...this.byTarget[target]].flatMap(([type, members]) => [...members].flatMap(member => this._memberElements(target, type, member)));
|
|
82
|
+
}
|
|
83
|
+
_memberElements(target, type, member) {
|
|
84
|
+
const changeKind = ADD_KINDS.find(kind => this.byKind[kind].get(type)?.has(member));
|
|
85
|
+
// Stryker disable next-line ConditionalExpression,ArrayDeclaration -- equivalent: see v8 ignore — the changeKind === undefined branch is unreachable because addElement keeps byTarget and byKind in lockstep
|
|
86
|
+
/* v8 ignore next -- defensive: addElement always pairs byTarget and byKind, so every (type, member) in byTarget has a corresponding byKind entry */
|
|
87
|
+
if (changeKind === undefined)
|
|
88
|
+
return [];
|
|
89
|
+
return [{ target, type, member, changeKind }];
|
|
91
90
|
}
|
|
92
91
|
_recordRename(type, from, to) {
|
|
93
92
|
if (from === to)
|
|
@@ -108,7 +107,8 @@ export default class ChangeSet {
|
|
|
108
107
|
this.byTarget[ManifestTarget.DestructiveChanges],
|
|
109
108
|
this._renameSourcesByType(),
|
|
110
109
|
]);
|
|
111
|
-
|
|
110
|
+
const packaged = this.forPackageManifest();
|
|
111
|
+
return this._suppressVersionsOfDeletedBots(this._suppressMovedFolderMembers(this._subtractByType(baseDeletes, packaged), packaged));
|
|
112
112
|
}
|
|
113
113
|
// A deleted Bot takes its versions with it, so a BotVersion listed beside
|
|
114
114
|
// its own deleted parent is redundant. A BotVersion member is
|
|
@@ -133,6 +133,30 @@ export default class ChangeSet {
|
|
|
133
133
|
}
|
|
134
134
|
return result;
|
|
135
135
|
}
|
|
136
|
+
// For Report/Dashboard, the Metadata API relocates the component when the
|
|
137
|
+
// package lists it under a new folder, so a destructive entry for its
|
|
138
|
+
// former path would delete the component the same deploy just moved.
|
|
139
|
+
// Membership is compared on DeveloperName alone, deliberately not as a
|
|
140
|
+
// rename-pair match, so it also fires in the default run where no rename
|
|
141
|
+
// pair exists.
|
|
142
|
+
_suppressMovedFolderMembers(deletes, surviving) {
|
|
143
|
+
const result = new Map(deletes);
|
|
144
|
+
for (const type of FOLDER_MOVE_ON_DEPLOY_TYPES) {
|
|
145
|
+
const members = result.get(type);
|
|
146
|
+
const kept = surviving.get(type);
|
|
147
|
+
if (!members || !kept)
|
|
148
|
+
continue;
|
|
149
|
+
// A member whose last segment is empty yields an empty name, which
|
|
150
|
+
// would otherwise match every other malformed member.
|
|
151
|
+
const names = new Set([...kept].map(developerName).filter(Boolean));
|
|
152
|
+
const remaining = new Set([...members].filter(member => !names.has(developerName(member))));
|
|
153
|
+
if (remaining.size > 0)
|
|
154
|
+
result.set(type, remaining);
|
|
155
|
+
else
|
|
156
|
+
result.delete(type);
|
|
157
|
+
}
|
|
158
|
+
return result;
|
|
159
|
+
}
|
|
136
160
|
// Whether either manifest view would carry at least one member — the
|
|
137
161
|
// "did this run actually produce anything" signal callers need without
|
|
138
162
|
// reaching into both views themselves.
|
|
@@ -146,17 +170,18 @@ export default class ChangeSet {
|
|
|
146
170
|
// Delete subtracts Add ∪ Modify (cancelled deletions) and rename sources.
|
|
147
171
|
const targets = this._renameTargetsByType();
|
|
148
172
|
const sources = this._renameSourcesByType();
|
|
173
|
+
const surviving = this._unionByType([
|
|
174
|
+
this.byKind[ChangeKind.Add],
|
|
175
|
+
this.byKind[ChangeKind.Modify],
|
|
176
|
+
]);
|
|
149
177
|
return {
|
|
150
178
|
[ChangeKind.Add]: this._subtractByType(this.byKind[ChangeKind.Add], targets),
|
|
151
179
|
// Clone so callers that mutate the returned Modify view cannot corrupt
|
|
152
|
-
// ChangeSet internal state. Add
|
|
153
|
-
//
|
|
180
|
+
// ChangeSet internal state. Add is the new Map returned by
|
|
181
|
+
// _subtractByType, Delete the one returned by
|
|
182
|
+
// _suppressMovedFolderMembers.
|
|
154
183
|
[ChangeKind.Modify]: this._cloneManifest(this.byKind[ChangeKind.Modify]),
|
|
155
|
-
[ChangeKind.Delete]: this._subtractByType(this.byKind[ChangeKind.Delete], this._unionByType([
|
|
156
|
-
this.byKind[ChangeKind.Add],
|
|
157
|
-
this.byKind[ChangeKind.Modify],
|
|
158
|
-
sources,
|
|
159
|
-
])),
|
|
184
|
+
[ChangeKind.Delete]: this._suppressMovedFolderMembers(this._subtractByType(this.byKind[ChangeKind.Delete], this._unionByType([surviving, sources])), surviving),
|
|
160
185
|
[ChangeKind.Rename]: this._cloneRenames(),
|
|
161
186
|
};
|
|
162
187
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"changeSet.js","sourceRoot":"","sources":["../../src/utils/changeSet.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,GAAG,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"changeSet.js","sourceRoot":"","sources":["../../src/utils/changeSet.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,10 @@ export declare class MetadataBoundaryResolver {
|
|
|
11
11
|
protected get trees(): TreeReader;
|
|
12
12
|
createElement(path: string, metadataDef: Metadata, revision: string): Promise<MetadataElement>;
|
|
13
13
|
protected scanAndCreateElement(path: string, metadataDef: Metadata, revision: string): Promise<MetadataElement>;
|
|
14
|
+
protected findNameUnderTypeDirectory(parts: string[], dirIndex: number, suffix: string, revision: string): string | null;
|
|
15
|
+
protected componentNamesUnder(typeDir: string, suffix: string, revision: string): Set<string>;
|
|
16
|
+
protected findNameInAncestors(path: string, parts: string[], revision: string): string | null;
|
|
17
|
+
protected siblingsOf(dir: string, revision: string): string[];
|
|
14
18
|
protected isNameInPath(parts: string[], componentName: string): boolean;
|
|
15
19
|
protected findComponentName(siblings: string[], parts: string[]): string | null;
|
|
16
20
|
protected extractName(fileName: string, suffix: string): string;
|
|
@@ -45,42 +45,53 @@ export class MetadataBoundaryResolver {
|
|
|
45
45
|
async scanAndCreateElement(path, metadataDef, revision) {
|
|
46
46
|
const parts = path.split(PATH_SEP);
|
|
47
47
|
const dirIndex = parts.lastIndexOf(metadataDef.directoryName);
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
48
|
+
const componentName = dirIndex >= 0 && metadataDef.suffix
|
|
49
|
+
? this.findNameUnderTypeDirectory(parts, dirIndex, metadataDef.suffix, revision)
|
|
50
|
+
: this.findNameInAncestors(path, parts, revision);
|
|
51
|
+
return MetadataElement.fromScan(path, metadataDef, this.metadata, componentName ?? parse(path).name);
|
|
52
|
+
}
|
|
53
|
+
findNameUnderTypeDirectory(parts, dirIndex, suffix, revision) {
|
|
54
|
+
const typeDir = parts.slice(0, dirIndex + 1).join(PATH_SEP);
|
|
55
|
+
const componentNames = this.componentNamesUnder(typeDir, suffix, revision);
|
|
56
|
+
const pathAfterType = parts.slice(dirIndex + 1);
|
|
57
|
+
// Stryker disable next-line UpdateOperator -- unaffordable rather than equivalent: with two or more segments after the type directory, i++ keeps `i >= 0` true forever and the mutant hangs until Stryker's timeout; with fewer, the loop never runs in either direction
|
|
58
|
+
for (let i = pathAfterType.length - 2; i >= 0; i--) {
|
|
59
|
+
if (componentNames.has(pathAfterType[i]))
|
|
60
|
+
return pathAfterType[i];
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
componentNamesUnder(typeDir, suffix, revision) {
|
|
65
|
+
const metaSuffix = `.${suffix}${METAFILE_SUFFIX}`;
|
|
66
|
+
const componentNames = new Set();
|
|
67
|
+
for (const file of this.trees.filesUnder(revision, typeDir)) {
|
|
68
|
+
if (file.endsWith(metaSuffix)) {
|
|
69
|
+
const fileName = file.split(PATH_SEP).pop();
|
|
70
|
+
componentNames.add(this.extractName(fileName, suffix));
|
|
65
71
|
}
|
|
66
|
-
return MetadataElement.fromScan(path, metadataDef, this.metadata, parse(path).name);
|
|
67
72
|
}
|
|
73
|
+
return componentNames;
|
|
74
|
+
}
|
|
75
|
+
findNameInAncestors(path, parts, revision) {
|
|
68
76
|
let currentDir = dirname(path);
|
|
69
|
-
// Stryker disable next-line ConditionalExpression,LogicalOperator,BlockStatement,StringLiteral -- equivalent:
|
|
77
|
+
// Stryker disable next-line ConditionalExpression,LogicalOperator,BlockStatement,StringLiteral -- unaffordable rather than equivalent: an emptied body, the `''` literal, the `||` swap and the operand true-flip never let `currentDir` reach '.', so those mutants hang until Stryker's timeout (dirname('.') is '.'). The whole-condition false-flip is suppressed as a side effect; it skips the walk, and the tests asserting pathAfterType[0] from a walk would kill it
|
|
70
78
|
while (currentDir && currentDir !== '.') {
|
|
71
|
-
const
|
|
72
|
-
let siblings = this.dirCache.get(cacheKey);
|
|
73
|
-
if (siblings === undefined) {
|
|
74
|
-
siblings = this.trees.children(revision, currentDir);
|
|
75
|
-
this.dirCache.set(cacheKey, siblings);
|
|
76
|
-
}
|
|
79
|
+
const siblings = this.siblingsOf(currentDir, revision);
|
|
77
80
|
const componentName = this.findComponentName(siblings, parts);
|
|
78
|
-
if (componentName)
|
|
79
|
-
return
|
|
80
|
-
}
|
|
81
|
+
if (componentName)
|
|
82
|
+
return componentName;
|
|
81
83
|
currentDir = dirname(currentDir);
|
|
82
84
|
}
|
|
83
|
-
return
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
siblingsOf(dir, revision) {
|
|
88
|
+
const cacheKey = `${revision}:${dir}`;
|
|
89
|
+
let siblings = this.dirCache.get(cacheKey);
|
|
90
|
+
if (siblings === undefined) {
|
|
91
|
+
siblings = this.trees.children(revision, dir);
|
|
92
|
+
this.dirCache.set(cacheKey, siblings);
|
|
93
|
+
}
|
|
94
|
+
return siblings;
|
|
84
95
|
}
|
|
85
96
|
isNameInPath(parts, componentName) {
|
|
86
97
|
return parts.some(part => part === componentName || part.startsWith(`${componentName}.`));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadataBoundaryResolver.js","sourceRoot":"","sources":["../../src/utils/metadataBoundaryResolver.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;;;;;;;AACZ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAGhD,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAA;AAIlE,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEtD,MAAM,OAAO,wBAAwB;IAGJ,GAAG;IAFf,QAAQ,CAAuB;IAElD,YAA+B,GAAe;mBAAf,GAAG;QAChC,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAA;IAC3B,CAAC;IAED,IAAc,QAAQ;QACpB,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAA;IAC1B,CAAC;IAED,IAAc,KAAK;QACjB,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAA;IACvB,CAAC;IAGY,AAAN,KAAK,CAAC,aAAa,CACxB,IAAY,EACZ,WAAqB,EACrB,QAAgB;QAEhB,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC1E,IAAI,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,IAAI,CAAC;YAAE,OAAO,OAAO,CAAA;QAChE,IAAI,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM;YAAE,OAAO,OAAO,CAAA;QAElD,IAAI,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAA;YACzC,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;gBAChD,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAO,CAAC,CAAA;gBACrE,IAAI,aAAa,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC/C,OAAO,OAAO,CAAA;gBAChB,CAAC;gBACD,OAAO,eAAe,CAAC,QAAQ,CAC7B,IAAI,EACJ,WAAW,EACX,IAAI,CAAC,QAAQ,EACb,aAAa,CACd,CAAA;YACH,CAAC;YACD,OAAO,OAAO,CAAA;QAChB,CAAC;QAED,OAAO,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAA;IAC/D,CAAC;IAES,KAAK,CAAC,oBAAoB,CAClC,IAAY,EACZ,WAAqB,EACrB,QAAgB;QAEhB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;QAClC,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,aAAa,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"metadataBoundaryResolver.js","sourceRoot":"","sources":["../../src/utils/metadataBoundaryResolver.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;;;;;;;AACZ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAGhD,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAA;AAIlE,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEtD,MAAM,OAAO,wBAAwB;IAGJ,GAAG;IAFf,QAAQ,CAAuB;IAElD,YAA+B,GAAe;mBAAf,GAAG;QAChC,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAA;IAC3B,CAAC;IAED,IAAc,QAAQ;QACpB,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAA;IAC1B,CAAC;IAED,IAAc,KAAK;QACjB,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAA;IACvB,CAAC;IAGY,AAAN,KAAK,CAAC,aAAa,CACxB,IAAY,EACZ,WAAqB,EACrB,QAAgB;QAEhB,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC1E,IAAI,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,IAAI,CAAC;YAAE,OAAO,OAAO,CAAA;QAChE,IAAI,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM;YAAE,OAAO,OAAO,CAAA;QAElD,IAAI,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAA;YACzC,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;gBAChD,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAO,CAAC,CAAA;gBACrE,IAAI,aAAa,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC/C,OAAO,OAAO,CAAA;gBAChB,CAAC;gBACD,OAAO,eAAe,CAAC,QAAQ,CAC7B,IAAI,EACJ,WAAW,EACX,IAAI,CAAC,QAAQ,EACb,aAAa,CACd,CAAA;YACH,CAAC;YACD,OAAO,OAAO,CAAA;QAChB,CAAC;QAED,OAAO,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAA;IAC/D,CAAC;IAES,KAAK,CAAC,oBAAoB,CAClC,IAAY,EACZ,WAAqB,EACrB,QAAgB;QAEhB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;QAClC,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,aAAa,CAAC,CAAA;QAC7D,MAAM,aAAa,GACjB,QAAQ,IAAI,CAAC,IAAI,WAAW,CAAC,MAAM;YACjC,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAC7B,KAAK,EACL,QAAQ,EACR,WAAW,CAAC,MAAM,EAClB,QAAQ,CACT;YACH,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAA;QAErD,OAAO,eAAe,CAAC,QAAQ,CAC7B,IAAI,EACJ,WAAW,EACX,IAAI,CAAC,QAAQ,EACb,aAAa,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAClC,CAAA;IACH,CAAC;IAES,0BAA0B,CAClC,KAAe,EACf,QAAgB,EAChB,MAAc,EACd,QAAgB;QAEhB,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC3D,MAAM,cAAc,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;QAC1E,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAA;QAC/C,yQAAyQ;QACzQ,KAAK,IAAI,CAAC,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACnD,IAAI,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;gBAAE,OAAO,aAAa,CAAC,CAAC,CAAC,CAAA;QACnE,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAES,mBAAmB,CAC3B,OAAe,EACf,MAAc,EACd,QAAgB;QAEhB,MAAM,UAAU,GAAG,IAAI,MAAM,GAAG,eAAe,EAAE,CAAA;QACjD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAA;QACxC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;YAC5D,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAG,CAAA;gBAC5C,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAA;YACxD,CAAC;QACH,CAAC;QACD,OAAO,cAAc,CAAA;IACvB,CAAC;IAES,mBAAmB,CAC3B,IAAY,EACZ,KAAe,EACf,QAAgB;QAEhB,IAAI,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QAC9B,8cAA8c;QAC9c,OAAO,UAAU,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;YACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;YACtD,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;YAC7D,IAAI,aAAa;gBAAE,OAAO,aAAa,CAAA;YACvC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;QAClC,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAES,UAAU,CAAC,GAAW,EAAE,QAAgB;QAChD,MAAM,QAAQ,GAAG,GAAG,QAAQ,IAAI,GAAG,EAAE,CAAA;QACrC,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC1C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;YAC7C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;QACvC,CAAC;QACD,OAAO,QAAQ,CAAA;IACjB,CAAC;IAES,YAAY,CAAC,KAAe,EAAE,aAAqB;QAC3D,OAAO,KAAK,CAAC,IAAI,CACf,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,aAAa,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,aAAa,GAAG,CAAC,CACvE,CAAA;IACH,CAAC;IAES,iBAAiB,CACzB,QAAkB,EAClB,KAAe;QAEf,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YAClD,IACE,eAAe,EAAE,MAAM;gBACvB,OAAO,CAAC,QAAQ,CAAC,IAAI,eAAe,CAAC,MAAM,EAAE,CAAC,EAC9C,CAAC;gBACD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC,CAAA;gBAC9D,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;oBACnC,OAAO,IAAI,CAAA;gBACb,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAES,WAAW,CAAC,QAAgB,EAAE,MAAc;QACpD,OAAO,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,MAAM,EAAE,EAAE,EAAE,CAAC,CAAA;IACxE,CAAC;CACF;AA5Ic;IADZ,GAAG;6DA4BH"}
|
|
@@ -1,4 +1,51 @@
|
|
|
1
1
|
'use strict';
|
|
2
|
+
// The push helpers return false on the first child pair already known to
|
|
3
|
+
// differ, so children are walked once rather than scanned then pushed.
|
|
4
|
+
const pushArrayChildPairs = (arrA, arrB, stackA, stackB) => {
|
|
5
|
+
const len = arrA.length;
|
|
6
|
+
if (len !== arrB.length)
|
|
7
|
+
return false;
|
|
8
|
+
// Stryker disable next-line EqualityOperator -- `i <= len` is equivalent: both arrays have length len, so the extra pass reads arrA[len] and arrB[len], both undefined, and `va === vb` continues out of the loop (the object loop's twin is killable: keysA[len] is undefined and Object.hasOwn(objB, undefined) refuses). `i >= len` shares the mutator name; on a non-empty array it skips the loop exactly like the killed ConditionalExpression false-flip on this condition
|
|
9
|
+
for (let i = 0; i < len; i++) {
|
|
10
|
+
const va = arrA[i];
|
|
11
|
+
const vb = arrB[i];
|
|
12
|
+
if (va === vb)
|
|
13
|
+
continue;
|
|
14
|
+
if (va === null ||
|
|
15
|
+
vb === null ||
|
|
16
|
+
typeof va !== 'object' ||
|
|
17
|
+
typeof vb !== 'object') {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
stackA.push(va);
|
|
21
|
+
stackB.push(vb);
|
|
22
|
+
}
|
|
23
|
+
return true;
|
|
24
|
+
};
|
|
25
|
+
const pushObjectChildPairs = (objA, objB, stackA, stackB) => {
|
|
26
|
+
const keysA = Object.keys(objA);
|
|
27
|
+
const len = keysA.length;
|
|
28
|
+
if (len !== Object.keys(objB).length)
|
|
29
|
+
return false;
|
|
30
|
+
for (let i = 0; i < len; i++) {
|
|
31
|
+
const key = keysA[i];
|
|
32
|
+
if (!Object.hasOwn(objB, key))
|
|
33
|
+
return false;
|
|
34
|
+
const va = objA[key];
|
|
35
|
+
const vb = objB[key];
|
|
36
|
+
if (va === vb)
|
|
37
|
+
continue;
|
|
38
|
+
if (va === null ||
|
|
39
|
+
vb === null ||
|
|
40
|
+
typeof va !== 'object' ||
|
|
41
|
+
typeof vb !== 'object') {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
stackA.push(va);
|
|
45
|
+
stackB.push(vb);
|
|
46
|
+
}
|
|
47
|
+
return true;
|
|
48
|
+
};
|
|
2
49
|
/**
|
|
3
50
|
* Iterative structural equality for JSON-like values (plain objects,
|
|
4
51
|
* arrays, primitives). Order-sensitive for arrays. Replaces the narrow
|
|
@@ -40,51 +87,11 @@ export const deepEqualJson = (a, b) => {
|
|
|
40
87
|
const aIsArr = Array.isArray(ai);
|
|
41
88
|
if (aIsArr !== Array.isArray(bi))
|
|
42
89
|
return false;
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
if (len !== arrB.length)
|
|
48
|
-
return false;
|
|
49
|
-
for (let i = 0; i < len; i++) {
|
|
50
|
-
const va = arrA[i];
|
|
51
|
-
const vb = arrB[i];
|
|
52
|
-
if (va === vb)
|
|
53
|
-
continue;
|
|
54
|
-
if (va === null ||
|
|
55
|
-
vb === null ||
|
|
56
|
-
typeof va !== 'object' ||
|
|
57
|
-
typeof vb !== 'object') {
|
|
58
|
-
return false;
|
|
59
|
-
}
|
|
60
|
-
stackA.push(va);
|
|
61
|
-
stackB.push(vb);
|
|
62
|
-
}
|
|
63
|
-
continue;
|
|
64
|
-
}
|
|
65
|
-
const objA = ai;
|
|
66
|
-
const objB = bi;
|
|
67
|
-
const keysA = Object.keys(objA);
|
|
68
|
-
const len = keysA.length;
|
|
69
|
-
if (len !== Object.keys(objB).length)
|
|
90
|
+
const childrenMatch = aIsArr
|
|
91
|
+
? pushArrayChildPairs(ai, bi, stackA, stackB)
|
|
92
|
+
: pushObjectChildPairs(ai, bi, stackA, stackB);
|
|
93
|
+
if (!childrenMatch)
|
|
70
94
|
return false;
|
|
71
|
-
for (let i = 0; i < len; i++) {
|
|
72
|
-
const key = keysA[i];
|
|
73
|
-
if (!Object.hasOwn(objB, key))
|
|
74
|
-
return false;
|
|
75
|
-
const va = objA[key];
|
|
76
|
-
const vb = objB[key];
|
|
77
|
-
if (va === vb)
|
|
78
|
-
continue;
|
|
79
|
-
if (va === null ||
|
|
80
|
-
vb === null ||
|
|
81
|
-
typeof va !== 'object' ||
|
|
82
|
-
typeof vb !== 'object') {
|
|
83
|
-
return false;
|
|
84
|
-
}
|
|
85
|
-
stackA.push(va);
|
|
86
|
-
stackB.push(vb);
|
|
87
|
-
}
|
|
88
95
|
}
|
|
89
96
|
return true;
|
|
90
97
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deepEqualJson.js","sourceRoot":"","sources":["../../../src/utils/metadataDiff/deepEqualJson.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ
|
|
1
|
+
{"version":3,"file":"deepEqualJson.js","sourceRoot":"","sources":["../../../src/utils/metadataDiff/deepEqualJson.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,10 +16,8 @@ const parseDeclaration = (decl) => {
|
|
|
16
16
|
const tree = txmlParse(decl);
|
|
17
17
|
const declNode = tree.find(
|
|
18
18
|
// Stryker disable ConditionalExpression,LogicalOperator,StringLiteral -- equivalent: this guard discriminates the declaration node from txml's tree output; the SF metadata declaration is always the first/only TxmlNode with tagName XML_HEADER_ATTRIBUTE_KEY, so the AND-vs-OR and 'string' literal mutants find the same node
|
|
19
|
-
(n) => typeof n !== 'string' && n.tagName === XML_HEADER_ATTRIBUTE_KEY
|
|
19
|
+
(n) => typeof n !== 'string' && n.tagName === XML_HEADER_ATTRIBUTE_KEY);
|
|
20
20
|
// Stryker restore ConditionalExpression,LogicalOperator,StringLiteral
|
|
21
|
-
);
|
|
22
|
-
// Stryker disable next-line ConditionalExpression,ObjectLiteral -- equivalent: defensive fallback when txml returns no declaration node; SF metadata always provides a declaration so the fallback is unreachable, and the empty-object replacement is symmetric with the populated headerAttrs result downstream
|
|
23
21
|
if (!declNode)
|
|
24
22
|
return { [XML_HEADER_ATTRIBUTE_KEY]: {} };
|
|
25
23
|
const headerAttrs = {};
|
|
@@ -30,70 +28,64 @@ const parseDeclaration = (decl) => {
|
|
|
30
28
|
}
|
|
31
29
|
return { [XML_HEADER_ATTRIBUTE_KEY]: headerAttrs };
|
|
32
30
|
};
|
|
33
|
-
//
|
|
34
|
-
//
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
//
|
|
38
|
-
const parsePrologue = (xml) => {
|
|
39
|
-
let i = 0;
|
|
40
|
-
let xmlHeader;
|
|
41
|
-
const declMatch = XML_DECL_RE.exec(xml);
|
|
42
|
-
// Stryker disable next-line ConditionalExpression -- equivalent: the index === 0 anchor is symmetric with the regex's `^` anchor; for the only inputs reachable here both produce identical (declMatch.index === 0) outcomes
|
|
43
|
-
if (declMatch && declMatch.index === 0) {
|
|
44
|
-
xmlHeader = parseDeclaration(declMatch[0]);
|
|
45
|
-
i += declMatch[0].length;
|
|
46
|
-
}
|
|
47
|
-
// Stryker disable next-line BlockStatement,EqualityOperator -- equivalent: prologue scan loop; emptying the body returns null on missing root which is semantically equivalent to falling out the bottom and returning null via the unmatched ROOT_OPEN_RE; <= vs < changes the iteration boundary by one position which matters only when xml ends in whitespace right at the root tag boundary, a case not present in test fixtures
|
|
31
|
+
// Returns the offset of the first character that is not whitespace, a
|
|
32
|
+
// comment or a `<!...>` declaration, or null when a declaration never closes.
|
|
33
|
+
const skipPrologueMisc = (xml, start) => {
|
|
34
|
+
let i = start;
|
|
35
|
+
// Stryker disable next-line BlockStatement,EqualityOperator -- BlockStatement is not equivalent but unaffordable: an emptied body never advances `i`, so the mutant hangs until Stryker's timeout. EqualityOperator: `<=` is equivalent (one extra pass at i === xml.length matches nothing and breaks at the same offset); `>=` is killable but shares the mutator name, and the loop-skipping behaviour it produces is already killed through the ConditionalExpression false-flip
|
|
48
36
|
while (i < xml.length) {
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
}
|
|
54
|
-
const commentMatch = COMMENT_RE.exec(xml.slice(i));
|
|
55
|
-
if (commentMatch) {
|
|
56
|
-
i += commentMatch[0].length;
|
|
37
|
+
const rest = xml.slice(i);
|
|
38
|
+
const skippable = WS_RE.exec(rest) ?? COMMENT_RE.exec(rest);
|
|
39
|
+
if (skippable) {
|
|
40
|
+
i += skippable[0].length;
|
|
57
41
|
continue;
|
|
58
42
|
}
|
|
59
43
|
// `<!...>` declarations (DOCTYPE, ENTITY, etc.) before the root.
|
|
60
44
|
// Naive boundary at the next `>` — none of our metadata payloads use
|
|
61
45
|
// bracketed internal subsets, so a more elaborate scan would be
|
|
62
46
|
// unused work.
|
|
63
|
-
// Stryker disable MethodExpression,ArithmeticOperator,ConditionalExpression,EqualityOperator -- equivalent: this branch handles `<!DOCTYPE>` style prologue elements; SF metadata never includes DOCTYPE declarations, so the branch body is unreachable for the test corpus
|
|
64
47
|
if (xml.startsWith('<!', i) && !xml.startsWith('<!--', i)) {
|
|
65
48
|
const end = xml.indexOf('>', i + 2);
|
|
49
|
+
// Stryker disable next-line EqualityOperator -- `end <= 0` is equivalent: the search starts at i + 2, so indexOf returns -1 or an offset of at least 2, never 0. `end >= 0` shares the mutator name; whenever a `>` exists it returns null exactly like the killed ConditionalExpression true-flip on this condition
|
|
66
50
|
if (end < 0)
|
|
67
51
|
return null;
|
|
68
52
|
i = end + 1;
|
|
69
53
|
continue;
|
|
70
54
|
}
|
|
71
|
-
// Stryker restore MethodExpression,ArithmeticOperator,ConditionalExpression,EqualityOperator
|
|
72
55
|
break;
|
|
73
56
|
}
|
|
74
|
-
|
|
57
|
+
return i;
|
|
58
|
+
};
|
|
59
|
+
const matchRootOpenTag = (xml, start) => {
|
|
60
|
+
ROOT_OPEN_RE.lastIndex = start;
|
|
75
61
|
const rootMatch = ROOT_OPEN_RE.exec(xml);
|
|
76
62
|
// Stryker disable next-line ConditionalExpression -- equivalent: rootMatch validation; flipping to false continues with rootMatch undefined which throws on the next destructure — but the prologue function returns null in either case (the throw is caught by driveParse which surfaces it)
|
|
77
|
-
if (!rootMatch || rootMatch.index !==
|
|
63
|
+
if (!rootMatch || rootMatch.index !== start)
|
|
78
64
|
return null;
|
|
79
65
|
const [full, rootName, attrsRaw] = rootMatch;
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
66
|
+
return {
|
|
67
|
+
rootName: rootName,
|
|
68
|
+
attrsRaw: attrsRaw,
|
|
69
|
+
bodyStart: start + full.length,
|
|
70
|
+
// Stryker disable next-line MethodExpression -- equivalent: trimEnd().endsWith('/') checks if attrs end with self-closing slash; trimStart instead would not affect SF metadata test fixtures because the trailing slash detection still works on the original attrsRaw whose trailing whitespace doesn't include the slash
|
|
71
|
+
isSelfClosing: attrsRaw.trimEnd().endsWith('/'),
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
// Reuse txml to parse just the root open tag's attributes consistently
|
|
75
|
+
// with how it parses every other tag. Wrapping it as self-closing gives
|
|
76
|
+
// us a clean parse target that always returns one node.
|
|
77
|
+
const syntheticRootTag = ({ rootName, attrsRaw, isSelfClosing, }) => {
|
|
86
78
|
// Stryker disable Regex -- equivalent: the trailing slash strip lets us re-wrap as a self-closing tag; mutants on /\/\s*$/ produce a regex with broader/narrower whitespace matching but SF metadata's self-closing root tag has no trailing whitespace before the `/`, so the strip is a no-op either way
|
|
87
|
-
const
|
|
88
|
-
? `<${rootName}${attrsRaw.replace(/\/\s*$/, '')}/>`
|
|
89
|
-
: `<${rootName}${attrsRaw}/>`;
|
|
79
|
+
const attributes = isSelfClosing ? attrsRaw.replace(/\/\s*$/, '') : attrsRaw;
|
|
90
80
|
// Stryker restore Regex
|
|
91
|
-
|
|
81
|
+
return `<${rootName}${attributes}/>`;
|
|
82
|
+
};
|
|
83
|
+
const parseRootAttributes = (rootTag) => {
|
|
84
|
+
const syntheticTree = txmlParse(syntheticRootTag(rootTag));
|
|
92
85
|
const syntheticNode = syntheticTree.find(
|
|
93
86
|
// Stryker disable next-line ConditionalExpression,StringLiteral -- equivalent: txml's parse always returns one TxmlNode for our well-formed self-closing synthetic tag; the type-narrowing predicate is symmetric (true also picks the same node since there's only one)
|
|
94
87
|
(n) => typeof n !== 'string');
|
|
95
88
|
const rootAttributes = {};
|
|
96
|
-
// Stryker disable next-line ConditionalExpression -- equivalent: syntheticNode presence guard; txml always returns one node for our synthetic self-closing tag, so the false-flip is unreachable
|
|
97
89
|
if (syntheticNode) {
|
|
98
90
|
for (const key of Object.keys(syntheticNode.attributes)) {
|
|
99
91
|
const value = syntheticNode.attributes[key];
|
|
@@ -103,12 +95,31 @@ const parsePrologue = (xml) => {
|
|
|
103
95
|
value === null ? 'true' : value;
|
|
104
96
|
}
|
|
105
97
|
}
|
|
98
|
+
return rootAttributes;
|
|
99
|
+
};
|
|
100
|
+
// Walks the prologue (BOM, optional declaration, leading whitespace,
|
|
101
|
+
// comments, and `<!...>` declarations such as DOCTYPE) and stops at the
|
|
102
|
+
// root opening tag. Returns the root name, its attributes, the byte
|
|
103
|
+
// offset where the root's body starts so the streaming loop can pick up
|
|
104
|
+
// from there, and whether the root is self-closing.
|
|
105
|
+
const parsePrologue = (xml) => {
|
|
106
|
+
const declMatch = XML_DECL_RE.exec(xml);
|
|
107
|
+
// Stryker disable next-line ConditionalExpression -- equivalent: the index === 0 anchor is symmetric with the regex's `^` anchor; for the only inputs reachable here both produce identical (declMatch.index === 0) outcomes
|
|
108
|
+
const declaration = declMatch && declMatch.index === 0 ? declMatch[0] : '';
|
|
109
|
+
const xmlHeader = declaration ? parseDeclaration(declaration) : undefined;
|
|
110
|
+
const rootStart = skipPrologueMisc(xml, declaration.length);
|
|
111
|
+
// Stryker disable next-line ConditionalExpression -- the false-flip is equivalent: matchRootOpenTag receives null, and its `rootMatch.index !== start` guard can never match null, so it returns null as well. The true-flip is suppressed as a side effect; the always-return-null behaviour it produces is killed through the EqualityOperator mutant on the same condition
|
|
112
|
+
if (rootStart === null)
|
|
113
|
+
return null;
|
|
114
|
+
const rootTag = matchRootOpenTag(xml, rootStart);
|
|
115
|
+
if (rootTag === null)
|
|
116
|
+
return null;
|
|
106
117
|
return {
|
|
107
118
|
xmlHeader,
|
|
108
|
-
rootName: rootName,
|
|
109
|
-
rootAttributes,
|
|
110
|
-
bodyStart,
|
|
111
|
-
isSelfClosing,
|
|
119
|
+
rootName: rootTag.rootName,
|
|
120
|
+
rootAttributes: parseRootAttributes(rootTag),
|
|
121
|
+
bodyStart: rootTag.bodyStart,
|
|
122
|
+
isSelfClosing: rootTag.isSelfClosing,
|
|
112
123
|
};
|
|
113
124
|
};
|
|
114
125
|
// One-shot per-element parse via txml's parseNode primitive. We loop
|
|
@@ -173,20 +184,19 @@ const verifyTail = (xml, pos, rootName, isSelfClosing) => {
|
|
|
173
184
|
i++;
|
|
174
185
|
continue;
|
|
175
186
|
}
|
|
176
|
-
// Stryker disable ConditionalExpression,StringLiteral,EqualityOperator,ArithmeticOperator -- equivalent: trailing-comment branch; metadata XML doesn't have trailing comments after root close, so the branch body is unreachable for the tested fixtures
|
|
177
187
|
if (xml.startsWith('<!--', i)) {
|
|
178
188
|
const end = xml.indexOf('-->', i + 4);
|
|
189
|
+
// Stryker disable next-line EqualityOperator -- `end <= 0` is equivalent: the search starts at i + 4, so indexOf returns -1 or an offset of at least 4, never 0. `end >= 0` shares the mutator name; whenever the comment is terminated it throws exactly like the killed ConditionalExpression true-flip on this condition
|
|
179
190
|
if (end < 0)
|
|
180
191
|
throw new Error('unterminated comment after root close');
|
|
181
192
|
i = end + 3;
|
|
182
193
|
continue;
|
|
183
194
|
}
|
|
184
|
-
// Stryker
|
|
185
|
-
// Stryker disable MethodExpression,ArithmeticOperator,StringLiteral -- equivalent: this throw fires for unexpected content after root close; the slice with Math.min(i+30, xml.length) caps the message preview at 30 chars; mutants change the preview length/content which is observability only — tests assert that the throw fires
|
|
195
|
+
// Stryker disable MethodExpression,ArithmeticOperator -- equivalent: the slice with Math.min(i+30, xml.length) caps the message preview at 30 chars; these mutants change only that preview, which is observability only — tests pin the message prefix, not the preview
|
|
186
196
|
throw new Error(`unexpected content after root close: ${xml.slice(i, Math.min(i + 30, xml.length))}`);
|
|
187
|
-
// Stryker restore MethodExpression,ArithmeticOperator,StringLiteral
|
|
188
197
|
}
|
|
189
198
|
};
|
|
199
|
+
// Stryker restore MethodExpression,ArithmeticOperator
|
|
190
200
|
const driveParse = (source, onElement, options) => {
|
|
191
201
|
// Stryker disable next-line ConditionalExpression,StringLiteral -- equivalent: source string-vs-buffer dispatch; flipping to false (Buffer path) on a string source returns the same string (Buffer.from then toString roundtrips for ASCII), and tests pass both string and Buffer sources separately to verify each path
|
|
192
202
|
const payload = typeof source === 'string' ? source : source.toString('utf8');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xmlEventReader.js","sourceRoot":"","sources":["../../../src/utils/metadataDiff/xmlEventReader.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AACZ,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,WAAW,CAAA;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAGL,iBAAiB,GAClB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,gBAAgB,EAChB,wBAAwB,GAEzB,MAAM,iBAAiB,CAAA;AAaxB,mPAAmP;AACnP,MAAM,WAAW,GAAG,sBAAsB,CAAA;AAC1C,uMAAuM;AACvM,MAAM,UAAU,GAAG,kBAAkB,CAAA;AACrC,gPAAgP;AAChP,MAAM,KAAK,GAAG,MAAM,CAAA;AACpB,oSAAoS;AACpS,MAAM,YAAY,GAAG,gCAAgC,CAAA;AAUrD,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAc,EAAE;IACpD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAgB,CAAA;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI;IACxB,kUAAkU;IAClU,CAAC,CAAC,EAAiB,EAAE,CACnB,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,KAAK,wBAAwB
|
|
1
|
+
{"version":3,"file":"xmlEventReader.js","sourceRoot":"","sources":["../../../src/utils/metadataDiff/xmlEventReader.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,6 +33,9 @@ export default class RepoGitDiff {
|
|
|
33
33
|
* getRenamePairs() once iteration completes.
|
|
34
34
|
*/
|
|
35
35
|
getLines(): AsyncGenerator<string>;
|
|
36
|
+
private _resetRunState;
|
|
37
|
+
private _routeLine;
|
|
38
|
+
private _routeAddition;
|
|
36
39
|
getRenamePairs(): readonly RenamePathPair[];
|
|
37
40
|
getHeldAdditionProbeFailure(): HeldAdditionProbeFailure | undefined;
|
|
38
41
|
getUnmatchedSourceScopes(): readonly string[];
|
package/lib/utils/repoGitDiff.js
CHANGED
|
@@ -41,69 +41,74 @@ export default class RepoGitDiff {
|
|
|
41
41
|
* getRenamePairs() once iteration completes.
|
|
42
42
|
*/
|
|
43
43
|
async *getLines() {
|
|
44
|
-
this.
|
|
45
|
-
this.diffScopeVerdict.changesSeen = 0;
|
|
46
|
-
this.diffScopeVerdict.linesYielded = 0;
|
|
47
|
-
this.probeFailure = undefined;
|
|
44
|
+
this._resetRunState();
|
|
48
45
|
const ignoreHelper = await buildIgnoreHelper(this.config);
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
46
|
+
const pending = {
|
|
47
|
+
additionNames: new Set(),
|
|
48
|
+
heldAdditionNames: new Set(),
|
|
49
|
+
deferredDeletions: [],
|
|
50
|
+
};
|
|
52
51
|
for await (const rawLine of this.gitAdapter.streamDiffLines({
|
|
53
52
|
spec: this.diffSpec(),
|
|
54
53
|
verdict: this.diffScopeVerdict,
|
|
55
54
|
scopes: this.config.source,
|
|
56
55
|
})) {
|
|
57
56
|
for (const expanded of this._expandRename(rawLine)) {
|
|
58
|
-
|
|
59
|
-
if (
|
|
60
|
-
|
|
61
|
-
// Stryker disable next-line ConditionalExpression -- equivalent: see v8 ignore — _expandRename emits paths that are routed through the metadata index by the producing test fixtures, so the false-flip (always continue) is unreachable when the test corpus is in use
|
|
62
|
-
/* v8 ignore next -- defensive: upstream RepoGitDiff already filters non-metadata paths via _expandRename, but kept as safety net */
|
|
63
|
-
if (!this.metadata.has(expanded))
|
|
64
|
-
continue;
|
|
65
|
-
const kept = ignoreHelper.keep(expanded);
|
|
66
|
-
if (expanded.startsWith(ADDITION)) {
|
|
67
|
-
const name = this._extractComparisonName(expanded);
|
|
68
|
-
// An ignored addition is held rather than dropped: it may be the
|
|
69
|
-
// destination of a move into the ignore set, which can only be
|
|
70
|
-
// told from a stale copy once the whole diff has been seen.
|
|
71
|
-
if (!kept) {
|
|
72
|
-
heldAdditionNames.add(name);
|
|
73
|
-
continue;
|
|
74
|
-
}
|
|
75
|
-
additionNames.add(name);
|
|
76
|
-
yield expanded;
|
|
77
|
-
}
|
|
78
|
-
else if (!kept) {
|
|
79
|
-
continue;
|
|
80
|
-
}
|
|
81
|
-
else if (expanded.startsWith(DELETION)) {
|
|
82
|
-
// Defer: the D line might cancel against an A line we haven't
|
|
83
|
-
// seen yet (rename-collapse case).
|
|
84
|
-
deferredDeletions.push({
|
|
85
|
-
line: expanded,
|
|
86
|
-
name: this._extractComparisonName(expanded),
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
else {
|
|
90
|
-
yield expanded;
|
|
91
|
-
}
|
|
57
|
+
const streamable = this._routeLine(expanded, ignoreHelper, pending);
|
|
58
|
+
if (streamable !== undefined)
|
|
59
|
+
yield streamable;
|
|
92
60
|
}
|
|
93
61
|
}
|
|
94
|
-
const vouching = await this._vouchingHeldNames(heldAdditionNames, deferredDeletions, additionNames, ignoreHelper);
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
// line a debug run cannot explain why a destructive entry is missing.
|
|
98
|
-
Logger.debug(lazy `getLines: held addition(s) '${[...vouching].join("', '")}' survive only under ignored paths at '${this.config.to}', cancelling their deletions`);
|
|
99
|
-
}
|
|
100
|
-
for (const name of vouching)
|
|
101
|
-
additionNames.add(name);
|
|
102
|
-
for (const { line, name } of deferredDeletions) {
|
|
103
|
-
if (!additionNames.has(name))
|
|
62
|
+
const vouching = await this._vouchingHeldNames(pending.heldAdditionNames, pending.deferredDeletions, pending.additionNames, ignoreHelper);
|
|
63
|
+
for (const { line, name } of pending.deferredDeletions) {
|
|
64
|
+
if (!pending.additionNames.has(name) && !vouching.has(name))
|
|
104
65
|
yield line;
|
|
105
66
|
}
|
|
106
67
|
}
|
|
68
|
+
_resetRunState() {
|
|
69
|
+
this.renamePairs = [];
|
|
70
|
+
this.diffScopeVerdict.changesSeen = 0;
|
|
71
|
+
this.diffScopeVerdict.linesYielded = 0;
|
|
72
|
+
this.probeFailure = undefined;
|
|
73
|
+
}
|
|
74
|
+
// Returns the line when it streams right away, and records what the
|
|
75
|
+
// cancellation rule needs into `pending`: every addition name (held when
|
|
76
|
+
// ignored) and every kept deletion. Routing and recording share one pass
|
|
77
|
+
// because the generator must decide per line whether to yield it now.
|
|
78
|
+
_routeLine(expanded, ignoreHelper, pending) {
|
|
79
|
+
// Stryker disable next-line ConditionalExpression -- equivalent: on the false-flip an empty line reaches metadata.has, which rejects it, so the line is dropped (return undefined) either way
|
|
80
|
+
if (!expanded)
|
|
81
|
+
return undefined;
|
|
82
|
+
if (!this.metadata.has(expanded))
|
|
83
|
+
return undefined;
|
|
84
|
+
if (expanded.startsWith(ADDITION)) {
|
|
85
|
+
return this._routeAddition(expanded, ignoreHelper, pending);
|
|
86
|
+
}
|
|
87
|
+
if (!ignoreHelper.keep(expanded))
|
|
88
|
+
return undefined;
|
|
89
|
+
if (!expanded.startsWith(DELETION))
|
|
90
|
+
return expanded;
|
|
91
|
+
// Defer: the D line might cancel against an A line we haven't
|
|
92
|
+
// seen yet (rename-collapse case).
|
|
93
|
+
pending.deferredDeletions.push({
|
|
94
|
+
line: expanded,
|
|
95
|
+
name: this._extractComparisonName(expanded),
|
|
96
|
+
});
|
|
97
|
+
return undefined;
|
|
98
|
+
}
|
|
99
|
+
// An ignored addition is held rather than dropped: it may be the
|
|
100
|
+
// destination of a move into the ignore set, which can only be
|
|
101
|
+
// told from a stale copy once the whole diff has been seen.
|
|
102
|
+
_routeAddition(addition, ignoreHelper, pending) {
|
|
103
|
+
const kept = ignoreHelper.keep(addition);
|
|
104
|
+
const name = this._extractComparisonName(addition);
|
|
105
|
+
if (!kept) {
|
|
106
|
+
pending.heldAdditionNames.add(name);
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
pending.additionNames.add(name);
|
|
110
|
+
return addition;
|
|
111
|
+
}
|
|
107
112
|
getRenamePairs() {
|
|
108
113
|
return this.renamePairs;
|
|
109
114
|
}
|
|
@@ -135,8 +140,10 @@ export default class RepoGitDiff {
|
|
|
135
140
|
yield `${DELETION}${TAB}${fromPath}`;
|
|
136
141
|
yield `${ADDITION}${TAB}${toPath}`;
|
|
137
142
|
}
|
|
143
|
+
// Locale-invariant on purpose: a locale-sensitive fold makes the
|
|
144
|
+
// cancellation key depend on the machine that ran the diff.
|
|
138
145
|
_extractComparisonName(line) {
|
|
139
|
-
return this.metadata.getFullyQualifiedName(line).
|
|
146
|
+
return this.metadata.getFullyQualifiedName(line).toLowerCase();
|
|
140
147
|
}
|
|
141
148
|
// A held name vouches for its component only when nothing of that
|
|
142
149
|
// component is visible at `to`: a component still alive under an
|
|
@@ -152,7 +159,13 @@ export default class RepoGitDiff {
|
|
|
152
159
|
if (candidates.size === 0)
|
|
153
160
|
return candidates;
|
|
154
161
|
const visible = await this._visibleNamesAtTo(candidates, ignoreHelper);
|
|
155
|
-
|
|
162
|
+
const vouching = new Set([...candidates].filter(name => !visible.has(name)));
|
|
163
|
+
if (vouching.size > 0) {
|
|
164
|
+
// A cancelled deletion appears in neither manifest, so without this
|
|
165
|
+
// line a debug run cannot explain why a destructive entry is missing.
|
|
166
|
+
Logger.debug(lazy `getLines: held addition(s) '${[...vouching].join("', '")}' survive only under ignored paths at '${this.config.to}', cancelling their deletions`);
|
|
167
|
+
}
|
|
168
|
+
return vouching;
|
|
156
169
|
}
|
|
157
170
|
// Visibility is decided by the global ignore, never the destructive one:
|
|
158
171
|
// the question is whether sgd would still treat a file of the component
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repoGitDiff.js","sourceRoot":"","sources":["../../src/utils/repoGitDiff.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AACZ,OAAO,UAGN,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,6BAA6B,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AAIzE,OAAO,EAAE,iBAAiB,EAAqB,MAAM,mBAAmB,CAAA;AACxE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"repoGitDiff.js","sourceRoot":"","sources":["../../src/utils/repoGitDiff.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
import { PATH_SEP } from '../constant/fsConstants.js';
|
|
3
3
|
import { GIT_DIFF_TYPE_REGEX } from '../constant/gitConstants.js';
|
|
4
|
-
import { CONTENT_CONTAINER_ADAPTERS } from '../constant/metadataConstants.js';
|
|
4
|
+
import { CONTENT_CONTAINER_ADAPTERS, DASHBOARD_TYPE, OBJECT_TYPE, PERMISSIONSET_TYPE, REPORT_TYPE, } from '../constant/metadataConstants.js';
|
|
5
5
|
const TREE_INDEX_XML_NAMES = new Set([
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
OBJECT_TYPE,
|
|
7
|
+
DASHBOARD_TYPE,
|
|
8
|
+
REPORT_TYPE,
|
|
9
9
|
'AuraDefinitionBundle',
|
|
10
10
|
'LightningComponentBundle',
|
|
11
11
|
'GenAiFunction',
|
|
12
|
-
|
|
12
|
+
PERMISSIONSET_TYPE,
|
|
13
13
|
'Territory2Model',
|
|
14
14
|
]);
|
|
15
15
|
const needsTreeIndex = (type) => {
|
|
@@ -42,28 +42,25 @@ const scopeForType = (parts, type) => {
|
|
|
42
42
|
return null;
|
|
43
43
|
return parts.slice(0, dirIndex + 1).join(PATH_SEP);
|
|
44
44
|
};
|
|
45
|
+
// A child type (parentXmlName) is indexed through its parent: the parent's
|
|
46
|
+
// type directory is the one the index must cover.
|
|
47
|
+
const scopeForLine = (line, metadata, parentIndex) => {
|
|
48
|
+
const path = line.replace(GIT_DIFF_TYPE_REGEX, '');
|
|
49
|
+
const type = metadata.get(path);
|
|
50
|
+
if (!type)
|
|
51
|
+
return null;
|
|
52
|
+
const indexedType = type.parentXmlName
|
|
53
|
+
? parentIndex.get(type.parentXmlName)
|
|
54
|
+
: type;
|
|
55
|
+
if (!indexedType || !needsTreeIndex(indexedType))
|
|
56
|
+
return null;
|
|
57
|
+
return scopeForType(path.split(PATH_SEP), indexedType);
|
|
58
|
+
};
|
|
45
59
|
export const computeTreeIndexScope = (lines, metadata) => {
|
|
46
60
|
const scope = new Set();
|
|
47
61
|
const parentIndex = buildParentIndex(metadata);
|
|
48
62
|
for (const line of lines) {
|
|
49
|
-
const
|
|
50
|
-
const type = metadata.get(path);
|
|
51
|
-
if (!type)
|
|
52
|
-
continue;
|
|
53
|
-
const parts = path.split(PATH_SEP);
|
|
54
|
-
if (type.parentXmlName) {
|
|
55
|
-
const parent = parentIndex.get(type.parentXmlName);
|
|
56
|
-
if (parent && needsTreeIndex(parent)) {
|
|
57
|
-
const result = scopeForType(parts, parent);
|
|
58
|
-
if (result) {
|
|
59
|
-
scope.add(result);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
continue;
|
|
63
|
-
}
|
|
64
|
-
if (!needsTreeIndex(type))
|
|
65
|
-
continue;
|
|
66
|
-
const result = scopeForType(parts, type);
|
|
63
|
+
const result = scopeForLine(line, metadata, parentIndex);
|
|
67
64
|
if (result) {
|
|
68
65
|
scope.add(result);
|
|
69
66
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"treeIndexScope.js","sourceRoot":"","sources":["../../src/utils/treeIndexScope.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AACZ,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,
|
|
1
|
+
{"version":3,"file":"treeIndexScope.js","sourceRoot":"","sources":["../../src/utils/treeIndexScope.ts"],"names":[],"mappings":"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"}
|
package/oclif.manifest.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sfdx-git-delta",
|
|
3
|
-
"version": "7.4.
|
|
3
|
+
"version": "7.4.2",
|
|
4
4
|
"description": "Generate the sfdx content in source format and destructive change from two git commits",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"salesforce",
|
|
@@ -49,16 +49,16 @@
|
|
|
49
49
|
},
|
|
50
50
|
"dependencies": {
|
|
51
51
|
"@oclif/core": "5.0.0",
|
|
52
|
-
"@salesforce/core": "9.
|
|
52
|
+
"@salesforce/core": "9.2.0",
|
|
53
53
|
"@salesforce/sf-plugins-core": "13.0.4",
|
|
54
|
-
"@salesforce/source-deploy-retrieve": "13.
|
|
54
|
+
"@salesforce/source-deploy-retrieve": "13.4.0",
|
|
55
55
|
"@scolladon/tsgit": "4.0.0",
|
|
56
56
|
"ignore": "7.0.9",
|
|
57
57
|
"txml": "6.0.3",
|
|
58
58
|
"zod": "4.6.5"
|
|
59
59
|
},
|
|
60
60
|
"devDependencies": {
|
|
61
|
-
"@biomejs/biome": "2.5.
|
|
61
|
+
"@biomejs/biome": "2.5.14",
|
|
62
62
|
"@commitlint/cli": "21.2.2",
|
|
63
63
|
"@commitlint/config-conventional": "21.2.2",
|
|
64
64
|
"@ls-lint/ls-lint": "2.3.1",
|
|
@@ -67,10 +67,10 @@
|
|
|
67
67
|
"@salesforce/dev-config": "4.3.3",
|
|
68
68
|
"@stryker-mutator/core": "10.0.0",
|
|
69
69
|
"@stryker-mutator/vitest-runner": "10.0.0",
|
|
70
|
-
"@types/node": "26.
|
|
71
|
-
"@vitest/coverage-v8": "5.0.
|
|
70
|
+
"@types/node": "26.6.1",
|
|
71
|
+
"@vitest/coverage-v8": "5.0.1",
|
|
72
72
|
"husky": "9.1.7",
|
|
73
|
-
"knip": "6.
|
|
73
|
+
"knip": "6.36.0",
|
|
74
74
|
"lint-staged": "17.5.1",
|
|
75
75
|
"ls-engines": "0.10.1",
|
|
76
76
|
"oclif": "6.0.0",
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
"shx": "0.4.0",
|
|
79
79
|
"typescript": "7.0.2",
|
|
80
80
|
"validate-branch-name": "1.3.2",
|
|
81
|
-
"vitest": "5.0.
|
|
81
|
+
"vitest": "5.0.1",
|
|
82
82
|
"wireit": "0.14.13"
|
|
83
83
|
},
|
|
84
84
|
"overrides": {
|