clovie 0.1.33 → 0.1.37
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/bin/cli.js +1 -2
- package/config/clovie.config.js +13 -0
- package/lib/createClovie.js +70 -0
- package/lib/examples/kernel-adapters.js +100 -0
- package/lib/examples/kernel-usage.js +177 -0
- package/lib/services/Compile.js +399 -0
- package/lib/services/Configurator.js +101 -0
- package/lib/services/File.js +276 -0
- package/lib/services/FileCache.js +94 -0
- package/lib/services/LiveReload.js +145 -0
- package/lib/services/Router.js +189 -0
- package/lib/services/Run.js +188 -0
- package/lib/types/kernel.js +120 -0
- package/lib/utils/clean.js +21 -0
- package/lib/utils/liveReloadScript.js +48 -0
- package/lib/utils/loadRenderEngine.js +135 -0
- package/lib/utils/outputPath.js +28 -0
- package/lib/utils/progress.js +108 -0
- package/lib/utils/routeMatch.js +98 -0
- package/lib/utils/tasks.js +57 -0
- package/lib/utils/transformConfig.js +318 -0
- package/package.json +9 -16
- package/dist/ExpressAdapter-D6owl_CX.js +0 -105
- package/dist/ExpressAdapter-D6owl_CX.js.map +0 -1
- package/dist/cjs/ExpressAdapter-Z_FtN3dq.cjs +0 -80
- package/dist/cjs/ExpressAdapter-Z_FtN3dq.cjs.map +0 -1
- package/dist/cjs/createClovie-BziskasS.cjs +0 -4260
- package/dist/cjs/createClovie-BziskasS.cjs.map +0 -1
- package/dist/cjs/index.cjs +0 -9
- package/dist/cjs/index.cjs.map +0 -1
- package/dist/createClovie-x0YNcttr.js +0 -4282
- package/dist/createClovie-x0YNcttr.js.map +0 -1
- package/dist/index.d.ts +0 -229
- package/dist/index.js +0 -34
- package/dist/index.js.map +0 -1
- package/scripts/build-types.js +0 -247
- package/scripts/killPort.js +0 -138
- package/scripts/publish.js +0 -180
package/bin/cli.js
CHANGED
|
@@ -13,8 +13,7 @@ const packageJson = JSON.parse(readFileSync(path.join(__dirname, '../package.jso
|
|
|
13
13
|
const CLOVIE_VERSION = packageJson.version;
|
|
14
14
|
|
|
15
15
|
// Local - import from compiled dist for published package
|
|
16
|
-
|
|
17
|
-
import { createClovie } from "../dist/index.js";
|
|
16
|
+
import { createClovie } from "../lib/createClovie.js";
|
|
18
17
|
import { killPort, checkPorts, killCommonPorts } from "../scripts/killPort.js";
|
|
19
18
|
|
|
20
19
|
// Check for kill command first (before any argument parsing)
|
package/config/clovie.config.js
CHANGED
|
@@ -32,6 +32,19 @@ export default {
|
|
|
32
32
|
watch: false,
|
|
33
33
|
port: 3000,
|
|
34
34
|
open: false,
|
|
35
|
+
|
|
36
|
+
// Extensibility — install custom engine services
|
|
37
|
+
// services: [MyService, AnotherService.configure({...})],
|
|
38
|
+
|
|
39
|
+
// Extensibility — custom wiring after services are installed
|
|
40
|
+
// setup(engine) {},
|
|
41
|
+
|
|
42
|
+
// Lifecycle — runs right before server.listen()
|
|
43
|
+
// beforeListen(opts) {},
|
|
44
|
+
|
|
45
|
+
// Lifecycle — runs right after server starts (attach WebSocket upgrades, etc.)
|
|
46
|
+
// afterListen(httpServer, opts) {},
|
|
47
|
+
|
|
35
48
|
routes: [
|
|
36
49
|
{
|
|
37
50
|
name: 'Products',
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { Engine } from '@jucie.io/engine';
|
|
2
|
+
|
|
3
|
+
import { Compile } from './services/Compile.js';
|
|
4
|
+
import { Run } from './services/Run.js';
|
|
5
|
+
import { Configurator } from './services/Configurator.js';
|
|
6
|
+
import { Route } from './services/Router.js';
|
|
7
|
+
import { transformConfig } from './utils/transformConfig.js';
|
|
8
|
+
import { Server } from '@jucie.io/engine-server';
|
|
9
|
+
import { EsBuildCompiler } from '@jucie.io/engine-esbuild';
|
|
10
|
+
import { LiveReload } from './services/LiveReload.js';
|
|
11
|
+
|
|
12
|
+
export const createClovie = async (config = {}) => {
|
|
13
|
+
return new Promise((resolve, reject) => {
|
|
14
|
+
try {
|
|
15
|
+
const clovie = Engine.create().install(
|
|
16
|
+
Configurator.configure({
|
|
17
|
+
optsPath: config.optsPath,
|
|
18
|
+
transform: transformConfig
|
|
19
|
+
}),
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
clovie.configurator.onReady(async (opts) => {
|
|
23
|
+
// Always install core services
|
|
24
|
+
clovie.install(Compile)
|
|
25
|
+
clovie.install(Route)
|
|
26
|
+
clovie.install(Run)
|
|
27
|
+
|
|
28
|
+
if (opts.scripts) {
|
|
29
|
+
clovie.install(EsBuildCompiler.configure({
|
|
30
|
+
entryPoints: [`${opts.scripts}/**/*.js`],
|
|
31
|
+
outdir: opts.outputDir,
|
|
32
|
+
outbase: opts.scripts,
|
|
33
|
+
bundle: true,
|
|
34
|
+
format: 'iife',
|
|
35
|
+
target: 'es2015',
|
|
36
|
+
minify: opts.mode === 'production',
|
|
37
|
+
sourcemap: opts.mode === 'development',
|
|
38
|
+
}));
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (Array.isArray(opts.services)) {
|
|
42
|
+
for (const service of opts.services) {
|
|
43
|
+
if (service.configured) {
|
|
44
|
+
clovie.install(service);
|
|
45
|
+
} else {
|
|
46
|
+
clovie.install(service.configure(opts));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (typeof opts.setup === 'function') {
|
|
52
|
+
await opts.setup(clovie);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (opts.type === 'server' || opts.mode === 'development') {
|
|
56
|
+
clovie.install(Server);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (opts.mode === 'development') {
|
|
60
|
+
clovie.install(LiveReload);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Don't auto-execute commands - let CLI decide
|
|
64
|
+
resolve(clovie);
|
|
65
|
+
});
|
|
66
|
+
} catch (error) {
|
|
67
|
+
reject({ error, code: 'CREATE_CLOVIE_ERROR' });
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example usage of Server with different adapters
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { createClovie } from '../createClovie.js';
|
|
6
|
+
import { ExpressAdapter } from '../adapters/express.js';
|
|
7
|
+
|
|
8
|
+
// Example 1: Using built-in HTTP adapter (default)
|
|
9
|
+
async function httpExample() {
|
|
10
|
+
const clovie = await createClovie();
|
|
11
|
+
|
|
12
|
+
// Add routes using the new context-based API
|
|
13
|
+
clovie.server.add('GET', '/', (ctx) => {
|
|
14
|
+
return ctx.respond.json({ message: 'Hello from HTTP adapter!' });
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
clovie.server.add('GET', '/users/:id', (ctx) => {
|
|
18
|
+
return ctx.respond.json({
|
|
19
|
+
user: ctx.req.params.id,
|
|
20
|
+
query: ctx.req.query
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
// Start server with HTTP adapter (default)
|
|
25
|
+
await clovie.server.listen(3000);
|
|
26
|
+
console.log('HTTP server running on port 3000');
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Example 2: Using Express adapter
|
|
30
|
+
async function expressExample() {
|
|
31
|
+
const clovie = await createClovie();
|
|
32
|
+
|
|
33
|
+
// Set Express adapter
|
|
34
|
+
clovie.server.useAdapter(new ExpressAdapter());
|
|
35
|
+
|
|
36
|
+
// Add routes
|
|
37
|
+
clovie.server.add('GET', '/', (ctx) => {
|
|
38
|
+
return ctx.respond.json({ message: 'Hello from Express adapter!' });
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
clovie.server.add('POST', '/api/users', (ctx) => {
|
|
42
|
+
return ctx.respond.json({
|
|
43
|
+
created: true,
|
|
44
|
+
user: ctx.req.body
|
|
45
|
+
}, 201);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
// Configure hooks
|
|
49
|
+
clovie.server.hooks({
|
|
50
|
+
onRequest: async (ctx) => {
|
|
51
|
+
console.log(`${ctx.req.method} ${ctx.req.path}`);
|
|
52
|
+
},
|
|
53
|
+
onError: async (ctx, error) => {
|
|
54
|
+
console.error('Error:', error);
|
|
55
|
+
return ctx.respond.json({ error: 'Internal Server Error' }, 500);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
// Start server
|
|
60
|
+
await clovie.server.listen({ port: 3001 });
|
|
61
|
+
console.log('Express server running on port 3001');
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Example 3: Advanced Express usage with middleware
|
|
65
|
+
async function advancedExpressExample() {
|
|
66
|
+
const clovie = await createClovie();
|
|
67
|
+
|
|
68
|
+
// Create Express adapter with custom Express instance
|
|
69
|
+
const express = await import('express');
|
|
70
|
+
const app = express.default();
|
|
71
|
+
|
|
72
|
+
// Add custom middleware
|
|
73
|
+
app.use((req, res, next) => {
|
|
74
|
+
req.customProperty = 'Custom middleware value';
|
|
75
|
+
next();
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
const adapter = new ExpressAdapter(app);
|
|
79
|
+
clovie.server.useAdapter(adapter);
|
|
80
|
+
|
|
81
|
+
// Add routes that can access custom middleware
|
|
82
|
+
clovie.server.add('GET', '/middleware', (ctx) => {
|
|
83
|
+
return ctx.respond.json({
|
|
84
|
+
middleware: ctx.req.raw.req.customProperty
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
await clovie.server.listen({ port: 3002 });
|
|
89
|
+
console.log('Advanced Express server running on port 3002');
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Run examples
|
|
93
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
94
|
+
console.log('Starting Server adapter examples...');
|
|
95
|
+
|
|
96
|
+
// Uncomment to run specific examples:
|
|
97
|
+
// httpExample();
|
|
98
|
+
// expressExample();
|
|
99
|
+
// advancedExpressExample();
|
|
100
|
+
}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example usage of the new Server adapter system
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { createClovie } from '../createClovie.js';
|
|
6
|
+
import { ExpressAdapter } from '../adapters/express.js';
|
|
7
|
+
|
|
8
|
+
// Example 1: Using built-in HTTP adapter (default)
|
|
9
|
+
async function httpExample() {
|
|
10
|
+
console.log('🚀 Starting HTTP adapter example...');
|
|
11
|
+
|
|
12
|
+
const clovie = await createClovie();
|
|
13
|
+
|
|
14
|
+
// Add routes using the new context-based API
|
|
15
|
+
clovie.server.add('GET', '/', (ctx) => {
|
|
16
|
+
return ctx.respond.json({
|
|
17
|
+
message: 'Hello from HTTP adapter!',
|
|
18
|
+
adapter: 'http'
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
clovie.server.add('GET', '/users/:id', (ctx) => {
|
|
23
|
+
return ctx.respond.json({
|
|
24
|
+
userId: ctx.req.params.id,
|
|
25
|
+
query: ctx.req.query,
|
|
26
|
+
adapter: 'http'
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
// Configure hooks
|
|
31
|
+
clovie.server.hooks({
|
|
32
|
+
onRequest: async (ctx) => {
|
|
33
|
+
console.log(`📥 ${ctx.req.method} ${ctx.req.path}`);
|
|
34
|
+
},
|
|
35
|
+
onSend: async (ctx, response) => {
|
|
36
|
+
console.log(`📤 Sent ${response.type} response`);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
// Start server with HTTP adapter (default)
|
|
41
|
+
const server = await clovie.server.listen({ port: 3000 });
|
|
42
|
+
console.log(`✅ HTTP server running on http://localhost:${server.address().port}`);
|
|
43
|
+
|
|
44
|
+
// Keep server running for demo
|
|
45
|
+
console.log('Press Ctrl+C to stop...');
|
|
46
|
+
process.on('SIGINT', async () => {
|
|
47
|
+
await clovie.server.stop();
|
|
48
|
+
console.log('👋 Server stopped');
|
|
49
|
+
process.exit(0);
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Example 2: Using Express adapter
|
|
54
|
+
async function expressExample() {
|
|
55
|
+
console.log('🚀 Starting Express adapter example...');
|
|
56
|
+
|
|
57
|
+
const clovie = await createClovie();
|
|
58
|
+
|
|
59
|
+
// Set Express adapter
|
|
60
|
+
clovie.server.useAdapter(new ExpressAdapter());
|
|
61
|
+
|
|
62
|
+
// Add routes
|
|
63
|
+
clovie.server.add('GET', '/', (ctx) => {
|
|
64
|
+
return ctx.respond.json({
|
|
65
|
+
message: 'Hello from Express adapter!',
|
|
66
|
+
adapter: 'express'
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
clovie.server.add('POST', '/api/users', (ctx) => {
|
|
71
|
+
return ctx.respond.json({
|
|
72
|
+
created: true,
|
|
73
|
+
user: ctx.req.body,
|
|
74
|
+
adapter: 'express'
|
|
75
|
+
}, 201);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
// Configure hooks
|
|
79
|
+
clovie.server.hooks({
|
|
80
|
+
onRequest: async (ctx) => {
|
|
81
|
+
console.log(`📥 ${ctx.req.method} ${ctx.req.path} (Express)`);
|
|
82
|
+
},
|
|
83
|
+
onError: async (ctx, error) => {
|
|
84
|
+
console.error('❌ Error:', error.message);
|
|
85
|
+
return ctx.respond.json({ error: 'Internal Server Error' }, 500);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
// Start server
|
|
90
|
+
const server = await clovie.server.listen({ port: 3001 });
|
|
91
|
+
console.log(`✅ Express server running on http://localhost:${server.address().port}`);
|
|
92
|
+
|
|
93
|
+
// Keep server running for demo
|
|
94
|
+
console.log('Press Ctrl+C to stop...');
|
|
95
|
+
process.on('SIGINT', async () => {
|
|
96
|
+
await clovie.server.stop();
|
|
97
|
+
console.log('👋 Server stopped');
|
|
98
|
+
process.exit(0);
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Example 3: Advanced usage with custom middleware
|
|
103
|
+
async function advancedExample() {
|
|
104
|
+
console.log('🚀 Starting advanced example...');
|
|
105
|
+
|
|
106
|
+
const clovie = await createClovie();
|
|
107
|
+
|
|
108
|
+
// Create Express adapter with custom Express instance
|
|
109
|
+
try {
|
|
110
|
+
const express = await import('express');
|
|
111
|
+
const app = express.default();
|
|
112
|
+
|
|
113
|
+
// Add custom middleware
|
|
114
|
+
app.use((req, res, next) => {
|
|
115
|
+
req.customProperty = 'Custom middleware value';
|
|
116
|
+
next();
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
const adapter = new ExpressAdapter(app);
|
|
120
|
+
clovie.server.useAdapter(adapter);
|
|
121
|
+
|
|
122
|
+
// Add routes that can access custom middleware
|
|
123
|
+
clovie.server.add('GET', '/middleware', (ctx) => {
|
|
124
|
+
return ctx.respond.json({
|
|
125
|
+
middleware: ctx.req.raw.req.customProperty,
|
|
126
|
+
adapter: 'express-with-middleware'
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
const server = await clovie.server.listen({ port: 3002 });
|
|
131
|
+
console.log(`✅ Advanced server running on http://localhost:${server.address().port}`);
|
|
132
|
+
|
|
133
|
+
// Keep server running for demo
|
|
134
|
+
console.log('Press Ctrl+C to stop...');
|
|
135
|
+
process.on('SIGINT', async () => {
|
|
136
|
+
await clovie.server.stop();
|
|
137
|
+
console.log('👋 Server stopped');
|
|
138
|
+
process.exit(0);
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
} catch (error) {
|
|
142
|
+
console.error('❌ Express not available. Install with: npm install express');
|
|
143
|
+
console.log('Falling back to HTTP adapter...');
|
|
144
|
+
|
|
145
|
+
// Fallback to HTTP adapter
|
|
146
|
+
clovie.server.add('GET', '/fallback', (ctx) => {
|
|
147
|
+
return ctx.respond.json({
|
|
148
|
+
message: 'Fallback to HTTP adapter',
|
|
149
|
+
adapter: 'http-fallback'
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
const server = await clovie.server.listen({ port: 3002 });
|
|
154
|
+
console.log(`✅ Fallback server running on http://localhost:${server.address().port}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Run examples based on command line argument
|
|
159
|
+
const example = process.argv[2] || 'http';
|
|
160
|
+
|
|
161
|
+
switch (example) {
|
|
162
|
+
case 'http':
|
|
163
|
+
httpExample();
|
|
164
|
+
break;
|
|
165
|
+
case 'express':
|
|
166
|
+
expressExample();
|
|
167
|
+
break;
|
|
168
|
+
case 'advanced':
|
|
169
|
+
advancedExample();
|
|
170
|
+
break;
|
|
171
|
+
default:
|
|
172
|
+
console.log('Usage: node kernel-usage.js [http|express|advanced]');
|
|
173
|
+
console.log('Examples:');
|
|
174
|
+
console.log(' node kernel-usage.js http # HTTP adapter (default)');
|
|
175
|
+
console.log(' node kernel-usage.js express # Express adapter');
|
|
176
|
+
console.log(' node kernel-usage.js advanced # Advanced Express with middleware');
|
|
177
|
+
}
|