syncpack 9.8.6 → 10.1.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 (191) hide show
  1. package/README.md +22 -19
  2. package/dist/bin-fix-mismatches/fix-mismatches-cli.d.ts +2 -2
  3. package/dist/bin-fix-mismatches/fix-mismatches-cli.js +3 -1
  4. package/dist/bin-fix-mismatches/fix-mismatches.d.ts +2 -2
  5. package/dist/bin-fix-mismatches/fix-mismatches.js +42 -24
  6. package/dist/bin-format/format-cli.d.ts +2 -2
  7. package/dist/bin-format/format-cli.js +2 -1
  8. package/dist/bin-format/format.d.ts +2 -2
  9. package/dist/bin-format/format.js +4 -1
  10. package/dist/bin-lint/index.d.ts +2 -0
  11. package/dist/bin-lint/index.js +39 -0
  12. package/dist/bin-lint/lint-cli.d.ts +3 -0
  13. package/dist/bin-lint/lint-cli.js +11 -0
  14. package/dist/bin-lint/lint.d.ts +2 -0
  15. package/dist/bin-lint/lint.js +116 -0
  16. package/dist/bin-lint-semver-ranges/lint-semver-ranges-cli.d.ts +2 -2
  17. package/dist/bin-lint-semver-ranges/lint-semver-ranges-cli.js +2 -1
  18. package/dist/bin-lint-semver-ranges/lint-semver-ranges.d.ts +2 -2
  19. package/dist/bin-lint-semver-ranges/lint-semver-ranges.js +29 -25
  20. package/dist/bin-list/list-cli.d.ts +2 -2
  21. package/dist/bin-list/list-cli.js +2 -1
  22. package/dist/bin-list/list.d.ts +2 -2
  23. package/dist/bin-list/list.js +58 -54
  24. package/dist/bin-list-mismatches/list-mismatches-cli.d.ts +2 -2
  25. package/dist/bin-list-mismatches/list-mismatches-cli.js +2 -1
  26. package/dist/bin-list-mismatches/list-mismatches.d.ts +2 -2
  27. package/dist/bin-list-mismatches/list-mismatches.js +72 -106
  28. package/dist/bin-set-semver-ranges/set-semver-ranges-cli.d.ts +2 -2
  29. package/dist/bin-set-semver-ranges/set-semver-ranges-cli.js +2 -1
  30. package/dist/bin-set-semver-ranges/set-semver-ranges.d.ts +2 -2
  31. package/dist/bin-set-semver-ranges/set-semver-ranges.js +17 -3
  32. package/dist/bin.js +3 -0
  33. package/dist/config/get-custom-types.d.ts +9 -0
  34. package/dist/config/get-custom-types.js +49 -0
  35. package/dist/config/get-enabled-types.d.ts +3 -0
  36. package/dist/config/get-enabled-types.js +48 -0
  37. package/dist/config/get-filter.d.ts +2 -0
  38. package/dist/config/get-filter.js +13 -0
  39. package/dist/config/get-indent.d.ts +2 -0
  40. package/dist/config/get-indent.js +12 -0
  41. package/dist/config/get-semver-range.d.ts +3 -0
  42. package/dist/config/get-semver-range.js +12 -0
  43. package/dist/config/get-sort-az.d.ts +2 -0
  44. package/dist/config/get-sort-az.js +18 -0
  45. package/dist/config/get-sort-first.d.ts +2 -0
  46. package/dist/config/get-sort-first.js +10 -0
  47. package/dist/config/get-source.d.ts +2 -0
  48. package/dist/config/get-source.js +13 -0
  49. package/dist/config/types.d.ts +106 -0
  50. package/dist/constants.d.ts +1 -0
  51. package/dist/constants.js +1 -0
  52. package/dist/get-context/index.d.ts +8 -16
  53. package/dist/get-context/index.js +7 -33
  54. package/dist/{get-context/get-package-json-files → get-package-json-files}/get-file-paths.d.ts +3 -3
  55. package/dist/{get-context/get-package-json-files → get-package-json-files}/get-file-paths.js +4 -4
  56. package/dist/{get-context/get-package-json-files → get-package-json-files}/get-patterns/get-lerna-patterns.d.ts +1 -1
  57. package/dist/{get-context/get-package-json-files → get-package-json-files}/get-patterns/get-lerna-patterns.js +1 -1
  58. package/dist/{get-context/get-package-json-files → get-package-json-files}/get-patterns/get-pnpm-patterns.d.ts +1 -1
  59. package/dist/{get-context/get-package-json-files → get-package-json-files}/get-patterns/get-pnpm-patterns.js +1 -1
  60. package/dist/{get-context/get-package-json-files → get-package-json-files}/get-patterns/get-yarn-patterns.d.ts +1 -1
  61. package/dist/{get-context/get-package-json-files → get-package-json-files}/get-patterns/get-yarn-patterns.js +1 -1
  62. package/dist/{get-context/get-package-json-files → get-package-json-files}/get-patterns/index.d.ts +3 -3
  63. package/dist/{get-context/get-package-json-files → get-package-json-files}/get-patterns/index.js +4 -3
  64. package/dist/{get-context/get-package-json-files → get-package-json-files}/get-patterns/read-json-safe.d.ts +1 -1
  65. package/dist/{get-context/get-package-json-files → get-package-json-files}/get-patterns/read-yaml-safe.d.ts +1 -1
  66. package/dist/{get-context/get-package-json-files → get-package-json-files}/index.d.ts +3 -3
  67. package/dist/{get-context/get-package-json-files → get-package-json-files}/index.js +1 -1
  68. package/dist/{get-context/get-package-json-files/package-json-file → get-package-json-files}/instance.d.ts +6 -8
  69. package/dist/get-package-json-files/instance.js +23 -0
  70. package/dist/{get-context/get-package-json-files/package-json-file/index.d.ts → get-package-json-files/package-json-file.d.ts} +7 -9
  71. package/dist/get-package-json-files/package-json-file.js +45 -0
  72. package/dist/get-semver-groups/catch-all.d.ts +4 -0
  73. package/dist/get-semver-groups/catch-all.js +11 -0
  74. package/dist/get-semver-groups/filtered-out.d.ts +13 -0
  75. package/dist/get-semver-groups/filtered-out.js +29 -0
  76. package/dist/get-semver-groups/ignored.d.ts +11 -0
  77. package/dist/get-semver-groups/ignored.js +22 -0
  78. package/dist/get-semver-groups/index.d.ts +32 -0
  79. package/dist/get-semver-groups/index.js +90 -0
  80. package/dist/get-semver-groups/with-range.d.ts +11 -0
  81. package/dist/get-semver-groups/with-range.js +55 -0
  82. package/dist/get-version-groups/banned.d.ts +11 -0
  83. package/dist/get-version-groups/banned.js +24 -0
  84. package/dist/get-version-groups/catch-all.d.ts +4 -0
  85. package/dist/get-version-groups/catch-all.js +11 -0
  86. package/dist/get-version-groups/filtered-out.d.ts +13 -0
  87. package/dist/get-version-groups/filtered-out.js +31 -0
  88. package/dist/get-version-groups/ignored.d.ts +11 -0
  89. package/dist/get-version-groups/ignored.js +24 -0
  90. package/dist/get-version-groups/index.d.ts +57 -0
  91. package/dist/get-version-groups/index.js +119 -0
  92. package/dist/get-version-groups/lib/delete.d.ts +2 -0
  93. package/dist/get-version-groups/lib/delete.js +4 -0
  94. package/dist/get-version-groups/lib/get-highest-version.js +13 -0
  95. package/dist/get-version-groups/lib/get-lowest-version.js +13 -0
  96. package/dist/{get-context/get-groups/version-group/instance-group → get-version-groups}/lib/get-range-score.js +3 -2
  97. package/dist/get-version-groups/lib/get-unique-versions.d.ts +2 -0
  98. package/dist/get-version-groups/lib/get-unique-versions.js +8 -0
  99. package/dist/get-version-groups/lib/group-by.d.ts +1 -0
  100. package/dist/get-version-groups/lib/group-by.js +11 -0
  101. package/dist/get-version-groups/lib/sort.d.ts +1 -0
  102. package/dist/get-version-groups/lib/sort.js +44 -0
  103. package/dist/get-version-groups/pinned.d.ts +11 -0
  104. package/dist/get-version-groups/pinned.js +43 -0
  105. package/dist/get-version-groups/snapped-to.d.ts +11 -0
  106. package/dist/get-version-groups/snapped-to.js +52 -0
  107. package/dist/get-version-groups/standard.d.ts +11 -0
  108. package/dist/get-version-groups/standard.js +95 -0
  109. package/dist/index.d.ts +2 -0
  110. package/dist/{get-context → lib}/$R.d.ts +2 -2
  111. package/dist/{get-context → lib}/$R.js +3 -4
  112. package/dist/lib/disk.d.ts +3 -2
  113. package/dist/lib/exit-if-invalid.d.ts +2 -2
  114. package/dist/lib/is-semver.d.ts +5 -3
  115. package/dist/lib/is-semver.js +17 -3
  116. package/dist/lib/log.d.ts +4 -8
  117. package/dist/lib/log.js +3 -29
  118. package/dist/lib/set-semver-range.d.ts +2 -2
  119. package/dist/lib/write-if-changed.d.ts +2 -2
  120. package/dist/lib/write-if-changed.js +6 -25
  121. package/dist/{get-context/get-config/path-strategy → strategy}/lib/get-non-empty-string-prop.d.ts +1 -1
  122. package/dist/{get-context/get-config/path-strategy → strategy}/lib/get-non-empty-string-prop.js +1 -2
  123. package/dist/strategy/name-and-version-props.d.ts +12 -0
  124. package/dist/strategy/name-and-version-props.js +50 -0
  125. package/dist/strategy/named-version-string.d.ts +11 -0
  126. package/dist/{get-context/get-config/path-strategy/name-and-version-string.js → strategy/named-version-string.js} +26 -22
  127. package/dist/strategy/unnamed-version-string.d.ts +11 -0
  128. package/dist/strategy/unnamed-version-string.js +48 -0
  129. package/dist/strategy/versions-by-name.d.ts +11 -0
  130. package/dist/strategy/versions-by-name.js +29 -0
  131. package/package.json +8 -4
  132. package/dist/get-context/get-config/get-core-types.d.ts +0 -36
  133. package/dist/get-context/get-config/get-core-types.js +0 -38
  134. package/dist/get-context/get-config/get-custom-types.d.ts +0 -4
  135. package/dist/get-context/get-config/get-custom-types.js +0 -16
  136. package/dist/get-context/get-config/get-enabled-types.d.ts +0 -4
  137. package/dist/get-context/get-config/get-enabled-types.js +0 -17
  138. package/dist/get-context/get-config/index.d.ts +0 -8
  139. package/dist/get-context/get-config/index.js +0 -98
  140. package/dist/get-context/get-config/path-strategy/index.d.ts +0 -8
  141. package/dist/get-context/get-config/path-strategy/index.js +0 -18
  142. package/dist/get-context/get-config/path-strategy/name-and-version-props.d.ts +0 -2
  143. package/dist/get-context/get-config/path-strategy/name-and-version-props.js +0 -44
  144. package/dist/get-context/get-config/path-strategy/name-and-version-string.d.ts +0 -2
  145. package/dist/get-context/get-config/path-strategy/types.d.ts +0 -14
  146. package/dist/get-context/get-config/path-strategy/version-string.d.ts +0 -2
  147. package/dist/get-context/get-config/path-strategy/version-string.js +0 -49
  148. package/dist/get-context/get-config/path-strategy/versions-by-name.d.ts +0 -2
  149. package/dist/get-context/get-config/path-strategy/versions-by-name.js +0 -21
  150. package/dist/get-context/get-config/schema/base-group.d.ts +0 -7
  151. package/dist/get-context/get-config/schema/base-group.js +0 -10
  152. package/dist/get-context/get-config/schema/index.d.ts +0 -1540
  153. package/dist/get-context/get-config/schema/index.js +0 -81
  154. package/dist/get-context/get-config/schema/lib/non-empty-string.d.ts +0 -2
  155. package/dist/get-context/get-config/schema/lib/non-empty-string.js +0 -5
  156. package/dist/get-context/get-config/schema/paths.d.ts +0 -89
  157. package/dist/get-context/get-config/schema/paths.js +0 -33
  158. package/dist/get-context/get-config/schema/semver-group.d.ts +0 -119
  159. package/dist/get-context/get-config/schema/semver-group.js +0 -43
  160. package/dist/get-context/get-config/schema/semver-range.d.ts +0 -2
  161. package/dist/get-context/get-config/schema/semver-range.js +0 -16
  162. package/dist/get-context/get-config/schema/version-group.d.ts +0 -230
  163. package/dist/get-context/get-config/schema/version-group.js +0 -36
  164. package/dist/get-context/get-groups/base-group.d.ts +0 -22
  165. package/dist/get-context/get-groups/base-group.js +0 -39
  166. package/dist/get-context/get-groups/index.d.ts +0 -11
  167. package/dist/get-context/get-groups/index.js +0 -53
  168. package/dist/get-context/get-groups/semver-group.d.ts +0 -15
  169. package/dist/get-context/get-groups/semver-group.js +0 -46
  170. package/dist/get-context/get-groups/version-group/index.d.ts +0 -15
  171. package/dist/get-context/get-groups/version-group/index.js +0 -40
  172. package/dist/get-context/get-groups/version-group/instance-group/get-highest-version.js +0 -42
  173. package/dist/get-context/get-groups/version-group/instance-group/get-lowest-version.js +0 -44
  174. package/dist/get-context/get-groups/version-group/instance-group/index.d.ts +0 -34
  175. package/dist/get-context/get-groups/version-group/instance-group/index.js +0 -103
  176. package/dist/get-context/get-groups/version-group/instance-group/lib/compare-semver.d.ts +0 -4
  177. package/dist/get-context/get-groups/version-group/instance-group/lib/compare-semver.js +0 -38
  178. package/dist/get-context/get-package-json-files/package-json-file/index.js +0 -65
  179. package/dist/get-context/get-package-json-files/package-json-file/instance.js +0 -46
  180. package/dist/lib/error.d.ts +0 -12
  181. package/dist/lib/error.js +0 -25
  182. package/dist/types.d.ts +0 -90
  183. /package/dist/{get-context/get-config/path-strategy → config}/types.js +0 -0
  184. /package/dist/{get-context/get-package-json-files → get-package-json-files}/get-patterns/read-json-safe.js +0 -0
  185. /package/dist/{get-context/get-package-json-files → get-package-json-files}/get-patterns/read-yaml-safe.js +0 -0
  186. /package/dist/{get-context/get-groups/version-group/instance-group → get-version-groups}/lib/clean.d.ts +0 -0
  187. /package/dist/{get-context/get-groups/version-group/instance-group → get-version-groups}/lib/clean.js +0 -0
  188. /package/dist/{get-context/get-groups/version-group/instance-group → get-version-groups/lib}/get-highest-version.d.ts +0 -0
  189. /package/dist/{get-context/get-groups/version-group/instance-group → get-version-groups/lib}/get-lowest-version.d.ts +0 -0
  190. /package/dist/{get-context/get-groups/version-group/instance-group → get-version-groups}/lib/get-range-score.d.ts +0 -0
  191. /package/dist/{types.js → index.js} +0 -0
@@ -28,69 +28,73 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
29
  exports.list = void 0;
30
30
  const chalk_1 = __importDefault(require("chalk"));
31
- const pipe_1 = require("tightrope/fn/pipe");
32
- const unwrap_1 = require("tightrope/option/unwrap");
33
- const tap_1 = require("tightrope/result/tap");
31
+ const uniq_1 = require("tightrope/array/uniq");
32
+ const is_non_empty_array_1 = require("tightrope/guard/is-non-empty-array");
34
33
  const constants_1 = require("../constants");
35
- const _R_1 = require("../get-context/$R");
34
+ const get_version_groups_1 = require("../get-version-groups");
36
35
  const log = __importStar(require("../lib/log"));
36
+ const sort_by_name_1 = require("../lib/sort-by-name");
37
37
  function list(ctx) {
38
- const hasUserGroups = ctx.versionGroups.length > 1;
39
- ctx.versionGroups.forEach((versionGroup, i) => {
40
- const instanceGroups = versionGroup.getAllInstanceGroups();
41
- // Nothing to do if empty
42
- if (instanceGroups.length === 0)
43
- return;
38
+ const versionGroups = (0, get_version_groups_1.getVersionGroups)(ctx);
39
+ const hasUserGroups = (0, is_non_empty_array_1.isNonEmptyArray)(ctx.config.rcFile.versionGroups);
40
+ versionGroups.forEach((versionGroup, i) => {
44
41
  // Annotate each group
45
42
  hasUserGroups && log.versionGroupHeader(versionGroup, i);
46
- instanceGroups.forEach((instanceGroup) => {
47
- // Record that this project has mismatches, so that eg. the CLI can exit
48
- // with the correct status code.
49
- if (instanceGroup.isInvalid())
43
+ versionGroup
44
+ .inspect()
45
+ .sort(sort_by_name_1.sortByName)
46
+ .forEach((report) => {
47
+ // Allow eg. CLI to exit with the correct status code.
48
+ if (!report.isValid)
50
49
  ctx.isInvalid = true;
51
- if (versionGroup.isBanned())
52
- return logBanned(instanceGroup);
53
- if (versionGroup.isIgnored())
54
- return logIgnored(instanceGroup);
55
- if (versionGroup.isUnpinned())
56
- return logUnpinned(instanceGroup);
57
- if (instanceGroup.hasMismatchingVersions()) {
58
- return instanceGroup.hasUnsupportedVersion()
59
- ? logUnsupportedMismatches(instanceGroup)
60
- : logVersionMismatch(instanceGroup);
50
+ switch (report.status) {
51
+ case 'HIGHEST_SEMVER_MISMATCH':
52
+ case 'LOWEST_SEMVER_MISMATCH':
53
+ case 'PINNED_MISMATCH':
54
+ case 'SNAPPED_TO_MISMATCH':
55
+ case 'WORKSPACE_MISMATCH': {
56
+ console.log((0, chalk_1.default) `{red %s %s} %s`, constants_1.ICON.cross, report.name, listColouredVersions(report.expectedVersion, report.instances));
57
+ break;
58
+ }
59
+ case 'BANNED': {
60
+ console.log((0, chalk_1.default) `{red %s %s} {dim.red is banned in this version group}`, constants_1.ICON.cross, report.name);
61
+ break;
62
+ }
63
+ // ignored completely
64
+ case 'FILTERED_OUT':
65
+ break;
66
+ case 'IGNORED': {
67
+ console.log((0, chalk_1.default) `{dim -} {dim %s} {white is ignored in this version group}`, report.name);
68
+ break;
69
+ }
70
+ case 'VALID': {
71
+ console.log((0, chalk_1.default) `{dim -} {white %s} {dim %s}`, report.name, report.instances?.[0]?.version);
72
+ break;
73
+ }
74
+ case 'UNSUPPORTED_MISMATCH': {
75
+ console.log((0, chalk_1.default) `{red %s %s} %s`, constants_1.ICON.cross, report.name, report.instances
76
+ .map((instance) => chalk_1.default.red(instance.version))
77
+ .join(chalk_1.default.dim(', ')));
78
+ break;
79
+ }
80
+ // @TODO case 'SEMVER_UNSATISFIED': break;
81
+ // @TODO case 'WORKSPACE_UNSATISFIED': break;
82
+ }
83
+ function listColouredVersions(pinVersion, instances) {
84
+ return getAllVersions(pinVersion, instances)
85
+ .map((version) => withColour(pinVersion, version))
86
+ .join(chalk_1.default.dim(', '));
87
+ }
88
+ function withColour(pinVersion, version) {
89
+ return version === pinVersion
90
+ ? chalk_1.default.green(version)
91
+ : chalk_1.default.red(version);
92
+ }
93
+ function getAllVersions(pinVersion, instances) {
94
+ return (0, uniq_1.uniq)([pinVersion].concat(instances.map((i) => i.version)));
61
95
  }
62
- logVersionMatch(instanceGroup);
63
96
  });
64
97
  });
65
98
  return ctx;
66
- function logVersionMatch(instanceGroup) {
67
- console.log((0, chalk_1.default) `{dim -} {white ${instanceGroup.name}} {dim ${instanceGroup.getUniqueVersions()}}`);
68
- }
69
- function logVersionMismatch(instanceGroup) {
70
- (0, pipe_1.pipe)(instanceGroup.getExpectedVersion(), (0, tap_1.tap)((expectedVersion) => {
71
- const uniqueVersions = instanceGroup.getUniqueVersions();
72
- console.log((0, chalk_1.default) `{red ${constants_1.ICON.cross} ${instanceGroup.name}} ${uniqueVersions
73
- .map((version) => version === expectedVersion
74
- ? chalk_1.default.green(version)
75
- : chalk_1.default.red(version))
76
- .join(chalk_1.default.dim(', '))}`);
77
- }), _R_1.$R.tapErrVerbose);
78
- }
79
- function logIgnored(instanceGroup) {
80
- console.log((0, chalk_1.default) `{dim ${constants_1.ICON.skip} ${instanceGroup.name}} is ignored in this version group`);
81
- }
82
- function logBanned(instanceGroup) {
83
- console.log((0, chalk_1.default) `{red ${constants_1.ICON.cross} ${instanceGroup.name}} {dim.red is banned in this version group}`);
84
- }
85
- function logUnpinned(instanceGroup) {
86
- const pinVersion = (0, unwrap_1.unwrap)(instanceGroup.versionGroup.getPinnedVersion());
87
- console.log((0, chalk_1.default) `{red ${constants_1.ICON.cross} ${instanceGroup.name}} {dim.red is pinned to ${pinVersion} in this version group}`);
88
- }
89
- function logUnsupportedMismatches(instanceGroup) {
90
- console.log((0, chalk_1.default) `{red ${constants_1.ICON.cross} ${instanceGroup.name}} {dim.red has mismatched versions which syncpack cannot fix: ${instanceGroup
91
- .getUniqueVersions()
92
- .map((version) => chalk_1.default.yellow(version))
93
- .join(chalk_1.default.dim(', '))}}`);
94
- }
95
99
  }
96
100
  exports.list = list;
@@ -1,3 +1,3 @@
1
+ import type { CliConfig } from '../config/types';
1
2
  import type { Disk } from '../lib/disk';
2
- import type { Syncpack } from '../types';
3
- export declare function listMismatchesCli(input: Partial<Syncpack.Config.Cli>, disk: Disk): void;
3
+ export declare function listMismatchesCli(input: Partial<CliConfig>, disk: Disk): void;
@@ -1,10 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.listMismatchesCli = void 0;
4
+ const pipe_1 = require("tightrope/fn/pipe");
4
5
  const get_context_1 = require("../get-context");
5
6
  const exit_if_invalid_1 = require("../lib/exit-if-invalid");
6
7
  const list_mismatches_1 = require("./list-mismatches");
7
8
  function listMismatchesCli(input, disk) {
8
- (0, exit_if_invalid_1.exitIfInvalid)((0, list_mismatches_1.listMismatches)((0, get_context_1.getContext)(input, disk)));
9
+ (0, pipe_1.pipe)((0, get_context_1.getContext)(input, disk), list_mismatches_1.listMismatches, exit_if_invalid_1.exitIfInvalid);
9
10
  }
10
11
  exports.listMismatchesCli = listMismatchesCli;
@@ -1,2 +1,2 @@
1
- import type { Syncpack } from '../types';
2
- export declare function listMismatches(ctx: Syncpack.Ctx): Syncpack.Ctx;
1
+ import type { Context } from '../get-context';
2
+ export declare function listMismatches(ctx: Context): Context;
@@ -28,117 +28,83 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
29
  exports.listMismatches = void 0;
30
30
  const chalk_1 = __importDefault(require("chalk"));
31
- const unwrap_1 = require("tightrope/option/unwrap");
32
- const unwrap_2 = require("tightrope/result/unwrap");
31
+ const is_non_empty_array_1 = require("tightrope/guard/is-non-empty-array");
32
+ const constants_1 = require("../constants");
33
+ const get_version_groups_1 = require("../get-version-groups");
33
34
  const log = __importStar(require("../lib/log"));
35
+ const sort_by_name_1 = require("../lib/sort-by-name");
34
36
  function listMismatches(ctx) {
35
- const hasUserGroups = ctx.versionGroups.length > 1;
36
- ctx.versionGroups.forEach((versionGroup, i) => {
37
- const invalidGroups = versionGroup.getInvalidInstanceGroups();
38
- // Nothing to do if there are no mismatches
39
- if (invalidGroups.length === 0)
40
- return;
41
- // Record that this project has mismatches, so that eg. the CLI can exit
42
- // with the correct status code.
43
- ctx.isInvalid = true;
44
- // Annotate each group
45
- hasUserGroups && log.versionGroupHeader(versionGroup, i);
46
- // Log the mismatches
47
- invalidGroups.forEach((instanceGroup) => {
48
- if (versionGroup.isBanned())
49
- return logBanned(instanceGroup);
50
- if (versionGroup.isUnpinned())
51
- return logUnpinned(instanceGroup);
52
- if (versionGroup.hasSnappedToPackages())
53
- return logSnappedTo(instanceGroup);
54
- if (instanceGroup.hasUnsupportedVersion())
55
- return logUnsupportedMismatches(instanceGroup);
56
- if (instanceGroup.hasWorkspaceInstance()) {
57
- return logWorkspaceMismatch(instanceGroup);
37
+ const versionGroups = (0, get_version_groups_1.getVersionGroups)(ctx);
38
+ const hasUserGroups = (0, is_non_empty_array_1.isNonEmptyArray)(ctx.config.rcFile.versionGroups);
39
+ versionGroups.forEach((versionGroup, i) => {
40
+ versionGroup
41
+ .inspect()
42
+ .sort(sort_by_name_1.sortByName)
43
+ .forEach((report, ii) => {
44
+ // no action needed
45
+ if (report.isValid)
46
+ return;
47
+ // Allow eg. CLI to exit with the correct status code.
48
+ ctx.isInvalid = true;
49
+ // Annotate each group
50
+ if (ii === 0 && hasUserGroups)
51
+ log.versionGroupHeader(versionGroup, i);
52
+ switch (report.status) {
53
+ case 'BANNED':
54
+ console.log((0, chalk_1.default) ` {red %s} %s {dim is banned in this version group}`, constants_1.ICON.cross, report.name);
55
+ report.instances.forEach((instance) => {
56
+ console.log((0, chalk_1.default) ` {red %s} {dim in %s of %s}`, instance.version, instance.strategy.path, instance.packageJsonFile.shortPath);
57
+ });
58
+ break;
59
+ case 'HIGHEST_SEMVER_MISMATCH':
60
+ case 'LOWEST_SEMVER_MISMATCH': {
61
+ console.log((0, chalk_1.default) `{red %s} %s {green %s} {dim is the %s valid semver version in use}`, constants_1.ICON.cross, report.name, report.expectedVersion, report.status === 'LOWEST_SEMVER_MISMATCH' ? 'lowest' : 'highest');
62
+ report.instances.forEach((instance) => {
63
+ if (instance.version !== report.expectedVersion) {
64
+ console.log((0, chalk_1.default) ` {red %s} {dim in %s of %s}`, instance.version, instance.strategy.path, instance.packageJsonFile.shortPath);
65
+ }
66
+ });
67
+ break;
68
+ }
69
+ case 'PINNED_MISMATCH': {
70
+ console.log((0, chalk_1.default) `{red %s} %s {dim is pinned in this version group at} {green %s}`, constants_1.ICON.cross, report.name, report.expectedVersion);
71
+ report.instances.forEach((instance) => {
72
+ if (instance.version !== report.expectedVersion) {
73
+ console.log((0, chalk_1.default) ` {red %s} {dim in %s of %s}`, instance.version, instance.strategy.path, instance.packageJsonFile.shortPath);
74
+ }
75
+ });
76
+ break;
77
+ }
78
+ case 'SNAPPED_TO_MISMATCH': {
79
+ console.log((0, chalk_1.default) `{red %s} %s {dim should snap to {reset.green %s}, used by %s}`, constants_1.ICON.cross, report.name, report.expectedVersion, versionGroup.config.snapTo.join(' || '));
80
+ report.instances.forEach((instance) => {
81
+ if (instance.version !== report.expectedVersion) {
82
+ console.log((0, chalk_1.default) ` {red %s} {dim in %s of %s}`, instance.version, instance.strategy.path, instance.packageJsonFile.shortPath);
83
+ }
84
+ });
85
+ break;
86
+ }
87
+ case 'UNSUPPORTED_MISMATCH': {
88
+ console.log((0, chalk_1.default) `{red %s} %s {dim has mismatched versions which syncpack cannot fix}`, constants_1.ICON.cross, report.name);
89
+ report.instances.forEach((instance) => {
90
+ console.log((0, chalk_1.default) ` {yellow %s} {dim in %s of %s}`, instance.version, instance.strategy.path, instance.packageJsonFile.shortPath);
91
+ });
92
+ break;
93
+ }
94
+ case 'WORKSPACE_MISMATCH': {
95
+ console.log((0, chalk_1.default) `{red %s} %s {green %s} {dim is developed in this repo at %s}`, constants_1.ICON.cross, report.name, report.expectedVersion, report.workspaceInstance.packageJsonFile.shortPath);
96
+ report.instances.forEach((instance) => {
97
+ if (instance.version !== report.expectedVersion) {
98
+ console.log((0, chalk_1.default) ` {red %s} {dim in %s of %s}`, instance.version, instance.strategy.path, instance.packageJsonFile.shortPath);
99
+ }
100
+ });
101
+ break;
102
+ }
103
+ // @TODO case 'SEMVER_UNSATISFIED': break;
104
+ // @TODO case 'WORKSPACE_UNSATISFIED': break;
58
105
  }
59
- logHighLowVersionMismatch(instanceGroup);
60
106
  });
61
107
  });
62
108
  return ctx;
63
- function logBanned(instanceGroup) {
64
- const name = instanceGroup.name;
65
- log.invalid(name, 'is banned in this version group');
66
- // Log each of the dependencies mismatches
67
- instanceGroup.instances.forEach((instance) => {
68
- logVersionMismatch(instance);
69
- });
70
- }
71
- function logUnsupportedMismatches(instanceGroup) {
72
- const name = instanceGroup.name;
73
- log.invalid(name, 'has mismatched versions which syncpack cannot fix');
74
- // Log each of the dependencies mismatches
75
- instanceGroup.instances.forEach((instance) => {
76
- logUnsupportedVersionMismatch(instance);
77
- });
78
- }
79
- function logUnpinned(instanceGroup) {
80
- const name = instanceGroup.name;
81
- const pinVersion = (0, unwrap_1.unwrap)(instanceGroup.versionGroup.getPinnedVersion());
82
- log.invalid(name, (0, chalk_1.default) `is pinned in this version group at {reset.green ${pinVersion}}`);
83
- // Log each of the dependencies mismatches
84
- instanceGroup.instances.forEach((instance) => {
85
- if (instance.version !== pinVersion) {
86
- logVersionMismatch(instance);
87
- }
88
- });
89
- }
90
- function logSnappedTo(instanceGroup) {
91
- const name = instanceGroup.name;
92
- const versionGroup = instanceGroup.versionGroup;
93
- const snappedVersion = (0, unwrap_2.unwrap)(instanceGroup.getSnappedVersion());
94
- const snappedToPackages = (0, unwrap_1.unwrap)(versionGroup.getSnappedToPackages()).join(' || ');
95
- const version = (0, unwrap_2.unwrap)(instanceGroup.getExpectedVersion());
96
- log.invalid(name, (0, chalk_1.default) `should snap to {reset.green ${version}}, used by ${snappedToPackages}`);
97
- // Log each of the dependencies mismatches
98
- instanceGroup.instances.forEach((instance) => {
99
- if (instance.version !== snappedVersion) {
100
- logVersionMismatch(instance);
101
- }
102
- });
103
- }
104
- function logWorkspaceMismatch(instanceGroup) {
105
- const name = instanceGroup.name;
106
- const workspaceInstance = (0, unwrap_2.unwrap)(instanceGroup.getWorkspaceInstance());
107
- const shortPath = workspaceInstance?.packageJsonFile.shortPath;
108
- const expected = (0, unwrap_2.unwrap)(instanceGroup.getExpectedVersion());
109
- log.invalid(name, (0, chalk_1.default) `{reset.green ${expected}} {dim is developed in this repo at ${shortPath}}`);
110
- // Log each of the dependencies mismatches
111
- instanceGroup.instances.forEach((instance) => {
112
- if (instance.version !== expected) {
113
- logVersionMismatch(instance);
114
- }
115
- });
116
- }
117
- function logHighLowVersionMismatch(instanceGroup) {
118
- const name = instanceGroup.name;
119
- const preference = instanceGroup.versionGroup
120
- .groupConfig.preferVersion;
121
- const direction = preference === 'highestSemver' ? 'highest' : 'lowest';
122
- const expected = (0, unwrap_2.unwrap)(instanceGroup.getExpectedVersion());
123
- log.invalid(name, (0, chalk_1.default) `{reset.green ${expected}} {dim is the ${direction} valid semver version in use}`);
124
- // Log each of the dependencies mismatches
125
- instanceGroup.instances.forEach((instance) => {
126
- if (instance.version !== expected) {
127
- logVersionMismatch(instance);
128
- }
129
- });
130
- }
131
- function logVersionMismatch(instance) {
132
- const type = instance.pathDef.path;
133
- const shortPath = instance.packageJsonFile.shortPath;
134
- const actual = instance.version;
135
- console.log((0, chalk_1.default) ` {red ${actual}} {dim in ${type} of ${shortPath}}`);
136
- }
137
- function logUnsupportedVersionMismatch(instance) {
138
- const type = instance.pathDef.path;
139
- const shortPath = instance.packageJsonFile.shortPath;
140
- const actual = instance.version;
141
- console.log((0, chalk_1.default) ` {yellow ${actual}} {dim in ${type} of ${shortPath}}`);
142
- }
143
109
  }
144
110
  exports.listMismatches = listMismatches;
@@ -1,3 +1,3 @@
1
+ import type { CliConfig } from '../config/types';
1
2
  import type { Disk } from '../lib/disk';
2
- import type { Syncpack } from '../types';
3
- export declare function setSemverRangesCli(input: Partial<Syncpack.Config.Cli>, disk: Disk): void;
3
+ export declare function setSemverRangesCli(input: Partial<CliConfig>, disk: Disk): void;
@@ -1,10 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.setSemverRangesCli = void 0;
4
+ const pipe_1 = require("tightrope/fn/pipe");
4
5
  const get_context_1 = require("../get-context");
5
6
  const write_if_changed_1 = require("../lib/write-if-changed");
6
7
  const set_semver_ranges_1 = require("./set-semver-ranges");
7
8
  function setSemverRangesCli(input, disk) {
8
- (0, write_if_changed_1.writeIfChanged)((0, set_semver_ranges_1.setSemverRanges)((0, get_context_1.getContext)(input, disk)));
9
+ (0, pipe_1.pipe)((0, get_context_1.getContext)(input, disk), set_semver_ranges_1.setSemverRanges, write_if_changed_1.writeIfChanged);
9
10
  }
10
11
  exports.setSemverRangesCli = setSemverRangesCli;
@@ -1,2 +1,2 @@
1
- import type { Syncpack } from '../types';
2
- export declare const setSemverRanges: (ctx: Syncpack.Ctx) => Syncpack.Ctx;
1
+ import type { Context } from '../get-context';
2
+ export declare const setSemverRanges: (ctx: Context) => Context;
@@ -1,10 +1,24 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.setSemverRanges = void 0;
4
+ const get_semver_groups_1 = require("../get-semver-groups");
4
5
  const setSemverRanges = (ctx) => {
5
- ctx.semverGroups.forEach((semverGroup) => {
6
- semverGroup.instances.forEach((instance) => {
7
- instance.setVersion(semverGroup.getExpectedVersion(instance));
6
+ (0, get_semver_groups_1.getSemverGroups)(ctx).forEach((semverGroup) => {
7
+ semverGroup.inspect().forEach((report) => {
8
+ switch (report.status) {
9
+ case 'WORKSPACE_SEMVER_RANGE_MISMATCH':
10
+ case 'SEMVER_RANGE_MISMATCH': {
11
+ report.instance.setVersion(report.expectedVersion);
12
+ break;
13
+ }
14
+ case 'FILTERED_OUT':
15
+ case 'IGNORED':
16
+ case 'UNSUPPORTED_VERSION':
17
+ case 'VALID': {
18
+ // no action needed
19
+ break;
20
+ }
21
+ }
8
22
  });
9
23
  });
10
24
  return ctx;
package/dist/bin.js CHANGED
@@ -9,6 +9,9 @@ commander_1.program
9
9
  })
10
10
  .command('format', 'sort and shorten properties according to a convention', {
11
11
  executableFile: './bin-format/index.js',
12
+ })
13
+ .command('lint', 'lint all versions and ranges', {
14
+ executableFile: './bin-lint/index.js',
12
15
  })
13
16
  .command('lint-semver-ranges', 'check dependency versions comply with the given semver range format', {
14
17
  executableFile: './bin-lint-semver-ranges/index.js',
@@ -0,0 +1,9 @@
1
+ import type { Context } from '../get-context';
2
+ import { NameAndVersionPropsStrategy } from '../strategy/name-and-version-props';
3
+ import { NamedVersionStringStrategy } from '../strategy/named-version-string';
4
+ import { UnnamedVersionStringStrategy } from '../strategy/unnamed-version-string';
5
+ import { VersionsByNameStrategy } from '../strategy/versions-by-name';
6
+ export declare namespace Strategy {
7
+ type Any = NameAndVersionPropsStrategy | NamedVersionStringStrategy | UnnamedVersionStringStrategy | VersionsByNameStrategy;
8
+ }
9
+ export declare function getCustomTypes({ rcFile }: Context['config']): Strategy.Any[];
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getCustomTypes = void 0;
4
+ const is_non_empty_object_1 = require("tightrope/guard/is-non-empty-object");
5
+ const is_non_empty_string_1 = require("tightrope/guard/is-non-empty-string");
6
+ const is_object_1 = require("tightrope/guard/is-object");
7
+ const name_and_version_props_1 = require("../strategy/name-and-version-props");
8
+ const named_version_string_1 = require("../strategy/named-version-string");
9
+ const unnamed_version_string_1 = require("../strategy/unnamed-version-string");
10
+ const versions_by_name_1 = require("../strategy/versions-by-name");
11
+ function getCustomTypes({ rcFile }) {
12
+ if (!(0, is_non_empty_object_1.isNonEmptyObject)(rcFile.customTypes))
13
+ return [];
14
+ const ERR_OBJ = new Error('Invalid customType');
15
+ const ERR_NAME = new Error('Invalid customType name');
16
+ const ERR_PATH = new Error('Invalid customType.path');
17
+ const ERR_NAME_PATH = new Error('Invalid customType namePath');
18
+ const ERR_STRATEGY = new Error('Invalid customType.strategy');
19
+ return Object.entries(rcFile.customTypes).map(([name, config]) => {
20
+ if (!(0, is_object_1.isObject)(config))
21
+ throw ERR_OBJ;
22
+ if (!(0, is_non_empty_string_1.isNonEmptyString)(name))
23
+ throw ERR_NAME;
24
+ if (!(0, is_non_empty_string_1.isNonEmptyString)(config.path))
25
+ throw ERR_PATH;
26
+ const path = config.path;
27
+ const strategy = config.strategy;
28
+ switch (strategy) {
29
+ case 'name~version': {
30
+ const namePath = config.namePath;
31
+ if (!(0, is_non_empty_string_1.isNonEmptyString)(namePath))
32
+ throw ERR_NAME_PATH;
33
+ return new name_and_version_props_1.NameAndVersionPropsStrategy(name, path, namePath);
34
+ }
35
+ case 'name@version': {
36
+ return new named_version_string_1.NamedVersionStringStrategy(name, path);
37
+ }
38
+ case 'version': {
39
+ return new unnamed_version_string_1.UnnamedVersionStringStrategy(name, path);
40
+ }
41
+ case 'versionsByName': {
42
+ return new versions_by_name_1.VersionsByNameStrategy(name, path);
43
+ }
44
+ default:
45
+ throw ERR_STRATEGY;
46
+ }
47
+ });
48
+ }
49
+ exports.getCustomTypes = getCustomTypes;
@@ -0,0 +1,3 @@
1
+ import type { Context } from '../get-context';
2
+ import type { Strategy } from './get-custom-types';
3
+ export declare function getEnabledTypes({ cli, rcFile, }: Context['config']): Strategy.Any[];
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getEnabledTypes = void 0;
4
+ const is_array_of_strings_1 = require("tightrope/guard/is-array-of-strings");
5
+ const is_empty_array_1 = require("tightrope/guard/is-empty-array");
6
+ const is_non_empty_string_1 = require("tightrope/guard/is-non-empty-string");
7
+ const name_and_version_props_1 = require("../strategy/name-and-version-props");
8
+ const versions_by_name_1 = require("../strategy/versions-by-name");
9
+ const get_custom_types_1 = require("./get-custom-types");
10
+ function getEnabledTypes({ cli, rcFile, }) {
11
+ const enabledTypes = [];
12
+ const enabledTypeNames = ((0, is_non_empty_string_1.isNonEmptyString)(cli.types)
13
+ ? cli.types.split(',')
14
+ : (0, is_array_of_strings_1.isArrayOfStrings)(rcFile.dependencyTypes)
15
+ ? rcFile.dependencyTypes
16
+ : []).filter(is_non_empty_string_1.isNonEmptyString);
17
+ // @TODO accept `dependencyTypes: ['**']`
18
+ // @TODO support `dependencyTypes: ['!dev']`
19
+ const useDefaults = (0, is_empty_array_1.isEmptyArray)(enabledTypeNames);
20
+ if (useDefaults || enabledTypeNames.includes('dev')) {
21
+ enabledTypes.push(new versions_by_name_1.VersionsByNameStrategy('dev', 'devDependencies'));
22
+ }
23
+ if (useDefaults || enabledTypeNames.includes('overrides')) {
24
+ enabledTypes.push(new versions_by_name_1.VersionsByNameStrategy('overrides', 'overrides'));
25
+ }
26
+ if (useDefaults || enabledTypeNames.includes('peer')) {
27
+ enabledTypes.push(new versions_by_name_1.VersionsByNameStrategy('peer', 'peerDependencies'));
28
+ }
29
+ if (useDefaults || enabledTypeNames.includes('pnpmOverrides')) {
30
+ enabledTypes.push(new versions_by_name_1.VersionsByNameStrategy('pnpmOverrides', 'pnpm.overrides'));
31
+ }
32
+ if (useDefaults || enabledTypeNames.includes('prod')) {
33
+ enabledTypes.push(new versions_by_name_1.VersionsByNameStrategy('prod', 'dependencies'));
34
+ }
35
+ if (useDefaults || enabledTypeNames.includes('resolutions')) {
36
+ enabledTypes.push(new versions_by_name_1.VersionsByNameStrategy('resolutions', 'resolutions'));
37
+ }
38
+ if (useDefaults || enabledTypeNames.includes('workspace')) {
39
+ enabledTypes.push(new name_and_version_props_1.NameAndVersionPropsStrategy('workspace', 'version', 'name'));
40
+ }
41
+ (0, get_custom_types_1.getCustomTypes)({ cli, rcFile }).forEach((customType) => {
42
+ if (useDefaults || enabledTypeNames.includes(customType.name)) {
43
+ enabledTypes.push(customType);
44
+ }
45
+ });
46
+ return enabledTypes;
47
+ }
48
+ exports.getEnabledTypes = getEnabledTypes;
@@ -0,0 +1,2 @@
1
+ import type { Context } from '../get-context';
2
+ export declare function getFilter({ cli, rcFile }: Context['config']): string;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getFilter = void 0;
4
+ const is_non_empty_string_1 = require("tightrope/guard/is-non-empty-string");
5
+ function getFilter({ cli, rcFile }) {
6
+ // @TODO Deprecate `filter` in .syncpackrc
7
+ return (0, is_non_empty_string_1.isNonEmptyString)(cli.filter)
8
+ ? cli.filter
9
+ : (0, is_non_empty_string_1.isNonEmptyString)(rcFile.filter)
10
+ ? rcFile.filter
11
+ : '.';
12
+ }
13
+ exports.getFilter = getFilter;
@@ -0,0 +1,2 @@
1
+ import type { Context } from '../get-context';
2
+ export declare function getIndent({ cli, rcFile }: Context['config']): string;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getIndent = void 0;
4
+ const is_non_empty_string_1 = require("tightrope/guard/is-non-empty-string");
5
+ function getIndent({ cli, rcFile }) {
6
+ return (0, is_non_empty_string_1.isNonEmptyString)(cli.indent)
7
+ ? cli.indent
8
+ : (0, is_non_empty_string_1.isNonEmptyString)(rcFile.indent)
9
+ ? rcFile.indent
10
+ : ' ';
11
+ }
12
+ exports.getIndent = getIndent;
@@ -0,0 +1,3 @@
1
+ import type { Context } from '../get-context';
2
+ import type { SemverRange } from './types';
3
+ export declare function getSemverRange({ cli, rcFile, }: Context['config']): SemverRange;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getSemverRange = void 0;
4
+ const is_semver_1 = require("../lib/is-semver");
5
+ function getSemverRange({ cli, rcFile, }) {
6
+ return (0, is_semver_1.isValidSemverRange)(cli.semverRange)
7
+ ? cli.semverRange
8
+ : (0, is_semver_1.isValidSemverRange)(rcFile.semverRange)
9
+ ? rcFile.semverRange
10
+ : '';
11
+ }
12
+ exports.getSemverRange = getSemverRange;
@@ -0,0 +1,2 @@
1
+ import type { Context } from '../get-context';
2
+ export declare function getSortAz({ rcFile }: Context['config']): string[];
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getSortAz = void 0;
4
+ const is_array_of_strings_1 = require("tightrope/guard/is-array-of-strings");
5
+ function getSortAz({ rcFile }) {
6
+ return (0, is_array_of_strings_1.isArrayOfStrings)(rcFile.sortAz)
7
+ ? rcFile.sortAz
8
+ : [
9
+ 'contributors',
10
+ 'dependencies',
11
+ 'devDependencies',
12
+ 'keywords',
13
+ 'peerDependencies',
14
+ 'resolutions',
15
+ 'scripts',
16
+ ];
17
+ }
18
+ exports.getSortAz = getSortAz;
@@ -0,0 +1,2 @@
1
+ import type { Context } from '../get-context';
2
+ export declare function getSortFirst({ rcFile }: Context['config']): string[];
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getSortFirst = void 0;
4
+ const is_array_of_strings_1 = require("tightrope/guard/is-array-of-strings");
5
+ function getSortFirst({ rcFile }) {
6
+ return (0, is_array_of_strings_1.isArrayOfStrings)(rcFile.sortFirst)
7
+ ? rcFile.sortFirst
8
+ : ['name', 'description', 'version', 'author'];
9
+ }
10
+ exports.getSortFirst = getSortFirst;
@@ -0,0 +1,2 @@
1
+ import type { Context } from '../get-context';
2
+ export declare function getSource({ cli, rcFile }: Context['config']): string[];