sf-decomposer 6.15.0 → 6.15.1
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/CHANGELOG.md +7 -0
- package/README.md +87 -5
- package/oclif.manifest.json +1 -1
- package/package.json +4 -2
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,13 @@
|
|
|
5
5
|
|
|
6
6
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
7
7
|
|
|
8
|
+
## [6.15.1](https://github.com/mcarvin8/sf-decomposer/compare/v6.15.0...v6.15.1) (2026-05-01)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* **deps:** bump config-disassembler to 1.1.2 and harden perf suite ([#423](https://github.com/mcarvin8/sf-decomposer/issues/423)) ([a4aefe6](https://github.com/mcarvin8/sf-decomposer/commit/a4aefe64a3a2458d3cabfd23835c27045ac85941))
|
|
14
|
+
|
|
8
15
|
## [6.15.0](https://github.com/mcarvin8/sf-decomposer/compare/v6.14.0...v6.15.0) (2026-04-30)
|
|
9
16
|
|
|
10
17
|
|
package/README.md
CHANGED
|
@@ -59,6 +59,8 @@ A Salesforce CLI plugin that **decomposes** large metadata XML files into smalle
|
|
|
59
59
|
sf decomposer decompose -m "flow" -m "labels" --postpurge
|
|
60
60
|
```
|
|
61
61
|
|
|
62
|
+
> Combine steps 2 & 3 by configuring the [hooks](#hooks).
|
|
63
|
+
|
|
62
64
|
4. **Add decomposed paths to [.forceignore](#forceignore)**
|
|
63
65
|
This is **required** so the Salesforce CLI does not treat decomposed files as source. Use the [sample .forceignore](https://raw.githubusercontent.com/mcarvin8/sf-decomposer/main/examples/.forceignore) and adjust extensions for your chosen format (`.xml`, `.json`, `.yaml`, etc.).
|
|
64
66
|
|
|
@@ -78,6 +80,8 @@ A Salesforce CLI plugin that **decomposes** large metadata XML files into smalle
|
|
|
78
80
|
sf project deploy start -x "manifest/package.xml"
|
|
79
81
|
```
|
|
80
82
|
|
|
83
|
+
Or run the deploy command directly after configuring the [hooks](#hooks) to run the recompose automatically before deploying.
|
|
84
|
+
|
|
81
85
|
---
|
|
82
86
|
|
|
83
87
|
## Requirements
|
|
@@ -283,17 +287,57 @@ sf project deploy start -x "manifest/package.xml"
|
|
|
283
287
|
|
|
284
288
|
**Permission set – unique-id**
|
|
285
289
|
|
|
286
|
-
|
|
290
|
+
```
|
|
291
|
+
permissionsets/
|
|
292
|
+
└── HR_Admin/
|
|
293
|
+
├── HR_Admin.permissionset-meta.xml ← leaf properties (label, description, userLicense, ...)
|
|
294
|
+
├── .key_order.json ← preserves original element order
|
|
295
|
+
├── applicationVisibilities/
|
|
296
|
+
│ └── JobApps__Recruiting.applicationVisibilities-meta.xml
|
|
297
|
+
├── classAccesses/
|
|
298
|
+
│ └── Send_Email_Confirmation.classAccesses-meta.xml
|
|
299
|
+
├── fieldPermissions/
|
|
300
|
+
│ ├── Job_Request__c.SalaryPay__c.fieldPermissions-meta.xml
|
|
301
|
+
│ └── Job_Request__c.Salary__c.fieldPermissions-meta.xml
|
|
302
|
+
├── objectPermissions/
|
|
303
|
+
│ └── Job_Request__c.objectPermissions-meta.xml
|
|
304
|
+
├── pageAccesses/
|
|
305
|
+
│ └── Job_Request_Web_Form.pageAccesses-meta.xml
|
|
306
|
+
├── recordTypeVisibilities/
|
|
307
|
+
│ └── Recruiting.DevManager.recordTypeVisibilities-meta.xml
|
|
308
|
+
├── tabSettings/
|
|
309
|
+
│ └── Job_Request__c.tabSettings-meta.xml
|
|
310
|
+
└── userPermissions/
|
|
311
|
+
└── APIEnabled.userPermissions-meta.xml
|
|
312
|
+
```
|
|
287
313
|
|
|
288
314
|
**Permission set – grouped-by-tag**
|
|
289
315
|
|
|
290
|
-
|
|
316
|
+
```
|
|
317
|
+
permissionsets/
|
|
318
|
+
└── HR_Admin/
|
|
319
|
+
├── HR_Admin.permissionset-meta.xml ← leaf properties only
|
|
320
|
+
├── .key_order.json
|
|
321
|
+
├── applicationVisibilities.xml ← all applicationVisibilities entries
|
|
322
|
+
├── classAccesses.xml ← all classAccesses entries
|
|
323
|
+
├── fieldPermissions.xml ← all fieldPermissions entries
|
|
324
|
+
├── objectPermissions.xml
|
|
325
|
+
├── pageAccesses.xml
|
|
326
|
+
├── recordTypeVisibilities.xml
|
|
327
|
+
├── tabSettings.xml
|
|
328
|
+
└── userPermissions.xml
|
|
329
|
+
```
|
|
291
330
|
|
|
292
331
|
### Custom Labels Decomposition
|
|
293
332
|
|
|
294
333
|
Custom labels use only the **unique-id** strategy. If you pass `grouped-by-tag`, the plugin overrides to `unique-id` and continues. Grouping labels by tag would produce no difference from the original file since all elements share the same tag. Each label is written to its own file.
|
|
295
334
|
|
|
296
|
-
|
|
335
|
+
```
|
|
336
|
+
labels/
|
|
337
|
+
├── CustomLabels.labels-meta.xml ← original wrapper kept (empty after decompose)
|
|
338
|
+
├── quoteAuto.label-meta.xml ← one file per <labels> entry, named by fullName
|
|
339
|
+
└── quoteManual.label-meta.xml
|
|
340
|
+
```
|
|
297
341
|
|
|
298
342
|
### Additional Permission Set Decomposition
|
|
299
343
|
|
|
@@ -309,7 +353,22 @@ sf decomposer decompose -m "permissionset" -s "grouped-by-tag" -p
|
|
|
309
353
|
sf decomposer decompose -m "mutingpermissionset" -s "grouped-by-tag" -p
|
|
310
354
|
```
|
|
311
355
|
|
|
312
|
-
|
|
356
|
+
```
|
|
357
|
+
permissionsets/
|
|
358
|
+
└── HR_Admin/
|
|
359
|
+
├── HR_Admin.permissionset-meta.xml ← leaf properties
|
|
360
|
+
├── .key_order.json
|
|
361
|
+
├── applicationVisibilities.xml ← grouped-by-tag stays grouped
|
|
362
|
+
├── classAccesses.xml
|
|
363
|
+
├── pageAccesses.xml
|
|
364
|
+
├── recordTypeVisibilities.xml
|
|
365
|
+
├── tabSettings.xml
|
|
366
|
+
├── userPermissions.xml
|
|
367
|
+
├── fieldPermissions/ ← grouped per object (decompose-nested-permissions)
|
|
368
|
+
│ └── Job_Request__c.fieldPermissions-meta.xml
|
|
369
|
+
└── objectPermissions/ ← one file per object
|
|
370
|
+
└── Job_Request__c.objectPermissions-meta.xml
|
|
371
|
+
```
|
|
313
372
|
|
|
314
373
|
### Loyalty Program Setup Decomposition
|
|
315
374
|
|
|
@@ -320,7 +379,30 @@ sf decomposer decompose -m "mutingpermissionset" -s "grouped-by-tag" -p
|
|
|
320
379
|
|
|
321
380
|
> Recomposition for loyalty program setup removes decomposed files even without `--postpurge`. Use version control or CI to keep them if needed.
|
|
322
381
|
|
|
323
|
-
|
|
382
|
+
```
|
|
383
|
+
loyaltyProgramSetups/
|
|
384
|
+
└── Cloud_Kicks_Inner_Circle/
|
|
385
|
+
├── Cloud_Kicks_Inner_Circle.loyaltyProgramSetup-meta.xml ← leaf properties (e.g. label)
|
|
386
|
+
├── .key_order.json
|
|
387
|
+
├── .multi_level.json ← required for recompose; do not hand-edit
|
|
388
|
+
└── programProcesses/ ← one folder per process, named by processName
|
|
389
|
+
├── Manual Points Adjustments/
|
|
390
|
+
│ ├── Manual Points Adjustments.xml ← process leaf properties
|
|
391
|
+
│ ├── .key_order.json
|
|
392
|
+
│ ├── parameters/ ← one file per parameter, named by parameterName
|
|
393
|
+
│ │ ├── EA_PerAdjustmentRewardTracking.parameters-meta.xml
|
|
394
|
+
│ │ ├── EventType.parameters-meta.xml
|
|
395
|
+
│ │ └── ...
|
|
396
|
+
│ └── rules/ ← one file per rule, named by ruleName
|
|
397
|
+
│ ├── Bulk Voucher Upload.rules-meta.xml
|
|
398
|
+
│ ├── Finalize.rules-meta.xml
|
|
399
|
+
│ └── Set Up Step.rules-meta.xml
|
|
400
|
+
├── Member Enrollment Process/
|
|
401
|
+
│ └── ... ← same shape per process
|
|
402
|
+
└── ...
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
> **Tip:** This three-level layout (`programProcesses` → `parameters`/`rules`) is exactly the multi-level decomposition pattern. The same pattern powers Bots, Flexipages, and Layouts via opt-in `multiLevel` overrides — see the [admin handbook](https://github.com/mcarvin8/sf-decomposer/blob/main/HANDBOOK.md) for those recipes.
|
|
324
406
|
|
|
325
407
|
---
|
|
326
408
|
|
package/oclif.manifest.json
CHANGED
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sf-decomposer",
|
|
3
3
|
"description": "Split large Salesforce metadata files into version-control-friendly pieces and rebuild deployment-ready files.",
|
|
4
|
-
"version": "6.15.
|
|
4
|
+
"version": "6.15.1",
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"@oclif/core": "^4",
|
|
7
7
|
"@salesforce/core": "^8.26.3",
|
|
8
8
|
"@salesforce/sf-plugins-core": "^12.2.6",
|
|
9
9
|
"@salesforce/source-deploy-retrieve": "^12.35.0",
|
|
10
|
-
"config-disassembler": "^1.1.
|
|
10
|
+
"config-disassembler": "^1.1.2",
|
|
11
11
|
"fast-xml-parser": "^5.7.2",
|
|
12
12
|
"p-limit": "^7.3.0"
|
|
13
13
|
},
|
|
@@ -93,6 +93,8 @@
|
|
|
93
93
|
"test": "wireit",
|
|
94
94
|
"test:nuts": "oclif manifest && vitest run --config ./vitest.nut.config.ts",
|
|
95
95
|
"test:only": "wireit",
|
|
96
|
+
"test:perf": "vitest run --config ./vitest.perf.config.ts",
|
|
97
|
+
"test:perf:gen": "node --import ts-node/esm scripts/gen-perf-fixtures.ts",
|
|
96
98
|
"version": "oclif readme"
|
|
97
99
|
},
|
|
98
100
|
"publishConfig": {
|