syncpack 11.2.1 → 12.0.0-alpha.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.
Files changed (274) hide show
  1. package/README.md +24 -26
  2. package/dist/bin-fix-mismatches/fix-mismatches.d.ts +15 -3
  3. package/dist/bin-fix-mismatches/fix-mismatches.js +124 -35
  4. package/dist/bin-fix-mismatches/index.js +12 -32
  5. package/dist/bin-format/format.d.ts +11 -3
  6. package/dist/bin-format/format.js +51 -61
  7. package/dist/bin-format/index.js +11 -31
  8. package/dist/bin-lint/index.js +8 -28
  9. package/dist/bin-lint/lint.d.ts +10 -3
  10. package/dist/bin-lint/lint.js +11 -35
  11. package/dist/bin-lint-semver-ranges/index.js +11 -39
  12. package/dist/bin-lint-semver-ranges/lint-semver-ranges.d.ts +15 -3
  13. package/dist/bin-lint-semver-ranges/lint-semver-ranges.js +93 -34
  14. package/dist/bin-list/index.js +11 -31
  15. package/dist/bin-list/list.d.ts +11 -3
  16. package/dist/bin-list/list.js +120 -34
  17. package/dist/bin-list-mismatches/index.js +11 -31
  18. package/dist/bin-list-mismatches/list-mismatches.d.ts +18 -3
  19. package/dist/bin-list-mismatches/list-mismatches.js +253 -34
  20. package/dist/bin-prompt/index.js +15 -31
  21. package/dist/bin-prompt/prompt.d.ts +10 -3
  22. package/dist/bin-prompt/prompt.js +87 -33
  23. package/dist/bin-set-semver-ranges/index.js +12 -40
  24. package/dist/bin-set-semver-ranges/set-semver-ranges.d.ts +10 -3
  25. package/dist/bin-set-semver-ranges/set-semver-ranges.js +54 -35
  26. package/dist/bin-update/effects.d.ts +45 -5
  27. package/dist/bin-update/effects.js +214 -128
  28. package/dist/bin-update/index.js +4 -27
  29. package/dist/bin-update/update.d.ts +5 -3
  30. package/dist/bin-update/update.js +56 -37
  31. package/dist/bin.js +0 -1
  32. package/dist/config/get-custom-types.d.ts +11 -1
  33. package/dist/config/get-custom-types.js +26 -21
  34. package/dist/config/get-enabled-types.d.ts +7 -8
  35. package/dist/config/get-enabled-types.js +63 -73
  36. package/dist/config/get-indent.js +1 -1
  37. package/dist/config/tag.d.ts +1 -1
  38. package/dist/config/tag.js +2 -25
  39. package/dist/config/types.d.ts +8 -9
  40. package/dist/constants.d.ts +2 -1
  41. package/dist/constants.js +2 -1
  42. package/dist/error-handlers/default-error-handlers.d.ts +25 -2
  43. package/dist/error-handlers/default-error-handlers.js +60 -36
  44. package/dist/get-context/index.d.ts +12 -6
  45. package/dist/get-context/index.js +13 -30
  46. package/dist/get-context/lib/key-by.d.ts +6 -0
  47. package/dist/get-context/lib/key-by.js +16 -0
  48. package/dist/get-instances/index.d.ts +14 -0
  49. package/dist/get-instances/index.js +46 -0
  50. package/dist/get-instances/instance.d.ts +25 -0
  51. package/dist/get-instances/instance.js +34 -0
  52. package/dist/get-package-json-files/get-file-paths.d.ts +6 -7
  53. package/dist/get-package-json-files/get-file-paths.js +10 -33
  54. package/dist/get-package-json-files/get-patterns/get-lerna-patterns.d.ts +3 -4
  55. package/dist/get-package-json-files/get-patterns/get-lerna-patterns.js +6 -32
  56. package/dist/get-package-json-files/get-patterns/get-pnpm-patterns.d.ts +3 -4
  57. package/dist/get-package-json-files/get-patterns/get-pnpm-patterns.js +6 -32
  58. package/dist/get-package-json-files/get-patterns/get-yarn-patterns.d.ts +3 -4
  59. package/dist/get-package-json-files/get-patterns/get-yarn-patterns.js +11 -40
  60. package/dist/get-package-json-files/get-patterns/index.d.ts +3 -5
  61. package/dist/get-package-json-files/get-patterns/index.js +6 -33
  62. package/dist/get-package-json-files/index.d.ts +6 -5
  63. package/dist/get-package-json-files/index.js +4 -28
  64. package/dist/get-package-json-files/package-json-file.d.ts +16 -16
  65. package/dist/get-package-json-files/package-json-file.js +21 -18
  66. package/dist/guards/can-add-to-group.d.ts +5 -4
  67. package/dist/guards/can-add-to-group.js +8 -4
  68. package/dist/guards/is-semver.d.ts +1 -1
  69. package/dist/guards/is-semver.js +1 -1
  70. package/dist/guards/is-valid-semver-range.d.ts +1 -1
  71. package/dist/guards/is-valid-semver-range.js +1 -1
  72. package/dist/io/ask-for-choice.d.ts +14 -0
  73. package/dist/io/ask-for-choice.js +21 -0
  74. package/dist/io/ask-for-input.d.ts +13 -0
  75. package/dist/io/ask-for-input.js +18 -0
  76. package/dist/io/exit-if-invalid.d.ts +4 -0
  77. package/dist/io/exit-if-invalid.js +13 -0
  78. package/dist/io/glob-sync.d.ts +11 -0
  79. package/dist/io/glob-sync.js +19 -0
  80. package/dist/io/index.d.ts +28 -0
  81. package/dist/{env/exit-if-invalid.js → io/index.js} +27 -9
  82. package/dist/io/read-config-file-sync.d.ts +7 -0
  83. package/dist/io/read-config-file-sync.js +26 -0
  84. package/dist/io/read-file-sync.d.ts +12 -0
  85. package/dist/io/read-file-sync.js +14 -0
  86. package/dist/io/read-json-file-sync.d.ts +30 -0
  87. package/dist/io/read-json-file-sync.js +25 -0
  88. package/dist/io/read-yaml-file-sync.d.ts +12 -0
  89. package/dist/io/read-yaml-file-sync.js +13 -0
  90. package/dist/io/write-file-sync.d.ts +12 -0
  91. package/dist/io/write-file-sync.js +15 -0
  92. package/dist/{env → io}/write-if-changed.d.ts +4 -4
  93. package/dist/io/write-if-changed.js +45 -0
  94. package/dist/lib/get-group-header.d.ts +10 -0
  95. package/dist/lib/get-group-header.js +31 -0
  96. package/dist/lib/get.d.ts +11 -0
  97. package/dist/lib/get.js +40 -0
  98. package/dist/lib/pad-start.d.ts +1 -0
  99. package/dist/lib/pad-start.js +7 -0
  100. package/dist/lib/ring-buffer.d.ts +10 -0
  101. package/dist/lib/ring-buffer.js +24 -0
  102. package/dist/lib/set-semver-range.d.ts +1 -1
  103. package/dist/lib/set-semver-range.js +7 -11
  104. package/dist/lib/with-logger.d.ts +2 -0
  105. package/dist/lib/with-logger.js +35 -0
  106. package/dist/option.d.ts +0 -1
  107. package/dist/option.js +0 -4
  108. package/dist/report.d.ts +166 -0
  109. package/dist/report.js +67 -0
  110. package/dist/schema.json +51 -20
  111. package/dist/semver-group/create-semver-groups.d.ts +4 -0
  112. package/dist/semver-group/create-semver-groups.js +77 -0
  113. package/dist/semver-group/disabled.d.ts +26 -0
  114. package/dist/semver-group/disabled.js +34 -0
  115. package/dist/semver-group/filtered-out.d.ts +27 -0
  116. package/dist/semver-group/filtered-out.js +40 -0
  117. package/dist/semver-group/ignored.d.ts +22 -0
  118. package/dist/semver-group/ignored.js +30 -0
  119. package/dist/semver-group/index.d.ts +22 -0
  120. package/dist/semver-group/index.js +10 -0
  121. package/dist/semver-group/with-range.d.ts +22 -0
  122. package/dist/semver-group/with-range.js +57 -0
  123. package/dist/specifier/alias.d.ts +15 -0
  124. package/dist/specifier/alias.js +22 -0
  125. package/dist/specifier/base.d.ts +39 -0
  126. package/dist/specifier/base.js +56 -0
  127. package/dist/specifier/delete.d.ts +15 -0
  128. package/dist/specifier/delete.js +18 -0
  129. package/dist/specifier/file.d.ts +6 -0
  130. package/dist/specifier/file.js +9 -0
  131. package/dist/specifier/hosted-git.d.ts +13 -0
  132. package/dist/specifier/hosted-git.js +24 -0
  133. package/dist/specifier/index.d.ts +27 -0
  134. package/dist/specifier/index.js +62 -0
  135. package/dist/specifier/lib/non-semver-error.d.ts +11 -0
  136. package/dist/specifier/lib/non-semver-error.js +10 -0
  137. package/dist/specifier/lib/parse-specifier.d.ts +14 -0
  138. package/dist/specifier/lib/parse-specifier.js +23 -0
  139. package/dist/specifier/lib/specific-registry-result.d.ts +9 -0
  140. package/dist/specifier/range.d.ts +18 -0
  141. package/dist/specifier/range.js +23 -0
  142. package/dist/specifier/tag.d.ts +9 -0
  143. package/dist/specifier/tag.js +12 -0
  144. package/dist/specifier/unsupported.d.ts +5 -0
  145. package/dist/specifier/unsupported.js +9 -0
  146. package/dist/specifier/url.d.ts +6 -0
  147. package/dist/specifier/url.js +9 -0
  148. package/dist/specifier/version.d.ts +18 -0
  149. package/dist/specifier/version.js +23 -0
  150. package/dist/specifier/workspace-protocol.d.ts +17 -0
  151. package/dist/specifier/workspace-protocol.js +35 -0
  152. package/dist/strategy/lib/get-non-empty-string-prop.d.ts +2 -2
  153. package/dist/strategy/lib/get-non-empty-string-prop.js +4 -5
  154. package/dist/strategy/name-and-version-props.d.ts +4 -4
  155. package/dist/strategy/name-and-version-props.js +36 -22
  156. package/dist/strategy/named-version-string.d.ts +4 -4
  157. package/dist/strategy/named-version-string.js +25 -25
  158. package/dist/strategy/unnamed-version-string.d.ts +4 -4
  159. package/dist/strategy/unnamed-version-string.js +23 -22
  160. package/dist/strategy/versions-by-name.d.ts +4 -4
  161. package/dist/strategy/versions-by-name.js +12 -12
  162. package/dist/version-group/banned.d.ts +17 -0
  163. package/dist/version-group/banned.js +32 -0
  164. package/dist/version-group/create-version-groups.d.ts +4 -0
  165. package/dist/version-group/create-version-groups.js +107 -0
  166. package/dist/version-group/filtered-out.d.ts +19 -0
  167. package/dist/version-group/filtered-out.js +34 -0
  168. package/dist/version-group/ignored.d.ts +17 -0
  169. package/dist/version-group/ignored.js +27 -0
  170. package/dist/version-group/index.d.ts +28 -0
  171. package/dist/version-group/index.js +10 -0
  172. package/dist/version-group/lib/get-highest-version.d.ts +6 -0
  173. package/dist/version-group/lib/get-highest-version.js +12 -0
  174. package/dist/version-group/lib/get-lowest-version.d.ts +6 -0
  175. package/dist/version-group/lib/get-lowest-version.js +12 -0
  176. package/dist/version-group/lib/get-preferred-version.d.ts +5 -0
  177. package/dist/{get-version-groups/lib/compare-semver.js → version-group/lib/get-preferred-version.js} +14 -2
  178. package/dist/version-group/lib/group-by.d.ts +5 -0
  179. package/dist/{get-version-groups → version-group}/lib/group-by.js +4 -0
  180. package/dist/version-group/pinned.d.ts +17 -0
  181. package/dist/version-group/pinned.js +30 -0
  182. package/dist/version-group/same-range.d.ts +19 -0
  183. package/dist/version-group/same-range.js +108 -0
  184. package/dist/version-group/snapped-to.d.ts +17 -0
  185. package/dist/version-group/snapped-to.js +83 -0
  186. package/dist/version-group/standard.d.ts +18 -0
  187. package/dist/version-group/standard.js +131 -0
  188. package/package.json +33 -33
  189. package/dist/bin-fix-mismatches/effects.d.ts +0 -2
  190. package/dist/bin-fix-mismatches/effects.js +0 -112
  191. package/dist/bin-format/format-cli.d.ts +0 -4
  192. package/dist/bin-format/format-cli.js +0 -42
  193. package/dist/bin-lint-semver-ranges/effects.d.ts +0 -2
  194. package/dist/bin-lint-semver-ranges/effects.js +0 -70
  195. package/dist/bin-list/effects.d.ts +0 -2
  196. package/dist/bin-list/effects.js +0 -114
  197. package/dist/bin-list-mismatches/effects.d.ts +0 -2
  198. package/dist/bin-list-mismatches/effects.js +0 -136
  199. package/dist/bin-prompt/effects.d.ts +0 -2
  200. package/dist/bin-prompt/effects.js +0 -110
  201. package/dist/bin-set-semver-ranges/effects.d.ts +0 -2
  202. package/dist/bin-set-semver-ranges/effects.js +0 -61
  203. package/dist/config/get-semver-range.d.ts +0 -3
  204. package/dist/config/get-semver-range.js +0 -12
  205. package/dist/create-program/effects.d.ts +0 -40
  206. package/dist/create-program/semver-ranges.d.ts +0 -7
  207. package/dist/create-program/semver-ranges.js +0 -55
  208. package/dist/create-program/versions.d.ts +0 -7
  209. package/dist/create-program/versions.js +0 -70
  210. package/dist/env/create-env.d.ts +0 -21
  211. package/dist/env/create-env.js +0 -81
  212. package/dist/env/default-env.d.ts +0 -18
  213. package/dist/env/default-env.js +0 -100
  214. package/dist/env/exit-if-invalid.d.ts +0 -4
  215. package/dist/env/tags.d.ts +0 -58
  216. package/dist/env/tags.js +0 -50
  217. package/dist/env/write-if-changed.js +0 -73
  218. package/dist/error-handlers/create-error-handlers.d.ts +0 -20
  219. package/dist/error-handlers/create-error-handlers.js +0 -60
  220. package/dist/get-package-json-files/get-patterns/read-json-safe.d.ts +0 -23
  221. package/dist/get-package-json-files/get-patterns/read-json-safe.js +0 -43
  222. package/dist/get-semver-groups/filtered-out.d.ts +0 -19
  223. package/dist/get-semver-groups/filtered-out.js +0 -55
  224. package/dist/get-semver-groups/ignored.d.ts +0 -17
  225. package/dist/get-semver-groups/ignored.js +0 -48
  226. package/dist/get-semver-groups/index.d.ts +0 -84
  227. package/dist/get-semver-groups/index.js +0 -139
  228. package/dist/get-semver-groups/with-range.d.ts +0 -18
  229. package/dist/get-semver-groups/with-range.js +0 -79
  230. package/dist/get-version-groups/banned.d.ts +0 -17
  231. package/dist/get-version-groups/banned.js +0 -50
  232. package/dist/get-version-groups/filtered-out.d.ts +0 -19
  233. package/dist/get-version-groups/filtered-out.js +0 -57
  234. package/dist/get-version-groups/ignored.d.ts +0 -17
  235. package/dist/get-version-groups/ignored.js +0 -50
  236. package/dist/get-version-groups/index.d.ts +0 -187
  237. package/dist/get-version-groups/index.js +0 -246
  238. package/dist/get-version-groups/lib/compare-semver.d.ts +0 -1
  239. package/dist/get-version-groups/lib/get-highest-version.d.ts +0 -2
  240. package/dist/get-version-groups/lib/get-highest-version.js +0 -13
  241. package/dist/get-version-groups/lib/get-lowest-version.d.ts +0 -2
  242. package/dist/get-version-groups/lib/get-lowest-version.js +0 -13
  243. package/dist/get-version-groups/lib/get-unique-specifiers.d.ts +0 -2
  244. package/dist/get-version-groups/lib/get-unique-specifiers.js +0 -11
  245. package/dist/get-version-groups/lib/group-by.d.ts +0 -1
  246. package/dist/get-version-groups/pinned.d.ts +0 -17
  247. package/dist/get-version-groups/pinned.js +0 -66
  248. package/dist/get-version-groups/same-range.d.ts +0 -17
  249. package/dist/get-version-groups/same-range.js +0 -73
  250. package/dist/get-version-groups/snapped-to.d.ts +0 -17
  251. package/dist/get-version-groups/snapped-to.js +0 -78
  252. package/dist/get-version-groups/standard.d.ts +0 -18
  253. package/dist/get-version-groups/standard.js +0 -109
  254. package/dist/guards/is-loose-semver.d.ts +0 -2
  255. package/dist/guards/is-loose-semver.js +0 -10
  256. package/dist/instance/create.d.ts +0 -4
  257. package/dist/instance/create.js +0 -142
  258. package/dist/instance/index.d.ts +0 -122
  259. package/dist/instance/index.js +0 -154
  260. package/dist/lib/$R.d.ts +0 -12
  261. package/dist/lib/$R.js +0 -34
  262. package/dist/lib/log-group-header.d.ts +0 -6
  263. package/dist/lib/log-group-header.js +0 -34
  264. package/dist/lib/log-verbose.d.ts +0 -1
  265. package/dist/lib/log-verbose.js +0 -24
  266. package/dist/lib/split-name-and-version.d.ts +0 -5
  267. package/dist/lib/split-name-and-version.js +0 -12
  268. /package/dist/{create-program/effects.js → specifier/lib/specific-registry-result.js} +0 -0
  269. /package/dist/{get-version-groups → version-group}/lib/clean.d.ts +0 -0
  270. /package/dist/{get-version-groups → version-group}/lib/clean.js +0 -0
  271. /package/dist/{get-version-groups → version-group}/lib/delete.d.ts +0 -0
  272. /package/dist/{get-version-groups → version-group}/lib/delete.js +0 -0
  273. /package/dist/{get-version-groups → version-group}/lib/get-range-score.d.ts +0 -0
  274. /package/dist/{get-version-groups → version-group}/lib/get-range-score.js +0 -0
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VersionGroup = void 0;
4
+ const effect_1 = require("effect");
5
+ var VersionGroup;
6
+ (function (VersionGroup) {
7
+ class ConfigError extends effect_1.Data.TaggedClass('VersionGroupConfigError') {
8
+ }
9
+ VersionGroup.ConfigError = ConfigError;
10
+ })(VersionGroup || (exports.VersionGroup = VersionGroup = {}));
@@ -0,0 +1,6 @@
1
+ import type { Specifier } from '../../specifier';
2
+ /**
3
+ * From an array of instances where every instance contains a valid semver
4
+ * version, return the highest version number
5
+ */
6
+ export declare function getHighestVersion(specifiers: Specifier.Any[]): import("effect/Effect").Effect<never, import("../../specifier/lib/non-semver-error").NonSemverError, Specifier.Any>;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getHighestVersion = void 0;
4
+ const get_preferred_version_1 = require("./get-preferred-version");
5
+ /**
6
+ * From an array of instances where every instance contains a valid semver
7
+ * version, return the highest version number
8
+ */
9
+ function getHighestVersion(specifiers) {
10
+ return (0, get_preferred_version_1.getPreferredVersion)('highestSemver', specifiers);
11
+ }
12
+ exports.getHighestVersion = getHighestVersion;
@@ -0,0 +1,6 @@
1
+ import type { Specifier } from '../../specifier';
2
+ /**
3
+ * From an array of instances where every instance contains a valid semver
4
+ * version, return the lowest version number
5
+ */
6
+ export declare function getLowestVersion(specifiers: Specifier.Any[]): import("effect/Effect").Effect<never, import("../../specifier/lib/non-semver-error").NonSemverError, Specifier.Any>;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getLowestVersion = void 0;
4
+ const get_preferred_version_1 = require("./get-preferred-version");
5
+ /**
6
+ * From an array of instances where every instance contains a valid semver
7
+ * version, return the lowest version number
8
+ */
9
+ function getLowestVersion(specifiers) {
10
+ return (0, get_preferred_version_1.getPreferredVersion)('lowestSemver', specifiers);
11
+ }
12
+ exports.getLowestVersion = getLowestVersion;
@@ -0,0 +1,5 @@
1
+ import { Effect } from 'effect';
2
+ import type { VersionGroupConfig } from '../../config/types';
3
+ import type { Specifier } from '../../specifier';
4
+ import type { NonSemverError } from '../../specifier/lib/non-semver-error';
5
+ export declare function getPreferredVersion(preferVersion: VersionGroupConfig.Standard['preferVersion'], specifiers: Specifier.Any[]): Effect.Effect<never, NonSemverError, Specifier.Any>;
@@ -3,11 +3,24 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.compareSemver = void 0;
6
+ exports.getPreferredVersion = void 0;
7
+ const effect_1 = require("effect");
7
8
  const gt_1 = __importDefault(require("semver/functions/gt"));
8
9
  const lt_1 = __importDefault(require("semver/functions/lt"));
9
10
  const clean_1 = require("./clean");
10
11
  const get_range_score_1 = require("./get-range-score");
12
+ function getPreferredVersion(preferVersion, specifiers) {
13
+ return (0, effect_1.pipe)(
14
+ // every instance must have a semver version
15
+ effect_1.Effect.all(specifiers.map((specifier) => (0, effect_1.pipe)(specifier.getSemver(), effect_1.Effect.map((semver) => ({ semver, specifier }))))),
16
+ // comparing semver can error on some loose ranges, all must succeed
17
+ effect_1.Effect.map((semvers) => semvers.sort((a, b) => compareSemver(a.semver, b.semver))),
18
+ // get the preferred value from the list
19
+ effect_1.Effect.map((sorted) => sorted[preferVersion === 'lowestSemver' ? 0 : sorted.length - 1]),
20
+ // return just the specifier
21
+ effect_1.Effect.map((preferred) => preferred?.specifier));
22
+ }
23
+ exports.getPreferredVersion = getPreferredVersion;
11
24
  const EQ = 0;
12
25
  const LT = -1;
13
26
  const GT = 1;
@@ -36,4 +49,3 @@ function compareSemver(a, b) {
36
49
  return GT;
37
50
  return EQ;
38
51
  }
39
- exports.compareSemver = compareSemver;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Convert an array of objects to an object, where each property of the new
3
+ * object is an array whose members share the same value for the given key.
4
+ */
5
+ export declare function groupBy<A extends any[]>(key: string, array: A): Record<string, A>;
@@ -1,6 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.groupBy = void 0;
4
+ /**
5
+ * Convert an array of objects to an object, where each property of the new
6
+ * object is an array whose members share the same value for the given key.
7
+ */
4
8
  function groupBy(key, array) {
5
9
  return array.reduce((objectsByKeyValue, obj) => {
6
10
  const value = obj[key];
@@ -0,0 +1,17 @@
1
+ import { Data, Effect } from 'effect';
2
+ import type { VersionGroupConfig } from '../config/types';
3
+ import type { Instance } from '../get-instances/instance';
4
+ import { Report } from '../report';
5
+ declare const PinnedVersionGroup_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<Omit<A, keyof import("effect/Equal").Equal>, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" | keyof import("effect/Equal").Equal ? never : P]: A[P]; }) => Data.Data<Readonly<A> & {
6
+ readonly _tag: "Pinned";
7
+ }>;
8
+ export declare class PinnedVersionGroup extends PinnedVersionGroup_base<{
9
+ config: VersionGroupConfig.Pinned;
10
+ instances: Instance[];
11
+ }> {
12
+ groupType: string;
13
+ constructor(config: VersionGroupConfig.Pinned);
14
+ canAdd(_: Instance): boolean;
15
+ inspectAll(): Effect.Effect<never, never, Report.Version.Group[]>;
16
+ }
17
+ export {};
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PinnedVersionGroup = void 0;
4
+ const effect_1 = require("effect");
5
+ const report_1 = require("../report");
6
+ const specifier_1 = require("../specifier");
7
+ const group_by_1 = require("./lib/group-by");
8
+ class PinnedVersionGroup extends effect_1.Data.TaggedClass('Pinned') {
9
+ groupType = 'versionGroup';
10
+ constructor(config) {
11
+ super({
12
+ config,
13
+ instances: [],
14
+ });
15
+ }
16
+ canAdd(_) {
17
+ return true;
18
+ }
19
+ inspectAll() {
20
+ return effect_1.Effect.all(Object.entries((0, group_by_1.groupBy)('name', this.instances)).map(([name, instances]) => (0, effect_1.pipe)(instances, effect_1.Effect.forEach((instance) => (0, effect_1.pipe)(effect_1.Effect.succeed(specifier_1.Specifier.create(instance, this.config.pinVersion)), effect_1.Effect.map((expected) => instance.rawSpecifier === expected.raw
21
+ ? // ✓ pinned takes precedence over any semver group
22
+ // ✓ current version matches expected
23
+ new report_1.Report.Valid({ specifier: expected })
24
+ : // ✓ pinned takes precedence over any semver group
25
+ // ✘ current version mismatches expected
26
+ // ✓ is a mismatch we can auto-fix
27
+ new report_1.Report.PinnedMismatch({ fixable: expected })))), effect_1.Effect.map((reports) => ({ name, reports })))));
28
+ }
29
+ }
30
+ exports.PinnedVersionGroup = PinnedVersionGroup;
@@ -0,0 +1,19 @@
1
+ import { Data, Effect } from 'effect';
2
+ import type { VersionGroupConfig } from '../config/types';
3
+ import type { Ctx } from '../get-context';
4
+ import type { Instance } from '../get-instances/instance';
5
+ import { Report } from '../report';
6
+ declare const SameRangeVersionGroup_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<Omit<A, keyof import("effect/Equal").Equal>, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" | keyof import("effect/Equal").Equal ? never : P]: A[P]; }) => Data.Data<Readonly<A> & {
7
+ readonly _tag: "SameRange";
8
+ }>;
9
+ export declare class SameRangeVersionGroup extends SameRangeVersionGroup_base<{
10
+ ctx: Ctx;
11
+ config: VersionGroupConfig.SameRange;
12
+ instances: Instance[];
13
+ }> {
14
+ groupType: string;
15
+ constructor(ctx: Ctx, config: VersionGroupConfig.SameRange);
16
+ canAdd(_: Instance): boolean;
17
+ inspectAll(): Effect.Effect<never, never, Report.Version.Group[]>;
18
+ }
19
+ export {};
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SameRangeVersionGroup = void 0;
7
+ const effect_1 = require("effect");
8
+ const intersects_1 = __importDefault(require("semver/ranges/intersects"));
9
+ const uniq_1 = require("tightrope/array/uniq");
10
+ const report_1 = require("../report");
11
+ const specifier_1 = require("../specifier");
12
+ const group_by_1 = require("./lib/group-by");
13
+ class SameRangeVersionGroup extends effect_1.Data.TaggedClass('SameRange') {
14
+ groupType = 'versionGroup';
15
+ constructor(ctx, config) {
16
+ super({
17
+ ctx,
18
+ config,
19
+ instances: [],
20
+ });
21
+ }
22
+ canAdd(_) {
23
+ return true;
24
+ }
25
+ inspectAll() {
26
+ return effect_1.Effect.all(Object.entries((0, group_by_1.groupBy)('name', this.instances)).flatMap(([name, instances]) => (0, effect_1.pipe)(instances, effect_1.Effect.partition((instance) => (0, effect_1.pipe)(effect_1.Effect.succeed(specifier_1.Specifier.create(instance, instance.rawSpecifier)), effect_1.Effect.flatMap((specifier) => (0, effect_1.pipe)(specifier.getSemver(), effect_1.Effect.matchEffect({
27
+ onFailure: () => effect_1.Effect.fail(
28
+ // ✘ expected version is not semver
29
+ // ✘ is a mismatch we can't auto-fix
30
+ new report_1.Report.UnsupportedMismatch({ unfixable: specifier.instance })),
31
+ onSuccess: () => (0, effect_1.pipe)(specifier.instance.semverGroup.getFixed(specifier), effect_1.Effect.matchEffect({
32
+ onFailure: () => effect_1.Effect.fail(
33
+ // ✓ expected version is semver
34
+ // ✘ expected version is not fixable by its semver group
35
+ // ✘ is a mismatch we can't auto-fix
36
+ new report_1.Report.UnsupportedMismatch({
37
+ unfixable: specifier.instance,
38
+ })),
39
+ onSuccess: (valid) => specifier.instance.rawSpecifier === valid.raw
40
+ ? effect_1.Effect.succeed(
41
+ // ✓ expected version is semver
42
+ // ✓ expected version matches its semver group
43
+ // ✓ current version matches expected
44
+ new report_1.Report.Valid({ specifier }))
45
+ : effect_1.Effect.fail(
46
+ // ✓ expected version is semver
47
+ // ✓ expected version matches its semver group
48
+ // ✘ current version mismatches expected
49
+ // ✓ is a mismatch we can auto-fix
50
+ new report_1.Report.SemverRangeMismatch({ fixable: valid })),
51
+ })),
52
+ }))))), effect_1.Effect.map(([allMismatches, allMatches]) => allMismatches.length === 0
53
+ ? allMatches.map((thisMatch) => {
54
+ if (thisMatch.specifier.instance.strategy.name === 'local') {
55
+ // ✓ every instance is valid on its own
56
+ // ✓ expected version is semver
57
+ // ! is the original local package
58
+ // ✓ others must match this, not the other way around
59
+ return thisMatch;
60
+ }
61
+ const mismatches = getRangeMismatches(this.ctx, thisMatch, allMatches);
62
+ if (mismatches.length === 0) {
63
+ // ✓ every instance is valid on its own
64
+ // ✓ expected version is semver
65
+ // ✓ expected version matches its semver group
66
+ // ✓ current version matches expected
67
+ // ! is not the original local package
68
+ // ✓ current specifier matches every other specifier
69
+ return thisMatch;
70
+ }
71
+ // ✓ every instance is valid on its own
72
+ // ✓ expected version is semver
73
+ // ✓ expected version matches its semver group
74
+ // ✓ current version matches expected
75
+ // ! is not the original local package
76
+ // ✘ current specifier does not match every other specifier
77
+ return new report_1.Report.SameRangeMismatch({
78
+ unfixable: thisMatch.specifier.instance,
79
+ mismatches: (0, uniq_1.uniq)(mismatches.map((report) => report.specifier.instance.rawSpecifier)),
80
+ });
81
+ })
82
+ : // ✘ not every instance is valid on its own
83
+ // ! report on their validity individually ! when all are valid
84
+ // they can progress to being checked for having compatible
85
+ // ranges
86
+ [...allMatches, ...allMismatches]), effect_1.Effect.map((reports) => ({ name, reports })))));
87
+ }
88
+ }
89
+ exports.SameRangeVersionGroup = SameRangeVersionGroup;
90
+ /** Find all ranges/versions which this semver version does not cover */
91
+ function getRangeMismatches(ctx, report, others) {
92
+ return others.filter((other) => !matchesRange(ctx, report, other));
93
+ }
94
+ /** Does semver version `a` match semver version `b`? */
95
+ function matchesRange(ctx, a, b) {
96
+ const loose = true;
97
+ return (0, intersects_1.default)(unwrapSemver(ctx, a.specifier), unwrapSemver(ctx, b.specifier), loose);
98
+ }
99
+ /** Get the semver version synchronously from a specifier known to contain semver */
100
+ function unwrapSemver(ctx, specifier) {
101
+ if (specifier._tag === 'RangeSpecifier' || specifier._tag === 'VersionSpecifier') {
102
+ return specifier.raw;
103
+ }
104
+ if (specifier._tag === 'WorkspaceProtocolSpecifier') {
105
+ return effect_1.Effect.runSync(specifier.getSemverEquivalent(ctx));
106
+ }
107
+ return effect_1.Effect.runSync(specifier.getSemver());
108
+ }
@@ -0,0 +1,17 @@
1
+ import { Data, Effect } from 'effect';
2
+ import type { VersionGroupConfig } from '../config/types';
3
+ import type { Instance } from '../get-instances/instance';
4
+ import { Report } from '../report';
5
+ declare const SnappedToVersionGroup_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<Omit<A, keyof import("effect/Equal").Equal>, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" | keyof import("effect/Equal").Equal ? never : P]: A[P]; }) => Data.Data<Readonly<A> & {
6
+ readonly _tag: "SnappedTo";
7
+ }>;
8
+ export declare class SnappedToVersionGroup extends SnappedToVersionGroup_base<{
9
+ config: VersionGroupConfig.SnappedTo;
10
+ instances: Instance[];
11
+ }> {
12
+ groupType: string;
13
+ constructor(config: VersionGroupConfig.SnappedTo);
14
+ canAdd(_: Instance): boolean;
15
+ inspectAll(): Effect.Effect<never, never, Report.Version.Group[]>;
16
+ }
17
+ export {};
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SnappedToVersionGroup = void 0;
4
+ const effect_1 = require("effect");
5
+ const report_1 = require("../report");
6
+ const specifier_1 = require("../specifier");
7
+ const group_by_1 = require("./lib/group-by");
8
+ class SnappedToVersionGroup extends effect_1.Data.TaggedClass('SnappedTo') {
9
+ groupType = 'versionGroup';
10
+ constructor(config) {
11
+ super({
12
+ config,
13
+ instances: [],
14
+ });
15
+ }
16
+ canAdd(_) {
17
+ return true;
18
+ }
19
+ inspectAll() {
20
+ return effect_1.Effect.all(Object.entries((0, group_by_1.groupBy)('name', this.instances)).flatMap(([name, instances]) => (0, effect_1.pipe)(findSnappedToInstance(name, this.config.snapTo, instances), effect_1.Effect.matchEffect({
21
+ onFailure: () => effect_1.Effect.succeed(instances.map((instance) =>
22
+ // ✘ none of the snapTo packages contain this dependency
23
+ // ✘ is a user configuration error we can't auto-fix
24
+ new report_1.Report.MissingSnappedToMismatch({ unfixable: instance }))),
25
+ onSuccess: (expected) => (0, effect_1.pipe)(instances, effect_1.Effect.forEach((instance) => (0, effect_1.pipe)(effect_1.Effect.Do, effect_1.Effect.bind('specifier', () => effect_1.Effect.succeed(specifier_1.Specifier.create(instance, instance.rawSpecifier))), effect_1.Effect.bind('expected', () => effect_1.Effect.succeed(specifier_1.Specifier.create(instance, expected.rawSpecifier))), effect_1.Effect.flatMap(({ expected, specifier }) => (0, effect_1.pipe)(expected.getSemver(), effect_1.Effect.matchEffect({
26
+ onFailure: () => (0, effect_1.pipe)(specifier.replaceWith(expected), specifier.instance.semverGroup.getFixed, effect_1.Effect.match({
27
+ onFailure: () =>
28
+ // ✘ expected version is not semver
29
+ // ✘ semver group expects semver
30
+ // ✘ is a mismatch we can't auto-fix
31
+ new report_1.Report.UnsupportedMismatch({
32
+ unfixable: specifier.instance,
33
+ }),
34
+ onSuccess: (valid) => specifier.instance.rawSpecifier === valid.raw
35
+ ? // ! expected version is not semver
36
+ // ✓ semver group is disabled/ignored
37
+ // ✓ current version matches expected
38
+ new report_1.Report.Valid({ specifier })
39
+ : // ! expected version is not semver
40
+ // ✓ semver group is disabled/ignored
41
+ // ✘ current version mismatches expected
42
+ // ✓ is a mismatch we can auto-fix by replacing with the non-semver version
43
+ new report_1.Report.SnappedToMismatch({
44
+ fixable: valid,
45
+ localInstance: expected.instance,
46
+ }),
47
+ })),
48
+ onSuccess: () => (0, effect_1.pipe)(specifier.replaceWith(expected), specifier.instance.semverGroup.getFixed, effect_1.Effect.match({
49
+ onFailure: /* istanbul ignore next */ () =>
50
+ // ✓ expected version is semver
51
+ // ✘ expected version is not fixable by its semver group
52
+ // ✘ is a mismatch we can't auto-fix
53
+ // ✘ this should be impossible - we already proved the local version is exact semver
54
+ new report_1.Report.UnsupportedMismatch({
55
+ unfixable: specifier.instance,
56
+ }),
57
+ onSuccess: (valid) => specifier.instance.rawSpecifier === valid.raw
58
+ ? // ✓ expected version is semver
59
+ // ✓ expected version matches its semver group
60
+ // ✓ current version matches expected
61
+ new report_1.Report.Valid({ specifier })
62
+ : // ✓ expected version is semver
63
+ // ✓ expected version matches its semver group
64
+ // ✘ current version mismatches expected
65
+ // ✓ is a mismatch we can auto-fix
66
+ new report_1.Report.SnappedToMismatch({
67
+ fixable: valid,
68
+ localInstance: expected.instance,
69
+ }),
70
+ })),
71
+ })))))),
72
+ }), effect_1.Effect.map((reports) => ({ name, reports })))));
73
+ }
74
+ }
75
+ exports.SnappedToVersionGroup = SnappedToVersionGroup;
76
+ function findSnappedToInstance(name, snapTo, instances) {
77
+ for (const instance of instances) {
78
+ if (snapTo.includes(instance.pkgName) && instance.rawSpecifier) {
79
+ return (0, effect_1.pipe)(effect_1.Effect.succeed(instance), effect_1.Effect.tap(() => effect_1.Effect.logDebug(`found snapped to version ${instance.rawSpecifier} for ${name} in <${instance.packageJsonFile.jsonFile.shortPath}>`)));
80
+ }
81
+ }
82
+ return (0, effect_1.pipe)(effect_1.Effect.fail('getSnappedTo found nothing'), effect_1.Effect.tapError(() => effect_1.Effect.logError(`failed to get snapped to version for ${name} using ${JSON.stringify(snapTo)}`)));
83
+ }
@@ -0,0 +1,18 @@
1
+ import { Data, Effect } from 'effect';
2
+ import type { VersionGroupConfig } from '../config/types';
3
+ import type { Instance } from '../get-instances/instance';
4
+ import { Report } from '../report';
5
+ declare const StandardVersionGroup_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<Omit<A, keyof import("effect/Equal").Equal>, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" | keyof import("effect/Equal").Equal ? never : P]: A[P]; }) => Data.Data<Readonly<A> & {
6
+ readonly _tag: "Standard";
7
+ }>;
8
+ export declare class StandardVersionGroup extends StandardVersionGroup_base<{
9
+ config: VersionGroupConfig.Standard;
10
+ instances: Instance[];
11
+ isCatchAll: boolean;
12
+ }> {
13
+ groupType: string;
14
+ constructor(isCatchAll: boolean, config: VersionGroupConfig.Standard);
15
+ canAdd(_: Instance): boolean;
16
+ inspectAll(): Effect.Effect<never, never, Report.Version.Group[]>;
17
+ }
18
+ export {};
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StandardVersionGroup = void 0;
4
+ const effect_1 = require("effect");
5
+ const uniq_1 = require("tightrope/array/uniq");
6
+ const report_1 = require("../report");
7
+ const specifier_1 = require("../specifier");
8
+ const get_preferred_version_1 = require("./lib/get-preferred-version");
9
+ const group_by_1 = require("./lib/group-by");
10
+ class StandardVersionGroup extends effect_1.Data.TaggedClass('Standard') {
11
+ groupType = 'versionGroup';
12
+ constructor(isCatchAll, config) {
13
+ super({
14
+ config,
15
+ instances: [],
16
+ isCatchAll,
17
+ });
18
+ }
19
+ canAdd(_) {
20
+ return true;
21
+ }
22
+ inspectAll() {
23
+ return effect_1.Effect.all(Object.entries((0, group_by_1.groupBy)('name', this.instances)).flatMap(([name, instances]) => {
24
+ const localInstance = getLocalInstance(instances);
25
+ if (localInstance) {
26
+ const localVersion = localInstance?.rawSpecifier;
27
+ return localVersion === 'PACKAGE_JSON_HAS_NO_VERSION'
28
+ ? effect_1.Effect.succeed({
29
+ name,
30
+ reports: instances.map((instance) =>
31
+ // ! dependency is a package developed in this repo
32
+ // ✘ local package is missing a .version property
33
+ // ✘ is a mismatch we can't auto-fix
34
+ new report_1.Report.MissingLocalVersion({
35
+ localInstance,
36
+ unfixable: instance,
37
+ })),
38
+ })
39
+ : (0, effect_1.pipe)(effect_1.Effect.succeed(specifier_1.Specifier.create(localInstance, localVersion)), effect_1.Effect.flatMap((local) => effect_1.Effect.all(local._tag !== 'VersionSpecifier'
40
+ ? instances.map((instance) =>
41
+ // ! dependency is a package developed in this repo
42
+ // ✘ local package has an invalid .version property
43
+ // ✘ is a mismatch we can't auto-fix
44
+ effect_1.Effect.succeed(new report_1.Report.MissingLocalVersion({
45
+ localInstance,
46
+ unfixable: instance,
47
+ })))
48
+ : instances.flatMap((instance) => (0, effect_1.pipe)(effect_1.Effect.succeed(specifier_1.Specifier.create(instance, instance.rawSpecifier)), effect_1.Effect.flatMap((specifier) => specifier.instance === localInstance
49
+ ? // ✓ this is the local package which the others should match
50
+ // ! its version must always remain as exact semver
51
+ // ! other instances need to be adjusted for their semver groups
52
+ effect_1.Effect.succeed(new report_1.Report.Valid({ specifier }))
53
+ : (0, effect_1.pipe)(specifier.replaceWith(local), specifier.instance.semverGroup.getFixed, effect_1.Effect.match({
54
+ onFailure: /* istanbul ignore next */ () =>
55
+ // ! is not the local package instance
56
+ // ✘ local version is not fixable by this semver group
57
+ // ✘ is a mismatch we can't auto-fix
58
+ // ✘ this should be impossible - we already proved the local version is exact semver
59
+ new report_1.Report.UnsupportedMismatch({
60
+ unfixable: specifier.instance,
61
+ }),
62
+ onSuccess: (valid) => specifier.instance.rawSpecifier === valid.raw
63
+ ? // ! is not the local package instance
64
+ // ✓ local version matches this semver group
65
+ // ✓ current version matches local
66
+ new report_1.Report.Valid({ specifier })
67
+ : // ! is not the local package instance
68
+ // ✓ local version matches this semver group
69
+ // ✘ current version mismatches local
70
+ new report_1.Report.LocalPackageMismatch({
71
+ fixable: valid,
72
+ localInstance,
73
+ }),
74
+ }))))))), effect_1.Effect.map((reports) => ({ name, reports })));
75
+ }
76
+ const PreferredMismatch = this.config.preferVersion === 'lowestSemver'
77
+ ? report_1.Report.LowestSemverMismatch
78
+ : report_1.Report.HighestSemverMismatch;
79
+ return (0, effect_1.pipe)(effect_1.Effect.succeed(instances.map((instance) => specifier_1.Specifier.create(instance, instance.rawSpecifier))), effect_1.Effect.flatMap((specifiers) => (0, effect_1.pipe)((0, get_preferred_version_1.getPreferredVersion)(this.config.preferVersion, specifiers), effect_1.Effect.matchEffect({
80
+ onFailure: () => effect_1.Effect.succeed((0, uniq_1.uniq)(specifiers.map((specifier) => specifier.instance.rawSpecifier)).length ===
81
+ 1
82
+ ? specifiers.map((specifier) =>
83
+ // ✘ not every version is semver
84
+ // ✓ every version is identical
85
+ // ✓ is a match
86
+ new report_1.Report.Valid({ specifier }))
87
+ : instances.map((instance) =>
88
+ // ✘ not every version is semver
89
+ // ✘ some versions are not identical
90
+ // ✘ is a mismatch we can't auto-fix
91
+ new report_1.Report.UnsupportedMismatch({ unfixable: instance }))),
92
+ onSuccess: (expectedVersion) => (0, effect_1.pipe)(specifiers, effect_1.Effect.forEach((current) => (0, effect_1.pipe)(current.replaceWith(expectedVersion), current.instance.semverGroup.getFixed, effect_1.Effect.match({
93
+ onFailure: /* istanbul ignore next */ () =>
94
+ // ✓ every version is semver
95
+ // ✘ expected version is not fixable by its semver group
96
+ // ✘ is a mismatch we can't auto-fix
97
+ // ✘ this should be impossible - any valid semver is fixable by a semver group
98
+ new report_1.Report.UnsupportedMismatch({ unfixable: current.instance }),
99
+ onSuccess: (expectedRange) => current.instance.rawSpecifier === expectedRange.raw
100
+ ? // ✓ every version is semver
101
+ // ✓ current version matches expected semver
102
+ // ✓ current version matches expected version
103
+ new report_1.Report.Valid({ specifier: current })
104
+ : current.instance.rawSpecifier === expectedVersion.raw
105
+ ? // ✓ every version is semver
106
+ // ✓ current version matches expected version
107
+ // ✘ current version does not match expected semver
108
+ // ✓ is a mismatch we can auto-fix
109
+ new report_1.Report.SemverRangeMismatch({ fixable: expectedRange })
110
+ : // ✓ every version is semver
111
+ // ✘ current version does not match expected version
112
+ // ✘ expected version does not match expected semver
113
+ // ✓ is a mismatch we can auto-fix
114
+ new PreferredMismatch({ fixable: expectedRange }),
115
+ })))),
116
+ }))), effect_1.Effect.map((reports) => ({ name, reports })));
117
+ }));
118
+ }
119
+ }
120
+ exports.StandardVersionGroup = StandardVersionGroup;
121
+ /**
122
+ * If this dependency is developed in this monorepo, get the instance which
123
+ * represents the canonical .version property of its package.json file.
124
+ */
125
+ function getLocalInstance(instances) {
126
+ return instances.find(isLocalInstance);
127
+ }
128
+ /** Is this dependency developed in this monorepo */
129
+ function isLocalInstance(instance) {
130
+ return instance.strategy.name === 'local';
131
+ }