alp-node 8.0.0 → 9.0.1
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/CHANGELOG.md +20 -0
- package/dist/{AlpNodeApp-node20.mjs → AlpNodeApp-node.mjs} +97 -77
- package/dist/AlpNodeApp-node.mjs.map +1 -0
- package/dist/definitions/AlpNodeApp.d.ts +2 -2
- package/dist/definitions/AlpNodeApp.d.ts.map +1 -1
- package/dist/{index-node20.mjs → index-node.mjs} +128 -104
- package/dist/index-node.mjs.map +1 -0
- package/package.json +16 -15
- package/src/AlpNodeApp.ts +5 -2
- package/src/params/ParamValidationResult.test.ts +10 -7
- package/dist/AlpNodeApp-node20.mjs.map +0 -1
- package/dist/index-node20.mjs.map +0 -1
|
@@ -21,24 +21,17 @@ async function alpNodeErrors(ctx, next) {
|
|
|
21
21
|
try {
|
|
22
22
|
await next();
|
|
23
23
|
} catch (error) {
|
|
24
|
-
// eslint-disable-next-line no-ex-assign
|
|
25
24
|
if (!error) error = new Error("Unknown error");
|
|
26
|
-
// eslint-disable-next-line no-ex-assign
|
|
27
25
|
if (typeof error === "string") error = new Error(error);
|
|
28
26
|
ctx.status = error.status || 500;
|
|
29
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
30
27
|
logger$4.error(error);
|
|
31
28
|
switch (ctx.request.accepts("html", "text", "json")) {
|
|
32
29
|
case "json":
|
|
33
30
|
ctx.type = "application/json";
|
|
34
31
|
if (process.env.NODE_ENV !== "production" || error.expose) {
|
|
35
|
-
ctx.body = {
|
|
36
|
-
error: error.message
|
|
37
|
-
};
|
|
32
|
+
ctx.body = { error: error.message };
|
|
38
33
|
} else {
|
|
39
|
-
ctx.body = {
|
|
40
|
-
error: STATUS_CODES[ctx.status]
|
|
41
|
-
};
|
|
34
|
+
ctx.body = { error: STATUS_CODES[ctx.status] };
|
|
42
35
|
}
|
|
43
36
|
break;
|
|
44
37
|
case "html":
|
|
@@ -71,18 +64,24 @@ function alpLanguage(app) {
|
|
|
71
64
|
if (!availableLanguages) {
|
|
72
65
|
throw new Error('Missing config "availableLanguages"');
|
|
73
66
|
}
|
|
74
|
-
defineLazyProperty(
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
67
|
+
defineLazyProperty(
|
|
68
|
+
app.context,
|
|
69
|
+
"language",
|
|
70
|
+
function language() {
|
|
71
|
+
return this.acceptsLanguages(availableLanguages) || availableLanguages[0] || "en";
|
|
72
|
+
}
|
|
73
|
+
);
|
|
74
|
+
defineLazyProperty(
|
|
75
|
+
app.context,
|
|
76
|
+
"firstAcceptedLanguage",
|
|
77
|
+
function firstAcceptedLanguage() {
|
|
78
|
+
return this.acceptsLanguages()[0] || availableLanguages[0] || "en";
|
|
79
|
+
}
|
|
80
|
+
);
|
|
80
81
|
}
|
|
81
82
|
|
|
82
83
|
const logger$3 = new Logger("alp:listen");
|
|
83
|
-
const createServer = (callback, socketPath, tls, dirname = ""
|
|
84
|
-
// eslint-disable-next-line @typescript-eslint/max-params
|
|
85
|
-
) => {
|
|
84
|
+
const createServer = (callback, socketPath, tls, dirname = "") => {
|
|
86
85
|
const createHttpServer = !socketPath && tls ? createServer$1 : createServer$2;
|
|
87
86
|
if (!tls) {
|
|
88
87
|
return createHttpServer(callback);
|
|
@@ -94,35 +93,28 @@ const createServer = (callback, socketPath, tls, dirname = ""
|
|
|
94
93
|
return createHttpServer(options, callback);
|
|
95
94
|
};
|
|
96
95
|
function alpListen(config, callback, dirname) {
|
|
97
|
-
return new Promise(resolve => {
|
|
96
|
+
return new Promise((resolve) => {
|
|
98
97
|
const socketPath = config.get("socketPath");
|
|
99
98
|
const port = config.get("port");
|
|
100
99
|
const hostname = config.get("hostname");
|
|
101
100
|
const tls = config.get("tls");
|
|
102
|
-
logger$3.info("Creating server", socketPath ? {
|
|
103
|
-
socketPath
|
|
104
|
-
} : {
|
|
105
|
-
port
|
|
106
|
-
});
|
|
101
|
+
logger$3.info("Creating server", socketPath ? { socketPath } : { port });
|
|
107
102
|
const server = createServer(callback, socketPath, tls, dirname);
|
|
108
103
|
if (socketPath) {
|
|
109
104
|
try {
|
|
110
105
|
unlinkSync(socketPath);
|
|
111
|
-
} catch {
|
|
106
|
+
} catch {
|
|
107
|
+
}
|
|
112
108
|
server.listen(socketPath, () => {
|
|
113
109
|
if (socketPath) {
|
|
114
110
|
chmodSync(socketPath, "777");
|
|
115
111
|
}
|
|
116
|
-
logger$3.info("Server listening", {
|
|
117
|
-
socketPath
|
|
118
|
-
});
|
|
112
|
+
logger$3.info("Server listening", { socketPath });
|
|
119
113
|
resolve(server);
|
|
120
114
|
});
|
|
121
115
|
} else {
|
|
122
116
|
server.listen(port, hostname, () => {
|
|
123
|
-
logger$3.info("Server listening", {
|
|
124
|
-
port
|
|
125
|
-
});
|
|
117
|
+
logger$3.info("Server listening", { port });
|
|
126
118
|
resolve(server);
|
|
127
119
|
});
|
|
128
120
|
}
|
|
@@ -130,25 +122,22 @@ function alpListen(config, callback, dirname) {
|
|
|
130
122
|
}
|
|
131
123
|
|
|
132
124
|
class ParamValidationResult {
|
|
125
|
+
_errors;
|
|
133
126
|
_error(name, key, value) {
|
|
134
127
|
if (!this._errors) {
|
|
135
128
|
this._errors = {};
|
|
136
129
|
}
|
|
137
|
-
this._errors[name] = {
|
|
138
|
-
error: key,
|
|
139
|
-
value
|
|
140
|
-
};
|
|
130
|
+
this._errors[name] = { error: key, value };
|
|
141
131
|
}
|
|
142
132
|
getErrors() {
|
|
143
133
|
return this._errors;
|
|
144
134
|
}
|
|
145
135
|
hasErrors() {
|
|
146
|
-
return this._errors !==
|
|
136
|
+
return this._errors !== void 0;
|
|
147
137
|
}
|
|
148
138
|
isValid() {
|
|
149
|
-
return this._errors ===
|
|
139
|
+
return this._errors === void 0;
|
|
150
140
|
}
|
|
151
|
-
|
|
152
141
|
// string(name: string): ParamValueStringValidator {
|
|
153
142
|
// return new ParamValueStringValidator(this, name, this.context.param(name));
|
|
154
143
|
// }
|
|
@@ -164,18 +153,20 @@ class ParamValidationResult {
|
|
|
164
153
|
}
|
|
165
154
|
|
|
166
155
|
class ParamValid extends ParamValidationResult {
|
|
156
|
+
context;
|
|
167
157
|
constructor(context) {
|
|
168
158
|
super();
|
|
169
159
|
this.context = context;
|
|
170
160
|
}
|
|
171
161
|
_error() {
|
|
172
|
-
this.context.throw(400, "Invalid params", {
|
|
173
|
-
validator: this
|
|
174
|
-
});
|
|
162
|
+
this.context.throw(400, "Invalid params", { validator: this });
|
|
175
163
|
}
|
|
176
164
|
}
|
|
177
165
|
|
|
178
166
|
class ParamValueValidator {
|
|
167
|
+
validationResult;
|
|
168
|
+
name;
|
|
169
|
+
value;
|
|
179
170
|
constructor(validationResult, name, value) {
|
|
180
171
|
this.validationResult = validationResult;
|
|
181
172
|
this.name = name;
|
|
@@ -199,22 +190,34 @@ class ParamValueStringValidator extends ParamValueValidator {
|
|
|
199
190
|
}
|
|
200
191
|
|
|
201
192
|
class ParamValueFromContext {
|
|
193
|
+
validationResult;
|
|
194
|
+
context;
|
|
202
195
|
constructor(context, validationResult) {
|
|
203
196
|
this.validationResult = validationResult;
|
|
204
197
|
this.context = context;
|
|
205
198
|
}
|
|
206
199
|
namedParam(name) {
|
|
207
|
-
return new ParamValueStringValidator(
|
|
200
|
+
return new ParamValueStringValidator(
|
|
201
|
+
this.validationResult,
|
|
202
|
+
name,
|
|
203
|
+
this.context.namedRouteParam(name)
|
|
204
|
+
);
|
|
208
205
|
}
|
|
209
206
|
otherParam(position) {
|
|
210
|
-
return new ParamValueStringValidator(
|
|
207
|
+
return new ParamValueStringValidator(
|
|
208
|
+
this.validationResult,
|
|
209
|
+
String(position),
|
|
210
|
+
this.context.otherRouteParam(position)
|
|
211
|
+
);
|
|
211
212
|
}
|
|
212
213
|
queryParam(name) {
|
|
213
|
-
return new ParamValueStringValidator(
|
|
214
|
+
return new ParamValueStringValidator(
|
|
215
|
+
this.validationResult,
|
|
216
|
+
name,
|
|
217
|
+
this.context.queryParam(name)
|
|
218
|
+
);
|
|
214
219
|
}
|
|
215
|
-
|
|
216
220
|
// bodyParam: <T>(name: string): ParamValueValidator<string | undefined> {
|
|
217
|
-
|
|
218
221
|
// }
|
|
219
222
|
}
|
|
220
223
|
|
|
@@ -230,28 +233,39 @@ function alpParams(app) {
|
|
|
230
233
|
},
|
|
231
234
|
queryParam(name) {
|
|
232
235
|
const searchParams = this.request.searchParams;
|
|
233
|
-
return searchParams.get(name) ??
|
|
236
|
+
return searchParams.get(name) ?? void 0;
|
|
234
237
|
},
|
|
235
238
|
bodyParam(name) {
|
|
236
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-member-access
|
|
237
239
|
return this.body[name];
|
|
238
240
|
}
|
|
239
241
|
});
|
|
240
|
-
defineLazyProperty(
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
242
|
+
defineLazyProperty(
|
|
243
|
+
app.request,
|
|
244
|
+
"searchParams",
|
|
245
|
+
function searchParams() {
|
|
246
|
+
return new URLSearchParams(this.search);
|
|
247
|
+
}
|
|
248
|
+
);
|
|
249
|
+
defineLazyProperty(
|
|
250
|
+
app.context,
|
|
251
|
+
"params",
|
|
252
|
+
function params() {
|
|
253
|
+
return new ParamValueFromContext(this, new ParamValidationResult());
|
|
254
|
+
}
|
|
255
|
+
);
|
|
256
|
+
defineLazyProperty(
|
|
257
|
+
app.context,
|
|
258
|
+
"validParams",
|
|
259
|
+
function validParams() {
|
|
260
|
+
return new ParamValueFromContext(this, new ParamValid(this));
|
|
261
|
+
}
|
|
262
|
+
);
|
|
249
263
|
}
|
|
250
264
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
265
|
+
const IntlMessageFormat = (
|
|
266
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
267
|
+
IntlMessageFormatDefault.default || IntlMessageFormatDefault
|
|
268
|
+
);
|
|
255
269
|
function load(translations, language) {
|
|
256
270
|
const result = {};
|
|
257
271
|
(function loadMap(record, prefix) {
|
|
@@ -260,7 +274,10 @@ function load(translations, language) {
|
|
|
260
274
|
loadMap(value, `${prefix}${key}.`);
|
|
261
275
|
return;
|
|
262
276
|
}
|
|
263
|
-
result[`${prefix}${key}`] = new IntlMessageFormat(
|
|
277
|
+
result[`${prefix}${key}`] = new IntlMessageFormat(
|
|
278
|
+
value,
|
|
279
|
+
language
|
|
280
|
+
);
|
|
264
281
|
});
|
|
265
282
|
})(translations, "");
|
|
266
283
|
return result;
|
|
@@ -269,23 +286,20 @@ function load(translations, language) {
|
|
|
269
286
|
const logger$2 = new Logger("alp:translate");
|
|
270
287
|
function alpTranslate(dirname) {
|
|
271
288
|
dirname = dirname.replace(/\/*$/, "/");
|
|
272
|
-
return app => {
|
|
273
|
-
const appTranslations = new Map();
|
|
289
|
+
return (app) => {
|
|
290
|
+
const appTranslations = /* @__PURE__ */ new Map();
|
|
274
291
|
Object.assign(app.context, {
|
|
275
292
|
t(id, args) {
|
|
276
293
|
const msg = appTranslations.get(this.language)?.[id];
|
|
277
294
|
if (!msg) {
|
|
278
|
-
logger$2.warn("invalid msg", {
|
|
279
|
-
language: this.language,
|
|
280
|
-
id
|
|
281
|
-
});
|
|
295
|
+
logger$2.warn("invalid msg", { language: this.language, id });
|
|
282
296
|
return id;
|
|
283
297
|
}
|
|
284
298
|
return msg.format(args);
|
|
285
299
|
}
|
|
286
300
|
});
|
|
287
301
|
const config = app.config;
|
|
288
|
-
config.get("availableLanguages").forEach(language => {
|
|
302
|
+
config.get("availableLanguages").forEach((language) => {
|
|
289
303
|
const translations = app.loadConfigSync(dirname + language);
|
|
290
304
|
appTranslations.set(language, load(translations, language));
|
|
291
305
|
});
|
|
@@ -295,6 +309,12 @@ function alpTranslate(dirname) {
|
|
|
295
309
|
|
|
296
310
|
const logger$1 = new Logger("alp");
|
|
297
311
|
class AlpNodeApp extends Koa {
|
|
312
|
+
dirname;
|
|
313
|
+
certPath;
|
|
314
|
+
publicPath;
|
|
315
|
+
config;
|
|
316
|
+
_server;
|
|
317
|
+
router;
|
|
298
318
|
/**
|
|
299
319
|
* @param {Object} [options]
|
|
300
320
|
* @param {string} [options.certPath] directory of the ssl certificates
|
|
@@ -326,12 +346,11 @@ class AlpNodeApp extends Koa {
|
|
|
326
346
|
}
|
|
327
347
|
createContext(req, res) {
|
|
328
348
|
const ctx = super.createContext(req, res);
|
|
329
|
-
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
330
349
|
ctx.sanitizedState = {};
|
|
331
350
|
return ctx;
|
|
332
351
|
}
|
|
333
352
|
servePublic() {
|
|
334
|
-
this.use(serve(this.publicPath));
|
|
353
|
+
this.use(serve(this.publicPath));
|
|
335
354
|
}
|
|
336
355
|
catchErrors() {
|
|
337
356
|
this.use(alpNodeErrors);
|
|
@@ -339,7 +358,6 @@ class AlpNodeApp extends Koa {
|
|
|
339
358
|
listen() {
|
|
340
359
|
throw new Error("Use start instead");
|
|
341
360
|
}
|
|
342
|
-
|
|
343
361
|
/**
|
|
344
362
|
* Close server and emit close event
|
|
345
363
|
*/
|
|
@@ -352,15 +370,17 @@ class AlpNodeApp extends Koa {
|
|
|
352
370
|
async start(fn) {
|
|
353
371
|
await fn();
|
|
354
372
|
try {
|
|
355
|
-
const server = await alpListen(
|
|
373
|
+
const server = await alpListen(
|
|
374
|
+
this.config,
|
|
375
|
+
this.callback(),
|
|
376
|
+
this.certPath
|
|
377
|
+
);
|
|
356
378
|
this._server = server;
|
|
357
379
|
logger$1.success("started");
|
|
358
380
|
if (process.send) process.send("ready");
|
|
359
381
|
return server;
|
|
360
382
|
} catch (error) {
|
|
361
|
-
logger$1.error("start fail", {
|
|
362
|
-
err: error
|
|
363
|
-
});
|
|
383
|
+
logger$1.error("start fail", { err: error });
|
|
364
384
|
throw error;
|
|
365
385
|
}
|
|
366
386
|
}
|
|
@@ -375,6 +395,9 @@ function _loadConfigSync(dirname, name) {
|
|
|
375
395
|
return JSON.parse(content);
|
|
376
396
|
}
|
|
377
397
|
class Config {
|
|
398
|
+
packageConfig;
|
|
399
|
+
_record;
|
|
400
|
+
_dirname;
|
|
378
401
|
constructor(dirname, options) {
|
|
379
402
|
this._record = {};
|
|
380
403
|
this._dirname = dirname.replace(/\/*$/, "/");
|
|
@@ -384,18 +407,18 @@ class Config {
|
|
|
384
407
|
}
|
|
385
408
|
loadSync(options = {}) {
|
|
386
409
|
const env = process.env.CONFIG_ENV || process.env.NODE_ENV || "development";
|
|
387
|
-
const {
|
|
388
|
-
argv: argvOverrides = [],
|
|
389
|
-
packageConfig,
|
|
390
|
-
version
|
|
391
|
-
} = options;
|
|
410
|
+
const { argv: argvOverrides = [], packageConfig, version } = options;
|
|
392
411
|
this.packageConfig = packageConfig;
|
|
393
412
|
const config = _loadConfigSync(this._dirname, "common");
|
|
394
|
-
for (const [key, value] of Object.entries(
|
|
413
|
+
for (const [key, value] of Object.entries(
|
|
414
|
+
_loadConfigSync(this._dirname, env)
|
|
415
|
+
)) {
|
|
395
416
|
config[key] = value;
|
|
396
417
|
}
|
|
397
418
|
if (this.existsConfigSync("local")) {
|
|
398
|
-
for (const [key, value] of Object.entries(
|
|
419
|
+
for (const [key, value] of Object.entries(
|
|
420
|
+
_loadConfigSync(this._dirname, "local")
|
|
421
|
+
)) {
|
|
399
422
|
config[key] = value;
|
|
400
423
|
}
|
|
401
424
|
}
|
|
@@ -413,16 +436,19 @@ class Config {
|
|
|
413
436
|
config.port = Number(process.env.PORT);
|
|
414
437
|
delete config.socketPath;
|
|
415
438
|
}
|
|
416
|
-
argvOverrides.forEach(key => {
|
|
439
|
+
argvOverrides.forEach((key) => {
|
|
417
440
|
const splitted = key.split(".");
|
|
418
|
-
const value = splitted.length > 0 &&
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
if (value !== undefined) {
|
|
441
|
+
const value = splitted.length > 0 && // eslint-disable-next-line @typescript-eslint/no-unsafe-return,unicorn/no-array-reduce
|
|
442
|
+
splitted.reduce((config2, partialKey) => config2[partialKey], argv);
|
|
443
|
+
if (value !== void 0) {
|
|
422
444
|
const last = splitted.pop();
|
|
423
|
-
const v = splitted.length === 0 ? config :
|
|
424
|
-
|
|
425
|
-
|
|
445
|
+
const v = splitted.length === 0 ? config : (
|
|
446
|
+
// eslint-disable-next-line unicorn/no-array-reduce
|
|
447
|
+
splitted.reduce(
|
|
448
|
+
(config2, partialKey) => config2[partialKey],
|
|
449
|
+
config
|
|
450
|
+
)
|
|
451
|
+
);
|
|
426
452
|
v[last] = value;
|
|
427
453
|
}
|
|
428
454
|
});
|
|
@@ -442,16 +468,17 @@ class Config {
|
|
|
442
468
|
|
|
443
469
|
const createAlpRouterBuilder = () => createRouterBuilder();
|
|
444
470
|
function alpRouter(router) {
|
|
445
|
-
return app => {
|
|
471
|
+
return (app) => {
|
|
446
472
|
app.router = router;
|
|
447
473
|
app.context.urlGenerator = function urlGenerator(routeKey, params) {
|
|
448
474
|
return router.toLocalizedPath(this.language, routeKey, params);
|
|
449
475
|
};
|
|
450
476
|
app.context.redirectTo = function redirectTo(to, params) {
|
|
451
|
-
this.redirect(
|
|
477
|
+
this.redirect(
|
|
478
|
+
router.toLocalizedPath(this.language, to, params)
|
|
479
|
+
);
|
|
452
480
|
};
|
|
453
|
-
return async ctx => {
|
|
454
|
-
// eslint-disable-next-line unicorn/no-array-method-this-argument
|
|
481
|
+
return async (ctx) => {
|
|
455
482
|
const routeMatch = router.find(ctx.request.path, ctx.language);
|
|
456
483
|
if (!routeMatch) {
|
|
457
484
|
ctx.status = 404;
|
|
@@ -470,16 +497,13 @@ if (!packagePath) {
|
|
|
470
497
|
throw new Error(`Could not find package.json: "${String(packagePath)}"`);
|
|
471
498
|
}
|
|
472
499
|
const packageDirname = path.dirname(packagePath);
|
|
473
|
-
logger.debug("init", {
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
const packageConfig = JSON.parse(readFileSync(packagePath, "utf8"));
|
|
500
|
+
logger.debug("init", { appDirname, packageDirname });
|
|
501
|
+
const packageConfig = JSON.parse(
|
|
502
|
+
readFileSync(packagePath, "utf8")
|
|
503
|
+
);
|
|
478
504
|
const buildedConfigPath = `${appDirname}/build/config/`;
|
|
479
505
|
const configPath = existsSync(buildedConfigPath) ? buildedConfigPath : `${appDirname}/config/`;
|
|
480
|
-
const config = new Config(configPath).loadSync({
|
|
481
|
-
packageConfig
|
|
482
|
-
});
|
|
506
|
+
const config = new Config(configPath).loadSync({ packageConfig });
|
|
483
507
|
class App extends AlpNodeApp {
|
|
484
508
|
constructor(options) {
|
|
485
509
|
super({
|
|
@@ -492,4 +516,4 @@ class App extends AlpNodeApp {
|
|
|
492
516
|
}
|
|
493
517
|
|
|
494
518
|
export { Config, appDirname, config, createAlpRouterBuilder, App as default, packageConfig, packageDirname, alpRouter as router };
|
|
495
|
-
//# sourceMappingURL=index-
|
|
519
|
+
//# sourceMappingURL=index-node.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-node.mjs","sources":["../src/errors.ts","../src/language.ts","../src/listen.ts","../src/params/ParamValidationResult.ts","../src/params/ParamValid.ts","../src/params/ParamValueValidator.ts","../src/params/ParamValueStringValidator.ts","../src/params/ParamValueFromContext.ts","../src/params/index.ts","../src/translate/load.ts","../src/translate/index.ts","../src/AlpNodeApp.ts","../src/config.ts","../src/router.ts","../src/index.ts"],"sourcesContent":["import { STATUS_CODES } from \"node:http\";\nimport ErrorHtmlRenderer from \"error-html\";\nimport { Logger } from \"nightingale-logger\";\nimport type { Context } from \"./AlpNodeApp\";\nimport type { HtmlError } from \"./types\";\n\nconst logger = new Logger(\"alp:errors\");\nconst errorHtmlRenderer = new ErrorHtmlRenderer({\n appPath: `${process.cwd()}/`,\n});\n\nexport default async function alpNodeErrors(\n ctx: Context,\n next: () => Promise<void> | void,\n): Promise<void> {\n try {\n await next();\n } catch (error: unknown) {\n // eslint-disable-next-line no-ex-assign\n if (!error) error = new Error(\"Unknown error\");\n // eslint-disable-next-line no-ex-assign\n if (typeof error === \"string\") error = new Error(error);\n\n ctx.status = (error as HtmlError).status || 500;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n logger.error(error as any);\n\n switch (ctx.request.accepts(\"html\", \"text\", \"json\")) {\n case \"json\":\n ctx.type = \"application/json\";\n if (\n process.env.NODE_ENV !== \"production\" ||\n (error as HtmlError).expose\n ) {\n ctx.body = { error: (error as Error).message };\n } else {\n ctx.body = { error: STATUS_CODES[ctx.status] };\n }\n\n break;\n\n case \"html\":\n ctx.type = \"text/html\";\n if (process.env.NODE_ENV !== \"production\") {\n ctx.body = errorHtmlRenderer.render(error as Error);\n } else if ((error as HtmlError).expose) {\n ctx.body = (error as Error).message;\n } else {\n throw error;\n }\n\n break;\n\n case \"text\":\n case false:\n default:\n ctx.type = \"text/plain\";\n if (\n process.env.NODE_ENV !== \"production\" ||\n (error as HtmlError).expose\n ) {\n ctx.body = (error as Error).message;\n } else {\n throw error;\n }\n\n break;\n }\n }\n}\n","import type { Context } from \"koa\";\nimport { defineLazyProperty } from \"object-properties\";\nimport type { AlpNodeApp } from \"./AlpNodeApp\";\n\nexport interface AlpLanguageContext {\n readonly firstAcceptedLanguage: string;\n readonly language: string;\n}\nexport default function alpLanguage(app: AlpNodeApp): void {\n const config = app.context.config;\n const availableLanguages: string[] = config.get(\"availableLanguages\");\n if (!availableLanguages) {\n throw new Error('Missing config \"availableLanguages\"');\n }\n\n defineLazyProperty(\n app.context,\n \"language\",\n function language(this: Context): string {\n return (\n this.acceptsLanguages(availableLanguages) ||\n availableLanguages[0] ||\n \"en\"\n );\n },\n );\n\n defineLazyProperty(\n app.context,\n \"firstAcceptedLanguage\",\n function firstAcceptedLanguage(this: Context): string {\n return this.acceptsLanguages()[0] || availableLanguages[0] || \"en\";\n },\n );\n}\n","import { chmodSync, readFileSync, unlinkSync } from \"node:fs\";\nimport { createServer as createServerHttp } from \"node:http\";\nimport type { IncomingMessage, Server, ServerResponse } from \"node:http\";\nimport { createServer as createServerHttps } from \"node:https\";\nimport { Logger } from \"nightingale-logger\";\nimport type { Config } from \"./config\";\n\nconst logger = new Logger(\"alp:listen\");\n\ntype RequestListener = (req: IncomingMessage, res: ServerResponse) => void;\n\nconst createServer = (\n callback: RequestListener,\n socketPath?: string,\n tls?: boolean,\n dirname = \"\",\n // eslint-disable-next-line @typescript-eslint/max-params\n): Server => {\n const createHttpServer =\n !socketPath && tls ? createServerHttps : createServerHttp;\n\n if (!tls) {\n return (createHttpServer as typeof createServerHttps)(callback);\n }\n\n const options = {\n key: readFileSync(`${dirname}/server.key`),\n cert: readFileSync(`${dirname}/server.crt`),\n };\n\n return (createHttpServer as typeof createServerHttps)(options, callback);\n};\n\nexport default function alpListen(\n config: Config,\n callback: RequestListener,\n dirname?: string,\n): Promise<Server> {\n return new Promise((resolve) => {\n const socketPath = config.get<string>(\"socketPath\");\n const port = config.get<number>(\"port\");\n const hostname = config.get<string>(\"hostname\");\n const tls = config.get<boolean>(\"tls\");\n\n logger.info(\"Creating server\", socketPath ? { socketPath } : { port });\n const server = createServer(callback, socketPath, tls, dirname);\n\n if (socketPath) {\n try {\n unlinkSync(socketPath);\n } catch {}\n\n server.listen(socketPath, () => {\n if (socketPath) {\n chmodSync(socketPath, \"777\");\n }\n\n logger.info(\"Server listening\", { socketPath });\n resolve(server);\n });\n } else {\n server.listen(port, hostname, () => {\n logger.info(\"Server listening\", { port });\n resolve(server);\n });\n }\n });\n}\n","export type Errors = Record<string, any>;\n\nexport class ParamValidationResult {\n _errors?: Errors;\n\n _error(name: string, key: string, value: unknown): void {\n if (!this._errors) {\n this._errors = {};\n }\n\n this._errors[name] = { error: key, value };\n }\n\n getErrors(): Errors | undefined {\n return this._errors;\n }\n\n hasErrors(): boolean {\n return this._errors !== undefined;\n }\n\n isValid(): boolean {\n return this._errors === undefined;\n }\n\n // string(name: string): ParamValueStringValidator {\n // return new ParamValueStringValidator(this, name, this.context.param(name));\n // }\n /* int(name, position) {\n return new ParamValueIntValidator(this, name, this.context.param(name, position));\n }\n model(modelName, name) {\n name = name || S.string.lcFirst(modelName);\n console.log('paramvalidator model', modelName, M[modelName]);\n let data = this.context.getOrPostParam(name);\n return new ParamValueModelValidator(this, name, !data ? null : new M[modelName](data));\n } */\n}\n","import type { Context } from \"../AlpNodeApp\";\nimport { ParamValidationResult } from \"./ParamValidationResult\";\n\nexport default class ParamValid extends ParamValidationResult {\n context: Context;\n\n constructor(context: Context) {\n super();\n this.context = context;\n }\n\n override _error(): void {\n this.context.throw(400, \"Invalid params\", { validator: this });\n }\n}\n","import type { ParamValidationResult } from \"./ParamValidationResult\";\n\nexport default class ParamValueValidator<T> {\n readonly validationResult: ParamValidationResult;\n\n readonly name: string;\n\n readonly value: T;\n\n constructor(validationResult: ParamValidationResult, name: string, value: T) {\n this.validationResult = validationResult;\n this.name = name;\n this.value = value;\n }\n\n isValid(): boolean {\n return this.validationResult.isValid();\n }\n\n _error(key: string): void {\n this.validationResult._error(this.name, key, this.value);\n }\n}\n","import ParamValueValidator from \"./ParamValueValidator\";\n\nexport default class ParamValueStringValidator<\n T extends string = string,\n> extends ParamValueValidator<T | null | undefined> {\n notEmpty(): ParamValueValidator<T> {\n if (this.value == null || this.value.trim() === \"\") {\n this._error(\"notEmpty\");\n }\n\n return this as ParamValueValidator<T>;\n }\n}\n","import type { Context } from \"../AlpNodeApp\";\nimport type { ParamValidationResult } from \"./ParamValidationResult\";\nimport ParamValueStringValidator from \"./ParamValueStringValidator\";\n\nexport class ParamValueFromContext {\n readonly validationResult: ParamValidationResult;\n\n readonly context: Context;\n\n constructor(context: Context, validationResult: ParamValidationResult) {\n this.validationResult = validationResult;\n this.context = context;\n }\n\n namedParam(name: string): ParamValueStringValidator {\n return new ParamValueStringValidator(\n this.validationResult,\n name,\n this.context.namedRouteParam(name),\n );\n }\n\n otherParam(position: number): ParamValueStringValidator {\n return new ParamValueStringValidator(\n this.validationResult,\n String(position),\n this.context.otherRouteParam(position),\n );\n }\n\n queryParam(name: string): ParamValueStringValidator {\n return new ParamValueStringValidator(\n this.validationResult,\n name,\n this.context.queryParam(name),\n );\n }\n\n // bodyParam: <T>(name: string): ParamValueValidator<string | undefined> {\n\n // }\n}\n","import { defineLazyProperty } from \"object-properties\";\nimport type { AlpNodeApp, Context } from \"../AlpNodeApp\";\nimport ParamValid from \"./ParamValid\";\nimport { ParamValidationResult } from \"./ParamValidationResult\";\nimport { ParamValueFromContext } from \"./ParamValueFromContext\";\n\nexport interface AlpParamsContext {\n params: ParamValueFromContext;\n validParams: ParamValueFromContext;\n namedRouteParam: (name: string) => string | undefined;\n otherRouteParam: (position: number) => string | undefined;\n /** @deprecated use namedRouteParam */\n namedParam: never;\n /** @deprecated use otherRouteParam */\n otherParam: never;\n queryParam: (name: string) => string | undefined;\n bodyParam: <T>(name: string) => T | undefined;\n}\n\nexport interface AlpParamsRequest {\n searchParams: URLSearchParams;\n}\n\nexport default function alpParams(app: AlpNodeApp): void {\n Object.assign(app.context, {\n namedRouteParam(this: Context, name: string): string | undefined {\n const namedParams = this.route.namedParams;\n return namedParams?.get(name);\n },\n\n otherRouteParam(this: Context, position: number): string | undefined {\n const otherParams = this.route.otherParams;\n return otherParams?.[position - 1];\n },\n\n queryParam(this: Context, name: string): string | undefined {\n const searchParams = this.request.searchParams;\n return searchParams.get(name) ?? undefined;\n },\n\n bodyParam<T>(this: Context, name: string): T | undefined {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-member-access\n return (this.body as any)[name];\n },\n });\n\n defineLazyProperty(\n app.request,\n \"searchParams\",\n function searchParams(this: Context[\"request\"]): URLSearchParams {\n return new URLSearchParams(this.search);\n },\n );\n\n defineLazyProperty(\n app.context,\n \"params\",\n function params(this: Context): ParamValueFromContext {\n return new ParamValueFromContext(this, new ParamValidationResult());\n },\n );\n\n defineLazyProperty(\n app.context,\n \"validParams\",\n function validParams(this: Context): ParamValueFromContext {\n return new ParamValueFromContext(this, new ParamValid(this));\n },\n );\n}\n","import IntlMessageFormatDefault from \"intl-messageformat\";\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\nconst IntlMessageFormat: typeof IntlMessageFormatDefault =\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (IntlMessageFormatDefault as any).default || IntlMessageFormatDefault;\n\nexport type Translations = Readonly<Record<string, IntlMessageFormatDefault>>;\n\nexport default function load(\n translations: Readonly<Record<string, unknown>>,\n language: string,\n): Translations {\n const result: Record<string, IntlMessageFormatDefault> = {};\n\n (function loadMap(record: Record<string, unknown>, prefix: string) {\n Object.entries(record).forEach(([key, value]) => {\n if (typeof value === \"object\" && value !== null) {\n loadMap(value as Record<string, unknown>, `${prefix}${key}.`);\n return;\n }\n\n result[`${prefix}${key}`] = new IntlMessageFormat(\n value as string,\n language,\n );\n });\n })(translations, \"\");\n\n return result;\n}\n","import { Logger } from \"nightingale-logger\";\nimport type { AlpNodeApp, Context } from \"../AlpNodeApp\";\nimport type { Translations } from \"./load\";\nimport load from \"./load\";\n\nconst logger = new Logger(\"alp:translate\");\n\ntype Args = Record<string, any>;\n\nexport interface TranslateBaseContext {\n t: (id: string, args: Args) => string;\n}\nexport interface TranslateContext {\n readonly language: string;\n}\n\nexport default function alpTranslate(\n dirname: string,\n): (app: AlpNodeApp) => void {\n dirname = dirname.replace(/\\/*$/, \"/\");\n return (app: AlpNodeApp) => {\n const appTranslations = new Map<string, Translations>();\n\n Object.assign(app.context, {\n t(this: Context, id: string, args: Args): string {\n const msg = appTranslations.get(this.language)?.[id];\n if (!msg) {\n logger.warn(\"invalid msg\", { language: this.language, id });\n return id;\n }\n\n return msg.format(args) as string;\n },\n });\n\n const config = app.config;\n\n config.get<string[]>(\"availableLanguages\").forEach((language) => {\n const translations = app.loadConfigSync(dirname + language);\n appTranslations.set(language, load(translations, language));\n });\n\n return appTranslations;\n };\n}\n","import type {\n IncomingMessage,\n RequestListener,\n Server,\n ServerResponse,\n} from \"node:http\";\nimport path from \"node:path\";\nimport Koa from \"koa\";\nimport type { DefaultContext, DefaultState, ParameterizedContext } from \"koa\";\nimport compress from \"koa-compress\";\nimport serve from \"koa-static\";\nimport { Logger } from \"nightingale-logger\";\nimport type { Router } from \"router-segments\";\nimport type { Config } from \"./config\";\nimport errors from \"./errors\";\nimport type { AlpLanguageContext } from \"./language\";\nimport language from \"./language\";\nimport _listen from \"./listen\";\nimport type { AlpParamsContext, AlpParamsRequest } from \"./params/index\";\nimport params from \"./params/index\";\nimport type {\n AlpRouteRef,\n RouterContext as AlpRouterContext,\n UrlGenerator,\n} from \"./router\";\nimport type { TranslateBaseContext, TranslateContext } from \"./translate/index\";\nimport translate from \"./translate/index\";\nimport type {\n Context as AlpContext,\n ContextSanitizedState,\n ContextState,\n NodeApplication,\n NodeConfig,\n} from \"./types\";\n\nconst logger = new Logger(\"alp\");\n\nexport interface AlpNodeAppOptions {\n appDirname: string;\n packageDirname: string;\n config: Config & NodeConfig;\n certPath?: string;\n publicPath?: string;\n}\n\ndeclare module \"koa\" {\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type\n interface DefaultState extends ContextState {}\n\n interface DefaultContext\n extends AlpContext,\n AlpParamsContext,\n AlpRouterContext,\n AlpLanguageContext,\n TranslateContext {}\n\n interface BaseContext extends AlpContext, TranslateBaseContext {\n urlGenerator: UrlGenerator;\n redirectTo: <P extends Record<string, unknown>>(\n to: string,\n params?: P,\n ) => void;\n }\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type\n interface BaseRequest extends AlpParamsRequest {}\n}\n\nexport class AlpNodeApp\n extends Koa<DefaultState, DefaultContext>\n implements NodeApplication\n{\n dirname: string;\n\n certPath: string;\n\n publicPath: string;\n\n config: Config & NodeConfig;\n\n _server?: Server;\n\n router?: Router<any, AlpRouteRef>;\n\n /**\n * @param {Object} [options]\n * @param {string} [options.certPath] directory of the ssl certificates\n * @param {string} [options.publicPath] directory of public files\n */\n constructor({\n appDirname,\n packageDirname,\n config,\n certPath,\n publicPath,\n }: AlpNodeAppOptions) {\n super();\n\n this.dirname = path.normalize(appDirname);\n this.certPath = certPath || `${packageDirname}/config/cert`;\n this.publicPath = publicPath || `${packageDirname}/public/`;\n\n this.config = config;\n this.context.config = this.config;\n\n params(this);\n language(this);\n translate(\"locales\")(this);\n\n this.use(compress());\n }\n\n existsConfigSync(name: string): ReturnType<Config[\"existsConfigSync\"]> {\n return this.config.existsConfigSync(name);\n }\n\n loadConfigSync(name: string): ReturnType<Config[\"loadConfigSync\"]> {\n return this.config.loadConfigSync(name);\n }\n\n override createContext<StateT = DefaultState>(\n req: IncomingMessage,\n res: ServerResponse,\n ): ParameterizedContext<StateT> {\n const ctx = super.createContext<StateT>(req, res);\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n ctx.sanitizedState = {} as ContextSanitizedState;\n return ctx;\n }\n\n servePublic(): void {\n this.use(serve(this.publicPath)); // static files\n }\n\n catchErrors(): void {\n this.use(errors);\n }\n\n override listen(): never {\n throw new Error(\"Use start instead\");\n }\n\n /**\n * Close server and emit close event\n */\n close(): void {\n if (this._server) {\n this._server.close();\n this.emit(\"close\");\n }\n }\n\n async start(fn: () => Promise<void> | void): Promise<Server> {\n await fn();\n try {\n const server = await _listen(\n this.config,\n this.callback() as RequestListener,\n this.certPath,\n );\n this._server = server;\n logger.success(\"started\");\n if (process.send) process.send(\"ready\");\n return server;\n } catch (error: unknown) {\n logger.error(\"start fail\", { err: error });\n throw error;\n }\n }\n}\n\nexport type { Context } from \"koa\";\n\nexport { type NodeApplication } from \"./types\";\n","import { existsSync, readFileSync } from \"node:fs\";\nimport deepFreeze from \"deep-freeze-es6\";\nimport minimist from \"minimist\";\nimport type { NodeConfig, PackageConfig } from \"./types\";\n\nconst argv = minimist(process.argv.slice(2));\n\nfunction _existsConfigSync(dirname: string, name: string): boolean {\n return existsSync(`${dirname}${name}.json`);\n}\n\nfunction _loadConfigSync(\n dirname: string,\n name: string,\n): Record<string, unknown> {\n const content = readFileSync(`${dirname}${name}.json`, \"utf8\");\n return JSON.parse(content) as Record<string, unknown>;\n}\n\nexport interface ConfigOptions {\n argv?: string[];\n packageConfig?: PackageConfig;\n version?: string;\n}\n\nexport class Config {\n packageConfig?: PackageConfig;\n\n private _record: Record<string, unknown>;\n\n private readonly _dirname: string;\n\n constructor(dirname: string, options?: ConfigOptions) {\n this._record = {};\n this._dirname = dirname.replace(/\\/*$/, \"/\");\n if (options) {\n this.loadSync(options);\n }\n }\n\n loadSync(options: ConfigOptions = {}): Config & NodeConfig {\n const env = process.env.CONFIG_ENV || process.env.NODE_ENV || \"development\";\n const { argv: argvOverrides = [], packageConfig, version } = options;\n this.packageConfig = packageConfig;\n\n const config = _loadConfigSync(this._dirname, \"common\");\n for (const [key, value] of Object.entries(\n _loadConfigSync(this._dirname, env),\n )) {\n config[key] = value;\n }\n\n if (this.existsConfigSync(\"local\")) {\n for (const [key, value] of Object.entries(\n _loadConfigSync(this._dirname, \"local\"),\n )) {\n config[key] = value;\n }\n }\n\n if (config.version) {\n throw new Error('Cannot have \"version\", in config.');\n }\n\n config.version = String(version || argv.version || packageConfig?.version);\n\n const socketPath: string | undefined = (argv.socket ||\n argv[\"socket-path\"] ||\n argv.socketPath) as string | undefined;\n if (socketPath) {\n config.socketPath = socketPath;\n } else if (argv.port) {\n config.port = argv.port;\n delete config.socketPath;\n } else if (process.env.PORT) {\n config.port = Number(process.env.PORT);\n delete config.socketPath;\n }\n\n argvOverrides.forEach((key) => {\n const splitted = key.split(\".\");\n const value =\n splitted.length > 0 &&\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return,unicorn/no-array-reduce\n splitted.reduce((config, partialKey) => config[partialKey], argv);\n if (value !== undefined) {\n const last = splitted.pop()!;\n const v =\n splitted.length === 0\n ? config\n : // eslint-disable-next-line unicorn/no-array-reduce\n splitted.reduce(\n (config, partialKey) =>\n config[partialKey] as Record<string, unknown>,\n config,\n );\n v[last] = value;\n }\n });\n\n this._record = deepFreeze(config);\n return this as unknown as Config & NodeConfig;\n }\n\n get<T>(key: string): Readonly<T> {\n return this._record[key] as T;\n }\n\n existsConfigSync(name: string): boolean {\n return _existsConfigSync(this._dirname, name);\n }\n\n loadConfigSync(name: string): Readonly<Record<string, unknown>> {\n return _loadConfigSync(this._dirname, name);\n }\n}\n","import type {\n LocaleType,\n RouteMatch,\n Router,\n RouterBuilder,\n} from \"router-segments\";\nimport { createRouterBuilder } from \"router-segments\";\nimport type { AlpNodeApp, Context } from \"./AlpNodeApp\";\n\nexport type AlpRouter<Locales extends LocaleType> = Router<\n Locales,\n AlpRouteRef\n>;\nexport type AlpRouteRef = (ctx: Context) => Promise<void> | void;\ntype ReturnType = (app: AlpNodeApp) => AlpRouteRef;\n\nexport interface RouterContext {\n route: RouteMatch<any, AlpRouteRef>;\n}\nexport const createAlpRouterBuilder = <\n Locales extends LocaleType,\n>(): RouterBuilder<Locales, AlpRouteRef> =>\n createRouterBuilder<Locales, AlpRouteRef>();\n\nexport type UrlGenerator = <P extends Record<string, unknown> | undefined>(\n routeKey: string,\n params?: P,\n) => string;\n\nexport default function alpRouter<Locales extends string>(\n router: Router<Locales, AlpRouteRef>,\n): ReturnType {\n return (app: AlpNodeApp) => {\n app.router = router;\n\n app.context.urlGenerator = function urlGenerator<\n P extends Record<string, unknown> | undefined,\n >(this: Context, routeKey: string, params?: P): string {\n return router.toLocalizedPath(this.language as Locales, routeKey, params);\n };\n\n app.context.redirectTo = function redirectTo<\n P extends Record<string, unknown> | undefined,\n >(this: Context, to: string, params?: P): void {\n this.redirect(\n router.toLocalizedPath(this.language as Locales, to, params),\n );\n };\n\n return async (ctx: Context): Promise<void> => {\n // eslint-disable-next-line unicorn/no-array-method-this-argument\n const routeMatch = router.find(ctx.request.path, ctx.language as Locales);\n\n if (!routeMatch) {\n ctx.status = 404;\n throw new Error(`Route not found: ${ctx.request.path}`);\n }\n\n ctx.route = routeMatch;\n\n await routeMatch.ref(ctx);\n };\n };\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Logger } from \"nightingale-logger\";\nimport type { AlpNodeAppOptions } from \"./AlpNodeApp\";\nimport { AlpNodeApp } from \"./AlpNodeApp\";\nimport { Config } from \"./config\";\n\nexport type {\n BaseContext,\n NodeApplication,\n NodeConfig,\n ContextState,\n ContextSanitizedState,\n} from \"./types\";\nexport type { Context } from \"./AlpNodeApp\";\n\nconst logger = new Logger(\"alp\");\n\nexport const appDirname = path.resolve(\"build\");\n\nconst packagePath = path.resolve(\"package.json\");\nif (!packagePath) {\n throw new Error(`Could not find package.json: \"${String(packagePath)}\"`);\n}\nexport const packageDirname = path.dirname(packagePath);\n\nlogger.debug(\"init\", { appDirname, packageDirname });\n\nexport const packageConfig: Record<string, unknown> = JSON.parse(\n readFileSync(packagePath, \"utf8\"),\n) as Record<string, unknown>;\n\nconst buildedConfigPath = `${appDirname}/build/config/`;\nconst configPath = existsSync(buildedConfigPath)\n ? buildedConfigPath\n : `${appDirname}/config/`;\n\nexport const config = new Config(configPath).loadSync({ packageConfig });\n\nexport type AppOptions = Omit<\n AlpNodeAppOptions,\n \"appDirname\" | \"config\" | \"packageDirname\"\n>;\n\nexport default class App extends AlpNodeApp {\n constructor(options?: AppOptions) {\n super({\n ...options,\n appDirname,\n packageDirname,\n config,\n });\n }\n}\n\nexport { Config } from \"./config\";\n\nexport {\n default as router,\n createAlpRouterBuilder,\n type AlpRouteRef,\n type AlpRouter,\n} from \"./router\";\n"],"names":["logger","createServerHttps","createServerHttp","params","language","translate","errors","_listen","config"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "alp-node",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "9.0.1",
|
|
4
4
|
"description": "framework based on koa 2",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"springbokjs",
|
|
@@ -22,10 +22,10 @@
|
|
|
22
22
|
},
|
|
23
23
|
"type": "module",
|
|
24
24
|
"engines": {
|
|
25
|
-
"node": ">=
|
|
25
|
+
"node": ">=22.18.0"
|
|
26
26
|
},
|
|
27
27
|
"sideEffects": false,
|
|
28
|
-
"main": "./dist/index-
|
|
28
|
+
"main": "./dist/index-node.mjs",
|
|
29
29
|
"types": "./dist/definitions/index.d.ts",
|
|
30
30
|
"typesVersions": {
|
|
31
31
|
">=3.1": {
|
|
@@ -39,13 +39,13 @@
|
|
|
39
39
|
".": {
|
|
40
40
|
"types": "./dist/definitions/index.d.ts",
|
|
41
41
|
"node": {
|
|
42
|
-
"import": "./dist/index-
|
|
42
|
+
"import": "./dist/index-node.mjs"
|
|
43
43
|
}
|
|
44
44
|
},
|
|
45
45
|
"./AlpNodeApp": {
|
|
46
46
|
"types": "./dist/definitions/AlpNodeApp.d.ts",
|
|
47
47
|
"node": {
|
|
48
|
-
"import": "./dist/AlpNodeApp-
|
|
48
|
+
"import": "./dist/AlpNodeApp-node.mjs"
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
},
|
|
@@ -57,13 +57,13 @@
|
|
|
57
57
|
"build": "yarn clean:build && rollup --config rollup.config.mjs && yarn run build:definitions",
|
|
58
58
|
"build:definitions": "tsc -p tsconfig.json",
|
|
59
59
|
"clean": "yarn clean:build",
|
|
60
|
-
"clean:build": "pob-
|
|
60
|
+
"clean:build": "pob-esbuild-clean-out dist",
|
|
61
61
|
"lint": "yarn run lint:eslint",
|
|
62
62
|
"lint:eslint": "yarn ../.. run eslint --quiet packages/alp-node",
|
|
63
63
|
"watch": "yarn clean:build && rollup --config rollup.config.mjs --watch"
|
|
64
64
|
},
|
|
65
65
|
"pob": {
|
|
66
|
-
"bundler": "rollup-
|
|
66
|
+
"bundler": "rollup-esbuild",
|
|
67
67
|
"entries": [
|
|
68
68
|
"index",
|
|
69
69
|
"AlpNodeApp"
|
|
@@ -71,9 +71,11 @@
|
|
|
71
71
|
"envs": [
|
|
72
72
|
{
|
|
73
73
|
"target": "node",
|
|
74
|
-
"version": "
|
|
74
|
+
"version": "22",
|
|
75
|
+
"omitVersionInFileName": true
|
|
75
76
|
}
|
|
76
|
-
]
|
|
77
|
+
],
|
|
78
|
+
"typescript": true
|
|
77
79
|
},
|
|
78
80
|
"prettier": "@pob/root/prettier-config",
|
|
79
81
|
"peerDependencies": {
|
|
@@ -81,7 +83,7 @@
|
|
|
81
83
|
},
|
|
82
84
|
"dependencies": {
|
|
83
85
|
"@types/koa": "^3.0.0",
|
|
84
|
-
"@types/node": ">=
|
|
86
|
+
"@types/node": ">=22.0.0",
|
|
85
87
|
"deep-freeze-es6": "^4.0.1",
|
|
86
88
|
"error-html": "^0.3.5",
|
|
87
89
|
"intl-messageformat": "^10.0.0",
|
|
@@ -89,15 +91,14 @@
|
|
|
89
91
|
"koa-compress": "^5.1.1",
|
|
90
92
|
"koa-static": "^5.0.0",
|
|
91
93
|
"minimist": "^1.2.8",
|
|
92
|
-
"nightingale-logger": "^
|
|
94
|
+
"nightingale-logger": "^16.0.0",
|
|
93
95
|
"object-properties": "^9.0.1"
|
|
94
96
|
},
|
|
95
97
|
"devDependencies": {
|
|
96
|
-
"@
|
|
97
|
-
"@types/koa-compress": "4.0.
|
|
98
|
+
"@pob/rollup-esbuild": "6.7.0",
|
|
99
|
+
"@types/koa-compress": "4.0.7",
|
|
98
100
|
"@types/koa-static": "4.0.4",
|
|
99
101
|
"@types/minimist": "1.2.5",
|
|
100
|
-
"
|
|
101
|
-
"typescript": "5.8.3"
|
|
102
|
+
"typescript": "5.9.3"
|
|
102
103
|
}
|
|
103
104
|
}
|
package/src/AlpNodeApp.ts
CHANGED
|
@@ -6,7 +6,7 @@ import type {
|
|
|
6
6
|
} from "node:http";
|
|
7
7
|
import path from "node:path";
|
|
8
8
|
import Koa from "koa";
|
|
9
|
-
import type { DefaultState, ParameterizedContext } from "koa";
|
|
9
|
+
import type { DefaultContext, DefaultState, ParameterizedContext } from "koa";
|
|
10
10
|
import compress from "koa-compress";
|
|
11
11
|
import serve from "koa-static";
|
|
12
12
|
import { Logger } from "nightingale-logger";
|
|
@@ -65,7 +65,10 @@ declare module "koa" {
|
|
|
65
65
|
interface BaseRequest extends AlpParamsRequest {}
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
export class AlpNodeApp
|
|
68
|
+
export class AlpNodeApp
|
|
69
|
+
extends Koa<DefaultState, DefaultContext>
|
|
70
|
+
implements NodeApplication
|
|
71
|
+
{
|
|
69
72
|
dirname: string;
|
|
70
73
|
|
|
71
74
|
certPath: string;
|