elit 3.1.6 → 3.1.8
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/dist/build.d.mts +3 -1
- package/dist/cli.js +442 -218
- package/dist/database.d.mts +31 -0
- package/dist/database.d.ts +30 -0
- package/dist/database.d.ts.map +1 -0
- package/dist/database.js +440 -0
- package/dist/database.mjs +406 -0
- package/dist/hmr.d.ts.map +1 -1
- package/dist/hmr.js +4 -5
- package/dist/hmr.mjs +4 -5
- package/dist/http.d.mts +3 -0
- package/dist/http.d.ts +3 -0
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js +23 -0
- package/dist/http.mjs +23 -0
- package/dist/https.js +23 -0
- package/dist/https.mjs +23 -0
- package/dist/index.js +4 -5
- package/dist/index.mjs +4 -5
- package/dist/{server-CkRUWELa.d.ts → server-BFOHbYb6.d.ts} +32 -14
- package/dist/{server-D8ktU14v.d.mts → server-BPVoq5Xi.d.mts} +32 -14
- package/dist/server.d.mts +3 -1
- package/dist/server.d.ts +28 -13
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +431 -234
- package/dist/server.mjs +429 -234
- package/dist/types.d.mts +35 -13
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/wss.js +23 -0
- package/dist/wss.mjs +23 -0
- package/package.json +8 -2
- package/src/cli.ts +2 -1
- package/src/database.ts +246 -0
- package/src/hmr.ts +7 -6
- package/src/http.ts +26 -0
- package/src/server.ts +90 -65
- package/src/types.ts +7 -0
package/dist/types.d.mts
CHANGED
|
@@ -61,6 +61,9 @@ declare class ServerResponse extends EventEmitter {
|
|
|
61
61
|
write(chunk: any, encoding?: BufferEncoding | (() => void), callback?: () => void): boolean;
|
|
62
62
|
end(chunk?: any, encoding?: BufferEncoding | (() => void), callback?: () => void): this;
|
|
63
63
|
_setResolver(resolve: (response: Response) => void): void;
|
|
64
|
+
json(data: any, statusCode?: number): this;
|
|
65
|
+
send(data: any): this;
|
|
66
|
+
status(code: number): this;
|
|
64
67
|
}
|
|
65
68
|
|
|
66
69
|
/**
|
|
@@ -140,6 +143,14 @@ declare class WebSocket extends EventEmitter$1 {
|
|
|
140
143
|
get bufferedAmount(): number;
|
|
141
144
|
}
|
|
142
145
|
|
|
146
|
+
interface DatabaseConfig {
|
|
147
|
+
dir?: string;
|
|
148
|
+
language?: 'ts' | 'js';
|
|
149
|
+
registerModules?: {
|
|
150
|
+
[key: string]: any;
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
|
|
143
154
|
/**
|
|
144
155
|
* Development server with HMR support
|
|
145
156
|
* Cross-runtime transpilation support
|
|
@@ -148,17 +159,22 @@ declare class WebSocket extends EventEmitter$1 {
|
|
|
148
159
|
* - Deno: uses Deno.emit
|
|
149
160
|
*/
|
|
150
161
|
|
|
162
|
+
interface ElitRequest extends IncomingMessage {
|
|
163
|
+
body?: any;
|
|
164
|
+
}
|
|
165
|
+
interface ElitResponse extends ServerResponse {
|
|
166
|
+
json(data: any, statusCode?: number): this;
|
|
167
|
+
send(data: any): this;
|
|
168
|
+
status(code: number): this;
|
|
169
|
+
}
|
|
151
170
|
interface ServerRouteContext {
|
|
152
|
-
req:
|
|
153
|
-
res:
|
|
171
|
+
req: ElitRequest;
|
|
172
|
+
res: ElitResponse;
|
|
154
173
|
params: Record<string, string>;
|
|
155
174
|
query: Record<string, string>;
|
|
156
175
|
body: any;
|
|
157
176
|
headers: Record<string, string | string[] | undefined>;
|
|
158
177
|
user?: any;
|
|
159
|
-
send?(data: any): ServerResponse;
|
|
160
|
-
json?(data: any): ServerResponse;
|
|
161
|
-
status?(code: number): ServerResponse;
|
|
162
178
|
}
|
|
163
179
|
type ServerRouteHandler = (ctx: ServerRouteContext, next?: () => Promise<void>) => void | Promise<void>;
|
|
164
180
|
type Middleware = (ctx: ServerRouteContext, next: () => Promise<void>) => void | Promise<void>;
|
|
@@ -166,14 +182,14 @@ declare class ServerRouter {
|
|
|
166
182
|
private routes;
|
|
167
183
|
private middlewares;
|
|
168
184
|
use(...args: Array<any>): this;
|
|
169
|
-
all: (path: string, ...handlers: Array<Middleware | ServerRouteHandler | ((req:
|
|
170
|
-
get: (path: string, ...handlers: Array<Middleware | ServerRouteHandler | ((req:
|
|
171
|
-
post: (path: string, ...handlers: Array<Middleware | ServerRouteHandler | ((req:
|
|
172
|
-
put: (path: string, ...handlers: Array<Middleware | ServerRouteHandler | ((req:
|
|
173
|
-
delete: (path: string, ...handlers: Array<Middleware | ServerRouteHandler | ((req:
|
|
174
|
-
patch: (path: string, ...handlers: Array<Middleware | ServerRouteHandler | ((req:
|
|
175
|
-
options: (path: string, ...handlers: Array<Middleware | ServerRouteHandler | ((req:
|
|
176
|
-
head: (path: string, ...handlers: Array<Middleware | ServerRouteHandler | ((req:
|
|
185
|
+
all: (path: string, ...handlers: Array<Middleware | ServerRouteHandler | ((req: ElitRequest, res: ServerResponse, next?: () => void) => any)>) => this;
|
|
186
|
+
get: (path: string, ...handlers: Array<Middleware | ServerRouteHandler | ((req: ElitRequest, res: ServerResponse, next?: () => void) => any)>) => this;
|
|
187
|
+
post: (path: string, ...handlers: Array<Middleware | ServerRouteHandler | ((req: ElitRequest, res: ServerResponse, next?: () => void) => any)>) => this;
|
|
188
|
+
put: (path: string, ...handlers: Array<Middleware | ServerRouteHandler | ((req: ElitRequest, res: ServerResponse, next?: () => void) => any)>) => this;
|
|
189
|
+
delete: (path: string, ...handlers: Array<Middleware | ServerRouteHandler | ((req: ElitRequest, res: ServerResponse, next?: () => void) => any)>) => this;
|
|
190
|
+
patch: (path: string, ...handlers: Array<Middleware | ServerRouteHandler | ((req: ElitRequest, res: ServerResponse, next?: () => void) => any)>) => this;
|
|
191
|
+
options: (path: string, ...handlers: Array<Middleware | ServerRouteHandler | ((req: ElitRequest, res: ServerResponse, next?: () => void) => any)>) => this;
|
|
192
|
+
head: (path: string, ...handlers: Array<Middleware | ServerRouteHandler | ((req: ElitRequest, res: ServerResponse, next?: () => void) => any)>) => this;
|
|
177
193
|
private toMiddleware;
|
|
178
194
|
private addRoute;
|
|
179
195
|
private pathToRegex;
|
|
@@ -328,6 +344,8 @@ interface DevServerOptions {
|
|
|
328
344
|
port?: number;
|
|
329
345
|
/** Host to bind to (default: 'localhost') */
|
|
330
346
|
host?: string;
|
|
347
|
+
/** Domain to map (e.g., 'idevcoder.com') - redirects domain traffic to this server's port */
|
|
348
|
+
domain?: string;
|
|
331
349
|
/** Root directory to serve files from */
|
|
332
350
|
root?: string;
|
|
333
351
|
/** Base path for the client application (e.g., '/app1', '/app2') */
|
|
@@ -358,6 +376,8 @@ interface DevServerOptions {
|
|
|
358
376
|
mode?: 'dev' | 'preview';
|
|
359
377
|
/** Environment variables to inject (prefix with VITE_ for client access) */
|
|
360
378
|
env?: Record<string, string>;
|
|
379
|
+
/** List of database directories to load */
|
|
380
|
+
database?: DatabaseConfig;
|
|
361
381
|
}
|
|
362
382
|
interface DevServer {
|
|
363
383
|
/** HTTP server instance */
|
|
@@ -433,6 +453,8 @@ interface PreviewOptions {
|
|
|
433
453
|
port?: number;
|
|
434
454
|
/** Host to bind to (default: 'localhost') */
|
|
435
455
|
host?: string;
|
|
456
|
+
/** Domain to map (e.g., 'idevcoder.com') - redirects domain traffic to this server's port */
|
|
457
|
+
domain?: string;
|
|
436
458
|
/** Root directory to serve files from (default: dist or build.outDir) */
|
|
437
459
|
root?: string;
|
|
438
460
|
/** Base path for the application (e.g., '/app') */
|
package/dist/types.d.ts
CHANGED
|
@@ -57,6 +57,7 @@ export type ElementFactory = {
|
|
|
57
57
|
};
|
|
58
58
|
import type { Server } from 'http';
|
|
59
59
|
import type { WebSocketServer } from 'ws';
|
|
60
|
+
import { DatabaseConfig } from './database';
|
|
60
61
|
export type Router = import('./server').ServerRouter;
|
|
61
62
|
export type StateManager = import('./server').StateManager;
|
|
62
63
|
export interface ClientConfig {
|
|
@@ -108,6 +109,8 @@ export interface DevServerOptions {
|
|
|
108
109
|
port?: number;
|
|
109
110
|
/** Host to bind to (default: 'localhost') */
|
|
110
111
|
host?: string;
|
|
112
|
+
/** Domain to map (e.g., 'idevcoder.com') - redirects domain traffic to this server's port */
|
|
113
|
+
domain?: string;
|
|
111
114
|
/** Root directory to serve files from */
|
|
112
115
|
root?: string;
|
|
113
116
|
/** Base path for the client application (e.g., '/app1', '/app2') */
|
|
@@ -138,6 +141,8 @@ export interface DevServerOptions {
|
|
|
138
141
|
mode?: 'dev' | 'preview';
|
|
139
142
|
/** Environment variables to inject (prefix with VITE_ for client access) */
|
|
140
143
|
env?: Record<string, string>;
|
|
144
|
+
/** List of database directories to load */
|
|
145
|
+
database?: DatabaseConfig;
|
|
141
146
|
}
|
|
142
147
|
export interface DevServer {
|
|
143
148
|
/** HTTP server instance */
|
|
@@ -213,6 +218,8 @@ export interface PreviewOptions {
|
|
|
213
218
|
port?: number;
|
|
214
219
|
/** Host to bind to (default: 'localhost') */
|
|
215
220
|
host?: string;
|
|
221
|
+
/** Domain to map (e.g., 'idevcoder.com') - redirects domain traffic to this server's port */
|
|
222
|
+
domain?: string;
|
|
216
223
|
/** Root directory to serve files from (default: dist or build.outDir) */
|
|
217
224
|
root?: string;
|
|
218
225
|
/** Base path for the application (e.g., '/app') */
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/wss.js
CHANGED
|
@@ -384,6 +384,29 @@ var init_http = __esm({
|
|
|
384
384
|
_setResolver(resolve) {
|
|
385
385
|
this._resolve = resolve;
|
|
386
386
|
}
|
|
387
|
+
// Express.js-like methods
|
|
388
|
+
json(data, statusCode = 200) {
|
|
389
|
+
if (!this.headersSent) {
|
|
390
|
+
this.setHeader("Content-Type", "application/json");
|
|
391
|
+
}
|
|
392
|
+
this.statusCode = statusCode;
|
|
393
|
+
this.end(JSON.stringify(data));
|
|
394
|
+
return this;
|
|
395
|
+
}
|
|
396
|
+
send(data) {
|
|
397
|
+
if (typeof data === "object") {
|
|
398
|
+
return this.json(data);
|
|
399
|
+
}
|
|
400
|
+
if (!this.headersSent) {
|
|
401
|
+
this.setHeader("Content-Type", "text/plain");
|
|
402
|
+
}
|
|
403
|
+
this.end(String(data));
|
|
404
|
+
return this;
|
|
405
|
+
}
|
|
406
|
+
status(code) {
|
|
407
|
+
this.statusCode = code;
|
|
408
|
+
return this;
|
|
409
|
+
}
|
|
387
410
|
};
|
|
388
411
|
Server = class extends import_node_events.EventEmitter {
|
|
389
412
|
constructor(requestListener) {
|
package/dist/wss.mjs
CHANGED
|
@@ -390,6 +390,29 @@ var init_http = __esm({
|
|
|
390
390
|
_setResolver(resolve) {
|
|
391
391
|
this._resolve = resolve;
|
|
392
392
|
}
|
|
393
|
+
// Express.js-like methods
|
|
394
|
+
json(data, statusCode = 200) {
|
|
395
|
+
if (!this.headersSent) {
|
|
396
|
+
this.setHeader("Content-Type", "application/json");
|
|
397
|
+
}
|
|
398
|
+
this.statusCode = statusCode;
|
|
399
|
+
this.end(JSON.stringify(data));
|
|
400
|
+
return this;
|
|
401
|
+
}
|
|
402
|
+
send(data) {
|
|
403
|
+
if (typeof data === "object") {
|
|
404
|
+
return this.json(data);
|
|
405
|
+
}
|
|
406
|
+
if (!this.headersSent) {
|
|
407
|
+
this.setHeader("Content-Type", "text/plain");
|
|
408
|
+
}
|
|
409
|
+
this.end(String(data));
|
|
410
|
+
return this;
|
|
411
|
+
}
|
|
412
|
+
status(code) {
|
|
413
|
+
this.statusCode = code;
|
|
414
|
+
return this;
|
|
415
|
+
}
|
|
393
416
|
};
|
|
394
417
|
Server = class extends EventEmitter {
|
|
395
418
|
constructor(requestListener) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "elit",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.8",
|
|
4
4
|
"description": "Optimized lightweight library for creating DOM elements with reactive state",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -100,6 +100,11 @@
|
|
|
100
100
|
"types": "./dist/runtime.d.ts",
|
|
101
101
|
"import": "./dist/runtime.mjs",
|
|
102
102
|
"require": "./dist/runtime.js"
|
|
103
|
+
},
|
|
104
|
+
"./database": {
|
|
105
|
+
"types": "./dist/database.d.ts",
|
|
106
|
+
"import": "./dist/database.mjs",
|
|
107
|
+
"require": "./dist/database.js"
|
|
103
108
|
}
|
|
104
109
|
},
|
|
105
110
|
"scripts": {
|
|
@@ -152,12 +157,13 @@
|
|
|
152
157
|
"open": "^11.0.0"
|
|
153
158
|
},
|
|
154
159
|
"devDependencies": {
|
|
160
|
+
"@types/bun": "^1.3.6",
|
|
155
161
|
"@types/express": "^5.0.6",
|
|
156
162
|
"@types/mime-types": "^2.1.4",
|
|
157
163
|
"@types/node": "^22.0.0",
|
|
158
164
|
"@types/ws": "^8.5.13",
|
|
159
|
-
"express": "^5.2.1",
|
|
160
165
|
"elysia": "^1.4.19",
|
|
166
|
+
"express": "^5.2.1",
|
|
161
167
|
"terser": "^5.44.1",
|
|
162
168
|
"tsup": "^8.0.0",
|
|
163
169
|
"typescript": "^5.3.0"
|
package/src/cli.ts
CHANGED
|
@@ -210,7 +210,8 @@ async function runPreview(args: string[]) {
|
|
|
210
210
|
port: mergedOptions.port || 4173,
|
|
211
211
|
host: mergedOptions.host || 'localhost',
|
|
212
212
|
open: mergedOptions.open ?? true,
|
|
213
|
-
logging: mergedOptions.logging ?? true
|
|
213
|
+
logging: mergedOptions.logging ?? true,
|
|
214
|
+
domain: mergedOptions.domain
|
|
214
215
|
};
|
|
215
216
|
|
|
216
217
|
// Support both single root and clients array
|
package/src/database.ts
ADDED
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import vm from "node:vm";
|
|
2
|
+
import { resolve } from "./path";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import fs from "node:fs";
|
|
5
|
+
import * as esbuild from 'esbuild';
|
|
6
|
+
|
|
7
|
+
export interface DatabaseConfig {
|
|
8
|
+
dir?: string;
|
|
9
|
+
language?: 'ts' | 'js';
|
|
10
|
+
registerModules?: { [key: string]: any };
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export class Database {
|
|
14
|
+
private _ctx: vm.Context;
|
|
15
|
+
private _registerModules: { [key: string]: any };
|
|
16
|
+
private _config: DatabaseConfig = {
|
|
17
|
+
dir: resolve(process.cwd(), 'databases'),
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
constructor(config: DatabaseConfig) {
|
|
21
|
+
this._config = { ...this._config, ...config };
|
|
22
|
+
this._registerModules = config.registerModules || {};
|
|
23
|
+
this._ctx = vm.createContext(this._registerModules);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
set config(config: DatabaseConfig) {
|
|
27
|
+
this._config = { ...this._config, ...config };
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
private register(context: { [key: string]: any }) {
|
|
31
|
+
this._registerModules = { ...this._registerModules, ...context };
|
|
32
|
+
// Register any custom modules or plugins here if needed
|
|
33
|
+
this._ctx = vm.createContext(this._registerModules);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
plugin(moduleName: string, moduleContent: any) {
|
|
37
|
+
this.register({ [moduleName]: moduleContent });
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
private resolvePath(fileList: any[], query: string) {
|
|
41
|
+
const aliases = { '@db': this._config.dir || resolve(process.cwd(), 'databases') };
|
|
42
|
+
|
|
43
|
+
let resolvedPath = query;
|
|
44
|
+
for (const [alias, target] of Object.entries(aliases)) {
|
|
45
|
+
if (resolvedPath.startsWith(alias + '/')) {
|
|
46
|
+
resolvedPath = resolvedPath.replace(alias, target);
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Normalize path separators for cross-platform compatibility
|
|
52
|
+
resolvedPath = path.normalize(resolvedPath);
|
|
53
|
+
|
|
54
|
+
return fileList.find(file => {
|
|
55
|
+
const normalizedFile = path.normalize(file);
|
|
56
|
+
const fileWithoutExt = normalizedFile.replace(/\.[^/.]+$/, "");
|
|
57
|
+
return normalizedFile === resolvedPath ||
|
|
58
|
+
fileWithoutExt === resolvedPath ||
|
|
59
|
+
normalizedFile === resolvedPath + '.ts' ||
|
|
60
|
+
normalizedFile === resolvedPath + '.js';
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
private async moduleLinker(specifier: any, referencingModule: any) {
|
|
65
|
+
// Try database files first
|
|
66
|
+
const dbFiles = fs.readdirSync(this._config.dir || resolve(process.cwd(), 'databases'))
|
|
67
|
+
.filter(f => f.endsWith(".ts"))
|
|
68
|
+
.map(f => path.join(this._config.dir || resolve(process.cwd(), 'databases'), f));
|
|
69
|
+
|
|
70
|
+
const dbResult = this.resolvePath(dbFiles, specifier);
|
|
71
|
+
if (dbResult) {
|
|
72
|
+
try {
|
|
73
|
+
const actualModule = await import(dbResult);
|
|
74
|
+
const exportNames = Object.keys(actualModule);
|
|
75
|
+
return new vm.SyntheticModule(
|
|
76
|
+
exportNames,
|
|
77
|
+
function () {
|
|
78
|
+
exportNames.forEach(key => {
|
|
79
|
+
this.setExport(key, actualModule[key]);
|
|
80
|
+
});
|
|
81
|
+
},
|
|
82
|
+
{ identifier: specifier, context: referencingModule.context }
|
|
83
|
+
);
|
|
84
|
+
} catch (err) {
|
|
85
|
+
console.error(`Failed to load database module ${specifier}:`, err);
|
|
86
|
+
throw err;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
throw new Error(`Module ${specifier} is not allowed or not found.`);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
private async vmRun(code: string | Function, _options?: vm.RunningCodeOptions | string) {
|
|
95
|
+
const logs: any[] = [];
|
|
96
|
+
|
|
97
|
+
const customConsole = ['log', 'error', 'warn', 'info', 'debug', 'trace'].reduce((acc: any, type: any) => {
|
|
98
|
+
acc[type] = (...args: any[]) => logs.push({ type, args });
|
|
99
|
+
return acc;
|
|
100
|
+
}, {});
|
|
101
|
+
|
|
102
|
+
this.register({
|
|
103
|
+
console: customConsole
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
let stringCode: string;
|
|
107
|
+
if (typeof code === 'function') {
|
|
108
|
+
const funcStr = code.toString();
|
|
109
|
+
|
|
110
|
+
// ตัด arrow function หรือ function keyword และ opening brace ออก
|
|
111
|
+
// ใช้ string methods แทน regex เพื่อหลีด ReDoS vulnerability
|
|
112
|
+
|
|
113
|
+
// Check for arrow function first
|
|
114
|
+
if (funcStr.includes('=>')) {
|
|
115
|
+
const arrowIndex = funcStr.indexOf('=>');
|
|
116
|
+
// Find opening brace after =>
|
|
117
|
+
let start = arrowIndex + 2;
|
|
118
|
+
while (start < funcStr.length && funcStr[start] === ' ') start++;
|
|
119
|
+
if (funcStr[start] === '{') start++;
|
|
120
|
+
|
|
121
|
+
// Find closing brace
|
|
122
|
+
let end = funcStr.lastIndexOf('}');
|
|
123
|
+
|
|
124
|
+
if (start < end) {
|
|
125
|
+
stringCode = funcStr.substring(start, end);
|
|
126
|
+
} else {
|
|
127
|
+
stringCode = funcStr.substring(start);
|
|
128
|
+
}
|
|
129
|
+
} else if (funcStr.includes('function')) {
|
|
130
|
+
const funcIndex = funcStr.indexOf('function');
|
|
131
|
+
// Find opening parenthesis after function
|
|
132
|
+
let start = funcIndex + 8; // 'function'.length
|
|
133
|
+
while (start < funcStr.length && funcStr[start] === ' ') start++;
|
|
134
|
+
if (funcStr[start] === '(') start++;
|
|
135
|
+
|
|
136
|
+
// Skip function name if exists
|
|
137
|
+
if (start < funcStr.length && funcStr[start] !== '(') {
|
|
138
|
+
while (start < funcStr.length && funcStr[start] !== ' ' && funcStr[start] !== '(') start++;
|
|
139
|
+
}
|
|
140
|
+
if (funcStr[start] === '(') start++;
|
|
141
|
+
|
|
142
|
+
// Find opening brace
|
|
143
|
+
while (start < funcStr.length && funcStr[start] === ' ') start++;
|
|
144
|
+
if (funcStr[start] === '{') start++;
|
|
145
|
+
|
|
146
|
+
// Find closing brace
|
|
147
|
+
const end = funcStr.lastIndexOf('}');
|
|
148
|
+
|
|
149
|
+
if (start < end) {
|
|
150
|
+
stringCode = funcStr.substring(start, end);
|
|
151
|
+
} else {
|
|
152
|
+
stringCode = funcStr.substring(start);
|
|
153
|
+
}
|
|
154
|
+
} else {
|
|
155
|
+
stringCode = funcStr;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Trim leading newline, spaces, and trailing
|
|
159
|
+
stringCode = stringCode.trim();
|
|
160
|
+
|
|
161
|
+
// Transform import(aa).from("module") to import aa from "module"
|
|
162
|
+
// ใช้ string methods แทน regex เพื่อหลีด ReDoS vulnerability
|
|
163
|
+
let importPos = 0;
|
|
164
|
+
while ((importPos = stringCode.indexOf('import(', importPos)) !== -1) {
|
|
165
|
+
const fromPos = stringCode.indexOf('.from(', importPos);
|
|
166
|
+
if (fromPos === -1) break;
|
|
167
|
+
|
|
168
|
+
const quoteStart = stringCode.indexOf('(', fromPos + 7) + 1;
|
|
169
|
+
if (quoteStart === -1) break;
|
|
170
|
+
|
|
171
|
+
const quoteChar = stringCode[quoteStart];
|
|
172
|
+
if (quoteChar !== '"' && quoteChar !== "'") break;
|
|
173
|
+
|
|
174
|
+
const quoteEnd = stringCode.indexOf(quoteChar, quoteStart + 1);
|
|
175
|
+
if (quoteEnd === -1) break;
|
|
176
|
+
|
|
177
|
+
const modulePath = stringCode.substring(quoteStart + 1, quoteEnd);
|
|
178
|
+
const importArgEnd = fromPos - 1;
|
|
179
|
+
const importArgStart = importPos + 7;
|
|
180
|
+
|
|
181
|
+
const trimmed = stringCode.substring(importArgStart, importArgEnd).trim();
|
|
182
|
+
|
|
183
|
+
let replacement: string;
|
|
184
|
+
if (trimmed.startsWith('{') && trimmed.endsWith('}')) {
|
|
185
|
+
// Destructuring: import({bb}) -> import { bb }
|
|
186
|
+
const inner = trimmed.slice(1, -1).trim();
|
|
187
|
+
replacement = `import { ${inner} } from "${modulePath}"`;
|
|
188
|
+
} else {
|
|
189
|
+
// Default: import(aa) -> import aa
|
|
190
|
+
replacement = `import ${trimmed} from "${modulePath}"`;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
const before = stringCode.substring(0, importPos);
|
|
194
|
+
const after = stringCode.substring(quoteEnd + 2);
|
|
195
|
+
stringCode = before + replacement + after;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Trim leading whitespace from each line
|
|
199
|
+
const lines = stringCode.split('\n');
|
|
200
|
+
const trimmedLines = lines.map(line => line.trim());
|
|
201
|
+
stringCode = trimmedLines.join('\n').trim();
|
|
202
|
+
} else {
|
|
203
|
+
stringCode = code;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// Transpile using esbuild
|
|
207
|
+
const result = await esbuild.build({
|
|
208
|
+
stdin: {
|
|
209
|
+
contents: stringCode,
|
|
210
|
+
loader: this._config.language || 'ts',
|
|
211
|
+
},
|
|
212
|
+
format: 'esm',
|
|
213
|
+
target: 'es2020',
|
|
214
|
+
write: false,
|
|
215
|
+
bundle: false,
|
|
216
|
+
sourcemap: false,
|
|
217
|
+
});
|
|
218
|
+
const js = result.outputFiles[0].text;
|
|
219
|
+
|
|
220
|
+
const mod = new vm.SourceTextModule(js, { context: this._ctx, identifier: path.join(this._config.dir || resolve(process.cwd(), 'databases'), 'virtual-entry.js') });
|
|
221
|
+
await mod.link(this.moduleLinker.bind(this));
|
|
222
|
+
await mod.evaluate();
|
|
223
|
+
return {
|
|
224
|
+
namespace: mod.namespace,
|
|
225
|
+
logs: logs
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Execute database code and return results
|
|
231
|
+
*/
|
|
232
|
+
async execute(code: string | Function, options?: vm.RunningCodeOptions | string) {
|
|
233
|
+
return await this.vmRun(code, options);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Default database instance
|
|
239
|
+
|
|
240
|
+
export function database() {
|
|
241
|
+
return new Database({
|
|
242
|
+
dir: resolve(process.cwd(), 'databases')
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
export default database;
|
package/src/hmr.ts
CHANGED
|
@@ -66,8 +66,8 @@ class ElitHMR implements HMRClient {
|
|
|
66
66
|
|
|
67
67
|
this.ws.onclose = () => {
|
|
68
68
|
this.enabled = false;
|
|
69
|
-
console.log('[Elit HMR] Disconnected -
|
|
70
|
-
|
|
69
|
+
console.log('[Elit HMR] Disconnected - HMR disabled until manual refresh');
|
|
70
|
+
// Don't auto-reload, let user decide when to refresh
|
|
71
71
|
};
|
|
72
72
|
|
|
73
73
|
this.ws.onerror = (error) => {
|
|
@@ -93,17 +93,18 @@ class ElitHMR implements HMRClient {
|
|
|
93
93
|
this.disposeCallbacks.forEach(cb => cb());
|
|
94
94
|
this.disposeCallbacks = [];
|
|
95
95
|
|
|
96
|
-
// Run accept callbacks or reload
|
|
96
|
+
// Run accept callbacks or log (don't auto-reload)
|
|
97
97
|
if (this.acceptCallbacks.length > 0) {
|
|
98
98
|
this.acceptCallbacks.forEach(cb => cb());
|
|
99
|
+
console.log('[Elit HMR] Update accepted via callback');
|
|
99
100
|
} else {
|
|
100
|
-
|
|
101
|
+
console.log('[Elit HMR] Update detected - manually refresh to see changes');
|
|
101
102
|
}
|
|
102
103
|
break;
|
|
103
104
|
|
|
104
105
|
case 'reload':
|
|
105
|
-
console.log('[Elit HMR] Full reload requested');
|
|
106
|
-
|
|
106
|
+
console.log('[Elit HMR] Full reload requested - manually refresh to see changes');
|
|
107
|
+
// Don't auto-reload
|
|
107
108
|
break;
|
|
108
109
|
|
|
109
110
|
case 'error':
|
package/src/http.ts
CHANGED
|
@@ -361,6 +361,32 @@ export class ServerResponse extends EventEmitter {
|
|
|
361
361
|
_setResolver(resolve: (response: Response) => void): void {
|
|
362
362
|
this._resolve = resolve;
|
|
363
363
|
}
|
|
364
|
+
|
|
365
|
+
// Express.js-like methods
|
|
366
|
+
json(data: any, statusCode = 200): this {
|
|
367
|
+
if (!this.headersSent) {
|
|
368
|
+
this.setHeader('Content-Type', 'application/json');
|
|
369
|
+
}
|
|
370
|
+
this.statusCode = statusCode;
|
|
371
|
+
this.end(JSON.stringify(data));
|
|
372
|
+
return this;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
send(data: any): this {
|
|
376
|
+
if (typeof data === 'object') {
|
|
377
|
+
return this.json(data);
|
|
378
|
+
}
|
|
379
|
+
if (!this.headersSent) {
|
|
380
|
+
this.setHeader('Content-Type', 'text/plain');
|
|
381
|
+
}
|
|
382
|
+
this.end(String(data));
|
|
383
|
+
return this;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
status(code: number): this {
|
|
387
|
+
this.statusCode = code;
|
|
388
|
+
return this;
|
|
389
|
+
}
|
|
364
390
|
}
|
|
365
391
|
|
|
366
392
|
/**
|