forked from cloudflare/workers-sdk
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathextract-runtime-versions.mjs
76 lines (68 loc) · 3.08 KB
/
extract-runtime-versions.mjs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import assert from "node:assert";
import { existsSync } from "node:fs";
import fs from "node:fs/promises";
import module from "node:module";
import path from "node:path";
import url from "node:url";
import { execSync } from "node:child_process";
/**
* @param {string} from
* @returns {string | undefined}
*/
function findClosestPackageJson(from) {
while (true) {
const packageJsonPath = path.join(from, "package.json");
if (existsSync(packageJsonPath)) return packageJsonPath;
const parent = path.dirname(from);
if (parent === from) return;
from = parent;
}
}
const __filename = url.fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
// 1. Load `wrangler` `package.json`, getting `wrangler` version and `miniflare` version constraint
const wranglerPackagePath = path.resolve(__dirname, "../packages/wrangler");
const wranglerPackageJsonPath = path.join(wranglerPackagePath, "package.json");
const wranglerPackageJson = await fs.readFile(wranglerPackageJsonPath, "utf8");
const wranglerPackage = JSON.parse(wranglerPackageJson);
const wranglerVersion = wranglerPackage.version;
const miniflareVersionConstraint = wranglerPackage.dependencies.miniflare;
// 2. Load `miniflare` `package.json`, getting `miniflare` version and `workerd` version constraint
// (`createRequire()` just needs to be passed a file in the `wrangler` directory)
const wranglerRequire = module.createRequire(wranglerPackageJsonPath);
const miniflareMainPath = wranglerRequire.resolve("miniflare");
const miniflarePackageJsonPath = findClosestPackageJson(miniflareMainPath);
assert(miniflarePackageJsonPath !== undefined);
const miniflarePackageJson = await fs.readFile(
miniflarePackageJsonPath,
"utf8"
);
const miniflarePackage = JSON.parse(miniflarePackageJson);
const miniflareVersion = miniflarePackage.version;
const workerdVersionConstraint = miniflarePackage.dependencies.workerd;
// 3. Load `workerd` `package.json`, getting `workerd` version
const miniflareRequire = module.createRequire(miniflarePackageJsonPath);
const workerdMainPath = miniflareRequire.resolve("workerd");
const workerdPackageJsonPath = findClosestPackageJson(workerdMainPath);
assert(workerdPackageJsonPath !== undefined);
const workerdPackageJson = await fs.readFile(workerdPackageJsonPath, "utf8");
const workerdPackage = JSON.parse(workerdPackageJson);
const workerdVersion = workerdPackage.version;
const workerdBinary = path.resolve(workerdPackageJsonPath, "../bin/workerd");
const workerdBinaryVersion = execSync(workerdBinary + " --version")
.toString()
.split(" ")[1];
// 4. Write basic markdown report
const report = [
`\`wrangler@${wranglerVersion}\` includes the following runtime dependencies:`,
"",
"|Package|Constraint|Resolved|",
"|-------|----------|--------|",
`|\`miniflare\`|${miniflareVersionConstraint}|${miniflareVersion}|`,
`|\`workerd\`|${workerdVersionConstraint}|${workerdVersion}|`,
`|\`workerd --version\`|${workerdVersion}|${workerdBinaryVersion}|`,
"",
"Please ensure constraints are pinned, and `miniflare`/`workerd` minor versions match.",
"",
].join("\n");
await fs.writeFile("runtime-versions.md", report);