@reliverse/relinka 1.4.7 → 1.5.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.
package/README.md CHANGED
@@ -69,6 +69,10 @@ export async function main() {
69
69
  "verbose",
70
70
  "This SYNC verbose message can be seen only if verbose=true (in user config) AND config was loaded ",
71
71
  );
72
+ // --- BOX LEVEL EXAMPLES ---
73
+ relinka("box", "This is a boxed message using direct syntax!");
74
+ relinka.box("This is a boxed message using method syntax!");
75
+ // --- LOG LEVEL EXAMPLES ---
72
76
  relinka("log", "Hello! 👋");
73
77
  relinka("log", "Great to see you here!");
74
78
  relinka("info", "Everything is running smoothly");
package/bin/alias.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Alias exports for the relinka logger
3
+ * Provides convenient aliases for common logging needs
4
+ */
5
+ import { relinka } from "./impl.js";
6
+ export { relinka as log, relinka as logger };
7
+ export declare function message(msg: string, ...args: unknown[]): void;
8
+ export declare function step(msg: string, ...args: unknown[]): void;
package/bin/alias.js ADDED
@@ -0,0 +1,8 @@
1
+ import { relinka } from "./impl.js";
2
+ export { relinka as log, relinka as logger };
3
+ export function message(msg, ...args) {
4
+ relinka.log(msg, ...args);
5
+ }
6
+ export function step(msg, ...args) {
7
+ relinka.step(msg, ...args);
8
+ }
package/bin/impl.d.ts CHANGED
@@ -34,7 +34,7 @@ export type LogLevelConfig = {
34
34
  /** Configuration for all log levels. */
35
35
  export type LogLevelsConfig = Partial<Record<LogLevel, LogLevelConfig>>;
36
36
  /** Log level types used by the logger. */
37
- export type LogLevel = "error" | "fatal" | "info" | "success" | "verbose" | "warn" | "log" | "internal" | "null";
37
+ export type LogLevel = "error" | "fatal" | "info" | "success" | "verbose" | "warn" | "log" | "internal" | "null" | "step" | "box";
38
38
  /**
39
39
  * Configuration options for the Relinka logger.
40
40
  * All properties are optional to allow for partial configuration.
@@ -131,11 +131,33 @@ export declare function truncateString(msg: string, maxLength?: number): string;
131
131
  * Exhaustiveness check. If we land here, we missed a union case.
132
132
  */
133
133
  export declare function casesHandled(unexpectedCase: never): never;
134
+ /**
135
+ * Enhanced relinka function type that supports both traditional and method syntax
136
+ */
137
+ export type RelinkaFunction = {
138
+ (type: LogLevel | "clear", message: string, ...args: unknown[]): undefined | never;
139
+ error(message: string, ...args: unknown[]): void;
140
+ fatal(message: string, ...args: unknown[]): never;
141
+ info(message: string, ...args: unknown[]): void;
142
+ success(message: string, ...args: unknown[]): void;
143
+ verbose(message: string, ...args: unknown[]): void;
144
+ warn(message: string, ...args: unknown[]): void;
145
+ log(message: string, ...args: unknown[]): void;
146
+ internal(message: string, ...args: unknown[]): void;
147
+ null(message: string, ...args: unknown[]): void;
148
+ step(message: string, ...args: unknown[]): void;
149
+ box(message: string, ...args: unknown[]): void;
150
+ clear(): void;
151
+ };
134
152
  /**
135
153
  * Logs a message synchronously using the current config.
136
154
  * If type === "fatal", logs a fatal error and throws (never returns).
155
+ *
156
+ * Can be used in two ways:
157
+ * - relinka("level", message, ...args) - traditional syntax
158
+ * - relinka.level(message, ...args) - method syntax
137
159
  */
138
- export declare function relinka(type: LogLevel | "clear", message: string, ...args: unknown[]): undefined | never;
160
+ export declare const relinka: RelinkaFunction;
139
161
  /**
140
162
  * Logs a message asynchronously, waiting for the config to be fully loaded.
141
163
  * If type === "fatal", logs a fatal error and throws (never returns).
@@ -145,3 +167,7 @@ export declare function relinkaAsync(type: LogLevel, message: string, ...args: u
145
167
  * Type helper for user config files.
146
168
  */
147
169
  export declare function defineConfig(config: Partial<RelinkaConfig>): Partial<RelinkaConfig>;
170
+ /**
171
+ * Simple box formatting function
172
+ */
173
+ export declare function formatBox(text: string): string;
package/bin/impl.js CHANGED
@@ -74,6 +74,18 @@ const DEFAULT_RELINKA_CONFIG = {
74
74
  spacing: 3
75
75
  },
76
76
  log: { symbol: "\u2502", fallbackSymbol: "|", color: "dim", spacing: 3 },
77
+ step: {
78
+ symbol: "\u2192",
79
+ fallbackSymbol: "[STEP]",
80
+ color: "blueBright",
81
+ spacing: 3
82
+ },
83
+ box: {
84
+ symbol: "\u25A0",
85
+ fallbackSymbol: "[BOX]",
86
+ color: "whiteBright",
87
+ spacing: 1
88
+ },
77
89
  null: { symbol: "", fallbackSymbol: "", color: "dim", spacing: 0 }
78
90
  }
79
91
  };
@@ -84,7 +96,7 @@ function isUnicodeSupported() {
84
96
  if (process.platform === "win32") {
85
97
  const osRelease = os.release();
86
98
  const match = /(\d+)\.(\d+)/.exec(osRelease);
87
- if (match && Number.parseInt(match[1], 10) >= 10) {
99
+ if (match && Number.parseInt(match[1] ?? "0", 10) >= 10) {
88
100
  return true;
89
101
  }
90
102
  if (process.env.TERM_PROGRAM === "mintty") {
@@ -170,34 +182,34 @@ initializeConfig().catch((err) => {
170
182
  }
171
183
  });
172
184
  function isVerboseEnabled(config) {
173
- return config.verbose ?? DEFAULT_RELINKA_CONFIG.verbose;
185
+ return config.verbose ?? DEFAULT_RELINKA_CONFIG.verbose ?? false;
174
186
  }
175
187
  function isColorEnabled(config) {
176
188
  return !(config.disableColors ?? DEFAULT_RELINKA_CONFIG.disableColors);
177
189
  }
178
190
  function getLogDir(config) {
179
- return config.dirs?.logDir ?? DEFAULT_RELINKA_CONFIG.dirs.logDir;
191
+ return config.dirs?.logDir ?? DEFAULT_RELINKA_CONFIG.dirs?.logDir ?? "logs";
180
192
  }
181
193
  function isDailyLogsEnabled(config) {
182
- return config.dirs?.dailyLogs ?? DEFAULT_RELINKA_CONFIG.dirs.dailyLogs;
194
+ return config.dirs?.dailyLogs ?? DEFAULT_RELINKA_CONFIG.dirs?.dailyLogs ?? false;
183
195
  }
184
196
  function shouldSaveLogs(config) {
185
- return config.saveLogsToFile ?? DEFAULT_RELINKA_CONFIG.saveLogsToFile;
197
+ return config.saveLogsToFile ?? DEFAULT_RELINKA_CONFIG.saveLogsToFile ?? false;
186
198
  }
187
199
  function getMaxLogFiles(config) {
188
- return config.dirs?.maxLogFiles ?? DEFAULT_RELINKA_CONFIG.dirs.maxLogFiles;
200
+ return config.dirs?.maxLogFiles ?? DEFAULT_RELINKA_CONFIG.dirs?.maxLogFiles ?? 0;
189
201
  }
190
202
  function getBaseLogName(config) {
191
- return config.logFilePath ?? DEFAULT_RELINKA_CONFIG.logFilePath;
203
+ return config.logFilePath ?? DEFAULT_RELINKA_CONFIG.logFilePath ?? "relinka.log";
192
204
  }
193
205
  function getBufferSize(config) {
194
- return config.bufferSize ?? DEFAULT_RELINKA_CONFIG.bufferSize;
206
+ return config.bufferSize ?? DEFAULT_RELINKA_CONFIG.bufferSize ?? 4096;
195
207
  }
196
208
  function getMaxBufferAge(config) {
197
- return config.maxBufferAge ?? DEFAULT_RELINKA_CONFIG.maxBufferAge;
209
+ return config.maxBufferAge ?? DEFAULT_RELINKA_CONFIG.maxBufferAge ?? 5e3;
198
210
  }
199
211
  function getCleanupInterval(config) {
200
- return config.cleanupInterval ?? DEFAULT_RELINKA_CONFIG.cleanupInterval;
212
+ return config.cleanupInterval ?? DEFAULT_RELINKA_CONFIG.cleanupInterval ?? 1e4;
201
213
  }
202
214
  function isDevEnv() {
203
215
  return process.env.NODE_ENV === "development";
@@ -273,7 +285,11 @@ function formatLogMessage(config, level, msg, details) {
273
285
  const { symbol, spacing } = getLevelStyle(config, level);
274
286
  const symbolWithSpaces = symbol ? `${symbol}${" ".repeat(spacing)}` : "";
275
287
  const prefix = timestamp ? `[${timestamp}] ` : "";
276
- return `${prefix}${symbolWithSpaces}${msg}${detailsStr}`;
288
+ let content = `${prefix}${symbolWithSpaces}${msg}${detailsStr}`;
289
+ if (level === "box") {
290
+ content = formatBox(content);
291
+ }
292
+ return content;
277
293
  }
278
294
  const consoleMethodMap = {
279
295
  error: console.error,
@@ -283,6 +299,8 @@ const consoleMethodMap = {
283
299
  success: console.log,
284
300
  verbose: console.log,
285
301
  log: console.log,
302
+ step: console.log,
303
+ box: console.log,
286
304
  null: console.log
287
305
  };
288
306
  function logToConsole(config, level, formattedMessage) {
@@ -526,7 +544,7 @@ function registerExitHandlers() {
526
544
  process.once("SIGTERM", sigtermHandler);
527
545
  }
528
546
  registerExitHandlers();
529
- export function relinka(type, message, ...args) {
547
+ export const relinka = (type, message, ...args) => {
530
548
  if (type === "clear") {
531
549
  console.clear();
532
550
  return;
@@ -571,7 +589,19 @@ export function relinka(type, message, ...args) {
571
589
  });
572
590
  }
573
591
  }
574
- }
592
+ };
593
+ relinka.error = (message, ...args) => relinka("error", message, ...args);
594
+ relinka.fatal = (message, ...args) => relinka("fatal", message, ...args);
595
+ relinka.info = (message, ...args) => relinka("info", message, ...args);
596
+ relinka.success = (message, ...args) => relinka("success", message, ...args);
597
+ relinka.verbose = (message, ...args) => relinka("verbose", message, ...args);
598
+ relinka.warn = (message, ...args) => relinka("warn", message, ...args);
599
+ relinka.log = (message, ...args) => relinka("log", message, ...args);
600
+ relinka.internal = (message, ...args) =>
601
+ relinka.null = (message, ...args) => relinka("null", message, ...args);
602
+ relinka.step = (message, ...args) => relinka("step", message, ...args);
603
+ relinka.box = (message, ...args) => relinka("box", message, ...args);
604
+ relinka.clear = () => relinka("clear", "");
575
605
  export async function relinkaAsync(type, message, ...args) {
576
606
  if (message === "") {
577
607
  console.log();
@@ -612,3 +642,17 @@ export async function relinkaAsync(type, message, ...args) {
612
642
  export function defineConfig(config) {
613
643
  return config;
614
644
  }
645
+ export function formatBox(text) {
646
+ const lines = text.split("\n");
647
+ const maxWidth = Math.max(...lines.map((line) => line.length));
648
+ const width = maxWidth + 4;
649
+ const top = `\u250C${"\u2500".repeat(width)}\u2510`;
650
+ const bottom = `\u2514${"\u2500".repeat(width)}\u2518`;
651
+ const content = lines.map((line) => {
652
+ const padding = width - line.length;
653
+ return `\u2502 ${line}${" ".repeat(padding)}\u2502`;
654
+ }).join("\n");
655
+ return `${top}
656
+ ${content}
657
+ ${bottom}`;
658
+ }
package/bin/mod.d.ts CHANGED
@@ -1,2 +1,3 @@
1
- export type { RelinkaSpecialDirsConfig, RelinkaDirsConfig, LogLevelConfig, LogLevelsConfig, LogLevel, RelinkaConfig, LogFileInfo, } from "./impl.js";
2
- export { relinkaConfig, relinkaShutdown, flushAllLogBuffers, shouldNeverHappen, truncateString, casesHandled, relinka, relinkaAsync, defineConfig, } from "./impl.js";
1
+ export { message, step, log, logger } from "./alias.js";
2
+ export type { RelinkaSpecialDirsConfig, RelinkaDirsConfig, LogLevelConfig, LogLevelsConfig, LogLevel, RelinkaConfig, LogFileInfo, RelinkaFunction, } from "./impl.js";
3
+ export { relinkaConfig, relinkaShutdown, flushAllLogBuffers, shouldNeverHappen, truncateString, casesHandled, relinka, relinkaAsync, defineConfig, formatBox, } from "./impl.js";
package/bin/mod.js CHANGED
@@ -1,3 +1,4 @@
1
+ export { message, step, log, logger } from "./alias.js";
1
2
  export {
2
3
  relinkaConfig,
3
4
  relinkaShutdown,
@@ -7,5 +8,6 @@ export {
7
8
  casesHandled,
8
9
  relinka,
9
10
  relinkaAsync,
10
- defineConfig
11
+ defineConfig,
12
+ formatBox
11
13
  } from "./impl.js";
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "dependencies": {
3
- "@reliverse/pathkit": "^1.1.5",
3
+ "@reliverse/pathkit": "^1.3.4",
4
4
  "@reliverse/relico": "^1.1.2",
5
- "@reliverse/relifso": "^1.2.10",
5
+ "@reliverse/relifso": "^1.4.5",
6
6
  "c12": "^3.0.4"
7
7
  },
8
8
  "description": "@reliverse/relinka is a modern, minimal logging library that actually feels right. It's not just pretty output — it's a system: smart formatting, file-safe logging, runtime config support, and a fatal mode built for developers who care about correctness.",
@@ -10,7 +10,7 @@
10
10
  "license": "MIT",
11
11
  "name": "@reliverse/relinka",
12
12
  "type": "module",
13
- "version": "1.4.7",
13
+ "version": "1.5.0",
14
14
  "keywords": [
15
15
  "logger",
16
16
  "consola",
@@ -27,31 +27,7 @@
27
27
  "unified",
28
28
  "universal"
29
29
  ],
30
- "devDependencies": {
31
- "@biomejs/biome": "1.9.4",
32
- "@eslint/js": "^9.27.0",
33
- "@reliverse/dler": "^1.4.6",
34
- "@reliverse/repris": "^1.0.0",
35
- "@reliverse/runtime": "^1.0.3",
36
- "@stylistic/eslint-plugin": "^4.2.0",
37
- "@total-typescript/ts-reset": "^0.6.1",
38
- "@types/bun": "^1.2.14",
39
- "@types/node": "^22.15.21",
40
- "@types/sentencer": "^0.2.3",
41
- "defu": "^6.1.4",
42
- "eslint": "^9.27.0",
43
- "eslint-plugin-no-relative-import-paths": "^1.6.1",
44
- "eslint-plugin-perfectionist": "^4.13.0",
45
- "jiti": "^2.4.2",
46
- "knip": "^5.57.2",
47
- "pathe": "^2.0.3",
48
- "sentencer": "^0.2.1",
49
- "std-env": "^3.9.0",
50
- "string-width": "^7.2.0",
51
- "tsx": "^4.19.4",
52
- "typescript": "^5.8.3",
53
- "typescript-eslint": "^8.32.1"
54
- },
30
+ "devDependencies": {},
55
31
  "exports": {
56
32
  ".": "./bin/mod.js"
57
33
  },
package/bin/types.d.ts DELETED
File without changes
package/bin/types.js DELETED
File without changes