@adviser/cement 0.2.34 → 0.2.36
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/{chunk-7KFVMTOS.js → chunk-USQXEZHL.js} +7 -7
- package/chunk-USQXEZHL.js.map +1 -0
- package/index.cjs +138 -38
- package/index.cjs.map +1 -1
- package/index.d.cts +39 -19
- package/index.d.ts +39 -19
- package/index.js +137 -36
- package/index.js.map +1 -1
- package/package.json +1 -1
- package/src/jsr.json +1 -1
- package/src/logger-impl.ts +76 -18
- package/src/logger.ts +52 -21
- package/src/uri.ts +95 -28
- package/src/utils/console-write-stream.ts +6 -6
- package/src/utils/stripper.ts +11 -4
- package/ts/logger-impl.d.ts +8 -5
- package/ts/logger-impl.d.ts.map +1 -1
- package/ts/logger-impl.js +61 -8
- package/ts/logger-impl.js.map +1 -1
- package/ts/logger.d.ts +7 -6
- package/ts/logger.d.ts.map +1 -1
- package/ts/logger.js +23 -15
- package/ts/logger.js.map +1 -1
- package/ts/logger.test.js +205 -0
- package/ts/logger.test.js.map +1 -1
- package/ts/uri.d.ts +23 -7
- package/ts/uri.d.ts.map +1 -1
- package/ts/uri.js +48 -9
- package/ts/uri.js.map +1 -1
- package/ts/uri.test.js +55 -1
- package/ts/uri.test.js.map +1 -1
- package/ts/utils/console-write-stream.js +6 -6
- package/ts/utils/console-write-stream.js.map +1 -1
- package/ts/utils/stripper.d.ts +1 -1
- package/ts/utils/stripper.d.ts.map +1 -1
- package/ts/utils/stripper.js +3 -0
- package/ts/utils/stripper.js.map +1 -1
- package/ts/utils/stripper.test.js +31 -0
- package/ts/utils/stripper.test.js.map +1 -1
- package/utils/index.cjs +6 -6
- package/utils/index.cjs.map +1 -1
- package/utils/index.js +1 -1
- package/chunk-7KFVMTOS.js.map +0 -1
package/src/logger-impl.ts
CHANGED
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
logValue,
|
|
10
10
|
Serialized,
|
|
11
11
|
WithLogger,
|
|
12
|
-
|
|
12
|
+
// sanitizeSerialize,
|
|
13
13
|
Sized,
|
|
14
14
|
Lengthed,
|
|
15
15
|
LogValue,
|
|
@@ -67,7 +67,13 @@ export class JSONFormatter implements LogFormatter {
|
|
|
67
67
|
this._space = space;
|
|
68
68
|
}
|
|
69
69
|
format(attr: LogSerializable): Uint8Array {
|
|
70
|
-
|
|
70
|
+
let ret: string;
|
|
71
|
+
try {
|
|
72
|
+
ret = JSON.stringify(attr, null, this._space);
|
|
73
|
+
} catch (e) {
|
|
74
|
+
ret = JSON.stringify({ internal: { message: (e as Error).message, stack: (e as Error).stack } });
|
|
75
|
+
}
|
|
76
|
+
return this._txtEnDe.encode(ret + "\n");
|
|
71
77
|
}
|
|
72
78
|
}
|
|
73
79
|
|
|
@@ -79,7 +85,7 @@ export class YAMLFormatter implements LogFormatter {
|
|
|
79
85
|
this._space = space;
|
|
80
86
|
}
|
|
81
87
|
format(attr: LogSerializable): Uint8Array {
|
|
82
|
-
return this._txtEnDe.encode("---\n" + YAML.stringify(attr,
|
|
88
|
+
return this._txtEnDe.encode("---\n" + YAML.stringify(attr, null, this._space) + "\n");
|
|
83
89
|
}
|
|
84
90
|
}
|
|
85
91
|
|
|
@@ -162,7 +168,7 @@ export class LoggerImpl implements Logger {
|
|
|
162
168
|
}
|
|
163
169
|
|
|
164
170
|
Attributes(): Record<string, unknown> {
|
|
165
|
-
return JSON.parse(JSON.stringify(this._attributes,
|
|
171
|
+
return JSON.parse(JSON.stringify(this._attributes, null));
|
|
166
172
|
// return Array.from(Object.entries(this._attributes)).reduce(
|
|
167
173
|
// (acc, [key, value]) => {
|
|
168
174
|
// if (value instanceof LogValue) {
|
|
@@ -259,10 +265,43 @@ export class LoggerImpl implements Logger {
|
|
|
259
265
|
}
|
|
260
266
|
return this;
|
|
261
267
|
}
|
|
262
|
-
Bool(key: string, value: unknown): Logger {
|
|
263
|
-
this.
|
|
268
|
+
Bool(key: string | Record<string, unknown>, value: unknown): Logger {
|
|
269
|
+
this.coerceKey(key, !!value);
|
|
270
|
+
// this._attributes[key] = logValue(!!value);
|
|
271
|
+
return this;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
Http(res: Response | Result<Response>, req?: Request, key?: string): Logger {
|
|
275
|
+
if (Result.Is(res)) {
|
|
276
|
+
if (res.isErr()) {
|
|
277
|
+
this.Err(res.Err());
|
|
278
|
+
return this;
|
|
279
|
+
}
|
|
280
|
+
res = res.Ok();
|
|
281
|
+
}
|
|
282
|
+
let reqRes: Response | { res: Response; req: Request } = res;
|
|
283
|
+
if (req) {
|
|
284
|
+
reqRes = { res, req };
|
|
285
|
+
}
|
|
286
|
+
this.Any(key || "Http", reqRes as unknown as LogSerializable);
|
|
287
|
+
return this;
|
|
288
|
+
}
|
|
289
|
+
Pair(x: Record<string, unknown>): Logger {
|
|
290
|
+
for (const key of Object.keys(x)) {
|
|
291
|
+
const value = x[key];
|
|
292
|
+
if (value instanceof LogValue) {
|
|
293
|
+
this._attributes[key] = value;
|
|
294
|
+
continue;
|
|
295
|
+
}
|
|
296
|
+
if (Result.Is(value)) {
|
|
297
|
+
this.Result(key, value);
|
|
298
|
+
continue;
|
|
299
|
+
}
|
|
300
|
+
this.Any(key, value as LogSerializable);
|
|
301
|
+
}
|
|
264
302
|
return this;
|
|
265
303
|
}
|
|
304
|
+
|
|
266
305
|
Result<T>(key: string, res: Result<T, Error>): Logger {
|
|
267
306
|
if (res.isOk()) {
|
|
268
307
|
this._attributes[key] = logValue(res.Ok() as Serialized);
|
|
@@ -287,13 +326,22 @@ export class LoggerImpl implements Logger {
|
|
|
287
326
|
return this;
|
|
288
327
|
}
|
|
289
328
|
|
|
290
|
-
|
|
291
|
-
|
|
329
|
+
private coerceKey(key: string | Record<string, unknown>, value?: unknown): void {
|
|
330
|
+
if (typeof key === "string") {
|
|
331
|
+
this._attributes[key] = logValue(value as LogValueArg);
|
|
332
|
+
} else {
|
|
333
|
+
this.Pair(key);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
Str(key: string | Record<string, string>, value?: string): Logger {
|
|
338
|
+
this.coerceKey(key, value);
|
|
292
339
|
return this;
|
|
293
340
|
}
|
|
294
341
|
|
|
295
|
-
Any(key: string
|
|
296
|
-
this.
|
|
342
|
+
Any(key: string | Record<string, unknown>, value?: unknown): Logger {
|
|
343
|
+
this.coerceKey(key, value);
|
|
344
|
+
//this._attributes[coerceKey(key)] = logValue(value as LogValueArg);
|
|
297
345
|
return this;
|
|
298
346
|
}
|
|
299
347
|
Dur(key: string, nsec: number): Logger {
|
|
@@ -301,11 +349,12 @@ export class LoggerImpl implements Logger {
|
|
|
301
349
|
// new Intl.DurationFormat("en", { style: "narrow" }).format(nsec);
|
|
302
350
|
return this;
|
|
303
351
|
}
|
|
304
|
-
Uint64(key: string, value
|
|
305
|
-
this.
|
|
352
|
+
Uint64(key: string | Record<string, number>, value?: number): Logger {
|
|
353
|
+
this.coerceKey(key, value);
|
|
354
|
+
//this._attributes[coerceKey(key)] = logValue(value);
|
|
306
355
|
return this;
|
|
307
356
|
}
|
|
308
|
-
Int(key: string, value
|
|
357
|
+
Int(key: string | Record<string, number>, value?: number): Logger {
|
|
309
358
|
return this.Uint64(key, value);
|
|
310
359
|
}
|
|
311
360
|
|
|
@@ -415,7 +464,16 @@ class WithLoggerBuilder implements WithLogger {
|
|
|
415
464
|
return this;
|
|
416
465
|
}
|
|
417
466
|
|
|
418
|
-
|
|
467
|
+
Http(res: Response | Result<Response>, req?: Request, key?: string): WithLogger {
|
|
468
|
+
this._li.Http(res, req, key);
|
|
469
|
+
return this;
|
|
470
|
+
}
|
|
471
|
+
Pair(x: Record<string, unknown>): WithLogger {
|
|
472
|
+
this._li.Pair(x);
|
|
473
|
+
return this;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
Str(key: string | Record<string, string>, value?: string): WithLogger {
|
|
419
477
|
this._li.Str(key, value);
|
|
420
478
|
return this;
|
|
421
479
|
}
|
|
@@ -434,7 +492,7 @@ class WithLoggerBuilder implements WithLogger {
|
|
|
434
492
|
this._li.Ref(key, action);
|
|
435
493
|
return this;
|
|
436
494
|
}
|
|
437
|
-
Bool(key: string, value
|
|
495
|
+
Bool(key: string | Record<string, unknown>, value?: unknown): WithLogger {
|
|
438
496
|
this._li.Bool(key, value);
|
|
439
497
|
return this;
|
|
440
498
|
}
|
|
@@ -446,7 +504,7 @@ class WithLoggerBuilder implements WithLogger {
|
|
|
446
504
|
this._li.Url(url, key);
|
|
447
505
|
return this;
|
|
448
506
|
}
|
|
449
|
-
Int(key: string, value
|
|
507
|
+
Int(key: string | Record<string, number>, value?: number): WithLogger {
|
|
450
508
|
this._li.Int(key, value);
|
|
451
509
|
return this;
|
|
452
510
|
}
|
|
@@ -485,7 +543,7 @@ class WithLoggerBuilder implements WithLogger {
|
|
|
485
543
|
this._li.Timestamp();
|
|
486
544
|
return this;
|
|
487
545
|
}
|
|
488
|
-
Any(key: string, value
|
|
546
|
+
Any(key: string | Record<string, unknown>, value?: unknown | LogSerializable): WithLogger {
|
|
489
547
|
this._li.Any(key, value);
|
|
490
548
|
return this;
|
|
491
549
|
}
|
|
@@ -493,7 +551,7 @@ class WithLoggerBuilder implements WithLogger {
|
|
|
493
551
|
this._li.Dur(key, nsec);
|
|
494
552
|
return this;
|
|
495
553
|
}
|
|
496
|
-
Uint64(key: string, value
|
|
554
|
+
Uint64(key: string | Record<string, number>, value?: number): WithLogger {
|
|
497
555
|
this._li.Uint64(key, value);
|
|
498
556
|
return this;
|
|
499
557
|
}
|
package/src/logger.ts
CHANGED
|
@@ -16,7 +16,12 @@ export type FnSerialized = () => Serialized | Serialized[];
|
|
|
16
16
|
export class LogValue {
|
|
17
17
|
constructor(readonly fn: FnSerialized) {}
|
|
18
18
|
value(): Serialized | Serialized[] {
|
|
19
|
-
|
|
19
|
+
try {
|
|
20
|
+
// console.log("LogValue.value", this.fn.toString());
|
|
21
|
+
return this.fn();
|
|
22
|
+
} catch (e) {
|
|
23
|
+
return `LogValue:${(e as Error).message}`;
|
|
24
|
+
}
|
|
20
25
|
}
|
|
21
26
|
toJSON(): Serialized | Serialized[] {
|
|
22
27
|
return this.value();
|
|
@@ -25,17 +30,17 @@ export class LogValue {
|
|
|
25
30
|
|
|
26
31
|
export type LogSerializable = Record<string, LogValue | Promise<LogValue>>;
|
|
27
32
|
|
|
28
|
-
export function
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
33
|
+
// export function sanitizeSerialize(lineEnd?: string): (key: unknown, val: unknown) => unknown {
|
|
34
|
+
// const cache = new Set();
|
|
35
|
+
// return function (this: unknown, key: unknown, value: unknown) {
|
|
36
|
+
// if (typeof value === "object" && value !== null) {
|
|
37
|
+
// // Duplicate reference found, discard key
|
|
38
|
+
// if (cache.has(value)) return "...";
|
|
39
|
+
// cache.add(value);
|
|
40
|
+
// }
|
|
41
|
+
// return lineEnd ? value + lineEnd : value;
|
|
42
|
+
// };
|
|
43
|
+
// }
|
|
39
44
|
|
|
40
45
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
41
46
|
export function asyncLogValue(val: () => Promise<Serialized>): Promise<LogValue> {
|
|
@@ -69,20 +74,39 @@ export function logValue(val: LogValueArg, state: Set<unknown> = new Set<unknown
|
|
|
69
74
|
case "boolean":
|
|
70
75
|
return new LogValue(() => val);
|
|
71
76
|
case "object": {
|
|
77
|
+
if (val === null) {
|
|
78
|
+
return new LogValue(() => "null");
|
|
79
|
+
}
|
|
72
80
|
if (ArrayBuffer.isView(val)) {
|
|
73
81
|
return logValue(bin2string(val, 512));
|
|
74
82
|
}
|
|
75
83
|
if (Array.isArray(val)) {
|
|
76
|
-
return new LogValue(() => val.map((v) => logValue(v).value() as Serialized));
|
|
84
|
+
return new LogValue(() => (val as Serialized[]).map((v) => logValue(v).value() as Serialized));
|
|
77
85
|
}
|
|
78
|
-
if (val
|
|
79
|
-
|
|
86
|
+
// if (val instanceof Response) {
|
|
87
|
+
// // my = my.clone() as unknown as LogValue | Serialized[] | null
|
|
88
|
+
// // const rval = my as unknown as Partial<Response>;
|
|
89
|
+
// // delete rval.clone
|
|
90
|
+
// // delete rval.blob
|
|
91
|
+
// }
|
|
92
|
+
if (val instanceof Headers) {
|
|
93
|
+
return new LogValue(() => Object.fromEntries(val.entries()) as unknown as Serialized);
|
|
94
|
+
}
|
|
95
|
+
if (val instanceof ReadableStream) {
|
|
96
|
+
return new LogValue(() => ">Stream<");
|
|
80
97
|
}
|
|
98
|
+
if (val instanceof Promise) {
|
|
99
|
+
return new LogValue(() => ">Promise<");
|
|
100
|
+
}
|
|
101
|
+
|
|
81
102
|
// Duplicate reference found, discard key
|
|
82
103
|
if (state.has(val)) {
|
|
83
104
|
return new LogValue(() => "...");
|
|
84
105
|
}
|
|
85
106
|
state.add(val);
|
|
107
|
+
if (typeof val.toJSON === "function") {
|
|
108
|
+
return new LogValue(() => val.toJSON());
|
|
109
|
+
}
|
|
86
110
|
|
|
87
111
|
const res: Record<string, LogValue> = {};
|
|
88
112
|
const typedVal = val as unknown as Record<string, LogValueArg>;
|
|
@@ -91,7 +115,10 @@ export function logValue(val: LogValueArg, state: Set<unknown> = new Set<unknown
|
|
|
91
115
|
if (element instanceof LogValue) {
|
|
92
116
|
res[key] = element;
|
|
93
117
|
} else {
|
|
94
|
-
|
|
118
|
+
if (typeof element !== "function") {
|
|
119
|
+
res[key] = logValue(element, state);
|
|
120
|
+
}
|
|
121
|
+
// res[key] = logValue(element, state);
|
|
95
122
|
}
|
|
96
123
|
}
|
|
97
124
|
// ugly as hell cast but how declare a self-referencing type?
|
|
@@ -148,7 +175,15 @@ export interface LoggerInterface<R> {
|
|
|
148
175
|
|
|
149
176
|
Hash(value: unknown, key?: string): R;
|
|
150
177
|
|
|
151
|
-
Str(key:
|
|
178
|
+
Str<T extends string | Record<string, string>>(key: T, value?: T extends string ? string : undefined): R;
|
|
179
|
+
Uint64<T extends string | Record<string, number>>(key: T, value?: T extends string ? number : undefined): R;
|
|
180
|
+
Int<T extends string | Record<string, number>>(key: T, value?: T extends string ? number : undefined): R;
|
|
181
|
+
Bool<T extends string | Record<string, unknown>>(key: T, value?: T extends string ? unknown : undefined): R;
|
|
182
|
+
Any<T extends string | Record<string, unknown>>(key: T, value?: T extends string ? unknown : undefined): R;
|
|
183
|
+
|
|
184
|
+
Http(res: Response | Result<Response>, req?: Request, key?: string): R;
|
|
185
|
+
Pair(x: Record<string, unknown>): R;
|
|
186
|
+
|
|
152
187
|
Error(): R;
|
|
153
188
|
Warn(): R;
|
|
154
189
|
Debug(): R;
|
|
@@ -158,11 +193,7 @@ export interface LoggerInterface<R> {
|
|
|
158
193
|
Err(err: unknown | Result<unknown> | Error): R; // could be Error, or something which coerces to string
|
|
159
194
|
Info(): R;
|
|
160
195
|
Timestamp(): R;
|
|
161
|
-
Any(key: string, value: unknown): R;
|
|
162
196
|
Dur(key: string, nsec: number): R;
|
|
163
|
-
Uint64(key: string, value: number): R;
|
|
164
|
-
Int(key: string, value: number): R;
|
|
165
|
-
Bool(key: string, value: unknown): R;
|
|
166
197
|
}
|
|
167
198
|
|
|
168
199
|
export function IsLogger(obj: unknown): obj is Logger {
|
package/src/uri.ts
CHANGED
|
@@ -3,6 +3,38 @@ import { StripCommand, stripper } from "./utils/stripper.js";
|
|
|
3
3
|
|
|
4
4
|
type NullOrUndef = null | undefined;
|
|
5
5
|
|
|
6
|
+
type OneKey<K extends string, V = string> = Record<K, V>;
|
|
7
|
+
|
|
8
|
+
export interface URIInterface<R extends URIInterface<R>> {
|
|
9
|
+
// readonly hostname: string;
|
|
10
|
+
// readonly port: string;
|
|
11
|
+
// readonly host: string;
|
|
12
|
+
// readonly protocol: string;
|
|
13
|
+
// readonly pathname: string;
|
|
14
|
+
readonly getParams: Iterable<[string, string]>;
|
|
15
|
+
|
|
16
|
+
hasParam(key: string): boolean;
|
|
17
|
+
getParam<T extends string | undefined>(key: string | OneKey<string>, def?: T): T extends string ? string : string | undefined;
|
|
18
|
+
getParamResult(key: string, msgFn?: (key: string) => string): Result<string>;
|
|
19
|
+
getParamsResult(...keys: keysParam): Result<Record<string, string>>;
|
|
20
|
+
clone(): R;
|
|
21
|
+
asURL(): URL;
|
|
22
|
+
toString(): string;
|
|
23
|
+
toJSON(): string;
|
|
24
|
+
asObj(...strips: StripCommand[]): Partial<HostURIObject | PathURIObject>;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function coerceKey(key: string | OneKey<string>, def?: string): { key: string; def?: string } {
|
|
28
|
+
if (typeof key === "object") {
|
|
29
|
+
const keys = Object.keys(key);
|
|
30
|
+
if (keys.length !== 1) {
|
|
31
|
+
throw new Error(`Invalid key: ${JSON.stringify(key)}`);
|
|
32
|
+
}
|
|
33
|
+
return { key: keys[0], def: key[keys[0]] };
|
|
34
|
+
}
|
|
35
|
+
return { key, def: def };
|
|
36
|
+
}
|
|
37
|
+
|
|
6
38
|
export interface URIObject {
|
|
7
39
|
readonly style: "host" | "path";
|
|
8
40
|
readonly protocol: string;
|
|
@@ -60,7 +92,7 @@ export class MutableURL extends URL {
|
|
|
60
92
|
private _pathname: string;
|
|
61
93
|
private _hasHostpart: boolean;
|
|
62
94
|
|
|
63
|
-
readonly hash: string;
|
|
95
|
+
override readonly hash: string;
|
|
64
96
|
|
|
65
97
|
constructor(urlStr: string) {
|
|
66
98
|
super("defect://does.not.exist");
|
|
@@ -91,7 +123,7 @@ export class MutableURL extends URL {
|
|
|
91
123
|
return new MutableURL(this.toString());
|
|
92
124
|
}
|
|
93
125
|
|
|
94
|
-
get host(): string {
|
|
126
|
+
override get host(): string {
|
|
95
127
|
if (!this._hasHostpart) {
|
|
96
128
|
throw new Error(
|
|
97
129
|
`you can use hostname only if protocol is ${this.toString()} ${JSON.stringify(Array.from(hasHostPartProtocols.keys()))}`,
|
|
@@ -100,58 +132,58 @@ export class MutableURL extends URL {
|
|
|
100
132
|
return this._sysURL.host;
|
|
101
133
|
}
|
|
102
134
|
|
|
103
|
-
get port(): string {
|
|
135
|
+
override get port(): string {
|
|
104
136
|
if (!this._hasHostpart) {
|
|
105
137
|
throw new Error(`you can use hostname only if protocol is ${JSON.stringify(Array.from(hasHostPartProtocols.keys()))}`);
|
|
106
138
|
}
|
|
107
139
|
return this._sysURL.port;
|
|
108
140
|
}
|
|
109
141
|
|
|
110
|
-
set port(p: string) {
|
|
142
|
+
override set port(p: string) {
|
|
111
143
|
if (!this._hasHostpart) {
|
|
112
144
|
throw new Error(`you can use port only if protocol is ${JSON.stringify(Array.from(hasHostPartProtocols.keys()))}`);
|
|
113
145
|
}
|
|
114
146
|
this._sysURL.port = p;
|
|
115
147
|
}
|
|
116
148
|
|
|
117
|
-
get hostname(): string {
|
|
149
|
+
override get hostname(): string {
|
|
118
150
|
if (!this._hasHostpart) {
|
|
119
151
|
throw new Error(`you can use hostname only if protocol is ${JSON.stringify(Array.from(hasHostPartProtocols.keys()))}`);
|
|
120
152
|
}
|
|
121
153
|
return this._sysURL.hostname;
|
|
122
154
|
}
|
|
123
155
|
|
|
124
|
-
set hostname(h: string) {
|
|
156
|
+
override set hostname(h: string) {
|
|
125
157
|
if (!this._hasHostpart) {
|
|
126
158
|
throw new Error(`you can use hostname only if protocol is ${JSON.stringify(Array.from(hasHostPartProtocols.keys()))}`);
|
|
127
159
|
}
|
|
128
160
|
this._sysURL.hostname = h;
|
|
129
161
|
}
|
|
130
162
|
|
|
131
|
-
set pathname(p: string) {
|
|
163
|
+
override set pathname(p: string) {
|
|
132
164
|
this._pathname = p;
|
|
133
165
|
}
|
|
134
166
|
|
|
135
|
-
get pathname(): string {
|
|
167
|
+
override get pathname(): string {
|
|
136
168
|
return this._pathname;
|
|
137
169
|
}
|
|
138
170
|
|
|
139
|
-
get protocol(): string {
|
|
171
|
+
override get protocol(): string {
|
|
140
172
|
return this._protocol;
|
|
141
173
|
}
|
|
142
174
|
|
|
143
|
-
set protocol(p: string) {
|
|
175
|
+
override set protocol(p: string) {
|
|
144
176
|
if (!p.endsWith(":")) {
|
|
145
177
|
p = `${p}:`;
|
|
146
178
|
}
|
|
147
179
|
this._protocol = p;
|
|
148
180
|
}
|
|
149
181
|
|
|
150
|
-
get searchParams(): URLSearchParams {
|
|
182
|
+
override get searchParams(): URLSearchParams {
|
|
151
183
|
return this._sysURL.searchParams;
|
|
152
184
|
}
|
|
153
185
|
|
|
154
|
-
toString(): string {
|
|
186
|
+
override toString(): string {
|
|
155
187
|
let search = "";
|
|
156
188
|
if (this._sysURL.searchParams.size) {
|
|
157
189
|
for (const [key, value] of Array.from(this._sysURL.searchParams.entries()).sort((a, b) => a[0].localeCompare(b[0]))) {
|
|
@@ -205,13 +237,25 @@ function getParamResult(
|
|
|
205
237
|
return Result.Ok(val);
|
|
206
238
|
}
|
|
207
239
|
|
|
208
|
-
type
|
|
240
|
+
type msgFn = (...keys: string[]) => string;
|
|
241
|
+
type keysParam = (string | msgFn | Record<string, string>)[];
|
|
209
242
|
|
|
210
243
|
function getParamsResult(
|
|
211
244
|
keys: keysParam,
|
|
212
245
|
getParam: { getParam: (key: string) => string | undefined },
|
|
213
246
|
): Result<Record<string, string>> {
|
|
214
|
-
const
|
|
247
|
+
const keyDef = keys.flat().reduce(
|
|
248
|
+
(acc, i) => {
|
|
249
|
+
if (typeof i === "string") {
|
|
250
|
+
acc.push({ key: i });
|
|
251
|
+
} else if (typeof i === "object") {
|
|
252
|
+
acc.push(...Object.keys(i).map((k) => ({ key: k, def: i[k] })));
|
|
253
|
+
}
|
|
254
|
+
return acc;
|
|
255
|
+
},
|
|
256
|
+
[] as { key: string; def?: string }[],
|
|
257
|
+
);
|
|
258
|
+
//.filter((k) => typeof k === "string");
|
|
215
259
|
const msgFn =
|
|
216
260
|
keys.find((k) => typeof k === "function") ||
|
|
217
261
|
((...keys: string[]): string => {
|
|
@@ -220,12 +264,16 @@ function getParamsResult(
|
|
|
220
264
|
});
|
|
221
265
|
const errors: string[] = [];
|
|
222
266
|
const result: Record<string, string> = {};
|
|
223
|
-
for (const
|
|
224
|
-
const val = getParam.getParam(key);
|
|
267
|
+
for (const kd of keyDef) {
|
|
268
|
+
const val = getParam.getParam(kd.key);
|
|
225
269
|
if (val === undefined) {
|
|
226
|
-
|
|
270
|
+
if (kd.def) {
|
|
271
|
+
result[kd.key] = kd.def;
|
|
272
|
+
} else {
|
|
273
|
+
errors.push(kd.key);
|
|
274
|
+
}
|
|
227
275
|
} else {
|
|
228
|
-
result[key] = val;
|
|
276
|
+
result[kd.key] = val;
|
|
229
277
|
}
|
|
230
278
|
}
|
|
231
279
|
if (errors.length) {
|
|
@@ -234,7 +282,7 @@ function getParamsResult(
|
|
|
234
282
|
return Result.Ok(result);
|
|
235
283
|
}
|
|
236
284
|
|
|
237
|
-
export class BuildURI {
|
|
285
|
+
export class BuildURI implements URIInterface<BuildURI> {
|
|
238
286
|
_url: MutableURL; // pathname needs this
|
|
239
287
|
private constructor(url: MutableURL) {
|
|
240
288
|
this._url = url;
|
|
@@ -359,8 +407,17 @@ export class BuildURI {
|
|
|
359
407
|
return this._url.searchParams.has(key);
|
|
360
408
|
}
|
|
361
409
|
|
|
362
|
-
|
|
363
|
-
return
|
|
410
|
+
get getParams(): Iterable<[string, string]> {
|
|
411
|
+
return this._url.searchParams.entries();
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
getParam<T extends string | undefined>(key: string | OneKey<string>, def?: T): T extends string ? string : string | undefined {
|
|
415
|
+
const { key: k, def: d } = coerceKey(key, def);
|
|
416
|
+
let val = this._url.searchParams.get(k);
|
|
417
|
+
if (!falsy2undef(val) && d) {
|
|
418
|
+
val = d;
|
|
419
|
+
}
|
|
420
|
+
return falsy2undef(val) as T extends string ? string : string | undefined;
|
|
364
421
|
}
|
|
365
422
|
|
|
366
423
|
getParamResult(key: string, msgFn?: (key: string) => string): Result<string> {
|
|
@@ -383,10 +440,14 @@ export class BuildURI {
|
|
|
383
440
|
return this.URI().asURL();
|
|
384
441
|
}
|
|
385
442
|
|
|
386
|
-
asObj(...strips: StripCommand[]): HostURIObject | PathURIObject {
|
|
443
|
+
asObj(...strips: StripCommand[]): Partial<HostURIObject | PathURIObject> {
|
|
387
444
|
return this.URI().asObj(...strips);
|
|
388
445
|
}
|
|
389
446
|
|
|
447
|
+
clone(): BuildURI {
|
|
448
|
+
return BuildURI.from(this.toString());
|
|
449
|
+
}
|
|
450
|
+
|
|
390
451
|
URI(): URI {
|
|
391
452
|
return URI.from(this._url);
|
|
392
453
|
}
|
|
@@ -397,7 +458,7 @@ export type CoerceURI = string | URI | MutableURL | URL | BuildURI | NullOrUndef
|
|
|
397
458
|
export const hasHostPartProtocols: Set<string> = new Set<string>(["http", "https", "ws", "wss"]);
|
|
398
459
|
|
|
399
460
|
// non mutable URL Implementation
|
|
400
|
-
export class URI {
|
|
461
|
+
export class URI implements URIInterface<URI> {
|
|
401
462
|
static protocolHasHostpart(protocol: string): () => void {
|
|
402
463
|
protocol = protocol.replace(/:$/, "");
|
|
403
464
|
hasHostPartProtocols.add(protocol);
|
|
@@ -501,8 +562,14 @@ export class URI {
|
|
|
501
562
|
hasParam(key: string): boolean {
|
|
502
563
|
return this._url.searchParams.has(key);
|
|
503
564
|
}
|
|
504
|
-
|
|
505
|
-
|
|
565
|
+
|
|
566
|
+
getParam<T extends string | undefined>(key: string | OneKey<string>, def?: T): T extends string ? string : string | undefined {
|
|
567
|
+
const { key: k, def: d } = coerceKey(key, def);
|
|
568
|
+
let val = this._url.searchParams.get(k);
|
|
569
|
+
if (!falsy2undef(val) && d) {
|
|
570
|
+
val = d;
|
|
571
|
+
}
|
|
572
|
+
return falsy2undef(val) as T extends string ? string : string | undefined;
|
|
506
573
|
}
|
|
507
574
|
|
|
508
575
|
getParamResult(key: string, msgFn?: (key: string) => string): Result<string> {
|
|
@@ -530,7 +597,7 @@ export class URI {
|
|
|
530
597
|
toJSON(): string {
|
|
531
598
|
return this.toString();
|
|
532
599
|
}
|
|
533
|
-
asObj(...strips: StripCommand[]): HostURIObject | PathURIObject {
|
|
600
|
+
asObj(...strips: StripCommand[]): Partial<HostURIObject | PathURIObject> {
|
|
534
601
|
const pathURI: PathURIObject = {
|
|
535
602
|
style: "path",
|
|
536
603
|
protocol: this.protocol,
|
|
@@ -543,8 +610,8 @@ export class URI {
|
|
|
543
610
|
style: "host",
|
|
544
611
|
hostname: this.hostname,
|
|
545
612
|
port: this.port,
|
|
546
|
-
}) as HostURIObject
|
|
613
|
+
}) as Partial<HostURIObject>;
|
|
547
614
|
}
|
|
548
|
-
return stripper(strips, pathURI) as PathURIObject
|
|
615
|
+
return stripper(strips, pathURI) as Partial<PathURIObject>;
|
|
549
616
|
}
|
|
550
617
|
}
|
|
@@ -24,11 +24,11 @@ export class ConsoleWriterStreamDefaultWriter implements WritableStreamDefaultWr
|
|
|
24
24
|
this.closed = Promise.resolve(undefined);
|
|
25
25
|
}
|
|
26
26
|
async write(chunk?: Uint8Array | undefined): Promise<void> {
|
|
27
|
-
|
|
27
|
+
let strObj: string | { level: string } = this.decoder.decode(chunk).trimEnd();
|
|
28
28
|
let output = "log";
|
|
29
29
|
try {
|
|
30
|
-
|
|
31
|
-
output =
|
|
30
|
+
strObj = JSON.parse(strObj) as { level: string };
|
|
31
|
+
output = strObj.level;
|
|
32
32
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
33
33
|
} catch (e) {
|
|
34
34
|
/* noop */
|
|
@@ -36,15 +36,15 @@ export class ConsoleWriterStreamDefaultWriter implements WritableStreamDefaultWr
|
|
|
36
36
|
switch (output) {
|
|
37
37
|
case "error":
|
|
38
38
|
// eslint-disable-next-line no-console
|
|
39
|
-
console.error(
|
|
39
|
+
console.error(strObj);
|
|
40
40
|
break;
|
|
41
41
|
case "warn":
|
|
42
42
|
// eslint-disable-next-line no-console
|
|
43
|
-
console.warn(
|
|
43
|
+
console.warn(strObj);
|
|
44
44
|
break;
|
|
45
45
|
default:
|
|
46
46
|
// eslint-disable-next-line no-console
|
|
47
|
-
console.log(
|
|
47
|
+
console.log(strObj);
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
}
|
package/src/utils/stripper.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
export type StripCommand = string | RegExp;
|
|
2
|
-
|
|
3
|
-
export function stripper<T
|
|
2
|
+
|
|
3
|
+
export function stripper<T extends unknown | ArrayLike<unknown>>(
|
|
4
|
+
strip: StripCommand | StripCommand[],
|
|
5
|
+
obj: T,
|
|
6
|
+
): T extends ArrayLike<unknown> ? Record<string, unknown>[] : Record<string, unknown> {
|
|
4
7
|
const strips = Array.isArray(strip) ? strip : [strip];
|
|
5
8
|
const restrips = strips.map((s) => {
|
|
6
9
|
if (typeof s === "string") {
|
|
@@ -9,14 +12,18 @@ export function stripper<T>(strip: StripCommand | StripCommand[], obj: T): Recor
|
|
|
9
12
|
}
|
|
10
13
|
return s;
|
|
11
14
|
});
|
|
12
|
-
|
|
13
|
-
|
|
15
|
+
return localStripper(undefined, restrips, obj) as T extends ArrayLike<unknown>
|
|
16
|
+
? Record<string, unknown>[]
|
|
17
|
+
: Record<string, unknown>;
|
|
14
18
|
}
|
|
15
19
|
|
|
16
20
|
function localStripper<T>(path: string | undefined, restrips: RegExp[], obj: T): unknown {
|
|
17
21
|
if (typeof obj !== "object" || obj === null) {
|
|
18
22
|
return obj;
|
|
19
23
|
}
|
|
24
|
+
if (Array.isArray(obj)) {
|
|
25
|
+
return obj.map((i) => localStripper(path, restrips, i));
|
|
26
|
+
}
|
|
20
27
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
21
28
|
const ret = { ...obj } as Record<string, any>;
|
|
22
29
|
const matcher = (key: string, nextPath: string): boolean => {
|
package/ts/logger-impl.d.ts
CHANGED
|
@@ -53,16 +53,19 @@ export declare class LoggerImpl implements Logger {
|
|
|
53
53
|
Ref(key: string, action: {
|
|
54
54
|
toString: () => string;
|
|
55
55
|
} | FnSerialized): Logger;
|
|
56
|
-
Bool(key: string, value: unknown): Logger;
|
|
56
|
+
Bool(key: string | Record<string, unknown>, value: unknown): Logger;
|
|
57
|
+
Http(res: Response | Result<Response>, req?: Request, key?: string): Logger;
|
|
58
|
+
Pair(x: Record<string, unknown>): Logger;
|
|
57
59
|
Result<T>(key: string, res: Result<T, Error>): Logger;
|
|
58
60
|
Len(value: unknown, key?: string): Logger;
|
|
59
61
|
Hash(value: unknown, key?: string): Logger;
|
|
60
62
|
Url(url: CoerceURI, key?: string): Logger;
|
|
61
|
-
|
|
62
|
-
|
|
63
|
+
private coerceKey;
|
|
64
|
+
Str(key: string | Record<string, string>, value?: string): Logger;
|
|
65
|
+
Any(key: string | Record<string, unknown>, value?: unknown): Logger;
|
|
63
66
|
Dur(key: string, nsec: number): Logger;
|
|
64
|
-
Uint64(key: string, value
|
|
65
|
-
Int(key: string, value
|
|
67
|
+
Uint64(key: string | Record<string, number>, value?: number): Logger;
|
|
68
|
+
Int(key: string | Record<string, number>, value?: number): Logger;
|
|
66
69
|
Flush(): Promise<void>;
|
|
67
70
|
With(): WithLogger;
|
|
68
71
|
_resetAttributes(fn: () => () => Uint8Array): () => Uint8Array;
|
package/ts/logger-impl.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger-impl.d.ts","sourceRoot":"","sources":["../../src/logger-impl.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,OAAO,EACP,YAAY,EACZ,eAAe,EACf,KAAK,EACL,MAAM,EAGN,UAAU,EAMV,YAAY,EACZ,YAAY,EAEb,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAO,MAAM,UAAU,CAAC;AAG1C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,YAAY,EAA0B,MAAM,qBAAqB,CAAC;AAkC3E,qBAAa,aAAc,YAAW,YAAY;IAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAS;gBACrB,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,MAAM;IAIjD,MAAM,CAAC,IAAI,EAAE,eAAe,GAAG,UAAU;
|
|
1
|
+
{"version":3,"file":"logger-impl.d.ts","sourceRoot":"","sources":["../../src/logger-impl.ts"],"names":[],"mappings":"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"}
|