project-startup 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +39 -0
  2. package/bin/cli.js +34 -0
  3. package/package.json +28 -0
  4. package/template/backend-project/.env +0 -0
  5. package/template/backend-project/.eslintrc.js +6 -0
  6. package/template/backend-project/.prettierrc +14 -0
  7. package/template/backend-project/README.md +1 -0
  8. package/template/backend-project/package-lock.json +1448 -0
  9. package/template/backend-project/package.json +18 -0
  10. package/template/backend-project/src/app.js +36 -0
  11. package/template/backend-project/src/config/db.js +19 -0
  12. package/template/backend-project/src/config/db.sql +10 -0
  13. package/template/backend-project/src/controllers/authCont.js +136 -0
  14. package/template/backend-project/src/middleware/authMiddleware.js +17 -0
  15. package/template/backend-project/src/routes/authRoutes.js +32 -0
  16. package/template/frontend-project/README.md +16 -0
  17. package/template/frontend-project/eslint.config.js +21 -0
  18. package/template/frontend-project/index.html +13 -0
  19. package/template/frontend-project/package-lock.json +3102 -0
  20. package/template/frontend-project/package.json +32 -0
  21. package/template/frontend-project/public/favicon.svg +1 -0
  22. package/template/frontend-project/public/icons.svg +24 -0
  23. package/template/frontend-project/src/App.css +0 -0
  24. package/template/frontend-project/src/App.jsx +31 -0
  25. package/template/frontend-project/src/Layout.jsx +34 -0
  26. package/template/frontend-project/src/api/authAPI.js +11 -0
  27. package/template/frontend-project/src/assets/hero.png +0 -0
  28. package/template/frontend-project/src/assets/react.svg +1 -0
  29. package/template/frontend-project/src/assets/vite.svg +1 -0
  30. package/template/frontend-project/src/components/Login.jsx +79 -0
  31. package/template/frontend-project/src/components/NotFound.jsx +16 -0
  32. package/template/frontend-project/src/components/ProtectedRoute.jsx +29 -0
  33. package/template/frontend-project/src/components/Register.jsx +131 -0
  34. package/template/frontend-project/src/context/AuthContext.jsx +93 -0
  35. package/template/frontend-project/src/index.css +11 -0
  36. package/template/frontend-project/src/main.jsx +10 -0
  37. package/template/frontend-project/src/pages/Dashboard.jsx +18 -0
  38. package/template/frontend-project/vite.config.js +8 -0
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "backend-project",
3
+ "version": "1.0.0",
4
+ "main": "src/app.js",
5
+ "scripts": {
6
+ "dev": "nodemon app.js"
7
+ },
8
+ "devDependencies": {
9
+ "nodemon": "^3.1.14"
10
+ },
11
+ "dependencies": {
12
+ "bcryptjs": "^3.0.3",
13
+ "cors": "^2.8.6",
14
+ "express": "^5.2.1",
15
+ "express-session": "^1.19.0",
16
+ "mysql2": "^3.22.4"
17
+ }
18
+ }
@@ -0,0 +1,36 @@
1
+ const express = require('express')
2
+ const session = require('express-session')
3
+ const cors = require('cors')
4
+
5
+ const db = require('./config/db')
6
+
7
+ const app = express()
8
+ const port = 5000
9
+
10
+ app.use(cors({
11
+ origin: 'http://localhost:5173',
12
+ credentials: true
13
+ }))
14
+
15
+ app.use(
16
+ session({
17
+ secret: "secretkey",
18
+ resave: false,
19
+ saveUninitialized: false,
20
+ cookie: {
21
+ httpOnly: true,
22
+ secure: false,
23
+ maxAge: 1000 * 60 * 60 * 24,
24
+ },
25
+ })
26
+ );
27
+
28
+ app.use(express.json());
29
+
30
+ const authRoutes = require('./routes/authRoutes')
31
+
32
+ app.use('/auth', authRoutes)
33
+
34
+ app.listen(port, () => {
35
+ console.log(`Server Running http://localhost:${port}`)
36
+ })
@@ -0,0 +1,19 @@
1
+ const mysql = require("mysql2/promise");
2
+
3
+ const db = mysql.createPool({
4
+ host: "localhost",
5
+ user: "root",
6
+ password: "root",
7
+ database: "project_starter_db",
8
+ });
9
+
10
+ db.getConnection((err) => {
11
+ if (err) {
12
+ console.log("Database connection failed");
13
+ return;
14
+ }
15
+
16
+ console.log("Database connected");
17
+ });
18
+
19
+ module.exports = db;
@@ -0,0 +1,10 @@
1
+ create database project_starter_db;
2
+
3
+ use project_starter_db;
4
+
5
+ CREATE TABLE users (
6
+ id INT PRIMARY KEY AUTO_INCREMENT,
7
+ username VARCHAR(255) NOT NULL,
8
+ useremail VARCHAR(255) UNIQUE NOT NULL,
9
+ userpassword VARCHAR(255) NOT NULL
10
+ );
@@ -0,0 +1,136 @@
1
+ const bcrypt = require("bcryptjs");
2
+ const db = require("../config/db");
3
+
4
+ const register = async (req, res) => {
5
+ try {
6
+ const {
7
+ username,
8
+ useremail,
9
+ userpassword,
10
+ } = req.body;
11
+
12
+ const [existingUser] = await db.query(
13
+ "SELECT * FROM users WHERE useremail = ?",
14
+ [useremail]
15
+ );
16
+
17
+ if (existingUser.length > 0) {
18
+ return res.status(400).json({
19
+ message: "Email already exists",
20
+ });
21
+ }
22
+
23
+ const hashedPassword =
24
+ await bcrypt.hash(userpassword, 10);
25
+
26
+ await db.query(
27
+ `
28
+ INSERT INTO users
29
+ (username, useremail, userpassword)
30
+ VALUES (?, ?, ?)
31
+ `,
32
+ [
33
+ username,
34
+ useremail,
35
+ hashedPassword,
36
+ ]
37
+ );
38
+
39
+ res.status(201).json({
40
+ message:
41
+ "User registered successfully",
42
+ });
43
+ } catch (error) {
44
+ res.status(500).json({
45
+ message: "Registration failed",
46
+ });
47
+ }
48
+ };
49
+
50
+ const login = async (req, res) => {
51
+ try {
52
+ const {
53
+ useremail,
54
+ userpassword,
55
+ } = req.body;
56
+
57
+ const [users] = await db.query(
58
+ "SELECT * FROM users WHERE useremail = ?",
59
+ [useremail]
60
+ );
61
+
62
+ if (users.length === 0) {
63
+ return res.status(400).json({
64
+ message: "Invalid credentials",
65
+ });
66
+ }
67
+
68
+ const user = users[0];
69
+
70
+ const isMatch =
71
+ await bcrypt.compare(
72
+ userpassword,
73
+ user.userpassword
74
+ );
75
+
76
+ if (!isMatch) {
77
+ return res.status(400).json({
78
+ message: "Invalid credentials",
79
+ });
80
+ }
81
+
82
+ req.session.user = {
83
+ id: user.id,
84
+ username: user.username,
85
+ useremail: user.useremail,
86
+ };
87
+
88
+ res.json({
89
+ message: "Login successful",
90
+ user: req.session.user,
91
+ });
92
+ } catch (error) {
93
+ res.status(500).json({
94
+ message: "Login failed",
95
+ });
96
+ }
97
+ };
98
+
99
+ const logout = async (req, res) => {
100
+ try {
101
+ req.session.destroy();
102
+
103
+ res.clearCookie("connect.sid");
104
+
105
+ res.json({
106
+ message: "Logout successful",
107
+ });
108
+ } catch (error) {
109
+ res.status(500).json({
110
+ message: "Logout failed",
111
+ });
112
+ }
113
+ };
114
+
115
+ const getMe = async (req, res) => {
116
+ try {
117
+ if (!req.session.user) {
118
+ return res.status(401).json({
119
+ message: "Unauthorized",
120
+ });
121
+ }
122
+
123
+ res.json(req.session.user);
124
+ } catch (error) {
125
+ res.status(500).json({
126
+ message: "Server error",
127
+ });
128
+ }
129
+ };
130
+
131
+ module.exports = {
132
+ register,
133
+ login,
134
+ logout,
135
+ getMe,
136
+ };
@@ -0,0 +1,17 @@
1
+ const isAuthenticated = (req, res, next) => {
2
+ try {
3
+ if (!req.session.user) {
4
+ return res.status(401).json({
5
+ message: "Unauthorized",
6
+ });
7
+ }
8
+
9
+ next();
10
+ } catch (error) {
11
+ res.status(500).json({
12
+ message: "Server error",
13
+ });
14
+ }
15
+ };
16
+
17
+ module.exports = isAuthenticated;
@@ -0,0 +1,32 @@
1
+ const express = require("express");
2
+
3
+ const {
4
+ register,
5
+ login,
6
+ logout,
7
+ getMe,
8
+ } = require("../controllers/authCont");
9
+
10
+ const isAuthenticated = require("../middleware/authMiddleware");
11
+
12
+ const router = express.Router();
13
+
14
+ router.post("/register", register);
15
+
16
+ router.post("/login", login);
17
+
18
+ router.post("/logout", logout);
19
+
20
+ router.get("/me", getMe);
21
+
22
+ router.get(
23
+ "/protected",
24
+ isAuthenticated,
25
+ (req, res) => {
26
+ res.json({
27
+ message: "Protected route accessed",
28
+ });
29
+ }
30
+ );
31
+
32
+ module.exports = router;
@@ -0,0 +1,16 @@
1
+ # React + Vite
2
+
3
+ This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
4
+
5
+ Currently, two official plugins are available:
6
+
7
+ - [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs)
8
+ - [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/)
9
+
10
+ ## React Compiler
11
+
12
+ The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation).
13
+
14
+ ## Expanding the ESLint configuration
15
+
16
+ If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and [`typescript-eslint`](https://typescript-eslint.io) in your project.
@@ -0,0 +1,21 @@
1
+ import js from '@eslint/js'
2
+ import globals from 'globals'
3
+ import reactHooks from 'eslint-plugin-react-hooks'
4
+ import reactRefresh from 'eslint-plugin-react-refresh'
5
+ import { defineConfig, globalIgnores } from 'eslint/config'
6
+
7
+ export default defineConfig([
8
+ globalIgnores(['dist']),
9
+ {
10
+ files: ['**/*.{js,jsx}'],
11
+ extends: [
12
+ js.configs.recommended,
13
+ reactHooks.configs.flat.recommended,
14
+ reactRefresh.configs.vite,
15
+ ],
16
+ languageOptions: {
17
+ globals: globals.browser,
18
+ parserOptions: { ecmaFeatures: { jsx: true } },
19
+ },
20
+ },
21
+ ])
@@ -0,0 +1,13 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>frontend-project</title>
8
+ </head>
9
+ <body>
10
+ <div id="root"></div>
11
+ <script type="module" src="/src/main.jsx"></script>
12
+ </body>
13
+ </html>