Skip to content

Commit 9c2ceb6

Browse files
committed
[cli] add pinned deps support to mops update and mops outdated
1 parent cbe7c51 commit 9c2ceb6

5 files changed

Lines changed: 52 additions & 11 deletions

File tree

cli/commands/add.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ export async function add(name : string, {verbose = false, dev = false, lock} :
8383
}
8484

8585
pkgDetails = {
86-
name: name,
86+
name: asName || name,
8787
repo: '',
8888
version: ver,
8989
};

cli/commands/available-updates.ts

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ import process from 'node:process';
22
import chalk from 'chalk';
33
import {mainActor} from '../api/actors.js';
44
import {Config} from '../types.js';
5-
import {getDepName} from '../helpers/get-dep-name.js';
5+
import {getDepName, getDepPinnedVersion} from '../helpers/get-dep-name.js';
6+
import {SemverPart} from '../declarations/main/main.did.js';
67

78
// [pkg, oldVersion, newVersion]
89
export async function getAvailableUpdates(config : Config, pkg ?: string) : Promise<Array<[string, string, string]>> {
@@ -11,25 +12,37 @@ export async function getAvailableUpdates(config : Config, pkg ?: string) : Prom
1112
let allDeps = [...deps, ...devDeps].filter((dep) => dep.version);
1213
let depsToUpdate = pkg ? allDeps.filter((dep) => dep.name === pkg) : allDeps;
1314

14-
// skip pinned dependencies
15-
depsToUpdate = depsToUpdate.filter((dep) => getDepName(dep.name) === dep.name);
15+
// skip hard pinned dependencies (e.g. "base@X.Y.Z")
16+
depsToUpdate = depsToUpdate.filter((dep) => getDepName(dep.name) === dep.name || getDepPinnedVersion(dep.name).split('.').length !== 3);
1617

17-
let getCurrentVersion = (pkg : string) => {
18+
let getCurrentVersion = (pkg : string, updateVersion : string) => {
1819
for (let dep of allDeps) {
19-
if (dep.name === pkg && dep.version) {
20+
if (getDepName(dep.name) === pkg && dep.version) {
21+
let pinnedVersion = getDepPinnedVersion(dep.name);
22+
if (pinnedVersion && !updateVersion.startsWith(pinnedVersion)) {
23+
continue;
24+
}
2025
return dep.version;
2126
}
2227
}
2328
return '';
2429
};
2530

2631
let actor = await mainActor();
27-
let res = await actor.getHighestSemverBatch(depsToUpdate.map((dep) => [dep.name, dep.version || '', {major: null}]));
32+
let res = await actor.getHighestSemverBatch(depsToUpdate.map((dep) => {
33+
let semverPart : SemverPart = {major: null};
34+
let name = getDepName(dep.name);
35+
let pinnedVersion = getDepPinnedVersion(dep.name);
36+
if (pinnedVersion) {
37+
semverPart = pinnedVersion.split('.').length === 1 ? {minor: null} : {patch: null};
38+
}
39+
return [name, dep.version || '', semverPart];
40+
}));
2841

2942
if ('err' in res) {
3043
console.log(chalk.red('Error:'), res.err);
3144
process.exit(1);
3245
}
3346

34-
return res.ok.filter((dep) => dep[1] !== getCurrentVersion(dep[0])).map((dep) => [dep[0], getCurrentVersion(dep[0]), dep[1]]);
47+
return res.ok.filter((dep) => dep[1] !== getCurrentVersion(dep[0], dep[1])).map((dep) => [dep[0], getCurrentVersion(dep[0], dep[1]), dep[1]]);
3548
}

cli/commands/outdated.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import chalk from 'chalk';
22
import {checkConfigFile, readConfig} from '../mops.js';
33
import {getAvailableUpdates} from './available-updates.js';
4+
import {getDepName, getDepPinnedVersion} from '../helpers/get-dep-name.js';
45

56
export async function outdated() {
67
if (!checkConfigFile()) {
@@ -15,8 +16,14 @@ export async function outdated() {
1516
}
1617
else {
1718
console.log('Available updates:');
19+
let allDeps = [...Object.keys(config.dependencies || {}), ...Object.keys(config['dev-dependencies'] || {})];
1820
for (let dep of available) {
19-
console.log(`${dep[0]} ${chalk.yellow(dep[1])} -> ${chalk.green(dep[2])}`);
21+
let name = allDeps.find((d) => {
22+
let pinnedVersion = getDepPinnedVersion(d);
23+
return getDepName(d) === dep[0] && (!pinnedVersion || dep[1].startsWith(pinnedVersion));
24+
}) || dep[0];
25+
26+
console.log(`${name} ${chalk.yellow(dep[1])} -> ${chalk.green(dep[2])}`);
2027
}
2128
}
2229
}

cli/commands/update.ts

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {checkConfigFile, getGithubCommit, parseGithubURL, readConfig} from '../m
33
import {add} from './add.js';
44
import {getAvailableUpdates} from './available-updates.js';
55
import {checkIntegrity} from '../integrity.js';
6+
import {getDepName, getDepPinnedVersion} from '../helpers/get-dep-name.js';
67

78
type UpdateOptions = {
89
verbose ?: boolean;
@@ -51,8 +52,24 @@ export async function update(pkg ?: string, {lock} : UpdateOptions = {}) {
5152
}
5253
else {
5354
for (let dep of available) {
54-
let dev = !!config['dev-dependencies']?.[dep[0]];
55-
await add(`${dep[0]}@${dep[2]}`, {dev});
55+
let devDeps = Object.keys(config['dev-dependencies'] || {});
56+
let allDeps = [...Object.keys(config.dependencies || {}), ...devDeps];
57+
58+
let dev = false;
59+
for (let d of devDeps) {
60+
let pinnedVersion = getDepPinnedVersion(d);
61+
if (getDepName(d) === dep[0] && (!pinnedVersion || dep[1].startsWith(pinnedVersion))) {
62+
dev = true;
63+
break;
64+
}
65+
}
66+
67+
let asName = allDeps.find((d) => {
68+
let pinnedVersion = getDepPinnedVersion(d);
69+
return getDepName(d) === dep[0] && (!pinnedVersion || dep[1].startsWith(pinnedVersion));
70+
}) || dep[0];
71+
72+
await add(`${dep[0]}@${dep[2]}`, {dev}, asName);
5673
}
5774
}
5875

cli/helpers/get-dep-name.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
export function getDepName(name : string) : string {
22
return name.split('@')[0] || '';
3+
}
4+
5+
export function getDepPinnedVersion(name : string) : string {
6+
return name.split('@')[1] || '';
37
}

0 commit comments

Comments
 (0)