Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions src/NpmRegistry.res
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
type response = {
ok: bool,
json: unit => promise<Js.Json.t>,
}

@val external fetch: string => promise<response> = "fetch"

@scope(("process", "env"))
external npm_config_registry: option<string> = "NPM_CONFIG_REGISTRY"

@inline
let defaultRegistryUrl = "https://registry.npmjs.org"

let getNpmRegistry = () =>
npm_config_registry
->Option.flatMap(registry => registry->Node.Url.make)
->Option.mapOr(defaultRegistryUrl, url => url->Node.Url.href)

let getPackageVersions = async (packageName, range) => {
let registry = getNpmRegistry()

switch await fetch(`${registry}/${packageName}`) {
| response if response.ok =>
let versions = switch await response.json() {
| Object(dict) =>
switch dict->Dict.get("versions") {
| Some(Object(dict)) =>
dict
->Dict.keysToArray
->Array.filterMap(version =>
version->CompareVersions.satisfies(range) ? Some(version) : None
)
| _ => []
}
| _ => []
}

versions->Array.reverse
versions

| _responseNotOk => []
}
}
28 changes: 6 additions & 22 deletions src/RescriptVersions.res
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,6 @@ let rescriptCoreVersionRange = ">=1.0.0"

type versions = {rescriptVersion: string, rescriptCoreVersion: string}

let getPackageVersions = async (packageName, range) => {
let {stdout} = await Node.Promisified.ChildProcess.exec(`npm view ${packageName} versions --json`)

let versions = switch JSON.parseExn(stdout) {
| Array(versions) =>
versions->Array.filterMap(json =>
switch json {
| String(version) if version->CompareVersions.satisfies(range) => Some(version)
| _ => None
}
)
| _ => []
}

versions->Array.reverse
versions
}

let getCompatibleRescriptCoreVersions = (~rescriptVersion, ~rescriptCoreVersions) =>
if CompareVersions.compareVersions(rescriptVersion, "11.1.0")->Ordering.isLess {
rescriptCoreVersions->Array.filter(coreVersion =>
Expand All @@ -37,10 +19,12 @@ let promptVersions = async () => {

s->P.Spinner.start("Loading available versions...")

let (rescriptVersions, rescriptCoreVersions) = await Promise.all2((
getPackageVersions("rescript", rescriptVersionRange),
getPackageVersions("@rescript/core", rescriptCoreVersionRange),
))
let (rescriptVersions, rescriptCoreVersions) = try await Promise.all2((
NpmRegistry.getPackageVersions("rescript", rescriptVersionRange),
NpmRegistry.getPackageVersions("@rescript/core", rescriptCoreVersionRange),
)) catch {
| _exn => Error.make("Fetching versions from registry failed.")->Error.raise
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

need to raise the error here (and not inside getPackageVersions) so that the message shows up nicely formatted in the prompt

}

s->P.Spinner.stop("Versions loaded.")

Expand Down
8 changes: 8 additions & 0 deletions src/bindings/Node.res
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,14 @@ module Url = {
type t

@module("node:url") external fileURLToPath: t => string = "fileURLToPath"

@new external makeUnsafe: string => t = "URL"
@get external href: t => string = "href"

let make = string =>
try Some(makeUnsafe(string)) catch {
| _exn => None
}
}

module Os = {
Expand Down