huxy-node-server 1.0.0-beta.2 → 1.0.0-beta.4

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 (3) hide show
  1. package/README.md +3 -1
  2. package/package.json +1 -1
  3. package/src/index.js +192 -167
package/README.md CHANGED
@@ -88,6 +88,7 @@ const server = await startStatic({
88
88
  | `port` | number | 3000 | 服务器端口 |
89
89
  | `host` | string | '0.0.0.0' | 服务器主机 |
90
90
  | `basepath` | string | '/' | 基础路径前缀 |
91
+ | `apiPrefix` | string | '/api' | 基础路径前缀 |
91
92
  | `nodeEnv` | string | 'development' | 运行环境 |
92
93
  | `appName` | string | 'HuxyServer' | 应用名称 |
93
94
 
@@ -151,7 +152,8 @@ const server = await startStatic({
151
152
  NODE_ENV=production
152
153
  PORT=3000
153
154
  HOST=0.0.0.0
154
- BASEPATH=/api
155
+ BASEPATH=/
156
+ API_PREFIX=/api
155
157
  CORS_ORIGIN=http://example.com,http://localhost:3000
156
158
  RATE_LIMIT_WINDOW_MS=900000
157
159
  RATE_LIMIT_MAX_REQUESTS=100
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "huxy-node-server",
3
- "version": "1.0.0-beta.2",
3
+ "version": "1.0.0-beta.4",
4
4
  "description": "一个精炼、高性能的 Express.js 服务器模板,为现代 Node.js 应用程序设计,提供灵活的功能和最佳实践。",
5
5
  "type": "module",
6
6
  "module": "./src/index.js",
package/src/index.js CHANGED
@@ -1,32 +1,32 @@
1
- import T from 'express';
1
+ import E from 'express';
2
2
  import V from 'helmet';
3
- import F from 'cors';
4
- import {rateLimit as K, ipKeyGenerator as W} from 'express-rate-limit';
5
- import z from 'compression';
6
- import X from 'pino-http';
7
- import {createServer as B} from 'node:http';
8
- import k from 'pino';
9
- import w from 'node:os';
10
- import D from 'node:net';
11
- var m = (t = new Date()) => t.toLocaleString('zh-CN', {timeZone: 'Asia/Shanghai', hour12: !1}),
12
- l = t => {
13
- let o = t ? 'https' : 'http',
14
- e = w.networkInterfaces(),
15
- r = [];
16
- return (Object.keys(e).map(i => r.push(...e[i])), r.filter(i => i.family === 'IPv4').map(i => `${o}://${i.address}`));
3
+ import W from 'cors';
4
+ import {rateLimit as K, ipKeyGenerator as z} from 'express-rate-limit';
5
+ import X from 'compression';
6
+ import B from 'pino-http';
7
+ import {createServer as Q} from 'node:http';
8
+ import A from 'pino';
9
+ import M from 'node:os';
10
+ import C from 'node:net';
11
+ var m = (e = new Date()) => e.toLocaleString('zh-CN', {timeZone: 'Asia/Shanghai', hour12: !1}),
12
+ u = e => {
13
+ let r = e ? 'https' : 'http',
14
+ t = M.networkInterfaces(),
15
+ o = [];
16
+ return (Object.keys(t).map(n => o.push(...t[n])), o.filter(n => n.family === 'IPv4').map(n => `${r}://${n.address}`));
17
17
  },
18
- x = t => {
19
- let o = t ?? process.argv.slice(2) ?? [],
20
- e = {};
18
+ x = e => {
19
+ let r = e ?? process.argv.slice(2) ?? [],
20
+ t = {};
21
21
  return (
22
- o.map(r => {
23
- let [n, s] = r.split('=');
24
- e[n] = s;
22
+ r.map(o => {
23
+ let [s, i] = o.split('=');
24
+ t[s] = i;
25
25
  }),
26
- e
26
+ t
27
27
  );
28
28
  },
29
- H = {
29
+ k = {
30
30
  NODE_ENV: 'nodeEnv',
31
31
  PORT: 'port',
32
32
  STATIC_PORT: 'staticPort',
@@ -40,187 +40,212 @@ var m = (t = new Date()) => t.toLocaleString('zh-CN', {timeZone: 'Asia/Shanghai'
40
40
  JWT_SECRET: 'secret',
41
41
  AUTH_TOKEN: 'authToken',
42
42
  },
43
- M = (t, o, e) => {
44
- let [r, n] = t.split('.');
45
- r && n ? (e[r] || (e[r] = {}), (e[r][n] = o)) : (e[r] = o);
43
+ U = (e, r, t) => {
44
+ let [o, s] = e.split('.');
45
+ o && s ? (t[o] || (t[o] = {}), (t[o][s] = r)) : (t[o] = r);
46
46
  },
47
- u = (t = {}, o = H) => {
48
- let {env: e} = process;
49
- Object.keys(o).map(n => {
50
- let s = e[n] ?? t[n];
51
- s && M(o[n], s, t);
47
+ d = (e = {}, r = k) => {
48
+ let {env: t} = process;
49
+ Object.keys(r).map(s => {
50
+ let i = t[s] ?? e[s];
51
+ i && U(r[s], i, e);
52
52
  });
53
- let r = {...t, ...x()};
54
- return ((r.port = r.staticPort || r.port), (r.isDev = r.NODE_ENV === 'development'), r);
53
+ let o = {...e, ...x()};
54
+ return ((o.port = o.staticPort || o.port), (o.isDev = o.NODE_ENV === 'development'), o);
55
55
  },
56
- d = (t, o = '127.0.0.1') =>
57
- new Promise(e => {
58
- let r = D.createServer();
59
- (r.once('error', n => {
60
- (r.close(), e((n.code === 'EADDRINUSE', !1)));
56
+ f = (e, r = '127.0.0.1') =>
57
+ new Promise(t => {
58
+ let o = C.createServer();
59
+ (o.once('error', s => {
60
+ (o.close(), t((s.code === 'EADDRINUSE', !1)));
61
61
  }),
62
- r.once('listening', () => {
63
- (r.close(), e(!0));
62
+ o.once('listening', () => {
63
+ (o.close(), t(!0));
64
64
  }),
65
- r.listen(Number(t), o));
65
+ o.listen(Number(e), r));
66
+ }),
67
+ I = (e, r = {}) => {
68
+ let t = o => {
69
+ (a.warn(`\u6536\u5230 ${o} \u4FE1\u53F7, \u{1F6D1} \u6B63\u5728\u5173\u95ED\u670D\u52A1\u5668...`),
70
+ e.close(async () => {
71
+ (a.info('\u{1F44B} \u670D\u52A1\u5668\u5DF2\u5173\u95ED'), await r.shutdown?.(), process.exit(0));
72
+ }),
73
+ setTimeout(() => {
74
+ (a.error('\u274C \u5F3A\u5236\u5173\u95ED\u670D\u52A1\u5668'), process.exit(1));
75
+ }, 5e3));
76
+ };
77
+ (process.on('SIGTERM', () => t('SIGTERM')),
78
+ process.on('SIGINT', () => t('SIGINT')),
79
+ process.on('uncaughtException', o => {
80
+ (a.fatal(o, `\u{1F4A5} \u672A\u6355\u83B7\u7684\u5F02\u5E38: ${o.message}`), process.exit(1));
81
+ }),
82
+ process.on('unhandledRejection', (o, s) => {
83
+ (a.fatal({reason: o, promise: s}, '\u26A0\uFE0F \u672A\u5904\u7406\u7684 Promise \u62D2\u7EDD'), process.exit(1));
84
+ }));
85
+ },
86
+ y = (e, {port: r, host: t = '0.0.0.0'} = {}) =>
87
+ new Promise((o, s) => {
88
+ let i = l => {
89
+ (c(), s(l));
90
+ },
91
+ n = () => {
92
+ (c(), o(e));
93
+ },
94
+ c = () => {
95
+ (e.off('error', i), e.off('listening', n));
96
+ };
97
+ (e.once('error', i), e.once('listening', n), e.listen(r, t));
66
98
  });
67
99
  import 'dotenv';
68
- var U = {
69
- nodeEnv: 'production',
70
- isDev: !1,
100
+ var G = {
101
+ nodeEnv: process.env.NODE_ENV || 'development',
102
+ isDev: process.env.NODE_ENV === 'development',
71
103
  port: parseInt(process.env.PORT || '3000', 10),
72
104
  host: process.env.HOST || '0.0.0.0',
73
105
  basepath: process.env.BASEPATH || '/',
106
+ apiPrefix: '/api',
74
107
  cors: {origin: process.env.CORS_ORIGIN?.split(',') || '*', credentials: !0},
75
108
  rateLimit: {
76
- windowMs: parseInt(process.env.RATE_LIMIT_WINDOW_MS || '900000', 10),
109
+ windowMs: parseInt(process.env.RATE_LIMIT_WINDOW_MS || '300000', 10),
77
110
  limit: parseInt(process.env.RATE_LIMIT_MAX_REQUESTS || '100', 10),
78
- message: {error: '\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5'},
111
+ message: {message: '\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5'},
79
112
  },
80
113
  helmet: {
81
- contentSecurityPolicy: {directives: {defaultSrc: ["'self'"], styleSrc: ["'self'", "'unsafe-inline'"], scriptSrc: ["'self'"], imgSrc: ["'self'", 'data:', 'https:']}},
114
+ contentSecurityPolicy: {directives: {defaultSrc: ["'self'"], styleSrc: ["'self'", "'unsafe-inline'"], scriptSrc: ["'self'", "'unsafe-eval'"], imgSrc: ["'self'", 'data:', 'https:']}},
82
115
  crossOriginEmbedderPolicy: !1,
83
116
  },
84
117
  logLevel: process.env.LOG_LEVEL || 30,
85
118
  },
86
- f = U;
87
- var c = (t, o) =>
88
- k({
89
- name: t,
90
- level: f.logLevel,
91
- transport: {target: 'pino-pretty', options: {colorize: !0, sync: !0}, ignore: 'pid,hostname,level,time', translateTime: 'UTC:yyyy-mm-dd HH:MM:ss', customColors: 'err:red,info:blue'},
92
- ...o,
93
- }),
94
- P = () => {
95
- let t = c('http-request');
96
- return (o, e, r) => {
97
- let n = Date.now();
98
- (e.on('finish', () => {
99
- let s = Date.now() - n,
100
- i = {method: o.method, url: o.originalUrl, status: e.statusCode, duration: `${s}ms`, ip: o.ip, userAgent: o.get('User-Agent'), timestamp: m()};
101
- e.statusCode >= 500 ? t.error(i, 'HTTP\u8BF7\u6C42\u9519\u8BEF') : e.statusCode >= 400 ? t.warn(i, 'HTTP\u5BA2\u6237\u7AEF\u9519\u8BEF') : t.info(i, 'HTTP\u8BF7\u6C42');
102
- }),
103
- r());
104
- };
119
+ g = G;
120
+ var p = (e, r) =>
121
+ A({
122
+ name: e,
123
+ level: g.logLevel,
124
+ formatters: {level: t => ({level: t})},
125
+ timestamp: A.stdTimeFunctions.isoTime,
126
+ base: null,
127
+ transport: {target: 'pino-pretty', options: {colorize: !0, sync: !0, levelFirst: !0}, ignore: 'pid,hostname,level,time', translateTime: 'SYS:yyyy-mm-dd HH:MM:ss'},
128
+ ...r,
129
+ });
130
+ var a = p('huxy');
131
+ var w = p('error-handler'),
132
+ L = e => (r, t, o) => {
133
+ (w.error({message: 'Not Found', timestamp: m(), url: r.originalUrl, method: r.method, ip: r.ip, userAgent: r.get('User-Agent')}, '\u627E\u4E0D\u5230\u8DEF\u5F84'),
134
+ t.status(404).json({success: !1, timestamp: m(), status: 404, message: `\u8DEF\u7531 ${r.method} ${r.originalUrl} \u4E0D\u5B58\u5728`, url: r.originalUrl}));
105
135
  },
106
- a = c('huxy');
107
- var y = c('error-handler'),
108
- b = t => (o, e, r) => {
109
- (y.error({message: 'Not Found', timestamp: m(), url: o.originalUrl, method: o.method, ip: o.ip, userAgent: o.get('User-Agent')}, '\u627E\u4E0D\u5230\u8DEF\u5F84'),
110
- e.status(404).json({success: !1, timestamp: m(), status: 404, message: `\u8DEF\u7531 ${o.method} ${o.originalUrl} \u4E0D\u5B58\u5728`, url: o.originalUrl}));
111
- },
112
- A = t => (o, e, r, n) => {
113
- let s = o.status || 500,
114
- i = o.message;
115
- (y.error({message: i, timestamp: m(), stack: o.stack, url: e.originalUrl, method: e.method, ip: e.ip, userAgent: e.get('User-Agent')}, '\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF'),
116
- r.status(s).json({success: !1, timestamp: m(), message: t.isDev ? i : '\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF', stack: t.isDev ? o.stack : void 0}));
136
+ b = e => (r, t, o, s) => {
137
+ let i = r.status || 500,
138
+ n = r.message;
139
+ (w.error({message: n, timestamp: m(), stack: r.stack, url: t.originalUrl, method: t.method, ip: t.ip, userAgent: t.get('User-Agent')}, '\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF'),
140
+ o.status(i).json({success: !1, timestamp: m(), message: e.isDev ? n : '\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF', stack: e.isDev ? r.stack : void 0}));
117
141
  };
118
- var L = t => (o, e, r) => {
119
- (o.path.match(/\.(js|css|png|jpe?g|ico|webp|svg|mpeg|webm|m4a)$/) ? e.set('Cache-Control', 'public, max-age=31536000, immutable') : e.set('Cache-Control', 'no-cache'), r());
142
+ var R = e => (r, t, o) => {
143
+ (t.set('Cache-Control', `public, max-age=${e.cacheMaxAge ?? 300}, stale-while-revalidate=60`), o());
120
144
  };
121
145
  import {Router as j} from 'express';
122
- var G = t => {
123
- let o = j();
146
+ var F = e => {
147
+ let r = j();
124
148
  return (
125
- o.use('/health', (e, r) => {
126
- r.status(200).json({status: 'OK', timestamp: m(), uptime: process.uptime(), environment: t.nodeEnv, memoryUsage: process.memoryUsage(), pid: process.pid});
149
+ r.use('/health', (t, o) => {
150
+ o.status(200).json({status: 'OK', timestamp: m(), environment: e.nodeEnv, uptime: process.uptime(), memoryUsage: process.memoryUsage(), pid: process.pid});
127
151
  }),
128
- o.get('/', (e, r) => {
129
- r.status(200).json({message: 'Node.js \u670D\u52A1\u5668\u8FD0\u884C\u4E2D', timestamp: m(), environment: t.nodeEnv});
152
+ r.get('/status', (t, o) => {
153
+ o.status(200).json({message: 'Node.js \u670D\u52A1\u5668\u8FD0\u884C\u4E2D', timestamp: m(), environment: e.nodeEnv});
130
154
  }),
131
- o
155
+ r
132
156
  );
133
157
  },
134
- N = G;
135
- var Q = (t, o = {}) => (
136
- t.disable('x-powered-by'),
137
- t.set('trust proxy', 1),
138
- t.use(V(o.helmet)),
139
- t.use(F(o.cors)),
140
- t.use(K({keyGenerator: e => W(e.ip) || e.headers['x-huxy-auth'] || e.headers['x-api-key'] || e.headers.authorization, ...o.rateLimit})),
141
- t.use(z()),
142
- t.use(T.json({limit: '20mb'})),
143
- t.use(T.urlencoded({extended: !0, limit: '20mb'})),
144
- t.use(X({logger: a, quietReqLogger: !0, autoLogging: !1})),
145
- t.use(P()),
146
- t.use(L(o)),
147
- t
148
- ),
149
- J = t => {
150
- let o = e => {
151
- (a.info(`\u6536\u5230 ${e} \u4FE1\u53F7, \u{1F6D1} \u6B63\u5728\u5173\u95ED\u670D\u52A1\u5668...`),
152
- t.close(() => {
153
- (a.info('\u{1F44B} \u670D\u52A1\u5668\u5DF2\u5173\u95ED'), process.exit(0));
154
- }),
155
- setTimeout(() => {
156
- (a.error('\u274C \u5F3A\u5236\u5173\u95ED\u670D\u52A1\u5668'), process.exit(1));
157
- }, 5e3));
158
- };
159
- (process.on('SIGTERM', () => o('SIGTERM')),
160
- process.on('SIGINT', () => o('SIGINT')),
161
- process.on('uncaughtException', e => {
162
- (a.error(e, `\u672A\u6355\u83B7\u7684\u5F02\u5E38: ${e.message}`), process.exit(1));
163
- }),
164
- process.on('unhandledRejection', (e, r) => {
165
- (a.error({reason: e, promise: r}, '\u672A\u5904\u7406\u7684 Promise \u62D2\u7EDD'), process.exit(1));
166
- }));
158
+ N = F;
159
+ var J = (e, r = {}) => {
160
+ (e.disable('x-powered-by'),
161
+ e.set('trust proxy', 1),
162
+ e.use(B({logger: a, quietReqLogger: !0, autoLogging: !1, genReqId: !1})),
163
+ e.use(X()),
164
+ e.use(V(r.helmet)),
165
+ e.use(W(r.cors)),
166
+ e.use(r.apiPrefix, K({keyGenerator: t => z(t.ip) || t.headers['x-huxy-auth'] || t.headers['x-api-key'] || t.headers.authorization, ...r.rateLimit})),
167
+ e.use(E.json({limit: '20mb'})),
168
+ e.use(E.urlencoded({extended: !0, limit: '20mb'})),
169
+ e.use(r.apiPrefix, R(r)));
170
+ },
171
+ Y = (e, r = {}) => {
172
+ (e.use(N(r)), e.use(L(r)), e.use(b(r)));
167
173
  },
168
- Z = async (t, o) => {
169
- let e = u(t),
170
- {port: r} = e;
171
- (await d(r, e.host)) || ((e.port = Number(r) + 1), a.warn(`\u7AEF\u53E3 ${r} \u5DF2\u88AB\u5360\u7528\uFF0C\u73B0\u5728\u4F7F\u7528\u7AEF\u53E3 ${e.port}`));
172
- let s = T();
173
- Q(s, e);
174
- let i = B(s);
175
- return (o?.(i, s, e), s.use(N(e)), s.use(b(e)), s.use(A(e)), J(i), {app: s, httpServer: i, config: e});
174
+ Z = async (e, r) => {
175
+ let t = d(e),
176
+ {port: o} = t;
177
+ (await f(o, t.host)) || ((t.port = Number(o) + 1), a.warn(`\u7AEF\u53E3 ${o} \u5DF2\u88AB\u5360\u7528\uFF0C\u73B0\u5728\u4F7F\u7528\u7AEF\u53E3 ${t.port}`));
178
+ let i = E();
179
+ J(i, t);
180
+ let n = Q(i);
181
+ I(n, t);
182
+ try {
183
+ await y(n, t);
184
+ } catch {
185
+ (a.error('\u26A0\uFE0F \u670D\u52A1\u5668\u542F\u52A8\u5931\u8D25'), process.exit(1));
186
+ }
187
+ return (await r?.(t, i, n), Y(i, t), {app: i, httpServer: n, config: t});
176
188
  },
177
- R = Z;
178
- var Y = (t, o, e) =>
179
- R({...f, ...t}, (r, n, s) => {
180
- let {port: i, host: p, nodeEnv: h, basepath: I, appName: C = 'HuxyServer'} = s;
181
- r.listen(i, p, () => {
182
- if (!e) {
183
- let $ = l()
184
- .filter(v => v !== `http://${p}`)
185
- .map(v => `http://${v}:${i}${I}`);
186
- (a.info(`-----------------------${C}-----------------------`),
187
- a.info(`\u{1F680} \u670D\u52A1\u8FD0\u884C\u5728\u3010${h}\u3011\u73AF\u5883: http://${p}:${i}${I}`),
188
- a.info(`-----------------[${m()}]------------------`),
189
- a.info({ips: $}, '\u672C\u5730\u5730\u5740\uFF1A'));
190
- }
191
- o?.(s, n, r);
192
- });
189
+ _ = Z;
190
+ var q = (e, r = 56) => {
191
+ let t = e.length,
192
+ o = r - t,
193
+ s = ~~(o / 2);
194
+ return `${'-'.repeat(s)}${e}${'-'.repeat(o - s)}`;
195
+ },
196
+ ee = (e, r, t) =>
197
+ _({...g, ...e}, async (o, s, i) => {
198
+ let {port: n, host: c, nodeEnv: l, basepath: P, appName: D = 'HuxyServer'} = o;
199
+ if (!t) {
200
+ let H = u()
201
+ .filter(v => v !== `http://${c}`)
202
+ .map(v => `http://${v}:${n}${P}`);
203
+ (a.info(q(D)),
204
+ a.info(`\u{1F680} \u670D\u52A1\u8FD0\u884C\u5728\u3010${l}\u3011\u73AF\u5883: http://${c}:${n}${P}`),
205
+ a.info(`-----------------[${m()}]------------------`),
206
+ a.info({ips: H}, '\u672C\u5730\u5730\u5740\uFF1A'));
207
+ }
208
+ await r?.(o, s, i);
193
209
  }),
194
- g = Y;
195
- import oe from 'express';
196
- import {fileURLToPath as q} from 'node:url';
197
- import {dirname as ee, resolve as te} from 'node:path';
198
- var E = (t = import.meta.url) => ee(q(t)),
199
- S = t => te(E(), t),
200
- _ = S;
201
- var re = {port: 9e3, host: 'localhost', basepath: '/', buildPath: './build'},
202
- se = (t, o) =>
203
- g({...re, ...t}, (e, r, n) => {
204
- let {basepath: s, buildPath: i} = e;
205
- (r.use(s, oe.static(i, {maxAge: '1y', immutable: !0})),
206
- r.get(`${s}/{*splat}`.replace('//', '/'), (p, h) => {
207
- h.sendFile(_(i, 'index.html'));
210
+ h = ee;
211
+ import se from 'express';
212
+ import {fileURLToPath as te} from 'node:url';
213
+ import {dirname as oe, resolve as re} from 'node:path';
214
+ var T = (e = import.meta.url) => oe(te(e)),
215
+ S = e => re(T(), e),
216
+ $ = S;
217
+ var ne = {port: 9e3, host: 'localhost', basepath: '/', buildPath: './build'},
218
+ ie = (e, r) =>
219
+ h({...ne, ...e}, async (t, o, s) => {
220
+ let {basepath: i, buildPath: n} = t;
221
+ (o.use(
222
+ i,
223
+ se.static(n, {
224
+ maxAge: '1y',
225
+ immutable: !0,
226
+ setHeaders: (c, l) => {
227
+ l.endsWith('.html') && c.setHeader('Cache-Control', 'no-cache, must-revalidate');
228
+ },
229
+ }),
230
+ ),
231
+ o.get(`${i}/{*splat}`.replace('//', '/'), (c, l) => {
232
+ l.sendFile($(n, 'index.html'));
208
233
  }),
209
- o?.(e, r, n));
234
+ await r?.(t, o, s));
210
235
  }),
211
- O = se;
212
- var Ye = {startServer: g, startStatic: O, logger: a, createLogger: c, dateTime: m, localIPs: l, nodeArgs: x, getEnvConfig: u, checkPort: d, getDirName: E, resolvePath: S};
236
+ O = ie;
237
+ var tt = {startServer: h, startStatic: O, logger: a, createLogger: p, dateTime: m, localIPs: u, nodeArgs: x, getEnvConfig: d, checkPort: f, getDirName: T, resolvePath: S};
213
238
  export {
214
- d as checkPort,
215
- c as createLogger,
239
+ f as checkPort,
240
+ p as createLogger,
216
241
  m as dateTime,
217
- Ye as default,
218
- E as getDirName,
219
- u as getEnvConfig,
220
- l as localIPs,
242
+ tt as default,
243
+ T as getDirName,
244
+ d as getEnvConfig,
245
+ u as localIPs,
221
246
  a as logger,
222
247
  x as nodeArgs,
223
248
  S as resolvePath,
224
- g as startServer,
249
+ h as startServer,
225
250
  O as startStatic,
226
251
  };