@niceties/logger 1.0.0-alpha.2

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 (44) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +241 -0
  3. package/console-appender/package.json +3 -0
  4. package/core/package.json +3 -0
  5. package/default-formatting/package.json +3 -0
  6. package/dist/appender-utils.d.ts +3 -0
  7. package/dist/console-appender.d.ts +2 -0
  8. package/dist/console-appender.js +11 -0
  9. package/dist/console-appender.mjs +7 -0
  10. package/dist/console-appender.umd.js +2 -0
  11. package/dist/console-appender.umd.js.map +1 -0
  12. package/dist/core.d.ts +11 -0
  13. package/dist/core.js +80 -0
  14. package/dist/core.mjs +74 -0
  15. package/dist/core.umd.js +2 -0
  16. package/dist/core.umd.js.map +1 -0
  17. package/dist/default-formatting.d.ts +4 -0
  18. package/dist/default-formatting.js +19 -0
  19. package/dist/default-formatting.mjs +9 -0
  20. package/dist/default-formatting.umd.js +2 -0
  21. package/dist/default-formatting.umd.js.map +1 -0
  22. package/dist/details/global-appender.d.ts +3 -0
  23. package/dist/format-utils.d.ts +3 -0
  24. package/dist/format-utils.js +23 -0
  25. package/dist/format-utils.mjs +18 -0
  26. package/dist/format-utils.umd.js +2 -0
  27. package/dist/format-utils.umd.js.map +1 -0
  28. package/dist/global-appender-1e01c3e5.js +34 -0
  29. package/dist/global-appender-f4ab2f94.js +32 -0
  30. package/dist/index.d.ts +4 -0
  31. package/dist/index.js +18 -0
  32. package/dist/index.mjs +14 -0
  33. package/dist/index.umd.js +2 -0
  34. package/dist/index.umd.js.map +1 -0
  35. package/dist/simple.d.ts +8 -0
  36. package/dist/simple.js +33 -0
  37. package/dist/simple.mjs +27 -0
  38. package/dist/simple.umd.js +2 -0
  39. package/dist/simple.umd.js.map +1 -0
  40. package/dist/types.d.ts +41 -0
  41. package/format-utils/package.json +3 -0
  42. package/package.json +86 -0
  43. package/simple/package.json +3 -0
  44. package/types/package.json +3 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2021 Konstantin Shutkin
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,241 @@
1
+ # Logger
2
+
3
+ Experimental logger/reporter for async tasks.
4
+
5
+ - Provides API for reporting async events that can be later handled by custom appender.
6
+
7
+ - Provides default appender that uses console for output.
8
+
9
+ - Modular and configurable
10
+
11
+ - Small size
12
+
13
+ # Installation
14
+
15
+ ```
16
+ yarn add @niceties/logger
17
+ ```
18
+
19
+ or
20
+
21
+ ```
22
+ npm install --save @niceties/logger
23
+ ```
24
+
25
+ # Example
26
+
27
+ ```javascript
28
+ import { createLogger } from '@niceties/logger';
29
+
30
+ const logger = createLogger();
31
+
32
+ try {
33
+ logger.start('starting something');
34
+ ...
35
+ // some async code
36
+ ...
37
+ logger.finish('finished something');
38
+ } catch(e) {
39
+ logger.finish('finished something', 3);
40
+ }
41
+ ```
42
+
43
+ # API
44
+
45
+ Logger factory:
46
+
47
+ ```typescript
48
+ function createLogger<ErrorContext = Error>(...args: [] | [string | Identity] | [string, Identity]): ((message: string, loglevel?: LogLevel, context?: ErrorContext | undefined) => void) & {
49
+ start(message: string, loglevel?: LogLevel | undefined): void;
50
+ update(message: string, loglevel?: LogLevel | undefined): void;
51
+ finish(message: string, loglevel?: LogLevel | undefined): void;
52
+ withAppender(appender: Appender<ErrorContext>): ((message: string, loglevel?: LogLevel, context?: ErrorContext | undefined) => void) & any;
53
+ };
54
+ ```
55
+
56
+ Will return a logger instance that can be viewed as an entry for a single async task.
57
+
58
+ ```typescript
59
+ const logger = createLogger('tag');
60
+ const logger2 = createLogger(logger);
61
+ const logger3 = createLogger('tag2', logger);
62
+ ```
63
+
64
+ `tag` can be used to distinguish between async tasks (will be provided to appender).
65
+ logger can be used as parent of another logger (will be provided as parentId to appender).
66
+
67
+ ```typescript
68
+ const log = createLogger();
69
+
70
+ try {
71
+ // some code
72
+ log('some message');
73
+ } catch (e) {
74
+ log('some message', 1, e);
75
+ }
76
+ ```
77
+
78
+ Logger can be used as a function that logs message or error with context. Context type can be defined during creation of the logger (only in typescript).
79
+
80
+ ```typescript
81
+ const log = createLogger<Context>();
82
+
83
+ try {
84
+ // some code
85
+ log('some message');
86
+ } catch (e: Context) {
87
+ log('some message', LogLevel.info, e);
88
+ }
89
+ ```
90
+
91
+ ```typescript
92
+ start(message: string, loglevel?: LogLevel | undefined): void;
93
+ ```
94
+
95
+ Emits start event inside a logger. If loglevel provided it will be remembered and used as default loglevel in subsequent events in the same logger instance. Default loglevel (if argument is not provided) is `info`.
96
+
97
+ ```typescript
98
+ update(message: string, loglevel?: LogLevel | undefined): void;
99
+ ```
100
+
101
+ Emits update event. Can be used to inform user that we are doing something else in the same async task. loglevel used to redefine default loglevel.
102
+
103
+ ```typescript
104
+ finish(message: string, loglevel?: LogLevel | undefined): void;
105
+ ```
106
+
107
+ Emits finish event. Can be used to inform user that task finished. loglevel is optional and equals initial loglevel if omitted.
108
+
109
+ ```typescript
110
+ const log = createLogger()
111
+ .withAppender(someFancyAppender);
112
+ ```
113
+
114
+ Adds new appender for the specific inctance of logger. It is not mandatory to use the return value because no new instance of logger created and appender added to the existing instance.
115
+
116
+ ```typescript
117
+ const log = createLogger()
118
+ .withFilter(predicate);
119
+ ```
120
+
121
+ Install filter on previosly installed appenders. It is not mandatory to use the return value because no new instance of logger created and filter added to the existing instance.
122
+
123
+ ## Log levels
124
+
125
+ ```typescript
126
+ const enum LogLevel {
127
+ verbose, // for debugging logs, not for displaying on screen in normal cases
128
+ info, // should be printed to user but not an error
129
+ warn, // something is probably wrong, but we can continue
130
+ error // operation completely failed
131
+ }
132
+ ```
133
+
134
+ ## Setting another appender
135
+
136
+ User or another library can set another appender by calling:
137
+
138
+ ```typescript
139
+ function appender<ErrorContext = Error>(appender?: Appender<ErrorContext>): Appender<any>;
140
+ ```
141
+
142
+ where appender is a function with following type
143
+
144
+ ```typescript
145
+ (message: LogMessage<ErrorContext>) => void;
146
+
147
+ const enum Action {
148
+ start,
149
+ update,
150
+ success,
151
+ fail
152
+ }
153
+
154
+ type LogMessage<ErrorContext = Error> = {
155
+ inputId: number;
156
+ loglevel: LogLevel;
157
+ message: string;
158
+ action: Action.start | Action.update | Action.finish;
159
+ tag?: string;
160
+ parentId?: string;
161
+ ref: WeakRef<never>;
162
+ } | {
163
+ inputId?: number;
164
+ loglevel: LogLevel;
165
+ message: string;
166
+ action: Action.log;
167
+ tag?: string;
168
+ parentId?: string;
169
+ ref?: WeakRef<never>;
170
+ context?: ErrorContext;
171
+ };
172
+ ```
173
+
174
+ Same appender function without arguments can be used to get current appender.
175
+
176
+ # FAQ
177
+
178
+ ## Can I use more than 4 log levels
179
+
180
+ Despite the fact loglevel defined as an enum it is just a number. Logger does not make assumptions about loglevels besides defining default loglevel as 1 (LogLevel.info).
181
+
182
+ It is generally safe to expand loglevels into both positive and negative range (finer debug messages) as far as appender takes them into account.
183
+
184
+ As an example:
185
+
186
+ ```typescript
187
+ const log = createLogger();
188
+
189
+ log('some message', -1);
190
+ ```
191
+
192
+ will send a log message with finer loglevel than verbose through appender but default appender will ignore it.
193
+
194
+ ## Can I use multiple appenders?
195
+
196
+ It is possible using combuneAppenders and appender functions:
197
+
198
+ ```javascript
199
+ import { createLogger, appender } from "@niceties/logger";
200
+ import { combineAppenders } from "@niceties/logger/appender-utils";
201
+
202
+ appender(combineAppenders(appender(), appender2));
203
+ ```
204
+
205
+ ## Can I set filter for certain loglevel
206
+
207
+ It is possible using filterMessages and appender functions:
208
+
209
+ ```javascript
210
+ import { filterMessages } from "@niceties/logger/appender-utils";
211
+
212
+ let desiredLoglevel = 0;
213
+
214
+ appender(filterMessages((msg) => msg.loglevel >= desiredLoglevel, appender()));
215
+
216
+ function setLoglevel(loglevel) {
217
+ desiredLoglevel = loglevel;
218
+ }
219
+ ```
220
+
221
+ # Subpackages
222
+
223
+ Default subpackage `'@niceties/logger'` exports types, `createLogger()` factory and `appender()` function.
224
+
225
+ Subpackage `'@niceties/logger/default-formatting'` exports formatting constants that is part of default configuration of the console appender.
226
+
227
+ Subpackage `'@niceties/logger/core'` exports `createLogger()` factory and `appender()` function.
228
+
229
+ Subpackage `'@niceties/logger/console-appender'` exports `createConsoleAppender()` factory.
230
+
231
+ Subpackage `'@niceties/logger/format-utils'` exports `createFormatter()` and `terminalSupportsUnicode()` functions.
232
+
233
+ Subpackage `'@niceties/logger/appender-utils'` exports `filterMessages()` and `combineAppenders()` functions.
234
+
235
+ # Prior art
236
+
237
+ - [loglevel](https://github.com/pimterry/loglevel)
238
+
239
+ # License
240
+
241
+ [MIT](./LICENSE)
@@ -0,0 +1,3 @@
1
+ {
2
+ "types": "../dist/console-appender.d.ts"
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "types": "../dist/core.d.ts"
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "types": "../dist/default-formatting.d.ts"
3
+ }
@@ -0,0 +1,3 @@
1
+ import { Appender, LogMessage } from './types';
2
+ export declare function filterMessages<ErrorContext = Error>(predicate: (logMessage: LogMessage<ErrorContext>) => boolean, appender: Appender<ErrorContext>): Appender<ErrorContext>;
3
+ export declare function combineAppenders<ErrorContext = Error>(...appenders: Appender<ErrorContext>[]): Appender<ErrorContext>;
@@ -0,0 +1,2 @@
1
+ import { Formatter, LogMessage } from './types';
2
+ export declare function createConsoleAppender(formatter: Formatter): ({ loglevel, action, message }: LogMessage) => void;
@@ -0,0 +1,11 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ function createConsoleAppender(formatter) {
6
+ return function consoleAppender({ loglevel, action, message }) {
7
+ console.log(formatter(message, loglevel, action === 2 /* finish */));
8
+ };
9
+ }
10
+
11
+ exports.createConsoleAppender = createConsoleAppender;
@@ -0,0 +1,7 @@
1
+ function createConsoleAppender(formatter) {
2
+ return function consoleAppender({ loglevel, action, message }) {
3
+ console.log(formatter(message, loglevel, action === 2 /* finish */));
4
+ };
5
+ }
6
+
7
+ export { createConsoleAppender };
@@ -0,0 +1,2 @@
1
+ !function(e,o){"object"==typeof exports&&"undefined"!=typeof module?o(exports):"function"==typeof define&&define.amd?define(["exports"],o):o((e="undefined"!=typeof globalThis?globalThis:e||self).nicetiesLoggerConsoleAppender={})}(this,(function(e){"use strict";e.createConsoleAppender=function(e){return function({loglevel:o,action:n,message:t}){console.log(e(t,o,2===n))}},Object.defineProperty(e,"__esModule",{value:!0})}));
2
+ //# sourceMappingURL=console-appender.umd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console-appender.umd.js","sources":["../src/console-appender.ts"],"sourcesContent":["import { Action, Formatter, LogMessage } from './types';\n\nexport function createConsoleAppender(formatter: Formatter) {\n return function consoleAppender({loglevel, action, message}: LogMessage) {\n console.log(formatter(message, loglevel, action === Action.finish));\n };\n}\n"],"names":["formatter","loglevel","action","message","console","log"],"mappings":"sSAEsCA,GAClC,OAAO,UAAyBC,SAACA,EAAQC,OAAEA,EAAMC,QAAEA,IAC/CC,QAAQC,IAAIL,EAAUG,EAASF,MAAUC"}
package/dist/core.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ import { combineAppenders, filterMessages } from './appender-utils';
2
+ import { appender } from './details/global-appender';
3
+ import { Appender, LogLevel, LogMessage, Identity } from './types';
4
+ export declare function createLogger<ErrorContext = Error>(...args: [] | [string | Identity] | [string, Identity]): ((message: string, loglevel?: LogLevel, context?: ErrorContext | undefined) => void) & {
5
+ start(message: string, loglevel?: LogLevel | undefined): void;
6
+ update(message: string, loglevel?: LogLevel | undefined): void;
7
+ finish(message: string, loglevel?: LogLevel | undefined): void;
8
+ withFilter(predicate: (logMessage: LogMessage<ErrorContext>) => boolean): ((message: string, loglevel?: LogLevel, context?: ErrorContext | undefined) => void) & any;
9
+ withAppender(appender: Appender<ErrorContext>): ((message: string, loglevel?: LogLevel, context?: ErrorContext | undefined) => void) & any;
10
+ };
11
+ export { appender, combineAppenders, filterMessages };
package/dist/core.js ADDED
@@ -0,0 +1,80 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var globalAppender = require('./global-appender-f4ab2f94.js');
6
+
7
+ let globalInputId = 0;
8
+ function createLogger(...args) {
9
+ let initialLogLevel = 1 /* info */;
10
+ const inputId = globalInputId++;
11
+ const { tag, parentId } = getOptions(args);
12
+ let myAppender = (message) => { globalAppender.globalAppender && globalAppender.globalAppender(message); };
13
+ const loggerInstance = Object.assign(function log(message, loglevel = 1 /* info */, context) {
14
+ append(message, 3 /* log */, loglevel, context);
15
+ }, {
16
+ // Fine to be started multiple times
17
+ start(message, loglevel) {
18
+ if (loglevel !== undefined) {
19
+ initialLogLevel = loglevel;
20
+ }
21
+ append(message, 0 /* start */, initialLogLevel);
22
+ },
23
+ // Fine to be updated multiple times
24
+ update(message, loglevel) {
25
+ append(message, 1 /* update */, loglevel || initialLogLevel);
26
+ },
27
+ // Fine to be finished multiple times
28
+ finish(message, loglevel) {
29
+ append(message, 2 /* finish */, loglevel || initialLogLevel);
30
+ },
31
+ withFilter(predicate) {
32
+ myAppender = globalAppender.filterMessages(predicate, myAppender);
33
+ return loggerInstance;
34
+ },
35
+ withAppender(appender) {
36
+ myAppender = globalAppender.combineAppenders(myAppender, appender);
37
+ return loggerInstance;
38
+ }
39
+ });
40
+ Object.defineProperty(loggerInstance, 'id', {
41
+ value: inputId,
42
+ writable: false
43
+ });
44
+ const ref = new WeakRef(loggerInstance);
45
+ return loggerInstance;
46
+ function append(message, action, loglevel, context) {
47
+ myAppender({
48
+ action,
49
+ inputId,
50
+ message,
51
+ loglevel,
52
+ tag,
53
+ parentId,
54
+ ref,
55
+ context
56
+ });
57
+ }
58
+ }
59
+ function getOptions(options) {
60
+ var _a, _b;
61
+ let parentId, tag;
62
+ if (options.length === 1) {
63
+ if (typeof options[0] === 'string') {
64
+ tag = options[0];
65
+ }
66
+ else {
67
+ parentId = (_a = options[0]) === null || _a === void 0 ? void 0 : _a.id;
68
+ }
69
+ }
70
+ else if (options.length === 2) {
71
+ tag = options[0];
72
+ parentId = (_b = options[1]) === null || _b === void 0 ? void 0 : _b.id;
73
+ }
74
+ return { parentId, tag };
75
+ }
76
+
77
+ exports.appender = globalAppender.appender;
78
+ exports.combineAppenders = globalAppender.combineAppenders;
79
+ exports.filterMessages = globalAppender.filterMessages;
80
+ exports.createLogger = createLogger;
package/dist/core.mjs ADDED
@@ -0,0 +1,74 @@
1
+ import { g as globalAppender, f as filterMessages, c as combineAppenders } from './global-appender-1e01c3e5.js';
2
+ export { a as appender, c as combineAppenders, f as filterMessages } from './global-appender-1e01c3e5.js';
3
+
4
+ let globalInputId = 0;
5
+ function createLogger(...args) {
6
+ let initialLogLevel = 1 /* info */;
7
+ const inputId = globalInputId++;
8
+ const { tag, parentId } = getOptions(args);
9
+ let myAppender = (message) => { globalAppender && globalAppender(message); };
10
+ const loggerInstance = Object.assign(function log(message, loglevel = 1 /* info */, context) {
11
+ append(message, 3 /* log */, loglevel, context);
12
+ }, {
13
+ // Fine to be started multiple times
14
+ start(message, loglevel) {
15
+ if (loglevel !== undefined) {
16
+ initialLogLevel = loglevel;
17
+ }
18
+ append(message, 0 /* start */, initialLogLevel);
19
+ },
20
+ // Fine to be updated multiple times
21
+ update(message, loglevel) {
22
+ append(message, 1 /* update */, loglevel || initialLogLevel);
23
+ },
24
+ // Fine to be finished multiple times
25
+ finish(message, loglevel) {
26
+ append(message, 2 /* finish */, loglevel || initialLogLevel);
27
+ },
28
+ withFilter(predicate) {
29
+ myAppender = filterMessages(predicate, myAppender);
30
+ return loggerInstance;
31
+ },
32
+ withAppender(appender) {
33
+ myAppender = combineAppenders(myAppender, appender);
34
+ return loggerInstance;
35
+ }
36
+ });
37
+ Object.defineProperty(loggerInstance, 'id', {
38
+ value: inputId,
39
+ writable: false
40
+ });
41
+ const ref = new WeakRef(loggerInstance);
42
+ return loggerInstance;
43
+ function append(message, action, loglevel, context) {
44
+ myAppender({
45
+ action,
46
+ inputId,
47
+ message,
48
+ loglevel,
49
+ tag,
50
+ parentId,
51
+ ref,
52
+ context
53
+ });
54
+ }
55
+ }
56
+ function getOptions(options) {
57
+ var _a, _b;
58
+ let parentId, tag;
59
+ if (options.length === 1) {
60
+ if (typeof options[0] === 'string') {
61
+ tag = options[0];
62
+ }
63
+ else {
64
+ parentId = (_a = options[0]) === null || _a === void 0 ? void 0 : _a.id;
65
+ }
66
+ }
67
+ else if (options.length === 2) {
68
+ tag = options[0];
69
+ parentId = (_b = options[1]) === null || _b === void 0 ? void 0 : _b.id;
70
+ }
71
+ return { parentId, tag };
72
+ }
73
+
74
+ export { createLogger };
@@ -0,0 +1,2 @@
1
+ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).nicetiesLoggerCore={})}(this,(function(t){"use strict";function e(t,e){return function(n){t(n)&&e(n)}}function n(...t){return e=>{for(const n of t)try{n(e)}catch(t){}}}let o;let i=0;t.appender=function(t){return void 0!==t&&(o=t),o},t.combineAppenders=n,t.createLogger=function(...t){let f=1;const u=i++,{tag:r,parentId:c}=function(t){var e,n;let o,i;1===t.length?"string"==typeof t[0]?i=t[0]:o=null===(e=t[0])||void 0===e?void 0:e.id:2===t.length&&(i=t[0],o=null===(n=t[1])||void 0===n?void 0:n.id);return{parentId:o,tag:i}}(t);let l=t=>{o&&o(t)};const d=Object.assign((function(t,e=1,n){a(t,3,e,n)}),{start(t,e){void 0!==e&&(f=e),a(t,0,f)},update(t,e){a(t,1,e||f)},finish(t,e){a(t,2,e||f)},withFilter:t=>(l=e(t,l),d),withAppender:t=>(l=n(l,t),d)});Object.defineProperty(d,"id",{value:u,writable:!1});const s=new WeakRef(d);return d;function a(t,e,n,o){l({action:e,inputId:u,message:t,loglevel:n,tag:r,parentId:c,ref:s,context:o})}},t.filterMessages=e,Object.defineProperty(t,"__esModule",{value:!0})}));
2
+ //# sourceMappingURL=core.umd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.umd.js","sources":["../src/appender-utils.ts","../src/details/global-appender.ts","../src/core.ts"],"sourcesContent":["import { Appender, LogMessage } from './types';\n\nexport function filterMessages<ErrorContext = Error>(predicate: (logMessage: LogMessage<ErrorContext>) => boolean, appender: Appender<ErrorContext> ): Appender<ErrorContext> {\n return function(logMessage: LogMessage<ErrorContext>) {\n if (predicate(logMessage)) {\n appender(logMessage);\n }\n };\n}\n\nexport function combineAppenders<ErrorContext = Error>(...appenders: Appender<ErrorContext>[]): Appender<ErrorContext> {\n return (message: LogMessage<ErrorContext>) => {\n for(const appender of appenders) {\n try {\n appender(message);\n } catch(e) { /* eat the error */ }\n }\n };\n}","import { Appender } from '../types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport let globalAppender: Appender<any>;\n\nexport function appender<ErrorContext = Error>(appender?: Appender<ErrorContext>) {\n if (appender !== undefined) {\n globalAppender = appender;\n }\n return globalAppender;\n}\n","import { combineAppenders, filterMessages } from './appender-utils';\nimport { globalAppender, appender } from './details/global-appender';\nimport { Action, Appender, LogLevel, LogMessage, Identity } from './types';\n\nlet globalInputId = 0;\n\nexport function createLogger<ErrorContext = Error>(...args: [] | [string | Identity] | [string, Identity]) {\n let initialLogLevel: number = LogLevel.info;\n \n const inputId = globalInputId++;\n \n const { tag, parentId } = getOptions(args);\n \n let myAppender = (message: LogMessage<ErrorContext>) => { globalAppender && globalAppender(message); };\n\n const loggerInstance = Object.assign(\n function log(message: string, loglevel: LogLevel = LogLevel.info, context?: ErrorContext) {\n append(message, Action.log, loglevel, context);\n }, {\n // Fine to be started multiple times\n start(message: string, loglevel?: LogLevel) {\n if (loglevel !== undefined) {\n initialLogLevel = loglevel;\n }\n append(message, Action.start, initialLogLevel);\n },\n // Fine to be updated multiple times\n update(message: string, loglevel?: LogLevel) {\n append(message, Action.update, loglevel || initialLogLevel);\n },\n // Fine to be finished multiple times\n finish(message: string, loglevel?: LogLevel) {\n append(message, Action.finish, loglevel || initialLogLevel);\n },\n withFilter(predicate: (logMessage: LogMessage<ErrorContext>) => boolean) {\n myAppender = filterMessages(predicate, myAppender);\n return loggerInstance;\n },\n withAppender(appender: Appender<ErrorContext>) {\n myAppender = combineAppenders(myAppender, appender);\n return loggerInstance;\n }\n }\n );\n\n Object.defineProperty(loggerInstance, 'id', {\n value: inputId,\n writable: false\n });\n\n const ref = new WeakRef(loggerInstance);\n\n return loggerInstance;\n\n function append(message: string, action: Action, loglevel: LogLevel, context?: ErrorContext) {\n myAppender({\n action,\n inputId,\n message,\n loglevel,\n tag,\n parentId,\n ref,\n context\n } as LogMessage<ErrorContext>);\n }\n}\n\nfunction getOptions(options: [] | [string | Identity] | [string, Identity]): { tag?: string, parentId?: number } {\n let parentId, tag;\n if (options.length === 1) {\n if (typeof options[0] === 'string') {\n tag = options[0];\n } else {\n parentId = options[0]?.id;\n }\n } else if (options.length === 2) {\n tag = options[0];\n parentId = options[1]?.id;\n }\n return { parentId, tag };\n}\n\nexport { appender, combineAppenders, filterMessages };"],"names":["filterMessages","predicate","appender","logMessage","combineAppenders","appenders","message","e","globalAppender","globalInputId","undefined","args","initialLogLevel","inputId","tag","parentId","options","length","id","getOptions","myAppender","loggerInstance","Object","assign","loglevel","context","append","start","update","finish","withFilter","withAppender","defineProperty","value","writable","ref","WeakRef","action"],"mappings":"mQAEgBA,EAAqCC,EAA8DC,GAC/G,OAAO,SAASC,GACRF,EAAUE,IACVD,EAASC,aAKLC,KAA0CC,GACtD,OAAQC,IACJ,IAAI,MAAMJ,KAAYG,EAClB,IACIH,EAASI,GACX,MAAMC,MCZb,IAAIC,ECCX,IAAIC,EAAgB,sBDC2BP,GAI3C,YAHiBQ,IAAbR,IACAM,EAAiBN,GAEdM,mDCH2CG,GAClD,IAAIC,IAEJ,MAAMC,EAAUJ,KAEVK,IAAEA,EAAGC,SAAEA,GAyDjB,SAAoBC,WAChB,IAAID,EAAUD,EACS,IAAnBE,EAAQC,OACkB,iBAAfD,EAAQ,GACfF,EAAME,EAAQ,GAEdD,YAAWC,EAAQ,yBAAIE,GAED,IAAnBF,EAAQC,SACfH,EAAME,EAAQ,GACdD,YAAWC,EAAQ,yBAAIE,IAE3B,MAAO,CAAEH,SAAAA,EAAUD,IAAAA,GArEOK,CAAWR,GAErC,IAAIS,EAAcd,IAAwCE,GAAkBA,EAAeF,IAE3F,MAAMe,EAAiBC,OAAOC,QAC1B,SAAajB,EAAiBkB,IAAoCC,GAC9DC,EAAOpB,IAAqBkB,EAAUC,KACvC,CAECE,MAAMrB,EAAiBkB,QACFd,IAAbc,IACAZ,EAAkBY,GAEtBE,EAAOpB,IAAuBM,IAGlCgB,OAAOtB,EAAiBkB,GACpBE,EAAOpB,IAAwBkB,GAAYZ,IAG/CiB,OAAOvB,EAAiBkB,GACpBE,EAAOpB,IAAwBkB,GAAYZ,IAE/CkB,WAAW7B,IACPmB,EAAapB,EAAeC,EAAWmB,GAChCC,GAEXU,aAAa7B,IACTkB,EAAahB,EAAiBgB,EAAYlB,GACnCmB,KAKnBC,OAAOU,eAAeX,EAAgB,KAAM,CACxCY,MAAOpB,EACPqB,UAAU,IAGd,MAAMC,EAAM,IAAIC,QAAQf,GAExB,OAAOA,EAEP,SAASK,EAAOpB,EAAiB+B,EAAgBb,EAAoBC,GACjEL,EAAW,CACPiB,OAAAA,EACAxB,QAAAA,EACAP,QAAAA,EACAkB,SAAAA,EACAV,IAAAA,EACAC,SAAAA,EACAoB,IAAAA,EACAV,QAAAA"}
@@ -0,0 +1,4 @@
1
+ import { ColorFormatters, Prefixes } from './types';
2
+ export declare const unicodePrefixes: Prefixes;
3
+ export declare const asciiPrefixes: Prefixes;
4
+ export declare const colors: ColorFormatters;
@@ -0,0 +1,19 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var kleur = require('kleur');
6
+
7
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
8
+
9
+ var kleur__default = /*#__PURE__*/_interopDefaultLegacy(kleur);
10
+
11
+ const { green, red, yellow } = kleur__default["default"];
12
+ const unicodePrefixes = [`${green('✓')}`, `${green('✓')}`, '⚠', '✕'];
13
+ const asciiPrefixes = [`${green('+')}`, `${green('+')}`, '!', 'x'];
14
+ // eslint-disable-next-line no-sparse-arrays
15
+ const colors = [, , yellow, red];
16
+
17
+ exports.asciiPrefixes = asciiPrefixes;
18
+ exports.colors = colors;
19
+ exports.unicodePrefixes = unicodePrefixes;
@@ -0,0 +1,9 @@
1
+ import kleur from 'kleur';
2
+
3
+ const { green, red, yellow } = kleur;
4
+ const unicodePrefixes = [`${green('✓')}`, `${green('✓')}`, '⚠', '✕'];
5
+ const asciiPrefixes = [`${green('+')}`, `${green('+')}`, '!', 'x'];
6
+ // eslint-disable-next-line no-sparse-arrays
7
+ const colors = [, , yellow, red];
8
+
9
+ export { asciiPrefixes, colors, unicodePrefixes };
@@ -0,0 +1,2 @@
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("kleur")):"function"==typeof define&&define.amd?define(["exports","kleur"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).nicetiesLoggerDefaultFormatting={},e.kleur)}(this,(function(e,t){"use strict";function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=o(t);const{green:f,red:u,yellow:i}=n.default,l=[`${f("✓")}`,`${f("✓")}`,"⚠","✕"],r=[`${f("+")}`,`${f("+")}`,"!","x"],d=[,,i,u];e.asciiPrefixes=r,e.colors=d,e.unicodePrefixes=l,Object.defineProperty(e,"__esModule",{value:!0})}));
2
+ //# sourceMappingURL=default-formatting.umd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-formatting.umd.js","sources":["../src/default-formatting.ts"],"sourcesContent":["import kleur from 'kleur';\nimport { ColorFormatters, Prefixes } from './types';\nconst { green, red, yellow } = kleur;\n\nexport const unicodePrefixes: Prefixes = [`${green('✓')}`, `${green('✓')}`, '⚠', '✕'];\nexport const asciiPrefixes: Prefixes = [`${green('+')}`, `${green('+')}`, '!', 'x'];\n// eslint-disable-next-line no-sparse-arrays\nexport const colors: ColorFormatters = [,,yellow, red];"],"names":["green","red","yellow","kleur","unicodePrefixes","asciiPrefixes","colors"],"mappings":"6XAEA,MAAMA,MAAEA,EAAKC,IAAEA,EAAGC,OAAEA,GAAWC,UAElBC,EAA4B,CAAC,GAAGJ,EAAM,OAAQ,GAAGA,EAAM,OAAQ,IAAK,KACpEK,EAA0B,CAAC,GAAGL,EAAM,OAAQ,GAAGA,EAAM,OAAQ,IAAK,KAElEM,EAA0B,GAAGJ,EAAQD"}
@@ -0,0 +1,3 @@
1
+ import { Appender } from '../types';
2
+ export declare let globalAppender: Appender<any>;
3
+ export declare function appender<ErrorContext = Error>(appender?: Appender<ErrorContext>): Appender<any>;
@@ -0,0 +1,3 @@
1
+ import { ColorFormatters, LogLevel, Prefixes } from './types';
2
+ export declare function createFormatter(colors: ColorFormatters, prefixes: Prefixes): (message: string, loglevel: LogLevel, usePrefix?: string | boolean | undefined, identation?: number) => string;
3
+ export declare function terminalSupportsUnicode(): boolean;
@@ -0,0 +1,23 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ function createFormatter(colors, prefixes) {
6
+ return function formatMessage(message, loglevel, usePrefix, identation = 0) {
7
+ const prefix = usePrefix === true ? (`${prefixes[loglevel]} `) : (typeof usePrefix === 'string' ? (`${usePrefix} `) : '');
8
+ const color = colors[loglevel];
9
+ const text = `${prefix}${message}`;
10
+ return `${' '.repeat(identation)}${color ? color(text) : text}`;
11
+ };
12
+ }
13
+ // from dreidels/utils
14
+ function terminalSupportsUnicode() {
15
+ // The default command prompt and powershell in Windows do not support Unicode characters.
16
+ // However, the VSCode integrated terminal and the Windows Terminal both do.
17
+ return process.platform !== 'win32'
18
+ || process.env.TERM_PROGRAM === 'vscode'
19
+ || !!process.env.WT_SESSION;
20
+ }
21
+
22
+ exports.createFormatter = createFormatter;
23
+ exports.terminalSupportsUnicode = terminalSupportsUnicode;
@@ -0,0 +1,18 @@
1
+ function createFormatter(colors, prefixes) {
2
+ return function formatMessage(message, loglevel, usePrefix, identation = 0) {
3
+ const prefix = usePrefix === true ? (`${prefixes[loglevel]} `) : (typeof usePrefix === 'string' ? (`${usePrefix} `) : '');
4
+ const color = colors[loglevel];
5
+ const text = `${prefix}${message}`;
6
+ return `${' '.repeat(identation)}${color ? color(text) : text}`;
7
+ };
8
+ }
9
+ // from dreidels/utils
10
+ function terminalSupportsUnicode() {
11
+ // The default command prompt and powershell in Windows do not support Unicode characters.
12
+ // However, the VSCode integrated terminal and the Windows Terminal both do.
13
+ return process.platform !== 'win32'
14
+ || process.env.TERM_PROGRAM === 'vscode'
15
+ || !!process.env.WT_SESSION;
16
+ }
17
+
18
+ export { createFormatter, terminalSupportsUnicode };
@@ -0,0 +1,2 @@
1
+ !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self).nicetiesLoggerFormatUtils={})}(this,(function(e){"use strict";e.createFormatter=function(e,n){return function(o,t,s,f=0){const i=!0===s?`${n[t]} `:"string"==typeof s?`${s} `:"",u=e[t],c=`${i}${o}`;return`${" ".repeat(f)}${u?u(c):c}`}},e.terminalSupportsUnicode=function(){return"win32"!==process.platform||"vscode"===process.env.TERM_PROGRAM||!!process.env.WT_SESSION},Object.defineProperty(e,"__esModule",{value:!0})}));
2
+ //# sourceMappingURL=format-utils.umd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-utils.umd.js","sources":["../src/format-utils.ts"],"sourcesContent":["import { ColorFormatters, LogLevel, Prefixes } from './types';\n\nexport function createFormatter(colors: ColorFormatters, prefixes: Prefixes) {\n return function formatMessage(message: string, loglevel: LogLevel, usePrefix?: string | boolean, identation = 0): string {\n const prefix = usePrefix === true ? (`${prefixes[loglevel]} `) : (typeof usePrefix === 'string' ? (`${usePrefix} `) : '');\n const color = colors[loglevel];\n const text = `${prefix}${message}`;\n return `${' '.repeat(identation)}${color ? color(text) : text}`;\n };\n}\n\n// from dreidels/utils\nexport function terminalSupportsUnicode() {\n // The default command prompt and powershell in Windows do not support Unicode characters.\n // However, the VSCode integrated terminal and the Windows Terminal both do.\n return process.platform !== 'win32'\n || process.env.TERM_PROGRAM === 'vscode'\n || !!process.env.WT_SESSION;\n}"],"names":["colors","prefixes","message","loglevel","usePrefix","identation","prefix","color","text","repeat","process","platform","env","TERM_PROGRAM","WT_SESSION"],"mappings":"4RAEgCA,EAAyBC,GACrD,OAAO,SAAuBC,EAAiBC,EAAoBC,EAA8BC,EAAa,GAC1G,MAAMC,GAAuB,IAAdF,KAAyBH,EAASE,MAAsC,iBAAdC,KAA6BA,KAAgB,GAChHG,EAAQP,EAAOG,GACfK,EAAO,GAAGF,IAASJ,IACzB,MAAO,GAAG,IAAIO,OAAOJ,KAAcE,EAAQA,EAAMC,GAAQA,2CAQ7D,MAA4B,UAArBE,QAAQC,UACmB,WAA7BD,QAAQE,IAAIC,gBACVH,QAAQE,IAAIE"}
@@ -0,0 +1,34 @@
1
+ function filterMessages(predicate, appender) {
2
+ return function (logMessage) {
3
+ if (predicate(logMessage)) {
4
+ appender(logMessage);
5
+ }
6
+ };
7
+ }
8
+ function combineAppenders(...appenders) {
9
+ return (message) => {
10
+ for (const appender of appenders) {
11
+ try {
12
+ appender(message);
13
+ }
14
+ catch (e) { /* eat the error */ }
15
+ }
16
+ };
17
+ }
18
+
19
+ var appenderUtils = /*#__PURE__*/Object.freeze({
20
+ __proto__: null,
21
+ filterMessages: filterMessages,
22
+ combineAppenders: combineAppenders
23
+ });
24
+
25
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
26
+ let globalAppender;
27
+ function appender(appender) {
28
+ if (appender !== undefined) {
29
+ globalAppender = appender;
30
+ }
31
+ return globalAppender;
32
+ }
33
+
34
+ export { appender as a, appenderUtils as b, combineAppenders as c, filterMessages as f, globalAppender as g };
@@ -0,0 +1,32 @@
1
+ 'use strict';
2
+
3
+ function filterMessages(predicate, appender) {
4
+ return function (logMessage) {
5
+ if (predicate(logMessage)) {
6
+ appender(logMessage);
7
+ }
8
+ };
9
+ }
10
+ function combineAppenders(...appenders) {
11
+ return (message) => {
12
+ for (const appender of appenders) {
13
+ try {
14
+ appender(message);
15
+ }
16
+ catch (e) { /* eat the error */ }
17
+ }
18
+ };
19
+ }
20
+
21
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
22
+ exports.globalAppender = void 0;
23
+ function appender(appender) {
24
+ if (appender !== undefined) {
25
+ exports.globalAppender = appender;
26
+ }
27
+ return exports.globalAppender;
28
+ }
29
+
30
+ exports.appender = appender;
31
+ exports.combineAppenders = combineAppenders;
32
+ exports.filterMessages = filterMessages;
@@ -0,0 +1,4 @@
1
+ import { createLogger } from './core';
2
+ import { appender } from './details/global-appender';
3
+ export * from './types';
4
+ export { createLogger, appender };
package/dist/index.js ADDED
@@ -0,0 +1,18 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var core = require('./core.js');
6
+ var globalAppender = require('./global-appender-f4ab2f94.js');
7
+
8
+ if (!globalAppender.appender()) {
9
+ const { asciiPrefixes, colors, unicodePrefixes } = require('./default-formatting');
10
+ const { createConsoleAppender } = require('./console-appender');
11
+ const { filterMessages } = require('./appender-utils');
12
+ const { createFormatter, terminalSupportsUnicode } = require('./format-utils');
13
+ const formatter = createFormatter(colors, terminalSupportsUnicode() ? unicodePrefixes : asciiPrefixes);
14
+ globalAppender.appender(filterMessages((message) => message.loglevel > 0 /* verbose */, createConsoleAppender(formatter)));
15
+ }
16
+
17
+ exports.createLogger = core.createLogger;
18
+ exports.appender = globalAppender.appender;
package/dist/index.mjs ADDED
@@ -0,0 +1,14 @@
1
+ export { createLogger } from './core.mjs';
2
+ import { a as appender } from './global-appender-1e01c3e5.js';
3
+ export { a as appender } from './global-appender-1e01c3e5.js';
4
+
5
+ if (!appender()) {
6
+ const [{ asciiPrefixes, colors, unicodePrefixes }, { createConsoleAppender }, { filterMessages }, { createFormatter, terminalSupportsUnicode }] = await Promise.all([
7
+ import('./default-formatting.mjs'),
8
+ import('./console-appender.mjs'),
9
+ import('./global-appender-1e01c3e5.js').then(function (n) { return n.b; }),
10
+ import('./format-utils.mjs')
11
+ ]);
12
+ const formatter = createFormatter(colors, terminalSupportsUnicode() ? unicodePrefixes : asciiPrefixes);
13
+ appender(filterMessages((message) => message.loglevel > 0 /* verbose */, createConsoleAppender(formatter)));
14
+ }
@@ -0,0 +1,2 @@
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("./core"),require("./default-formatting"),require("./console-appender"),require("./format-utils")):"function"==typeof define&&define.amd?define(["exports","./core","./default-formatting","./console-appender","./format-utils"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).nicetiesLogger={},e.nicetiesLoggerCore,e.nicetiesLoggerDefaultFormatting,e.nicetiesLoggerConsoleAppender,e.nicetiesLoggerFormatUtils)}(this,(function(e,t,n,o,r){"use strict";let i;function u(e){return void 0!==e&&(i=e),i}if(!u()){const e=r.createFormatter(n.colors,r.terminalSupportsUnicode()?n.unicodePrefixes:n.asciiPrefixes);u(function(e,t){return function(n){e(n)&&t(n)}}((e=>e.loglevel>0),o.createConsoleAppender(e)))}Object.defineProperty(e,"createLogger",{enumerable:!0,get:function(){return t.createLogger}}),e.appender=u,Object.defineProperty(e,"__esModule",{value:!0})}));
2
+ //# sourceMappingURL=index.umd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.umd.js","sources":["../src/details/global-appender.ts","../src/index.ts","../src/appender-utils.ts"],"sourcesContent":["import { Appender } from '../types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport let globalAppender: Appender<any>;\n\nexport function appender<ErrorContext = Error>(appender?: Appender<ErrorContext>) {\n if (appender !== undefined) {\n globalAppender = appender;\n }\n return globalAppender;\n}\n","import { createLogger } from './core';\nimport { appender } from './details/global-appender';\nimport { LogLevel, LogMessage } from './types';\nimport { asciiPrefixes, colors, unicodePrefixes } from './default-formatting';\nimport { createConsoleAppender } from './console-appender';\nimport { filterMessages } from './appender-utils';\nimport { createFormatter, terminalSupportsUnicode } from './format-utils';\n\nif (!appender()) {\n const formatter = createFormatter(colors, terminalSupportsUnicode() ? unicodePrefixes : asciiPrefixes);\n appender(filterMessages((message: LogMessage) => (message.loglevel as number) > LogLevel.verbose, createConsoleAppender(formatter)));\n}\n\nexport * from './types';\nexport { createLogger, appender };\n","import { Appender, LogMessage } from './types';\n\nexport function filterMessages<ErrorContext = Error>(predicate: (logMessage: LogMessage<ErrorContext>) => boolean, appender: Appender<ErrorContext> ): Appender<ErrorContext> {\n return function(logMessage: LogMessage<ErrorContext>) {\n if (predicate(logMessage)) {\n appender(logMessage);\n }\n };\n}\n\nexport function combineAppenders<ErrorContext = Error>(...appenders: Appender<ErrorContext>[]): Appender<ErrorContext> {\n return (message: LogMessage<ErrorContext>) => {\n for(const appender of appenders) {\n try {\n appender(message);\n } catch(e) { /* eat the error */ }\n }\n };\n}"],"names":["globalAppender","appender","undefined","formatter","createFormatter","colors","terminalSupportsUnicode","unicodePrefixes","asciiPrefixes","predicate","logMessage","filterMessages","message","loglevel","createConsoleAppender"],"mappings":"iiBAGO,IAAIA,WAEKC,EAA+BA,GAI3C,YAHiBC,IAAbD,IACAD,EAAiBC,GAEdD,ECDX,IAAKC,IAAY,CACb,MAAME,EAAYC,kBAAgBC,SAAQC,4BAA4BC,kBAAkBC,iBACxFP,WCRiDQ,EAA8DR,GAC/G,OAAO,SAASS,GACRD,EAAUC,IACVT,EAASS,IDKRC,EAAgBC,GAAyBA,EAAQC,YAAwCC,wBAAsBX"}
@@ -0,0 +1,8 @@
1
+ import { combineAppenders, filterMessages } from './appender-utils';
2
+ import { appender } from './details/global-appender';
3
+ import { Appender, LogLevel, LogMessage } from './types';
4
+ export declare function createLogger<ErrorContext = Error>(tag?: string): ((message: string, loglevel?: LogLevel, context?: ErrorContext | undefined) => void) & {
5
+ withFilter(predicate: (logMessage: LogMessage<ErrorContext>) => boolean): ((message: string, loglevel?: LogLevel, context?: ErrorContext | undefined) => void) & any;
6
+ withAppender(appender: Appender<ErrorContext>): ((message: string, loglevel?: LogLevel, context?: ErrorContext | undefined) => void) & any;
7
+ };
8
+ export { appender, combineAppenders, filterMessages };
package/dist/simple.js ADDED
@@ -0,0 +1,33 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var globalAppender = require('./global-appender-f4ab2f94.js');
6
+
7
+ function createLogger(tag) {
8
+ let myAppender = (message) => { globalAppender.globalAppender && globalAppender.globalAppender(message); };
9
+ const loggerInstance = Object.assign(function log(message, loglevel = 1 /* info */, context) {
10
+ myAppender({
11
+ action: 3 /* log */,
12
+ message,
13
+ loglevel,
14
+ tag,
15
+ context
16
+ });
17
+ }, {
18
+ withFilter(predicate) {
19
+ myAppender = globalAppender.filterMessages(predicate, myAppender);
20
+ return loggerInstance;
21
+ },
22
+ withAppender(appender) {
23
+ myAppender = globalAppender.combineAppenders(myAppender, appender);
24
+ return loggerInstance;
25
+ }
26
+ });
27
+ return loggerInstance;
28
+ }
29
+
30
+ exports.appender = globalAppender.appender;
31
+ exports.combineAppenders = globalAppender.combineAppenders;
32
+ exports.filterMessages = globalAppender.filterMessages;
33
+ exports.createLogger = createLogger;
@@ -0,0 +1,27 @@
1
+ import { f as filterMessages, c as combineAppenders, g as globalAppender } from './global-appender-1e01c3e5.js';
2
+ export { a as appender, c as combineAppenders, f as filterMessages } from './global-appender-1e01c3e5.js';
3
+
4
+ function createLogger(tag) {
5
+ let myAppender = (message) => { globalAppender && globalAppender(message); };
6
+ const loggerInstance = Object.assign(function log(message, loglevel = 1 /* info */, context) {
7
+ myAppender({
8
+ action: 3 /* log */,
9
+ message,
10
+ loglevel,
11
+ tag,
12
+ context
13
+ });
14
+ }, {
15
+ withFilter(predicate) {
16
+ myAppender = filterMessages(predicate, myAppender);
17
+ return loggerInstance;
18
+ },
19
+ withAppender(appender) {
20
+ myAppender = combineAppenders(myAppender, appender);
21
+ return loggerInstance;
22
+ }
23
+ });
24
+ return loggerInstance;
25
+ }
26
+
27
+ export { createLogger };
@@ -0,0 +1,2 @@
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).nicetiesLoggerSimple={})}(this,(function(e){"use strict";function t(e,t){return function(n){e(n)&&t(n)}}function n(...e){return t=>{for(const n of e)try{n(t)}catch(e){}}}let o;e.appender=function(e){return void 0!==e&&(o=e),o},e.combineAppenders=n,e.createLogger=function(e){let i=e=>{o&&o(e)};const f=Object.assign((function(t,n=1,o){i({action:3,message:t,loglevel:n,tag:e,context:o})}),{withFilter:e=>(i=t(e,i),f),withAppender:e=>(i=n(i,e),f)});return f},e.filterMessages=t,Object.defineProperty(e,"__esModule",{value:!0})}));
2
+ //# sourceMappingURL=simple.umd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simple.umd.js","sources":["../src/appender-utils.ts","../src/details/global-appender.ts","../src/simple.ts"],"sourcesContent":["import { Appender, LogMessage } from './types';\n\nexport function filterMessages<ErrorContext = Error>(predicate: (logMessage: LogMessage<ErrorContext>) => boolean, appender: Appender<ErrorContext> ): Appender<ErrorContext> {\n return function(logMessage: LogMessage<ErrorContext>) {\n if (predicate(logMessage)) {\n appender(logMessage);\n }\n };\n}\n\nexport function combineAppenders<ErrorContext = Error>(...appenders: Appender<ErrorContext>[]): Appender<ErrorContext> {\n return (message: LogMessage<ErrorContext>) => {\n for(const appender of appenders) {\n try {\n appender(message);\n } catch(e) { /* eat the error */ }\n }\n };\n}","import { Appender } from '../types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport let globalAppender: Appender<any>;\n\nexport function appender<ErrorContext = Error>(appender?: Appender<ErrorContext>) {\n if (appender !== undefined) {\n globalAppender = appender;\n }\n return globalAppender;\n}\n","import { combineAppenders, filterMessages } from './appender-utils';\nimport { globalAppender, appender } from './details/global-appender';\nimport { Action, Appender, LogLevel, LogMessage } from './types';\n\nexport function createLogger<ErrorContext = Error>(tag?: string) {\n let myAppender = (message: LogMessage<ErrorContext>) => { globalAppender && globalAppender(message); };\n\n const loggerInstance = Object.assign(\n function log(message: string, loglevel: LogLevel = LogLevel.info, context?: ErrorContext) {\n myAppender({\n action: Action.log,\n message,\n loglevel,\n tag,\n context\n } as LogMessage<ErrorContext>);\n }, {\n withFilter(predicate: (logMessage: LogMessage<ErrorContext>) => boolean) {\n myAppender = filterMessages(predicate, myAppender);\n return loggerInstance;\n },\n withAppender(appender: Appender<ErrorContext>) {\n myAppender = combineAppenders(myAppender, appender);\n return loggerInstance;\n }\n }\n );\n\n return loggerInstance;\n}\n\nexport { appender, combineAppenders, filterMessages };"],"names":["filterMessages","predicate","appender","logMessage","combineAppenders","appenders","message","e","globalAppender","undefined","tag","myAppender","loggerInstance","Object","assign","loglevel","context","action","withFilter","withAppender"],"mappings":"qQAEgBA,EAAqCC,EAA8DC,GAC/G,OAAO,SAASC,GACRF,EAAUE,IACVD,EAASC,aAKLC,KAA0CC,GACtD,OAAQC,IACJ,IAAI,MAAMJ,KAAYG,EAClB,IACIH,EAASI,GACX,MAAMC,MCZb,IAAIC,sBAEoCN,GAI3C,YAHiBO,IAAbP,IACAM,EAAiBN,GAEdM,gDCLwCE,GAC/C,IAAIC,EAAcL,IAAwCE,GAAkBA,EAAeF,IAE3F,MAAMM,EAAiBC,OAAOC,QAC1B,SAAaR,EAAiBS,IAAoCC,GAC9DL,EAAW,CACPM,SACAX,QAAAA,EACAS,SAAAA,EACAL,IAAAA,EACAM,QAAAA,MAEL,CACCE,WAAWjB,IACPU,EAAaX,EAAeC,EAAWU,GAChCC,GAEXO,aAAajB,IACTS,EAAaP,EAAiBO,EAAYT,GACnCU,KAKnB,OAAOA"}
@@ -0,0 +1,41 @@
1
+ export declare const enum LogLevel {
2
+ verbose = 0,
3
+ info = 1,
4
+ warn = 2,
5
+ error = 3
6
+ }
7
+ export declare const enum Action {
8
+ start = 0,
9
+ update = 1,
10
+ finish = 2,
11
+ log = 3
12
+ }
13
+ export declare type LogMessage<ErrorContext = Error> = {
14
+ inputId: number;
15
+ loglevel: LogLevel;
16
+ message: string;
17
+ action: Action.start | Action.update | Action.finish;
18
+ tag?: string;
19
+ parentId?: number;
20
+ ref: WeakRef<never>;
21
+ } | {
22
+ inputId?: number;
23
+ loglevel: LogLevel;
24
+ message: string;
25
+ action: Action.log;
26
+ tag?: string;
27
+ parentId?: number;
28
+ ref?: WeakRef<never>;
29
+ context?: ErrorContext;
30
+ };
31
+ export declare type Appender<ErrorContext = Error> = (message: LogMessage<ErrorContext>) => void;
32
+ export declare type Identity = {
33
+ id?: number;
34
+ };
35
+ export declare type Prefixes = {
36
+ [index in LogLevel]: string;
37
+ };
38
+ export declare type ColorFormatters = {
39
+ [index in LogLevel]: (((text: string) => string) | undefined);
40
+ };
41
+ export declare type Formatter = (message: string, loglevel: LogLevel, usePrefix?: string | boolean, identation?: number) => string;
@@ -0,0 +1,3 @@
1
+ {
2
+ "types": "../dist/format-utils.d.ts"
3
+ }
package/package.json ADDED
@@ -0,0 +1,86 @@
1
+ {
2
+ "version": "1.0.0-alpha.2",
3
+ "license": "MIT",
4
+ "name": "@niceties/logger",
5
+ "author": "Konstantin Shutkin",
6
+ "funding": "https://www.donationalerts.com/r/excitingcode",
7
+ "type": "module",
8
+ "exports": {
9
+ ".": {
10
+ "require": "./dist/index.js",
11
+ "default": "./dist/index.mjs"
12
+ },
13
+ "./default-formatting": {
14
+ "require": "./dist/default-formatting.js",
15
+ "default": "./dist/default-formatting.mjs"
16
+ },
17
+ "./core": {
18
+ "require": "./dist/core.js",
19
+ "default": "./dist/core.mjs"
20
+ },
21
+ "./simple": {
22
+ "require": "./dist/simple.js",
23
+ "default": "./dist/simple.mjs"
24
+ },
25
+ "./console-appender": {
26
+ "require": "./dist/console-appender.js",
27
+ "default": "./dist/console-appender.mjs"
28
+ },
29
+ "./format-utils": {
30
+ "require": "./dist/format-utils.js",
31
+ "default": "./dist/format-utils.mjs"
32
+ }
33
+ },
34
+ "main": "./dist/index.js",
35
+ "module": "./dist/index.mjs",
36
+ "typings": "./dist/index.d.ts",
37
+ "unpkg": "./dist/index.umd.js",
38
+ "files": [
39
+ "dist",
40
+ "default-formatting",
41
+ "core",
42
+ "console-appender",
43
+ "format-utils",
44
+ "types",
45
+ "simple"
46
+ ],
47
+ "engines": {
48
+ "node": ">=14.8"
49
+ },
50
+ "scripts": {
51
+ "build": "rimraf ./dist && rollup -c",
52
+ "dev": "rimraf ./dist && rollup -c -w",
53
+ "test": "jest --collectCoverage",
54
+ "lint": "eslint ./src",
55
+ "semantic-release": "npx semantic-release"
56
+ },
57
+ "devDependencies": {
58
+ "@rollup/plugin-commonjs": "21.0.1",
59
+ "@rollup/plugin-node-resolve": "13.0.6",
60
+ "@semantic-release/changelog": "6.0.1",
61
+ "@semantic-release/commit-analyzer": "9.0.1",
62
+ "@semantic-release/git": "10.0.1",
63
+ "@semantic-release/npm": "8.0.2",
64
+ "@semantic-release/release-notes-generator": "10.0.2",
65
+ "@types/jest": "27.0.2",
66
+ "@typescript-eslint/eslint-plugin": "5.3.0",
67
+ "@typescript-eslint/parser": "5.3.0",
68
+ "conventional-changelog-angular": "5.0.13",
69
+ "eslint": "8.1.0",
70
+ "jest": "27.3.1",
71
+ "lodash": "4.17.21",
72
+ "rimraf": "3.0.2",
73
+ "rollup": "2.60.1",
74
+ "rollup-plugin-preprocess": "0.0.4",
75
+ "rollup-plugin-terser": "7.0.2",
76
+ "rollup-plugin-typescript2": "0.31.1",
77
+ "semantic-release": "18.0.0",
78
+ "semantic-release-monorepo": "7.0.5",
79
+ "ts-jest": "27.0.7",
80
+ "tslib": "2.3.1",
81
+ "typescript": "4.4.x"
82
+ },
83
+ "dependencies": {
84
+ "kleur": "^4.1.4"
85
+ }
86
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "types": "../dist/simple.d.ts"
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "types": "../dist/types.d.ts"
3
+ }