syncpack 7.1.0 → 7.2.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/README.md CHANGED
@@ -325,12 +325,7 @@ configuration file (if present), you can use the `--config` option.
325
325
  "resolutions",
326
326
  "scripts"
327
327
  ],
328
- "sortFirst": [
329
- "name",
330
- "description",
331
- "version",
332
- "author"
333
- ],
328
+ "sortFirst": ["name", "description", "version", "author"],
334
329
  "source": [],
335
330
  "versionGroups": []
336
331
  }
@@ -409,7 +404,7 @@ rest of the repo might need to remain on stable versions.
409
404
 
410
405
  You don't want mismatches within your alpha packages, you don't want mismatches
411
406
  within the other packages, but you _do_ want those groups to use different
412
- versions *to each other* and not have `syncpack` make them all the same.
407
+ versions _to each other_ and not have `syncpack` make them all the same.
413
408
 
414
409
  In the following example, 2 of our packages are using different versions of
415
410
  `react` and `react-dom` to the rest of the project.
@@ -450,7 +445,40 @@ to apply to an entire package:
450
445
  - A specific dependency in some specific packages only.
451
446
  - Any dependency who name matches a pattern such as `@aws-sdk/**`.
452
447
 
453
- See [`semverGroups`](#semverGroups) for some examples, they work the same way.
448
+ See [`semverGroups`](#semverGroups) for more examples, they work the same way.
449
+
450
+ #### `versionGroup.isBanned`
451
+
452
+ Remove dependencies which you've decided should never be allowed.
453
+
454
+ ```json
455
+ {
456
+ "versionGroups": [
457
+ {
458
+ "isBanned": true,
459
+ "dependencies": ["never-gonna"],
460
+ "packages": ["**"]
461
+ }
462
+ ]
463
+ }
464
+ ```
465
+
466
+ #### `versionGroup.pinVersion`
467
+
468
+ Pin the version of all dependencies in this group to match this specific version
469
+ you've defined.
470
+
471
+ ```json
472
+ {
473
+ "versionGroups": [
474
+ {
475
+ "pinVersion": "3.55.0",
476
+ "dependencies": ["@aws-sdk/**"],
477
+ "packages": ["**"]
478
+ }
479
+ ]
480
+ }
481
+ ```
454
482
 
455
483
  ### `semverGroups`
456
484
 
@@ -9,6 +9,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
9
9
  exports.__esModule = true;
10
10
  exports.fixMismatches = void 0;
11
11
  var chalk_1 = __importDefault(require("chalk"));
12
+ var expect_more_1 = require("expect-more");
12
13
  var list_version_groups_1 = require("../bin-list/list-version-groups");
13
14
  var write_if_changed_1 = require("../lib/write-if-changed");
14
15
  var get_expected_version_1 = require("./get-expected-version");
@@ -39,6 +40,7 @@ function fixMismatches(input, disk) {
39
40
  });
40
41
  });
41
42
  input.wrappers.forEach(function (wrapper) {
43
+ removeEmptyIndexes(wrapper);
42
44
  (0, write_if_changed_1.writeIfChanged)(disk, {
43
45
  contents: wrapper.contents,
44
46
  filePath: wrapper.filePath,
@@ -46,6 +48,17 @@ function fixMismatches(input, disk) {
46
48
  json: wrapper.json
47
49
  });
48
50
  });
51
+ /**
52
+ * Remove eg `{"dependencies": {}, "devDependencies": {}}`
53
+ */
54
+ function removeEmptyIndexes(wrapper) {
55
+ input.dependencyTypes.forEach(function (dependencyType) {
56
+ var deps = wrapper.contents[dependencyType];
57
+ if (deps && Object.values(deps).every(expect_more_1.isUndefined)) {
58
+ delete wrapper.contents[dependencyType];
59
+ }
60
+ });
61
+ }
49
62
  }
50
63
  exports.fixMismatches = fixMismatches;
51
64
  var templateObject_1;
@@ -1,3 +1,3 @@
1
1
  import type { ProgramInput } from '../../lib/get-input';
2
2
  import type { IndexedVersionGroup } from '../../lib/get-input/get-instances';
3
- export declare function getExpectedVersion(name: string, versionGroup: Pick<IndexedVersionGroup, 'instances' | 'pinVersion'>, input: Pick<ProgramInput, 'workspace' | 'wrappers'>): string;
3
+ export declare function getExpectedVersion(name: string, versionGroup: Pick<IndexedVersionGroup, 'isBanned' | 'instances' | 'pinVersion'>, input: Pick<ProgramInput, 'workspace' | 'wrappers'>): string | undefined;
@@ -5,13 +5,17 @@ var get_highest_version_1 = require("./get-highest-version");
5
5
  var get_pinned_version_1 = require("./get-pinned-version");
6
6
  var get_workspace_version_1 = require("./get-workspace-version");
7
7
  function getExpectedVersion(name, versionGroup, input) {
8
- return ((0, get_pinned_version_1.getPinnedVersion)(versionGroup) ||
9
- (input.workspace === true && (0, get_workspace_version_1.getWorkspaceVersion)(name, input.wrappers)) ||
10
- (0, get_highest_version_1.getHighestVersion)(versionGroup.instances
11
- .filter(function (instance) { return instance.name === name; })
12
- .map(function (_a) {
13
- var version = _a.version;
14
- return version;
15
- })));
8
+ return versionGroup.isBanned === true
9
+ ? // remove this dependency
10
+ undefined
11
+ : (0, get_pinned_version_1.getPinnedVersion)(versionGroup) ||
12
+ (input.workspace === true &&
13
+ (0, get_workspace_version_1.getWorkspaceVersion)(name, input.wrappers)) ||
14
+ (0, get_highest_version_1.getHighestVersion)(versionGroup.instances
15
+ .filter(function (instance) { return instance.name === name; })
16
+ .map(function (_a) {
17
+ var version = _a.version;
18
+ return version;
19
+ }));
16
20
  }
17
21
  exports.getExpectedVersion = getExpectedVersion;
@@ -66,5 +66,5 @@ commander_1.program.on('--help', function () {
66
66
  semverRange: commander_1.program.opts().semverRange,
67
67
  source: commander_1.program.opts().source,
68
68
  workspace: commander_1.program.opts().workspace
69
- }));
69
+ }), disk_1.disk);
70
70
  var templateObject_1, templateObject_2;
@@ -1,2 +1,3 @@
1
+ import type { Disk } from '../lib/disk';
1
2
  import type { ProgramInput } from '../lib/get-input';
2
- export declare function lintSemverRanges(input: ProgramInput): void;
3
+ export declare function lintSemverRanges(input: ProgramInput, disk: Disk): void;
@@ -11,7 +11,7 @@ exports.lintSemverRanges = void 0;
11
11
  var chalk_1 = __importDefault(require("chalk"));
12
12
  var set_semver_range_1 = require("../lib/set-semver-range");
13
13
  var list_semver_group_mismatches_1 = require("./list-semver-group-mismatches");
14
- function lintSemverRanges(input) {
14
+ function lintSemverRanges(input, disk) {
15
15
  var isInvalid = false;
16
16
  /**
17
17
  * Reverse the list so the default/ungrouped semver group is rendered first
@@ -33,7 +33,7 @@ function lintSemverRanges(input) {
33
33
  }
34
34
  });
35
35
  if (isInvalid) {
36
- process.exit(1);
36
+ disk.process.exit(1);
37
37
  }
38
38
  }
39
39
  exports.lintSemverRanges = lintSemverRanges;
@@ -64,5 +64,5 @@ commander_1.program.on('--help', function () {
64
64
  resolutions: commander_1.program.opts().resolutions,
65
65
  source: commander_1.program.opts().source,
66
66
  workspace: commander_1.program.opts().workspace
67
- }));
67
+ }), disk_1.disk);
68
68
  var templateObject_1;
@@ -2,6 +2,7 @@ import type { IndexedVersionGroup, Instance } from '../lib/get-input/get-instanc
2
2
  export interface ListItem {
3
3
  hasMismatches: boolean;
4
4
  instances: Instance[];
5
+ isBanned: boolean;
5
6
  name: string;
6
7
  uniques: string[];
7
8
  }
@@ -21,7 +21,8 @@ var expect_more_1 = require("expect-more");
21
21
  var group_by_1 = require("../lib/group-by");
22
22
  var sort_by_name_1 = require("../lib/sort-by-name");
23
23
  function listVersionGroups(versionGroup) {
24
- var instancesByName = (0, group_by_1.groupBy)('name', versionGroup.instances.sort(sort_by_name_1.sortByName));
24
+ var instances = versionGroup.instances;
25
+ var instancesByName = (0, group_by_1.groupBy)('name', instances.sort(sort_by_name_1.sortByName));
25
26
  return Object.entries(instancesByName).map(function (_a) {
26
27
  var _b = __read(_a, 2), name = _b[0], instances = _b[1];
27
28
  var pinnedVersion = versionGroup.pinVersion;
@@ -31,13 +32,16 @@ function listVersionGroups(versionGroup) {
31
32
  return version;
32
33
  });
33
34
  var uniques = Array.from(new Set(versions));
34
- var hasMismatches = versions.some(function (version, i) {
35
- return (hasPinnedVersion && version !== pinnedVersion) ||
36
- (i > 0 && version !== versions[i - 1]);
37
- });
35
+ var isBanned = versionGroup.isBanned === true;
36
+ var hasMismatches = isBanned ||
37
+ versions.some(function (version, i) {
38
+ return (hasPinnedVersion && version !== pinnedVersion) ||
39
+ (i > 0 && version !== versions[i - 1]);
40
+ });
38
41
  return {
39
42
  hasMismatches: hasMismatches,
40
43
  instances: instances,
44
+ isBanned: isBanned,
41
45
  name: name,
42
46
  uniques: uniques
43
47
  };
@@ -1,2 +1,3 @@
1
+ import type { Disk } from '../lib/disk';
1
2
  import type { ProgramInput } from '../lib/get-input';
2
- export declare function list(input: ProgramInput): void;
3
+ export declare function list(input: ProgramInput, disk: Disk): void;
@@ -10,7 +10,7 @@ exports.__esModule = true;
10
10
  exports.list = void 0;
11
11
  var chalk_1 = __importDefault(require("chalk"));
12
12
  var list_version_groups_1 = require("./list-version-groups");
13
- function list(input) {
13
+ function list(input, disk) {
14
14
  var isInvalid = false;
15
15
  /**
16
16
  * Reverse the list so the default/ungrouped version group is rendered first
@@ -24,10 +24,11 @@ function list(input) {
24
24
  console.log((0, chalk_1["default"])(templateObject_1 || (templateObject_1 = __makeTemplateObject(["{dim = Version Group ", " ", "}"], ["{dim = Version Group ", " ", "}"])), i, '='.repeat(63)));
25
25
  }
26
26
  groups.forEach(function (_a) {
27
- var hasMismatches = _a.hasMismatches, name = _a.name, uniques = _a.uniques;
27
+ var hasMismatches = _a.hasMismatches, isBanned = _a.isBanned, name = _a.name, uniques = _a.uniques;
28
28
  var versionList = uniques.sort().join(', ');
29
- console.log(hasMismatches
30
- ? (0, chalk_1["default"])(templateObject_2 || (templateObject_2 = __makeTemplateObject(["{red \u2715 ", "} {dim.red ", "}"], ["{red \u2715 ", "} {dim.red ", "}"])), name, versionList) : (0, chalk_1["default"])(templateObject_3 || (templateObject_3 = __makeTemplateObject(["{dim -} {white ", "} {dim ", "}"], ["{dim -} {white ", "} {dim ", "}"])), name, versionList));
29
+ console.log(isBanned
30
+ ? (0, chalk_1["default"])(templateObject_2 || (templateObject_2 = __makeTemplateObject(["{red \u2715 ", "} {dim.red remove this dependency}"], ["{red \u2715 ", "} {dim.red remove this dependency}"])), name) : hasMismatches
31
+ ? (0, chalk_1["default"])(templateObject_3 || (templateObject_3 = __makeTemplateObject(["{red \u2715 ", "} {dim.red ", "}"], ["{red \u2715 ", "} {dim.red ", "}"])), name, versionList) : (0, chalk_1["default"])(templateObject_4 || (templateObject_4 = __makeTemplateObject(["{dim -} {white ", "} {dim ", "}"], ["{dim -} {white ", "} {dim ", "}"])), name, versionList));
31
32
  });
32
33
  if (groups.some(function (_a) {
33
34
  var hasMismatches = _a.hasMismatches;
@@ -37,8 +38,8 @@ function list(input) {
37
38
  }
38
39
  });
39
40
  if (isInvalid) {
40
- process.exit(1);
41
+ disk.process.exit(1);
41
42
  }
42
43
  }
43
44
  exports.list = list;
44
- var templateObject_1, templateObject_2, templateObject_3;
45
+ var templateObject_1, templateObject_2, templateObject_3, templateObject_4;
@@ -64,5 +64,5 @@ commander_1.program.on('--help', function () {
64
64
  resolutions: commander_1.program.opts().resolutions,
65
65
  source: commander_1.program.opts().source,
66
66
  workspace: commander_1.program.opts().workspace
67
- }));
67
+ }), disk_1.disk);
68
68
  var templateObject_1;
@@ -1,2 +1,3 @@
1
+ import type { Disk } from '../lib/disk';
1
2
  import type { ProgramInput } from '../lib/get-input';
2
- export declare function listMismatches(input: ProgramInput): void;
3
+ export declare function listMismatches(input: ProgramInput, disk: Disk): void;
@@ -13,7 +13,7 @@ var path_1 = require("path");
13
13
  var get_expected_version_1 = require("../bin-fix-mismatches/get-expected-version");
14
14
  var list_version_groups_1 = require("../bin-list/list-version-groups");
15
15
  var constants_1 = require("../constants");
16
- function listMismatches(input) {
16
+ function listMismatches(input, disk) {
17
17
  var isInvalid = false;
18
18
  /**
19
19
  * Reverse the list so the default/ungrouped version group is rendered first
@@ -33,24 +33,25 @@ function listMismatches(input) {
33
33
  }
34
34
  }
35
35
  groups.forEach(function (_a) {
36
- var instances = _a.instances, name = _a.name;
36
+ var instances = _a.instances, isBanned = _a.isBanned, name = _a.name;
37
37
  var expectedVersion = (0, get_expected_version_1.getExpectedVersion)(name, versionGroup, input);
38
- console.log((0, chalk_1["default"])(templateObject_2 || (templateObject_2 = __makeTemplateObject(["{dim -} ", " {green.dim ", "}"], ["{dim -} ", " {green.dim ", "}"])), name, expectedVersion));
38
+ console.log(isBanned
39
+ ? (0, chalk_1["default"])(templateObject_2 || (templateObject_2 = __makeTemplateObject(["{red \u2715 ", "} {dim.red remove this dependency}"], ["{red \u2715 ", "} {dim.red remove this dependency}"])), name) : (0, chalk_1["default"])(templateObject_3 || (templateObject_3 = __makeTemplateObject(["{dim -} ", " {green.dim ", "}"], ["{dim -} ", " {green.dim ", "}"])), name, expectedVersion));
39
40
  instances.forEach(function (_a) {
40
41
  var dependencyType = _a.dependencyType, version = _a.version, wrapper = _a.wrapper;
41
42
  if (dependencyType === 'workspace') {
42
43
  var shortPath = (0, path_1.relative)(constants_1.CWD, wrapper.filePath);
43
- console.log((0, chalk_1["default"])(templateObject_3 || (templateObject_3 = __makeTemplateObject(["{red ", " {dim at ", "}}"], ["{red ", " {dim at ", "}}"])), version, shortPath));
44
+ console.log((0, chalk_1["default"])(templateObject_4 || (templateObject_4 = __makeTemplateObject(["{red ", " {dim at ", "}}"], ["{red ", " {dim at ", "}}"])), version, shortPath));
44
45
  }
45
46
  else {
46
- console.log((0, chalk_1["default"])(templateObject_4 || (templateObject_4 = __makeTemplateObject(["{red ", " {dim in ", " of ", "}}"], ["{red ", " {dim in ", " of ", "}}"])), version, dependencyType, wrapper.contents.name));
47
+ console.log((0, chalk_1["default"])(templateObject_5 || (templateObject_5 = __makeTemplateObject(["{red ", " {dim in ", " of ", "}}"], ["{red ", " {dim in ", " of ", "}}"])), version, dependencyType, wrapper.contents.name));
47
48
  }
48
49
  });
49
50
  });
50
51
  });
51
52
  if (isInvalid) {
52
- process.exit(1);
53
+ disk.process.exit(1);
53
54
  }
54
55
  }
55
56
  exports.listMismatches = listMismatches;
56
- var templateObject_1, templateObject_2, templateObject_3, templateObject_4;
57
+ var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5;
@@ -30,6 +30,10 @@ export interface VersionGroup {
30
30
  * the names of the dependencies (eg. "lodash") which belong to this group
31
31
  */
32
32
  dependencies: string[];
33
+ /**
34
+ * optionally force all dependencies in this group to be removed
35
+ */
36
+ isBanned?: true;
33
37
  /**
34
38
  * optionally force all dependencies in this group to have this version
35
39
  */
@@ -1,6 +1,9 @@
1
1
  import type { SyncpackConfig } from '../constants';
2
2
  export declare type Disk = typeof disk;
3
3
  export declare const disk: {
4
+ readonly process: {
5
+ readonly exit: (code: number) => void;
6
+ };
4
7
  readonly globSync: (pattern: string) => string[];
5
8
  readonly readConfigFileSync: (configPath?: string | undefined) => Partial<SyncpackConfig>;
6
9
  readonly readFileSync: (filePath: string) => string;
package/dist/lib/disk.js CHANGED
@@ -10,6 +10,11 @@ var constants_1 = require("../constants");
10
10
  var log_1 = require("./log");
11
11
  var client = (0, cosmiconfig_1.cosmiconfigSync)('syncpack');
12
12
  exports.disk = {
13
+ process: {
14
+ exit: function (code) {
15
+ process.exit(code);
16
+ }
17
+ },
13
18
  globSync: function (pattern) {
14
19
  return (0, glob_1.sync)(pattern, {
15
20
  ignore: '**/node_modules/**',
@@ -8,5 +8,5 @@ import type { Disk } from '../disk';
8
8
  * @param program Optional command line options
9
9
  */
10
10
  export declare const getConfig: (disk: Disk, program: Partial<SyncpackConfig & {
11
- configPath: string;
11
+ configPath: string | undefined;
12
12
  }>) => SyncpackConfig;
@@ -40,7 +40,6 @@ var getConfig = function (disk, program) {
40
40
  var dependencyTypes = dev || workspace || overrides || peer || prod || resolutions
41
41
  ? constants_1.DEPENDENCY_TYPES.filter(function (type) {
42
42
  return (type === 'devDependencies' && dev) ||
43
- (type === 'workspace' && workspace) ||
44
43
  (type === 'overrides' && overrides) ||
45
44
  (type === 'peerDependencies' && peer) ||
46
45
  (type === 'dependencies' && prod) ||
@@ -16,5 +16,5 @@ export declare type ProgramInput = SyncpackConfig & {
16
16
  * @param program Options received from CLI arguments
17
17
  */
18
18
  export declare function getInput(disk: Disk, program: Partial<SyncpackConfig & {
19
- configPath: string;
19
+ configPath: string | undefined;
20
20
  }>): ProgramInput;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "syncpack",
3
3
  "description": "Manage multiple package.json files, such as in Lerna Monorepos and Yarn/Pnpm Workspaces",
4
- "version": "7.1.0",
4
+ "version": "7.2.1",
5
5
  "author": "Jamie Mason <jamie@foldleft.io> (https://github.com/JamieMason)",
6
6
  "bin": {
7
7
  "syncpack": "dist/bin.js",
@@ -28,7 +28,7 @@
28
28
  "commander": "9.2.0",
29
29
  "cosmiconfig": "7.0.1",
30
30
  "expect-more": "1.2.0",
31
- "fp-ts": "2.12.0",
31
+ "fp-ts": "2.12.1",
32
32
  "fs-extra": "10.1.0",
33
33
  "glob": "8.0.1",
34
34
  "minimatch": "5.0.1",
@@ -39,10 +39,10 @@
39
39
  "@types/fs-extra": "9.0.13",
40
40
  "@types/glob": "7.2.0",
41
41
  "@types/jest": "27.4.1",
42
- "@types/node": "17.0.25",
42
+ "@types/node": "17.0.31",
43
43
  "@types/semver": "7.3.9",
44
- "@typescript-eslint/eslint-plugin": "5.20.0",
45
- "@typescript-eslint/parser": "5.20.0",
44
+ "@typescript-eslint/eslint-plugin": "5.21.0",
45
+ "@typescript-eslint/parser": "5.21.0",
46
46
  "eslint": "8.14.0",
47
47
  "eslint-plugin-import": "2.26.0",
48
48
  "expect-more-jest": "5.4.0",
@@ -50,7 +50,7 @@
50
50
  "prettier": "2.6.2",
51
51
  "rimraf": "3.0.2",
52
52
  "ts-jest": "27.1.4",
53
- "typescript": "4.6.3"
53
+ "typescript": "4.6.4"
54
54
  },
55
55
  "engines": {
56
56
  "node": ">=10"