@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.
- package/CHANGELOG.md +68 -1
- package/README.md +84 -25
- package/dist/bin/cli.js +30 -0
- package/dist/commands/audit/mapper.js +1 -1
- package/dist/commands/licenses/parser.d.ts +2 -0
- package/dist/commands/licenses/parser.js +116 -0
- package/dist/commands/licenses/runner.d.ts +9 -0
- package/dist/commands/licenses/runner.js +163 -0
- package/dist/commands/licenses/sbom.d.ts +10 -0
- package/dist/commands/licenses/sbom.js +70 -0
- package/dist/commands/resolve/graph/builder.d.ts +20 -0
- package/dist/commands/resolve/graph/builder.js +183 -0
- package/dist/commands/resolve/graph/conflict.d.ts +20 -0
- package/dist/commands/resolve/graph/conflict.js +52 -0
- package/dist/commands/resolve/graph/resolver.d.ts +17 -0
- package/dist/commands/resolve/graph/resolver.js +71 -0
- package/dist/commands/resolve/parser.d.ts +2 -0
- package/dist/commands/resolve/parser.js +89 -0
- package/dist/commands/resolve/runner.d.ts +13 -0
- package/dist/commands/resolve/runner.js +136 -0
- package/dist/commands/snapshot/parser.d.ts +2 -0
- package/dist/commands/snapshot/parser.js +80 -0
- package/dist/commands/snapshot/runner.d.ts +11 -0
- package/dist/commands/snapshot/runner.js +115 -0
- package/dist/commands/snapshot/store.d.ts +35 -0
- package/dist/commands/snapshot/store.js +158 -0
- package/dist/commands/unused/matcher.d.ts +22 -0
- package/dist/commands/unused/matcher.js +95 -0
- package/dist/commands/unused/parser.d.ts +2 -0
- package/dist/commands/unused/parser.js +95 -0
- package/dist/commands/unused/runner.d.ts +11 -0
- package/dist/commands/unused/runner.js +113 -0
- package/dist/commands/unused/scanner.d.ts +18 -0
- package/dist/commands/unused/scanner.js +129 -0
- package/dist/core/impact.d.ts +36 -0
- package/dist/core/impact.js +82 -0
- package/dist/core/options.d.ts +13 -1
- package/dist/core/options.js +35 -13
- package/dist/types/index.d.ts +153 -0
- package/dist/utils/semver.d.ts +18 -0
- package/dist/utils/semver.js +88 -3
- package/package.json +1 -1
package/dist/utils/semver.js
CHANGED
|
@@ -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 &&
|
|
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 &&
|
|
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 &&
|
|
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