frontend-hamroun 1.2.14 → 1.2.16

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "frontend-hamroun",
3
- "version": "1.2.14",
3
+ "version": "1.2.16",
4
4
  "description": "A lightweight frontend and backend framework for building modern web applications",
5
5
  "type": "module",
6
6
  "main": "dist/frontend-hamroun.umd.js",
@@ -27,15 +27,9 @@
27
27
  "frontend-hamroun": "./bin/cli.mjs"
28
28
  },
29
29
  "scripts": {
30
- "dev": "vite",
31
- "build": "vite build && tsc && npm run build:cli",
32
- "build:cli": "node scripts/build-cli.js",
33
- "prepublishOnly": "npm run build",
34
- "test": "jest",
35
- "clean": "rimraf dist bin",
36
- "prebuild": "npm run clean",
37
- "generate": "node scripts/generate.js",
38
- "publish:next": "npm publish --tag next"
30
+ "dev": "node src/server.js",
31
+ "build": "tsc && node scripts/build-cli.js",
32
+ "start": "node dist/server.js"
39
33
  },
40
34
  "keywords": [
41
35
  "frontend",
@@ -66,9 +60,7 @@
66
60
  "rimraf": "^5.0.5",
67
61
  "terser": "^5.25.0",
68
62
  "ts-jest": "^29.1.1",
69
- "typescript": "^5.3.3",
70
- "vite": "^5.0.10",
71
- "vite-plugin-dts": "^3.6.4"
63
+ "typescript": "^5.3.2"
72
64
  },
73
65
  "dependencies": {
74
66
  "bcrypt": "^5.1.1",
@@ -78,7 +70,6 @@
78
70
  "jsonwebtoken": "^9.0.2",
79
71
  "mongoose": "^8.0.3",
80
72
  "morgan": "^1.10.0",
81
- "ts-node": "^10.9.2",
82
- "vite-plugin-node-polyfills": "^0.23.0"
73
+ "ts-node": "^10.9.2"
83
74
  }
84
75
  }
@@ -292,17 +292,16 @@ for (const template of templateList) {
292
292
  "version": "0.1.0",
293
293
  "type": "module",
294
294
  "scripts": {
295
- "dev": "vite",
296
- "build": "tsc && vite build",
297
- "preview": "vite preview"
295
+ "dev": "node src/server.js",
296
+ "build": "node src/build.js",
297
+ "preview": "node src/preview.js"
298
298
  },
299
299
  "dependencies": {
300
300
  "frontend-hamroun": "latest"
301
301
  },
302
302
  "devDependencies": {
303
303
  "@types/node": "^20.10.0",
304
- "typescript": "^5.3.2",
305
- "vite": "^5.0.0"
304
+ "typescript": "^5.3.2"
306
305
  }
307
306
  };
308
307
 
@@ -401,21 +400,31 @@ export function App() {
401
400
  }`
402
401
  );
403
402
 
404
- // Create vite.config.ts
403
+ // Create build.js
405
404
  fs.writeFileSync(
406
- path.join(templateDir, 'vite.config.ts'),
407
- `import { defineConfig } from 'vite';
405
+ path.join(srcDir, 'build.js'),
406
+ `import { execSync } from 'child_process';
408
407
 
409
- export default defineConfig({
410
- esbuild: {
411
- jsxFactory: 'jsx',
412
- jsxFragment: 'Fragment'
413
- },
414
- build: {
415
- outDir: 'dist',
416
- emptyOutDir: true
417
- }
418
- });`
408
+ console.log('Building the app...');
409
+ try {
410
+ execSync('tsc', { stdio: 'inherit' });
411
+ console.log('Build completed successfully.');
412
+ } catch (error) {
413
+ console.error('Build failed:', error);
414
+ }`
415
+ );
416
+
417
+ // Create preview.js
418
+ fs.writeFileSync(
419
+ path.join(srcDir, 'preview.js'),
420
+ `import { execSync } from 'child_process';
421
+
422
+ console.log('Starting preview server...');
423
+ try {
424
+ execSync('node dist/server.js', { stdio: 'inherit' });
425
+ } catch (error) {
426
+ console.error('Failed to start preview server:', error);
427
+ }`
419
428
  );
420
429
 
421
430
  // Create tsconfig files
@@ -453,7 +462,7 @@ export default defineConfig({
453
462
  "moduleResolution": "bundler",
454
463
  "allowSyntheticDefaultImports": true
455
464
  },
456
- "include": ["vite.config.ts"]
465
+ "include": ["src/build.js", "src/preview.js"]
457
466
  }`
458
467
  );
459
468
 
@@ -503,18 +512,16 @@ function createBasicTemplate(templateDir) {
503
512
  "version": "0.1.0",
504
513
  "type": "module",
505
514
  "scripts": {
506
- "dev": "vite",
507
- "build": "tsc && vite build",
508
- "preview": "vite preview"
515
+ "dev": "node src/server.js",
516
+ "build": "node src/build.js",
517
+ "preview": "node src/preview.js"
509
518
  },
510
519
  "dependencies": {
511
520
  "frontend-hamroun": "latest"
512
521
  },
513
522
  "devDependencies": {
514
523
  "@types/node": "^20.10.0",
515
- "typescript": "^5.3.2",
516
- "vite": "^5.0.0",
517
- "vite-plugin-node-polyfills": "^0.21.0"
524
+ "typescript": "^5.3.2"
518
525
  }
519
526
  };
520
527
 
@@ -668,27 +675,31 @@ export function App(props) {
668
675
  }`
669
676
  );
670
677
 
671
- // Create vite.config.ts
678
+ // Create build.js
672
679
  fs.writeFileSync(
673
- path.join(templateDir, 'vite.config.ts'),
674
- `import { defineConfig } from 'vite';
675
- import { nodePolyfills } from 'vite-plugin-node-polyfills';
676
-
677
- export default defineConfig({
678
- build: {
679
- outDir: 'dist',
680
- emptyOutDir: true
681
- },
682
- server: {
683
- port: 3000,
684
- open: true
685
- },
686
- plugins: [
687
- nodePolyfills({
688
- protocolImports: true,
689
- }),
690
- ]
691
- });`
680
+ path.join(srcDir, 'build.js'),
681
+ `import { execSync } from 'child_process';
682
+
683
+ console.log('Building the app...');
684
+ try {
685
+ execSync('tsc', { stdio: 'inherit' });
686
+ console.log('Build completed successfully.');
687
+ } catch (error) {
688
+ console.error('Build failed:', error);
689
+ }`
690
+ );
691
+
692
+ // Create preview.js
693
+ fs.writeFileSync(
694
+ path.join(srcDir, 'preview.js'),
695
+ `import { execSync } from 'child_process';
696
+
697
+ console.log('Starting preview server...');
698
+ try {
699
+ execSync('node dist/server.js', { stdio: 'inherit' });
700
+ } catch (error) {
701
+ console.error('Failed to start preview server:', error);
702
+ }`
692
703
  );
693
704
 
694
705
  // Create tsconfig.json
@@ -727,7 +738,7 @@ export default defineConfig({
727
738
  "moduleResolution": "bundler",
728
739
  "allowSyntheticDefaultImports": true
729
740
  },
730
- "include": ["vite.config.ts"]
741
+ "include": ["src/build.js", "src/preview.js"]
731
742
  }`
732
743
  );
733
744
 
@@ -859,25 +870,22 @@ export default {
859
870
  function createPureTemplate(templateDir) {
860
871
  console.log(`📝 Creating pure JS template at ${templateDir}`);
861
872
 
862
- // Create package.json without React dependencies
873
+ // Create package.json without TypeScript, React or any unnecessary dependencies
863
874
  const packageJson = {
864
875
  "name": "frontend-hamroun-app",
865
876
  "private": true,
866
877
  "version": "0.1.0",
867
878
  "type": "module",
868
879
  "scripts": {
869
- "dev": "vite",
870
- "build": "tsc && vite build",
871
- "preview": "vite preview"
880
+ "dev": "node src/server.js",
881
+ "build": "node src/build.js",
882
+ "preview": "node src/preview.js"
872
883
  },
873
884
  "dependencies": {
874
885
  "frontend-hamroun": "latest"
875
886
  },
876
887
  "devDependencies": {
877
- "@types/node": "^20.10.0",
878
- "typescript": "^5.3.2",
879
- "vite": "^5.0.0",
880
- "vite-plugin-node-polyfills": "^0.21.0"
888
+ "typescript": "^5.3.2"
881
889
  }
882
890
  };
883
891
 
@@ -1033,27 +1041,18 @@ export function App() {
1033
1041
  }`
1034
1042
  );
1035
1043
 
1036
- // Create vite.config.js - No TypeScript, no JSX
1044
+ // Create build.js - No TypeScript, no JSX
1037
1045
  fs.writeFileSync(
1038
- path.join(templateDir, 'vite.config.js'),
1039
- `import { defineConfig } from 'vite';
1040
- import { nodePolyfills } from 'vite-plugin-node-polyfills';
1041
-
1042
- export default defineConfig({
1043
- build: {
1044
- outDir: 'dist',
1045
- emptyOutDir: true
1046
- },
1047
- server: {
1048
- port: 3000,
1049
- open: true
1050
- },
1051
- plugins: [
1052
- nodePolyfills({
1053
- protocolImports: true,
1054
- }),
1055
- ]
1056
- });`
1046
+ path.join(templateDir, 'src/build.js'),
1047
+ `import { execSync } from 'child_process';
1048
+
1049
+ console.log('Building the app...');
1050
+ try {
1051
+ execSync('node src/build.js', { stdio: 'inherit' });
1052
+ console.log('Build completed successfully.');
1053
+ } catch (error) {
1054
+ console.error('Build failed:', error);
1055
+ }`
1057
1056
  );
1058
1057
 
1059
1058
  // Create jsconfig.json instead of tsconfig.json
@@ -1078,7 +1077,90 @@ export default defineConfig({
1078
1077
  console.log(`✅ Created pure JS template at ${templateDir}`);
1079
1078
  }
1080
1079
 
1081
- // Update the main CLI function to create only pure JS templates
1080
+ // Add a function for full-stack template
1081
+ function createFullStackTemplate(templateDir) {
1082
+ // Create the base template first
1083
+ createPureTemplate(templateDir);
1084
+
1085
+ // Update package.json with backend dependencies
1086
+ const packageJsonPath = path.join(templateDir, 'package.json');
1087
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
1088
+
1089
+ // Add backend dependencies
1090
+ packageJson.dependencies = {
1091
+ ...packageJson.dependencies,
1092
+ "express": "^4.18.2",
1093
+ "compression": "^1.7.4",
1094
+ "helmet": "^7.1.0",
1095
+ "morgan": "^1.10.0"
1096
+ };
1097
+
1098
+ // Add backend scripts
1099
+ packageJson.scripts = {
1100
+ ...packageJson.scripts,
1101
+ "start": "node dist/server.js",
1102
+ "dev:server": "node --experimental-specifier-resolution=node src/server.js",
1103
+ "dev:full": "concurrently \"npm run dev\" \"npm run dev:server\""
1104
+ };
1105
+
1106
+ // Add development dependencies for backend
1107
+ packageJson.devDependencies = {
1108
+ ...packageJson.devDependencies,
1109
+ "concurrently": "^8.2.2"
1110
+ };
1111
+
1112
+ fs.writeFileSync(
1113
+ packageJsonPath,
1114
+ JSON.stringify(packageJson, null, 2)
1115
+ );
1116
+
1117
+ // Create server file
1118
+ const srcDir = path.join(templateDir, 'src');
1119
+ fs.writeFileSync(
1120
+ path.join(srcDir, 'server.js'),
1121
+ `import express from 'express';
1122
+ import { fileURLToPath } from 'url';
1123
+ import { dirname, join } from 'path';
1124
+ import compression from 'compression';
1125
+ import morgan from 'morgan';
1126
+
1127
+ const __filename = fileURLToPath(import.meta.url);
1128
+ const __dirname = dirname(__filename);
1129
+
1130
+ // Create the Express app
1131
+ const app = express();
1132
+ const PORT = process.env.PORT || 3001;
1133
+
1134
+ // Apply middleware
1135
+ app.use(compression());
1136
+ app.use(morgan('dev'));
1137
+ app.use(express.json());
1138
+
1139
+ // Serve static files in production
1140
+ if (process.env.NODE_ENV === 'production') {
1141
+ const distPath = join(__dirname, '..');
1142
+ app.use(express.static(distPath));
1143
+ }
1144
+
1145
+ // API routes
1146
+ app.get('/api/hello', (req, res) => {
1147
+ res.json({
1148
+ message: 'Hello from Frontend Hamroun API!',
1149
+ timestamp: new Date().toISOString()
1150
+ });
1151
+ });
1152
+
1153
+ // Start the server
1154
+ app.listen(PORT, () => {
1155
+ console.log(\`Server running on port \${PORT}\`);
1156
+ });
1157
+ `
1158
+ );
1159
+
1160
+ console.log(`✅ Created full-stack template with server at ${templateDir}`);
1161
+ }
1162
+
1163
+ // Update how templates are checked and created
1082
1164
  console.log('🔍 Checking template directories...');
1083
1165
  for (const template of templateList) {
1084
1166
  const templateDir = path.join(templatesDir, template);
@@ -1088,20 +1170,30 @@ for (const template of templateList) {
1088
1170
  console.log(`📁 Creating template directory: ${template}`);
1089
1171
  fs.mkdirSync(templateDir, { recursive: true });
1090
1172
 
1091
- // Create a pure JS template (no React, no JSX)
1092
- createPureTemplate(templateDir);
1173
+ // Create appropriate template based on type
1174
+ if (template === 'full-stack') {
1175
+ createFullStackTemplate(templateDir);
1176
+ } else {
1177
+ createPureTemplate(templateDir);
1178
+ }
1093
1179
  } else {
1094
1180
  console.log(`✅ Template found: ${template}`);
1095
1181
 
1096
- // Update existing template to use pure JS
1097
- const mainFile = path.join(templateDir, 'src/main.js');
1098
- if (!fs.existsSync(mainFile)) {
1099
- console.log(`⚠️ Updating template ${template} to use pure JS`);
1100
- // Create a pure JS template in this location
1101
- createPureTemplate(templateDir);
1182
+ // Update package.json in existing templates
1183
+ const packageJsonPath = path.join(templateDir, 'package.json');
1184
+ if (fs.existsSync(packageJsonPath)) {
1185
+ try {
1186
+ console.log(`📦 Updating package.json in ${template}`);
1187
+ if (template === 'full-stack') {
1188
+ createFullStackTemplate(templateDir);
1189
+ } else {
1190
+ createPureTemplate(templateDir);
1191
+ }
1192
+ } catch (error) {
1193
+ console.error(`❌ Failed to update package.json in ${template}: ${error.message}`);
1194
+ }
1102
1195
  }
1103
1196
  }
1104
1197
  }
1105
1198
 
1106
- // Call this function when creating templates
1107
- // ...existing code...
1199
+ console.log('✅ CLI build process completed');
@@ -5,16 +5,14 @@
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "dev": "vite",
8
- "build": "tsc && vite build",
8
+ "build": "vite build",
9
9
  "preview": "vite preview"
10
10
  },
11
11
  "dependencies": {
12
12
  "frontend-hamroun": "latest"
13
13
  },
14
14
  "devDependencies": {
15
- "@types/node": "^20.10.0",
16
- "typescript": "^5.3.2",
17
- "vite": "^5.0.0",
18
- "vite-plugin-node-polyfills": "^0.21.0"
15
+ "vite": "^5.0.10",
16
+ "vite-plugin-node-polyfills": "^0.23.0"
19
17
  }
20
18
  }
@@ -10,9 +10,6 @@
10
10
  "resolveJsonModule": true,
11
11
  "isolatedModules": true,
12
12
  "noEmit": true,
13
- "jsx": "react-jsx",
14
- "jsxFactory": "jsx",
15
- "jsxFragmentFactory": "Fragment",
16
13
  "strict": true,
17
14
  "noUnusedLocals": true,
18
15
  "noUnusedParameters": true,
@@ -1,12 +1,12 @@
1
1
  <!DOCTYPE html>
2
2
  <html lang="en">
3
3
  <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>My Frontend App</title>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Frontend Hamroun App</title>
7
7
  </head>
8
- <body class="bg-gray-100 min-h-screen">
9
- <div id="root"></div>
10
- <script type="module" src="/src/main.tsx"></script>
8
+ <body>
9
+ <div id="app"></div>
10
+ <script type="module" src="/src/main.js"></script>
11
11
  </body>
12
12
  </html>
@@ -4,21 +4,14 @@
4
4
  "version": "0.1.0",
5
5
  "type": "module",
6
6
  "scripts": {
7
- "dev": "vite",
8
- "build": "tsc && vite build",
9
- "preview": "vite preview"
7
+ "dev": "node src/server.js",
8
+ "build": "tsc",
9
+ "start": "node dist/server.js"
10
10
  },
11
11
  "dependencies": {
12
- "frontend-hamroun": "latest"
12
+ "express": "^4.18.2"
13
13
  },
14
14
  "devDependencies": {
15
- "@types/node": "^20.10.0",
16
- "typescript": "^5.3.2",
17
- "vite": "^5.0.0",
18
- "vite-plugin-node-polyfills": "^0.21.0"
19
- },
20
- "overrides": {
21
- "react": "npm:@empty-npm-package/react@1.0.0",
22
- "react-dom": "npm:@empty-npm-package/react-dom@1.0.0"
15
+ "typescript": "^5.3.2"
23
16
  }
24
17
  }
@@ -0,0 +1,105 @@
1
+ import { useState, useRef } from 'frontend-hamroun';
2
+
3
+ export function App() {
4
+ const [count, setCount] = useState(0);
5
+ const renderCount = useRef(0);
6
+
7
+ renderCount.current++;
8
+
9
+ // Using plain JS objects instead of JSX
10
+ return {
11
+ type: 'div',
12
+ props: {
13
+ style: {
14
+ fontFamily: 'Arial, sans-serif',
15
+ maxWidth: '600px',
16
+ margin: '0 auto',
17
+ padding: '2rem'
18
+ },
19
+ children: [
20
+ {
21
+ type: 'h1',
22
+ props: {
23
+ style: { textAlign: 'center' },
24
+ children: 'Frontend Hamroun App'
25
+ }
26
+ },
27
+ {
28
+ type: 'p',
29
+ props: {
30
+ style: { textAlign: 'center' },
31
+ children: `Render count: ${renderCount.current}`
32
+ }
33
+ },
34
+ {
35
+ type: 'div',
36
+ props: {
37
+ style: {
38
+ display: 'flex',
39
+ flexDirection: 'column',
40
+ alignItems: 'center',
41
+ padding: '1rem',
42
+ border: '1px solid #ccc',
43
+ borderRadius: '8px'
44
+ },
45
+ children: [
46
+ {
47
+ type: 'h2',
48
+ props: {
49
+ children: 'Counter Example'
50
+ }
51
+ },
52
+ {
53
+ type: 'p',
54
+ props: {
55
+ children: `Count: ${count}`
56
+ }
57
+ },
58
+ {
59
+ type: 'div',
60
+ props: {
61
+ style: {
62
+ display: 'flex',
63
+ gap: '8px'
64
+ },
65
+ children: [
66
+ {
67
+ type: 'button',
68
+ props: {
69
+ onClick: () => setCount(count - 1),
70
+ style: {
71
+ padding: '8px 16px',
72
+ backgroundColor: '#ff4d4d',
73
+ color: 'white',
74
+ border: 'none',
75
+ borderRadius: '4px',
76
+ cursor: 'pointer'
77
+ },
78
+ children: 'Decrement'
79
+ }
80
+ },
81
+ {
82
+ type: 'button',
83
+ props: {
84
+ onClick: () => setCount(count + 1),
85
+ style: {
86
+ padding: '8px 16px',
87
+ backgroundColor: '#4d79ff',
88
+ color: 'white',
89
+ border: 'none',
90
+ borderRadius: '4px',
91
+ cursor: 'pointer'
92
+ },
93
+ children: 'Increment'
94
+ }
95
+ }
96
+ ]
97
+ }
98
+ }
99
+ ]
100
+ }
101
+ }
102
+ ]
103
+ }
104
+ };
105
+ }
@@ -0,0 +1,10 @@
1
+ import { render } from 'frontend-hamroun';
2
+ import { App } from './App.js';
3
+
4
+ document.addEventListener('DOMContentLoaded', () => {
5
+ const rootElement = document.getElementById('app');
6
+ if (rootElement) {
7
+ render(App(), rootElement);
8
+ console.log('App rendered successfully');
9
+ }
10
+ });
@@ -0,0 +1,22 @@
1
+ import { defineConfig } from 'vite';
2
+ import { nodePolyfills } from 'vite-plugin-node-polyfills';
3
+
4
+ export default defineConfig({
5
+ // No JSX-specific configuration
6
+ build: {
7
+ outDir: 'dist',
8
+ emptyOutDir: true
9
+ },
10
+ server: {
11
+ port: 3000,
12
+ open: true
13
+ },
14
+ optimizeDeps: {
15
+ include: ['frontend-hamroun']
16
+ },
17
+ plugins: [
18
+ nodePolyfills({
19
+ protocolImports: true,
20
+ }),
21
+ ]
22
+ });
@@ -4,17 +4,18 @@
4
4
  "version": "0.1.0",
5
5
  "type": "module",
6
6
  "scripts": {
7
- "dev": "vite",
8
- "build": "tsc && vite build",
9
- "preview": "vite preview"
7
+ "dev": "node src/server.js",
8
+ "build": "tsc",
9
+ "start": "node dist/server.js"
10
10
  },
11
11
  "dependencies": {
12
- "frontend-hamroun": "latest"
12
+ "express": "^4.18.2",
13
+ "compression": "^1.7.4",
14
+ "helmet": "^7.1.0",
15
+ "morgan": "^1.10.0"
13
16
  },
14
17
  "devDependencies": {
15
18
  "@types/node": "^20.10.0",
16
- "typescript": "^5.3.2",
17
- "vite": "^5.0.0",
18
- "vite-plugin-node-polyfills": "^0.21.0"
19
+ "typescript": "^5.3.2"
19
20
  }
20
21
  }
@@ -10,9 +10,6 @@
10
10
  "resolveJsonModule": true,
11
11
  "isolatedModules": true,
12
12
  "noEmit": true,
13
- "jsx": "react-jsx",
14
- "jsxFactory": "jsx",
15
- "jsxFragmentFactory": "Fragment",
16
13
  "strict": true,
17
14
  "noUnusedLocals": true,
18
15
  "noUnusedParameters": true,