sfdx-git-delta 6.41.2 → 6.43.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 (140) hide show
  1. package/README.md +35 -2
  2. package/lib/adapter/GitAdapter.d.ts +51 -2
  3. package/lib/adapter/GitAdapter.js +367 -41
  4. package/lib/adapter/GitAdapter.js.map +1 -1
  5. package/lib/adapter/gitBatchCatFile.d.ts +26 -4
  6. package/lib/adapter/gitBatchCatFile.js +128 -44
  7. package/lib/adapter/gitBatchCatFile.js.map +1 -1
  8. package/lib/adapter/gitBlobReader.d.ts +58 -0
  9. package/lib/adapter/gitBlobReader.js +27 -0
  10. package/lib/adapter/gitBlobReader.js.map +1 -0
  11. package/lib/adapter/ioExecutor.d.ts +18 -6
  12. package/lib/adapter/ioExecutor.js +97 -12
  13. package/lib/adapter/ioExecutor.js.map +1 -1
  14. package/lib/commands/sgd/source/delta.d.ts +2 -0
  15. package/lib/commands/sgd/source/delta.js +31 -1
  16. package/lib/commands/sgd/source/delta.js.map +1 -1
  17. package/lib/constant/cliConstants.d.ts +2 -0
  18. package/lib/constant/cliConstants.js +4 -0
  19. package/lib/constant/cliConstants.js.map +1 -1
  20. package/lib/constant/gitConstants.d.ts +1 -0
  21. package/lib/constant/gitConstants.js +4 -0
  22. package/lib/constant/gitConstants.js.map +1 -1
  23. package/lib/main.js +35 -7
  24. package/lib/main.js.map +1 -1
  25. package/lib/metadata/MetadataRepositoryImpl.d.ts +1 -0
  26. package/lib/metadata/MetadataRepositoryImpl.js +14 -2
  27. package/lib/metadata/MetadataRepositoryImpl.js.map +1 -1
  28. package/lib/post-processor/changesManifestProcessor.d.ts +15 -0
  29. package/lib/post-processor/changesManifestProcessor.js +50 -0
  30. package/lib/post-processor/changesManifestProcessor.js.map +1 -0
  31. package/lib/post-processor/flowTranslationProcessor.d.ts +31 -14
  32. package/lib/post-processor/flowTranslationProcessor.js +146 -51
  33. package/lib/post-processor/flowTranslationProcessor.js.map +1 -1
  34. package/lib/post-processor/packageGenerator.d.ts +1 -2
  35. package/lib/post-processor/packageGenerator.js +23 -34
  36. package/lib/post-processor/packageGenerator.js.map +1 -1
  37. package/lib/post-processor/postProcessorManager.js +9 -6
  38. package/lib/post-processor/postProcessorManager.js.map +1 -1
  39. package/lib/service/botHandler.d.ts +2 -1
  40. package/lib/service/botHandler.js +4 -3
  41. package/lib/service/botHandler.js.map +1 -1
  42. package/lib/service/containedDecomposedHandler.d.ts +3 -2
  43. package/lib/service/containedDecomposedHandler.js +6 -6
  44. package/lib/service/containedDecomposedHandler.js.map +1 -1
  45. package/lib/service/customFieldHandler.d.ts +2 -1
  46. package/lib/service/customFieldHandler.js +2 -2
  47. package/lib/service/customFieldHandler.js.map +1 -1
  48. package/lib/service/customLabelHandler.d.ts +2 -1
  49. package/lib/service/customLabelHandler.js +3 -3
  50. package/lib/service/customLabelHandler.js.map +1 -1
  51. package/lib/service/customObjectHandler.d.ts +2 -1
  52. package/lib/service/customObjectHandler.js +2 -2
  53. package/lib/service/customObjectHandler.js.map +1 -1
  54. package/lib/service/decomposedHandler.d.ts +2 -1
  55. package/lib/service/decomposedHandler.js +2 -2
  56. package/lib/service/decomposedHandler.js.map +1 -1
  57. package/lib/service/diffLineInterpreter.d.ts +1 -1
  58. package/lib/service/diffLineInterpreter.js +16 -6
  59. package/lib/service/diffLineInterpreter.js.map +1 -1
  60. package/lib/service/flowHandler.d.ts +2 -1
  61. package/lib/service/flowHandler.js +2 -2
  62. package/lib/service/flowHandler.js.map +1 -1
  63. package/lib/service/inFileHandler.d.ts +8 -7
  64. package/lib/service/inFileHandler.js +37 -30
  65. package/lib/service/inFileHandler.js.map +1 -1
  66. package/lib/service/inFolderHandler.d.ts +2 -1
  67. package/lib/service/inFolderHandler.js +2 -2
  68. package/lib/service/inFolderHandler.js.map +1 -1
  69. package/lib/service/inResourceHandler.d.ts +3 -2
  70. package/lib/service/inResourceHandler.js +5 -5
  71. package/lib/service/inResourceHandler.js.map +1 -1
  72. package/lib/service/objectTranslationHandler.d.ts +3 -3
  73. package/lib/service/objectTranslationHandler.js +15 -8
  74. package/lib/service/objectTranslationHandler.js.map +1 -1
  75. package/lib/service/reportingFolderHandler.d.ts +8 -4
  76. package/lib/service/reportingFolderHandler.js +5 -6
  77. package/lib/service/reportingFolderHandler.js.map +1 -1
  78. package/lib/service/sharedFolderHandler.d.ts +8 -4
  79. package/lib/service/sharedFolderHandler.js +5 -6
  80. package/lib/service/sharedFolderHandler.js.map +1 -1
  81. package/lib/service/standardHandler.d.ts +14 -7
  82. package/lib/service/standardHandler.js +47 -27
  83. package/lib/service/standardHandler.js.map +1 -1
  84. package/lib/service/typeHandlerFactory.d.ts +2 -0
  85. package/lib/service/typeHandlerFactory.js +15 -0
  86. package/lib/service/typeHandlerFactory.js.map +1 -1
  87. package/lib/types/config.d.ts +1 -0
  88. package/lib/types/handlerResult.d.ts +17 -8
  89. package/lib/types/handlerResult.js +9 -11
  90. package/lib/types/handlerResult.js.map +1 -1
  91. package/lib/types/work.d.ts +2 -5
  92. package/lib/utils/LoggingDecorator.js +22 -11
  93. package/lib/utils/LoggingDecorator.js.map +1 -1
  94. package/lib/utils/changeSet.d.ts +53 -0
  95. package/lib/utils/changeSet.js +257 -0
  96. package/lib/utils/changeSet.js.map +1 -0
  97. package/lib/utils/configValidator.d.ts +1 -0
  98. package/lib/utils/configValidator.js +39 -1
  99. package/lib/utils/configValidator.js.map +1 -1
  100. package/lib/utils/gitLfsHelper.js +9 -1
  101. package/lib/utils/gitLfsHelper.js.map +1 -1
  102. package/lib/utils/metadataDiff/index.d.ts +28 -0
  103. package/lib/utils/metadataDiff/index.js +57 -0
  104. package/lib/utils/metadataDiff/index.js.map +1 -0
  105. package/lib/utils/metadataDiff/streamingDiff.d.ts +68 -0
  106. package/lib/utils/metadataDiff/streamingDiff.js +300 -0
  107. package/lib/utils/metadataDiff/streamingDiff.js.map +1 -0
  108. package/lib/utils/metadataDiff/xmlEventReader.d.ts +28 -0
  109. package/lib/utils/metadataDiff/xmlEventReader.js +221 -0
  110. package/lib/utils/metadataDiff/xmlEventReader.js.map +1 -0
  111. package/lib/utils/metadataDiff/xmlWriter.d.ts +17 -0
  112. package/lib/utils/metadataDiff/xmlWriter.js +213 -0
  113. package/lib/utils/metadataDiff/xmlWriter.js.map +1 -0
  114. package/lib/utils/packageHelper.d.ts +8 -1
  115. package/lib/utils/packageHelper.js +25 -28
  116. package/lib/utils/packageHelper.js.map +1 -1
  117. package/lib/utils/renameResolver.d.ts +19 -0
  118. package/lib/utils/renameResolver.js +52 -0
  119. package/lib/utils/renameResolver.js.map +1 -0
  120. package/lib/utils/repoGitDiff.d.ts +18 -5
  121. package/lib/utils/repoGitDiff.js +66 -33
  122. package/lib/utils/repoGitDiff.js.map +1 -1
  123. package/lib/utils/treeIndexScope.d.ts +1 -1
  124. package/lib/utils/treeIndexScope.js.map +1 -1
  125. package/lib/utils/txmlAdapter.d.ts +30 -0
  126. package/lib/utils/txmlAdapter.js +121 -0
  127. package/lib/utils/txmlAdapter.js.map +1 -0
  128. package/lib/utils/xmlHelper.d.ts +0 -5
  129. package/lib/utils/xmlHelper.js +0 -57
  130. package/lib/utils/xmlHelper.js.map +1 -1
  131. package/messages/delta.md +12 -0
  132. package/npm-shrinkwrap.json +628 -486
  133. package/oclif.manifest.json +9 -1
  134. package/package.json +53 -21
  135. package/lib/utils/manifestAggregator.d.ts +0 -3
  136. package/lib/utils/manifestAggregator.js +0 -22
  137. package/lib/utils/manifestAggregator.js.map +0 -1
  138. package/lib/utils/metadataDiff.d.ts +0 -23
  139. package/lib/utils/metadataDiff.js +0 -242
  140. package/lib/utils/metadataDiff.js.map +0 -1
@@ -146,6 +146,14 @@
146
146
  "multiple": false,
147
147
  "type": "option"
148
148
  },
149
+ "changes-manifest": {
150
+ "char": "c",
151
+ "name": "changes-manifest",
152
+ "summary": "path to a JSON file grouping changed components by kind (add, modify, delete, rename); setting this flag also enables git rename detection",
153
+ "hasDynamicHelp": false,
154
+ "multiple": false,
155
+ "type": "option"
156
+ },
149
157
  "ignore-whitespace": {
150
158
  "char": "W",
151
159
  "name": "ignore-whitespace",
@@ -191,5 +199,5 @@
191
199
  ]
192
200
  }
193
201
  },
194
- "version": "6.41.2"
202
+ "version": "6.43.0"
195
203
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sfdx-git-delta",
3
- "version": "6.41.2",
3
+ "version": "6.43.0",
4
4
  "description": "Generate the sfdx content in source format and destructive change from two git commits",
5
5
  "keywords": [
6
6
  "salesforce",
@@ -48,50 +48,51 @@
48
48
  "access": "public"
49
49
  },
50
50
  "dependencies": {
51
- "@nodable/flexible-xml-parser": "^1.1.1",
52
- "@oclif/core": "^4.10.5",
53
- "@salesforce/core": "^8.28.3",
51
+ "@oclif/core": "^4.10.6",
52
+ "@salesforce/core": "^8.28.4",
54
53
  "@salesforce/sf-plugins-core": "^12.2.6",
55
- "@salesforce/source-deploy-retrieve": "^12.32.8",
54
+ "@salesforce/source-deploy-retrieve": "^12.34.5",
56
55
  "async": "^3.2.6",
57
56
  "fast-equals": "^6.0.0",
58
- "fast-xml-builder": "^1.1.5",
59
57
  "fs-extra": "^11.3.4",
60
58
  "ignore": "^7.0.5",
61
- "lodash-es": "^4.18.1",
62
59
  "simple-git": "^3.36.0",
60
+ "tar-stream": "3.1.8",
63
61
  "tslib": "^2.8.1",
62
+ "txml": "^5.2.1",
64
63
  "zod": "^4.3.6"
65
64
  },
66
65
  "overrides": {
67
- "basic-ftp": "^5.3.0"
66
+ "basic-ftp": "^5.3.0",
67
+ "@nodable/base-output-builder": "1.0.5",
68
+ "@nodable/compact-builder": "1.0.6",
69
+ "path-expression-matcher": "1.5.0",
70
+ "strnum": "2.2.3"
68
71
  },
69
72
  "devDependencies": {
70
- "@biomejs/biome": "2.4.11",
71
- "@commitlint/cli": "^20.5.0",
73
+ "@biomejs/biome": "2.4.13",
74
+ "@commitlint/cli": "^20.5.2",
72
75
  "@commitlint/config-conventional": "^20.5.0",
73
76
  "@ls-lint/ls-lint": "^2.3.1",
74
- "@oclif/plugin-help": "^6.2.44",
75
- "@salesforce/cli-plugins-testkit": "^5.3.52",
77
+ "@oclif/plugin-help": "^6.2.45",
78
+ "@salesforce/cli-plugins-testkit": "^5.3.54",
76
79
  "@salesforce/dev-config": "^4.3.3",
77
80
  "@stryker-mutator/core": "^9.6.1",
78
81
  "@stryker-mutator/vitest-runner": "^9.6.1",
79
82
  "@types/async": "^3.2.25",
80
83
  "@types/fs-extra": "^11.0.4",
81
- "@types/lodash": "^4.17.24",
82
- "@types/lodash-es": "^4.17.12",
83
84
  "@types/node": "^25.6.0",
84
- "@vitest/coverage-v8": "^4.1.4",
85
+ "@types/tar-stream": "^3.1.4",
86
+ "@vitest/coverage-v8": "^4.1.5",
85
87
  "husky": "^9.1.7",
86
- "knip": "^6.4.0",
88
+ "knip": "^6.7.0",
87
89
  "lint-staged": "^16.4.0",
88
- "lodash": "^4.18.1",
89
90
  "oclif": "^4.23.0",
90
91
  "shx": "^0.4.0",
91
92
  "ts-node": "^10.9.2",
92
- "typescript": "^6.0.2",
93
+ "typescript": "^6.0.3",
93
94
  "validate-branch-name": "^1.3.2",
94
- "vitest": "^4.1.4",
95
+ "vitest": "^4.1.5",
95
96
  "wireit": "^0.14.12"
96
97
  },
97
98
  "scripts": {
@@ -114,6 +115,8 @@
114
115
  "prepublishOnly": "npm shrinkwrap",
115
116
  "sync:registry": "TS_NODE_COMPILER_OPTIONS='{\"rootDir\":\".\"}' node --loader ts-node/esm tooling/syncInternalRegistryWithSdr.ts",
116
117
  "test:build": "wireit",
118
+ "test:functional": "wireit",
119
+ "test:integration": "wireit",
117
120
  "test:mutation": "wireit",
118
121
  "test:mutation:incremental": "wireit",
119
122
  "test:nut": "wireit",
@@ -246,7 +249,36 @@
246
249
  "test": {
247
250
  "dependencies": [
248
251
  "test:unit",
249
- "test:nut"
252
+ "test:integration",
253
+ "test:nut",
254
+ "test:functional"
255
+ ]
256
+ },
257
+ "test:functional": {
258
+ "command": "vitest run --config vitest.functional.config.ts",
259
+ "files": [
260
+ "src/**/*.ts",
261
+ "__tests__/functional/**/*.test.ts",
262
+ "__tests__/functional/byteEquality/fixtures/**",
263
+ "**/tsconfig.json",
264
+ "vitest.functional.config.ts"
265
+ ],
266
+ "output": [],
267
+ "dependencies": [
268
+ "lint"
269
+ ]
270
+ },
271
+ "test:integration": {
272
+ "command": "vitest run --config vitest.integration.config.ts",
273
+ "files": [
274
+ "src/**/*.ts",
275
+ "__tests__/integration/**/*.test.ts",
276
+ "**/tsconfig.json",
277
+ "vitest.integration.config.ts"
278
+ ],
279
+ "output": [],
280
+ "dependencies": [
281
+ "lint"
250
282
  ]
251
283
  },
252
284
  "test:build": {
@@ -307,7 +339,7 @@
307
339
  "command": "oclif manifest && vitest run --config vitest.nut.config.ts",
308
340
  "files": [
309
341
  "src/**/*.ts",
310
- "__tests__/**/*.nut.ts",
342
+ "__tests__/nut/**/*.nut.ts",
311
343
  "messages/**",
312
344
  "**/tsconfig.json",
313
345
  "vitest.nut.config.ts"
@@ -1,3 +0,0 @@
1
- import type { HandlerResult } from '../types/handlerResult.js';
2
- import type { Manifests } from '../types/work.js';
3
- export declare const aggregateManifests: (result: HandlerResult) => Manifests;
@@ -1,22 +0,0 @@
1
- 'use strict';
2
- import { ManifestTarget } from '../types/handlerResult.js';
3
- const addToManifest = (store, type, member) => {
4
- if (!store.has(type)) {
5
- store.set(type, new Set());
6
- }
7
- store.get(type).add(member);
8
- };
9
- export const aggregateManifests = (result) => {
10
- const manifests = {
11
- package: new Map(),
12
- destructiveChanges: new Map(),
13
- };
14
- for (const element of result.manifests) {
15
- const store = element.target === ManifestTarget.Package
16
- ? manifests.package
17
- : manifests.destructiveChanges;
18
- addToManifest(store, element.type, element.member);
19
- }
20
- return manifests;
21
- };
22
- //# sourceMappingURL=manifestAggregator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"manifestAggregator.js","sourceRoot":"","sources":["../../src/utils/manifestAggregator.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAG1D,MAAM,aAAa,GAAG,CAAC,KAAe,EAAE,IAAY,EAAE,MAAc,EAAE,EAAE;IACtE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,CAAA;IAC5B,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;AAC9B,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAAqB,EAAa,EAAE;IACrE,MAAM,SAAS,GAAc;QAC3B,OAAO,EAAE,IAAI,GAAG,EAAE;QAClB,kBAAkB,EAAE,IAAI,GAAG,EAAE;KAC9B,CAAA;IAED,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACvC,MAAM,KAAK,GACT,OAAO,CAAC,MAAM,KAAK,cAAc,CAAC,OAAO;YACvC,CAAC,CAAC,SAAS,CAAC,OAAO;YACnB,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAA;QAElC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IACpD,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA"}
@@ -1,23 +0,0 @@
1
- import type { Config } from '../types/config.js';
2
- import type { ManifestElement } from '../types/handlerResult.js';
3
- import type { SharedFileMetadata } from '../types/metadata.js';
4
- import { type XmlContent } from './xmlHelper.js';
5
- type CompareEntry = Pick<ManifestElement, 'type' | 'member'>;
6
- interface CompareResult {
7
- added: CompareEntry[];
8
- deleted: CompareEntry[];
9
- toContent: XmlContent;
10
- fromContent: XmlContent;
11
- }
12
- export interface PrunedContent {
13
- xmlContent: string;
14
- isEmpty: boolean;
15
- }
16
- export default class MetadataDiff {
17
- private config;
18
- private extractor;
19
- constructor(config: Config, attributes: Map<string, SharedFileMetadata>);
20
- compare(path: string): Promise<CompareResult>;
21
- prune(toContent: XmlContent, fromContent: XmlContent): PrunedContent;
22
- }
23
- export {};
@@ -1,242 +0,0 @@
1
- 'use strict';
2
- import { __decorate } from "tslib";
3
- import { deepEqual } from 'fast-equals';
4
- import { isUndefined } from 'lodash-es';
5
- import { log } from './LoggingDecorator.js';
6
- import { ATTRIBUTE_PREFIX, convertJsonToXml, parseXmlFileToJson, XML_HEADER_ATTRIBUTE_KEY, } from './xmlHelper.js';
7
- /**
8
- * Special key markers for metadata comparison strategies.
9
- * These are used in the internalRegistry to define how metadata elements
10
- * should be compared when they lack a natural unique key field.
11
- *
12
- * ARRAY_SPECIAL_KEY ('<array>'): Compare arrays as a whole.
13
- * If arrays differ at all, include the entire 'to' array in the output.
14
- * Used for metadata where order matters or elements can't be individually identified.
15
- * Example: loginHours, loginIpRanges in Profile metadata.
16
- *
17
- * OBJECT_SPECIAL_KEY ('<object>'): Compare objects by their serialized form.
18
- * Uses JSON.stringify to create a key for each element, then includes
19
- * only elements from 'to' that don't exist in 'from'.
20
- * Used for metadata where each element is unique but has no key field.
21
- * Example: layoutAssignments in Profile metadata.
22
- *
23
- * When neither marker is used and no key field is defined, the comparison
24
- * falls back to deep equality of the entire array, returning 'to' if different.
25
- */
26
- const ARRAY_SPECIAL_KEY = '<array>';
27
- const OBJECT_SPECIAL_KEY = '<object>';
28
- const isEmpty = (arr) => arr.length === 0;
29
- export default class MetadataDiff {
30
- config;
31
- extractor;
32
- constructor(config, attributes) {
33
- this.config = config;
34
- this.extractor = new MetadataExtractor(attributes);
35
- }
36
- async compare(path) {
37
- const toContent = await parseXmlFileToJson({ path, oid: this.config.to }, this.config);
38
- const fromContent = await parseXmlFileToJson({ path, oid: this.config.from }, this.config);
39
- const comparator = new MetadataComparator(this.extractor, fromContent, toContent);
40
- const added = comparator.getChanges();
41
- const deleted = comparator.getDeletion();
42
- return { added, deleted, toContent, fromContent };
43
- }
44
- prune(toContent, fromContent) {
45
- const transformer = new JsonTransformer(this.extractor);
46
- const { prunedContent, isEmpty } = transformer.generatePartialJson(fromContent, toContent);
47
- return {
48
- xmlContent: convertJsonToXml(prunedContent),
49
- isEmpty,
50
- };
51
- }
52
- }
53
- __decorate([
54
- log
55
- ], MetadataDiff.prototype, "compare", null);
56
- __decorate([
57
- log
58
- ], MetadataDiff.prototype, "prune", null);
59
- class MetadataExtractor {
60
- attributes;
61
- keySelectorCache = new Map();
62
- constructor(attributes) {
63
- this.attributes = attributes;
64
- }
65
- getSubTypes(root) {
66
- return Object.keys(root).filter(tag => this.attributes.has(tag));
67
- }
68
- getSubKeys(root) {
69
- return Object.keys(root);
70
- }
71
- isTypePackageable(subType) {
72
- return !this.attributes.get(subType)?.excluded;
73
- }
74
- getXmlName(subType) {
75
- /* v8 ignore next -- callers pass subTypes present in attributes map */
76
- return this.attributes.get(subType)?.xmlName ?? '';
77
- }
78
- getKeyValueSelector(subType) {
79
- if (!this.keySelectorCache.has(subType)) {
80
- const metadataKey = this.getKeyFieldDefinition(subType);
81
- this.keySelectorCache.set(subType, elem => elem[metadataKey]);
82
- }
83
- return this.keySelectorCache.get(subType);
84
- }
85
- getKeyFieldDefinition(subType) {
86
- return this.attributes.get(subType)?.key;
87
- }
88
- extractForSubType(root, subType) {
89
- const content = root[subType];
90
- return Array.isArray(content) ? content : content ? [content] : [];
91
- }
92
- extractRootElement(fileContent) {
93
- const rootKey = this.extractRootKey(fileContent);
94
- return fileContent[rootKey] ?? {};
95
- }
96
- extractRootKey(fileContent) {
97
- return (Object.keys(fileContent).find(key => key !== XML_HEADER_ATTRIBUTE_KEY) ??
98
- '');
99
- }
100
- }
101
- class MetadataComparator {
102
- extractor;
103
- fromContent;
104
- toContent;
105
- constructor(extractor, fromContent, toContent) {
106
- this.extractor = extractor;
107
- this.fromContent = fromContent;
108
- this.toContent = toContent;
109
- }
110
- getChanges() {
111
- return this.compare(this.toContent, this.fromContent, this.matchAdded);
112
- }
113
- getDeletion() {
114
- return this.compare(this.fromContent, this.toContent, this.matchDeleted);
115
- }
116
- compare(baseContent, targetContent, elementMatcher) {
117
- const base = this.extractor.extractRootElement(baseContent);
118
- const target = this.extractor.extractRootElement(targetContent);
119
- const entries = [];
120
- const subTypes = this.extractor.getSubTypes(base);
121
- for (const subType of subTypes) {
122
- if (!this.extractor.isTypePackageable(subType))
123
- continue;
124
- const baseMeta = this.extractor.extractForSubType(base, subType);
125
- if (isEmpty(baseMeta))
126
- continue;
127
- const targetMeta = this.extractor.extractForSubType(target, subType);
128
- const keySelector = this.extractor.getKeyValueSelector(subType);
129
- const xmlName = this.extractor.getXmlName(subType);
130
- // Pre-compute lookup map: O(n) instead of O(n) per element
131
- const targetLookup = new Map();
132
- for (const el of targetMeta) {
133
- const key = keySelector(el);
134
- if (key !== undefined) {
135
- targetLookup.set(key, el);
136
- }
137
- }
138
- for (const elem of baseMeta) {
139
- if (elementMatcher(targetLookup, keySelector, elem)) {
140
- entries.push({ type: xmlName, member: keySelector(elem) });
141
- }
142
- }
143
- }
144
- return entries;
145
- }
146
- // O(1) lookup instead of O(n) find()
147
- matchAdded = (targetLookup, keySelector, elem) => {
148
- const elemKey = keySelector(elem);
149
- if (elemKey === undefined)
150
- return true;
151
- const match = targetLookup.get(elemKey);
152
- return !match || !deepEqual(match, elem);
153
- };
154
- // O(1) lookup instead of O(n) some()
155
- matchDeleted = (targetLookup, keySelector, elem) => {
156
- const elemKey = keySelector(elem);
157
- if (elemKey === undefined)
158
- return true;
159
- return !targetLookup.has(elemKey);
160
- };
161
- }
162
- class JsonTransformer {
163
- extractor;
164
- constructor(extractor) {
165
- this.extractor = extractor;
166
- }
167
- generatePartialJson(fromContent, toContent) {
168
- const from = this.extractor.extractRootElement(fromContent);
169
- const to = this.extractor.extractRootElement(toContent);
170
- const base = {};
171
- if (XML_HEADER_ATTRIBUTE_KEY in toContent) {
172
- base[XML_HEADER_ATTRIBUTE_KEY] = toContent[XML_HEADER_ATTRIBUTE_KEY];
173
- }
174
- const rootKey = this.extractor.extractRootKey(toContent);
175
- const root = {};
176
- base[rootKey] = root;
177
- const subKeys = this.extractor.getSubKeys(to);
178
- let hasAnyChanges = false;
179
- for (const key of subKeys) {
180
- if (key.startsWith(ATTRIBUTE_PREFIX)) {
181
- root[key] = to[key];
182
- continue;
183
- }
184
- const fromMeta = this.extractor.extractForSubType(from, key);
185
- const toMeta = this.extractor.extractForSubType(to, key);
186
- const keyField = this.extractor.getKeyFieldDefinition(key);
187
- const { content, hasChanges } = this.getPartialContent(fromMeta, toMeta, keyField);
188
- if (hasChanges) {
189
- hasAnyChanges = true;
190
- }
191
- if (!isEmpty(content)) {
192
- root[key] = content;
193
- }
194
- }
195
- return { prunedContent: base, isEmpty: !hasAnyChanges };
196
- }
197
- getPartialContent(fromMeta, toMeta, keyField) {
198
- // Early return for empty arrays
199
- if (isEmpty(toMeta)) {
200
- return { content: [], hasChanges: false };
201
- }
202
- if (isEmpty(fromMeta)) {
203
- return { content: toMeta, hasChanges: true };
204
- }
205
- if (isUndefined(keyField)) {
206
- return this.getPartialContentWithoutKey(fromMeta, toMeta);
207
- }
208
- if (keyField === ARRAY_SPECIAL_KEY) {
209
- return this.getPartialContentForArray(fromMeta, toMeta);
210
- }
211
- if (keyField === OBJECT_SPECIAL_KEY) {
212
- return this.getPartialContentForObject(fromMeta, toMeta);
213
- }
214
- return this.getPartialContentWithKey(fromMeta, toMeta, keyField);
215
- }
216
- getPartialContentWithoutKey(fromMeta, toMeta) {
217
- const hasChanges = !deepEqual(fromMeta, toMeta);
218
- return { content: toMeta, hasChanges };
219
- }
220
- getPartialContentForArray(fromMeta, toMeta) {
221
- const hasChanges = !deepEqual(fromMeta, toMeta);
222
- const content = hasChanges ? toMeta : [];
223
- return { content, hasChanges };
224
- }
225
- getPartialContentForObject(fromMeta, toMeta) {
226
- const keySelector = (item) => JSON.stringify(item);
227
- const fromSet = new Set(fromMeta.map(keySelector));
228
- const content = toMeta.filter(item => !fromSet.has(keySelector(item)));
229
- return { content, hasChanges: !isEmpty(content) };
230
- }
231
- getPartialContentWithKey(fromMeta, toMeta, keyField) {
232
- const keySelector = (item) => item[keyField];
233
- const fromMap = new Map(fromMeta.map(item => [keySelector(item), item]));
234
- const content = toMeta.filter(item => {
235
- const key = keySelector(item);
236
- const fromItem = fromMap.get(key);
237
- return isUndefined(fromItem) || !deepEqual(item, fromItem);
238
- });
239
- return { content, hasChanges: !isEmpty(content) };
240
- }
241
- }
242
- //# sourceMappingURL=metadataDiff.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"metadataDiff.js","sourceRoot":"","sources":["../../src/utils/metadataDiff.ts"],"names":[],"mappings":"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"}