JamieMason / syncpack

Consistent dependency versions in large JavaScript Monorepos.
https://jamiemason.github.io/syncpack/
MIT License
1.34k stars 44 forks source link

fix(versions): Empty Objects are removed when format or fix-mismatches invoked. #223

Open denis-fwd opened 1 month ago

denis-fwd commented 1 month ago

Description

Greetings! I am syncpack newest fan. Thank you for your effort. I am coming to you as I have an issue that, after reviewing, the source appears to not be a user error.

My issue is this - I would like to have a property in package.json which is empty. This is due to nx and the use of root-level tasks: https://nx.dev/recipes/running-tasks/root-level-scripts#setup. However, anytime I run fix-mismatches the empty object tied to nx property disappears.

Related: https://github.com/JamieMason/syncpack/issues/117

Steps to reproduce:

  1. Create a root nx property inpackage.json
  2. Run syncpack fix-mismatches
  3. Observe the removal of the property and its object.

Suggested Solution

I believe the issue is related to this function - https://github.com/JamieMason/syncpack/blob/main/src/bin-fix-mismatches/fix-mismatches.ts#L94

I propose that the configuration consider a deny list, that suggests to syncpack "I know what I am doing" for the following operations. Something like:

{
  "denyList": {
    "nx": {
      "path": "nx",
      "operations": ["fix-mismatches"]    
    }
  }
}

I realize this interface may not be needed in its entirety to solve my issue. However I believe something like this can allow for more refined customization and implicitly allows the code paths to continue working as they do today.

Help Needed

I am hoping a fix can be made in the area identified if it is the correct code path. Happy to test out any solution!

JamieMason commented 4 weeks ago

Thanks a lot @denis-fwd, great issue and you're exactly right.

  1. We only need to check and clean up empty objects if a Banned Version Group has been fixed and eg. devDependencies is now empty as a result.
  2. We should only check and clean up empty objects in the places syncpack has removed banned dependencies.

But, the way I've done it is pretty sloppy – it always runs and is not targeted about what it cleans up. I'll get this fixed in the next version.

denis-fwd commented 3 weeks ago

@JamieMason no the thanks goes to you. I appreciate your work and look forward to the next release. For folks coming across this issue, I've created my own sloppy fix for this in the interim:

If I set the field like this to avoid it getting deleted:

// package.json
{
  "nx": {
     "targets": [] 
  }
}

@JamieMason feel free to close this at your leisure.