Skip to content

Commit c06a198

Browse files
chore: complete node v25 usage and test CI usage
1 parent 53d3529 commit c06a198

File tree

9 files changed

+374
-395
lines changed

9 files changed

+374
-395
lines changed

.github/workflows/pr-checks.yml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ jobs:
1010
runs-on: ubuntu-latest
1111
steps:
1212
- name: Checkout repository
13-
uses: actions/checkout@v4
13+
uses: actions/checkout@v5
1414

1515
- name: Set up Node.js
16-
uses: actions/setup-node@v4
16+
uses: actions/setup-node@v5
1717
with:
18-
node-version: 20
18+
node-version: 25
1919
cache: npm
2020

2121
- name: Install dependencies
@@ -28,12 +28,12 @@ jobs:
2828
runs-on: ubuntu-latest
2929
steps:
3030
- name: Checkout repository
31-
uses: actions/checkout@v4
31+
uses: actions/checkout@v5
3232

3333
- name: Set up Node.js
34-
uses: actions/setup-node@v4
34+
uses: actions/setup-node@v5
3535
with:
36-
node-version: 20
36+
node-version: 25
3737
cache: npm
3838

3939
- name: Install dependencies

.nvmrc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
24
1+
25

demo/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,6 @@
3535
<!-- <div class="loader" id="loading"></div> -->
3636
</div>
3737
</div>
38-
<script type="module" src="./index.js"></script>
38+
<script type="module" src="./index.ts"></script>
3939
</body>
4040
</html>

demo/index.js renamed to demo/index.ts

Lines changed: 43 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import * as THREE from "three";
55
import { TrackballControls } from "three/examples/jsm/controls/TrackballControls.js";
66
import { STLLoader } from "three/examples/jsm/loaders/STLLoader.js";
77

8-
let renderer, scene;
8+
let renderer: THREE.WebGLRenderer;
9+
let scene: THREE.Scene;
910

1011
function init() {
1112
const sizes = {
@@ -35,7 +36,7 @@ function init() {
3536
// the light follow the camera position
3637
controls.addEventListener("change", lightUpdate);
3738

38-
function lightUpdate() {
39+
function lightUpdate(): void {
3940
directionalLight.position.copy(camera.position);
4041
}
4142

@@ -51,7 +52,7 @@ function init() {
5152
directionalLight.castShadow = true;
5253
scene.add(directionalLight);
5354

54-
function onWindowResize() {
55+
function onWindowResize(): void {
5556
// Update sizes
5657
sizes.width = window.innerWidth;
5758
sizes.height = window.innerHeight - 100;
@@ -65,7 +66,7 @@ function init() {
6566
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
6667
}
6768

68-
function render() {
69+
function render(): void {
6970
requestAnimationFrame(render);
7071
controls.update();
7172
renderer.render(scene, camera);
@@ -76,27 +77,27 @@ function init() {
7677

7778
init();
7879

79-
let mesh;
80+
let mesh: THREE.Mesh | null = null;
8081

81-
const offsetElement = document.getElementById("offset");
82-
const btnMeshOffset = document.getElementById("meshOffset");
83-
const btnPointOffset = document.getElementById("pointOffset");
82+
const offsetElement = document.getElementById("offset") as HTMLInputElement;
83+
const btnMeshOffset = document.getElementById("meshOffset") as HTMLButtonElement;
84+
const btnPointOffset = document.getElementById("pointOffset") as HTMLButtonElement;
8485

85-
btnMeshOffset.addEventListener("click", async (e) => {
86+
btnMeshOffset?.addEventListener("click", async (e: Event) => {
8687
e.preventDefault();
8788

88-
const offset = offsetElement.value;
89+
const offset = Number(offsetElement?.value || 0);
8990

9091
if (mesh) {
9192
const meshOffset = await applyOffset(mesh, offset);
9293
removeAddOffset(meshOffset);
9394
}
9495
});
9596

96-
btnPointOffset.addEventListener("click", (e) => {
97+
btnPointOffset?.addEventListener("click", (e: Event) => {
9798
e.preventDefault();
9899

99-
const offset = offsetElement.value;
100+
const offset = Number(offsetElement?.value || 0);
100101

101102
if (mesh) {
102103
const newMesh = processGeometry(mesh.geometry, offset);
@@ -105,23 +106,29 @@ btnPointOffset.addEventListener("click", (e) => {
105106
});
106107

107108
// Load the file and get the geometry
108-
document.getElementById("file").onchange = (e) => {
109+
const fileInput = document.getElementById("file") as HTMLInputElement;
110+
fileInput?.addEventListener("change", (e: Event) => {
111+
const target = e.target as HTMLInputElement;
112+
const file = target.files?.[0];
113+
114+
if (!file) return;
115+
109116
const reader = new FileReader();
110117

111118
reader.onload = () => {
112-
const geometry = new STLLoader().parse(reader.result);
113-
114-
createMeshFromFile(geometry);
119+
if (reader.result) {
120+
const geometry = new STLLoader().parse(reader.result);
121+
createMeshFromFile(geometry);
122+
}
115123
};
116124

117-
reader.readAsArrayBuffer(e.target.files[0]);
118-
};
125+
reader.readAsArrayBuffer(file);
126+
});
119127

120128
/**
121129
* Creates the mesh from the file's geometry
122-
* @param {THREE.BufferGeometry} geometry
123130
*/
124-
const createMeshFromFile = (geometry) => {
131+
const createMeshFromFile = (geometry: THREE.BufferGeometry): void => {
125132
if (mesh) {
126133
scene.remove(mesh);
127134
}
@@ -135,32 +142,36 @@ const createMeshFromFile = (geometry) => {
135142
scene.add(mesh);
136143
};
137144

138-
const removeAddOffset = (mesh) => {
139-
const offsetMesh = scene.children.filter((item) => item.name === mesh.name);
145+
const removeAddOffset = (offsetMesh: THREE.Mesh | THREE.Points): void => {
146+
const existingMesh = scene.children.filter((item) => item.name === offsetMesh.name);
140147

141-
if (offsetMesh.length === 0) {
142-
scene.add(mesh);
148+
if (existingMesh.length === 0) {
149+
scene.add(offsetMesh);
143150
} else {
144-
scene.remove(offsetMesh[0]);
145-
scene.add(mesh);
151+
scene.remove(existingMesh[0]);
152+
scene.add(offsetMesh);
146153
}
147154
};
148155

149156
// Button to clear the scene
150-
const btnClearScene = document.getElementById("clearScene");
157+
const btnClearScene = document.getElementById("clearScene") as HTMLButtonElement;
151158

152-
btnClearScene.addEventListener("click", () => {
159+
btnClearScene?.addEventListener("click", () => {
153160
clearScene();
154161
});
155162

156-
const clearScene = () => {
163+
const clearScene = (): void => {
157164
const meshes = scene.children.filter((item) => item.type === "Mesh" || item.type === "Points");
158165

159166
if (meshes.length > 0) {
160-
for (const mesh of meshes) {
161-
scene.remove(mesh);
167+
for (const meshItem of meshes) {
168+
scene.remove(meshItem);
162169
}
163170

164-
document.getElementById("file").value = "";
171+
const fileInput = document.getElementById("file") as HTMLInputElement;
172+
if (fileInput) {
173+
fileInput.value = "";
174+
}
165175
}
176+
mesh = null;
166177
};

0 commit comments

Comments
 (0)