plslog 1.0.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.
@@ -0,0 +1,34 @@
1
+ type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'none';
2
+ interface LoggerOptions {
3
+ namespace?: string;
4
+ level?: LogLevel;
5
+ maxDepth?: number;
6
+ }
7
+ type GlobalConfig = {
8
+ namespaces?: string;
9
+ level?: LogLevel;
10
+ activeLevels?: LogLevel[];
11
+ maxDepth?: number;
12
+ };
13
+
14
+ declare class Logger {
15
+ private _namespace;
16
+ private _level;
17
+ private _maxDepth;
18
+ constructor(options?: LoggerOptions);
19
+ debug(message: string, ...args: unknown[]): this;
20
+ info(message: string, ...args: unknown[]): this;
21
+ warn(message: string, ...args: unknown[]): this;
22
+ error(message: string, ...args: unknown[]): this;
23
+ setLevel(level: LogLevel): void;
24
+ maxDepth(maxDepth: number): this;
25
+ private getLevelPriority;
26
+ private log;
27
+ }
28
+ type Plslog = {
29
+ (options?: LoggerOptions): Logger;
30
+ configure(options: GlobalConfig): void;
31
+ };
32
+ declare const plslog: Plslog;
33
+
34
+ export { type GlobalConfig, type LogLevel, type LoggerOptions, plslog as default };
@@ -0,0 +1,34 @@
1
+ type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'none';
2
+ interface LoggerOptions {
3
+ namespace?: string;
4
+ level?: LogLevel;
5
+ maxDepth?: number;
6
+ }
7
+ type GlobalConfig = {
8
+ namespaces?: string;
9
+ level?: LogLevel;
10
+ activeLevels?: LogLevel[];
11
+ maxDepth?: number;
12
+ };
13
+
14
+ declare class Logger {
15
+ private _namespace;
16
+ private _level;
17
+ private _maxDepth;
18
+ constructor(options?: LoggerOptions);
19
+ debug(message: string, ...args: unknown[]): this;
20
+ info(message: string, ...args: unknown[]): this;
21
+ warn(message: string, ...args: unknown[]): this;
22
+ error(message: string, ...args: unknown[]): this;
23
+ setLevel(level: LogLevel): void;
24
+ maxDepth(maxDepth: number): this;
25
+ private getLevelPriority;
26
+ private log;
27
+ }
28
+ type Plslog = {
29
+ (options?: LoggerOptions): Logger;
30
+ configure(options: GlobalConfig): void;
31
+ };
32
+ declare const plslog: Plslog;
33
+
34
+ export { type GlobalConfig, type LogLevel, type LoggerOptions, plslog as default };
package/dist/index.js ADDED
@@ -0,0 +1,311 @@
1
+ 'use strict';
2
+
3
+ var prettyFormat = require('pretty-format');
4
+
5
+ // src/utils/validates.ts
6
+ function isBase64(link) {
7
+ if (!link || typeof link !== "string") return false;
8
+ return link.startsWith("data:image/") && link.includes(";base64");
9
+ }
10
+ var Formatter = class {
11
+ /**
12
+ * Format base64 string for logging
13
+ */
14
+ static formatBase64String(str, previewLength = 20) {
15
+ const length = str.length;
16
+ let base64Part = str;
17
+ let prefix = "";
18
+ if (str.includes(",") && str.includes("base64")) {
19
+ const parts = str.split(",");
20
+ if (parts.length === 2 && parts[0].includes("base64")) {
21
+ prefix = parts[0] + ",";
22
+ base64Part = parts[1];
23
+ }
24
+ }
25
+ const base64Length = base64Part.length;
26
+ if (base64Length <= previewLength * 2) {
27
+ return `[base64: ${prefix}${base64Part} (length: ${length})]`;
28
+ }
29
+ const start = base64Part.substring(0, previewLength);
30
+ const end = base64Part.substring(base64Length - previewLength);
31
+ return `[base64: ${prefix}${start}...${end} (length: ${length})]`;
32
+ }
33
+ /**
34
+ * Helper to serialize Blob and File objects for logging
35
+ */
36
+ static serializeSpecialObjects(obj, maxDepth = 10, currentDepth = 0) {
37
+ if (currentDepth > maxDepth) return "[Max Depth Reached]";
38
+ if (typeof obj === "string" && isBase64(obj)) {
39
+ return this.formatBase64String(obj);
40
+ }
41
+ if (obj instanceof Blob) {
42
+ return {
43
+ size: obj.size,
44
+ type: obj.type
45
+ };
46
+ }
47
+ if (obj instanceof File) {
48
+ return {
49
+ name: obj.name,
50
+ size: obj.size,
51
+ type: obj.type,
52
+ lastModified: obj.lastModified
53
+ };
54
+ }
55
+ if (Array.isArray(obj)) {
56
+ return obj.map((item) => this.serializeSpecialObjects(item, maxDepth, currentDepth + 1));
57
+ }
58
+ if (obj !== null && typeof obj === "object") {
59
+ const serialized = {};
60
+ for (const key in obj) {
61
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
62
+ serialized[key] = this.serializeSpecialObjects(obj[key], maxDepth, currentDepth + 1);
63
+ }
64
+ }
65
+ return serialized;
66
+ }
67
+ return obj;
68
+ }
69
+ /**
70
+ * Custom format function with pretty-format for objects/arrays
71
+ */
72
+ static formatObj(args, options) {
73
+ if (args.length === 0) {
74
+ return "";
75
+ }
76
+ const formattedArgs = args.map((arg) => {
77
+ const isObject = typeof arg === "object" && arg !== null && !Array.isArray(arg);
78
+ const isArray = Array.isArray(arg);
79
+ if (isObject || isArray) {
80
+ const maxDepth = options?.maxDepth ?? 5;
81
+ const serialized = this.serializeSpecialObjects(arg, maxDepth);
82
+ const formatted = prettyFormat.format(serialized, {
83
+ ...options,
84
+ indent: options?.indent ?? 2,
85
+ maxDepth,
86
+ // Remove Object and Array labels
87
+ printFunctionName: false,
88
+ printBasicPrototype: false
89
+ });
90
+ const cleaned = formatted.replace(/^Object\s*/, "").replace(/^Array\s*/, "").replace(/\nObject\s*/g, "\n").replace(/\nArray\s*/g, "\n");
91
+ return "\n" + cleaned;
92
+ } else {
93
+ const stringValue = String(arg);
94
+ if (isBase64(stringValue)) {
95
+ return this.formatBase64String(stringValue);
96
+ }
97
+ return stringValue;
98
+ }
99
+ });
100
+ return formattedArgs.join(" ");
101
+ }
102
+ };
103
+
104
+ // src/constants.ts
105
+ var LOG_COLORS = {
106
+ debug: "#3E69B5",
107
+ info: "#59c260",
108
+ warn: "#d2b37e",
109
+ error: "#b64938",
110
+ none: "#fff"
111
+ };
112
+ var DEFAULT_NAMESPACE = "app";
113
+
114
+ // src/styler.ts
115
+ function getColorForLevel(level) {
116
+ const currentLevel = level;
117
+ return LOG_COLORS[currentLevel] || "#fff";
118
+ }
119
+ var Styler = class {
120
+ static style(options) {
121
+ const {
122
+ namespace,
123
+ level,
124
+ location,
125
+ formattedMessage
126
+ } = options;
127
+ const levelColor = getColorForLevel(level);
128
+ const logMessage = `%c[${namespace}] %c${level.toUpperCase()} %c${location}
129
+ %c${formattedMessage}`;
130
+ const logStyles = [
131
+ "padding-bottom: 4px",
132
+ // for namespace
133
+ `color: ${levelColor}`,
134
+ // for level
135
+ "color: #aaa; padding-bottom: 4px",
136
+ // for location
137
+ ""
138
+ // empty style for formattedMessage,
139
+ ];
140
+ return {
141
+ logMessage,
142
+ logStyles
143
+ };
144
+ }
145
+ };
146
+ var styler_default = Styler;
147
+
148
+ // src/namespace-matcher.ts
149
+ var NamespaceMatcher = class {
150
+ constructor() {
151
+ this.cachedPatterns = null;
152
+ this.cachedConfig = void 0;
153
+ }
154
+ matches(namespace, namespaces) {
155
+ const ns = this.normalize(namespace);
156
+ if (this.cachedConfig !== namespaces) {
157
+ this.cachedPatterns = this.parsePatterns(namespaces);
158
+ this.cachedConfig = namespaces;
159
+ }
160
+ const enabledNamespaces = this.cachedPatterns || [];
161
+ if (!enabledNamespaces.length) return true;
162
+ const positivePatterns = [];
163
+ const negativePatterns = [];
164
+ for (const pattern of enabledNamespaces) {
165
+ if (pattern.startsWith("-")) {
166
+ negativePatterns.push(pattern.slice(1));
167
+ } else {
168
+ positivePatterns.push(pattern);
169
+ }
170
+ }
171
+ const matches = positivePatterns.some((pattern) => {
172
+ if (pattern === "*") return true;
173
+ const normalizedPattern = this.normalize(pattern);
174
+ if (pattern.includes("*")) {
175
+ const regex = new RegExp("^" + normalizedPattern.replace(/\*/g, ".*") + "$");
176
+ if (regex.test(ns)) return true;
177
+ const basePattern = normalizedPattern.split(":")[0];
178
+ if (ns === basePattern && normalizedPattern.startsWith(basePattern + ":")) {
179
+ return true;
180
+ }
181
+ return false;
182
+ }
183
+ return ns === normalizedPattern;
184
+ });
185
+ if (!matches) return false;
186
+ for (const negPattern of negativePatterns) {
187
+ const neg = this.normalize(negPattern);
188
+ if (neg.includes("*")) {
189
+ const regex = new RegExp("^" + neg.replace(/\*/g, ".*") + "$");
190
+ if (regex.test(ns)) {
191
+ return false;
192
+ }
193
+ const negPrefix = this.normalize(neg.replace(/\*.*$/, ""));
194
+ if (negPrefix) {
195
+ if (ns === negPrefix || ns.startsWith(negPrefix + ":")) {
196
+ return false;
197
+ }
198
+ }
199
+ } else {
200
+ if (ns.startsWith(neg)) {
201
+ return false;
202
+ }
203
+ }
204
+ }
205
+ return true;
206
+ }
207
+ normalize(value) {
208
+ if (!value) return "";
209
+ return value.replace(/:+$/, "");
210
+ }
211
+ parsePatterns(namespaces) {
212
+ if (!namespaces) return [];
213
+ return namespaces.split(",").map((s) => this.normalize(s.trim()));
214
+ }
215
+ };
216
+ var namespaceMatcher = new NamespaceMatcher();
217
+ var namespace_matcher_default = namespaceMatcher;
218
+
219
+ // src/logger.ts
220
+ var globalConfig = {};
221
+ function configure(options) {
222
+ globalConfig = { ...globalConfig, ...options };
223
+ }
224
+ var Logger = class {
225
+ constructor(options = {}) {
226
+ this._level = "debug";
227
+ this._namespace = options.namespace ?? DEFAULT_NAMESPACE;
228
+ this._level = options.level ?? globalConfig.level ?? "debug";
229
+ this._maxDepth = options.maxDepth ?? globalConfig.maxDepth ?? 10;
230
+ }
231
+ debug(message, ...args) {
232
+ this.log("debug", message, ...args);
233
+ return this;
234
+ }
235
+ info(message, ...args) {
236
+ this.log("info", message, ...args);
237
+ return this;
238
+ }
239
+ warn(message, ...args) {
240
+ this.log("warn", message, ...args);
241
+ return this;
242
+ }
243
+ error(message, ...args) {
244
+ this.log("error", message, ...args);
245
+ return this;
246
+ }
247
+ setLevel(level) {
248
+ this._level = level;
249
+ }
250
+ maxDepth(maxDepth) {
251
+ this._maxDepth = maxDepth;
252
+ return this;
253
+ }
254
+ getLevelPriority(level) {
255
+ const priorities = {
256
+ debug: 0,
257
+ info: 1,
258
+ warn: 2,
259
+ error: 3,
260
+ none: 4
261
+ };
262
+ return priorities[level];
263
+ }
264
+ log(level, message, ...args) {
265
+ if (!namespace_matcher_default.matches(this._namespace, globalConfig.namespaces)) {
266
+ return;
267
+ }
268
+ if (globalConfig.activeLevels !== void 0) {
269
+ if (!globalConfig.activeLevels.includes(level)) {
270
+ return;
271
+ }
272
+ } else if (this.getLevelPriority(this._level) > this.getLevelPriority(level)) {
273
+ return;
274
+ }
275
+ const formattedObject = Formatter.formatObj(args, {
276
+ maxDepth: this._maxDepth
277
+ });
278
+ const formattedMessage = formattedObject ? `${message} ${formattedObject}` : message;
279
+ const { logMessage, logStyles } = styler_default.style({
280
+ namespace: this._namespace,
281
+ level,
282
+ location: "",
283
+ formattedMessage
284
+ });
285
+ switch (level) {
286
+ case "error":
287
+ console.error(logMessage, ...logStyles);
288
+ break;
289
+ case "warn":
290
+ console.warn(logMessage, ...logStyles);
291
+ break;
292
+ case "info":
293
+ console.info(logMessage, ...logStyles);
294
+ break;
295
+ case "debug":
296
+ console.debug(logMessage, ...logStyles);
297
+ break;
298
+ default:
299
+ console.log(logMessage, ...logStyles);
300
+ }
301
+ }
302
+ };
303
+ var plslog = ((options = {}) => {
304
+ return new Logger(options);
305
+ });
306
+ plslog.configure = configure;
307
+ var logger_default = plslog;
308
+
309
+ module.exports = logger_default;
310
+ //# sourceMappingURL=index.js.map
311
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/validates.ts","../src/formatter.ts","../src/constants.ts","../src/styler.ts","../src/namespace-matcher.ts","../src/logger.ts"],"names":["prettyFormat"],"mappings":"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","file":"index.js","sourcesContent":["export function isBase64(link: string | null | undefined | ArrayBuffer): boolean {\n if (!link || typeof link !== 'string') return false;\n return link.startsWith('data:image/') && link.includes(';base64');\n}","import { isBase64 } from './utils/validates';\nimport {\n format as prettyFormat,\n Options as PrettyFormatOptions\n} from 'pretty-format';\n\n/**\n * Handles formatting of log messages, including base64 strings, objects, and arrays\n */\nexport default class Formatter {\n /**\n * Format base64 string for logging\n */\n static formatBase64String(str: string, previewLength: number = 20): string {\n const length = str.length;\n\n // Extract base64 part if it's a data URL\n let base64Part = str;\n let prefix = '';\n if (str.includes(',') && str.includes('base64')) {\n const parts = str.split(',');\n if (parts.length === 2 && parts[0].includes('base64')) {\n prefix = parts[0] + ',';\n base64Part = parts[1];\n }\n }\n\n const base64Length = base64Part.length;\n\n if (base64Length <= previewLength * 2) {\n return `[base64: ${prefix}${base64Part} (length: ${length})]`;\n }\n const start = base64Part.substring(0, previewLength);\n const end = base64Part.substring(base64Length - previewLength);\n return `[base64: ${prefix}${start}...${end} (length: ${length})]`;\n }\n\n /**\n * Helper to serialize Blob and File objects for logging\n */\n static serializeSpecialObjects(obj: any, maxDepth: number = 10, currentDepth: number = 0): any {\n if (currentDepth > maxDepth) return '[Max Depth Reached]';\n\n // Handle base64 strings\n if (typeof obj === 'string' && isBase64(obj)) {\n return this.formatBase64String(obj);\n }\n\n if (obj instanceof Blob) {\n return {\n size: obj.size,\n type: obj.type,\n };\n }\n\n if (obj instanceof File) {\n return {\n name: obj.name,\n size: obj.size,\n type: obj.type,\n lastModified: obj.lastModified,\n };\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => this.serializeSpecialObjects(item, maxDepth, currentDepth + 1));\n }\n\n if (obj !== null && typeof obj === 'object') {\n const serialized: Record<string, any> = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n serialized[key] = this.serializeSpecialObjects(obj[key], maxDepth, currentDepth + 1);\n }\n }\n return serialized;\n }\n\n return obj;\n }\n\n /**\n * Custom format function with pretty-format for objects/arrays\n */\n static formatObj(args: unknown[], options?: Partial<PrettyFormatOptions>): string {\n if (args.length === 0) {\n return '';\n }\n\n const formattedArgs = args.map((arg: unknown) => {\n const isObject = typeof arg === 'object' && arg !== null && !Array.isArray(arg);\n const isArray = Array.isArray(arg);\n\n if (isObject || isArray) {\n // Serialize Blob/File objects before formatting\n const maxDepth = options?.maxDepth ?? 5;\n const serialized = this.serializeSpecialObjects(arg, maxDepth);\n\n // For objects and arrays, format them on a new line\n const formatted = prettyFormat(serialized, {\n ...options,\n indent: options?.indent ?? 2,\n maxDepth: maxDepth,\n // Remove Object and Array labels\n printFunctionName: false,\n printBasicPrototype: false\n });\n\n // Remove \"Object\" and \"Array\" labels from the output\n const cleaned = formatted\n .replace(/^Object\\s*/, '')\n .replace(/^Array\\s*/, '')\n .replace(/\\nObject\\s*/g, '\\n')\n .replace(/\\nArray\\s*/g, '\\n');\n\n // Add newline before the object/array\n return '\\n' + cleaned;\n }\n else {\n // For primitive values, check if it's a base64 string\n const stringValue = String(arg);\n if (isBase64(stringValue)) {\n return this.formatBase64String(stringValue);\n }\n return stringValue;\n }\n });\n\n return formattedArgs.join(' ');\n }\n}\n","import type { LogLevel } from './types';\n\nexport const LOG_COLORS: Record<LogLevel, string> = {\n debug: '#3E69B5',\n info: '#59c260',\n warn: '#d2b37e',\n error: '#b64938',\n none: '#fff',\n} as const;\n\nexport const DEFAULT_NAMESPACE = 'app';\n","import { LOG_COLORS } from './constants';\nimport type { LogLevel } from './types';\n\ninterface StylerOptions {\n namespace: string;\n level: LogLevel;\n location: string;\n formattedMessage: string;\n}\n\n/**\n * Get color for log level (browser only)\n */\nfunction getColorForLevel(level: string): string {\n const currentLevel = level as keyof typeof LOG_COLORS;\n return LOG_COLORS[currentLevel] || '#fff';\n}\n\nclass Styler {\n\n public static style(options: StylerOptions): { logMessage: string, logStyles: string[] } {\n const {\n namespace, level, location, formattedMessage,\n } = options;\n const levelColor = getColorForLevel(level);\n\n // Browser: Apply color only to the level\n // Use appropriate console method based on level for proper browser console filtering\n const logMessage = `%c[${namespace}] %c${level.toUpperCase()} %c${location}\\n%c${formattedMessage}`;\n const logStyles = [\n 'padding-bottom: 4px', // for namespace\n `color: ${levelColor}`, // for level\n 'color: #aaa; padding-bottom: 4px', // for location\n '', // empty style for formattedMessage,\n ];\n\n return {\n logMessage,\n logStyles,\n };\n }\n\n}\n\nexport default Styler;\n","\nclass NamespaceMatcher {\n private cachedPatterns: string[] | null = null;\n private cachedConfig: string | undefined = undefined;\n\n matches(namespace?: string, namespaces?: string): boolean {\n const ns = this.normalize(namespace);\n\n // Cache parsed patterns if config hasn't changed\n if (this.cachedConfig !== namespaces) {\n this.cachedPatterns = this.parsePatterns(namespaces);\n this.cachedConfig = namespaces;\n }\n\n const enabledNamespaces = this.cachedPatterns || [];\n\n // If no namespaces are configured, allow all namespaces to log\n if (!enabledNamespaces.length) return true;\n\n // Separate positive and negative patterns\n const positivePatterns: string[] = [];\n const negativePatterns: string[] = [];\n\n for (const pattern of enabledNamespaces) {\n if (pattern.startsWith('-')) {\n negativePatterns.push(pattern.slice(1));\n } else {\n positivePatterns.push(pattern);\n }\n }\n\n // Check if namespace matches any positive pattern\n const matches = positivePatterns.some((pattern) => {\n if (pattern === '*') return true;\n const normalizedPattern = this.normalize(pattern);\n if (pattern.includes('*')) {\n const regex = new RegExp('^' + normalizedPattern.replace(/\\*/g, '.*') + '$');\n // Also match base namespace if pattern is like 'base:*'\n if (regex.test(ns)) return true;\n // Check if base namespace matches (e.g., 'app' matches 'app:*')\n const basePattern = normalizedPattern.split(':')[0];\n if (ns === basePattern && normalizedPattern.startsWith(basePattern + ':')) {\n return true;\n }\n return false;\n }\n return ns === normalizedPattern;\n });\n\n if (!matches) return false;\n\n // Check if namespace is excluded by any negative pattern\n for (const negPattern of negativePatterns) {\n const neg = this.normalize(negPattern);\n if (neg.includes('*')) {\n // For wildcard negations, check if namespace matches the pattern\n const regex = new RegExp('^' + neg.replace(/\\*/g, '.*') + '$');\n if (regex.test(ns)) {\n return false;\n }\n // Also check prefix match (e.g., 'app:db' and 'app:db:query' match '-app:db:*')\n const negPrefix = this.normalize(neg.replace(/\\*.*$/, ''));\n if (negPrefix) {\n // Match if namespace equals the prefix or starts with prefix followed by ':'\n if (ns === negPrefix || ns.startsWith(negPrefix + ':')) {\n return false;\n }\n }\n }\n else {\n // For exact/prefix negations, check if namespace starts with the pattern\n if (ns.startsWith(neg)) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n private normalize(value?: string | null): string {\n if (!value) return '';\n return value.replace(/:+$/, '');\n }\n\n private parsePatterns(namespaces?: string): string[] {\n if (!namespaces) return [];\n return namespaces.split(',').map((s: string) => this.normalize(s.trim()));\n }\n}\n\nconst namespaceMatcher = new NamespaceMatcher();\n\nexport default namespaceMatcher;\n","import Formatter from './formatter';\nimport Styler from './styler';\nimport type { GlobalConfig, LogLevel, LoggerOptions } from './types';\nimport namespaceMatcher from './namespace-matcher';\nimport { DEFAULT_NAMESPACE } from './constants';\n\nlet globalConfig: GlobalConfig = {};\n\nfunction configure(options: GlobalConfig): void {\n globalConfig = { ...globalConfig, ...options };\n}\n\nclass Logger {\n private _namespace: string;\n private _level: LogLevel = 'debug';\n private _maxDepth: number;\n\n constructor(options: LoggerOptions = {}) {\n this._namespace = options.namespace ?? DEFAULT_NAMESPACE;\n this._level = options.level ?? globalConfig.level ?? 'debug';\n this._maxDepth = options.maxDepth ?? globalConfig.maxDepth ?? 10;\n }\n\n debug(message: string, ...args: unknown[]): this {\n this.log('debug', message, ...args);\n return this;\n }\n\n info(message: string, ...args: unknown[]): this {\n this.log('info', message, ...args);\n return this;\n }\n\n warn(message: string, ...args: unknown[]): this {\n this.log('warn', message, ...args);\n return this;\n }\n\n error(message: string, ...args: unknown[]): this {\n this.log('error', message, ...args);\n return this;\n }\n\n setLevel(level: LogLevel): void {\n this._level = level;\n }\n\n maxDepth(maxDepth: number): this {\n this._maxDepth = maxDepth;\n return this;\n }\n\n private getLevelPriority(level: LogLevel): number {\n const priorities: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n none: 4,\n };\n return priorities[level];\n }\n\n private log(level: LogLevel, message: string, ...args: unknown[]): void {\n // show/hide\n if (!namespaceMatcher.matches(this._namespace, globalConfig.namespaces)) {\n return;\n }\n // Check activeLevels first (if configured), otherwise fall back to level priority\n if (globalConfig.activeLevels !== undefined) {\n if (!globalConfig.activeLevels.includes(level)) {\n return;\n }\n }\n else if (this.getLevelPriority(this._level) > this.getLevelPriority(level)) {\n return;\n }\n\n // format data\n const formattedObject = Formatter.formatObj(args, {\n maxDepth: this._maxDepth,\n });\n const formattedMessage = formattedObject ? `${message} ${formattedObject}` : message;\n\n // style data\n const { logMessage, logStyles } = Styler.style({\n namespace: this._namespace,\n level,\n location: '',\n formattedMessage,\n });\n\n switch (level) {\n case 'error':\n console.error(logMessage, ...logStyles);\n break;\n case 'warn':\n console.warn(logMessage, ...logStyles);\n break;\n case 'info':\n console.info(logMessage, ...logStyles);\n break;\n case 'debug':\n console.debug(logMessage, ...logStyles);\n break;\n default:\n console.log(logMessage, ...logStyles);\n }\n }\n}\n\ntype Plslog = {\n (options?: LoggerOptions): Logger;\n configure(options: GlobalConfig): void;\n};\n\nconst plslog = ((options: LoggerOptions = {}) => {\n return new Logger(options);\n}) as Plslog;\n\nplslog.configure = configure;\n\nexport default plslog;"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,309 @@
1
+ import { format } from 'pretty-format';
2
+
3
+ // src/utils/validates.ts
4
+ function isBase64(link) {
5
+ if (!link || typeof link !== "string") return false;
6
+ return link.startsWith("data:image/") && link.includes(";base64");
7
+ }
8
+ var Formatter = class {
9
+ /**
10
+ * Format base64 string for logging
11
+ */
12
+ static formatBase64String(str, previewLength = 20) {
13
+ const length = str.length;
14
+ let base64Part = str;
15
+ let prefix = "";
16
+ if (str.includes(",") && str.includes("base64")) {
17
+ const parts = str.split(",");
18
+ if (parts.length === 2 && parts[0].includes("base64")) {
19
+ prefix = parts[0] + ",";
20
+ base64Part = parts[1];
21
+ }
22
+ }
23
+ const base64Length = base64Part.length;
24
+ if (base64Length <= previewLength * 2) {
25
+ return `[base64: ${prefix}${base64Part} (length: ${length})]`;
26
+ }
27
+ const start = base64Part.substring(0, previewLength);
28
+ const end = base64Part.substring(base64Length - previewLength);
29
+ return `[base64: ${prefix}${start}...${end} (length: ${length})]`;
30
+ }
31
+ /**
32
+ * Helper to serialize Blob and File objects for logging
33
+ */
34
+ static serializeSpecialObjects(obj, maxDepth = 10, currentDepth = 0) {
35
+ if (currentDepth > maxDepth) return "[Max Depth Reached]";
36
+ if (typeof obj === "string" && isBase64(obj)) {
37
+ return this.formatBase64String(obj);
38
+ }
39
+ if (obj instanceof Blob) {
40
+ return {
41
+ size: obj.size,
42
+ type: obj.type
43
+ };
44
+ }
45
+ if (obj instanceof File) {
46
+ return {
47
+ name: obj.name,
48
+ size: obj.size,
49
+ type: obj.type,
50
+ lastModified: obj.lastModified
51
+ };
52
+ }
53
+ if (Array.isArray(obj)) {
54
+ return obj.map((item) => this.serializeSpecialObjects(item, maxDepth, currentDepth + 1));
55
+ }
56
+ if (obj !== null && typeof obj === "object") {
57
+ const serialized = {};
58
+ for (const key in obj) {
59
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
60
+ serialized[key] = this.serializeSpecialObjects(obj[key], maxDepth, currentDepth + 1);
61
+ }
62
+ }
63
+ return serialized;
64
+ }
65
+ return obj;
66
+ }
67
+ /**
68
+ * Custom format function with pretty-format for objects/arrays
69
+ */
70
+ static formatObj(args, options) {
71
+ if (args.length === 0) {
72
+ return "";
73
+ }
74
+ const formattedArgs = args.map((arg) => {
75
+ const isObject = typeof arg === "object" && arg !== null && !Array.isArray(arg);
76
+ const isArray = Array.isArray(arg);
77
+ if (isObject || isArray) {
78
+ const maxDepth = options?.maxDepth ?? 5;
79
+ const serialized = this.serializeSpecialObjects(arg, maxDepth);
80
+ const formatted = format(serialized, {
81
+ ...options,
82
+ indent: options?.indent ?? 2,
83
+ maxDepth,
84
+ // Remove Object and Array labels
85
+ printFunctionName: false,
86
+ printBasicPrototype: false
87
+ });
88
+ const cleaned = formatted.replace(/^Object\s*/, "").replace(/^Array\s*/, "").replace(/\nObject\s*/g, "\n").replace(/\nArray\s*/g, "\n");
89
+ return "\n" + cleaned;
90
+ } else {
91
+ const stringValue = String(arg);
92
+ if (isBase64(stringValue)) {
93
+ return this.formatBase64String(stringValue);
94
+ }
95
+ return stringValue;
96
+ }
97
+ });
98
+ return formattedArgs.join(" ");
99
+ }
100
+ };
101
+
102
+ // src/constants.ts
103
+ var LOG_COLORS = {
104
+ debug: "#3E69B5",
105
+ info: "#59c260",
106
+ warn: "#d2b37e",
107
+ error: "#b64938",
108
+ none: "#fff"
109
+ };
110
+ var DEFAULT_NAMESPACE = "app";
111
+
112
+ // src/styler.ts
113
+ function getColorForLevel(level) {
114
+ const currentLevel = level;
115
+ return LOG_COLORS[currentLevel] || "#fff";
116
+ }
117
+ var Styler = class {
118
+ static style(options) {
119
+ const {
120
+ namespace,
121
+ level,
122
+ location,
123
+ formattedMessage
124
+ } = options;
125
+ const levelColor = getColorForLevel(level);
126
+ const logMessage = `%c[${namespace}] %c${level.toUpperCase()} %c${location}
127
+ %c${formattedMessage}`;
128
+ const logStyles = [
129
+ "padding-bottom: 4px",
130
+ // for namespace
131
+ `color: ${levelColor}`,
132
+ // for level
133
+ "color: #aaa; padding-bottom: 4px",
134
+ // for location
135
+ ""
136
+ // empty style for formattedMessage,
137
+ ];
138
+ return {
139
+ logMessage,
140
+ logStyles
141
+ };
142
+ }
143
+ };
144
+ var styler_default = Styler;
145
+
146
+ // src/namespace-matcher.ts
147
+ var NamespaceMatcher = class {
148
+ constructor() {
149
+ this.cachedPatterns = null;
150
+ this.cachedConfig = void 0;
151
+ }
152
+ matches(namespace, namespaces) {
153
+ const ns = this.normalize(namespace);
154
+ if (this.cachedConfig !== namespaces) {
155
+ this.cachedPatterns = this.parsePatterns(namespaces);
156
+ this.cachedConfig = namespaces;
157
+ }
158
+ const enabledNamespaces = this.cachedPatterns || [];
159
+ if (!enabledNamespaces.length) return true;
160
+ const positivePatterns = [];
161
+ const negativePatterns = [];
162
+ for (const pattern of enabledNamespaces) {
163
+ if (pattern.startsWith("-")) {
164
+ negativePatterns.push(pattern.slice(1));
165
+ } else {
166
+ positivePatterns.push(pattern);
167
+ }
168
+ }
169
+ const matches = positivePatterns.some((pattern) => {
170
+ if (pattern === "*") return true;
171
+ const normalizedPattern = this.normalize(pattern);
172
+ if (pattern.includes("*")) {
173
+ const regex = new RegExp("^" + normalizedPattern.replace(/\*/g, ".*") + "$");
174
+ if (regex.test(ns)) return true;
175
+ const basePattern = normalizedPattern.split(":")[0];
176
+ if (ns === basePattern && normalizedPattern.startsWith(basePattern + ":")) {
177
+ return true;
178
+ }
179
+ return false;
180
+ }
181
+ return ns === normalizedPattern;
182
+ });
183
+ if (!matches) return false;
184
+ for (const negPattern of negativePatterns) {
185
+ const neg = this.normalize(negPattern);
186
+ if (neg.includes("*")) {
187
+ const regex = new RegExp("^" + neg.replace(/\*/g, ".*") + "$");
188
+ if (regex.test(ns)) {
189
+ return false;
190
+ }
191
+ const negPrefix = this.normalize(neg.replace(/\*.*$/, ""));
192
+ if (negPrefix) {
193
+ if (ns === negPrefix || ns.startsWith(negPrefix + ":")) {
194
+ return false;
195
+ }
196
+ }
197
+ } else {
198
+ if (ns.startsWith(neg)) {
199
+ return false;
200
+ }
201
+ }
202
+ }
203
+ return true;
204
+ }
205
+ normalize(value) {
206
+ if (!value) return "";
207
+ return value.replace(/:+$/, "");
208
+ }
209
+ parsePatterns(namespaces) {
210
+ if (!namespaces) return [];
211
+ return namespaces.split(",").map((s) => this.normalize(s.trim()));
212
+ }
213
+ };
214
+ var namespaceMatcher = new NamespaceMatcher();
215
+ var namespace_matcher_default = namespaceMatcher;
216
+
217
+ // src/logger.ts
218
+ var globalConfig = {};
219
+ function configure(options) {
220
+ globalConfig = { ...globalConfig, ...options };
221
+ }
222
+ var Logger = class {
223
+ constructor(options = {}) {
224
+ this._level = "debug";
225
+ this._namespace = options.namespace ?? DEFAULT_NAMESPACE;
226
+ this._level = options.level ?? globalConfig.level ?? "debug";
227
+ this._maxDepth = options.maxDepth ?? globalConfig.maxDepth ?? 10;
228
+ }
229
+ debug(message, ...args) {
230
+ this.log("debug", message, ...args);
231
+ return this;
232
+ }
233
+ info(message, ...args) {
234
+ this.log("info", message, ...args);
235
+ return this;
236
+ }
237
+ warn(message, ...args) {
238
+ this.log("warn", message, ...args);
239
+ return this;
240
+ }
241
+ error(message, ...args) {
242
+ this.log("error", message, ...args);
243
+ return this;
244
+ }
245
+ setLevel(level) {
246
+ this._level = level;
247
+ }
248
+ maxDepth(maxDepth) {
249
+ this._maxDepth = maxDepth;
250
+ return this;
251
+ }
252
+ getLevelPriority(level) {
253
+ const priorities = {
254
+ debug: 0,
255
+ info: 1,
256
+ warn: 2,
257
+ error: 3,
258
+ none: 4
259
+ };
260
+ return priorities[level];
261
+ }
262
+ log(level, message, ...args) {
263
+ if (!namespace_matcher_default.matches(this._namespace, globalConfig.namespaces)) {
264
+ return;
265
+ }
266
+ if (globalConfig.activeLevels !== void 0) {
267
+ if (!globalConfig.activeLevels.includes(level)) {
268
+ return;
269
+ }
270
+ } else if (this.getLevelPriority(this._level) > this.getLevelPriority(level)) {
271
+ return;
272
+ }
273
+ const formattedObject = Formatter.formatObj(args, {
274
+ maxDepth: this._maxDepth
275
+ });
276
+ const formattedMessage = formattedObject ? `${message} ${formattedObject}` : message;
277
+ const { logMessage, logStyles } = styler_default.style({
278
+ namespace: this._namespace,
279
+ level,
280
+ location: "",
281
+ formattedMessage
282
+ });
283
+ switch (level) {
284
+ case "error":
285
+ console.error(logMessage, ...logStyles);
286
+ break;
287
+ case "warn":
288
+ console.warn(logMessage, ...logStyles);
289
+ break;
290
+ case "info":
291
+ console.info(logMessage, ...logStyles);
292
+ break;
293
+ case "debug":
294
+ console.debug(logMessage, ...logStyles);
295
+ break;
296
+ default:
297
+ console.log(logMessage, ...logStyles);
298
+ }
299
+ }
300
+ };
301
+ var plslog = ((options = {}) => {
302
+ return new Logger(options);
303
+ });
304
+ plslog.configure = configure;
305
+ var logger_default = plslog;
306
+
307
+ export { logger_default as default };
308
+ //# sourceMappingURL=index.mjs.map
309
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/validates.ts","../src/formatter.ts","../src/constants.ts","../src/styler.ts","../src/namespace-matcher.ts","../src/logger.ts"],"names":["prettyFormat"],"mappings":"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","file":"index.mjs","sourcesContent":["export function isBase64(link: string | null | undefined | ArrayBuffer): boolean {\n if (!link || typeof link !== 'string') return false;\n return link.startsWith('data:image/') && link.includes(';base64');\n}","import { isBase64 } from './utils/validates';\nimport {\n format as prettyFormat,\n Options as PrettyFormatOptions\n} from 'pretty-format';\n\n/**\n * Handles formatting of log messages, including base64 strings, objects, and arrays\n */\nexport default class Formatter {\n /**\n * Format base64 string for logging\n */\n static formatBase64String(str: string, previewLength: number = 20): string {\n const length = str.length;\n\n // Extract base64 part if it's a data URL\n let base64Part = str;\n let prefix = '';\n if (str.includes(',') && str.includes('base64')) {\n const parts = str.split(',');\n if (parts.length === 2 && parts[0].includes('base64')) {\n prefix = parts[0] + ',';\n base64Part = parts[1];\n }\n }\n\n const base64Length = base64Part.length;\n\n if (base64Length <= previewLength * 2) {\n return `[base64: ${prefix}${base64Part} (length: ${length})]`;\n }\n const start = base64Part.substring(0, previewLength);\n const end = base64Part.substring(base64Length - previewLength);\n return `[base64: ${prefix}${start}...${end} (length: ${length})]`;\n }\n\n /**\n * Helper to serialize Blob and File objects for logging\n */\n static serializeSpecialObjects(obj: any, maxDepth: number = 10, currentDepth: number = 0): any {\n if (currentDepth > maxDepth) return '[Max Depth Reached]';\n\n // Handle base64 strings\n if (typeof obj === 'string' && isBase64(obj)) {\n return this.formatBase64String(obj);\n }\n\n if (obj instanceof Blob) {\n return {\n size: obj.size,\n type: obj.type,\n };\n }\n\n if (obj instanceof File) {\n return {\n name: obj.name,\n size: obj.size,\n type: obj.type,\n lastModified: obj.lastModified,\n };\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => this.serializeSpecialObjects(item, maxDepth, currentDepth + 1));\n }\n\n if (obj !== null && typeof obj === 'object') {\n const serialized: Record<string, any> = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n serialized[key] = this.serializeSpecialObjects(obj[key], maxDepth, currentDepth + 1);\n }\n }\n return serialized;\n }\n\n return obj;\n }\n\n /**\n * Custom format function with pretty-format for objects/arrays\n */\n static formatObj(args: unknown[], options?: Partial<PrettyFormatOptions>): string {\n if (args.length === 0) {\n return '';\n }\n\n const formattedArgs = args.map((arg: unknown) => {\n const isObject = typeof arg === 'object' && arg !== null && !Array.isArray(arg);\n const isArray = Array.isArray(arg);\n\n if (isObject || isArray) {\n // Serialize Blob/File objects before formatting\n const maxDepth = options?.maxDepth ?? 5;\n const serialized = this.serializeSpecialObjects(arg, maxDepth);\n\n // For objects and arrays, format them on a new line\n const formatted = prettyFormat(serialized, {\n ...options,\n indent: options?.indent ?? 2,\n maxDepth: maxDepth,\n // Remove Object and Array labels\n printFunctionName: false,\n printBasicPrototype: false\n });\n\n // Remove \"Object\" and \"Array\" labels from the output\n const cleaned = formatted\n .replace(/^Object\\s*/, '')\n .replace(/^Array\\s*/, '')\n .replace(/\\nObject\\s*/g, '\\n')\n .replace(/\\nArray\\s*/g, '\\n');\n\n // Add newline before the object/array\n return '\\n' + cleaned;\n }\n else {\n // For primitive values, check if it's a base64 string\n const stringValue = String(arg);\n if (isBase64(stringValue)) {\n return this.formatBase64String(stringValue);\n }\n return stringValue;\n }\n });\n\n return formattedArgs.join(' ');\n }\n}\n","import type { LogLevel } from './types';\n\nexport const LOG_COLORS: Record<LogLevel, string> = {\n debug: '#3E69B5',\n info: '#59c260',\n warn: '#d2b37e',\n error: '#b64938',\n none: '#fff',\n} as const;\n\nexport const DEFAULT_NAMESPACE = 'app';\n","import { LOG_COLORS } from './constants';\nimport type { LogLevel } from './types';\n\ninterface StylerOptions {\n namespace: string;\n level: LogLevel;\n location: string;\n formattedMessage: string;\n}\n\n/**\n * Get color for log level (browser only)\n */\nfunction getColorForLevel(level: string): string {\n const currentLevel = level as keyof typeof LOG_COLORS;\n return LOG_COLORS[currentLevel] || '#fff';\n}\n\nclass Styler {\n\n public static style(options: StylerOptions): { logMessage: string, logStyles: string[] } {\n const {\n namespace, level, location, formattedMessage,\n } = options;\n const levelColor = getColorForLevel(level);\n\n // Browser: Apply color only to the level\n // Use appropriate console method based on level for proper browser console filtering\n const logMessage = `%c[${namespace}] %c${level.toUpperCase()} %c${location}\\n%c${formattedMessage}`;\n const logStyles = [\n 'padding-bottom: 4px', // for namespace\n `color: ${levelColor}`, // for level\n 'color: #aaa; padding-bottom: 4px', // for location\n '', // empty style for formattedMessage,\n ];\n\n return {\n logMessage,\n logStyles,\n };\n }\n\n}\n\nexport default Styler;\n","\nclass NamespaceMatcher {\n private cachedPatterns: string[] | null = null;\n private cachedConfig: string | undefined = undefined;\n\n matches(namespace?: string, namespaces?: string): boolean {\n const ns = this.normalize(namespace);\n\n // Cache parsed patterns if config hasn't changed\n if (this.cachedConfig !== namespaces) {\n this.cachedPatterns = this.parsePatterns(namespaces);\n this.cachedConfig = namespaces;\n }\n\n const enabledNamespaces = this.cachedPatterns || [];\n\n // If no namespaces are configured, allow all namespaces to log\n if (!enabledNamespaces.length) return true;\n\n // Separate positive and negative patterns\n const positivePatterns: string[] = [];\n const negativePatterns: string[] = [];\n\n for (const pattern of enabledNamespaces) {\n if (pattern.startsWith('-')) {\n negativePatterns.push(pattern.slice(1));\n } else {\n positivePatterns.push(pattern);\n }\n }\n\n // Check if namespace matches any positive pattern\n const matches = positivePatterns.some((pattern) => {\n if (pattern === '*') return true;\n const normalizedPattern = this.normalize(pattern);\n if (pattern.includes('*')) {\n const regex = new RegExp('^' + normalizedPattern.replace(/\\*/g, '.*') + '$');\n // Also match base namespace if pattern is like 'base:*'\n if (regex.test(ns)) return true;\n // Check if base namespace matches (e.g., 'app' matches 'app:*')\n const basePattern = normalizedPattern.split(':')[0];\n if (ns === basePattern && normalizedPattern.startsWith(basePattern + ':')) {\n return true;\n }\n return false;\n }\n return ns === normalizedPattern;\n });\n\n if (!matches) return false;\n\n // Check if namespace is excluded by any negative pattern\n for (const negPattern of negativePatterns) {\n const neg = this.normalize(negPattern);\n if (neg.includes('*')) {\n // For wildcard negations, check if namespace matches the pattern\n const regex = new RegExp('^' + neg.replace(/\\*/g, '.*') + '$');\n if (regex.test(ns)) {\n return false;\n }\n // Also check prefix match (e.g., 'app:db' and 'app:db:query' match '-app:db:*')\n const negPrefix = this.normalize(neg.replace(/\\*.*$/, ''));\n if (negPrefix) {\n // Match if namespace equals the prefix or starts with prefix followed by ':'\n if (ns === negPrefix || ns.startsWith(negPrefix + ':')) {\n return false;\n }\n }\n }\n else {\n // For exact/prefix negations, check if namespace starts with the pattern\n if (ns.startsWith(neg)) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n private normalize(value?: string | null): string {\n if (!value) return '';\n return value.replace(/:+$/, '');\n }\n\n private parsePatterns(namespaces?: string): string[] {\n if (!namespaces) return [];\n return namespaces.split(',').map((s: string) => this.normalize(s.trim()));\n }\n}\n\nconst namespaceMatcher = new NamespaceMatcher();\n\nexport default namespaceMatcher;\n","import Formatter from './formatter';\nimport Styler from './styler';\nimport type { GlobalConfig, LogLevel, LoggerOptions } from './types';\nimport namespaceMatcher from './namespace-matcher';\nimport { DEFAULT_NAMESPACE } from './constants';\n\nlet globalConfig: GlobalConfig = {};\n\nfunction configure(options: GlobalConfig): void {\n globalConfig = { ...globalConfig, ...options };\n}\n\nclass Logger {\n private _namespace: string;\n private _level: LogLevel = 'debug';\n private _maxDepth: number;\n\n constructor(options: LoggerOptions = {}) {\n this._namespace = options.namespace ?? DEFAULT_NAMESPACE;\n this._level = options.level ?? globalConfig.level ?? 'debug';\n this._maxDepth = options.maxDepth ?? globalConfig.maxDepth ?? 10;\n }\n\n debug(message: string, ...args: unknown[]): this {\n this.log('debug', message, ...args);\n return this;\n }\n\n info(message: string, ...args: unknown[]): this {\n this.log('info', message, ...args);\n return this;\n }\n\n warn(message: string, ...args: unknown[]): this {\n this.log('warn', message, ...args);\n return this;\n }\n\n error(message: string, ...args: unknown[]): this {\n this.log('error', message, ...args);\n return this;\n }\n\n setLevel(level: LogLevel): void {\n this._level = level;\n }\n\n maxDepth(maxDepth: number): this {\n this._maxDepth = maxDepth;\n return this;\n }\n\n private getLevelPriority(level: LogLevel): number {\n const priorities: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n none: 4,\n };\n return priorities[level];\n }\n\n private log(level: LogLevel, message: string, ...args: unknown[]): void {\n // show/hide\n if (!namespaceMatcher.matches(this._namespace, globalConfig.namespaces)) {\n return;\n }\n // Check activeLevels first (if configured), otherwise fall back to level priority\n if (globalConfig.activeLevels !== undefined) {\n if (!globalConfig.activeLevels.includes(level)) {\n return;\n }\n }\n else if (this.getLevelPriority(this._level) > this.getLevelPriority(level)) {\n return;\n }\n\n // format data\n const formattedObject = Formatter.formatObj(args, {\n maxDepth: this._maxDepth,\n });\n const formattedMessage = formattedObject ? `${message} ${formattedObject}` : message;\n\n // style data\n const { logMessage, logStyles } = Styler.style({\n namespace: this._namespace,\n level,\n location: '',\n formattedMessage,\n });\n\n switch (level) {\n case 'error':\n console.error(logMessage, ...logStyles);\n break;\n case 'warn':\n console.warn(logMessage, ...logStyles);\n break;\n case 'info':\n console.info(logMessage, ...logStyles);\n break;\n case 'debug':\n console.debug(logMessage, ...logStyles);\n break;\n default:\n console.log(logMessage, ...logStyles);\n }\n }\n}\n\ntype Plslog = {\n (options?: LoggerOptions): Logger;\n configure(options: GlobalConfig): void;\n};\n\nconst plslog = ((options: LoggerOptions = {}) => {\n return new Logger(options);\n}) as Plslog;\n\nplslog.configure = configure;\n\nexport default plslog;"]}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "plslog",
3
+ "version": "1.0.0",
4
+ "description": "Custom log for browser",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.mjs",
12
+ "require": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsup",
20
+ "dev": "tsup --watch",
21
+ "typecheck": "tsc --noEmit",
22
+ "lint": "eslint .",
23
+ "lint:fix": "eslint . --fix",
24
+ "test": "vitest run",
25
+ "test:watch": "vitest",
26
+ "test:ui": "vitest --ui",
27
+ "test:coverage": "vitest run --coverage",
28
+ "prepublishOnly": "pnpm build"
29
+ },
30
+ "dependencies": {
31
+ "pretty-format": "^30.2.0"
32
+ },
33
+ "devDependencies": {
34
+ "@dauphaihau/eslint-config": "^0.1.1",
35
+ "@types/node": "^24.10.2",
36
+ "@vitest/ui": "^4.0.15",
37
+ "eslint": "^9.39.1",
38
+ "eslint-plugin-filenames-simple": "^0.9.0",
39
+ "tsup": "^8.5.1",
40
+ "typescript": "^5.9.3",
41
+ "typescript-eslint": "^8.49.0",
42
+ "vitest": "^4.0.15"
43
+ },
44
+ "author": "dauphaihau",
45
+ "license": "MIT"
46
+ }