analogger 1.19.0 → 1.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,7 @@
1
- # [1.19.0](https://github.com/thimpat/analogger/compare/v1.18.3...v1.19.0) (2022-09-03)
1
+ # [1.20.0](https://github.com/thimpat/analogger/compare/v1.19.0...v1.20.0) (2022-09-05)
2
2
 
3
+ # [1.19.0](https://github.com/thimpat/analogger/compare/v1.18.3...v1.19.0) (2022-09-03)
4
+
3
5
  ## [1.18.3](https://github.com/thimpat/analogger/compare/v1.18.2...v1.18.3) (2022-08-31)
4
6
 
5
7
  ## [1.18.2](https://github.com/thimpat/analogger/compare/v1.18.1...v1.18.2) (2022-08-13)
package/README.md CHANGED
@@ -97,6 +97,9 @@ import {anaLogger} from "./node_modules/analogger/dist/analogger-browser.min.mjs
97
97
  #### FileSystem
98
98
  ![img.png](https://github.com/thimpat/analogger/blob/main/docs/images/img_5.png)
99
99
 
100
+ #### Remote logging
101
+ ![img.png](https://github.com/thimpat/analogger/blob/main/docs/images/img_6.png)
102
+
100
103
  <br/>
101
104
 
102
105
  ---
@@ -327,12 +330,13 @@ Display the browser native message box if run from it; otherwise, it displays th
327
330
  | logToRemote | undefined | string (url) | _Send log to a remote (more info in the next version)_ |
328
331
  | requiredLogLevel | "LOG" | "LOG" / "INFO" / "WARN" / "ERROR" | _Define the log level from which the system can show a log entry_ |
329
332
 
333
+ <br/>
330
334
 
331
335
  ```javascript
332
336
  // No hook alert message + Log messages in the div #analogger
333
337
  anaLogger.setOptions({hideHookMessage: true, logToDom: "#analogger"})
334
338
  ```
335
- <br/>
339
+
336
340
  <br/>
337
341
 
338
342
  #### Examples
@@ -353,6 +357,18 @@ anaLogger.setOptions({silent: false, logToFile: logFilePath});
353
357
 
354
358
  <br/>
355
359
 
360
+ ##### Write logs to a remote server
361
+
362
+ ```javascript
363
+ // Use a predefined remote server
364
+ anaLogger.setOptions({logToRemote: true});
365
+
366
+ // Use your remote server (You are resposible for the back-end implementation)
367
+ anaLogger.setOptions({logToRemote: "http://your.server.com/data"});
368
+ ```
369
+
370
+ <br/>
371
+
356
372
  ---
357
373
 
358
374
  ### overrideConsole()
@@ -641,5 +657,63 @@ anaLoggerInstance2.setOptions({logToFile: "./logme.log"});
641
657
  ```
642
658
 
643
659
  <br/>
660
+
661
+
662
+ ## Take a screenshot
663
+
664
+ ### takeScreenshot()
665
+
666
+ You can take screenshot via the "html-to-image" plugin (integrated in the module).
667
+ html-to-image is an external module that this module uses to take screenshots.
668
+
669
+
670
+ ```javascript
671
+ // Load an AnaLogger instance
672
+ import {anaLogger} from "./node_modules/analogger/browser/src/ana-logger.mjs";
673
+
674
+ // Register the plugin
675
+ import "./node_modules/analogger/browser/src/html-to-image-plugin.mjs";
676
+
677
+ // Ask AnaLogger to upload the image to the predefined server (not available yet - should be ready by 08/08/2022)
678
+ anaLogger.setOptions({logToRemote: true});
679
+
680
+ // Take a screenshot then upload to the server
681
+ anaLogger.takeScreenshot({callback: (data) =>
682
+ {
683
+ // Add the image to the DOM
684
+ const img = new Image();
685
+ img.src = data;
686
+ document.body.appendChild(img);
687
+ }});
688
+
689
+
690
+ ```
691
+
644
692
  <br/>
645
693
 
694
+ ---
695
+
696
+ ## Plugins
697
+
698
+ ### Implement a plugin
699
+
700
+ ```javascript
701
+ // Load anaLogger
702
+ import {anaLogger} from "./ana-logger.mjs";
703
+
704
+ // Implement
705
+ const doSomething = ({node = document.body, container = document.body} = {}) =>
706
+ {
707
+ console.log(`Hello plugin`)
708
+ };
709
+
710
+ // Register the plugin
711
+ anaLogger.addPlugin("doSomething", doSomething);
712
+
713
+
714
+
715
+ ```
716
+
717
+ ---
718
+
719
+
@@ -0,0 +1,94 @@
1
+ /*! (c) 2020 Andrea Giammarchi */
2
+
3
+ const {parse: $parse, stringify: $stringify} = JSON;
4
+ const {keys} = Object;
5
+
6
+ const Primitive = String; // it could be Number
7
+ const primitive = 'string'; // it could be 'number'
8
+
9
+ const ignore = {};
10
+ const object = 'object';
11
+
12
+ const noop = (_, value) => value;
13
+
14
+ const primitives = value => (
15
+ value instanceof Primitive ? Primitive(value) : value
16
+ );
17
+
18
+ const Primitives = (_, value) => (
19
+ typeof value === primitive ? new Primitive(value) : value
20
+ );
21
+
22
+ const revive = (input, parsed, output, $) => {
23
+ const lazy = [];
24
+ for (let ke = keys(output), {length} = ke, y = 0; y < length; y++) {
25
+ const k = ke[y];
26
+ const value = output[k];
27
+ if (value instanceof Primitive) {
28
+ const tmp = input[value];
29
+ if (typeof tmp === object && !parsed.has(tmp)) {
30
+ parsed.add(tmp);
31
+ output[k] = ignore;
32
+ lazy.push({k, a: [input, parsed, tmp, $]});
33
+ }
34
+ else
35
+ output[k] = $.call(output, k, tmp);
36
+ }
37
+ else if (output[k] !== ignore)
38
+ output[k] = $.call(output, k, value);
39
+ }
40
+ for (let {length} = lazy, i = 0; i < length; i++) {
41
+ const {k, a} = lazy[i];
42
+ output[k] = $.call(output, k, revive.apply(null, a));
43
+ }
44
+ return output;
45
+ };
46
+
47
+ const set = (known, input, value) => {
48
+ const index = Primitive(input.push(value) - 1);
49
+ known.set(value, index);
50
+ return index;
51
+ };
52
+
53
+ export const parse = (text, reviver) => {
54
+ const input = $parse(text, Primitives).map(primitives);
55
+ const value = input[0];
56
+ const $ = reviver || noop;
57
+ const tmp = typeof value === object && value ?
58
+ revive(input, new Set, value, $) :
59
+ value;
60
+ return $.call({'': tmp}, '', tmp);
61
+ };
62
+
63
+ export const stringify = (value, replacer, space) => {
64
+ const $ = replacer && typeof replacer === object ?
65
+ (k, v) => (k === '' || -1 < replacer.indexOf(k) ? v : void 0) :
66
+ (replacer || noop);
67
+ const known = new Map;
68
+ const input = [];
69
+ const output = [];
70
+ let i = +set(known, input, $.call({'': value}, '', value));
71
+ let firstRun = !i;
72
+ while (i < input.length) {
73
+ firstRun = true;
74
+ output[i] = $stringify(input[i++], replace, space);
75
+ }
76
+ return '[' + output.join(',') + ']';
77
+ function replace(key, value) {
78
+ if (firstRun) {
79
+ firstRun = !firstRun;
80
+ return value;
81
+ }
82
+ const after = $.call(this, key, value);
83
+ switch (typeof after) {
84
+ case object:
85
+ if (after === null) return after;
86
+ case primitive:
87
+ return known.get(after) || set(known, input, after);
88
+ }
89
+ return after;
90
+ }
91
+ };
92
+
93
+ export const toJSON = any => $parse(stringify(any));
94
+ export const fromJSON = any => parse($stringify(any));