-
Notifications
You must be signed in to change notification settings - Fork 15
Expand file tree
/
Copy pathRescriptVersions.res
More file actions
104 lines (78 loc) · 3.11 KB
/
RescriptVersions.res
File metadata and controls
104 lines (78 loc) · 3.11 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
open Node
module P = ClackPrompts
let rescriptVersionRange = `11.1.4 || 12.x.x`
let finalRescriptCoreVersion = "1.6.1"
let includesRewatchVersionRange = ">=12.0.0-alpha.15"
let includesStdlibVersionRange = ">=12.0.0-beta.1"
type versions = {rescriptVersion: string, rescriptCoreVersion: option<string>}
let spinnerMessage = "Loading available versions..."
let promptVersions = async () => {
let s = P.spinner()
s->P.Spinner.start(spinnerMessage)
let rescriptVersionsResult = await NpmRegistry.getPackageVersions(
"rescript",
rescriptVersionRange,
)
switch rescriptVersionsResult {
| Ok(_) => s->P.Spinner.stop("Versions loaded.")
| Error(_) => 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 = None
// Reactivate for v13 alpha -> first non-alpha/beta/rc version should be the default
// 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 includesStdlib = CompareVersions.satisfies(rescriptVersion, includesStdlibVersionRange)
let rescriptCoreVersion = includesStdlib ? None : Some(finalRescriptCoreVersion)
{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 {packageManager} = packageManagerInfo
let execCommand = async command => {
let fullCommand = `${packageManagerInfo.command} ${command}`
let _ = await Promisified.ChildProcess.exec(fullCommand)
}
let packages = switch rescriptCoreVersion {
| Some(rescriptCoreVersion) => [
`rescript@${rescriptVersion}`,
`@rescript/core@${rescriptCoreVersion}`,
]
| None => [`rescript@${rescriptVersion}`]
}
switch packageManager {
| YarnBerry => await ensureYarnNodeModulesLinker()
| Pnpm =>
let hasPackageLock = Path.join2(Process.cwd(), "package-lock.json")->Fs.existsSync
if hasPackageLock {
await execCommand("import") // import versions from package-lock.json
}
| _ => ()
}
await execCommand(`add ${packages->Array.join(" ")}`)
if packageManager !== Npm {
await removeNpmPackageLock()
}
}
let usesRewatch = ({rescriptVersion}) =>
CompareVersions.satisfies(rescriptVersion, includesRewatchVersionRange)