bertui 0.1.5 → 0.1.7
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/LICENSE +20 -20
- package/bin/bertui.js +7 -7
- package/index.js +35 -35
- package/package.json +5 -4
- package/src/build/css-builder.js +83 -83
- package/src/build.js +122 -122
- package/src/cli.js +65 -65
- package/src/client/compiler.js +227 -90
- package/src/config/defaultConfig.js +15 -15
- package/src/config/loadConfig.js +32 -32
- package/src/dev.js +22 -22
- package/src/logger/logger.js +17 -17
- package/src/logger/notes.md +19 -19
- package/src/router/Router.js +129 -0
- package/src/server/dev-server.js +279 -198
- package/src/styles/bertui.css +209 -209
- package/src/router/router.js +0 -216
package/src/cli.js
CHANGED
|
@@ -1,66 +1,66 @@
|
|
|
1
|
-
// src/cli.js
|
|
2
|
-
import { startDev } from './dev.js';
|
|
3
|
-
import { buildProduction } from './build.js';
|
|
4
|
-
import logger from './logger/logger.js';
|
|
5
|
-
|
|
6
|
-
export function program() {
|
|
7
|
-
const args = process.argv.slice(2);
|
|
8
|
-
const command = args[0] || 'dev';
|
|
9
|
-
|
|
10
|
-
switch (command) {
|
|
11
|
-
case 'dev':
|
|
12
|
-
const devPort = getArg('--port', '-p') || 3000;
|
|
13
|
-
startDev({
|
|
14
|
-
port: parseInt(devPort),
|
|
15
|
-
root: process.cwd()
|
|
16
|
-
});
|
|
17
|
-
break;
|
|
18
|
-
|
|
19
|
-
case 'build':
|
|
20
|
-
buildProduction({
|
|
21
|
-
root: process.cwd()
|
|
22
|
-
});
|
|
23
|
-
break;
|
|
24
|
-
|
|
25
|
-
case '--version':
|
|
26
|
-
case '-v':
|
|
27
|
-
console.log('bertui v0.1.0');
|
|
28
|
-
break;
|
|
29
|
-
|
|
30
|
-
case '--help':
|
|
31
|
-
case '-h':
|
|
32
|
-
showHelp();
|
|
33
|
-
break;
|
|
34
|
-
|
|
35
|
-
default:
|
|
36
|
-
logger.error(`Unknown command: ${command}`);
|
|
37
|
-
showHelp();
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
function getArg(longForm, shortForm) {
|
|
42
|
-
const args = process.argv.slice(2);
|
|
43
|
-
const longIndex = args.indexOf(longForm);
|
|
44
|
-
const shortIndex = args.indexOf(shortForm);
|
|
45
|
-
const index = longIndex !== -1 ? longIndex : shortIndex;
|
|
46
|
-
return index !== -1 && args[index + 1] ? args[index + 1] : null;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
function showHelp() {
|
|
50
|
-
logger.bigLog('BERTUI CLI', { color: 'blue' });
|
|
51
|
-
console.log(`
|
|
52
|
-
Commands:
|
|
53
|
-
bertui dev Start development server
|
|
54
|
-
bertui build Build for production
|
|
55
|
-
bertui --version Show version
|
|
56
|
-
bertui --help Show help
|
|
57
|
-
|
|
58
|
-
Options:
|
|
59
|
-
--port, -p <number> Port for dev server (default: 3000)
|
|
60
|
-
|
|
61
|
-
Examples:
|
|
62
|
-
bertui dev
|
|
63
|
-
bertui dev --port 8080
|
|
64
|
-
bertui build
|
|
65
|
-
`);
|
|
1
|
+
// src/cli.js
|
|
2
|
+
import { startDev } from './dev.js';
|
|
3
|
+
import { buildProduction } from './build.js';
|
|
4
|
+
import logger from './logger/logger.js';
|
|
5
|
+
|
|
6
|
+
export function program() {
|
|
7
|
+
const args = process.argv.slice(2);
|
|
8
|
+
const command = args[0] || 'dev';
|
|
9
|
+
|
|
10
|
+
switch (command) {
|
|
11
|
+
case 'dev':
|
|
12
|
+
const devPort = getArg('--port', '-p') || 3000;
|
|
13
|
+
startDev({
|
|
14
|
+
port: parseInt(devPort),
|
|
15
|
+
root: process.cwd()
|
|
16
|
+
});
|
|
17
|
+
break;
|
|
18
|
+
|
|
19
|
+
case 'build':
|
|
20
|
+
buildProduction({
|
|
21
|
+
root: process.cwd()
|
|
22
|
+
});
|
|
23
|
+
break;
|
|
24
|
+
|
|
25
|
+
case '--version':
|
|
26
|
+
case '-v':
|
|
27
|
+
console.log('bertui v0.1.0');
|
|
28
|
+
break;
|
|
29
|
+
|
|
30
|
+
case '--help':
|
|
31
|
+
case '-h':
|
|
32
|
+
showHelp();
|
|
33
|
+
break;
|
|
34
|
+
|
|
35
|
+
default:
|
|
36
|
+
logger.error(`Unknown command: ${command}`);
|
|
37
|
+
showHelp();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function getArg(longForm, shortForm) {
|
|
42
|
+
const args = process.argv.slice(2);
|
|
43
|
+
const longIndex = args.indexOf(longForm);
|
|
44
|
+
const shortIndex = args.indexOf(shortForm);
|
|
45
|
+
const index = longIndex !== -1 ? longIndex : shortIndex;
|
|
46
|
+
return index !== -1 && args[index + 1] ? args[index + 1] : null;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function showHelp() {
|
|
50
|
+
logger.bigLog('BERTUI CLI', { color: 'blue' });
|
|
51
|
+
console.log(`
|
|
52
|
+
Commands:
|
|
53
|
+
bertui dev Start development server
|
|
54
|
+
bertui build Build for production
|
|
55
|
+
bertui --version Show version
|
|
56
|
+
bertui --help Show help
|
|
57
|
+
|
|
58
|
+
Options:
|
|
59
|
+
--port, -p <number> Port for dev server (default: 3000)
|
|
60
|
+
|
|
61
|
+
Examples:
|
|
62
|
+
bertui dev
|
|
63
|
+
bertui dev --port 8080
|
|
64
|
+
bertui build
|
|
65
|
+
`);
|
|
66
66
|
}
|
package/src/client/compiler.js
CHANGED
|
@@ -1,91 +1,228 @@
|
|
|
1
|
-
// src/client/compiler.js
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import logger from '../logger/logger.js';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
routes
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
if (
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
1
|
+
// src/client/compiler.js
|
|
2
|
+
import { existsSync, mkdirSync, readdirSync, statSync } from 'fs';
|
|
3
|
+
import { join, extname, relative } from 'path';
|
|
4
|
+
import logger from '../logger/logger.js';
|
|
5
|
+
|
|
6
|
+
export async function compileProject(root) {
|
|
7
|
+
logger.bigLog('COMPILING PROJECT', { color: 'blue' });
|
|
8
|
+
|
|
9
|
+
const srcDir = join(root, 'src');
|
|
10
|
+
const pagesDir = join(srcDir, 'pages');
|
|
11
|
+
const outDir = join(root, '.bertui', 'compiled');
|
|
12
|
+
|
|
13
|
+
if (!existsSync(srcDir)) {
|
|
14
|
+
logger.error('src/ directory not found!');
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if (!existsSync(outDir)) {
|
|
19
|
+
mkdirSync(outDir, { recursive: true });
|
|
20
|
+
logger.info('Created .bertui/compiled/');
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
let routes = [];
|
|
24
|
+
if (existsSync(pagesDir)) {
|
|
25
|
+
routes = await discoverRoutes(pagesDir);
|
|
26
|
+
logger.info(`Discovered ${routes.length} routes`);
|
|
27
|
+
|
|
28
|
+
if (routes.length > 0) {
|
|
29
|
+
logger.bigLog('ROUTES DISCOVERED', { color: 'blue' });
|
|
30
|
+
logger.table(routes.map((r, i) => ({
|
|
31
|
+
'': i,
|
|
32
|
+
route: r.route,
|
|
33
|
+
file: r.file,
|
|
34
|
+
type: r.type
|
|
35
|
+
})));
|
|
36
|
+
|
|
37
|
+
await generateRouter(routes, outDir, root);
|
|
38
|
+
logger.info('Generated router.js');
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const startTime = Date.now();
|
|
43
|
+
const stats = await compileDirectory(srcDir, outDir, root);
|
|
44
|
+
const duration = Date.now() - startTime;
|
|
45
|
+
|
|
46
|
+
logger.success(`Compiled ${stats.files} files in ${duration}ms`);
|
|
47
|
+
logger.info(`Output: ${outDir}`);
|
|
48
|
+
|
|
49
|
+
return { outDir, stats, routes };
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async function discoverRoutes(pagesDir) {
|
|
53
|
+
const routes = [];
|
|
54
|
+
|
|
55
|
+
async function scanDirectory(dir, basePath = '') {
|
|
56
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
57
|
+
|
|
58
|
+
for (const entry of entries) {
|
|
59
|
+
const fullPath = join(dir, entry.name);
|
|
60
|
+
const relativePath = join(basePath, entry.name);
|
|
61
|
+
|
|
62
|
+
if (entry.isDirectory()) {
|
|
63
|
+
await scanDirectory(fullPath, relativePath);
|
|
64
|
+
} else if (entry.isFile()) {
|
|
65
|
+
const ext = extname(entry.name);
|
|
66
|
+
if (['.jsx', '.tsx', '.js', '.ts'].includes(ext)) {
|
|
67
|
+
const fileName = entry.name.replace(ext, '');
|
|
68
|
+
|
|
69
|
+
let route = '/' + relativePath.replace(/\\/g, '/').replace(ext, '');
|
|
70
|
+
|
|
71
|
+
if (fileName === 'index') {
|
|
72
|
+
route = route.replace('/index', '') || '/';
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const isDynamic = fileName.includes('[') && fileName.includes(']');
|
|
76
|
+
const type = isDynamic ? 'dynamic' : 'static';
|
|
77
|
+
|
|
78
|
+
routes.push({
|
|
79
|
+
route: route === '' ? '/' : route,
|
|
80
|
+
file: relativePath,
|
|
81
|
+
path: fullPath,
|
|
82
|
+
type
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
await scanDirectory(pagesDir);
|
|
90
|
+
|
|
91
|
+
routes.sort((a, b) => {
|
|
92
|
+
if (a.type === b.type) {
|
|
93
|
+
return a.route.localeCompare(b.route);
|
|
94
|
+
}
|
|
95
|
+
return a.type === 'static' ? -1 : 1;
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
return routes;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
async function generateRouter(routes, outDir, root) {
|
|
102
|
+
const imports = routes.map((route, i) => {
|
|
103
|
+
const componentName = `Page${i}`;
|
|
104
|
+
const importPath = `./pages/${route.file.replace(/\\/g, '/')}`;
|
|
105
|
+
return `import ${componentName} from '${importPath}';`;
|
|
106
|
+
}).join('\n');
|
|
107
|
+
|
|
108
|
+
const routeConfigs = routes.map((route, i) => {
|
|
109
|
+
const componentName = `Page${i}`;
|
|
110
|
+
return ` { path: '${route.route}', component: ${componentName}, type: '${route.type}' }`;
|
|
111
|
+
}).join(',\n');
|
|
112
|
+
|
|
113
|
+
const routerCode = `// Auto-generated router - DO NOT EDIT
|
|
114
|
+
${imports}
|
|
115
|
+
|
|
116
|
+
export const routes = [
|
|
117
|
+
${routeConfigs}
|
|
118
|
+
];
|
|
119
|
+
|
|
120
|
+
export function matchRoute(pathname) {
|
|
121
|
+
for (const route of routes) {
|
|
122
|
+
if (route.type === 'static' && route.path === pathname) {
|
|
123
|
+
return route;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
for (const route of routes) {
|
|
128
|
+
if (route.type === 'dynamic') {
|
|
129
|
+
const pattern = route.path.replace(/\\[([^\\]]+)\\]/g, '([^/]+)');
|
|
130
|
+
const regex = new RegExp('^' + pattern + '$');
|
|
131
|
+
const match = pathname.match(regex);
|
|
132
|
+
|
|
133
|
+
if (match) {
|
|
134
|
+
const paramNames = [...route.path.matchAll(/\\[([^\\]]+)\\]/g)].map(m => m[1]);
|
|
135
|
+
const params = {};
|
|
136
|
+
paramNames.forEach((name, i) => {
|
|
137
|
+
params[name] = match[i + 1];
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
return { ...route, params };
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
`;
|
|
148
|
+
|
|
149
|
+
const routerPath = join(outDir, 'router.js');
|
|
150
|
+
await Bun.write(routerPath, routerCode);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
async function compileDirectory(srcDir, outDir, root) {
|
|
154
|
+
const stats = { files: 0, skipped: 0 };
|
|
155
|
+
|
|
156
|
+
const files = readdirSync(srcDir);
|
|
157
|
+
|
|
158
|
+
for (const file of files) {
|
|
159
|
+
const srcPath = join(srcDir, file);
|
|
160
|
+
const stat = statSync(srcPath);
|
|
161
|
+
|
|
162
|
+
if (stat.isDirectory()) {
|
|
163
|
+
const subOutDir = join(outDir, file);
|
|
164
|
+
mkdirSync(subOutDir, { recursive: true });
|
|
165
|
+
const subStats = await compileDirectory(srcPath, subOutDir, root);
|
|
166
|
+
stats.files += subStats.files;
|
|
167
|
+
stats.skipped += subStats.skipped;
|
|
168
|
+
} else {
|
|
169
|
+
const ext = extname(file);
|
|
170
|
+
const relativePath = relative(join(root, 'src'), srcPath);
|
|
171
|
+
|
|
172
|
+
if (['.jsx', '.tsx', '.ts'].includes(ext)) {
|
|
173
|
+
await compileFile(srcPath, outDir, file, relativePath);
|
|
174
|
+
stats.files++;
|
|
175
|
+
} else if (ext === '.js' || ext === '.css') {
|
|
176
|
+
const outPath = join(outDir, file);
|
|
177
|
+
await Bun.write(outPath, Bun.file(srcPath));
|
|
178
|
+
logger.debug(`Copied: ${relativePath}`);
|
|
179
|
+
stats.files++;
|
|
180
|
+
} else {
|
|
181
|
+
logger.debug(`Skipped: ${relativePath}`);
|
|
182
|
+
stats.skipped++;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
return stats;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
async function compileFile(srcPath, outDir, filename, relativePath) {
|
|
191
|
+
const ext = extname(filename);
|
|
192
|
+
const loader = ext === '.tsx' ? 'tsx' : ext === '.ts' ? 'ts' : 'jsx';
|
|
193
|
+
|
|
194
|
+
try {
|
|
195
|
+
const transpiler = new Bun.Transpiler({ loader });
|
|
196
|
+
let code = await Bun.file(srcPath).text();
|
|
197
|
+
|
|
198
|
+
// CRITICAL FIX: Resolve bare module specifiers
|
|
199
|
+
code = resolveBareImports(code);
|
|
200
|
+
|
|
201
|
+
const compiled = await transpiler.transform(code);
|
|
202
|
+
|
|
203
|
+
const outFilename = filename.replace(/\.(jsx|tsx|ts)$/, '.js');
|
|
204
|
+
const outPath = join(outDir, outFilename);
|
|
205
|
+
|
|
206
|
+
await Bun.write(outPath, compiled);
|
|
207
|
+
logger.debug(`Compiled: ${relativePath} → ${outFilename}`);
|
|
208
|
+
} catch (error) {
|
|
209
|
+
logger.error(`Failed to compile ${relativePath}: ${error.message}`);
|
|
210
|
+
throw error;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function resolveBareImports(code) {
|
|
215
|
+
// Replace bertui/styles with actual CSS path
|
|
216
|
+
code = code.replace(
|
|
217
|
+
/import\s+['"]bertui\/styles['"]/g,
|
|
218
|
+
"import '/styles/bertui.css'"
|
|
219
|
+
);
|
|
220
|
+
|
|
221
|
+
// Replace bertui/router with actual router path
|
|
222
|
+
code = code.replace(
|
|
223
|
+
/from\s+['"]bertui\/router['"]/g,
|
|
224
|
+
"from '/compiled/router.js'"
|
|
225
|
+
);
|
|
226
|
+
|
|
227
|
+
return code;
|
|
91
228
|
}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
export const defaultConfig = {
|
|
2
|
-
meta: {
|
|
3
|
-
title: "BertUI App",
|
|
4
|
-
description: "Built with BertUI - Lightning fast React development",
|
|
5
|
-
keywords: "react, bun, bertui",
|
|
6
|
-
author: "Pease Ernest",
|
|
7
|
-
ogImage: "/og-image.png",
|
|
8
|
-
themeColor: "#f30606ff",
|
|
9
|
-
lang: "en"
|
|
10
|
-
},
|
|
11
|
-
appShell: {
|
|
12
|
-
loading: true,
|
|
13
|
-
loadingText: "Loading...",
|
|
14
|
-
backgroundColor: "#ffffff"
|
|
15
|
-
}
|
|
1
|
+
export const defaultConfig = {
|
|
2
|
+
meta: {
|
|
3
|
+
title: "BertUI App",
|
|
4
|
+
description: "Built with BertUI - Lightning fast React development",
|
|
5
|
+
keywords: "react, bun, bertui",
|
|
6
|
+
author: "Pease Ernest",
|
|
7
|
+
ogImage: "/og-image.png",
|
|
8
|
+
themeColor: "#f30606ff",
|
|
9
|
+
lang: "en"
|
|
10
|
+
},
|
|
11
|
+
appShell: {
|
|
12
|
+
loading: true,
|
|
13
|
+
loadingText: "Loading...",
|
|
14
|
+
backgroundColor: "#ffffff"
|
|
15
|
+
}
|
|
16
16
|
};
|
package/src/config/loadConfig.js
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
// src/config/loadConfig.js
|
|
2
|
-
import { join } from 'path';
|
|
3
|
-
import { existsSync } from 'fs';
|
|
4
|
-
import { defaultConfig } from './defaultConfig.js';
|
|
5
|
-
import logger from '../logger/logger.js';
|
|
6
|
-
|
|
7
|
-
export async function loadConfig(root) {
|
|
8
|
-
const configPath = join(root, 'bertui.config.js');
|
|
9
|
-
|
|
10
|
-
// Check if user created config
|
|
11
|
-
if (existsSync(configPath)) {
|
|
12
|
-
try {
|
|
13
|
-
const userConfig = await import(configPath);
|
|
14
|
-
logger.success('Loaded bertui.config.js');
|
|
15
|
-
|
|
16
|
-
// Merge user config with defaults
|
|
17
|
-
return mergeConfig(defaultConfig, userConfig.default || userConfig);
|
|
18
|
-
} catch (error) {
|
|
19
|
-
logger.error(`Failed to load config. Make sure bertui.config.js is in the root directory: ${error.message}`);
|
|
20
|
-
return defaultConfig;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
logger.info('No config found, using defaults');
|
|
25
|
-
return defaultConfig;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
function mergeConfig(defaults, user) {
|
|
29
|
-
return {
|
|
30
|
-
meta: { ...defaults.meta, ...(user.meta || {}) },
|
|
31
|
-
appShell: { ...defaults.appShell, ...(user.appShell || {}) }
|
|
32
|
-
};
|
|
1
|
+
// src/config/loadConfig.js
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { existsSync } from 'fs';
|
|
4
|
+
import { defaultConfig } from './defaultConfig.js';
|
|
5
|
+
import logger from '../logger/logger.js';
|
|
6
|
+
|
|
7
|
+
export async function loadConfig(root) {
|
|
8
|
+
const configPath = join(root, 'bertui.config.js');
|
|
9
|
+
|
|
10
|
+
// Check if user created config
|
|
11
|
+
if (existsSync(configPath)) {
|
|
12
|
+
try {
|
|
13
|
+
const userConfig = await import(configPath);
|
|
14
|
+
logger.success('Loaded bertui.config.js');
|
|
15
|
+
|
|
16
|
+
// Merge user config with defaults
|
|
17
|
+
return mergeConfig(defaultConfig, userConfig.default || userConfig);
|
|
18
|
+
} catch (error) {
|
|
19
|
+
logger.error(`Failed to load config. Make sure bertui.config.js is in the root directory: ${error.message}`);
|
|
20
|
+
return defaultConfig;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
logger.info('No config found, using defaults');
|
|
25
|
+
return defaultConfig;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function mergeConfig(defaults, user) {
|
|
29
|
+
return {
|
|
30
|
+
meta: { ...defaults.meta, ...(user.meta || {}) },
|
|
31
|
+
appShell: { ...defaults.appShell, ...(user.appShell || {}) }
|
|
32
|
+
};
|
|
33
33
|
}
|
package/src/dev.js
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
// src/dev.js
|
|
2
|
-
import { compileProject } from './client/compiler.js';
|
|
3
|
-
import { startDevServer } from './server/dev-server.js';
|
|
4
|
-
import logger from './logger/logger.js';
|
|
5
|
-
|
|
6
|
-
export async function startDev(options = {}) {
|
|
7
|
-
const root = options.root || process.cwd();
|
|
8
|
-
const port = options.port || 3000;
|
|
9
|
-
|
|
10
|
-
try {
|
|
11
|
-
// Step 1: Compile project
|
|
12
|
-
logger.info('Step 1: Compiling project...');
|
|
13
|
-
await compileProject(root);
|
|
14
|
-
|
|
15
|
-
// Step 2: Start dev server
|
|
16
|
-
logger.info('Step 2: Starting dev server...');
|
|
17
|
-
await startDevServer({ root, port });
|
|
18
|
-
|
|
19
|
-
} catch (error) {
|
|
20
|
-
logger.error(`Dev server failed: ${error.message}`);
|
|
21
|
-
process.exit(1);
|
|
22
|
-
}
|
|
1
|
+
// src/dev.js
|
|
2
|
+
import { compileProject } from './client/compiler.js';
|
|
3
|
+
import { startDevServer } from './server/dev-server.js';
|
|
4
|
+
import logger from './logger/logger.js';
|
|
5
|
+
|
|
6
|
+
export async function startDev(options = {}) {
|
|
7
|
+
const root = options.root || process.cwd();
|
|
8
|
+
const port = options.port || 3000;
|
|
9
|
+
|
|
10
|
+
try {
|
|
11
|
+
// Step 1: Compile project
|
|
12
|
+
logger.info('Step 1: Compiling project...');
|
|
13
|
+
await compileProject(root);
|
|
14
|
+
|
|
15
|
+
// Step 2: Start dev server
|
|
16
|
+
logger.info('Step 2: Starting dev server...');
|
|
17
|
+
await startDevServer({ root, port });
|
|
18
|
+
|
|
19
|
+
} catch (error) {
|
|
20
|
+
logger.error(`Dev server failed: ${error.message}`);
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
23
|
}
|
package/src/logger/logger.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
// src/utils/logger.js
|
|
2
|
-
import { createLogger } from 'ernest-logger';
|
|
3
|
-
|
|
4
|
-
// Create logger instance for BertUI
|
|
5
|
-
const logger = createLogger({
|
|
6
|
-
time: true,
|
|
7
|
-
emoji: true,
|
|
8
|
-
level: 'info',
|
|
9
|
-
prefix: '[BertUI]',
|
|
10
|
-
customLevels: {
|
|
11
|
-
server: { color: 'brightCyan', emoji: '🌐', priority: 2 },
|
|
12
|
-
build: { color: 'brightGreen', emoji: '📦', priority: 2 },
|
|
13
|
-
hmr: { color: 'brightYellow', emoji: '🔥', priority: 2 }
|
|
14
|
-
}
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
// Export the logger
|
|
1
|
+
// src/utils/logger.js
|
|
2
|
+
import { createLogger } from 'ernest-logger';
|
|
3
|
+
|
|
4
|
+
// Create logger instance for BertUI
|
|
5
|
+
const logger = createLogger({
|
|
6
|
+
time: true,
|
|
7
|
+
emoji: true,
|
|
8
|
+
level: 'info',
|
|
9
|
+
prefix: '[BertUI]',
|
|
10
|
+
customLevels: {
|
|
11
|
+
server: { color: 'brightCyan', emoji: '🌐', priority: 2 },
|
|
12
|
+
build: { color: 'brightGreen', emoji: '📦', priority: 2 },
|
|
13
|
+
hmr: { color: 'brightYellow', emoji: '🔥', priority: 2 }
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
// Export the logger
|
|
18
18
|
export default logger;
|
package/src/logger/notes.md
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
here we will use the ernest logger libraray instead of chalk because i want colourfull logs and not just normal b/w logs the whole module is exported for use in the libraray
|
|
2
|
-
it is a file that is complete and needs no updated later on
|
|
3
|
-
// src/utils/logger.js
|
|
4
|
-
import { createLogger } from 'ernest-logger';
|
|
5
|
-
|
|
6
|
-
// Create logger instance for BertUI
|
|
7
|
-
const logger = createLogger({
|
|
8
|
-
time: true,
|
|
9
|
-
emoji: true,
|
|
10
|
-
level: 'info',
|
|
11
|
-
prefix: '[BertUI]',
|
|
12
|
-
customLevels: {
|
|
13
|
-
server: { color: 'brightCyan', emoji: '🌐', priority: 2 },
|
|
14
|
-
build: { color: 'brightGreen', emoji: '📦', priority: 2 },
|
|
15
|
-
hmr: { color: 'brightYellow', emoji: '🔥', priority: 2 }
|
|
16
|
-
}
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
// Export the logger
|
|
1
|
+
here we will use the ernest logger libraray instead of chalk because i want colourfull logs and not just normal b/w logs the whole module is exported for use in the libraray
|
|
2
|
+
it is a file that is complete and needs no updated later on
|
|
3
|
+
// src/utils/logger.js
|
|
4
|
+
import { createLogger } from 'ernest-logger';
|
|
5
|
+
|
|
6
|
+
// Create logger instance for BertUI
|
|
7
|
+
const logger = createLogger({
|
|
8
|
+
time: true,
|
|
9
|
+
emoji: true,
|
|
10
|
+
level: 'info',
|
|
11
|
+
prefix: '[BertUI]',
|
|
12
|
+
customLevels: {
|
|
13
|
+
server: { color: 'brightCyan', emoji: '🌐', priority: 2 },
|
|
14
|
+
build: { color: 'brightGreen', emoji: '📦', priority: 2 },
|
|
15
|
+
hmr: { color: 'brightYellow', emoji: '🔥', priority: 2 }
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
// Export the logger
|
|
20
20
|
export default logger;
|