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/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: IncomingMessage;
153
- res: ServerResponse;
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: IncomingMessage, res: ServerResponse, next?: () => void) => any)>) => this;
170
- get: (path: string, ...handlers: Array<Middleware | ServerRouteHandler | ((req: IncomingMessage, res: ServerResponse, next?: () => void) => any)>) => this;
171
- post: (path: string, ...handlers: Array<Middleware | ServerRouteHandler | ((req: IncomingMessage, res: ServerResponse, next?: () => void) => any)>) => this;
172
- put: (path: string, ...handlers: Array<Middleware | ServerRouteHandler | ((req: IncomingMessage, res: ServerResponse, next?: () => void) => any)>) => this;
173
- delete: (path: string, ...handlers: Array<Middleware | ServerRouteHandler | ((req: IncomingMessage, res: ServerResponse, next?: () => void) => any)>) => this;
174
- patch: (path: string, ...handlers: Array<Middleware | ServerRouteHandler | ((req: IncomingMessage, res: ServerResponse, next?: () => void) => any)>) => this;
175
- options: (path: string, ...handlers: Array<Middleware | ServerRouteHandler | ((req: IncomingMessage, res: ServerResponse, next?: () => void) => any)>) => this;
176
- head: (path: string, ...handlers: Array<Middleware | ServerRouteHandler | ((req: IncomingMessage, res: ServerResponse, next?: () => void) => any)>) => this;
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') */
@@ -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.6",
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
@@ -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 - Attempting reconnect...');
70
- setTimeout(() => this.reload(), 1000);
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
- this.reload();
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
- this.reload();
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
  /**