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 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
- ![Unique ID](https://raw.githubusercontent.com/mcarvin8/sf-decomposer/main/.github/images/decomposed-uid.png)
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
- ![Grouped By Tag](https://raw.githubusercontent.com/mcarvin8/sf-decomposer/main/.github/images/decomposed-tags.png)
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
- ![Decomposed Custom Labels](https://raw.githubusercontent.com/mcarvin8/sf-decomposer/main/.github/images/decomposed-labels.png)
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
- ![Decomposed Perm Set](https://raw.githubusercontent.com/mcarvin8/sf-decomposer/main/.github/images/additional-perm-set-decomposed.png)
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
- ![Decomposed Loyalty Program Setup](https://raw.githubusercontent.com/mcarvin8/sf-decomposer/main/.github/images/decomposed-loyalty-program.png)
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
 
@@ -342,5 +342,5 @@
342
342
  ]
343
343
  }
344
344
  },
345
- "version": "6.15.0"
345
+ "version": "6.15.1"
346
346
  }
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.0",
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.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": {