Skip to content

Commit 35e7d80

Browse files
committed
update update script
1 parent 9cd8b0c commit 35e7d80

File tree

6 files changed

+107
-34
lines changed

6 files changed

+107
-34
lines changed

cli.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import { program } from "commander";
33

44
import {
5-
checkObsoleteFrameworks,
5+
updateFrameworks,
66
cleanFrameworkDirectories,
77
configureStyles,
88
copyProjectToDist,
@@ -17,11 +17,11 @@ program.command("zip").description("Create a zip archive of frameworks").action(
1717
program.command("copy").description("Copy project to dist directory").action(copyProjectToDist);
1818

1919
program
20-
.command("check-obsolete")
21-
.description("Check for obsolete frameworks in the frameworks directory")
22-
.option("--debug [boolean]", "", false)
20+
.command("update-frameworks")
21+
.option("--type [types...]", "", ["keyed", "non-keyed"])
22+
.description("Update implementations in the frameworks directory")
2323
.action((options) => {
24-
checkObsoleteFrameworks(options);
24+
updateFrameworks(options);
2525
});
2626

2727
program

cli/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export { checkObsoleteFrameworks } from "./check-obsolete.js";
1+
export { updateFrameworks } from "./update-frameworks.js";
22
export { cleanFrameworkDirectories } from "./cleanup.js";
33
export { configureStyles } from "./configure-styles.js";
44
export { copyProjectToDist } from "./copy.js";

cli/rebuild-build-single.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ Pass list of frameworks
2222
* @param {string|undefined} cwd - The current working directory (optional)
2323
*/
2424
function runCommand(command, cwd) {
25-
console.log(command);
25+
console.log(`running '${command}' in '${cwd}'`);
2626
if (cwd && !fs.existsSync(cwd)) {
2727
throw `working directory ${cwd} doesn't exist.`;
2828
}
@@ -54,7 +54,7 @@ function rebuildFramework(framework, useCi) {
5454
console.log(`ERROR: invalid name ${framework}. It must contain exactly one /.`);
5555
process.exit(1);
5656
}
57-
57+
console.log("Rebuilding framework", framework);
5858
const [keyed, name] = components;
5959
const frameworkPath = path.join("frameworks", keyed, name);
6060

cli/rebuild-check-single.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ export function rebuildCheckSingle({ frameworks }) {
3333
const frameworkNames = frameworks.join(" ");
3434

3535
try {
36-
const benchCmd = `npm run bench -- --headless true --smoketest true ${frameworkNames}`;
36+
const benchCmd = `npm run bench -- --runner playwright --headless true --smoketest true ${frameworkNames}`;
3737
runCommand(benchCmd, "webdriver-ts");
3838

39-
const keyedCmd = `npm run isKeyed -- --headless true ${frameworkNames}`;
39+
const keyedCmd = `npm run isKeyed -- --runner playwright --headless true ${frameworkNames}`;
4040
runCommand(keyedCmd, "webdriver-ts");
4141

4242
const cspCmd = `npm run checkCSP -- --headless true ${frameworkNames}`;

cli/rebuild-single-framework.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ export function rebuildSingleFramework({ frameworks, ci }) {
3434

3535
rebuildCheckSingle({ frameworks });
3636
} catch (error) {
37+
console.log("ERROR", error);
3738
console.log(`ERROR: Rebuilding ${frameworks} was not successful`);
3839
}
3940
}

cli/check-obsolete.js renamed to cli/update-frameworks.js

Lines changed: 96 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ import JSON5 from "json5";
33
import { execSync } from "node:child_process";
44
import * as fs from "node:fs";
55
import path from "node:path";
6+
import semver from 'semver'
67

78
import { getFrameworks } from "./helpers/frameworks.js";
9+
import { rebuildSingleFramework } from "./rebuild-single-framework.js";
810

911
/**
1012
* @typedef {Object} Framework
@@ -14,6 +16,23 @@ import { getFrameworks } from "./helpers/frameworks.js";
1416

1517
const frameworks = getFrameworks();
1618

19+
20+
function performUpdate(frameworkPath, frameworkName) {
21+
console.log(`Updating ${frameworkName}`);
22+
try {
23+
const npmCmd = `ncu -u`;
24+
execSync(npmCmd, {
25+
cwd: frameworkPath,
26+
stdio: "inherit",
27+
});
28+
rebuildSingleFramework({frameworks: [frameworkName], ci: false});
29+
return `Sucessfully updated ${frameworkPath}`;
30+
} catch (error) {
31+
console.error(`Failed to update ${frameworkPath}. Error Code ${error.status} and message: ${error.message}`);
32+
return `Failed to update ${frameworkPath}`;
33+
}
34+
}
35+
1736
/**
1837
* Looks for duplicate frameworks
1938
* @param {{type: string, name: string}[]} frameworks
@@ -29,9 +48,56 @@ function findDuplicateFrameworks(frameworks) {
2948
const duplicateFrameworks = findDuplicateFrameworks(frameworks);
3049
const frameworksCache = new Map();
3150

32-
/**
33-
* @param {string} packageName
34-
*/
51+
function getVersionFromPackageLock(packageJSONLockPath, packageNames) {
52+
if (!fs.existsSync(packageJSONLockPath)) {
53+
throw new Error(`package-lock.json not found at ${packageJSONLockPath}`);
54+
}
55+
56+
let versions = {};
57+
58+
for (let packageName of packageNames) {
59+
const packageLockJSON = JSON.parse(fs.readFileSync(packageJSONLockPath, "utf8"));
60+
const packageVersion =
61+
packageLockJSON.dependencies?.[packageName]?.version ||
62+
packageLockJSON.packages?.[`node_modules/${packageName}`]?.version ||
63+
"ERROR: Not found in package-lock";
64+
versions[packageName] = packageVersion;
65+
}
66+
return versions;
67+
}
68+
69+
function shouldUpdate(packageJSONLockPath, packageNames, DEBUG) {
70+
try {
71+
let versions = getVersionFromPackageLock(packageJSONLockPath, packageNames);
72+
console.log(versions);
73+
74+
for (let packageName of packageNames) {
75+
const npmCmd = `npm view ${packageName} version`;
76+
77+
78+
const newestVersion = execSync(npmCmd, {
79+
stdio: ["ignore", "pipe", "ignore"],
80+
}).toString();
81+
82+
let res = semver.diff(versions[packageName], newestVersion);
83+
console.log(`Latest version for ${packageName} is ${newestVersion} and the
84+
current version is ${versions[packageName]} comparison result is ${res}`);
85+
if (res === 'major' || res === 'minor') {
86+
if (DEBUG) {
87+
console.log(`Update required for ${packageName}`);
88+
}
89+
return true;
90+
}
91+
}
92+
} catch (error) {
93+
console.error(
94+
`Failed to get latest versions for ${packageNames}. Error Code ${error.status} and message: ${error.message}`
95+
);
96+
return { isObsolete: false, lastUpdate: null, packageNames };
97+
}
98+
return false;
99+
}
100+
35101
function maybeObsolete(packageName) {
36102
try {
37103
const npmCmd = `npm view ${packageName} time`;
@@ -82,14 +148,19 @@ const manualChecks = [];
82148
* @param {Object} options
83149
* @param {boolean} options.debug
84150
*/
85-
export function checkObsoleteFrameworks({ debug }) {
86-
console.log("Check obsolete frameworks", "debug", debug);
151+
export function updateFrameworks({ type, debug }) {
152+
let types = type || ["keyed", "non-keyed"];
153+
console.log("Check implementations for updates", "debug", debug,"type", type);
154+
let log = [];
87155

88156
const DEBUG = debug;
89157

90158
for (const { name, type } of frameworks) {
159+
if (!types.includes(type)) continue
160+
console.log(`Checking ${type}/${name}`);
91161
const frameworkPath = path.join("frameworks", type, name);
92162
const packageJSONPath = path.join(frameworkPath, "package.json");
163+
const packageJSONLockPath = path.join(frameworkPath, "package-lock.json");
93164

94165
if (!fs.existsSync(packageJSONPath)) {
95166
missingPackageWarnings.push(`WARN: skipping ${type}/${name} since there's no package.json`);
@@ -109,28 +180,29 @@ export function checkObsoleteFrameworks({ debug }) {
109180
}
110181

111182
const packages = mainPackages.split(":");
112-
const isPackageObsolete = packages.map((element) => maybeObsolete(element));
113-
114-
if (DEBUG) {
115-
console.log(`Results for ${type}/${name} ${isPackageObsolete}`);
116-
}
117-
118-
const anyPackageObsolete = isPackageObsolete.some((packageFramework) => packageFramework.isObsolete);
119-
120-
if (anyPackageObsolete) {
121-
const formattedPackages = isPackageObsolete
122-
.map((result) => `${result.packageName}:${result.lastUpdate}`)
123-
.join(", ");
124-
125-
console.log(`Last npm update for ${type}/${name} - ${mainPackages} is older than a year: ${formattedPackages}`);
126-
continue;
127-
}
128-
129-
if (DEBUG) {
130-
console.log(`Last npm update for ${type}/${name} ${mainPackages} is newer than a year`);
183+
const update = shouldUpdate(packageJSONLockPath, packages);
184+
185+
if (update) {
186+
log.push(performUpdate(frameworkPath, type+"/"+name));
187+
} else {
188+
const isPackageObsolete = packages.map((element) => maybeObsolete(element));
189+
const anyPackageObsolete = isPackageObsolete.some((packageFramework) => packageFramework.isObsolete);
190+
191+
if (anyPackageObsolete) {
192+
const formattedPackages = isPackageObsolete
193+
.map((result) => `${result.packageName}:${result.lastUpdate}`)
194+
.join(", ");
195+
196+
console.log(`Last npm update for ${type}/${name} - ${mainPackages} is older than a year: ${formattedPackages}`);
197+
log.push(`Retire ${type}/${name} - ${mainPackages} is older than a year`);
198+
}
199+
else if (DEBUG) {
200+
log.push(`Nothing to do for ${type}/${name}`);
201+
}
131202
}
132203
}
133204

205+
console.log("Log:\n", log.join("\n"));
134206
if (missingPackageWarnings.length > 0) console.warn("\nWarnings:\n" + missingPackageWarnings.join("\n"));
135207
if (manualChecks.length > 0)
136208
console.warn("\nThe following frameworks must be checked manually\n" + manualChecks.join("\n"));

0 commit comments

Comments
 (0)