@rainy-updates/cli 0.5.1 → 0.5.2-rc.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 (42) hide show
  1. package/CHANGELOG.md +68 -1
  2. package/README.md +84 -25
  3. package/dist/bin/cli.js +30 -0
  4. package/dist/commands/audit/mapper.js +1 -1
  5. package/dist/commands/licenses/parser.d.ts +2 -0
  6. package/dist/commands/licenses/parser.js +116 -0
  7. package/dist/commands/licenses/runner.d.ts +9 -0
  8. package/dist/commands/licenses/runner.js +163 -0
  9. package/dist/commands/licenses/sbom.d.ts +10 -0
  10. package/dist/commands/licenses/sbom.js +70 -0
  11. package/dist/commands/resolve/graph/builder.d.ts +20 -0
  12. package/dist/commands/resolve/graph/builder.js +183 -0
  13. package/dist/commands/resolve/graph/conflict.d.ts +20 -0
  14. package/dist/commands/resolve/graph/conflict.js +52 -0
  15. package/dist/commands/resolve/graph/resolver.d.ts +17 -0
  16. package/dist/commands/resolve/graph/resolver.js +71 -0
  17. package/dist/commands/resolve/parser.d.ts +2 -0
  18. package/dist/commands/resolve/parser.js +89 -0
  19. package/dist/commands/resolve/runner.d.ts +13 -0
  20. package/dist/commands/resolve/runner.js +136 -0
  21. package/dist/commands/snapshot/parser.d.ts +2 -0
  22. package/dist/commands/snapshot/parser.js +80 -0
  23. package/dist/commands/snapshot/runner.d.ts +11 -0
  24. package/dist/commands/snapshot/runner.js +115 -0
  25. package/dist/commands/snapshot/store.d.ts +35 -0
  26. package/dist/commands/snapshot/store.js +158 -0
  27. package/dist/commands/unused/matcher.d.ts +22 -0
  28. package/dist/commands/unused/matcher.js +95 -0
  29. package/dist/commands/unused/parser.d.ts +2 -0
  30. package/dist/commands/unused/parser.js +95 -0
  31. package/dist/commands/unused/runner.d.ts +11 -0
  32. package/dist/commands/unused/runner.js +113 -0
  33. package/dist/commands/unused/scanner.d.ts +18 -0
  34. package/dist/commands/unused/scanner.js +129 -0
  35. package/dist/core/impact.d.ts +36 -0
  36. package/dist/core/impact.js +82 -0
  37. package/dist/core/options.d.ts +13 -1
  38. package/dist/core/options.js +35 -13
  39. package/dist/types/index.d.ts +153 -0
  40. package/dist/utils/semver.d.ts +18 -0
  41. package/dist/utils/semver.js +88 -3
  42. package/package.json +1 -1
@@ -45,13 +45,16 @@ export function pickTargetVersion(currentRange, latestVersion, target) {
45
45
  if (!current || target === "latest")
46
46
  return latestVersion;
47
47
  if (target === "patch") {
48
- if (current.major === latest.major && current.minor === latest.minor && latest.patch > current.patch) {
48
+ if (current.major === latest.major &&
49
+ current.minor === latest.minor &&
50
+ latest.patch > current.patch) {
49
51
  return latestVersion;
50
52
  }
51
53
  return null;
52
54
  }
53
55
  if (target === "minor") {
54
- if (current.major === latest.major && compareVersions(latest, current) > 0) {
56
+ if (current.major === latest.major &&
57
+ compareVersions(latest, current) > 0) {
55
58
  return latestVersion;
56
59
  }
57
60
  return null;
@@ -83,7 +86,8 @@ export function pickTargetVersionFromAvailable(currentRange, availableVersions,
83
86
  return sameMajor.length > 0 ? sameMajor[sameMajor.length - 1].raw : null;
84
87
  }
85
88
  if (target === "patch") {
86
- const sameLine = parsed.filter((item) => item.parsed.major === current.major && item.parsed.minor === current.minor);
89
+ const sameLine = parsed.filter((item) => item.parsed.major === current.major &&
90
+ item.parsed.minor === current.minor);
87
91
  return sameLine.length > 0 ? sameLine[sameLine.length - 1].raw : null;
88
92
  }
89
93
  return latestVersion;
@@ -102,3 +106,84 @@ export function clampTarget(requested, maxAllowed) {
102
106
  return requested;
103
107
  return TARGET_ORDER[Math.min(requestedIndex, allowedIndex)];
104
108
  }
109
+ /**
110
+ * Checks whether a concrete version satisfies a semver range expression.
111
+ *
112
+ * Handles the common npm range operators used in peerDependencies:
113
+ * exact: "1.2.3" → version must equal
114
+ * ^: "^1.2.3" → major must match, version must be >=
115
+ * ~: "~1.2.3" → major+minor must match, version must be >=
116
+ * >=: ">=1.2.3" → version must be >=
117
+ * <=: "<=1.2.3" → version must be <=
118
+ * >: ">1.2.3" → version must be >
119
+ * <: "<1.2.3" → version must be <
120
+ * *: "*" | "" → always true
121
+ * ranges: ">=1 <3" → all space-separated clauses AND-ed together
122
+ *
123
+ * Does NOT handle || unions or hyphen ranges — those are rare in peerDependencies
124
+ * and degrade gracefully (returns true to avoid false-positive conflicts).
125
+ */
126
+ export function satisfies(version, range) {
127
+ const trimmedRange = range.trim();
128
+ if (!trimmedRange || trimmedRange === "*")
129
+ return true;
130
+ const parsed = parseVersion(version);
131
+ if (!parsed)
132
+ return true; // non-semver versions (e.g. "latest", "workspace:*") pass through
133
+ // Handle OR unions — split on " || " and return true if any clause matches
134
+ if (trimmedRange.includes("||")) {
135
+ return trimmedRange
136
+ .split("||")
137
+ .some((clause) => satisfies(version, clause.trim()));
138
+ }
139
+ // Handle AND ranges — split on whitespace and require all clauses to match
140
+ const clauses = trimmedRange.split(/\s+/).filter(Boolean);
141
+ if (clauses.length > 1) {
142
+ return clauses.every((clause) => satisfies(version, clause));
143
+ }
144
+ const clause = clauses[0] ?? "";
145
+ const op = parseRangeOperator(clause);
146
+ if (!op)
147
+ return true;
148
+ const cmp = compareVersions(parsed, op.version);
149
+ switch (op.operator) {
150
+ case "^": {
151
+ // same major, version >= bound
152
+ return parsed.major === op.version.major && cmp >= 0;
153
+ }
154
+ case "~": {
155
+ // same major+minor, version >= bound
156
+ return (parsed.major === op.version.major &&
157
+ parsed.minor === op.version.minor &&
158
+ cmp >= 0);
159
+ }
160
+ case ">=":
161
+ return cmp >= 0;
162
+ case "<=":
163
+ return cmp <= 0;
164
+ case ">":
165
+ return cmp > 0;
166
+ case "<":
167
+ return cmp < 0;
168
+ case "=":
169
+ return cmp === 0;
170
+ default:
171
+ return true;
172
+ }
173
+ }
174
+ function parseRangeOperator(clause) {
175
+ const ops = [">=", "<=", "^", "~", ">", "<", "="];
176
+ for (const op of ops) {
177
+ if (clause.startsWith(op)) {
178
+ const versionStr = clause.slice(op.length);
179
+ const parsed = parseVersion(versionStr);
180
+ if (parsed)
181
+ return { operator: op, version: parsed };
182
+ }
183
+ }
184
+ // Bare version string — treat as exact
185
+ const parsed = parseVersion(clause);
186
+ if (parsed)
187
+ return { operator: "=", version: parsed };
188
+ return null;
189
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rainy-updates/cli",
3
- "version": "0.5.1",
3
+ "version": "0.5.2-rc.1",
4
4
  "description": "The fastest DevOps-first dependency CLI. Checks, audits, upgrades, bisects, and automates npm/pnpm dependencies in CI.",
5
5
  "type": "module",
6
6
  "private": false,