comze 0.1.0 → 0.2.0

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 (2) hide show
  1. package/dist/cli.mjs +89 -17
  2. package/package.json +1 -1
package/dist/cli.mjs CHANGED
@@ -7394,6 +7394,9 @@ var dist_default = cac;
7394
7394
  var import_picocolors2 = __toESM(require_picocolors(), 1);
7395
7395
  import { resolve } from "path";
7396
7396
 
7397
+ // src/fetcher.ts
7398
+ var import_semver2 = __toESM(require_semver2(), 1);
7399
+
7397
7400
  // src/types.ts
7398
7401
  var STABILITY_ORDER = {
7399
7402
  dev: 0,
@@ -7520,7 +7523,7 @@ function formatNewVersion(originalConstraint, newVersion) {
7520
7523
 
7521
7524
  // src/fetcher.ts
7522
7525
  var PACKAGIST_API = "https://repo.packagist.org/p2";
7523
- async function fetchPackage(packageName, minStability = "stable", preferStable = true) {
7526
+ async function fetchPackage(packageName, minStability = "stable", preferStable = true, currentVersion, allowMajor = true) {
7524
7527
  try {
7525
7528
  const url = `${PACKAGIST_API}/${packageName}.json`;
7526
7529
  const response = await fetch(url);
@@ -7542,31 +7545,59 @@ async function fetchPackage(packageName, minStability = "stable", preferStable =
7542
7545
  return null;
7543
7546
  return { latestVersion: first.version, releaseTime: first.time };
7544
7547
  }
7548
+ let selectedVersion = null;
7545
7549
  if (preferStable) {
7546
7550
  const stableVersions = eligibleVersions.filter((v) => getVersionStability(v.version) === "stable");
7547
7551
  if (stableVersions.length > 0) {
7548
- const latest2 = stableVersions[0];
7549
- if (!latest2)
7550
- return null;
7551
- return { latestVersion: latest2.version, releaseTime: latest2.time };
7552
+ selectedVersion = stableVersions[0] ?? null;
7552
7553
  }
7553
7554
  }
7554
- const latest = eligibleVersions[0];
7555
- if (!latest)
7555
+ if (!selectedVersion) {
7556
+ selectedVersion = eligibleVersions[0] ?? null;
7557
+ }
7558
+ if (!selectedVersion)
7556
7559
  return null;
7557
- return { latestVersion: latest.version, releaseTime: latest.time };
7560
+ const phpRequirement = selectedVersion.require?.php;
7561
+ let majorDetected;
7562
+ if (currentVersion) {
7563
+ const currentNorm = normalizeVersion(currentVersion);
7564
+ const selectedNorm = normalizeVersion(selectedVersion.version);
7565
+ if (currentNorm && selectedNorm) {
7566
+ const currentMajor = import_semver2.default.major(currentNorm);
7567
+ const selectedMajor = import_semver2.default.major(selectedNorm);
7568
+ if (selectedMajor > currentMajor) {
7569
+ majorDetected = selectedVersion.version;
7570
+ if (!allowMajor) {
7571
+ const versionsToCheck = preferStable ? eligibleVersions.filter((v) => getVersionStability(v.version) === "stable") : eligibleVersions;
7572
+ const sameMajorVersion = versionsToCheck.find((v) => {
7573
+ const norm = normalizeVersion(v.version);
7574
+ return norm && import_semver2.default.major(norm) === currentMajor;
7575
+ });
7576
+ if (sameMajorVersion) {
7577
+ selectedVersion = sameMajorVersion;
7578
+ }
7579
+ }
7580
+ }
7581
+ }
7582
+ }
7583
+ return {
7584
+ latestVersion: selectedVersion.version,
7585
+ releaseTime: selectedVersion.time,
7586
+ phpRequirement: selectedVersion.require?.php ?? phpRequirement,
7587
+ majorVersion: majorDetected
7588
+ };
7558
7589
  } catch {
7559
7590
  return null;
7560
7591
  }
7561
7592
  }
7562
- async function fetchAllPackages(packages, minStability = "stable", preferStable = true) {
7593
+ async function fetchAllPackages(packages, minStability = "stable", preferStable = true, allowMajor = true) {
7563
7594
  const results = new Map;
7564
7595
  const entries = Object.entries(packages);
7565
7596
  const CONCURRENCY = 5;
7566
7597
  for (let i = 0;i < entries.length; i += CONCURRENCY) {
7567
7598
  const batch = entries.slice(i, i + CONCURRENCY);
7568
- const promises = batch.map(async ([name]) => {
7569
- const result = await fetchPackage(name, minStability, preferStable);
7599
+ const promises = batch.map(async ([name, version]) => {
7600
+ const result = await fetchPackage(name, minStability, preferStable, version, allowMajor);
7570
7601
  if (result)
7571
7602
  results.set(name, result);
7572
7603
  });
@@ -7764,9 +7795,25 @@ function formatAge(isoDate) {
7764
7795
  }
7765
7796
  return "now";
7766
7797
  }
7798
+ function getAgeMonths(isoDate) {
7799
+ const date = new Date(isoDate);
7800
+ const now = new Date;
7801
+ const diffMs = now.getTime() - date.getTime();
7802
+ const msPerMonth = 30 * 24 * 60 * 60 * 1000;
7803
+ return Math.floor(diffMs / msPerMonth);
7804
+ }
7767
7805
 
7768
7806
  // src/ui/render.ts
7769
7807
  var import_picocolors = __toESM(require_picocolors(), 1);
7808
+ function colorAge(age, ageMonths) {
7809
+ if (ageMonths < 3) {
7810
+ return import_picocolors.default.green(age.padStart(6));
7811
+ } else if (ageMonths < 12) {
7812
+ return import_picocolors.default.yellow(age.padStart(6));
7813
+ } else {
7814
+ return import_picocolors.default.red(age.padStart(6));
7815
+ }
7816
+ }
7770
7817
  function renderTable(packages) {
7771
7818
  if (packages.length === 0) {
7772
7819
  console.log(import_picocolors.default.green(`
@@ -7783,7 +7830,7 @@ function renderTable(packages) {
7783
7830
  const oldVer = pkg.currentVersion.padStart(oldWidth);
7784
7831
  const arrow = "→";
7785
7832
  const newVer = pkg.latestVersion.padEnd(newWidth);
7786
- const age = import_picocolors.default.gray(pkg.age.padStart(6));
7833
+ const age = colorAge(pkg.age, pkg.ageMonths);
7787
7834
  let diffLabel;
7788
7835
  let coloredNewVer;
7789
7836
  switch (pkg.diffType) {
@@ -7800,7 +7847,14 @@ function renderTable(packages) {
7800
7847
  coloredNewVer = import_picocolors.default.green(newVer);
7801
7848
  break;
7802
7849
  }
7803
- console.log(` ${name} ${oldVer} ${arrow} ${coloredNewVer} ${diffLabel} ${age}`);
7850
+ let extra = "";
7851
+ if (pkg.majorAvailable) {
7852
+ extra += import_picocolors.default.magenta(` ${pkg.majorAvailable} available`);
7853
+ }
7854
+ if (pkg.phpRequirement) {
7855
+ extra += import_picocolors.default.gray(` php ${pkg.phpRequirement}`);
7856
+ }
7857
+ console.log(` ${name} ${oldVer} ${arrow} ${coloredNewVer} ${diffLabel} ${age}${extra}`);
7804
7858
  }
7805
7859
  console.log("");
7806
7860
  }
@@ -7834,7 +7888,15 @@ function formatPackageChoice(pkg) {
7834
7888
  coloredNewVer = import_picocolors.default.green(pkg.latestVersion);
7835
7889
  break;
7836
7890
  }
7837
- return `${import_picocolors.default.bold(pkg.name)} ${pkg.currentVersion} ${arrow} ${coloredNewVer} ${diffLabel} ${import_picocolors.default.gray(pkg.age)}`;
7891
+ const age = colorAge(pkg.age, pkg.ageMonths);
7892
+ let extra = "";
7893
+ if (pkg.majorAvailable) {
7894
+ extra += import_picocolors.default.magenta(` ${pkg.majorAvailable} available`);
7895
+ }
7896
+ if (pkg.phpRequirement) {
7897
+ extra += import_picocolors.default.gray(` php ${pkg.phpRequirement}`);
7898
+ }
7899
+ return `${import_picocolors.default.bold(pkg.name)} ${pkg.currentVersion} ${arrow} ${coloredNewVer} ${diffLabel} ${age}${extra}`;
7838
7900
  }
7839
7901
 
7840
7902
  // src/interactive.ts
@@ -7888,7 +7950,7 @@ async function run(options) {
7888
7950
  console.log(import_picocolors2.default.gray(` Checking ${Object.keys(filteredPackages).length} packages...`));
7889
7951
  console.log(import_picocolors2.default.gray(` Stability: ${minStability}${preferStable ? " (prefer-stable)" : ""}
7890
7952
  `));
7891
- const results = await fetchAllPackages(filteredPackages, minStability, preferStable);
7953
+ const results = await fetchAllPackages(filteredPackages, minStability, preferStable, options.major);
7892
7954
  const updates = [];
7893
7955
  for (const [name, currentVersion] of Object.entries(filteredPackages)) {
7894
7956
  const result = results.get(name);
@@ -7903,13 +7965,17 @@ async function run(options) {
7903
7965
  continue;
7904
7966
  if (diffType === "patch" && !options.patch)
7905
7967
  continue;
7968
+ const majorAvailable = !options.major && result.majorVersion ? result.majorVersion : undefined;
7906
7969
  updates.push({
7907
7970
  name,
7908
7971
  currentVersion,
7909
7972
  latestVersion: result.latestVersion,
7910
7973
  diffType,
7911
7974
  releaseTime: result.releaseTime,
7912
- age: formatAge(result.releaseTime)
7975
+ age: formatAge(result.releaseTime),
7976
+ ageMonths: getAgeMonths(result.releaseTime),
7977
+ majorAvailable,
7978
+ phpRequirement: result.phpRequirement
7913
7979
  });
7914
7980
  }
7915
7981
  const order = { major: 0, minor: 1, patch: 2 };
@@ -7929,8 +7995,14 @@ async function run(options) {
7929
7995
  if (options.write || options.install) {
7930
7996
  const success = await writeComposerJson(composerPath, selectedUpdates, options.dryRun);
7931
7997
  if (success && !options.dryRun) {
7932
- console.log(import_picocolors2.default.green(` ✓ Updated composer.json
7998
+ console.log(import_picocolors2.default.green(" ✓ Updated composer.json"));
7999
+ if (options.write && !options.install) {
8000
+ console.log(import_picocolors2.default.gray(`
8001
+ Run "composer update" to install the new versions
7933
8002
  `));
8003
+ } else {
8004
+ console.log("");
8005
+ }
7934
8006
  }
7935
8007
  }
7936
8008
  if (options.install && !options.dryRun) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "comze",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "A taze-like CLI for updating composer.json dependencies",
5
5
  "author": "qoqn",
6
6
  "license": "MIT",