syncpack 9.3.2 → 9.7.4

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 (91) hide show
  1. package/dist/bin-fix-mismatches/fix-mismatches-cli.js +4 -4
  2. package/dist/bin-fix-mismatches/fix-mismatches.js +14 -15
  3. package/dist/bin-fix-mismatches/index.js +50 -48
  4. package/dist/bin-format/format-cli.js +4 -4
  5. package/dist/bin-format/format.js +19 -18
  6. package/dist/bin-format/index.js +43 -46
  7. package/dist/bin-lint-semver-ranges/index.js +59 -48
  8. package/dist/bin-lint-semver-ranges/lint-semver-ranges-cli.js +4 -4
  9. package/dist/bin-lint-semver-ranges/lint-semver-ranges.js +13 -35
  10. package/dist/bin-list/index.js +43 -46
  11. package/dist/bin-list/list-cli.js +4 -4
  12. package/dist/bin-list/list.js +21 -28
  13. package/dist/bin-list-mismatches/index.js +46 -47
  14. package/dist/bin-list-mismatches/list-mismatches-cli.js +4 -4
  15. package/dist/bin-list-mismatches/list-mismatches.js +49 -38
  16. package/dist/bin-set-semver-ranges/index.js +62 -49
  17. package/dist/bin-set-semver-ranges/set-semver-ranges-cli.js +4 -4
  18. package/dist/bin-set-semver-ranges/set-semver-ranges.js +4 -4
  19. package/dist/bin.js +8 -8
  20. package/dist/constants.d.ts +2 -1
  21. package/dist/constants.js +6 -5
  22. package/dist/get-context/$R.js +14 -36
  23. package/dist/get-context/get-all-instances.js +3 -3
  24. package/dist/get-context/get-config/get-core-types.js +11 -41
  25. package/dist/get-context/get-config/get-custom-types.js +7 -19
  26. package/dist/get-context/get-config/get-enabled-types.js +9 -11
  27. package/dist/get-context/get-config/index.js +29 -59
  28. package/dist/get-context/get-config/path-strategy/index.js +8 -8
  29. package/dist/get-context/get-config/path-strategy/lib/get-non-empty-string-prop.js +6 -6
  30. package/dist/get-context/get-config/path-strategy/name-and-version-props.js +23 -49
  31. package/dist/get-context/get-config/path-strategy/name-and-version-string.js +26 -42
  32. package/dist/get-context/get-config/path-strategy/types.js +1 -1
  33. package/dist/get-context/get-config/path-strategy/version-string.js +25 -41
  34. package/dist/get-context/get-config/path-strategy/versions-by-name.js +14 -30
  35. package/dist/get-context/get-config/schema/base-group.d.ts +2 -2
  36. package/dist/get-context/get-config/schema/base-group.js +5 -5
  37. package/dist/get-context/get-config/schema/index.d.ts +254 -164
  38. package/dist/get-context/get-config/schema/index.js +40 -63
  39. package/dist/get-context/get-config/schema/paths.js +12 -12
  40. package/dist/get-context/get-config/schema/semver-group.d.ts +24 -24
  41. package/dist/get-context/get-config/schema/semver-group.js +11 -18
  42. package/dist/get-context/get-config/schema/semver-range.js +4 -4
  43. package/dist/get-context/get-config/schema/version-group.d.ts +77 -40
  44. package/dist/get-context/get-config/schema/version-group.js +20 -21
  45. package/dist/get-context/get-groups/base-group.d.ts +4 -1
  46. package/dist/get-context/get-groups/base-group.js +18 -19
  47. package/dist/get-context/get-groups/index.d.ts +2 -1
  48. package/dist/get-context/get-groups/index.js +31 -37
  49. package/dist/get-context/get-groups/semver-group.d.ts +0 -1
  50. package/dist/get-context/get-groups/semver-group.js +23 -66
  51. package/dist/get-context/get-groups/version-group/index.d.ts +2 -1
  52. package/dist/get-context/get-groups/version-group/index.js +29 -68
  53. package/dist/get-context/get-groups/version-group/instance-group/get-highest-version.d.ts +3 -1
  54. package/dist/get-context/get-groups/version-group/instance-group/get-highest-version.js +36 -45
  55. package/dist/get-context/get-groups/version-group/instance-group/index.d.ts +2 -1
  56. package/dist/get-context/get-groups/version-group/instance-group/index.js +55 -47
  57. package/dist/get-context/get-groups/version-group/instance-group/lib/clean.d.ts +2 -0
  58. package/dist/get-context/get-groups/version-group/instance-group/lib/clean.js +13 -0
  59. package/dist/get-context/get-groups/version-group/instance-group/lib/compare-semver.d.ts +2 -0
  60. package/dist/get-context/get-groups/version-group/instance-group/lib/compare-semver.js +22 -0
  61. package/dist/get-context/get-groups/version-group/instance-group/lib/get-range-score.d.ts +2 -0
  62. package/dist/get-context/get-groups/version-group/instance-group/lib/get-range-score.js +23 -0
  63. package/dist/get-context/get-package-json-files/get-file-paths.js +18 -19
  64. package/dist/get-context/get-package-json-files/get-patterns/get-lerna-patterns.js +9 -12
  65. package/dist/get-context/get-package-json-files/get-patterns/get-pnpm-patterns.js +9 -11
  66. package/dist/get-context/get-package-json-files/get-patterns/get-yarn-patterns.js +10 -13
  67. package/dist/get-context/get-package-json-files/get-patterns/index.js +15 -42
  68. package/dist/get-context/get-package-json-files/get-patterns/lib/get-array-of-strings.js +4 -6
  69. package/dist/get-context/get-package-json-files/get-patterns/props.js +9 -33
  70. package/dist/get-context/get-package-json-files/get-patterns/read-json-safe.js +6 -9
  71. package/dist/get-context/get-package-json-files/get-patterns/read-yaml-safe.js +4 -4
  72. package/dist/get-context/get-package-json-files/index.js +7 -7
  73. package/dist/get-context/get-package-json-files/package-json-file/index.js +32 -55
  74. package/dist/get-context/get-package-json-files/package-json-file/instance.js +14 -15
  75. package/dist/get-context/index.js +19 -24
  76. package/dist/lib/disk.js +28 -29
  77. package/dist/lib/error.js +13 -31
  78. package/dist/lib/exit-if-invalid.js +1 -1
  79. package/dist/lib/is-semver.d.ts +1 -1
  80. package/dist/lib/is-semver.js +15 -7
  81. package/dist/lib/log.js +33 -58
  82. package/dist/lib/newlines.js +11 -11
  83. package/dist/lib/print-strings.js +2 -2
  84. package/dist/lib/set-semver-range.js +8 -8
  85. package/dist/lib/show-help-on-error.js +31 -8
  86. package/dist/lib/sort-by-name.js +1 -1
  87. package/dist/lib/write-if-changed.js +3 -3
  88. package/dist/option.js +8 -13
  89. package/dist/types.d.ts +2 -0
  90. package/dist/types.js +1 -1
  91. package/package.json +20 -16
@@ -2,39 +2,38 @@
2
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
- exports.__esModule = true;
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.BaseGroup = void 0;
7
- var expect_more_1 = require("expect-more");
8
- var minimatch_1 = __importDefault(require("minimatch"));
9
- var BaseGroup = /** @class */ (function () {
10
- function BaseGroup(config, group) {
7
+ const is_non_empty_array_1 = require("expect-more/dist/is-non-empty-array");
8
+ const minimatch_1 = __importDefault(require("minimatch"));
9
+ class BaseGroup {
10
+ constructor(config, group, packageJsonFiles) {
11
11
  this.groupConfig = group;
12
12
  this.instances = [];
13
13
  this.instancesByName = {};
14
14
  this.isDefault =
15
15
  group === config.defaultSemverGroup ||
16
16
  group === config.defaultVersionGroup;
17
+ this.packageJsonFiles = packageJsonFiles;
17
18
  this.syncpackConfig = config;
18
19
  }
19
20
  /** Can this instance be added to this group? */
20
- BaseGroup.prototype.canAdd = function (instance) {
21
- var _a = this.groupConfig, dependencies = _a.dependencies, dependencyTypes = _a.dependencyTypes, packages = _a.packages;
22
- return ((!(0, expect_more_1.isNonEmptyArray)(dependencyTypes) ||
21
+ canAdd(instance) {
22
+ const { dependencies, dependencyTypes, packages } = this.groupConfig;
23
+ return ((!(0, is_non_empty_array_1.isNonEmptyArray)(dependencyTypes) ||
23
24
  dependencyTypes.includes(instance.pathDef.name)) &&
24
- (!(0, expect_more_1.isNonEmptyArray)(packages) ||
25
- packages.some(function (pattern) { return (0, minimatch_1["default"])(instance.pkgName, pattern); })) &&
26
- (!(0, expect_more_1.isNonEmptyArray)(dependencies) ||
27
- dependencies.some(function (pattern) { return (0, minimatch_1["default"])(instance.name, pattern); })));
28
- };
25
+ (!(0, is_non_empty_array_1.isNonEmptyArray)(packages) ||
26
+ packages.some((pattern) => (0, minimatch_1.default)(instance.pkgName, pattern))) &&
27
+ (!(0, is_non_empty_array_1.isNonEmptyArray)(dependencies) ||
28
+ dependencies.some((pattern) => (0, minimatch_1.default)(instance.name, pattern))));
29
+ }
29
30
  /** Add this instance to this group */
30
- BaseGroup.prototype.add = function (instance) {
31
- var _a;
31
+ add(instance) {
32
32
  if (!this.instancesByName[instance.name]) {
33
33
  this.instancesByName[instance.name] = [];
34
34
  }
35
- (_a = this.instancesByName[instance.name]) === null || _a === void 0 ? void 0 : _a.push(instance);
35
+ this.instancesByName[instance.name]?.push(instance);
36
36
  this.instances.push(instance);
37
- };
38
- return BaseGroup;
39
- }());
37
+ }
38
+ }
40
39
  exports.BaseGroup = BaseGroup;
@@ -1,8 +1,9 @@
1
1
  import type { Syncpack } from '../../types';
2
+ import type { PackageJsonFile } from '../get-package-json-files/package-json-file';
2
3
  import type { Instance } from '../get-package-json-files/package-json-file/instance';
3
4
  import { SemverGroup } from './semver-group';
4
5
  import { VersionGroup } from './version-group';
5
- export declare function getGroups(config: Syncpack.Config.Private, instances: Instance[]): {
6
+ export declare function getGroups(config: Syncpack.Config.Private, instances: Instance[], packageJsonFiles: PackageJsonFile[]): {
6
7
  semverGroups: SemverGroup[];
7
8
  versionGroups: VersionGroup[];
8
9
  };
@@ -1,47 +1,41 @@
1
1
  "use strict";
2
- var __values = (this && this.__values) || function(o) {
3
- var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
4
- if (m) return m.call(o);
5
- if (o && typeof o.length === "number") return {
6
- next: function () {
7
- if (o && i >= o.length) o = void 0;
8
- return { value: o && o[i++], done: !o };
9
- }
10
- };
11
- throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
12
- };
13
- exports.__esModule = true;
2
+ Object.defineProperty(exports, "__esModule", { value: true });
14
3
  exports.getGroups = void 0;
15
- var semver_group_1 = require("./semver-group");
16
- var version_group_1 = require("./version-group");
17
- function getGroups(config, instances) {
18
- var groupsByName = {
19
- semverGroups: config.semverGroups.map(function (group) { return new semver_group_1.SemverGroup(config, group); }),
20
- versionGroups: config.versionGroups.map(function (group) { return new version_group_1.VersionGroup(config, group); })
4
+ const log_1 = require("../../lib/log");
5
+ const semver_group_1 = require("./semver-group");
6
+ const version_group_1 = require("./version-group");
7
+ function getGroups(config, instances, packageJsonFiles) {
8
+ const groupsByName = {
9
+ semverGroups: config.semverGroups.map((group) => new semver_group_1.SemverGroup(config, group, packageJsonFiles)),
10
+ versionGroups: config.versionGroups.map((group) => new version_group_1.VersionGroup(config, group, packageJsonFiles)),
21
11
  };
22
- instances.forEach(function (instance) {
23
- var name = instance.name, pkgName = instance.pkgName;
24
- Object.keys(groupsByName).forEach(function (key) {
25
- var e_1, _a;
26
- try {
27
- for (var _b = __values(groupsByName[key]), _c = _b.next(); !_c.done; _c = _b.next()) {
28
- var group = _c.value;
29
- if (group.canAdd(instance)) {
30
- group.add(instance);
31
- return;
32
- }
33
- }
34
- }
35
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
36
- finally {
37
- try {
38
- if (_c && !_c.done && (_a = _b["return"])) _a.call(_b);
12
+ const groupNames = Object.keys(groupsByName);
13
+ instances.forEach((instance) => {
14
+ const { name, pkgName } = instance;
15
+ groupNames.forEach((key) => {
16
+ for (const group of groupsByName[key]) {
17
+ if (group.canAdd(instance)) {
18
+ group.add(instance);
19
+ return;
39
20
  }
40
- finally { if (e_1) throw e_1.error; }
41
21
  }
42
- throw new Error("".concat(name, " in ").concat(pkgName, " did not match any ").concat(key));
22
+ throw new Error(`${name} in ${pkgName} did not match any ${key}`);
43
23
  });
44
24
  });
25
+ /* istanbul ignore if */
26
+ if (process.env.SYNCPACK_VERBOSE) {
27
+ groupNames.forEach((key) => {
28
+ groupsByName[key].forEach((group, i) => {
29
+ const size = group.instances.length;
30
+ const ref = `${key}[${group.isDefault ? 'default' : i}]`;
31
+ (0, log_1.verbose)(`${ref} has ${size} instances`);
32
+ group.instances.forEach(({ name, pathDef, version, packageJsonFile }) => {
33
+ const shortPath = packageJsonFile.shortPath;
34
+ (0, log_1.verbose)(`${ref} ← ${name}@${version} in ${pathDef.path} of ${shortPath}`);
35
+ });
36
+ });
37
+ });
38
+ }
45
39
  return groupsByName;
46
40
  }
47
41
  exports.getGroups = getGroups;
@@ -3,7 +3,6 @@ import type { Instance } from '../get-package-json-files/package-json-file/insta
3
3
  import { BaseGroup } from './base-group';
4
4
  type MismatchesByName = [string, Instance[]];
5
5
  export declare class SemverGroup extends BaseGroup<Syncpack.Config.SemverGroup.Any> {
6
- constructor(config: Syncpack.Config.Private, semverGroup: Syncpack.Config.SemverGroup.Any);
7
6
  getExpectedVersion(instance: Instance): string;
8
7
  /** Does this `Instance` have a version which does not follow the rules? */
9
8
  isMismatch(instance: Instance): boolean;
@@ -1,47 +1,12 @@
1
1
  "use strict";
2
- var __extends = (this && this.__extends) || (function () {
3
- var extendStatics = function (d, b) {
4
- extendStatics = Object.setPrototypeOf ||
5
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
- function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
- return extendStatics(d, b);
8
- };
9
- return function (d, b) {
10
- if (typeof b !== "function" && b !== null)
11
- throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
- extendStatics(d, b);
13
- function __() { this.constructor = d; }
14
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
- };
16
- })();
17
- var __read = (this && this.__read) || function (o, n) {
18
- var m = typeof Symbol === "function" && o[Symbol.iterator];
19
- if (!m) return o;
20
- var i = m.call(o), r, ar = [], e;
21
- try {
22
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
23
- }
24
- catch (error) { e = { error: error }; }
25
- finally {
26
- try {
27
- if (r && !r.done && (m = i["return"])) m.call(i);
28
- }
29
- finally { if (e) throw e.error; }
30
- }
31
- return ar;
32
- };
33
- exports.__esModule = true;
2
+ Object.defineProperty(exports, "__esModule", { value: true });
34
3
  exports.SemverGroup = void 0;
35
- var is_semver_1 = require("../../lib/is-semver");
36
- var set_semver_range_1 = require("../../lib/set-semver-range");
37
- var base_group_1 = require("./base-group");
38
- var SemverGroup = /** @class */ (function (_super) {
39
- __extends(SemverGroup, _super);
40
- function SemverGroup(config, semverGroup) {
41
- return _super.call(this, config, semverGroup) || this;
42
- }
43
- SemverGroup.prototype.getExpectedVersion = function (instance) {
44
- var version = instance.version;
4
+ const is_semver_1 = require("../../lib/is-semver");
5
+ const set_semver_range_1 = require("../../lib/set-semver-range");
6
+ const base_group_1 = require("./base-group");
7
+ class SemverGroup extends base_group_1.BaseGroup {
8
+ getExpectedVersion(instance) {
9
+ const version = instance.version;
45
10
  // leave ignored versions alone
46
11
  if (this.isIgnored())
47
12
  return version;
@@ -52,38 +17,30 @@ var SemverGroup = /** @class */ (function (_super) {
52
17
  if (instance.isWorkspace())
53
18
  return (0, set_semver_range_1.setSemverRange)('', version);
54
19
  // otherwise we can change it
55
- var range = this.groupConfig.range;
20
+ const range = this.groupConfig.range;
56
21
  return (0, set_semver_range_1.setSemverRange)(range, version);
57
- };
22
+ }
58
23
  /** Does this `Instance` have a version which does not follow the rules? */
59
- SemverGroup.prototype.isMismatch = function (instance) {
24
+ isMismatch(instance) {
60
25
  return instance.version !== this.getExpectedVersion(instance);
61
- };
26
+ }
62
27
  /** 1+ `Instance` has a version which does not follow the rules */
63
- SemverGroup.prototype.hasMismatches = function () {
28
+ hasMismatches() {
64
29
  return this.getMismatches().length > 0;
65
- };
66
- SemverGroup.prototype.isIgnored = function () {
30
+ }
31
+ isIgnored() {
67
32
  return this.groupConfig.isIgnored === true;
68
- };
33
+ }
69
34
  /** Get every `Instance` with a version which does not follow the rules */
70
- SemverGroup.prototype.getMismatches = function () {
71
- var _this = this;
35
+ getMismatches() {
72
36
  return this.isIgnored()
73
37
  ? []
74
38
  : Object.entries(this.instancesByName)
75
- .map(function (_a) {
76
- var _b = __read(_a, 2), name = _b[0], instances = _b[1];
77
- return [
78
- name,
79
- instances.filter(function (instance) { return _this.isMismatch(instance); }),
80
- ];
81
- })
82
- .filter(function (_a) {
83
- var _b = __read(_a, 2), arr = _b[1];
84
- return arr.length > 0;
85
- });
86
- };
87
- return SemverGroup;
88
- }(base_group_1.BaseGroup));
39
+ .map(([name, instances]) => [
40
+ name,
41
+ instances.filter((instance) => this.isMismatch(instance)),
42
+ ])
43
+ .filter(([, arr]) => arr.length > 0);
44
+ }
45
+ }
89
46
  exports.SemverGroup = SemverGroup;
@@ -6,7 +6,8 @@ export declare class VersionGroup extends BaseGroup<Syncpack.Config.VersionGroup
6
6
  getInvalidInstanceGroups(): InstanceGroup[];
7
7
  isBanned(): boolean;
8
8
  isIgnored(): boolean;
9
- hasPinnedVersion(): boolean;
9
+ hasSnappedToPackages(): boolean;
10
+ getSnappedToPackages(): string[];
10
11
  getPinnedVersion(): string;
11
12
  isUnpinned(): boolean;
12
13
  }
@@ -1,75 +1,36 @@
1
1
  "use strict";
2
- var __extends = (this && this.__extends) || (function () {
3
- var extendStatics = function (d, b) {
4
- extendStatics = Object.setPrototypeOf ||
5
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
- function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
- return extendStatics(d, b);
8
- };
9
- return function (d, b) {
10
- if (typeof b !== "function" && b !== null)
11
- throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
- extendStatics(d, b);
13
- function __() { this.constructor = d; }
14
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
- };
16
- })();
17
- var __read = (this && this.__read) || function (o, n) {
18
- var m = typeof Symbol === "function" && o[Symbol.iterator];
19
- if (!m) return o;
20
- var i = m.call(o), r, ar = [], e;
21
- try {
22
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
23
- }
24
- catch (error) { e = { error: error }; }
25
- finally {
26
- try {
27
- if (r && !r.done && (m = i["return"])) m.call(i);
28
- }
29
- finally { if (e) throw e.error; }
30
- }
31
- return ar;
32
- };
33
- exports.__esModule = true;
2
+ Object.defineProperty(exports, "__esModule", { value: true });
34
3
  exports.VersionGroup = void 0;
35
- var expect_more_1 = require("expect-more");
36
- var base_group_1 = require("../base-group");
37
- var instance_group_1 = require("./instance-group");
38
- var VersionGroup = /** @class */ (function (_super) {
39
- __extends(VersionGroup, _super);
40
- function VersionGroup() {
41
- return _super !== null && _super.apply(this, arguments) || this;
4
+ const expect_more_1 = require("expect-more");
5
+ const is_non_empty_string_1 = require("expect-more/dist/is-non-empty-string");
6
+ const base_group_1 = require("../base-group");
7
+ const instance_group_1 = require("./instance-group");
8
+ class VersionGroup extends base_group_1.BaseGroup {
9
+ getAllInstanceGroups() {
10
+ return Object.entries(this.instancesByName).map(([name, instances]) => new instance_group_1.InstanceGroup(this, name, instances));
11
+ }
12
+ getInvalidInstanceGroups() {
13
+ return this.getAllInstanceGroups().filter((group) => group.isInvalid());
42
14
  }
43
- VersionGroup.prototype.getAllInstanceGroups = function () {
44
- var _this = this;
45
- return Object.entries(this.instancesByName).map(function (_a) {
46
- var _b = __read(_a, 2), name = _b[0], instances = _b[1];
47
- return new instance_group_1.InstanceGroup(_this, name, instances);
48
- });
49
- };
50
- VersionGroup.prototype.getInvalidInstanceGroups = function () {
51
- return this.getAllInstanceGroups().filter(function (group) { return group.isInvalid(); });
52
- };
53
- VersionGroup.prototype.isBanned = function () {
15
+ isBanned() {
54
16
  return this.groupConfig.isBanned === true;
55
- };
56
- VersionGroup.prototype.isIgnored = function () {
17
+ }
18
+ isIgnored() {
57
19
  return this.groupConfig.isIgnored === true;
58
- };
59
- VersionGroup.prototype.hasPinnedVersion = function () {
60
- return (0, expect_more_1.isNonEmptyString)(this.getPinnedVersion());
61
- };
62
- VersionGroup.prototype.getPinnedVersion = function () {
20
+ }
21
+ hasSnappedToPackages() {
22
+ return (0, expect_more_1.isArrayOfStrings)(this.groupConfig.snapTo);
23
+ }
24
+ getSnappedToPackages() {
25
+ return this.groupConfig.snapTo;
26
+ }
27
+ getPinnedVersion() {
63
28
  return this.groupConfig.pinVersion;
64
- };
65
- VersionGroup.prototype.isUnpinned = function () {
66
- var pinVersion = this.groupConfig.pinVersion;
67
- return ((0, expect_more_1.isNonEmptyString)(pinVersion) &&
68
- this.instances.some(function (_a) {
69
- var version = _a.version;
70
- return version !== pinVersion;
71
- }));
72
- };
73
- return VersionGroup;
74
- }(base_group_1.BaseGroup));
29
+ }
30
+ isUnpinned() {
31
+ const { pinVersion } = this.groupConfig;
32
+ return ((0, is_non_empty_string_1.isNonEmptyString)(pinVersion) &&
33
+ this.instances.some(({ version }) => version !== pinVersion));
34
+ }
35
+ }
75
36
  exports.VersionGroup = VersionGroup;
@@ -1 +1,3 @@
1
- export declare function getHighestVersion(versions: string[]): string;
1
+ import { R } from '@mobily/ts-belt';
2
+ import { BaseError } from '../../../../lib/error';
3
+ export declare function getHighestVersion(versions: string[]): R.Result<string, BaseError>;
@@ -1,51 +1,42 @@
1
1
  "use strict";
2
- exports.__esModule = true;
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getHighestVersion = void 0;
4
- var semver_1 = require("semver");
5
- var constants_1 = require("../../../../constants");
6
- var is_semver_1 = require("../../../../lib/is-semver");
4
+ const ts_belt_1 = require("@mobily/ts-belt");
5
+ const error_1 = require("../../../../lib/error");
6
+ const clean_1 = require("./lib/clean");
7
+ const compare_semver_1 = require("./lib/compare-semver");
8
+ const get_range_score_1 = require("./lib/get-range-score");
7
9
  function getHighestVersion(versions) {
8
- return versions.reduce(function (rawHighest, raw) {
9
- var version = (0, semver_1.valid)((0, semver_1.coerce)(raw)) || '';
10
- var highest = (0, semver_1.valid)((0, semver_1.coerce)(rawHighest)) || '';
11
- if (raw === '*' || rawHighest === '*')
12
- return '*';
13
- if (!(0, is_semver_1.isSemver)(raw) || version === '')
14
- return rawHighest;
15
- if (highest === '')
16
- return raw;
17
- if ((0, semver_1.gt)(version, highest))
18
- return raw;
19
- if ((0, semver_1.eq)(version, highest) && getRangeScore(raw) > getRangeScore(rawHighest))
20
- return raw;
21
- return rawHighest;
22
- }, '');
10
+ let highest;
11
+ for (const withRange of versions) {
12
+ switch ((0, compare_semver_1.compareSemver)(withRange, highest?.semver)) {
13
+ // highest possible, quit early
14
+ case '*': {
15
+ return ts_belt_1.R.Ok(withRange);
16
+ }
17
+ // impossible to know how the user wants to resolve unsupported versions
18
+ case 'invalid': {
19
+ return ts_belt_1.R.Error(new error_1.BaseError(`"${withRange}" is not supported`));
20
+ }
21
+ // we found a new highest version
22
+ case 'gt': {
23
+ highest = newHighestVersion(withRange);
24
+ continue;
25
+ }
26
+ // versions are the same, but one range might be greedier than another
27
+ case 'eq': {
28
+ const score = (0, get_range_score_1.getRangeScore)(withRange);
29
+ const highestScore = (0, get_range_score_1.getRangeScore)(`${highest?.withRange}`);
30
+ if (score > highestScore)
31
+ highest = newHighestVersion(withRange);
32
+ }
33
+ }
34
+ }
35
+ return highest && highest.withRange
36
+ ? ts_belt_1.R.Ok(highest.withRange)
37
+ : ts_belt_1.R.Error(new error_1.BaseError(`getHighestVersion(): did not return a version`));
23
38
  }
24
39
  exports.getHighestVersion = getHighestVersion;
25
- function getRangeScore(version) {
26
- if (version === '')
27
- return 0;
28
- if (version === constants_1.RANGE.ANY)
29
- return 8;
30
- var range = getRange(version);
31
- if (range === constants_1.RANGE.GT)
32
- return 7;
33
- if (range === constants_1.RANGE.GTE)
34
- return 6;
35
- if (range === constants_1.RANGE.MINOR)
36
- return 5;
37
- if (version.indexOf('.x') !== -1)
38
- return 4;
39
- if (range === constants_1.RANGE.PATCH)
40
- return 3;
41
- if (range === constants_1.RANGE.EXACT)
42
- return 2;
43
- if (range === constants_1.RANGE.LTE)
44
- return 1;
45
- if (range === constants_1.RANGE.LT)
46
- return 0;
47
- return 0;
48
- }
49
- function getRange(version) {
50
- return version.slice(0, version.search(/[0-9]/));
40
+ function newHighestVersion(withRange) {
41
+ return { withRange, semver: (0, clean_1.clean)(withRange) };
51
42
  }
@@ -15,7 +15,8 @@ export declare class InstanceGroup {
15
15
  isInvalid(): boolean;
16
16
  getExpectedVersion(): string | undefined;
17
17
  getHighestVersion(): string;
18
- isUnpinned(): boolean;
18
+ getSnappedVersion(): string;
19
+ isUnsnapped(): boolean;
19
20
  /** Get version of dependency which is developed in this monorepo */
20
21
  getWorkspaceVersion(): string | undefined;
21
22
  /** Find instance of this dependency which is developed in this monorepo */
@@ -1,76 +1,84 @@
1
1
  "use strict";
2
- exports.__esModule = true;
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.InstanceGroup = void 0;
4
- var error_1 = require("../../../../lib/error");
5
- var is_semver_1 = require("../../../../lib/is-semver");
6
- var print_strings_1 = require("../../../../lib/print-strings");
7
- var get_highest_version_1 = require("./get-highest-version");
4
+ const ts_belt_1 = require("@mobily/ts-belt");
5
+ const error_1 = require("../../../../lib/error");
6
+ const is_semver_1 = require("../../../../lib/is-semver");
7
+ const print_strings_1 = require("../../../../lib/print-strings");
8
+ const get_highest_version_1 = require("./get-highest-version");
8
9
  /** Every `Instance` of eg `"lodash"` for a given `VersionGroup` */
9
- var InstanceGroup = /** @class */ (function () {
10
- function InstanceGroup(versionGroup, name, instances) {
10
+ class InstanceGroup {
11
+ constructor(versionGroup, name, instances) {
11
12
  this.instances = instances;
12
13
  this.name = name;
13
14
  this.versionGroup = versionGroup;
14
15
  }
15
- InstanceGroup.prototype.hasUnsupportedVersion = function () {
16
- return this.instances.some(function (obj) { return !(0, is_semver_1.isSemver)(obj.version); });
17
- };
18
- InstanceGroup.prototype.getUniqueVersions = function () {
19
- return Array.from(new Set(this.instances.map(function (obj) { return obj.version; }))).sort();
20
- };
21
- InstanceGroup.prototype.hasMismatchingVersions = function () {
16
+ hasUnsupportedVersion() {
17
+ return this.instances.some((obj) => !(0, is_semver_1.isSemver)(obj.version));
18
+ }
19
+ getUniqueVersions() {
20
+ return Array.from(new Set(this.instances.map((obj) => obj.version))).sort();
21
+ }
22
+ hasMismatchingVersions() {
22
23
  return this.getUniqueVersions().length > 1;
23
- };
24
- InstanceGroup.prototype.isInvalid = function () {
24
+ }
25
+ isInvalid() {
25
26
  return this.versionGroup.isIgnored()
26
27
  ? false
27
28
  : this.versionGroup.isBanned() ||
28
29
  this.versionGroup.isUnpinned() ||
29
30
  this.hasMismatchingVersions();
30
- };
31
- InstanceGroup.prototype.getExpectedVersion = function () {
32
- var versionGroup = this.versionGroup;
33
- var REMOVE_DEPENDENCY = undefined;
31
+ }
32
+ getExpectedVersion() {
33
+ const versionGroup = this.versionGroup;
34
+ const REMOVE_DEPENDENCY = undefined;
34
35
  if (versionGroup.isBanned())
35
36
  return REMOVE_DEPENDENCY;
36
37
  if (versionGroup.isUnpinned())
37
38
  return versionGroup.getPinnedVersion();
39
+ if (this.isUnsnapped())
40
+ return this.getSnappedVersion();
38
41
  if (this.hasWorkspaceInstance())
39
42
  return this.getWorkspaceVersion();
40
43
  if (this.hasUnsupportedVersion()) {
41
- throw new error_1.BaseError("".concat(this.name, " contains unsupported versions: ").concat((0, print_strings_1.printStrings)(this.getUniqueVersions())));
44
+ throw new error_1.BaseError(`${this.name} contains unsupported versions: ${(0, print_strings_1.printStrings)(this.getUniqueVersions())}`);
42
45
  }
43
46
  return this.getHighestVersion();
44
- };
45
- InstanceGroup.prototype.getHighestVersion = function () {
46
- return (0, get_highest_version_1.getHighestVersion)(this.getUniqueVersions());
47
- };
48
- InstanceGroup.prototype.isUnpinned = function () {
49
- var _this = this;
50
- return (this.versionGroup.hasPinnedVersion() &&
51
- this.instances.some(function (_a) {
52
- var version = _a.version;
53
- return version !== _this.versionGroup.getPinnedVersion();
54
- }));
55
- };
47
+ }
48
+ getHighestVersion() {
49
+ return (0, ts_belt_1.pipe)((0, get_highest_version_1.getHighestVersion)(this.getUniqueVersions()), ts_belt_1.R.getExn);
50
+ }
51
+ getSnappedVersion() {
52
+ const snapTo = this.versionGroup.getSnappedToPackages();
53
+ const version = this.instances
54
+ .filter(({ pkgName }) => snapTo.includes(pkgName))
55
+ .map((instance) => instance.version)
56
+ .find(Boolean);
57
+ if (!version) {
58
+ const pkgNames = (0, print_strings_1.printStrings)(snapTo);
59
+ throw new error_1.BaseError(`${this.name} is in a versionGroup with snapTo:[${pkgNames}], but ${this.name} was not found in those packages`);
60
+ }
61
+ return version;
62
+ }
63
+ isUnsnapped() {
64
+ if (!this.versionGroup.hasSnappedToPackages())
65
+ return false;
66
+ const targetVersion = this.getSnappedVersion();
67
+ return this.instances.some(({ version }) => version !== targetVersion);
68
+ }
56
69
  /** Get version of dependency which is developed in this monorepo */
57
- InstanceGroup.prototype.getWorkspaceVersion = function () {
58
- var _a;
70
+ getWorkspaceVersion() {
59
71
  if (this.hasWorkspaceInstance()) {
60
- return (_a = this.getWorkspaceInstance()) === null || _a === void 0 ? void 0 : _a.packageJsonFile.contents.version;
72
+ return this.getWorkspaceInstance()?.packageJsonFile.contents.version;
61
73
  }
62
74
  throw new error_1.BaseError('getWorkspaceVersion invoked when there is none');
63
- };
75
+ }
64
76
  /** Find instance of this dependency which is developed in this monorepo */
65
- InstanceGroup.prototype.getWorkspaceInstance = function () {
66
- return this.instances.find(function (_a) {
67
- var pathDef = _a.pathDef;
68
- return pathDef.name === 'workspace';
69
- });
70
- };
71
- InstanceGroup.prototype.hasWorkspaceInstance = function () {
77
+ getWorkspaceInstance() {
78
+ return this.instances.find(({ pathDef }) => pathDef.name === 'workspace');
79
+ }
80
+ hasWorkspaceInstance() {
72
81
  return this.getWorkspaceInstance() !== undefined;
73
- };
74
- return InstanceGroup;
75
- }());
82
+ }
83
+ }
76
84
  exports.InstanceGroup = InstanceGroup;
@@ -0,0 +1,2 @@
1
+ /** Convert eg "1" to "1.0.0" which the semver lib does not understand */
2
+ export declare function clean(v: string): string;
@@ -0,0 +1,13 @@
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.clean = void 0;
7
+ const coerce_1 = __importDefault(require("semver/functions/coerce"));
8
+ const valid_1 = __importDefault(require("semver/functions/valid"));
9
+ /** Convert eg "1" to "1.0.0" which the semver lib does not understand */
10
+ function clean(v) {
11
+ return (0, valid_1.default)((0, coerce_1.default)(v)) || '';
12
+ }
13
+ exports.clean = clean;