diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a08a70d..0676e76 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,6 +35,10 @@ jobs: - name: Run tests run: npm test + - name: Publish preview package + if: github.event_name == 'pull_request' + run: npx pkg-pr-new publish --bin + - name: Pack (includes rescript build) run: npm pack diff --git a/src/NewProject.res b/src/NewProject.res index 772fd33..1e4736f 100644 --- a/src/NewProject.res +++ b/src/NewProject.res @@ -6,13 +6,13 @@ let packageNameRegExp = /^[a-z0-9-]+$/ let validateProjectName = projectName => if projectName->String.trim->String.length === 0 { - Some("Project name must not be empty.") + Error("Project name must not be empty.") } else if !(packageNameRegExp->RegExp.test(projectName)) { - Some("Project name may only contain lower case letters, numbers and hyphens.") + Error("Project name may only contain lower case letters, numbers and hyphens.") } else if Fs.existsSync(Path.join2(Process.cwd(), projectName)) { - Some(`The folder ${projectName} already exist in the current directory.`) + Error(`The folder ${projectName} already exist in the current directory.`) } else { - None + Ok() } let updatePackageJson = async (~projectName, ~versions) => @@ -117,14 +117,23 @@ let createNewProject = async () => { let useDefaultVersions = Option.isSome(commandLineArguments.templateName) let projectName = switch commandLineArguments.projectName { - | Some(projectName) if useDefaultVersions => projectName->validateProjectName->Option.getOrThrow + | Some(projectName) if useDefaultVersions => + // Note this throws in the some case, which is why we cannot use Option.getOrThrow here. + switch validateProjectName(projectName) { + | Error(message) => JsError.throwWithMessage(message) + | Ok() => projectName + } | initialValue => await P.text({ message: "What is the name of your new ReScript project?", placeholder: "my-rescript-app", ?initialValue, - validate: validateProjectName, + validate: projectName => + switch validateProjectName(projectName) { + | Ok() => None + | Error(error) => Some(error) + }, })->P.resultOrRaise }