forked from rescript-lang/create-rescript-app
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRescriptVersions.res
101 lines (80 loc) · 3.5 KB
/
RescriptVersions.res
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
module P = ClackPrompts
let rescript12VersionRange = ">=12.0.0-alpha.5"
let rescriptVersionRange = `11.x.x || ${rescript12VersionRange}`
let rescriptCoreVersionRange = ">=1.0.0"
type versions = {rescriptVersion: string, rescriptCoreVersion: option<string>}
let getCompatibleRescriptCoreVersions = (~rescriptVersion, ~rescriptCoreVersions) =>
if CompareVersions.compareVersions(rescriptVersion, "11.1.0")->Ordering.isLess {
rescriptCoreVersions->Array.filter(coreVersion =>
CompareVersions.compareVersions(coreVersion, "1.3.0")->Ordering.isLess
)
} else {
rescriptCoreVersions
}
let spinnerMessage = "Loading available versions..."
let promptVersions = async () => {
let s = P.spinner()
s->P.Spinner.start(spinnerMessage)
let (rescriptVersionsResult, rescriptCoreVersionsResult) = await Promise.all2((
NpmRegistry.getPackageVersions("rescript", rescriptVersionRange),
NpmRegistry.getPackageVersions("@rescript/core", rescriptCoreVersionRange),
))
switch (rescriptVersionsResult, rescriptCoreVersionsResult) {
| (Ok(_), Ok(_)) => s->P.Spinner.stop("Versions loaded.")
| _ => s->P.Spinner.stop(spinnerMessage)
}
let rescriptVersion = switch rescriptVersionsResult {
| Ok([version]) => version
| Ok(rescriptVersions) =>
let options = rescriptVersions->Array.map(v => {P.value: v})
let initialValue =
options->Array.find(o => o.value->String.startsWith("11."))->Option.map(o => o.value)
let selectOptions =
switch initialValue {
| None => { ClackPrompts.message: "ReScript version?", options}
| Some(initialValue) => {message: "ReScript version?", options, initialValue}
}
await P.select(selectOptions)->P.resultOrRaise
| Error(error) => error->NpmRegistry.getFetchErrorMessage->Error.make->Error.raise
}
let rescriptCoreVersions = switch rescriptCoreVersionsResult {
| Ok(versions) => versions
| Error(error) => error->NpmRegistry.getFetchErrorMessage->Error.make->Error.raise
}
let rescriptCoreVersions = getCompatibleRescriptCoreVersions(
~rescriptVersion,
~rescriptCoreVersions,
)
let isRescript12 = CompareVersions.satisfies(rescriptVersion, rescript12VersionRange)
let rescriptCoreVersion = switch rescriptCoreVersions {
| _ if isRescript12 => None
| [version] => Some(version)
| _ =>
let version = await P.select({
message: "ReScript Core version?",
options: rescriptCoreVersions->Array.map(v => {P.value: v}),
})->P.resultOrRaise
Some(version)
}
{rescriptVersion, rescriptCoreVersion}
}
let installVersions = async ({rescriptVersion, rescriptCoreVersion}) => {
let packageManager = PackageManagers.getActivePackageManager()
let packages = switch rescriptCoreVersion {
| Some(rescriptCoreVersion) => [
`rescript@${rescriptVersion}`,
`@rescript/core@${rescriptCoreVersion}`,
]
| None => [`rescript@${rescriptVersion}`]
}
// #58: Windows: packageManager may be something like
// "C:\Program Files\nodejs\node_modules\npm\bin\npm-cli.js".
//
// Therefore, packageManager needs to be in quotes, and we need to prepend "node "
// if packageManager points to a JS file, otherwise the invocation will hang.
let maybeNode = packageManager->String.endsWith("js") ? "node " : ""
let command = `${maybeNode}"${packageManager}" add ${packages->Array.join(" ")}`
let _ = await Node.Promisified.ChildProcess.exec(command)
}
let esmModuleSystemName = ({rescriptVersion}) =>
CompareVersions.compareVersions(rescriptVersion, "11.1.0-rc.8") > 0. ? "esmodule" : "es6"