huxy-node-server 1.0.5 → 1.0.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.
Files changed (2) hide show
  1. package/package.json +2 -2
  2. package/src/index.js +139 -138
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "huxy-node-server",
3
- "version": "1.0.5",
3
+ "version": "1.0.6",
4
4
  "description": "一个精炼、高性能的 Express.js 服务器模板,为现代 Node.js 应用程序设计,提供灵活的功能和最佳实践。",
5
5
  "type": "module",
6
6
  "module": "./src/index.js",
@@ -40,7 +40,7 @@
40
40
  "express": "^5.2.1",
41
41
  "express-rate-limit": "^8.2.1",
42
42
  "helmet": "^8.1.0",
43
- "pino": "^10.1.1",
43
+ "pino": "^10.2.0",
44
44
  "pino-http": "^11.0.0",
45
45
  "pino-pretty": "^13.1.3"
46
46
  },
package/src/index.js CHANGED
@@ -1,28 +1,28 @@
1
- import y from 'express';
2
- import X from 'helmet';
3
- import Q from 'cors';
4
- import {rateLimit as J, ipKeyGenerator as Y} from 'express-rate-limit';
5
- import Z from 'compression';
6
- import q from 'pino-http';
1
+ import P from 'express';
2
+ import B from 'helmet';
3
+ import X from 'cors';
4
+ import {rateLimit as Q, ipKeyGenerator as J} from 'express-rate-limit';
5
+ import Y from 'compression';
6
+ import Z from 'pino-http';
7
7
  import {createServer as M} from 'node:http';
8
- import ee from 'node:https';
9
- import R from 'pino';
8
+ import q from 'node:https';
9
+ import b from 'pino';
10
10
  import j from 'node:os';
11
11
  import G from 'node:net';
12
12
  var c = (e = new Date()) => e.toLocaleString('zh-CN', {timeZone: 'Asia/Shanghai', hour12: !1}),
13
13
  w = e => Object.prototype.toString.call(e).slice(8, -1).toLowerCase(),
14
- f = e => {
15
- let r = e ? 'https' : 'http',
14
+ g = e => {
15
+ let o = e ? 'https' : 'http',
16
16
  t = j.networkInterfaces(),
17
- o = [];
18
- return (Object.keys(t).map(i => o.push(...t[i])), o.filter(i => i.family === 'IPv4').map(i => i.address));
17
+ r = [];
18
+ return (Object.keys(t).map(i => r.push(...t[i])), r.filter(i => i.family === 'IPv4').map(i => i.address));
19
19
  },
20
- E = e => {
21
- let r = e ?? process.argv.slice(2) ?? [],
20
+ y = e => {
21
+ let o = e ?? process.argv.slice(2) ?? [],
22
22
  t = {};
23
23
  return (
24
- r.map(o => {
25
- let [s, i] = o.split('=');
24
+ o.map(r => {
25
+ let [s, i] = r.split('=');
26
26
  t[s] = i;
27
27
  }),
28
28
  t
@@ -42,43 +42,42 @@ var c = (e = new Date()) => e.toLocaleString('zh-CN', {timeZone: 'Asia/Shanghai'
42
42
  JWT_SECRET: 'secret',
43
43
  AUTH_TOKEN: 'authToken',
44
44
  },
45
- F = (e, r, t) => {
46
- let [o, s] = e.split('.');
47
- o && s ? (t[o] || (t[o] = {}), (t[o][s] = r)) : (t[o] = r);
45
+ F = (e, o, t) => {
46
+ let [r, s] = e.split('.');
47
+ r && s ? (t[r] || (t[r] = {}), (t[r][s] = o)) : (t[r] = o);
48
48
  },
49
- W = e => (e ? (e.endsWith('/') ? e : `${e}/`) : '/'),
50
- h = (e = {}, r = V) => {
49
+ v = (e = {}, o = V) => {
51
50
  let {env: t} = process;
52
- Object.keys(r).map(s => {
51
+ Object.keys(o).map(s => {
53
52
  let i = t[s] ?? e[s];
54
- i && F(r[s], i, e);
53
+ i && F(o[s], i, e);
55
54
  });
56
- let o = {...e, ...E()};
57
- return ((o.port = o.staticPort || o.port), (o.isDev = o.NODE_ENV === 'development'), (o.basepath = W(o.basepath)), (o.protocol = 'http'), o);
55
+ let r = {...e, ...y()};
56
+ return ((r.port = r.staticPort || r.port), (r.isDev = r.NODE_ENV === 'development'), (r.protocol = 'http'), r);
58
57
  },
59
- g = (e, r = '127.0.0.1') =>
58
+ x = (e, o = '127.0.0.1') =>
60
59
  new Promise(t => {
61
- let o = G.createServer();
62
- (o.once('error', s => {
63
- (o.close(), t((s.code === 'EADDRINUSE', !1)));
60
+ let r = G.createServer();
61
+ (r.once('error', s => {
62
+ (r.close(), t((s.code === 'EADDRINUSE', !1)));
64
63
  }),
65
- o.once('listening', () => {
66
- (o.close(), t(!0));
64
+ r.once('listening', () => {
65
+ (r.close(), t(!0));
67
66
  }),
68
- o.listen(Number(e), r));
67
+ r.listen(Number(e), o));
69
68
  }),
70
- b = (e, r = {}, t) => {
71
- let o = s => {
69
+ A = (e, o = {}, t) => {
70
+ let r = s => {
72
71
  (t.warn(`\u6536\u5230 ${s} \u4FE1\u53F7, \u{1F6D1} \u6B63\u5728\u5173\u95ED\u670D\u52A1\u5668...`),
73
72
  e.close(async () => {
74
- (t.info('\u{1F44B} \u670D\u52A1\u5668\u5DF2\u5173\u95ED'), await r.shutdown?.(), process.exit(0));
73
+ (t.info('\u{1F44B} \u670D\u52A1\u5668\u5DF2\u5173\u95ED'), await o.shutdown?.(), process.exit(0));
75
74
  }),
76
75
  setTimeout(() => {
77
76
  (t.error('\u274C \u5F3A\u5236\u5173\u95ED\u670D\u52A1\u5668'), process.exit(1));
78
77
  }, 5e3));
79
78
  };
80
- (process.on('SIGTERM', () => o('SIGTERM')),
81
- process.on('SIGINT', () => o('SIGINT')),
79
+ (process.on('SIGTERM', () => r('SIGTERM')),
80
+ process.on('SIGINT', () => r('SIGINT')),
82
81
  process.on('uncaughtException', s => {
83
82
  (t.fatal(s, `\u{1F4A5} \u672A\u6355\u83B7\u7684\u5F02\u5E38: ${s.message}`), process.exit(1));
84
83
  }),
@@ -86,27 +85,27 @@ var c = (e = new Date()) => e.toLocaleString('zh-CN', {timeZone: 'Asia/Shanghai'
86
85
  (t.fatal({reason: s, promise: i}, '\u26A0\uFE0F \u672A\u5904\u7406\u7684 Promise \u62D2\u7EDD'), process.exit(1));
87
86
  }));
88
87
  },
89
- A = (e, {port: r, host: t = '0.0.0.0'} = {}) =>
90
- new Promise((o, s) => {
91
- let i = p => {
92
- (a(), s(p));
88
+ $ = (e, {port: o, host: t = '0.0.0.0'} = {}) =>
89
+ new Promise((r, s) => {
90
+ let i = m => {
91
+ (a(), s(m));
93
92
  },
94
93
  n = () => {
95
- (a(), o(e));
94
+ (a(), r(e));
96
95
  },
97
96
  a = () => {
98
97
  (e.off('error', i), e.off('listening', n));
99
98
  };
100
- (e.once('error', i), e.once('listening', n), e.listen(r, t));
99
+ (e.once('error', i), e.once('listening', n), e.listen(o, t));
101
100
  }),
102
- $ = (e, r = 56) => {
101
+ R = (e, o = 56) => {
103
102
  let t = e.length,
104
- o = r - t,
105
- s = ~~(o / 2);
106
- return `${'-'.repeat(s)}${e}${'-'.repeat(o - s)}`;
103
+ r = o - t,
104
+ s = ~~(r / 2);
105
+ return `${'-'.repeat(s)}${e}${'-'.repeat(r - s)}`;
107
106
  };
108
107
  import 'dotenv';
109
- var K = {
108
+ var W = {
110
109
  nodeEnv: process.env.NODE_ENV || 'development',
111
110
  isDev: process.env.NODE_ENV === 'development',
112
111
  port: parseInt(process.env.PORT || '3000', 10),
@@ -125,137 +124,139 @@ var K = {
125
124
  },
126
125
  logLevel: process.env.LOG_LEVEL || 30,
127
126
  },
128
- v = K;
129
- var u = (e, r) =>
130
- R({
127
+ S = W;
128
+ var f = (e, o) =>
129
+ b({
131
130
  name: e,
132
- level: v.logLevel,
131
+ level: S.logLevel,
133
132
  formatters: {level: t => ({level: t})},
134
- timestamp: R.stdTimeFunctions.isoTime,
133
+ timestamp: b.stdTimeFunctions.isoTime,
135
134
  base: null,
136
135
  transport: {target: 'pino-pretty', options: {colorize: !0, sync: !0, levelFirst: !0}, ignore: 'pid,hostname,level,time', translateTime: 'SYS:yyyy-mm-dd HH:MM:ss'},
137
- ...r,
136
+ ...o,
138
137
  });
139
- var m = u('huxy');
140
- var O = u('error-handler'),
141
- N = e => (r, t, o) => {
142
- (O.error({message: 'Not Found', timestamp: c(), url: r.originalUrl, method: r.method, ip: r.ip, userAgent: r.get('User-Agent')}, '\u627E\u4E0D\u5230\u8DEF\u5F84'),
143
- t.status(404).json({success: !1, status: 404, url: r.originalUrl, message: `\u8DEF\u7531 [${r.method} ${r.originalUrl}] \u4E0D\u5B58\u5728`, timestamp: c()}));
138
+ var p = f('huxy');
139
+ var O = f('error-handler'),
140
+ N = e => (o, t, r) => {
141
+ (O.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'),
142
+ t.status(404).json({success: !1, status: 404, url: o.originalUrl, message: `\u8DEF\u7531 [${o.method} ${o.originalUrl}] \u4E0D\u5B58\u5728`, timestamp: c()}));
144
143
  },
145
- _ = e => (r, t, o, s) => {
146
- let i = r.status || 500,
147
- n = r.message;
148
- (O.error({message: n, timestamp: c(), stack: r.stack, url: t.originalUrl, method: t.method, ip: t.ip, userAgent: t.get('User-Agent')}, '\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF'),
149
- o.status(i).json({success: !1, message: (e.isDev, n), stack: e.isDev ? r.stack : void 0, timestamp: c()}));
144
+ _ = e => (o, t, r, s) => {
145
+ let i = o.status || 500,
146
+ n = o.message;
147
+ (O.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'),
148
+ r.status(i).json({success: !1, message: (e.isDev, n), stack: e.isDev ? o.stack : void 0, timestamp: c()}));
150
149
  };
151
- import {Router as z} from 'express';
152
- var B = e => {
153
- let r = z();
150
+ import {Router as K} from 'express';
151
+ var z = e => {
152
+ let o = K();
154
153
  return (
155
- r.use('/health', (t, o) => {
156
- o.status(200).json({status: 'OK', timestamp: c(), environment: e.nodeEnv, uptime: process.uptime(), memoryUsage: process.memoryUsage(), pid: process.pid});
154
+ o.use('/health', (t, r) => {
155
+ r.status(200).json({status: 'OK', timestamp: c(), environment: e.nodeEnv, uptime: process.uptime(), memoryUsage: process.memoryUsage(), pid: process.pid});
157
156
  }),
158
- r.get('/', (t, o) => {
159
- o.status(200).json({message: 'Node.js \u670D\u52A1\u5668\u8FD0\u884C\u4E2D', timestamp: c(), environment: e.nodeEnv});
157
+ o.get('/', (t, r) => {
158
+ r.status(200).json({message: 'Node.js \u670D\u52A1\u5668\u8FD0\u884C\u4E2D', timestamp: c(), environment: e.nodeEnv});
160
159
  }),
161
- r
160
+ o
162
161
  );
163
162
  },
164
- D = B;
165
- var te = (e, r = {}) => {
163
+ D = z;
164
+ var ee = (e, o = {}) => {
166
165
  (e.disable('x-powered-by'),
167
- e.set('trust proxy', 1),
168
- e.use(q({logger: m, quietReqLogger: !0, autoLogging: !1, genReqId: !1})),
169
- e.use(Z()),
170
- e.use(X(r.helmet)),
171
- e.use(Q(r.cors)),
172
- e.use(r.apiPrefix, J({keyGenerator: t => Y(t.ip) || t.headers['x-huxy-auth'] || t.headers['x-api-key'] || t.headers.authorization, ...r.rateLimit})),
173
- e.use(y.json({limit: '20mb'})),
174
- e.use(y.urlencoded({extended: !0, limit: '20mb'})));
166
+ e.set('trust proxy', o.trustProxy ?? 1),
167
+ e.use(Z({logger: p, quietReqLogger: !0, autoLogging: !1, genReqId: !1})),
168
+ e.use(Y()),
169
+ e.use(B(o.helmet)),
170
+ e.use(X(o.cors)),
171
+ e.use(o.apiPrefix, Q({keyGenerator: t => J(t.ip) || t.headers['x-huxy-auth'] || t.headers['x-api-key'] || t.headers.authorization, ...o.rateLimit})),
172
+ e.use(P.json({limit: '20mb'})),
173
+ e.use(P.urlencoded({extended: !0, limit: '20mb'})));
175
174
  },
176
- oe = (e, r = {}) => {
177
- (e.use(D(r)), e.use(N(r)), e.use(_(r)));
175
+ te = (e, o = {}) => {
176
+ (e.use(D(o)), e.use(N(o)), e.use(_(o)));
178
177
  },
179
- re = async (e, r) => {
180
- let t = h(e),
181
- {port: o, ssl: s} = t;
182
- (await g(o, t.host)) || ((t.port = Number(o) + 1), m.warn(`\u7AEF\u53E3 ${o} \u5DF2\u88AB\u5360\u7528\uFF0C\u73B0\u5728\u4F7F\u7528\u7AEF\u53E3 ${t.port}`));
183
- let n = y();
184
- te(n, t);
178
+ oe = async (e, o) => {
179
+ let t = v(e),
180
+ {port: r, ssl: s} = t;
181
+ (await x(r, t.host)) || ((t.port = Number(r) + 1), p.warn(`\u7AEF\u53E3 ${r} \u5DF2\u88AB\u5360\u7528\uFF0C\u73B0\u5728\u4F7F\u7528\u7AEF\u53E3 ${t.port}`));
182
+ let n = P();
183
+ ee(n, t);
185
184
  let a;
186
185
  (s
187
186
  ? (w(s) === 'object' ||
188
- (m.error({ssl: {key: '/path/to/name.key', cert: '/path/to/name.pem'}}, '\u26A0\uFE0F \u8BF7\u8BBE\u7F6E\u6709\u6548 SSL \u6216\u8BBE\u7F6E {ssl: false}'), process.exit(1)),
187
+ (p.error({ssl: {key: '/path/to/name.key', cert: '/path/to/name.pem'}}, '\u26A0\uFE0F \u8BF7\u8BBE\u7F6E\u6709\u6548 SSL \u6216\u8BBE\u7F6E {ssl: false}'), process.exit(1)),
189
188
  (t.protocol = 'https'),
190
- (a = ee.createServer(s, n)),
189
+ (a = q.createServer(s, n)),
191
190
  M((d, l) => {
192
191
  (l.writeHead(301, {Location: `${t.protocol}://${d.headers.host}${d.url}`}), l.end());
193
192
  }).listen(80))
194
193
  : (a = M(n)),
195
- b(a, t, m));
194
+ A(a, t, p));
196
195
  try {
197
- await A(a, t);
198
- } catch (p) {
199
- (m.error({err: p}, '\u26A0\uFE0F \u670D\u52A1\u5668\u542F\u52A8\u5931\u8D25'), process.exit(1));
196
+ await $(a, t);
197
+ } catch (m) {
198
+ (p.error({err: m}, '\u26A0\uFE0F \u670D\u52A1\u5668\u542F\u52A8\u5931\u8D25'), process.exit(1));
200
199
  }
201
200
  try {
202
- await r?.(t, n, a, m);
203
- } catch (p) {
204
- (m.error({err: p}, `\u274C \u56DE\u8C03\u51FD\u6570\u9519\u8BEF\uFF1A${p.message}`), process.exit(1));
201
+ await o?.(t, n, a, p);
202
+ } catch (m) {
203
+ (p.error({err: m}, `\u274C \u56DE\u8C03\u51FD\u6570\u9519\u8BEF\uFF1A${m.message}`), process.exit(1));
205
204
  }
206
- return (oe(n, t), {app: n, httpServer: a, config: t, logger: m});
205
+ return (te(n, t), {app: n, httpServer: a, config: t, logger: p});
207
206
  },
208
- H = re;
209
- var se = (e, r, t) =>
210
- H({...v, ...e}, async (o, s, i, n) => {
211
- let {port: a, host: p, nodeEnv: d, basepath: l, appName: S = 'HuxyServer', protocol: L} = o;
207
+ H = oe;
208
+ var re = (e, o, t) =>
209
+ H({...S, ...e}, async (r, s, i, n) => {
210
+ let {port: a, host: m, nodeEnv: d, basepath: l, appName: u = 'HuxyServer', protocol: h} = r;
212
211
  if (!t) {
213
- let U = f()
214
- .filter(T => T !== p)
215
- .map(T => `${L}://${T}:${a}${l}`);
216
- (n.info($(S)),
217
- n.info(`\u{1F680} \u670D\u52A1\u8FD0\u884C\u5728\u3010${d}\u3011\u73AF\u5883: ${L}://${p}:${a}${l}`),
212
+ let U = g()
213
+ .filter(E => E !== m)
214
+ .map(E => `${h}://${E}:${a}${l}`);
215
+ (n.info(R(u)),
216
+ n.info(`\u{1F680} \u670D\u52A1\u8FD0\u884C\u5728\u3010${d}\u3011\u73AF\u5883: ${h}://${m}:${a}${l}`),
218
217
  n.info(`-----------------[${c()}]------------------`),
219
218
  n.info({ips: U}, '\u672C\u5730\u5730\u5740\uFF1A'));
220
219
  }
221
- await r?.(o, s, i, n);
220
+ await o?.(r, s, i, n);
222
221
  }),
223
- x = se;
224
- import ce from 'express';
225
- import {fileURLToPath as ne} from 'node:url';
226
- import {dirname as ie, resolve as ae} from 'node:path';
227
- var I = (e = import.meta.url) => ie(ne(e)),
228
- P = (...e) => ae(I(), ...e),
229
- k = P;
230
- var pe = {port: 9e3, host: 'localhost', basepath: '/', buildPath: './build'},
231
- me = (e, r) =>
232
- x({...pe, ...e}, async (t, o, s, i) => {
233
- await r?.(t, o, s, i);
222
+ T = re;
223
+ import ae from 'express';
224
+ import {fileURLToPath as se} from 'node:url';
225
+ import {dirname as ne, resolve as ie} from 'node:path';
226
+ var I = (e = import.meta.url) => ne(se(e)),
227
+ L = (...e) => ie(I(), ...e),
228
+ k = L;
229
+ var ce = {port: 9e3, host: 'localhost', basepath: '/', buildPath: './build'},
230
+ me = e => (e ? (e.endsWith('/') ? e : `${e}/`) : '/'),
231
+ pe = (e, o) =>
232
+ T({...ce, ...e}, async (t, r, s, i) => {
233
+ await o?.(t, r, s, i);
234
234
  let {basepath: n, buildPath: a} = t;
235
235
  (n !== '/' &&
236
- o.get('/', (d, l, S) => {
237
- if (d.path === '/' || d.path === n.slice(0, -1)) return l.redirect(n);
238
- S();
236
+ r.get('/', (l, u, h) => {
237
+ if (l.path === '/') return u.redirect(n);
238
+ h();
239
239
  }),
240
- o.use(n, ce.static(a, {...t.staticCache})));
241
- let p = new RegExp(`^${n.replace(/\//g, '\\/')}(.*)$`);
242
- o.get(p, (d, l) => {
243
- l.sendFile(k(a, 'index.html'));
240
+ r.use(n, ae.static(a, {...t.staticCache})));
241
+ let m = me(n),
242
+ d = new RegExp(`^${m.replace(/\//g, '\\/')}(.*)$`);
243
+ r.get(d, (l, u) => {
244
+ u.sendFile(k(a, 'index.html'));
244
245
  });
245
246
  }),
246
- C = me;
247
- var ot = {startServer: x, startStatic: C, logger: m, createLogger: u, dateTime: c, localIPs: f, nodeArgs: E, getEnvConfig: h, checkPort: g, getDirName: I, resolvePath: P};
247
+ C = pe;
248
+ var ot = {startServer: T, startStatic: C, logger: p, createLogger: f, dateTime: c, localIPs: g, nodeArgs: y, getEnvConfig: v, checkPort: x, getDirName: I, resolvePath: L};
248
249
  export {
249
- g as checkPort,
250
- u as createLogger,
250
+ x as checkPort,
251
+ f as createLogger,
251
252
  c as dateTime,
252
253
  ot as default,
253
254
  I as getDirName,
254
- h as getEnvConfig,
255
- f as localIPs,
256
- m as logger,
257
- E as nodeArgs,
258
- P as resolvePath,
259
- x as startServer,
255
+ v as getEnvConfig,
256
+ g as localIPs,
257
+ p as logger,
258
+ y as nodeArgs,
259
+ L as resolvePath,
260
+ T as startServer,
260
261
  C as startStatic,
261
262
  };