Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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

Lines changed: 56 additions & 0 deletions
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

Lines changed: 6 additions & 0 deletions
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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
let isRunningInCI: bool

‎src/Main.res

Lines changed: 7 additions & 1 deletion
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

Lines changed: 34 additions & 17 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /