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.
Files changed (38) hide show
  1. package/bin/cli.js +1 -2
  2. package/config/clovie.config.js +13 -0
  3. package/lib/createClovie.js +70 -0
  4. package/lib/examples/kernel-adapters.js +100 -0
  5. package/lib/examples/kernel-usage.js +177 -0
  6. package/lib/services/Compile.js +399 -0
  7. package/lib/services/Configurator.js +101 -0
  8. package/lib/services/File.js +276 -0
  9. package/lib/services/FileCache.js +94 -0
  10. package/lib/services/LiveReload.js +145 -0
  11. package/lib/services/Router.js +189 -0
  12. package/lib/services/Run.js +188 -0
  13. package/lib/types/kernel.js +120 -0
  14. package/lib/utils/clean.js +21 -0
  15. package/lib/utils/liveReloadScript.js +48 -0
  16. package/lib/utils/loadRenderEngine.js +135 -0
  17. package/lib/utils/outputPath.js +28 -0
  18. package/lib/utils/progress.js +108 -0
  19. package/lib/utils/routeMatch.js +98 -0
  20. package/lib/utils/tasks.js +57 -0
  21. package/lib/utils/transformConfig.js +318 -0
  22. package/package.json +9 -16
  23. package/dist/ExpressAdapter-D6owl_CX.js +0 -105
  24. package/dist/ExpressAdapter-D6owl_CX.js.map +0 -1
  25. package/dist/cjs/ExpressAdapter-Z_FtN3dq.cjs +0 -80
  26. package/dist/cjs/ExpressAdapter-Z_FtN3dq.cjs.map +0 -1
  27. package/dist/cjs/createClovie-BziskasS.cjs +0 -4260
  28. package/dist/cjs/createClovie-BziskasS.cjs.map +0 -1
  29. package/dist/cjs/index.cjs +0 -9
  30. package/dist/cjs/index.cjs.map +0 -1
  31. package/dist/createClovie-x0YNcttr.js +0 -4282
  32. package/dist/createClovie-x0YNcttr.js.map +0 -1
  33. package/dist/index.d.ts +0 -229
  34. package/dist/index.js +0 -34
  35. package/dist/index.js.map +0 -1
  36. package/scripts/build-types.js +0 -247
  37. package/scripts/killPort.js +0 -138
  38. 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
- // import { createClovie } from "../lib/createClovie.js";
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)
@@ -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
+ }