Compare commits

..

No commits in common. "4b22c5ead8fa5453420e3782f628a46b8415eb74" and "97de40a396c8874244dcb40d39927181d5b53397" have entirely different histories.

21 changed files with 128 additions and 2859 deletions

1
.gitignore vendored
View File

@ -142,7 +142,6 @@ dist
# production # production
/build /build
*/build/
# misc # misc
.DS_Store .DS_Store

View File

@ -6,12 +6,12 @@
"private": true, "private": true,
"license": "UNLICENSED", "license": "UNLICENSED",
"scripts": { "scripts": {
"build": "npm run lint && nest build", "build": "nest build",
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
"start": "npm run build && nest start --watch", "start": "nest start --watch",
"start:debug": "nest start --debug --watch", "start:debug": "nest start --debug --watch",
"start:prod": "node dist/main", "start:prod": "node dist/main",
"lint": "eslint \"src/**/*.ts\" --fix", "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
"test": "jest", "test": "jest",
"test:watch": "jest --watch", "test:watch": "jest --watch",
"test:cov": "jest --coverage", "test:cov": "jest --coverage",

View File

@ -1,13 +1,7 @@
import { Injectable, Logger } from '@nestjs/common'; import { Injectable, Logger } from '@nestjs/common';
import { import { ConnectedSocket, MessageBody, OnGatewayConnection, SubscribeMessage, WebSocketGateway } from '@nestjs/websockets';
ConnectedSocket,
OnGatewayConnection,
MessageBody,
SubscribeMessage,
WebSocketGateway,
} from '@nestjs/websockets';
import { PlayerService } from './players/player.service'; import { PlayerService } from './players/player.service';
import { Socket } from 'socket.io'; import { Socket } from 'socket.io'
@WebSocketGateway({ cors: true }) @WebSocketGateway({ cors: true })
@Injectable() @Injectable()
@ -15,20 +9,14 @@ export class AppService implements OnGatewayConnection {
private readonly logger = new Logger(AppService.name); private readonly logger = new Logger(AppService.name);
constructor(private readonly playerService: PlayerService) {} constructor(private readonly playerService: PlayerService) {}
handleConnection(client: Socket) { handleConnection(client:Socket) {
this.logger.log(client.id); this.logger.log(client.id);
} }
@SubscribeMessage('example-request') @SubscribeMessage('example-request')
handleCustomEvent( handleCustomEvent(@ConnectedSocket() client:Socket,@MessageBody() data: string): unknown {
@ConnectedSocket() client: Socket,
@MessageBody() data: string,
): unknown {
this.logger.debug(`Received request in backend with data: ${data}`); this.logger.debug(`Received request in backend with data: ${data}`);
this.logger.debug(`Received data id from client: ${client.id}`); this.logger.debug(`Received data id from client: ${client.id}`);
return { return {event: "example-response", data: `Replying from backend, received data: ${data}`};
event: 'example-response',
data: `Replying from backend, received data: ${data}`,
};
} }
} }

View File

@ -1,4 +1,5 @@
import { Injectable, Logger } from '@nestjs/common'; import { Injectable, Logger } from '@nestjs/common';
import { MessageBody, OnGatewayConnection, SubscribeMessage, WebSocketGateway } from '@nestjs/websockets';
@Injectable() @Injectable()
export class PlayerService { export class PlayerService {

View File

@ -1,17 +0,0 @@
module.exports = {
parser: "@typescript-eslint/parser",
parserOptions: {
project: "tsconfig.json",
tsconfigRootDir: __dirname,
sourceType: "module",
},
plugins: ["@typescript-eslint/eslint-plugin"],
extends: ["plugin:@typescript-eslint/strict", "plugin:prettier/recommended"],
root: true,
env: {
node: true,
jest: true,
},
ignorePatterns: [".eslintrc.js", "dist/"],
rules: {},
};

View File

@ -1,5 +1,5 @@
export enum ClientEvent { export enum ClientEvent {
CREATE_LOBBY = "create-lobby", CREATE_LOBBY = "create-lobby",
JOIN_LOBBY = "join-lobby", JOIN_LOBBY = "join-lobby",
START_GAME = "start-game", START_GAME = "start-game"
} }

View File

@ -1,3 +1,3 @@
export type CreateLobbyEvent = { export type CreateLobbyEvent = {
userName: string; userName: string;
}; }

View File

@ -1,4 +1,4 @@
export type JoinLobbyEvent = { export type JoinLobbyEvent = {
userName: string; userName: string;
lobbyId: string; lobbyId: string;
}; }

View File

@ -1,4 +1,4 @@
export enum TrackType { export enum TrackType {
RAIL = "RAIL", RAIL = "RAIL",
ROAD = "ROAD", ROAD = "ROAD"
} };

File diff suppressed because it is too large Load Diff

View File

@ -5,21 +5,13 @@
"main": "dist/index.js", "main": "dist/index.js",
"types": "dist/index.d.ts", "types": "dist/index.d.ts",
"scripts": { "scripts": {
"build": "npm run lint && tsc", "test": "echo \"Error: no test specified\" && exit 1",
"lint": "eslint \"*.ts\" \"*/**/*.ts\" --fix" "build": "tsc"
}, },
"author": "", "author": "",
"license": "ISC", "license": "ISC",
"devDependencies": { "devDependencies": {
"@eslint/js": "^8.0.0",
"@types/node": "^22.9.0", "@types/node": "^22.9.0",
"@typescript-eslint/eslint-plugin": "^8.15.0", "typescript": "^5.6.3"
"@typescript-eslint/parser": "^8.15.0",
"eslint": "^8.0.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-prettier": "^5.2.1",
"globals": "^15.12.0",
"typescript": "^5.6.3",
"typescript-eslint": "^8.15.0"
} }
} }

View File

@ -1,4 +1,4 @@
export enum ServerError { export enum ServerError {
CREATE_LOBBY_ERROR = "create-lobby-error", CREATE_LOBBY_ERROR = "create-lobby-error",
JOIN_LOBBY_ERROR = "join-lobby-error", JOIN_LOBBY_ERROR = "join-lobby-error"
} }

View File

@ -1,4 +1,4 @@
export enum ServerEvent { export enum ServerEvent {
LOBBY_UPDATE = "lobby-update", LOBBY_UPDATE = "lobby-update",
START_ROUND = "start-round", START_ROUND = "start-round"
} }

View File

@ -1,17 +0,0 @@
module.exports = {
parser: "@typescript-eslint/parser",
parserOptions: {
project: "tsconfig.json",
tsconfigRootDir: __dirname,
sourceType: "module",
},
plugins: ["@typescript-eslint/eslint-plugin"],
extends: ["plugin:@typescript-eslint/strict", "plugin:prettier/recommended"],
root: true,
env: {
node: true,
jest: true,
},
ignorePatterns: [".eslintrc.js", "dist/", "node_modules/", "build/"],
rules: {},
};

926
web/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -22,10 +22,9 @@
}, },
"scripts": { "scripts": {
"start": "react-scripts start", "start": "react-scripts start",
"build": "npm run lint && react-scripts build", "build": "react-scripts build",
"test": "react-scripts test", "test": "react-scripts test",
"eject": "react-scripts eject", "eject": "react-scripts eject"
"lint": "eslint \"*/**/*.tsx\" \"*/**/*.ts\" --fix"
}, },
"eslintConfig": { "eslintConfig": {
"extends": [ "extends": [
@ -44,13 +43,5 @@
"last 1 firefox version", "last 1 firefox version",
"last 1 safari version" "last 1 safari version"
] ]
},
"devDependencies": {
"@eslint/js": "^8.0.0",
"@typescript-eslint/parser": "^8.15.0",
"eslint": "^8.0.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-prettier": "^5.2.1",
"typescript-eslint": "^8.15.0"
} }
} }

8
web/src/App.test.tsx Normal file
View File

@ -0,0 +1,8 @@
import React from 'react';
import { render, screen } from '@testing-library/react';
import App from './App';
test('Renders hello world', () => {
render(<App />);
expect(screen.getByText("Hello World! Front")).toBeInTheDocument();
});

View File

@ -1,13 +1,15 @@
import React from "react"; import React from 'react';
import { io } from "socket.io-client"; import { io } from "socket.io-client";
import LandingPage from "./pages/landing/LandingPage"; import LandingPage from './pages/landing/LandingPage';
function App() { function App() {
const socket = io("http://localhost:3010"); const socket = io("http://localhost:3010");
const emitData = () => console.log(socket.emit("example-request", "custom-request"));
socket.on("example-response", (data) => console.log(`Received response in front end with data: ${data}`));
return ( return (
<div className="App"> <div className="App">
<LandingPage socket={socket} /> <LandingPage socket={socket}/>
</div> </div>
); );
} }

View File

@ -1,13 +1,13 @@
import React from "react"; import React from 'react';
import ReactDOM from "react-dom/client"; import ReactDOM from 'react-dom/client';
import App from "./App"; import App from './App';
import "./App.scss"; import './App.scss'
const root = ReactDOM.createRoot( const root = ReactDOM.createRoot(
document.getElementById("root") as HTMLElement, document.getElementById('root') as HTMLElement
); );
root.render( root.render(
<React.StrictMode> <React.StrictMode>
<App /> <App />
</React.StrictMode>, </React.StrictMode>
); );

View File

@ -1,29 +1,25 @@
import React, { ChangeEvent } from "react"; import React from "react"
import { Socket } from "socket.io-client"; import { Socket } from "socket.io-client";
const LandingPage = (props: { socket: Socket }) => { const LandingPage = (props:{socket:Socket})=>{
let username = ""; var username = "";
const registerUsername = (event: ChangeEvent<HTMLInputElement>) => const registerUsername = (event:any) => username = event.target.value;
(username = event.target.value); const socket = props.socket;
const socket = props.socket; const handleCreateLobby = () => socket.emit("create-lobby", {username:username});
const handleCreateLobby = () => return <React.Fragment>
socket.emit("create-lobby", { username: username }); <div className="LandingPageTitle">
return ( <h1>Trains And Roads</h1>
<React.Fragment> </div>
<div className="LandingPageTitle"> <div className="UserNameImput">
<h1>Trains And Roads</h1> <input placeholder="Enter username" onChange={registerUsername}></input>
</div> </div>
<div className="UserNameImput"> <div className="CreateLobbyButton">
<input placeholder="Enter username" onChange={registerUsername}></input> <button onClick={handleCreateLobby}>Create Lobby</button>
</div> </div>
<div className="CreateLobbyButton"> <div className="JoinLobby">
<button onClick={handleCreateLobby}>Create Lobby</button> <input className="LobbyIdInput" placeholder="Enter Lobby Id"></input>
</div> <button className="JoinLobbyButton secondary">Join Lobby</button>
<div className="JoinLobby"> </div>
<input className="LobbyIdInput" placeholder="Enter Lobby Id"></input>
<button className="JoinLobbyButton secondary">Join Lobby</button>
</div>
</React.Fragment> </React.Fragment>
);
}; };
export default LandingPage; export default LandingPage;

View File

@ -2,4 +2,4 @@
// allows you to do things like: // allows you to do things like:
// expect(element).toHaveTextContent(/react/i) // expect(element).toHaveTextContent(/react/i)
// learn more: https://github.com/testing-library/jest-dom // learn more: https://github.com/testing-library/jest-dom
import "@testing-library/jest-dom"; import '@testing-library/jest-dom';