huxy-node-server 1.0.0-beta.6 → 1.0.0-beta.7

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/example.js +1 -1
  2. package/package.json +1 -1
  3. package/src/index.js +158 -158
package/example.js CHANGED
@@ -12,7 +12,7 @@ const {app, config, httpServer} = await startServer({
12
12
  port: 8080,
13
13
  host: 'localhost',
14
14
  // ...
15
- }, (config, app, httpServer) => {
15
+ }, (config, app, httpServer, logger) => {
16
16
  app.get('/config', (req, res) => {
17
17
  logger.info('详细配置:', config);
18
18
  res.status(200).json({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "huxy-node-server",
3
- "version": "1.0.0-beta.6",
3
+ "version": "1.0.0-beta.7",
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 E from 'express';
2
- import V from 'helmet';
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(i => o.push(...t[i])), o.filter(i => i.family === 'IPv4').map(i => `${r}://${i.address}`));
1
+ import T from 'express';
2
+ import W from 'helmet';
3
+ import K from 'cors';
4
+ import {rateLimit as z, ipKeyGenerator as X} from 'express-rate-limit';
5
+ import B from 'compression';
6
+ import Q from 'pino-http';
7
+ import {createServer as J} from 'node:http';
8
+ import w from 'pino';
9
+ import C from 'node:os';
10
+ import k from 'node:net';
11
+ var c = (e = new Date()) => e.toLocaleString('zh-CN', {timeZone: 'Asia/Shanghai', hour12: !1}),
12
+ d = e => {
13
+ let o = e ? 'https' : 'http',
14
+ t = C.networkInterfaces(),
15
+ r = [];
16
+ return (Object.keys(t).map(n => r.push(...t[n])), r.filter(n => n.family === 'IPv4').map(n => `${o}://${n.address}`));
17
17
  },
18
- x = e => {
19
- let r = e ?? process.argv.slice(2) ?? [],
18
+ E = e => {
19
+ let o = e ?? process.argv.slice(2) ?? [],
20
20
  t = {};
21
21
  return (
22
- r.map(o => {
23
- let [s, n] = o.split('=');
24
- t[s] = n;
22
+ o.map(r => {
23
+ let [s, a] = r.split('=');
24
+ t[s] = a;
25
25
  }),
26
26
  t
27
27
  );
28
28
  },
29
- k = {
29
+ U = {
30
30
  NODE_ENV: 'nodeEnv',
31
31
  PORT: 'port',
32
32
  STATIC_PORT: 'staticPort',
@@ -40,64 +40,64 @@ var m = (e = new Date()) => e.toLocaleString('zh-CN', {timeZone: 'Asia/Shanghai'
40
40
  JWT_SECRET: 'secret',
41
41
  AUTH_TOKEN: 'authToken',
42
42
  },
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);
43
+ G = (e, o, t) => {
44
+ let [r, s] = e.split('.');
45
+ r && s ? (t[r] || (t[r] = {}), (t[r][s] = o)) : (t[r] = o);
46
46
  },
47
- d = (e = {}, r = k) => {
47
+ f = (e = {}, o = U) => {
48
48
  let {env: t} = process;
49
- Object.keys(r).map(s => {
50
- let n = t[s] ?? e[s];
51
- n && U(r[s], n, e);
49
+ Object.keys(o).map(s => {
50
+ let a = t[s] ?? e[s];
51
+ a && G(o[s], a, e);
52
52
  });
53
- let o = {...e, ...x()};
54
- return ((o.port = o.staticPort || o.port), (o.isDev = o.NODE_ENV === 'development'), o);
53
+ let r = {...e, ...E()};
54
+ return ((r.port = r.staticPort || r.port), (r.isDev = r.NODE_ENV === 'development'), r);
55
55
  },
56
- f = (e, r = '127.0.0.1') =>
56
+ h = (e, o = '127.0.0.1') =>
57
57
  new Promise(t => {
58
- let o = C.createServer();
59
- (o.once('error', s => {
60
- (o.close(), t((s.code === 'EADDRINUSE', !1)));
58
+ let r = k.createServer();
59
+ (r.once('error', s => {
60
+ (r.close(), t((s.code === 'EADDRINUSE', !1)));
61
61
  }),
62
- o.once('listening', () => {
63
- (o.close(), t(!0));
62
+ r.once('listening', () => {
63
+ (r.close(), t(!0));
64
64
  }),
65
- o.listen(Number(e), r));
65
+ r.listen(Number(e), o));
66
66
  }),
67
- y = (e, r = {}) => {
68
- let t = o => {
69
- (a.warn(`\u6536\u5230 ${o} \u4FE1\u53F7, \u{1F6D1} \u6B63\u5728\u5173\u95ED\u670D\u52A1\u5668...`),
67
+ I = (e, o = {}, t) => {
68
+ let r = s => {
69
+ (t.warn(`\u6536\u5230 ${s} \u4FE1\u53F7, \u{1F6D1} \u6B63\u5728\u5173\u95ED\u670D\u52A1\u5668...`),
70
70
  e.close(async () => {
71
- (a.info('\u{1F44B} \u670D\u52A1\u5668\u5DF2\u5173\u95ED'), await r.shutdown?.(), process.exit(0));
71
+ (t.info('\u{1F44B} \u670D\u52A1\u5668\u5DF2\u5173\u95ED'), await o.shutdown?.(), process.exit(0));
72
72
  }),
73
73
  setTimeout(() => {
74
- (a.error('\u274C \u5F3A\u5236\u5173\u95ED\u670D\u52A1\u5668'), process.exit(1));
74
+ (t.error('\u274C \u5F3A\u5236\u5173\u95ED\u670D\u52A1\u5668'), process.exit(1));
75
75
  }, 5e3));
76
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));
77
+ (process.on('SIGTERM', () => r('SIGTERM')),
78
+ process.on('SIGINT', () => r('SIGINT')),
79
+ process.on('uncaughtException', s => {
80
+ (t.fatal(s, `\u{1F4A5} \u672A\u6355\u83B7\u7684\u5F02\u5E38: ${s.message}`), process.exit(1));
81
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));
82
+ process.on('unhandledRejection', (s, a) => {
83
+ (t.fatal({reason: s, promise: a}, '\u26A0\uFE0F \u672A\u5904\u7406\u7684 Promise \u62D2\u7EDD'), process.exit(1));
84
84
  }));
85
85
  },
86
- I = (e, {port: r, host: t = '0.0.0.0'} = {}) =>
87
- new Promise((o, s) => {
88
- let n = l => {
89
- (c(), s(l));
86
+ A = (e, {port: o, host: t = '0.0.0.0'} = {}) =>
87
+ new Promise((r, s) => {
88
+ let a = p => {
89
+ (i(), s(p));
90
90
  },
91
- i = () => {
92
- (c(), o(e));
91
+ n = () => {
92
+ (i(), r(e));
93
93
  },
94
- c = () => {
95
- (e.off('error', n), e.off('listening', i));
94
+ i = () => {
95
+ (e.off('error', a), e.off('listening', n));
96
96
  };
97
- (e.once('error', n), e.once('listening', i), e.listen(r, t));
97
+ (e.once('error', a), e.once('listening', n), e.listen(o, t));
98
98
  });
99
99
  import 'dotenv';
100
- var G = {
100
+ var j = {
101
101
  nodeEnv: process.env.NODE_ENV || 'development',
102
102
  isDev: process.env.NODE_ENV === 'development',
103
103
  port: parseInt(process.env.PORT || '3000', 10),
@@ -116,141 +116,141 @@ var G = {
116
116
  },
117
117
  logLevel: process.env.LOG_LEVEL || 30,
118
118
  },
119
- g = G;
120
- var p = (e, r) =>
121
- A({
119
+ g = j;
120
+ var u = (e, o) =>
121
+ w({
122
122
  name: e,
123
123
  level: g.logLevel,
124
124
  formatters: {level: t => ({level: t})},
125
- timestamp: A.stdTimeFunctions.isoTime,
125
+ timestamp: w.stdTimeFunctions.isoTime,
126
126
  base: null,
127
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,
128
+ ...o,
129
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}));
130
+ var m = u('huxy');
131
+ var L = u('error-handler'),
132
+ b = e => (o, t, r) => {
133
+ (L.error({message: 'Not Found', timestamp: c(), url: o.originalUrl, method: o.method, ip: o.ip, userAgent: o.get('User-Agent')}, '\u627E\u4E0D\u5230\u8DEF\u5F84'),
134
+ t.status(404).json({success: !1, timestamp: c(), status: 404, message: `\u8DEF\u7531 ${o.method} ${o.originalUrl} \u4E0D\u5B58\u5728`, url: o.originalUrl}));
135
135
  },
136
- b = e => (r, t, o, s) => {
137
- let n = r.status || 500,
138
- i = r.message;
139
- (w.error({message: i, 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(n).json({success: !1, timestamp: m(), message: e.isDev ? i : '\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF', stack: e.isDev ? r.stack : void 0}));
136
+ R = e => (o, t, r, s) => {
137
+ let a = o.status || 500,
138
+ n = o.message;
139
+ (L.error({message: n, timestamp: c(), stack: o.stack, url: t.originalUrl, method: t.method, ip: t.ip, userAgent: t.get('User-Agent')}, '\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF'),
140
+ r.status(a).json({success: !1, timestamp: c(), message: e.isDev ? n : '\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF', stack: e.isDev ? o.stack : void 0}));
141
141
  };
142
- var R = e => (r, t, o) => {
143
- (t.set('Cache-Control', `public, max-age=${e.cacheMaxAge ?? 300}, stale-while-revalidate=60`), o());
142
+ var N = e => (o, t, r) => {
143
+ (t.set('Cache-Control', `public, max-age=${e.cacheMaxAge ?? 300}, stale-while-revalidate=60`), r());
144
144
  };
145
- import {Router as j} from 'express';
146
- var F = e => {
147
- let r = j();
145
+ import {Router as F} from 'express';
146
+ var V = e => {
147
+ let o = F();
148
148
  return (
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});
149
+ o.use('/health', (t, r) => {
150
+ r.status(200).json({status: 'OK', timestamp: c(), environment: e.nodeEnv, uptime: process.uptime(), memoryUsage: process.memoryUsage(), pid: process.pid});
151
151
  }),
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});
152
+ o.get('/status', (t, r) => {
153
+ r.status(200).json({message: 'Node.js \u670D\u52A1\u5668\u8FD0\u884C\u4E2D', timestamp: c(), environment: e.nodeEnv});
154
154
  }),
155
- r
155
+ o
156
156
  );
157
157
  },
158
- N = F;
159
- var J = (e, r = {}) => {
158
+ _ = V;
159
+ var Y = (e, o = {}) => {
160
160
  (e.disable('x-powered-by'),
161
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)));
162
+ e.use(Q({logger: m, quietReqLogger: !0, autoLogging: !1, genReqId: !1})),
163
+ e.use(B()),
164
+ e.use(W(o.helmet)),
165
+ e.use(K(o.cors)),
166
+ e.use(o.apiPrefix, z({keyGenerator: t => X(t.ip) || t.headers['x-huxy-auth'] || t.headers['x-api-key'] || t.headers.authorization, ...o.rateLimit})),
167
+ e.use(T.json({limit: '20mb'})),
168
+ e.use(T.urlencoded({extended: !0, limit: '20mb'})),
169
+ e.use(o.apiPrefix, N(o)));
170
170
  },
171
- Y = (e, r = {}) => {
172
- (e.use(N(r)), e.use(L(r)), e.use(b(r)));
171
+ Z = (e, o = {}) => {
172
+ (e.use(_(o)), e.use(b(o)), e.use(R(o)));
173
173
  },
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 n = E();
179
- J(n, t);
180
- let i = Q(n);
181
- y(i, t);
174
+ q = async (e, o) => {
175
+ let t = f(e),
176
+ {port: r} = t;
177
+ (await h(r, t.host)) || ((t.port = Number(r) + 1), m.warn(`\u7AEF\u53E3 ${r} \u5DF2\u88AB\u5360\u7528\uFF0C\u73B0\u5728\u4F7F\u7528\u7AEF\u53E3 ${t.port}`));
178
+ let a = T();
179
+ Y(a, t);
180
+ let n = J(a);
181
+ I(n, t, m);
182
182
  try {
183
- await I(i, t);
184
- } catch (c) {
185
- (a.error({err: c}, '\u26A0\uFE0F \u670D\u52A1\u5668\u542F\u52A8\u5931\u8D25'), process.exit(1));
183
+ await A(n, t);
184
+ } catch (i) {
185
+ (m.error({err: i}, '\u26A0\uFE0F \u670D\u52A1\u5668\u542F\u52A8\u5931\u8D25'), process.exit(1));
186
186
  }
187
187
  try {
188
- await r?.(t, n, i);
189
- } catch (c) {
190
- (a.error({err: c}, `\u56DE\u8C03\u51FD\u6570\u9519\u8BEF\uFF1A${c.message}`), process.exit(1));
188
+ await o?.(t, a, n, m);
189
+ } catch (i) {
190
+ (m.error({err: i}, `\u56DE\u8C03\u51FD\u6570\u9519\u8BEF\uFF1A${i.message}`), process.exit(1));
191
191
  }
192
- return (Y(n, t), {app: n, httpServer: i, config: t});
192
+ return (Z(a, t), {app: a, httpServer: n, config: t, logger: m});
193
193
  },
194
- _ = Z;
195
- var q = (e, r = 56) => {
194
+ $ = q;
195
+ var ee = (e, o = 56) => {
196
196
  let t = e.length,
197
- o = r - t,
198
- s = ~~(o / 2);
199
- return `${'-'.repeat(s)}${e}${'-'.repeat(o - s)}`;
197
+ r = o - t,
198
+ s = ~~(r / 2);
199
+ return `${'-'.repeat(s)}${e}${'-'.repeat(r - s)}`;
200
200
  },
201
- ee = (e, r, t) =>
202
- _({...g, ...e}, async (o, s, n) => {
203
- let {port: i, host: c, nodeEnv: l, basepath: P, appName: D = 'HuxyServer'} = o;
201
+ te = (e, o, t) =>
202
+ $({...g, ...e}, async (r, s, a, n) => {
203
+ let {port: i, host: p, nodeEnv: l, basepath: y, appName: H = 'HuxyServer'} = r;
204
204
  if (!t) {
205
- let H = u()
206
- .filter(v => v !== `http://${c}`)
207
- .map(v => `http://${v}:${i}${P}`);
208
- (a.info(q(D)),
209
- a.info(`\u{1F680} \u670D\u52A1\u8FD0\u884C\u5728\u3010${l}\u3011\u73AF\u5883: http://${c}:${i}${P}`),
210
- a.info(`-----------------[${m()}]------------------`),
211
- a.info({ips: H}, '\u672C\u5730\u5730\u5740\uFF1A'));
205
+ let M = d()
206
+ .filter(x => x !== `http://${p}`)
207
+ .map(x => `http://${x}:${i}${y}`);
208
+ (n.info(ee(H)),
209
+ n.info(`\u{1F680} \u670D\u52A1\u8FD0\u884C\u5728\u3010${l}\u3011\u73AF\u5883: http://${p}:${i}${y}`),
210
+ n.info(`-----------------[${c()}]------------------`),
211
+ n.info({ips: M}, '\u672C\u5730\u5730\u5740\uFF1A'));
212
212
  }
213
- await r?.(o, s, n);
213
+ await o?.(r, s, a, n);
214
214
  }),
215
- h = ee;
216
- import se from 'express';
217
- import {fileURLToPath as te} from 'node:url';
218
- import {dirname as oe, resolve as re} from 'node:path';
219
- var T = (e = import.meta.url) => oe(te(e)),
220
- S = e => re(T(), e),
221
- $ = S;
222
- var ie = {port: 9e3, host: 'localhost', basepath: '/', buildPath: './build'},
223
- ne = (e, r) =>
224
- h({...ie, ...e}, async (t, o, s) => {
225
- await r?.(t, o, s);
215
+ v = te;
216
+ import ne from 'express';
217
+ import {fileURLToPath as oe} from 'node:url';
218
+ import {dirname as re, resolve as se} from 'node:path';
219
+ var S = (e = import.meta.url) => re(oe(e)),
220
+ P = e => se(S(), e),
221
+ O = P;
222
+ var ae = {port: 9e3, host: 'localhost', basepath: '/', buildPath: './build'},
223
+ ie = (e, o) =>
224
+ v({...ae, ...e}, async (t, r, s, a) => {
225
+ await o?.(t, r, s, a);
226
226
  let {basepath: n, buildPath: i} = t;
227
- (o.use(
227
+ (r.use(
228
228
  n,
229
- se.static(i, {
229
+ ne.static(i, {
230
230
  maxAge: '1y',
231
231
  immutable: !0,
232
- setHeaders: (c, l) => {
233
- l.endsWith('.html') && c.setHeader('Cache-Control', 'no-cache, must-revalidate');
232
+ setHeaders: (p, l) => {
233
+ l.endsWith('.html') && p.setHeader('Cache-Control', 'no-cache, must-revalidate');
234
234
  },
235
235
  }),
236
236
  ),
237
- o.get(`${n}/{*splat}`.replace('//', '/'), (c, l) => {
238
- l.sendFile($(i, 'index.html'));
237
+ r.get(`${n}/{*splat}`.replace('//', '/'), (p, l) => {
238
+ l.sendFile(O(i, 'index.html'));
239
239
  }));
240
240
  }),
241
- O = ne;
242
- var tt = {startServer: h, startStatic: O, logger: a, createLogger: p, dateTime: m, localIPs: u, nodeArgs: x, getEnvConfig: d, checkPort: f, getDirName: T, resolvePath: S};
241
+ D = ie;
242
+ var Ze = {startServer: v, startStatic: D, logger: m, createLogger: u, dateTime: c, localIPs: d, nodeArgs: E, getEnvConfig: f, checkPort: h, getDirName: S, resolvePath: P};
243
243
  export {
244
- f as checkPort,
245
- p as createLogger,
246
- m as dateTime,
247
- tt as default,
248
- T as getDirName,
249
- d as getEnvConfig,
250
- u as localIPs,
251
- a as logger,
252
- x as nodeArgs,
253
- S as resolvePath,
254
- h as startServer,
255
- O as startStatic,
244
+ h as checkPort,
245
+ u as createLogger,
246
+ c as dateTime,
247
+ Ze as default,
248
+ S as getDirName,
249
+ f as getEnvConfig,
250
+ d as localIPs,
251
+ m as logger,
252
+ E as nodeArgs,
253
+ P as resolvePath,
254
+ v as startServer,
255
+ D as startStatic,
256
256
  };