Skip to content

Commit c4c5a36

Browse files
authored
Add CI + test (#62)
1 parent 115fa1d commit c4c5a36

File tree

5 files changed

+104
-18
lines changed

5 files changed

+104
-18
lines changed

.github/workflows/ci.yml

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
name: CI
2+
3+
on:
4+
push:
5+
branches: [master]
6+
# See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#filter-pattern-cheat-sheet
7+
tags:
8+
- "v[0-9]+.[0-9]+.[0-9]+"
9+
- "v[0-9]+.[0-9]+.[0-9]+-*"
10+
11+
pull_request:
12+
branches: [master]
13+
14+
concurrency:
15+
group: ci-${{ github.ref }}-1
16+
# Cancel previous builds for pull requests only.
17+
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
18+
19+
jobs:
20+
build:
21+
strategy:
22+
fail-fast: false
23+
matrix:
24+
os: [
25+
macos-13, # x64
26+
macos-14, # ARM
27+
ubuntu-latest, # x64
28+
buildjet-2vcpu-ubuntu-2204-arm, # ARM
29+
# windows-latest, # deactivated for now as there is still a Windows issue
30+
]
31+
32+
runs-on: ${{matrix.os}}
33+
34+
steps:
35+
- name: Checkout
36+
uses: actions/checkout@v4
37+
38+
- name: Use Node.js
39+
uses: actions/setup-node@v4
40+
with:
41+
node-version: 18
42+
43+
- name: NPM install
44+
run: npm ci
45+
46+
- name: Build
47+
run: npx rescript
48+
49+
- name: Test
50+
env:
51+
CI: 1
52+
shell: bash
53+
run: |
54+
npm pack
55+
npm i -g ./create-rescript-app-*.tgz
56+
npx create-rescript-app

src/CI.res

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
@val @scope("process.env") external ci: string = "CI"
2+
3+
let isRunningInCI = switch ci {
4+
| "1" | "true" | "TRUE" => true
5+
| _ => false
6+
}

src/CI.resi

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
let isRunningInCI: bool

src/Main.res

+7-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,13 @@ https://rescript-lang.org`,
3535
let rescriptJsonPath = Path.join2(Process.cwd(), "rescript.json")
3636
let bsconfigJsonPath = Path.join2(Process.cwd(), "bsconfig.json")
3737

38-
if Fs.existsSync(rescriptJsonPath) || Fs.existsSync(bsconfigJsonPath) {
38+
if CI.isRunningInCI {
39+
P.note(~title="CI Mode", ~message="Running in CI, will create a test project")
40+
await handleError(~outro="Project creation failed.", async () => {
41+
await NewProject.createNewProject()
42+
P.outro("CI test completed successfully.")
43+
})
44+
} else if Fs.existsSync(rescriptJsonPath) || Fs.existsSync(bsconfigJsonPath) {
3945
ExistingRescriptProject.showUpgradeHint()
4046
P.outro("No changes were made to your project.")
4147
} else if Fs.existsSync(packageJsonPath) {

src/NewProject.res

+34-17
Original file line numberDiff line numberDiff line change
@@ -51,27 +51,15 @@ let getTemplateOptions = () =>
5151
hint: shortDescription,
5252
})
5353

54-
let createNewProject = async () => {
55-
P.note(~title="New Project", ~message=newProjectMessage)
56-
57-
let projectName = await P.text({
58-
message: "What is the name of your new ReScript project?",
59-
placeholder: "my-rescript-app",
60-
initialValue: ?Process.argv[2],
61-
validate: validateProjectName,
62-
})->P.resultOrRaise
63-
64-
let templateName =
65-
await P.select({message: "Select a template", options: getTemplateOptions()})->P.resultOrRaise
66-
67-
let versions = await RescriptVersions.promptVersions()
68-
54+
let createProject = async (~templateName, ~projectName, ~versions) => {
6955
let templatePath = CraPaths.getTemplatePath(~templateName)
7056
let projectPath = Path.join2(Process.cwd(), projectName)
7157

7258
let s = P.spinner()
7359

74-
s->P.Spinner.start("Creating project...")
60+
if !CI.isRunningInCI {
61+
s->P.Spinner.start("Creating project...")
62+
}
7563

7664
await Fs.Promises.cp(templatePath, projectPath, ~options={recursive: true})
7765
Process.chdir(projectPath)
@@ -83,5 +71,34 @@ let createNewProject = async () => {
8371
await RescriptVersions.installVersions(versions)
8472
let _ = await Promisified.ChildProcess.execFile("git", ["init"])
8573

86-
s->P.Spinner.stop("Project created.")
74+
if !CI.isRunningInCI {
75+
s->P.Spinner.stop("Project created.")
76+
}
77+
}
78+
79+
let createNewProject = async () => {
80+
P.note(~title="New Project", ~message=newProjectMessage)
81+
82+
if CI.isRunningInCI {
83+
// type versions = {rescriptVersion: string, rescriptCoreVersion: string}
84+
await createProject(
85+
~templateName="rescript-template-basic",
86+
~projectName="test",
87+
~versions={rescriptVersion: "11.1.1", rescriptCoreVersion: "1.5.0"},
88+
)
89+
} else {
90+
let projectName = await P.text({
91+
message: "What is the name of your new ReScript project?",
92+
placeholder: "my-rescript-app",
93+
initialValue: ?Process.argv[2],
94+
validate: validateProjectName,
95+
})->P.resultOrRaise
96+
97+
let templateName =
98+
await P.select({message: "Select a template", options: getTemplateOptions()})->P.resultOrRaise
99+
100+
let versions = await RescriptVersions.promptVersions()
101+
102+
await createProject(~templateName, ~projectName, ~versions)
103+
}
87104
}

0 commit comments

Comments
 (0)