elit 3.6.5 → 3.6.6

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.
@@ -0,0 +1,87 @@
1
+ import {createRequire as __createRequire} from 'module';const require = __createRequire(import.meta.url);
2
+
3
+ // src/smtp-server.ts
4
+ import { SMTPServer } from "smtp-server";
5
+ var DEFAULT_SMTP_PORT = 2525;
6
+ var DEFAULT_SMTP_HOST = "127.0.0.1";
7
+ function resolveSmtpServerConfig(config = {}) {
8
+ const { port = DEFAULT_SMTP_PORT, host = DEFAULT_SMTP_HOST, label, ...serverOptions } = config;
9
+ return {
10
+ ...serverOptions,
11
+ port,
12
+ host,
13
+ label
14
+ };
15
+ }
16
+ function normalizeSmtpServerConfigs(input) {
17
+ const configs = Array.isArray(input) ? input : input ? [input] : [];
18
+ return configs.map((config) => resolveSmtpServerConfig(config));
19
+ }
20
+ function closeSmtpServer(server) {
21
+ return new Promise((resolve, reject) => {
22
+ let settled = false;
23
+ const finish = (error) => {
24
+ if (settled) {
25
+ return;
26
+ }
27
+ settled = true;
28
+ if (error) {
29
+ reject(error);
30
+ return;
31
+ }
32
+ resolve();
33
+ };
34
+ const handleCloseError = (error) => {
35
+ const errorCode = error.code;
36
+ if (errorCode === "ERR_SERVER_NOT_RUNNING") {
37
+ finish();
38
+ return;
39
+ }
40
+ finish(error);
41
+ };
42
+ try {
43
+ server.close(() => finish());
44
+ } catch (error) {
45
+ handleCloseError(error);
46
+ }
47
+ });
48
+ }
49
+ function createSmtpServer(config = {}) {
50
+ const resolvedConfig = resolveSmtpServerConfig(config);
51
+ const { port, host, label: _label, ...serverOptions } = resolvedConfig;
52
+ const server = new SMTPServer(serverOptions);
53
+ return {
54
+ server,
55
+ config: resolvedConfig,
56
+ listen(callback) {
57
+ return callback ? server.listen(port, host, callback) : server.listen(port, host);
58
+ },
59
+ address() {
60
+ return server.server.address();
61
+ },
62
+ close() {
63
+ return closeSmtpServer(server);
64
+ }
65
+ };
66
+ }
67
+ function startSmtpServer(config = {}) {
68
+ const handle = createSmtpServer(config);
69
+ handle.listen();
70
+ return handle;
71
+ }
72
+ var smtp_server_default = {
73
+ SMTPServer,
74
+ createSmtpServer,
75
+ startSmtpServer,
76
+ DEFAULT_SMTP_HOST,
77
+ DEFAULT_SMTP_PORT
78
+ };
79
+ export {
80
+ DEFAULT_SMTP_HOST,
81
+ DEFAULT_SMTP_PORT,
82
+ createSmtpServer,
83
+ smtp_server_default as default,
84
+ normalizeSmtpServerConfigs,
85
+ resolveSmtpServerConfig,
86
+ startSmtpServer
87
+ };
package/dist/state.cjs CHANGED
@@ -468,6 +468,7 @@ var DomNode = class {
468
468
  html += `</${tagName}>${newLine}`;
469
469
  return html;
470
470
  }
471
+ const isRawText = tagName === "script" || tagName === "style";
471
472
  if (children && children.length > 0) {
472
473
  const resolvedChildren = children.map((c) => {
473
474
  const resolved = this.resolveStateValue(c);
@@ -483,11 +484,11 @@ var DomNode = class {
483
484
  if (Array.isArray(child)) {
484
485
  for (const c of child) {
485
486
  if (!shouldSkipChild(c)) {
486
- html += this.renderToString(c, { pretty, indent: indent + 1 });
487
+ html += isRawText && typeof c === "string" ? c : this.renderToString(c, { pretty, indent: indent + 1 });
487
488
  }
488
489
  }
489
490
  } else {
490
- html += this.renderToString(child, { pretty, indent: indent + 1 });
491
+ html += isRawText && typeof child === "string" ? child : this.renderToString(child, { pretty, indent: indent + 1 });
491
492
  }
492
493
  }
493
494
  html += indentStr;
@@ -497,11 +498,11 @@ var DomNode = class {
497
498
  if (Array.isArray(child)) {
498
499
  for (const c of child) {
499
500
  if (!shouldSkipChild(c)) {
500
- html += this.renderToString(c, { pretty: false, indent: 0 });
501
+ html += isRawText && typeof c === "string" ? c : this.renderToString(c, { pretty: false, indent: 0 });
501
502
  }
502
503
  }
503
504
  } else {
504
- html += this.renderToString(child, { pretty: false, indent: 0 });
505
+ html += isRawText && typeof child === "string" ? child : this.renderToString(child, { pretty: false, indent: 0 });
505
506
  }
506
507
  }
507
508
  }
package/dist/state.d.ts CHANGED
@@ -3,6 +3,8 @@ import 'node:events';
3
3
  import 'events';
4
4
  import 'http';
5
5
  import 'ws';
6
+ import 'net';
7
+ import 'smtp-server';
6
8
 
7
9
  /**
8
10
  * Elit - State Management
package/dist/state.js CHANGED
@@ -426,6 +426,7 @@
426
426
  html += `</${tagName}>${newLine}`;
427
427
  return html;
428
428
  }
429
+ const isRawText = tagName === "script" || tagName === "style";
429
430
  if (children && children.length > 0) {
430
431
  const resolvedChildren = children.map((c) => {
431
432
  const resolved = this.resolveStateValue(c);
@@ -441,11 +442,11 @@
441
442
  if (Array.isArray(child)) {
442
443
  for (const c of child) {
443
444
  if (!shouldSkipChild(c)) {
444
- html += this.renderToString(c, { pretty, indent: indent + 1 });
445
+ html += isRawText && typeof c === "string" ? c : this.renderToString(c, { pretty, indent: indent + 1 });
445
446
  }
446
447
  }
447
448
  } else {
448
- html += this.renderToString(child, { pretty, indent: indent + 1 });
449
+ html += isRawText && typeof child === "string" ? child : this.renderToString(child, { pretty, indent: indent + 1 });
449
450
  }
450
451
  }
451
452
  html += indentStr;
@@ -455,11 +456,11 @@
455
456
  if (Array.isArray(child)) {
456
457
  for (const c of child) {
457
458
  if (!shouldSkipChild(c)) {
458
- html += this.renderToString(c, { pretty: false, indent: 0 });
459
+ html += isRawText && typeof c === "string" ? c : this.renderToString(c, { pretty: false, indent: 0 });
459
460
  }
460
461
  }
461
462
  } else {
462
- html += this.renderToString(child, { pretty: false, indent: 0 });
463
+ html += isRawText && typeof child === "string" ? child : this.renderToString(child, { pretty: false, indent: 0 });
463
464
  }
464
465
  }
465
466
  }
package/dist/state.mjs CHANGED
@@ -424,6 +424,7 @@ var DomNode = class {
424
424
  html += `</${tagName}>${newLine}`;
425
425
  return html;
426
426
  }
427
+ const isRawText = tagName === "script" || tagName === "style";
427
428
  if (children && children.length > 0) {
428
429
  const resolvedChildren = children.map((c) => {
429
430
  const resolved = this.resolveStateValue(c);
@@ -439,11 +440,11 @@ var DomNode = class {
439
440
  if (Array.isArray(child)) {
440
441
  for (const c of child) {
441
442
  if (!shouldSkipChild(c)) {
442
- html += this.renderToString(c, { pretty, indent: indent + 1 });
443
+ html += isRawText && typeof c === "string" ? c : this.renderToString(c, { pretty, indent: indent + 1 });
443
444
  }
444
445
  }
445
446
  } else {
446
- html += this.renderToString(child, { pretty, indent: indent + 1 });
447
+ html += isRawText && typeof child === "string" ? child : this.renderToString(child, { pretty, indent: indent + 1 });
447
448
  }
448
449
  }
449
450
  html += indentStr;
@@ -453,11 +454,11 @@ var DomNode = class {
453
454
  if (Array.isArray(child)) {
454
455
  for (const c of child) {
455
456
  if (!shouldSkipChild(c)) {
456
- html += this.renderToString(c, { pretty: false, indent: 0 });
457
+ html += isRawText && typeof c === "string" ? c : this.renderToString(c, { pretty: false, indent: 0 });
457
458
  }
458
459
  }
459
460
  } else {
460
- html += this.renderToString(child, { pretty: false, indent: 0 });
461
+ html += isRawText && typeof child === "string" ? child : this.renderToString(child, { pretty: false, indent: 0 });
461
462
  }
462
463
  }
463
464
  }
package/dist/types.d.ts CHANGED
@@ -1,7 +1,9 @@
1
1
  import { EventEmitter } from 'node:events';
2
2
  import { EventEmitter as EventEmitter$1 } from 'events';
3
- import { Server } from 'http';
3
+ import { Server as Server$1 } from 'http';
4
4
  import { WebSocketServer } from 'ws';
5
+ import { Server, AddressInfo } from 'net';
6
+ import { SMTPServerOptions, SMTPServer } from 'smtp-server';
5
7
 
6
8
  /**
7
9
  * HTTP module with unified API across runtimes
@@ -238,6 +240,28 @@ declare class StateManager$1 {
238
240
  clear(): void;
239
241
  }
240
242
 
243
+ /**
244
+ * SMTP server helpers built on top of the smtp-server package.
245
+ */
246
+
247
+ interface ElitSMTPServerConfig extends SMTPServerOptions {
248
+ port?: number;
249
+ host?: string;
250
+ label?: string;
251
+ }
252
+ interface ResolvedElitSMTPServerConfig extends SMTPServerOptions {
253
+ port: number;
254
+ host: string;
255
+ label?: string;
256
+ }
257
+ interface ElitSMTPServerHandle {
258
+ server: SMTPServer;
259
+ config: ResolvedElitSMTPServerConfig;
260
+ listen(callback?: () => void): Server;
261
+ address(): AddressInfo | string | null;
262
+ close(): Promise<void>;
263
+ }
264
+
241
265
  /**
242
266
  * Elit - Types and Interfaces
243
267
  */
@@ -342,6 +366,8 @@ interface ClientConfig {
342
366
  api?: Router;
343
367
  /** WebSocket endpoints specific to this client */
344
368
  ws?: WebSocketEndpointConfig[];
369
+ /** SMTP listeners specific to this client */
370
+ smtp?: ElitSMTPServerConfig | ElitSMTPServerConfig[];
345
371
  /** Server mode: 'dev' uses source files, 'preview' uses built files (default: 'dev') */
346
372
  mode?: 'dev' | 'preview';
347
373
  }
@@ -400,6 +426,8 @@ interface DevServerOptions {
400
426
  api?: Router;
401
427
  /** WebSocket endpoints */
402
428
  ws?: WebSocketEndpointConfig[];
429
+ /** SMTP listeners started alongside the HTTP server */
430
+ smtp?: ElitSMTPServerConfig | ElitSMTPServerConfig[];
403
431
  /** SSR render function - returns HTML VNode or string */
404
432
  ssr?: () => Child | string;
405
433
  /** Proxy configuration for API requests */
@@ -417,9 +445,11 @@ interface DevServerOptions {
417
445
  }
418
446
  interface DevServer {
419
447
  /** HTTP server instance */
420
- server: Server;
448
+ server: Server$1;
421
449
  /** WebSocket server for HMR */
422
450
  wss: WebSocketServer;
451
+ /** Managed SMTP listeners started from dev or preview config */
452
+ smtpServers: ElitSMTPServerHandle[];
423
453
  /** Server URL */
424
454
  url: string;
425
455
  /** Shared state manager */
@@ -517,6 +547,8 @@ interface PreviewOptions {
517
547
  api?: Router;
518
548
  /** WebSocket endpoints */
519
549
  ws?: WebSocketEndpointConfig[];
550
+ /** SMTP listeners started alongside the preview server */
551
+ smtp?: ElitSMTPServerConfig | ElitSMTPServerConfig[];
520
552
  /** SSR render function - returns HTML VNode or string */
521
553
  ssr?: () => Child | string;
522
554
  /** Proxy configuration for API requests */
@@ -3,6 +3,8 @@ import 'node:events';
3
3
  import 'events';
4
4
  import 'http';
5
5
  import 'ws';
6
+ import 'net';
7
+ import 'smtp-server';
6
8
 
7
9
  type UniversalPayload = string | number | boolean | null | UniversalPayload[] | {
8
10
  [key: string]: UniversalPayload;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "elit",
3
- "version": "3.6.5",
3
+ "version": "3.6.6",
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",
@@ -95,6 +95,12 @@
95
95
  "import": "./dist/https.mjs",
96
96
  "require": "./dist/https.cjs"
97
97
  },
98
+ "./smtp-server": {
99
+ "types": "./dist/smtp-server.d.ts",
100
+ "browser": "./dist/smtp-server.js",
101
+ "import": "./dist/smtp-server.mjs",
102
+ "require": "./dist/smtp-server.cjs"
103
+ },
98
104
  "./ws": {
99
105
  "types": "./dist/ws.d.ts",
100
106
  "browser": "./dist/ws.js",
@@ -257,12 +263,14 @@
257
263
  "esbuild": "^0.27.3",
258
264
  "esbuild-obfuscator-plugin": "^0.0.5",
259
265
  "open": "^11.0.0",
266
+ "smtp-server": "^3.18.4",
260
267
  "source-map": "^0.7.6"
261
268
  },
262
269
  "devDependencies": {
263
270
  "@types/bun": "^1.3.6",
264
271
  "@types/mime-types": "^2.1.4",
265
272
  "@types/node": "^25.0.10",
273
+ "@types/smtp-server": "^3.5.13",
266
274
  "@types/ws": "^8.5.13",
267
275
  "copyfiles": "^2.4.1",
268
276
  "elysia": "^1.4.19",