@ix-xs/node-comfort 1.2.0 → 2.1.0

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 (78) hide show
  1. package/CHANGELOG.md +340 -0
  2. package/README.md +137 -548
  3. package/index.js +80 -35
  4. package/package.json +161 -33
  5. package/src/Arr.js +1050 -418
  6. package/src/Async.js +817 -0
  7. package/src/Cache.js +433 -0
  8. package/src/Checker.js +1202 -539
  9. package/src/Cli.js +1293 -0
  10. package/src/Color.js +556 -0
  11. package/src/Crypto.js +1082 -0
  12. package/src/Emitter.js +356 -0
  13. package/src/Env.js +689 -0
  14. package/src/FS.js +1626 -894
  15. package/src/Func.js +823 -356
  16. package/src/Http.js +700 -0
  17. package/src/Id.js +568 -200
  18. package/src/Logger.js +963 -378
  19. package/src/Num.js +965 -360
  20. package/src/Obj.js +1077 -379
  21. package/src/SQLite.js +1629 -1005
  22. package/src/Schema.js +2101 -0
  23. package/src/Str.js +1209 -432
  24. package/src/Sys.js +654 -0
  25. package/src/Time.js +1533 -440
  26. package/src/Utils.js +342 -325
  27. package/src/errors.js +335 -0
  28. package/src/internal/shared.js +415 -0
  29. package/types/index.d.ts +735 -526
  30. package/types/src/Arr.d.ts +533 -145
  31. package/types/src/Arr.d.ts.map +1 -1
  32. package/types/src/Async.d.ts +372 -0
  33. package/types/src/Async.d.ts.map +1 -0
  34. package/types/src/Cache.d.ts +221 -0
  35. package/types/src/Cache.d.ts.map +1 -0
  36. package/types/src/Checker.d.ts +651 -232
  37. package/types/src/Checker.d.ts.map +1 -1
  38. package/types/src/Cli.d.ts +664 -0
  39. package/types/src/Cli.d.ts.map +1 -0
  40. package/types/src/Color.d.ts +300 -0
  41. package/types/src/Color.d.ts.map +1 -0
  42. package/types/src/Crypto.d.ts +620 -0
  43. package/types/src/Crypto.d.ts.map +1 -0
  44. package/types/src/Emitter.d.ts +189 -0
  45. package/types/src/Emitter.d.ts.map +1 -0
  46. package/types/src/Env.d.ts +412 -0
  47. package/types/src/Env.d.ts.map +1 -0
  48. package/types/src/FS.d.ts +717 -238
  49. package/types/src/FS.d.ts.map +1 -1
  50. package/types/src/Func.d.ts +508 -135
  51. package/types/src/Func.d.ts.map +1 -1
  52. package/types/src/Http.d.ts +444 -0
  53. package/types/src/Http.d.ts.map +1 -0
  54. package/types/src/Id.d.ts +199 -66
  55. package/types/src/Id.d.ts.map +1 -1
  56. package/types/src/Logger.d.ts +414 -46
  57. package/types/src/Logger.d.ts.map +1 -1
  58. package/types/src/Num.d.ts +514 -137
  59. package/types/src/Num.d.ts.map +1 -1
  60. package/types/src/Obj.d.ts +453 -104
  61. package/types/src/Obj.d.ts.map +1 -1
  62. package/types/src/SQLite.d.ts +754 -308
  63. package/types/src/SQLite.d.ts.map +1 -1
  64. package/types/src/Schema.d.ts +1189 -0
  65. package/types/src/Schema.d.ts.map +1 -0
  66. package/types/src/Str.d.ts +617 -166
  67. package/types/src/Str.d.ts.map +1 -1
  68. package/types/src/Sys.d.ts +314 -0
  69. package/types/src/Sys.d.ts.map +1 -0
  70. package/types/src/Time.d.ts +759 -204
  71. package/types/src/Time.d.ts.map +1 -1
  72. package/types/src/Utils.d.ts +158 -102
  73. package/types/src/Utils.d.ts.map +1 -1
  74. package/types/src/errors.d.ts +316 -0
  75. package/types/src/errors.d.ts.map +1 -0
  76. package/types/src/internal/shared.d.ts +123 -0
  77. package/types/src/internal/shared.d.ts.map +1 -0
  78. package/types/index.d.ts.map +0 -1
@@ -1,68 +1,436 @@
1
1
  /**
2
- * Enables or disables timestamp in logs
3
- * @param {boolean} value - True to enable, false to disable
4
- * @returns {Logger} The same Logger instance (for chaining)
2
+ * Log levels, from the most verbose to the most severe. `silent` hides everything.
5
3
  */
6
- export function setTimestamp(value: boolean): Logger;
4
+ export type LogLevel = "trace" | "debug" | "info" | "warn" | "error" | "fatal" | "silent";
7
5
  /**
8
- * Changes the delimiters used for text formatting
9
- * @param {object} options - Delimiter options
10
- * @param {string} [options.open] - New opening delimiter
11
- * @param {string} [options.close] - New closing delimiter
12
- * @returns {Logger} The same Logger instance (for chaining)
6
+ * Where logs go: `process.stdout`, a file stream, or anything with a
7
+ * `write(text)` method.
13
8
  */
14
- export function setDelimiter(options?: {
15
- open?: string | undefined;
16
- close?: string | undefined;
17
- }): Logger;
9
+ export type LogStream = {
10
+ write(text: string): unknown;
11
+ };
12
+ /**
13
+ * Writing logs to a file.
14
+ */
15
+ export type LogFileOptions = {
16
+ /**
17
+ * The file to append to. Folders are created, colors removed.
18
+ */
19
+ path: string;
20
+ /**
21
+ * Rotate past this size, like `"10MB"`.
22
+ */
23
+ maxSize?: string | number | undefined;
24
+ /**
25
+ * How many rotated files to keep. Defaults to `5`.
26
+ */
27
+ maxFiles?: number | undefined;
28
+ };
29
+ /**
30
+ * A message as `onLog` receives it.
31
+ */
32
+ export type LogEntry = {
33
+ time: Date;
34
+ level: LogLevel;
35
+ /**
36
+ * The method that was called.
37
+ */
38
+ kind: "log" | "trace" | "debug" | "info" | "success" | "warn" | "error" | "fatal";
39
+ scope: string | undefined;
40
+ /**
41
+ * The line as written, without colors or timestamp.
42
+ */
43
+ message: string;
44
+ /**
45
+ * What was passed to the method, untouched.
46
+ */
47
+ args: unknown[];
48
+ };
49
+ /**
50
+ * Options for `createLogger()` and `configure()`.
51
+ */
52
+ export type LoggerOptions = {
53
+ /**
54
+ * Hide messages below this level. Defaults to `LOG_LEVEL`, else `"info"`.
55
+ */
56
+ level?: LogLevel | undefined;
57
+ /**
58
+ * Shown before each message, like `[db]`. Child loggers extend it (`db:pool`).
59
+ */
60
+ scope?: string | undefined;
61
+ /**
62
+ * `true` shows `[HH:mm:ss]`, `false` hides it, a string is a `time.format` pattern. Defaults to `true`.
63
+ */
64
+ timestamp?: string | boolean | undefined;
65
+ /**
66
+ * `"json"` writes one object per line, for log collectors. Defaults to `LOG_FORMAT`, else `"pretty"`.
67
+ */
68
+ format?: "pretty" | "json" | undefined;
69
+ /**
70
+ * Markup delimiters. Defaults to `<%` and `%>`.
71
+ */
72
+ delimiter?: {
73
+ open?: string;
74
+ close?: string;
75
+ } | undefined;
76
+ /**
77
+ * Force colors on or off. By default, it depends on the terminal.
78
+ */
79
+ colors?: boolean | undefined;
80
+ /**
81
+ * Where `trace` to `info` go. Defaults to `process.stdout`.
82
+ */
83
+ stdout?: LogStream | undefined;
84
+ /**
85
+ * Where `warn`, `error` and `fatal` go. Defaults to `process.stderr`.
86
+ */
87
+ stderr?: LogStream | undefined;
88
+ /**
89
+ * Also write every message to a file.
90
+ */
91
+ file?: string | LogFileOptions | undefined;
92
+ /**
93
+ * Added to every JSON record, like a service name.
94
+ */
95
+ fields?: Record<string, unknown> | undefined;
96
+ /**
97
+ * Keys whose values are replaced by `"[redacted]"` wherever they appear in logged objects, like `["password", "authorization"]`. Case doesn't matter.
98
+ */
99
+ redact?: string[] | undefined;
100
+ /**
101
+ * Called for every message that passes the level, to send logs somewhere else. It isn't awaited, and an error it throws (or a promise it rejects) is ignored: logging never breaks the program.
102
+ */
103
+ onLog?: ((entry: LogEntry) => void | Promise<void>) | undefined;
104
+ };
105
+ /**
106
+ * A logger from `createLogger()`. Every method returns the logger, so calls chain.
107
+ */
108
+ export type Logger = {
109
+ /**
110
+ * A plain message, no badge. Supports markup.
111
+ */
112
+ log: (...args: unknown[]) => Logger;
113
+ /**
114
+ * Very detailed diagnostics, hidden unless the level is `trace`.
115
+ */
116
+ trace: (...args: unknown[]) => Logger;
117
+ /**
118
+ * Diagnostics, hidden unless the level is `debug` or lower.
119
+ */
120
+ debug: (...args: unknown[]) => Logger;
121
+ /**
122
+ * An `ℹ INFO` message.
123
+ */
124
+ info: (...args: unknown[]) => Logger;
125
+ /**
126
+ * A `✔ OK` message.
127
+ */
128
+ success: (...args: unknown[]) => Logger;
129
+ /**
130
+ * A `⚠ WARN` message, on stderr.
131
+ */
132
+ warn: (...args: unknown[]) => Logger;
133
+ /**
134
+ * An `✖ ERROR` message, on stderr. Errors show their stack and cause.
135
+ */
136
+ error: (...args: unknown[]) => Logger;
137
+ /**
138
+ * An `✖ FATAL` message, on stderr.
139
+ */
140
+ fatal: (...args: unknown[]) => Logger;
141
+ /**
142
+ * Prints a label and indents what follows. Groups nest.
143
+ */
144
+ group: (label?: string) => Logger;
145
+ /**
146
+ * Closes the current group.
147
+ */
148
+ groupEnd: () => Logger;
149
+ /**
150
+ * Starts a named timer.
151
+ */
152
+ timeStart: (label?: string) => Logger;
153
+ /**
154
+ * Prints how long since `timeStart(label)`.
155
+ */
156
+ timeEnd: (label?: string) => Logger;
157
+ /**
158
+ * Prints rows as a table.
159
+ */
160
+ table: (rows: Array<Record<string, unknown>> | unknown[][], options?: import("./Cli").TableOptions) => Logger;
161
+ /**
162
+ * Prints text in a box.
163
+ */
164
+ box: (text: string, options?: import("./Cli").BoxOptions) => Logger;
165
+ /**
166
+ * Prints a horizontal line.
167
+ */
168
+ divider: (title?: string) => Logger;
169
+ /**
170
+ * A logger with the same settings and a nested scope. Its `fields` are added to the parent's.
171
+ */
172
+ child: (scope: string, options?: LoggerOptions) => Logger;
173
+ /**
174
+ * Changes the minimum level.
175
+ */
176
+ setLevel: (level: LogLevel) => Logger;
177
+ /**
178
+ * The current minimum level.
179
+ */
180
+ getLevel: () => LogLevel;
181
+ /**
182
+ * Would this level be printed? Skip expensive debug output when it wouldn't.
183
+ */
184
+ isLevelEnabled: (level: LogLevel) => boolean;
185
+ /**
186
+ * Changes several settings at once.
187
+ */
188
+ configure: (options: LoggerOptions) => Logger;
189
+ };
190
+ /**
191
+ * A log file: where it is, how big it may get, how big it is now.
192
+ */
193
+ export type _LogFile = {
194
+ target: string;
195
+ limit: number | undefined;
196
+ keep: number;
197
+ size: number;
198
+ ready: boolean;
199
+ };
200
+ /**
201
+ * What a message looks like on one output: its colors, and the parts that
202
+ * are the same on every line, styled once.
203
+ */
204
+ export type _Face = {
205
+ palette: import("./Color").ColorModule;
206
+ colors: boolean;
207
+ labels: Record<string, string>;
208
+ scope: string;
209
+ stamp: string;
210
+ stampAt: number;
211
+ stampWidth: number;
212
+ };
213
+ /**
214
+ * Prints a message without a badge. Strings support markup, objects are
215
+ * pretty-printed, and several arguments are joined with spaces.
216
+ *
217
+ * @example
218
+ * nc.log("<% green ✔ Saved%> in <% bold 12ms%>");
219
+ * nc.log("user:", { id: 1, roles: ["admin"] });
220
+ *
221
+ * @param {...unknown} args
222
+ * @returns {typeof import("./Logger")}
223
+ */
224
+ export function log(...args: unknown[]): typeof import("./Logger");
225
+ /**
226
+ * Very detailed diagnostics, shown only at the `trace` level.
227
+ *
228
+ * @param {...unknown} args
229
+ * @returns {typeof import("./Logger")}
230
+ */
231
+ export function trace(...args: unknown[]): typeof import("./Logger");
18
232
  /**
19
- * Prints a message to the console with ANSI formatting
20
- * @param {*} content - Content to print (string, object, or other)
21
- * @returns {Logger} The same Logger instance (for chaining)
233
+ * Diagnostics for developers, shown at the `debug` level (the default when
234
+ * `DEBUG` is set).
235
+ *
236
+ * @example
237
+ * nc.debug("cache miss", { key });
238
+ *
239
+ * @param {...unknown} args
240
+ * @returns {typeof import("./Logger")}
241
+ */
242
+ export function debug(...args: unknown[]): typeof import("./Logger");
243
+ /**
244
+ * An informational message.
245
+ *
246
+ * @example
247
+ * nc.info("Server listening on http://localhost:3000");
248
+ *
249
+ * @param {...unknown} args
250
+ * @returns {typeof import("./Logger")}
251
+ */
252
+ export function info(...args: unknown[]): typeof import("./Logger");
253
+ /**
254
+ * A success message.
255
+ *
256
+ * @example
257
+ * nc.success("Database connected");
258
+ *
259
+ * @param {...unknown} args
260
+ * @returns {typeof import("./Logger")}
22
261
  */
23
- export function log(content: any): Logger;
262
+ export function success(...args: unknown[]): typeof import("./Logger");
24
263
  /**
25
- * Logs an informational message, prefixed with a cyan `ℹ INFO` label.
26
- * @param {*} content - Content to print.
27
- * @returns {Logger} The same Logger instance (for chaining).
264
+ * A warning, written to stderr.
265
+ *
266
+ * @param {...unknown} args
267
+ * @returns {typeof import("./Logger")}
28
268
  */
29
- export function info(content: any): Logger;
269
+ export function warn(...args: unknown[]): typeof import("./Logger");
30
270
  /**
31
- * Logs a success message, prefixed with a green `✔ OK` label.
32
- * @param {*} content - Content to print.
33
- * @returns {Logger} The same Logger instance (for chaining).
271
+ * An error, written to stderr. Error objects show their stack trace and
272
+ * their chain of causes.
273
+ *
274
+ * @example
275
+ * nc.error(new Error("Cannot save order", { cause: dbError }));
276
+ *
277
+ * @param {...unknown} args
278
+ * @returns {typeof import("./Logger")}
34
279
  */
35
- export function success(content: any): Logger;
280
+ export function error(...args: unknown[]): typeof import("./Logger");
36
281
  /**
37
- * Logs a warning, prefixed with a yellow `⚠ WARN` label (writes to stderr).
38
- * @param {*} content - Content to print.
39
- * @returns {Logger} The same Logger instance (for chaining).
282
+ * A fatal error, written to stderr. It doesn't stop the process; call
283
+ * `process.exit(1)` yourself if you mean to.
284
+ *
285
+ * @param {...unknown} args
286
+ * @returns {typeof import("./Logger")}
40
287
  */
41
- export function warn(content: any): Logger;
288
+ export function fatal(...args: unknown[]): typeof import("./Logger");
42
289
  /**
43
- * Logs an error, prefixed with a red `✖ ERROR` label.
290
+ * Prints a label and indents what follows, until `groupEnd()`. Groups nest.
291
+ *
292
+ * @example
293
+ * nc.group("Startup").info("Loading config");
294
+ * nc.group("Database").success("Connected").groupEnd();
295
+ * nc.groupEnd();
44
296
  *
45
- * Accepts an `Error` and prints its stack when available.
46
- * @param {*} content - Content or Error to print.
47
- * @returns {Logger} The same Logger instance (for chaining).
297
+ * @param {string} [label]
298
+ * @returns {typeof import("./Logger")}
48
299
  */
49
- export function error(content: any): Logger;
300
+ export function group(label?: string): typeof import("./Logger");
50
301
  /**
51
- * Logs a debug message (only when `DEBUG`/`NODE_DEBUG` env is set), prefixed
52
- * with a gray `● DEBUG` label.
53
- * @param {*} content - Content to print.
54
- * @returns {Logger} The same Logger instance (for chaining).
302
+ * Closes the current group.
303
+ *
304
+ * @returns {typeof import("./Logger")}
55
305
  */
56
- export function debug(content: any): Logger;
306
+ export function groupEnd(): typeof import("./Logger");
57
307
  /**
58
- * Start a log group (displays a label and adds indentation)
59
- * @param {string} label - The group name to display
60
- * @returns {Logger} The same Logger instance (for chaining)
308
+ * Starts a named timer. `timeEnd()` prints the elapsed time.
309
+ *
310
+ * @example
311
+ * nc.timeStart("import");
312
+ * await importProducts();
313
+ * nc.timeEnd("import"); // "import: 1s 240ms"
314
+ *
315
+ * @param {string} [label="default"]
316
+ * @returns {typeof import("./Logger")}
61
317
  */
62
- export function group(label: string): Logger;
318
+ export function timeStart(label?: string): typeof import("./Logger");
63
319
  /**
64
- * End the current log group
65
- * @returns {Logger} The same Logger instance (for chaining)
320
+ * Prints the time since `timeStart()` with the same label.
321
+ *
322
+ * @param {string} [label="default"]
323
+ * @returns {typeof import("./Logger")}
324
+ */
325
+ export function timeEnd(label?: string): typeof import("./Logger");
326
+ /**
327
+ * Prints rows as a table.
328
+ *
329
+ * @example
330
+ * nc.table([{ name: "Ada", role: "admin" }, { name: "Bob", role: "user" }]);
331
+ *
332
+ * @param {Array<Record<string, unknown>> | unknown[][]} rows
333
+ * @param {import("./Cli").TableOptions} [options]
334
+ * @returns {typeof import("./Logger")}
335
+ */
336
+ export function table(rows: Array<Record<string, unknown>> | unknown[][], options?: import("./Cli").TableOptions): typeof import("./Logger");
337
+ /**
338
+ * Prints text in a box. Nice for startup banners.
339
+ *
340
+ * @example
341
+ * nc.box("Server ready\nhttp://localhost:3000", { title: "my-app", borderColor: "green" });
342
+ *
343
+ * @param {string} text
344
+ * @param {import("./Cli").BoxOptions} [options]
345
+ * @returns {typeof import("./Logger")}
346
+ */
347
+ export function box(text: string, options?: import("./Cli").BoxOptions): typeof import("./Logger");
348
+ /**
349
+ * Prints a horizontal line, with an optional title in it.
350
+ *
351
+ * @param {string} [title]
352
+ * @returns {typeof import("./Logger")}
353
+ */
354
+ export function divider(title?: string): typeof import("./Logger");
355
+ /**
356
+ * Sets the minimum level.
357
+ *
358
+ * @example
359
+ * nc.setLevel("warn"); // warnings and errors only
360
+ * nc.setLevel("silent"); // nothing
361
+ *
362
+ * @param {LogLevel} level
363
+ * @returns {typeof import("./Logger")}
364
+ * @throws {RangeError} For an unknown level.
365
+ */
366
+ export function setLevel(level: LogLevel): typeof import("./Logger");
367
+ /**
368
+ * The current minimum level.
369
+ *
370
+ * @returns {LogLevel}
371
+ */
372
+ export function getLevel(): LogLevel;
373
+ /**
374
+ * Would this level be printed? Use it to skip building expensive debug
375
+ * output.
376
+ *
377
+ * @example
378
+ * if (nc.isLevelEnabled("debug")) nc.debug(buildHugeReport());
379
+ *
380
+ * @param {LogLevel} level
381
+ * @returns {boolean}
382
+ */
383
+ export function isLevelEnabled(level: LogLevel): boolean;
384
+ /**
385
+ * Changes several settings at once.
386
+ *
387
+ * @example
388
+ * nc.configure({ level: "debug", file: "logs/app.log" });
389
+ * nc.configure({ format: "json", fields: { service: "api" } });
390
+ *
391
+ * @param {LoggerOptions} options
392
+ * @returns {typeof import("./Logger")}
393
+ */
394
+ export function configure(options: LoggerOptions): typeof import("./Logger");
395
+ /**
396
+ * Shows or hides timestamps, or sets their pattern.
397
+ *
398
+ * @example
399
+ * nc.setTimestamp(false);
400
+ * nc.setTimestamp("YYYY-MM-DD HH:mm:ss.SSS");
401
+ *
402
+ * @param {boolean | string} value
403
+ * @returns {typeof import("./Logger")}
404
+ */
405
+ export function setTimestamp(value: boolean | string): typeof import("./Logger");
406
+ /**
407
+ * Changes the markup delimiters, for when `<%` clashes with a template
408
+ * engine.
409
+ *
410
+ * @example
411
+ * nc.setDelimiter({ open: "{{", close: "}}" });
412
+ * nc.log("{{red Hello}} world");
413
+ *
414
+ * @param {{ open?: string, close?: string }} [options]
415
+ * @returns {typeof import("./Logger")}
416
+ */
417
+ export function setDelimiter(options?: {
418
+ open?: string;
419
+ close?: string;
420
+ }): typeof import("./Logger");
421
+ /**
422
+ * Creates a logger with its own settings.
423
+ *
424
+ * @example
425
+ * const log = nc.createLogger({ scope: "api", timestamp: "HH:mm:ss.SSS" });
426
+ * log.info("GET /users 200"); // [14:30:05.120] [api] ℹ INFO GET /users 200
427
+ * log.child("db").debug("query took 12ms");
428
+ *
429
+ * const prod = nc.createLogger({ format: "json", fields: { service: "billing" } });
430
+ * prod.error("charge failed", { orderId: 42 }, error);
431
+ *
432
+ * @param {LoggerOptions} [options]
433
+ * @returns {Logger}
66
434
  */
67
- export function groupEnd(): Logger;
435
+ export function createLogger(options?: LoggerOptions): Logger;
68
436
  //# sourceMappingURL=Logger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Logger.d.ts","sourceRoot":"","sources":["../../src/Logger.js"],"names":[],"mappings":"AAiPE;;;;GAIG;AACH,oCAHW,OAAO,GACL,MAAM,CAKlB;AAED;;;;;;GAMG;AACH,uCAJG;IAAyB,IAAI;IACJ,KAAK;CAC9B,GAAU,MAAM,CAQlB;AAED;;;;GAIG;AACH,6BAHW,GAAC,GACC,MAAM,CAiClB;AAED;;;;GAIG;AACH,8BAHW,GAAC,GACC,MAAM,CAIlB;AAED;;;;GAIG;AACH,iCAHW,GAAC,GACC,MAAM,CAIlB;AAED;;;;GAIG;AACH,8BAHW,GAAC,GACC,MAAM,CAIlB;AAED;;;;;;GAMG;AACH,+BAHW,GAAC,GACC,MAAM,CAMlB;AAED;;;;;GAKG;AACH,+BAHW,GAAC,GACC,MAAM,CAOlB;AAED;;;;GAIG;AACH,6BAHW,MAAM,GACJ,MAAM,CAOlB;AAED;;;GAGG;AACH,4BAFa,MAAM,CAKlB"}
1
+ {"version":3,"file":"Logger.d.ts","sourceRoot":"","sources":["../../src/Logger.js"],"names":[],"mappings":"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"}