syncpack 13.0.1 → 14.0.0-alpha.2

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 (233) hide show
  1. package/README.md +0 -3
  2. package/index.js +48 -0
  3. package/package.json +16 -73
  4. package/schema.json +917 -0
  5. package/syncpack.d.ts +122 -0
  6. package/LICENSE +0 -20
  7. package/dist/bin-fix-mismatches/fix-mismatches.d.ts +0 -16
  8. package/dist/bin-fix-mismatches/fix-mismatches.js +0 -115
  9. package/dist/bin-fix-mismatches/index.d.ts +0 -2
  10. package/dist/bin-fix-mismatches/index.js +0 -33
  11. package/dist/bin-format/format.d.ts +0 -13
  12. package/dist/bin-format/format.js +0 -92
  13. package/dist/bin-format/index.d.ts +0 -2
  14. package/dist/bin-format/index.js +0 -28
  15. package/dist/bin-lint/index.d.ts +0 -2
  16. package/dist/bin-lint/index.js +0 -17
  17. package/dist/bin-lint/lint.d.ts +0 -11
  18. package/dist/bin-lint/lint.js +0 -52
  19. package/dist/bin-lint-semver-ranges/index.d.ts +0 -2
  20. package/dist/bin-lint-semver-ranges/index.js +0 -30
  21. package/dist/bin-lint-semver-ranges/lint-semver-ranges.d.ts +0 -16
  22. package/dist/bin-lint-semver-ranges/lint-semver-ranges.js +0 -92
  23. package/dist/bin-list/index.d.ts +0 -2
  24. package/dist/bin-list/index.js +0 -27
  25. package/dist/bin-list/list.d.ts +0 -14
  26. package/dist/bin-list/list.js +0 -151
  27. package/dist/bin-list-mismatches/index.d.ts +0 -2
  28. package/dist/bin-list-mismatches/index.js +0 -29
  29. package/dist/bin-list-mismatches/list-mismatches.d.ts +0 -18
  30. package/dist/bin-list-mismatches/list-mismatches.js +0 -224
  31. package/dist/bin-prompt/index.d.ts +0 -2
  32. package/dist/bin-prompt/index.js +0 -29
  33. package/dist/bin-prompt/prompt.d.ts +0 -11
  34. package/dist/bin-prompt/prompt.js +0 -95
  35. package/dist/bin-set-semver-ranges/index.d.ts +0 -2
  36. package/dist/bin-set-semver-ranges/index.js +0 -32
  37. package/dist/bin-set-semver-ranges/set-semver-ranges.d.ts +0 -11
  38. package/dist/bin-set-semver-ranges/set-semver-ranges.js +0 -61
  39. package/dist/bin-update/effects.d.ts +0 -52
  40. package/dist/bin-update/effects.js +0 -282
  41. package/dist/bin-update/index.d.ts +0 -2
  42. package/dist/bin-update/index.js +0 -24
  43. package/dist/bin-update/update.d.ts +0 -6
  44. package/dist/bin-update/update.js +0 -59
  45. package/dist/bin.d.ts +0 -2
  46. package/dist/bin.js +0 -37
  47. package/dist/config/get-custom-types.d.ts +0 -19
  48. package/dist/config/get-custom-types.js +0 -57
  49. package/dist/config/get-enabled-types.d.ts +0 -17
  50. package/dist/config/get-enabled-types.js +0 -109
  51. package/dist/config/get-filter.d.ts +0 -2
  52. package/dist/config/get-filter.js +0 -10
  53. package/dist/config/get-indent.d.ts +0 -2
  54. package/dist/config/get-indent.js +0 -9
  55. package/dist/config/get-sort-az.d.ts +0 -2
  56. package/dist/config/get-sort-az.js +0 -8
  57. package/dist/config/get-sort-exports.d.ts +0 -2
  58. package/dist/config/get-sort-exports.js +0 -9
  59. package/dist/config/get-sort-first.d.ts +0 -2
  60. package/dist/config/get-sort-first.js +0 -8
  61. package/dist/config/get-source.d.ts +0 -2
  62. package/dist/config/get-source.js +0 -8
  63. package/dist/config/tag.d.ts +0 -3
  64. package/dist/config/tag.js +0 -2
  65. package/dist/config/types.d.ts +0 -134
  66. package/dist/config/types.js +0 -1
  67. package/dist/constants.d.ts +0 -106
  68. package/dist/constants.js +0 -103
  69. package/dist/error-handlers/default-error-handlers.d.ts +0 -25
  70. package/dist/error-handlers/default-error-handlers.js +0 -80
  71. package/dist/get-context/index.d.ts +0 -23
  72. package/dist/get-context/index.js +0 -18
  73. package/dist/get-context/lib/key-by.d.ts +0 -6
  74. package/dist/get-context/lib/key-by.js +0 -12
  75. package/dist/get-instances/index.d.ts +0 -14
  76. package/dist/get-instances/index.js +0 -42
  77. package/dist/get-instances/instance.d.ts +0 -26
  78. package/dist/get-instances/instance.js +0 -35
  79. package/dist/get-package-json-files/get-file-paths.d.ts +0 -21
  80. package/dist/get-package-json-files/get-file-paths.js +0 -22
  81. package/dist/get-package-json-files/get-patterns/get-lerna-patterns.d.ts +0 -3
  82. package/dist/get-package-json-files/get-patterns/get-lerna-patterns.js +0 -12
  83. package/dist/get-package-json-files/get-patterns/get-pnpm-patterns.d.ts +0 -3
  84. package/dist/get-package-json-files/get-patterns/get-pnpm-patterns.js +0 -14
  85. package/dist/get-package-json-files/get-patterns/get-yarn-patterns.d.ts +0 -3
  86. package/dist/get-package-json-files/get-patterns/get-yarn-patterns.js +0 -16
  87. package/dist/get-package-json-files/get-patterns/index.d.ts +0 -8
  88. package/dist/get-package-json-files/get-patterns/index.js +0 -23
  89. package/dist/get-package-json-files/index.d.ts +0 -10
  90. package/dist/get-package-json-files/index.js +0 -8
  91. package/dist/get-package-json-files/package-json-file.d.ts +0 -54
  92. package/dist/get-package-json-files/package-json-file.js +0 -44
  93. package/dist/guards/can-add-to-group.d.ts +0 -5
  94. package/dist/guards/can-add-to-group.js +0 -58
  95. package/dist/guards/is-semver.d.ts +0 -2
  96. package/dist/guards/is-semver.js +0 -15
  97. package/dist/guards/is-valid-semver-range.d.ts +0 -3
  98. package/dist/guards/is-valid-semver-range.js +0 -14
  99. package/dist/index.d.ts +0 -2
  100. package/dist/index.js +0 -1
  101. package/dist/io/ask-for-choice.d.ts +0 -14
  102. package/dist/io/ask-for-choice.js +0 -17
  103. package/dist/io/ask-for-input.d.ts +0 -13
  104. package/dist/io/ask-for-input.js +0 -14
  105. package/dist/io/exit-if-invalid.d.ts +0 -4
  106. package/dist/io/exit-if-invalid.js +0 -9
  107. package/dist/io/glob-sync.d.ts +0 -11
  108. package/dist/io/glob-sync.js +0 -14
  109. package/dist/io/index.d.ts +0 -27
  110. package/dist/io/index.js +0 -26
  111. package/dist/io/read-config-file.d.ts +0 -7
  112. package/dist/io/read-config-file.js +0 -24
  113. package/dist/io/read-file-sync.d.ts +0 -12
  114. package/dist/io/read-file-sync.js +0 -9
  115. package/dist/io/read-json-file-sync.d.ts +0 -31
  116. package/dist/io/read-json-file-sync.js +0 -23
  117. package/dist/io/read-yaml-file-sync.d.ts +0 -12
  118. package/dist/io/read-yaml-file-sync.js +0 -9
  119. package/dist/io/to-formatted-json.d.ts +0 -9
  120. package/dist/io/to-formatted-json.js +0 -32
  121. package/dist/io/write-file-sync.d.ts +0 -12
  122. package/dist/io/write-file-sync.js +0 -10
  123. package/dist/io/write-if-changed.d.ts +0 -5
  124. package/dist/io/write-if-changed.js +0 -9
  125. package/dist/lib/format-repository-url.d.ts +0 -1
  126. package/dist/lib/format-repository-url.js +0 -40
  127. package/dist/lib/get-group-header.d.ts +0 -10
  128. package/dist/lib/get-group-header.js +0 -25
  129. package/dist/lib/get.d.ts +0 -11
  130. package/dist/lib/get.js +0 -44
  131. package/dist/lib/pad-start.d.ts +0 -1
  132. package/dist/lib/pad-start.js +0 -3
  133. package/dist/lib/ring-buffer.d.ts +0 -10
  134. package/dist/lib/ring-buffer.js +0 -20
  135. package/dist/lib/set-semver-range.d.ts +0 -3
  136. package/dist/lib/set-semver-range.js +0 -24
  137. package/dist/lib/show-help-on-error.d.ts +0 -2
  138. package/dist/lib/show-help-on-error.js +0 -32
  139. package/dist/lib/sort-by-name.d.ts +0 -5
  140. package/dist/lib/sort-by-name.js +0 -9
  141. package/dist/lib/with-logger.d.ts +0 -2
  142. package/dist/lib/with-logger.js +0 -28
  143. package/dist/option.d.ts +0 -10
  144. package/dist/option.js +0 -30
  145. package/dist/report.d.ts +0 -131
  146. package/dist/report.js +0 -129
  147. package/dist/schema.json +0 -614
  148. package/dist/semver-group/create-semver-groups.d.ts +0 -4
  149. package/dist/semver-group/create-semver-groups.js +0 -83
  150. package/dist/semver-group/disabled.d.ts +0 -26
  151. package/dist/semver-group/disabled.js +0 -28
  152. package/dist/semver-group/filtered-out.d.ts +0 -27
  153. package/dist/semver-group/filtered-out.js +0 -34
  154. package/dist/semver-group/ignored.d.ts +0 -22
  155. package/dist/semver-group/ignored.js +0 -24
  156. package/dist/semver-group/index.d.ts +0 -20
  157. package/dist/semver-group/index.js +0 -7
  158. package/dist/semver-group/with-range.d.ts +0 -22
  159. package/dist/semver-group/with-range.js +0 -45
  160. package/dist/specifier/alias.d.ts +0 -17
  161. package/dist/specifier/alias.js +0 -21
  162. package/dist/specifier/base.d.ts +0 -41
  163. package/dist/specifier/base.js +0 -54
  164. package/dist/specifier/delete.d.ts +0 -17
  165. package/dist/specifier/delete.js +0 -16
  166. package/dist/specifier/exact.d.ts +0 -20
  167. package/dist/specifier/exact.js +0 -21
  168. package/dist/specifier/file.d.ts +0 -8
  169. package/dist/specifier/file.js +0 -7
  170. package/dist/specifier/hosted-git.d.ts +0 -15
  171. package/dist/specifier/hosted-git.js +0 -24
  172. package/dist/specifier/index.d.ts +0 -28
  173. package/dist/specifier/index.js +0 -75
  174. package/dist/specifier/latest.d.ts +0 -19
  175. package/dist/specifier/latest.js +0 -20
  176. package/dist/specifier/lib/non-semver-error.d.ts +0 -11
  177. package/dist/specifier/lib/non-semver-error.js +0 -6
  178. package/dist/specifier/lib/parse-specifier.d.ts +0 -14
  179. package/dist/specifier/lib/parse-specifier.js +0 -18
  180. package/dist/specifier/lib/specific-registry-result.d.ts +0 -9
  181. package/dist/specifier/lib/specific-registry-result.js +0 -1
  182. package/dist/specifier/range.d.ts +0 -19
  183. package/dist/specifier/range.js +0 -20
  184. package/dist/specifier/tag.d.ts +0 -11
  185. package/dist/specifier/tag.js +0 -10
  186. package/dist/specifier/unsupported.d.ts +0 -7
  187. package/dist/specifier/unsupported.js +0 -7
  188. package/dist/specifier/url.d.ts +0 -8
  189. package/dist/specifier/url.js +0 -7
  190. package/dist/specifier/workspace-protocol.d.ts +0 -19
  191. package/dist/specifier/workspace-protocol.js +0 -35
  192. package/dist/strategy/lib/get-non-empty-string-prop.d.ts +0 -3
  193. package/dist/strategy/lib/get-non-empty-string-prop.js +0 -7
  194. package/dist/strategy/name-and-version-props.d.ts +0 -12
  195. package/dist/strategy/name-and-version-props.js +0 -60
  196. package/dist/strategy/named-version-string.d.ts +0 -11
  197. package/dist/strategy/named-version-string.js +0 -52
  198. package/dist/strategy/unnamed-version-string.d.ts +0 -11
  199. package/dist/strategy/unnamed-version-string.js +0 -45
  200. package/dist/strategy/versions-by-name.d.ts +0 -11
  201. package/dist/strategy/versions-by-name.js +0 -27
  202. package/dist/version-group/banned.d.ts +0 -17
  203. package/dist/version-group/banned.js +0 -26
  204. package/dist/version-group/create-version-groups.d.ts +0 -4
  205. package/dist/version-group/create-version-groups.js +0 -118
  206. package/dist/version-group/filtered-out.d.ts +0 -19
  207. package/dist/version-group/filtered-out.js +0 -30
  208. package/dist/version-group/ignored.d.ts +0 -17
  209. package/dist/version-group/ignored.js +0 -23
  210. package/dist/version-group/index.d.ts +0 -26
  211. package/dist/version-group/index.js +0 -7
  212. package/dist/version-group/lib/clean.d.ts +0 -2
  213. package/dist/version-group/lib/clean.js +0 -6
  214. package/dist/version-group/lib/delete.d.ts +0 -2
  215. package/dist/version-group/lib/delete.js +0 -1
  216. package/dist/version-group/lib/get-highest-version.d.ts +0 -6
  217. package/dist/version-group/lib/get-highest-version.js +0 -8
  218. package/dist/version-group/lib/get-lowest-version.d.ts +0 -6
  219. package/dist/version-group/lib/get-lowest-version.js +0 -8
  220. package/dist/version-group/lib/get-preferred-version.d.ts +0 -5
  221. package/dist/version-group/lib/get-preferred-version.js +0 -53
  222. package/dist/version-group/lib/get-range-score.d.ts +0 -2
  223. package/dist/version-group/lib/get-range-score.js +0 -20
  224. package/dist/version-group/lib/group-by.d.ts +0 -5
  225. package/dist/version-group/lib/group-by.js +0 -11
  226. package/dist/version-group/pinned.d.ts +0 -17
  227. package/dist/version-group/pinned.js +0 -26
  228. package/dist/version-group/same-range.d.ts +0 -19
  229. package/dist/version-group/same-range.js +0 -96
  230. package/dist/version-group/snapped-to.d.ts +0 -17
  231. package/dist/version-group/snapped-to.js +0 -71
  232. package/dist/version-group/standard.d.ts +0 -18
  233. package/dist/version-group/standard.js +0 -119
@@ -1,118 +0,0 @@
1
- import { Effect } from 'effect';
2
- import { isArrayOfStrings } from 'tightrope/guard/is-array-of-strings.js';
3
- import { isNonEmptyArray } from 'tightrope/guard/is-non-empty-array.js';
4
- import { isNonEmptyString } from 'tightrope/guard/is-non-empty-string.js';
5
- import { isObject } from 'tightrope/guard/is-object.js';
6
- import { BannedVersionGroup } from './banned.js';
7
- import { FilteredOutVersionGroup } from './filtered-out.js';
8
- import { IgnoredVersionGroup } from './ignored.js';
9
- import { VersionGroup } from './index.js';
10
- import { PinnedVersionGroup } from './pinned.js';
11
- import { SameRangeVersionGroup } from './same-range.js';
12
- import { SnappedToVersionGroup } from './snapped-to.js';
13
- import { StandardVersionGroup } from './standard.js';
14
- export function createVersionGroups(ctx) {
15
- const { rcFile } = ctx.config;
16
- const versionGroups = [Effect.succeed(new FilteredOutVersionGroup(ctx))];
17
- if (isNonEmptyArray(rcFile.versionGroups)) {
18
- rcFile.versionGroups.forEach((config) => {
19
- if (!isObject(config)) {
20
- return versionGroups.push(Effect.fail(new VersionGroup.ConfigError({
21
- config,
22
- error: 'config is not an object',
23
- })));
24
- }
25
- const mutuallyExclusiveProps = ['isBanned', 'isIgnored', 'pinVersion', 'snapTo', 'policy'].filter(prop => Boolean(config[prop]));
26
- if (mutuallyExclusiveProps.length > 1) {
27
- return versionGroups.push(Effect.fail(new VersionGroup.ConfigError({
28
- config,
29
- error: `it's unclear what kind of version group you want, as it contains both ${mutuallyExclusiveProps.join(' and ')}`,
30
- })));
31
- }
32
- const label = isNonEmptyString(config.label) ? config.label : '';
33
- const dependencyTypes = isArrayOfStrings(config.dependencyTypes)
34
- ? config.dependencyTypes
35
- : ['**'];
36
- const dependencies = isArrayOfStrings(config.dependencies)
37
- ? config.dependencies
38
- : ['**'];
39
- const packages = isArrayOfStrings(config.packages)
40
- ? config.packages
41
- : ['**'];
42
- const specifierTypes = isArrayOfStrings(config.specifierTypes)
43
- ? config.specifierTypes
44
- : ['**'];
45
- if (config.isBanned === true) {
46
- versionGroups.push(Effect.succeed(new BannedVersionGroup({
47
- dependencies,
48
- dependencyTypes,
49
- specifierTypes,
50
- isBanned: true,
51
- label,
52
- packages,
53
- })));
54
- }
55
- else if (config.isIgnored === true) {
56
- versionGroups.push(Effect.succeed(new IgnoredVersionGroup({
57
- dependencies,
58
- dependencyTypes,
59
- specifierTypes,
60
- isIgnored: true,
61
- label,
62
- packages,
63
- })));
64
- }
65
- else if (isNonEmptyString(config.pinVersion)) {
66
- versionGroups.push(Effect.succeed(new PinnedVersionGroup({
67
- dependencies,
68
- dependencyTypes,
69
- specifierTypes,
70
- label,
71
- packages,
72
- pinVersion: config.pinVersion,
73
- })));
74
- }
75
- else if (isArrayOfStrings(config.snapTo)) {
76
- versionGroups.push(Effect.succeed(new SnappedToVersionGroup({
77
- dependencies,
78
- dependencyTypes,
79
- specifierTypes,
80
- label,
81
- packages,
82
- snapTo: config.snapTo,
83
- })));
84
- }
85
- else if (config.policy === 'sameRange') {
86
- versionGroups.push(Effect.succeed(new SameRangeVersionGroup(ctx, {
87
- dependencies,
88
- dependencyTypes,
89
- specifierTypes,
90
- label,
91
- packages,
92
- policy: config.policy,
93
- })));
94
- }
95
- else {
96
- versionGroups.push(Effect.succeed(new StandardVersionGroup(false, {
97
- dependencies,
98
- dependencyTypes,
99
- specifierTypes,
100
- label,
101
- packages,
102
- preferVersion: config.preferVersion === 'lowestSemver'
103
- ? 'lowestSemver'
104
- : 'highestSemver',
105
- })));
106
- }
107
- });
108
- }
109
- versionGroups.push(Effect.succeed(new StandardVersionGroup(true, {
110
- dependencies: ['**'],
111
- dependencyTypes: ['**'],
112
- specifierTypes: ['**'],
113
- label: 'Default Version Group',
114
- packages: ['**'],
115
- preferVersion: 'highestSemver',
116
- })));
117
- return Effect.all(versionGroups);
118
- }
@@ -1,19 +0,0 @@
1
- import { Effect } from 'effect';
2
- import type { GroupConfig } from '../config/types.js';
3
- import type { Ctx } from '../get-context/index.js';
4
- import type { Instance } from '../get-instances/instance.js';
5
- import { Report } from '../report.js';
6
- declare const FilteredOutVersionGroup_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => Readonly<A> & {
7
- readonly _tag: "FilteredOut";
8
- };
9
- export declare class FilteredOutVersionGroup extends FilteredOutVersionGroup_base<{
10
- config: GroupConfig;
11
- filter: string;
12
- instances: Instance[];
13
- }> {
14
- groupType: string;
15
- constructor(ctx: Ctx);
16
- canAdd(instance: Instance): boolean;
17
- inspectAll(): Effect.Effect<Report.Version.Group[]>;
18
- }
19
- export {};
@@ -1,30 +0,0 @@
1
- import { Data, Effect } from 'effect';
2
- import { getFilter } from '../config/get-filter.js';
3
- import { Report } from '../report.js';
4
- import { groupBy } from './lib/group-by.js';
5
- export class FilteredOutVersionGroup extends Data.TaggedClass('FilteredOut') {
6
- groupType = 'versionGroup';
7
- constructor(ctx) {
8
- super({
9
- config: {
10
- dependencies: ['**'],
11
- dependencyTypes: ['**'],
12
- label: 'Filtered out',
13
- packages: ['**'],
14
- },
15
- filter: getFilter(ctx.config),
16
- instances: [],
17
- });
18
- }
19
- canAdd(instance) {
20
- return instance.name.search(new RegExp(this.filter)) === -1;
21
- }
22
- inspectAll() {
23
- return Effect.succeed(Object.entries(groupBy('name', this.instances)).map(([name, instances]) => ({
24
- name,
25
- reports: instances.map(instance =>
26
- // ✓ is ignored and dismissed as valid
27
- new Report.FilteredOut(instance)),
28
- })));
29
- }
30
- }
@@ -1,17 +0,0 @@
1
- import { Effect } from 'effect';
2
- import type { VersionGroupConfig } from '../config/types.js';
3
- import type { Instance } from '../get-instances/instance.js';
4
- import { Report } from '../report.js';
5
- declare const IgnoredVersionGroup_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => Readonly<A> & {
6
- readonly _tag: "Ignored";
7
- };
8
- export declare class IgnoredVersionGroup extends IgnoredVersionGroup_base<{
9
- config: VersionGroupConfig.Ignored;
10
- instances: Instance[];
11
- }> {
12
- groupType: string;
13
- constructor(config: VersionGroupConfig.Ignored);
14
- canAdd(_: Instance): boolean;
15
- inspectAll(): Effect.Effect<Report.Version.Group[]>;
16
- }
17
- export {};
@@ -1,23 +0,0 @@
1
- import { Data, Effect } from 'effect';
2
- import { Report } from '../report.js';
3
- import { groupBy } from './lib/group-by.js';
4
- export class IgnoredVersionGroup extends Data.TaggedClass('Ignored') {
5
- groupType = 'versionGroup';
6
- constructor(config) {
7
- super({
8
- config,
9
- instances: [],
10
- });
11
- }
12
- canAdd(_) {
13
- return true;
14
- }
15
- inspectAll() {
16
- return Effect.succeed(Object.entries(groupBy('name', this.instances)).map(([name, instances]) => ({
17
- name,
18
- reports: instances.map(instance =>
19
- // ✓ is ignored and dismissed as valid
20
- new Report.Ignored(instance)),
21
- })));
22
- }
23
- }
@@ -1,26 +0,0 @@
1
- import type { BannedVersionGroup } from './banned.js';
2
- import type { FilteredOutVersionGroup } from './filtered-out.js';
3
- import type { IgnoredVersionGroup } from './ignored.js';
4
- import type { PinnedVersionGroup } from './pinned.js';
5
- import type { SameRangeVersionGroup } from './same-range.js';
6
- import type { SnappedToVersionGroup } from './snapped-to.js';
7
- import type { StandardVersionGroup } from './standard.js';
8
- export declare namespace VersionGroup {
9
- export type Banned = BannedVersionGroup;
10
- export type FilteredOut = FilteredOutVersionGroup;
11
- export type Ignored = IgnoredVersionGroup;
12
- export type Pinned = PinnedVersionGroup;
13
- export type SameRange = SameRangeVersionGroup;
14
- export type SnappedTo = SnappedToVersionGroup;
15
- export type Standard = StandardVersionGroup;
16
- export type Any = Banned | FilteredOut | Ignored | Pinned | SameRange | SnappedTo | Standard;
17
- const ConfigError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => Readonly<A> & {
18
- readonly _tag: "VersionGroupConfigError";
19
- };
20
- export class ConfigError extends ConfigError_base<{
21
- readonly config: unknown;
22
- readonly error: string;
23
- }> {
24
- }
25
- export {};
26
- }
@@ -1,7 +0,0 @@
1
- import { Data } from 'effect';
2
- export var VersionGroup;
3
- (function (VersionGroup) {
4
- class ConfigError extends Data.TaggedClass('VersionGroupConfigError') {
5
- }
6
- VersionGroup.ConfigError = ConfigError;
7
- })(VersionGroup || (VersionGroup = {}));
@@ -1,2 +0,0 @@
1
- /** Convert eg "1" to "1.0.0" which the semver lib does not understand */
2
- export declare function clean(v: string): string;
@@ -1,6 +0,0 @@
1
- import coerce from 'semver/functions/coerce.js';
2
- import valid from 'semver/functions/valid.js';
3
- /** Convert eg "1" to "1.0.0" which the semver lib does not understand */
4
- export function clean(v) {
5
- return valid(coerce(v)) || '';
6
- }
@@ -1,2 +0,0 @@
1
- export declare const DELETE: unique symbol;
2
- export type Delete = typeof DELETE;
@@ -1 +0,0 @@
1
- export const DELETE = Symbol('DELETE');
@@ -1,6 +0,0 @@
1
- import type { Specifier } from '../../specifier/index.js';
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<Specifier.Any, import("../../specifier/lib/non-semver-error.js").NonSemverError, never>;
@@ -1,8 +0,0 @@
1
- import { getPreferredVersion } from './get-preferred-version.js';
2
- /**
3
- * From an array of instances where every instance contains a valid semver
4
- * version, return the highest version number
5
- */
6
- export function getHighestVersion(specifiers) {
7
- return getPreferredVersion('highestSemver', specifiers);
8
- }
@@ -1,6 +0,0 @@
1
- import type { Specifier } from '../../specifier/index.js';
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<Specifier.Any, import("../../specifier/lib/non-semver-error.js").NonSemverError, never>;
@@ -1,8 +0,0 @@
1
- import { getPreferredVersion } from './get-preferred-version.js';
2
- /**
3
- * From an array of instances where every instance contains a valid semver
4
- * version, return the lowest version number
5
- */
6
- export function getLowestVersion(specifiers) {
7
- return getPreferredVersion('lowestSemver', specifiers);
8
- }
@@ -1,5 +0,0 @@
1
- import { Effect } from 'effect';
2
- import type { VersionGroupConfig } from '../../config/types.js';
3
- import type { Specifier } from '../../specifier/index.js';
4
- import type { NonSemverError } from '../../specifier/lib/non-semver-error.js';
5
- export declare function getPreferredVersion(preferVersion: VersionGroupConfig.Standard['preferVersion'], specifiers: Specifier.Any[]): Effect.Effect<Specifier.Any, NonSemverError>;
@@ -1,53 +0,0 @@
1
- import { Effect, pipe } from 'effect';
2
- import gt from 'semver/functions/gt.js';
3
- import lt from 'semver/functions/lt.js';
4
- import { clean } from './clean.js';
5
- import { getRangeScore } from './get-range-score.js';
6
- export function getPreferredVersion(preferVersion, specifiers) {
7
- return pipe(
8
- // every instance must have a semver version
9
- Effect.all(specifiers.map(specifier => pipe(specifier.getSemver(), Effect.map(semver => ({ semver, specifier }))))),
10
- // comparing semver can error on some loose ranges, all must succeed
11
- Effect.map(semvers => semvers.sort((a, b) => compareSemver(a.semver, b.semver))),
12
- // get the preferred value from the list
13
- Effect.map(sorted => sorted[preferVersion === 'lowestSemver' ? 0 : sorted.length - 1]),
14
- // return just the specifier
15
- Effect.map(preferred => preferred?.specifier));
16
- }
17
- const EQ = 0;
18
- const LT = -1;
19
- const GT = 1;
20
- function compareSemver(a, b) {
21
- if (a.startsWith('workspace:')) {
22
- return LT;
23
- }
24
- if (b.startsWith('workspace:')) {
25
- return GT;
26
- }
27
- if (a === b) {
28
- return EQ;
29
- }
30
- if (a === '*') {
31
- return GT;
32
- }
33
- if (b === '*') {
34
- return LT;
35
- }
36
- const cleanA = clean(a);
37
- const cleanB = clean(b);
38
- if (gt(cleanA, cleanB)) {
39
- return GT;
40
- }
41
- if (lt(cleanA, cleanB)) {
42
- return LT;
43
- }
44
- const scoreA = getRangeScore(a);
45
- const scoreB = getRangeScore(b);
46
- if (scoreA < scoreB) {
47
- return LT;
48
- }
49
- if (scoreA > scoreB) {
50
- return GT;
51
- }
52
- return EQ;
53
- }
@@ -1,2 +0,0 @@
1
- /** Rank a Semver Range according to its greediness */
2
- export declare function getRangeScore(version: string): number;
@@ -1,20 +0,0 @@
1
- import { RANGE } from '../../constants.js';
2
- const scoresByRange = {
3
- [RANGE.ANY]: 9,
4
- [RANGE.WORKSPACE]: 8,
5
- [RANGE.GT]: 7,
6
- [RANGE.GTE]: 6,
7
- [RANGE.MINOR]: 5,
8
- [RANGE.LOOSE]: 4,
9
- [RANGE.PATCH]: 3,
10
- [RANGE.EXACT]: 2,
11
- [RANGE.LTE]: 1,
12
- [RANGE.LT]: 0,
13
- };
14
- /** Rank a Semver Range according to its greediness */
15
- export function getRangeScore(version) {
16
- const range = version.indexOf('.x') !== -1
17
- ? RANGE.LOOSE
18
- : version.slice(0, version.search(/[0-9]/));
19
- return scoresByRange[range] || 0;
20
- }
@@ -1,5 +0,0 @@
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,11 +0,0 @@
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 function groupBy(key, array) {
6
- return array.reduce((objectsByKeyValue, obj) => {
7
- const value = obj[key];
8
- objectsByKeyValue[value] = (objectsByKeyValue[value] || []).concat(obj);
9
- return objectsByKeyValue;
10
- }, {});
11
- }
@@ -1,17 +0,0 @@
1
- import { Effect } from 'effect';
2
- import type { VersionGroupConfig } from '../config/types.js';
3
- import type { Instance } from '../get-instances/instance.js';
4
- import { Report } from '../report.js';
5
- declare const PinnedVersionGroup_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => 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<Report.Version.Group[]>;
16
- }
17
- export {};
@@ -1,26 +0,0 @@
1
- import { Data, Effect, pipe } from 'effect';
2
- import { Report } from '../report.js';
3
- import { Specifier } from '../specifier/index.js';
4
- import { groupBy } from './lib/group-by.js';
5
- export class PinnedVersionGroup extends Data.TaggedClass('Pinned') {
6
- groupType = 'versionGroup';
7
- constructor(config) {
8
- super({
9
- config,
10
- instances: [],
11
- });
12
- }
13
- canAdd(_) {
14
- return true;
15
- }
16
- inspectAll() {
17
- return Effect.all(Object.entries(groupBy('name', this.instances)).map(([name, instances]) => pipe(instances, Effect.forEach(instance => pipe(Effect.succeed(Specifier.create(instance, this.config.pinVersion)), Effect.map(expected => instance.rawSpecifier.raw === expected.raw
18
- ? // ✓ pinned takes precedence over any semver group
19
- // ✓ current version matches expected
20
- new Report.Valid(expected)
21
- : // ✓ pinned takes precedence over any semver group
22
- // ✘ current version mismatches expected
23
- // ✓ is a mismatch we can auto-fix
24
- new Report.PinnedMismatch(expected)))), Effect.map(reports => ({ name, reports })))));
25
- }
26
- }
@@ -1,19 +0,0 @@
1
- import { Effect } from 'effect';
2
- import type { VersionGroupConfig } from '../config/types.js';
3
- import type { Ctx } from '../get-context/index.js';
4
- import type { Instance } from '../get-instances/instance.js';
5
- import { Report } from '../report.js';
6
- declare const SameRangeVersionGroup_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => 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<Report.Version.Group[]>;
18
- }
19
- export {};
@@ -1,96 +0,0 @@
1
- import { Data, Effect, pipe } from 'effect';
2
- import intersects from 'semver/ranges/intersects.js';
3
- import { uniq } from 'tightrope/array/uniq.js';
4
- import { Report } from '../report.js';
5
- import { Specifier } from '../specifier/index.js';
6
- import { groupBy } from './lib/group-by.js';
7
- export class SameRangeVersionGroup extends Data.TaggedClass('SameRange') {
8
- groupType = 'versionGroup';
9
- constructor(ctx, config) {
10
- super({
11
- ctx,
12
- config,
13
- instances: [],
14
- });
15
- }
16
- canAdd(_) {
17
- return true;
18
- }
19
- inspectAll() {
20
- return Effect.all(Object.entries(groupBy('name', this.instances)).flatMap(([name, instances]) => pipe(instances, Effect.partition(instance => pipe(Effect.succeed(Specifier.create(instance, instance.rawSpecifier.raw)), Effect.flatMap(specifier => pipe(specifier.getSemver(), Effect.matchEffect({
21
- onFailure: () => Effect.fail(
22
- // ✘ expected version is not semver
23
- // ✘ is a mismatch we can't auto-fix
24
- new Report.UnsupportedMismatch(specifier.instance)),
25
- onSuccess: () => pipe(specifier.instance.semverGroup.getFixed(specifier), Effect.matchEffect({
26
- onFailure: () => Effect.fail(
27
- // ✓ expected version is semver
28
- // ✘ expected version is not fixable by its semver group
29
- // ✘ is a mismatch we can't auto-fix
30
- new Report.UnsupportedMismatch(specifier.instance)),
31
- onSuccess: valid => specifier.instance.rawSpecifier.raw === valid.raw
32
- ? Effect.succeed(
33
- // ✓ expected version is semver
34
- // ✓ expected version matches its semver group
35
- // ✓ current version matches expected
36
- new Report.Valid(specifier))
37
- : Effect.fail(
38
- // ✓ expected version is semver
39
- // ✓ expected version matches its semver group
40
- // ✘ current version mismatches expected
41
- // ✓ is a mismatch we can auto-fix
42
- new Report.SemverRangeMismatch(valid)),
43
- })),
44
- }))))), Effect.map(([allMismatches, allMatches]) => allMismatches.length === 0
45
- ? allMatches.map(thisMatch => {
46
- if (thisMatch.specifier.instance.strategy.name === 'local') {
47
- // ✓ every instance is valid on its own
48
- // ✓ expected version is semver
49
- // ! is the original local package
50
- // ✓ others must match this, not the other way around
51
- return thisMatch;
52
- }
53
- const mismatches = getRangeMismatches(this.ctx, thisMatch, allMatches);
54
- if (mismatches.length === 0) {
55
- // ✓ every instance is valid on its own
56
- // ✓ expected version is semver
57
- // ✓ expected version matches its semver group
58
- // ✓ current version matches expected
59
- // ! is not the original local package
60
- // ✓ current specifier matches every other specifier
61
- return thisMatch;
62
- }
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 does not match every other specifier
69
- return new Report.SameRangeMismatch(thisMatch.specifier.instance, uniq(mismatches.map(report => String(report.specifier.instance.rawSpecifier.raw))));
70
- })
71
- : // ✘ not every instance is valid on its own
72
- // ! report on their validity individually ! when all are valid
73
- // they can progress to being checked for having compatible
74
- // ranges
75
- [...allMatches, ...allMismatches]), Effect.map(reports => ({ name, reports })))));
76
- }
77
- }
78
- /** Find all ranges/versions which this semver version does not cover */
79
- function getRangeMismatches(ctx, report, others) {
80
- return others.filter(other => !matchesRange(ctx, report, other));
81
- }
82
- /** Does semver version `a` match semver version `b`? */
83
- function matchesRange(ctx, a, b) {
84
- const loose = true;
85
- return intersects(unwrapSemver(ctx, a.specifier), unwrapSemver(ctx, b.specifier), loose);
86
- }
87
- /** Get the semver version synchronously from a specifier known to contain semver */
88
- function unwrapSemver(ctx, specifier) {
89
- if (specifier._tag === 'Range' || specifier._tag === 'Exact') {
90
- return specifier.raw;
91
- }
92
- if (specifier._tag === 'WorkspaceProtocol') {
93
- return Effect.runSync(specifier.getSemverEquivalent(ctx));
94
- }
95
- return Effect.runSync(specifier.getSemver());
96
- }
@@ -1,17 +0,0 @@
1
- import { Effect } from 'effect';
2
- import type { VersionGroupConfig } from '../config/types.js';
3
- import type { Instance } from '../get-instances/instance.js';
4
- import { Report } from '../report.js';
5
- declare const SnappedToVersionGroup_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => 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<Report.Version.Group[]>;
16
- }
17
- export {};