Skip to content

Commit 306ecac

Browse files
committed
Code optimizations
1 parent 24f66bc commit 306ecac

7 files changed

Lines changed: 221 additions & 121 deletions

File tree

.github/workflows/ci.yml

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
name: CI Pipeline
2+
3+
on:
4+
push:
5+
branches: [ main, master, develop ]
6+
pull_request:
7+
branches: [ main, master, develop ]
8+
9+
jobs:
10+
tests:
11+
name: Run Tests
12+
runs-on: ubuntu-latest
13+
14+
steps:
15+
- name: Checkout code
16+
uses: actions/checkout@v4
17+
18+
- name: Setup Bun
19+
uses: oven-sh/setup-bun@v1
20+
with:
21+
bun-version: latest
22+
23+
- name: Install dependencies
24+
run: bun install
25+
26+
- name: Run tests
27+
run: |
28+
if ls *.test.ts 1> /dev/null 2>&1; then
29+
bun test
30+
else
31+
echo "No test files found, skipping tests"
32+
exit 1
33+
fi
34+
35+
lint:
36+
name: Run Linter
37+
runs-on: ubuntu-latest
38+
39+
steps:
40+
- name: Checkout code
41+
uses: actions/checkout@v4
42+
43+
- name: Setup Bun
44+
uses: oven-sh/setup-bun@v1
45+
with:
46+
bun-version: latest
47+
48+
- name: Install dependencies
49+
run: bun install
50+
51+
- name: Check code formatting
52+
run: bun run lint

Dockerfile

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
1-
FROM oven/bun:latest
2-
3-
COPY package.json ./
4-
COPY bun.lock ./
5-
COPY index.ts ./
6-
COPY index.html ./
7-
8-
EXPOSE 3000/tcp
9-
10-
ENTRYPOINT [ "bun", "run", "index.ts" ]
1+
FROM oven/bun:latest
2+
3+
COPY * ./
4+
5+
EXPOSE 3000/tcp
6+
7+
ENTRYPOINT [ "bun", "start"]

biome.json

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"$schema": "https://biomejs.dev/schemas/2.3.4/schema.json",
3+
"linter": {
4+
"enabled": true,
5+
"rules": {
6+
"recommended": true,
7+
"suspicious": {
8+
"noExplicitAny": "warn"
9+
}
10+
}
11+
},
12+
"formatter": {
13+
"enabled": true,
14+
"indentStyle": "space",
15+
"indentWidth": 2,
16+
"lineWidth": 100
17+
},
18+
"javascript": {
19+
"formatter": {
20+
"quoteStyle": "double",
21+
"semicolons": "always"
22+
}
23+
}
24+
}

bun.lock

Lines changed: 20 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

index.html

Lines changed: 96 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -1,96 +1,96 @@
1-
<!DOCTYPE html>
2-
<html lang="uk">
3-
<head>
4-
<meta charset="UTF-8">
5-
<title>Стартова сторінка</title>
6-
<style>
7-
body {
8-
font-family: Arial, sans-serif;
9-
margin: 40px;
10-
background: #f4f4f9;
11-
color: #333;
12-
}
13-
h1 {
14-
text-align: center;
15-
}
16-
.container {
17-
display: grid;
18-
grid-template-columns: repeat(2, 1fr);
19-
gap: 20px;
20-
max-width: 800px;
21-
margin: 0 auto;
22-
}
23-
.card {
24-
background: white;
25-
padding: 20px;
26-
border-radius: 12px;
27-
box-shadow: 0 4px 8px rgba(0,0,0,0.1);
28-
}
29-
.card h2 {
30-
margin-top: 0;
31-
font-size: 18px;
32-
color: #555;
33-
}
34-
button {
35-
display: block;
36-
margin: 20px auto;
37-
padding: 10px 20px;
38-
border: none;
39-
border-radius: 8px;
40-
background: #4a90e2;
41-
color: white;
42-
cursor: pointer;
43-
font-size: 16px;
44-
}
45-
button:hover {
46-
background: #357abd;
47-
}
48-
</style>
49-
</head>
50-
<body>
51-
<h1>Дані з API</h1>
52-
<div class="container">
53-
<div class="card"><h2>Поле 1</h2><p id="field1">Завантаження...</p></div>
54-
<div class="card"><h2>Поле 2</h2><p id="field2">Завантаження...</p></div>
55-
<div class="card"><h2>Поле 3</h2><p id="field3">Завантаження...</p></div>
56-
<div class="card"><h2>Поле 4</h2><p id="field4">Завантаження...</p></div>
57-
<div class="card"><h2>Поле 5</h2><p id="field5">Завантаження...</p></div>
58-
</div>
59-
60-
<button onclick="loadData()">Оновити дані</button>
61-
62-
<script>
63-
async function loadData() {
64-
try {
65-
// Заміни ці шляхи на свої API з index.ts
66-
const endpoints = [
67-
"/api/today",
68-
"/api/d6",
69-
"/api/now",
70-
"/api/whoami",
71-
"/api/weekend",
72-
];
73-
74-
const results = await Promise.all(endpoints.map(url =>
75-
fetch(url).then(r => r.text())
76-
));
77-
78-
// Запис у поля
79-
document.getElementById("field1").innerText = results[0];
80-
document.getElementById("field2").innerText = results[1];
81-
document.getElementById("field3").innerText = results[2];
82-
document.getElementById("field4").innerText = results[3];
83-
document.getElementById("field5").innerText = results[4];
84-
} catch (err) {
85-
console.error("Помилка завантаження:", err);
86-
}
87-
}
88-
89-
// Автооновлення раз на 10 сек
90-
setInterval(loadData, 10000);
91-
92-
// Початкове завантаження
93-
loadData();
94-
</script>
95-
</body>
96-
</html>
1+
<!DOCTYPE html>
2+
<html lang="uk">
3+
<head>
4+
<meta charset="UTF-8">
5+
<title>Стартова сторінка</title>
6+
<style>
7+
body {
8+
font-family: Arial, sans-serif;
9+
margin: 40px;
10+
background: #f4f4f9;
11+
color: #333;
12+
}
13+
h1 {
14+
text-align: center;
15+
}
16+
.container {
17+
display: grid;
18+
grid-template-columns: repeat(2, 1fr);
19+
gap: 20px;
20+
max-width: 800px;
21+
margin: 0 auto;
22+
}
23+
.card {
24+
background: white;
25+
padding: 20px;
26+
border-radius: 12px;
27+
box-shadow: 0 4px 8px rgba(0,0,0,0.1);
28+
}
29+
.card h2 {
30+
margin-top: 0;
31+
font-size: 18px;
32+
color: #555;
33+
}
34+
button {
35+
display: block;
36+
margin: 20px auto;
37+
padding: 10px 20px;
38+
border: none;
39+
border-radius: 8px;
40+
background: #4a90e2;
41+
color: white;
42+
cursor: pointer;
43+
font-size: 16px;
44+
}
45+
button:hover {
46+
background: #357abd;
47+
}
48+
</style>
49+
</head>
50+
<body>
51+
<h1>Дані з API</h1>
52+
<div class="container">
53+
<div class="card"><h2>Поле 1</h2><p id="field1">Завантаження...</p></div>
54+
<div class="card"><h2>Поле 2</h2><p id="field2">Завантаження...</p></div>
55+
<div class="card"><h2>Поле 3</h2><p id="field3">Завантаження...</p></div>
56+
<div class="card"><h2>Поле 4</h2><p id="field4">Завантаження...</p></div>
57+
<div class="card"><h2>Поле 5</h2><p id="field5">Завантаження...</p></div>
58+
</div>
59+
60+
<button onclick="loadData()">Оновити дані</button>
61+
62+
<script>
63+
async function loadData() {
64+
try {
65+
// Заміни ці шляхи на свої API з index.ts
66+
const endpoints = [
67+
"/api/today",
68+
"/api/d6",
69+
"/api/now",
70+
"/api/whoami",
71+
"/api/weekend",
72+
];
73+
74+
const results = await Promise.all(endpoints.map(url =>
75+
fetch(url).then(r => r.text())
76+
));
77+
78+
// Запис у поля
79+
document.getElementById("field1").innerText = results[0];
80+
document.getElementById("field2").innerText = results[1];
81+
document.getElementById("field3").innerText = results[2];
82+
document.getElementById("field4").innerText = results[3];
83+
document.getElementById("field5").innerText = results[4];
84+
} catch (err) {
85+
console.error("Помилка завантаження:", err);
86+
}
87+
}
88+
89+
// Автооновлення раз на 10 сек
90+
setInterval(loadData, 10000);
91+
92+
// Початкове завантаження
93+
loadData();
94+
</script>
95+
</body>
96+
</html>

index.ts

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import type { Server } from "bun";
21
import homepage from "./index.html";
32

43
function getRandomInt(min: number, max: number) {
@@ -16,36 +15,35 @@ Bun.serve({
1615

1716
// Хто я? (трекер, варіант №4)
1817
"/api/whoami": (req: Request) => {
19-
2018
return new Response(`Your IP is ${req.headers.get("X-Forwarded-For")?.split(",")[0]}\n`);
2119
},
2220

2321
// Кубик (рандомайзер, варіант №2)
2422
"/api/d6": () => {
25-
let dice = getRandomInt(1, 7)
26-
return new Response(`The dice rolled a number ${dice}\n`)
23+
const dice = getRandomInt(1, 7);
24+
return new Response(`The dice rolled a number ${dice}\n`);
2725
},
2826

2927
// Календар (варіант №1)
3028
"/api/today": () => {
31-
let today = new Date()
32-
33-
return new Response(`Today is ${today.toDateString()} \n`)
29+
const today = new Date();
30+
31+
return new Response(`Today is ${today.toDateString()} \n`);
3432
},
3533

3634
// Годинник (варіант №3)
3735
"/api/now": () => {
38-
let today = new Date()
39-
40-
return new Response(`The time now is ${today.toTimeString()} \n`)
36+
const today = new Date();
37+
38+
return new Response(`The time now is ${today.toTimeString()} \n`);
4139
},
4240

4341
// Відлік (варіант №5)
4442
"/api/weekend": () => {
45-
const today = new Date();
46-
const weekday = today.getDay();
47-
let days = (6 - weekday) % 7;
48-
return new Response(`There are ${days === 0 ? 7 : days} days left to Saturday \n`)
43+
const today = new Date();
44+
const weekday = today.getDay();
45+
const days = (6 - weekday) % 7;
46+
return new Response(`There are ${days === 0 ? 7 : days} days left to Saturday \n`);
4947
},
5048

5149
// Wildcard route for all routes that start with "/api/" and aren't otherwise matched
@@ -54,7 +52,7 @@ Bun.serve({
5452

5553
// (optional) fallback for unmatched routes:
5654
// Required if Bun's version < 1.2.3
57-
fetch(req) {
55+
fetch() {
5856
return new Response("Not Found", { status: 404 });
5957
},
6058
});

0 commit comments

Comments
 (0)