create-react-my-app 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 (33) hide show
  1. package/cli/index.js +77 -0
  2. package/package.json +32 -0
  3. package/template/backend/config/db.js +21 -0
  4. package/template/backend/controllers/authcontroller.js +81 -0
  5. package/template/backend/controllers/reportcontroller.js +31 -0
  6. package/template/backend/database/schema.sql +21 -0
  7. package/template/backend/middleware/authentication.js +10 -0
  8. package/template/backend/package-lock.json +1417 -0
  9. package/template/backend/package.json +19 -0
  10. package/template/backend/routes/authroute.js +12 -0
  11. package/template/backend/routes/reportroute.js +7 -0
  12. package/template/backend/server.js +55 -0
  13. package/template/frontend/eslint.config.js +29 -0
  14. package/template/frontend/index.html +12 -0
  15. package/template/frontend/package-lock.json +3934 -0
  16. package/template/frontend/package.json +31 -0
  17. package/template/frontend/public/vite.svg +1 -0
  18. package/template/frontend/src/App.css +0 -0
  19. package/template/frontend/src/App.jsx +38 -0
  20. package/template/frontend/src/assets/react.svg +1 -0
  21. package/template/frontend/src/components/Button.jsx +44 -0
  22. package/template/frontend/src/components/Form.jsx +150 -0
  23. package/template/frontend/src/components/Navbar.jsx +83 -0
  24. package/template/frontend/src/components/Table.jsx +77 -0
  25. package/template/frontend/src/components/protectedroute.jsx +41 -0
  26. package/template/frontend/src/config/api.js +8 -0
  27. package/template/frontend/src/index.css +46 -0
  28. package/template/frontend/src/main.jsx +10 -0
  29. package/template/frontend/src/pages/login.jsx +42 -0
  30. package/template/frontend/src/pages/report.jsx +90 -0
  31. package/template/frontend/src/pages/signup.jsx +46 -0
  32. package/template/frontend/src/pages/trial.jsx +87 -0
  33. package/template/frontend/vite.config.js +10 -0
package/cli/index.js ADDED
@@ -0,0 +1,77 @@
1
+ #!/usr/bin/env node
2
+
3
+ import fs from "fs-extra";
4
+ import path from "path";
5
+ import { fileURLToPath } from "url";
6
+ import inquirer from "inquirer";
7
+ import chalk from "chalk";
8
+ import { execa } from "execa";
9
+ import ora from "ora";
10
+
11
+ const __filename = fileURLToPath(import.meta.url);
12
+ const __dirname = path.dirname(__filename);
13
+
14
+ console.log(
15
+ chalk.cyan(`
16
+ ╔══════════════════════════════╗
17
+ ║ CREATE MY REACT APP ║
18
+ ╚══════════════════════════════╝
19
+ `)
20
+ );
21
+
22
+ async function main() {
23
+ const answers = await inquirer.prompt([
24
+ {
25
+ type: "input",
26
+ name: "projectName",
27
+ message: "Project name:",
28
+ default: "my-app"
29
+ }
30
+ ]);
31
+
32
+ const projectName = answers.projectName;
33
+
34
+ const targetDir = path.join(process.cwd(), projectName);
35
+
36
+ const templateDir = path.join(__dirname, "../template");
37
+
38
+ // Copy files
39
+ const copySpinner = ora("Creating React application...").start();
40
+
41
+ await fs.copy(templateDir, targetDir);
42
+
43
+ copySpinner.succeed("Project files created");
44
+
45
+ // Install frontend
46
+ const frontendSpinner = ora("Installing frontend dependencies...").start();
47
+
48
+ await execa("npm", ["install"], {
49
+ cwd: path.join(targetDir, "frontend"),
50
+ stdio: "ignore"
51
+ });
52
+
53
+ frontendSpinner.succeed("Frontend dependencies installed");
54
+
55
+ // Install backend
56
+ const backendSpinner = ora("Installing tailwind dependencies...").start();
57
+
58
+ await execa("npm", ["install"], {
59
+ cwd: path.join(targetDir, "backend"),
60
+ stdio: "ignore"
61
+ });
62
+
63
+ backendSpinner.succeed("tailwind dependencies installed");
64
+
65
+ console.log(chalk.green(`
66
+ ✔ Application created successfully!
67
+ `));
68
+
69
+
70
+ }
71
+
72
+ main();
73
+
74
+ main().catch((err) => {
75
+ console.error(err);
76
+ process.exit(1);
77
+ });
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "create-react-my-app",
3
+ "version": "1.0.0",
4
+ "description": "CLI tool to create fullstack React applications",
5
+ "type": "module",
6
+ "bin": {
7
+ "create-react-my-app": "cli/index.js"
8
+ },
9
+ "files": [
10
+ "cli",
11
+ "template"
12
+ ],
13
+ "keywords": [
14
+ "react",
15
+ "cli",
16
+ "scaffold",
17
+ "vite",
18
+ "tailwind"
19
+ ],
20
+ "author": "Cyubahiro Derrick",
21
+ "license": "MIT",
22
+ "engines": {
23
+ "node": ">=18"
24
+ },
25
+ "dependencies": {
26
+ "chalk": "^5.6.2",
27
+ "execa": "^9.6.1",
28
+ "fs-extra": "^11.3.5",
29
+ "inquirer": "^13.4.3",
30
+ "ora": "^8.2.0"
31
+ }
32
+ }
@@ -0,0 +1,21 @@
1
+ const mysql = require('mysql2');
2
+ const dotenv = require('dotenv');
3
+
4
+ dotenv.config();
5
+
6
+ const db = mysql.createConnection({
7
+ host: process.env.DB_HOST || 'localhost',
8
+ user: process.env.DB_USER || 'root',
9
+ database: process.env.DB_NAME || 'sims',
10
+ password: process.env.DB_PASSWORD || '',
11
+ });
12
+
13
+ db.connect((err) => {
14
+ if (err) {
15
+ console.error('Database connection failed:', err.message);
16
+ } else {
17
+ console.log('Connected to database');
18
+ }
19
+ });
20
+
21
+ module.exports = db;
@@ -0,0 +1,81 @@
1
+ const bcrypt = require('bcrypt');
2
+ const db = require('../config/db');
3
+
4
+ const createUser = (req, res) => {
5
+ const { username, password } = req.body;
6
+ const role = req.body.role || 'user';
7
+
8
+ if (!username || !password) {
9
+ return res.status(400).json({ message: 'Username and password are required' });
10
+ }
11
+
12
+ if (username.length < 2) {
13
+ return res.status(400).json({ message: 'Username must be at least 2 characters' });
14
+ }
15
+
16
+ const hashedPassword = bcrypt.hashSync(password, 10);
17
+ const query = 'INSERT INTO users (username, password, role) VALUES (?, ?, ?)';
18
+
19
+ db.query(query, [username, hashedPassword, role], (err, result) => {
20
+ if (err) {
21
+ if (err.code === 'ER_DUP_ENTRY') {
22
+ return res.status(409).json({ message: 'Username already exists' });
23
+ }
24
+ console.error(err);
25
+ return res.status(500).json({ message: 'Internal server error' });
26
+ }
27
+
28
+ req.session.user = { id: result.insertId, username, role };
29
+ return res.status(201).json({ message: 'Account created successfully', data: req.session.user });
30
+ });
31
+ };
32
+
33
+ const login = (req, res) => {
34
+ const { username, password } = req.body;
35
+
36
+ if (!username || !password) {
37
+ return res.status(400).json({ message: 'Username and password are required' });
38
+ }
39
+
40
+ const query = 'SELECT * FROM users WHERE username = ?';
41
+
42
+ db.query(query, [username], (err, result) => {
43
+ if (err) {
44
+ console.error(err);
45
+ return res.status(500).json({ message: 'Internal server error' });
46
+ }
47
+
48
+ if (result.length === 0) {
49
+ return res.status(401).json({ message: 'Invalid credentials' });
50
+ }
51
+
52
+ const user = result[0];
53
+
54
+ bcrypt.compare(password, user.password, (compareErr, isMatch) => {
55
+ if (compareErr) {
56
+ console.error(compareErr);
57
+ return res.status(500).json({ message: 'Internal server error' });
58
+ }
59
+
60
+ if (!isMatch) {
61
+ return res.status(401).json({ message: 'Invalid credentials' });
62
+ }
63
+
64
+ req.session.user = { id: user.id, username: user.username, role: user.role };
65
+ return res.status(200).json({ message: 'Login successful', data: req.session.user });
66
+ });
67
+ });
68
+ };
69
+
70
+ const logout = (req, res) => {
71
+ req.session.destroy((err) => {
72
+ if (err) {
73
+ console.error(err);
74
+ return res.status(500).json({ message: 'Internal server error' });
75
+ }
76
+ res.clearCookie('ui_kit_session');
77
+ return res.status(200).json({ message: 'Logout successful' });
78
+ });
79
+ };
80
+
81
+ module.exports = { createUser, login, logout };
@@ -0,0 +1,31 @@
1
+ const db = require('../config/db');
2
+
3
+ const getReportByDate = (req, res) => {
4
+ const { date } = req.query;
5
+
6
+ if (!date) {
7
+ return res.status(400).json({ message: 'Date parameter is required (YYYY-MM-DD)' });
8
+ }
9
+
10
+ const query = `
11
+ SELECT id, title, category, amount, report_date, created_at
12
+ FROM report_entries
13
+ WHERE report_date = ?
14
+ ORDER BY created_at DESC
15
+ `;
16
+
17
+ db.query(query, [date], (err, result) => {
18
+ if (err) {
19
+ console.error(err);
20
+ return res.status(500).json({ message: 'Internal server error' });
21
+ }
22
+
23
+ return res.status(200).json({
24
+ message: `Report generated for ${date}`,
25
+ data: result,
26
+ date,
27
+ });
28
+ });
29
+ };
30
+
31
+ module.exports = { getReportByDate };
@@ -0,0 +1,21 @@
1
+ CREATE DATABASE IF NOT EXISTS ui_kit_demo;
2
+ USE ui_kit_demo;
3
+
4
+ CREATE TABLE IF NOT EXISTS users (
5
+ id INT AUTO_INCREMENT PRIMARY KEY,
6
+ username VARCHAR(255) NOT NULL UNIQUE,
7
+ password VARCHAR(255) NOT NULL,
8
+ role VARCHAR(50) NOT NULL DEFAULT 'user',
9
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
10
+ );
11
+
12
+ CREATE TABLE IF NOT EXISTS report_entries (
13
+ id INT AUTO_INCREMENT PRIMARY KEY,
14
+ title VARCHAR(255) NOT NULL,
15
+ category VARCHAR(100) NOT NULL,
16
+ amount DECIMAL(10, 2) NOT NULL,
17
+ report_date DATE NOT NULL,
18
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
19
+ );
20
+
21
+
@@ -0,0 +1,10 @@
1
+ const isauthenticated = (req,res,next)=>{
2
+ if(req.session && req.session.user){
3
+ return next();
4
+ }
5
+
6
+ return res.status(401).json({message:"Unauthorized"});
7
+ }
8
+
9
+
10
+ module.exports = isauthenticated;