-
Notifications
You must be signed in to change notification settings - Fork 16
Expand file tree
/
Copy pathRescriptVersions.res
More file actions
126 lines (95 loc) · 3.9 KB
/
RescriptVersions.res
File metadata and controls
126 lines (95 loc) · 3.9 KB
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
open Node
module P = ClackPrompts
let rescriptVersionRange = `11.x.x || 12.x.x`
let rescriptCoreVersionRange = ">=1.0.0"
let includesRewatchVersionRange = ">=12.0.0-alpha.15"
let includesStdlibVersionRange = ">=12.0.0-beta.1"
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("12."))->Option.map(o => o.value)
let selectOptions = {ClackPrompts.message: "ReScript version?", options, ?initialValue}
await P.select(selectOptions)->P.resultOrRaise
| Error(error) => error->NpmRegistry.getFetchErrorMessage->JsError.throwWithMessage
}
let rescriptCoreVersions = switch rescriptCoreVersionsResult {
| Ok(versions) => versions
| Error(error) => error->NpmRegistry.getFetchErrorMessage->JsError.throwWithMessage
}
let rescriptCoreVersions = getCompatibleRescriptCoreVersions(
~rescriptVersion,
~rescriptCoreVersions,
)
let includesStdlib = CompareVersions.satisfies(rescriptVersion, includesStdlibVersionRange)
let rescriptCoreVersion = switch rescriptCoreVersions {
| _ if includesStdlib => 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 ensureYarnNodeModulesLinker = async () => {
let yarnRcPath = Path.join2(Process.cwd(), ".yarnrc.yml")
if !Fs.existsSync(yarnRcPath) {
let nodeLinkerLine = "nodeLinker: node-modules"
let eol = Os.eol
await Fs.Promises.writeFile(yarnRcPath, `${nodeLinkerLine}${eol}`)
}
}
let removeNpmPackageLock = async () => {
let packageLockPath = Path.join2(Process.cwd(), "package-lock.json")
if Fs.existsSync(packageLockPath) {
await Fs.Promises.unlink(packageLockPath)
}
}
let installVersions = async ({rescriptVersion, rescriptCoreVersion}) => {
let packageManagerInfo = await PackageManagers.getPackageManagerInfo()
let {command: packageManagerCommand, packageManager} = packageManagerInfo
let packages = switch rescriptCoreVersion {
| Some(rescriptCoreVersion) => [
`rescript@${rescriptVersion}`,
`@rescript/core@${rescriptCoreVersion}`,
]
| None => [`rescript@${rescriptVersion}`]
}
if packageManager === YarnBerry {
await ensureYarnNodeModulesLinker()
}
let command = `${packageManagerCommand} add ${packages->Array.join(" ")}`
let _ = await Promisified.ChildProcess.exec(command)
if packageManager !== Npm {
await removeNpmPackageLock()
}
}
let esmModuleSystemName = ({rescriptVersion}) =>
CompareVersions.compareVersions(rescriptVersion, "11.1.0-rc.8") > 0. ? "esmodule" : "es6"
let usesRewatch = ({rescriptVersion}) =>
CompareVersions.satisfies(rescriptVersion, includesRewatchVersionRange)