Skip to content

Commit 316073a

Browse files
committed
Version selection
1 parent f218762 commit 316073a

File tree

3 files changed

+42
-17
lines changed

3 files changed

+42
-17
lines changed

index.mjs

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,12 @@ import fs from "fs";
66
import { fileURLToPath } from "url";
77
import { exec } from "child_process";
88
import { promisify } from "util";
9+
import { satisfies } from "compare-versions";
910
import c from "picocolors";
1011

12+
const rescriptVersionRange = "~11 >=11.0.0-rc.6";
13+
const rescriptCoreVersionRange = ">=0.5.0";
14+
1115
// Get __dirname in an ES6 module
1216
const __filename = fileURLToPath(import.meta.url);
1317
const __dirname = path.dirname(__filename);
@@ -31,6 +35,12 @@ const templates = [
3135
// },
3236
];
3337

38+
async function getPackageVersions(packageName, range) {
39+
const { stdout } = await promisify(exec)(`npm view ${packageName} versions --json`);
40+
const versions = JSON.parse(stdout);
41+
return versions.filter(v => satisfies(v, range)).reverse();
42+
}
43+
3444
function checkCancel(value) {
3545
if (p.isCancel(value)) {
3646
p.cancel("Project creation cancelled.");
@@ -107,25 +117,33 @@ async function main() {
107117
});
108118
checkCancel(templateName);
109119

110-
const rescriptVersion = await p.text({
111-
message: "ReScript version? (keep the default if unsure)",
112-
initialValue: "11.0.0-rc.7",
113-
});
114-
checkCancel(rescriptVersion);
120+
try {
121+
const s = p.spinner();
115122

116-
const rescriptCoreVersion = await p.text({
117-
message: "ReScript Core version? (keep the default if unsure)",
118-
initialValue: "0.6.0",
119-
});
120-
checkCancel(rescriptCoreVersion);
123+
s.start("Loading available versions...");
124+
const [rescriptVersions, rescriptCoreVersions] = await Promise.all([
125+
getPackageVersions("rescript", rescriptVersionRange),
126+
getPackageVersions("@rescript/core", rescriptCoreVersionRange),
127+
]);
128+
s.stop("Versions loaded.");
121129

122-
const templatePath = path.join(__dirname, "templates", templateName);
123-
const projectPath = path.join(process.cwd(), projectName);
130+
const rescriptVersion = await p.select({
131+
message: "ReScript version?",
132+
options: rescriptVersions.map(v => ({ value: v })),
133+
});
134+
checkCancel(rescriptVersion);
124135

125-
const s = p.spinner();
126-
s.start("Creating project...");
136+
const rescriptCoreVersion = await p.select({
137+
message: "ReScript Core version?",
138+
options: rescriptCoreVersions.map(v => ({ value: v })),
139+
});
140+
checkCancel(rescriptCoreVersion);
141+
142+
const templatePath = path.join(__dirname, "templates", templateName);
143+
const projectPath = path.join(process.cwd(), projectName);
144+
145+
s.start("Creating project...");
127146

128-
try {
129147
await fs.promises.cp(templatePath, projectPath, { recursive: true });
130148
process.chdir(projectPath);
131149

package-lock.json

Lines changed: 7 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
"node": ">=18"
1414
},
1515
"dependencies": {
16-
"@clack/prompts": "^0.7.0"
16+
"@clack/prompts": "^0.7.0",
17+
"compare-versions": "^6.1.0"
1718
},
1819
"repository": {
1920
"type": "git",

0 commit comments

Comments
 (0)