@theotherwillembotha/node-red-plugincore 0.0.54 → 0.0.55

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 (68) hide show
  1. package/README.md +5 -8
  2. package/build/GenerateNodes.js +0 -1
  3. package/build/Nodes.html +0 -141
  4. package/build/Nodes.js +0 -2
  5. package/build/Plugins.js +2 -2
  6. package/build/core/NodeConstructor.js +15 -50
  7. package/build/core/NodeGenerator.js +8 -10
  8. package/build/core/logger/LoggerDecorator.d.ts.map +1 -1
  9. package/build/core/logger/LoggerDecorator.js +34 -38
  10. package/build/core/logger/node/ConsoleLoggerConfigNode.d.ts +11 -7
  11. package/build/core/logger/node/ConsoleLoggerConfigNode.d.ts.map +1 -1
  12. package/build/core/logger/node/ConsoleLoggerConfigNode.js +24 -10
  13. package/build/core/logger/node/RestLoggerConfigNode.d.ts +22 -6
  14. package/build/core/logger/node/RestLoggerConfigNode.d.ts.map +1 -1
  15. package/build/core/logger/node/RestLoggerConfigNode.js +93 -23
  16. package/build/core/logger/service/LoggerService.d.ts +59 -68
  17. package/build/core/logger/service/LoggerService.d.ts.map +1 -1
  18. package/build/core/logger/service/LoggerService.js +76 -165
  19. package/build/core/logger/template/LoggerTemplate.d.ts +9 -1
  20. package/build/core/logger/template/LoggerTemplate.d.ts.map +1 -1
  21. package/build/core/metrics/node/CounterMetricConfigNode.js +0 -2
  22. package/build/core/metrics/node/GaugeMetricConfigNode.js +0 -2
  23. package/build/core/metrics/node/MetricsConfigNode.js +0 -1
  24. package/build/core/metrics/node/TimerMetricConfigNode.js +0 -2
  25. package/build/core/metrics/service/MetricsService.js +10 -24
  26. package/build/core/other/service/SettingsService.js +0 -2
  27. package/build/core/tagging/service/NodeTypeService.js +1 -2
  28. package/build/core/webhook/WebhookDecorator.d.ts.map +1 -1
  29. package/build/core/webhook/WebhookDecorator.js +4 -4
  30. package/build/core/webhook/node/WebhookServerConfigNode.js +0 -1
  31. package/build/core/webhook/service/ReverseProxyTypeService.d.ts +0 -2
  32. package/build/core/webhook/service/ReverseProxyTypeService.d.ts.map +1 -1
  33. package/build/core/webhook/service/ReverseProxyTypeService.js +1 -6
  34. package/build/core/webhook/service/WebhookServerService.d.ts +1 -1
  35. package/build/core/webhook/service/WebhookServerService.d.ts.map +1 -1
  36. package/build/core/webhook/service/WebhookServerService.js +6 -9
  37. package/build/core/webhook/template/WebhookTemplate.d.ts +1 -1
  38. package/build/core/webhook/template/WebhookTemplate.d.ts.map +1 -1
  39. package/build/index.d.ts +1 -2
  40. package/build/index.d.ts.map +1 -1
  41. package/build/index.js +1 -2
  42. package/build/resources/editorLanguageExtension.js +1 -2
  43. package/package.json +5 -3
  44. package/resources/editorLanguageExtension.js +1 -2
  45. package/src/GenerateNodes.ts +2 -2
  46. package/src/core/NodeConstructor.ts +1 -1
  47. package/src/core/NodeGenerator.ts +2 -2
  48. package/src/core/logger/LoggerDecorator.ts +56 -53
  49. package/src/core/logger/node/ConsoleLoggerConfigNode.ts +39 -14
  50. package/src/core/logger/node/RestLoggerConfigNode.ts +128 -25
  51. package/src/core/logger/service/LoggerService.ts +103 -239
  52. package/src/core/logger/template/LoggerTemplate.ts +11 -1
  53. package/src/core/webhook/WebhookDecorator.ts +1 -3
  54. package/src/core/webhook/service/ReverseProxyTypeService.ts +0 -4
  55. package/src/core/webhook/service/WebhookServerService.ts +1 -1
  56. package/src/core/webhook/template/WebhookTemplate.ts +1 -1
  57. package/src/index.ts +2 -2
  58. package/build/core/logger/node/LokiLoggerConfigNode.d.ts +0 -20
  59. package/build/core/logger/node/LokiLoggerConfigNode.d.ts.map +0 -1
  60. package/build/core/logger/node/LokiLoggerConfigNode.html +0 -117
  61. package/build/core/logger/node/LokiLoggerConfigNode.js +0 -53
  62. package/build/core/logger/service/LoggerServiceTypes.d.ts +0 -24
  63. package/build/core/logger/service/LoggerServiceTypes.d.ts.map +0 -1
  64. package/build/core/logger/service/LoggerServiceTypes.js +0 -30
  65. package/documentation/LokiLoggerConfigNode.png +0 -0
  66. package/src/core/logger/node/LokiLoggerConfigNode.html +0 -117
  67. package/src/core/logger/node/LokiLoggerConfigNode.ts +0 -58
  68. package/src/core/logger/service/LoggerServiceTypes.ts +0 -26
package/README.md CHANGED
@@ -16,9 +16,11 @@ This framework is the foundation for a growing set of Node-RED plugins. The foll
16
16
  | Plugin | Description |
17
17
  |--------|-------------|
18
18
  | [@theotherwillembotha/node-red-telemetry](https://github.com/theotherwillembotha/nodered_telemetry) | Ready-to-use flow nodes for structured logging and Prometheus metrics — Logger, Counter, Gauge, and Timer nodes that attach to the config nodes provided by this package. |
19
+ | [@theotherwillembotha/node-red-loki](https://github.com/theotherwillembotha/nodered_loki) | Grafana Loki logger config node. Extends the logging infrastructure provided by this package with a Loki transport, enabling log delivery directly to a Loki instance from any node built with the `@Logger` decorator. |
19
20
  | [@theotherwillembotha/node-red-nginxproxymanager](https://github.com/theotherwillembotha/nodered_nginxproxymanager) | Node-RED nodes for managing Nginx Proxy Manager hosts directly from your flows. Includes a config node that registers as a reverse proxy provider, an Update Host node for creating and updating proxy entries, and a Get Hosts node for retrieving the current host list. |
20
21
  | [@theotherwillembotha/node-red-circuitbreaker](https://github.com/theotherwillembotha/nodered_circuitbreaker) | Circuit Breaker nodes for building resilient flows. Detects faults in external integrations using configurable fault and trip functions, routes messages based on breaker state, and supports event-driven recovery flows. |
21
22
  | [@theotherwillembotha/node-red-temporal](https://github.com/theotherwillembotha/nodered_temporal) | Date/time transformation nodes powered by the TC39 Temporal API. Parse, convert, adjust, and format date/time values across timezones using named presets or Moment.js-style custom format strings. |
23
+ | [@theotherwillembotha/node-red-zookeeper](https://github.com/theotherwillembotha/nodered_zookeeper) | Apache ZooKeeper integration nodes. Subscribe to ZooKeeper node change events, read node values on demand, and write data to ZooKeeper nodes from your flows. |
22
24
 
23
25
  Additional plugins will be listed here as they are published.
24
26
 
@@ -42,7 +44,7 @@ Config nodes are shared resources configured once and referenced across your flo
42
44
 
43
45
  #### Logging
44
46
 
45
- Three logger backends are supported. All expose the same interface and are interchangeable — any node built with the `@Logger` decorator can use any of them.
47
+ Two logger backends are built in. Additional backends are available as separate plugins (see the [plugin ecosystem](#plugin-ecosystem) table above). All expose the same interface and are interchangeable — any node built with the `@Logger` decorator can use any of them.
46
48
 
47
49
  **Console Logger** — writes structured log output to stdout via Winston. Ideal for development and containerised deployments that forward stdout to a log aggregator.
48
50
 
@@ -52,11 +54,7 @@ Three logger backends are supported. All expose the same interface and are inter
52
54
 
53
55
  ![REST Logger Config](documentation/RestLoggerConfigNode.png)
54
56
 
55
- **Loki Logger** pushes log entries to a Grafana Loki instance via the Loki HTTP API. Supports multi-tenant deployments via the Tenant ID field.
56
-
57
- ![Loki Logger Config](documentation/LokiLoggerConfigNode.png)
58
-
59
- All three loggers share a **Level** selector (debug, info, warn, error) and a **Template** field — a Handlebars template that controls the shape of each log entry. The default `message:{{msg}}` passes the raw message through; you can customise it to include only the fields you care about.
57
+ All loggers share a **Level** selector (debug, info, warn, error) and a **Template** field a Handlebars template that controls the shape of each log entry. The default `message:{{msg}}` passes the raw message through; you can customise it to include only the fields you care about.
60
58
 
61
59
  #### Metrics
62
60
 
@@ -383,7 +381,7 @@ Create a `GenerateNodes.ts` at the root of your `src/` directory. This is the co
383
381
  import { NodeGenerator } from "@theotherwillembotha/node-red-plugincore";
384
382
  import {
385
383
  LoggerService, LoggerTemplate,
386
- ConsoleLoggerConfigNode, RestLoggerConfigNode, LokiLoggerConfigNode
384
+ ConsoleLoggerConfigNode, RestLoggerConfigNode
387
385
  } from "@theotherwillembotha/node-red-plugincore";
388
386
  import { MyNode } from "./nodes/MyNode";
389
387
 
@@ -392,7 +390,6 @@ new NodeGenerator("./src/")
392
390
  .registerTemplate(LoggerTemplate)
393
391
  .registerNode(ConsoleLoggerConfigNode)
394
392
  .registerNode(RestLoggerConfigNode)
395
- .registerNode(LokiLoggerConfigNode)
396
393
  .registerNode(MyNode)
397
394
  .generate("./build/Nodes", "./build/Plugins");
398
395
 
@@ -29,7 +29,6 @@ new index_js_1.NodeGenerator("./src/core/")
29
29
  .registerNode(DelegatedConfigReferenceNode_js_1.DelegatedConfigReferenceNode)
30
30
  .registerNode(index_js_1.ConsoleLoggerConfigNode)
31
31
  .registerNode(index_js_1.RestLoggerConfigNode)
32
- .registerNode(index_js_1.LokiLoggerConfigNode)
33
32
  .registerNode(index_js_5.MetricsConfigNode)
34
33
  .registerNode(index_js_5.CounterMetricConfigNode)
35
34
  .registerNode(index_js_5.GaugeMetricConfigNode)
package/build/Nodes.html CHANGED
@@ -366,147 +366,6 @@ Mustache/Handlebars templates build the message string POSTed to the endpoint.
366
366
  - [Mustache — Wikipedia](https://en.wikipedia.org/wiki/Mustache_(template_system))
367
367
  - [Mustache — Playground](https://jgonggrijp.gitlab.io/wontache/playground.html)
368
368
  </script>
369
- <script type="text/javascript">
370
- RED.nodes.registerType('LokiLoggerConfigNode', {
371
- category: 'config',
372
- label: function() {
373
- return this.name
374
- },
375
- paletteLabel: 'Loki Logger Config Node',
376
- defaults: {
377
- name: {
378
- value: 'Logger Example',
379
- required: true
380
- },
381
- template: {
382
- value: 'message:{{msg}}',
383
- required: true
384
- },
385
- level: {
386
- value: 'info',
387
- required: true
388
- },
389
- loki_host: {},
390
- loki_tenantid: {},
391
- loki_userid: {},
392
- loki_authtoken: {},
393
- },
394
- oneditprepare: function() {
395
- // **** LokiLoggerConfigNode **** //
396
- {
397
- let node = this;
398
- let levelSelection = $("#node-config-input-level");
399
- levelSelection.typedInput({
400
- type: "level",
401
- types: [{
402
- value: "level",
403
- options: [{
404
- value: "DEBUG",
405
- label: "debug"
406
- }, {
407
- value: "INFO",
408
- label: "info"
409
- }, {
410
- value: "WARNING",
411
- label: "warning"
412
- }, {
413
- value: "ERROR",
414
- label: "error"
415
- }, ]
416
- }]
417
- });
418
- this.editor = RED.editor.createEditor({
419
- id: 'node-config-input-templateEditor',
420
- mode: 'ace/mode/handlebars',
421
- value: this.template
422
- });
423
- }
424
- },
425
- oneditsave: function() {
426
- // **** LokiLoggerConfigNode **** //
427
- {
428
- let node = this;
429
- this.template = this.editor.getValue();
430
- this.editor.destroy();
431
- delete this.editor;
432
- }
433
- },
434
- oneditcancel: function() {},
435
- oneditdelete: function() {},
436
- });
437
-
438
- </script>
439
-
440
-
441
- <script type="text/html" data-template-name='LokiLoggerConfigNode'>
442
- <div id='section_LokiLoggerConfigNode'>
443
- <div id="LoggerConfig">
444
- <div class="form-row">
445
- <label class="towb_editorlabel" for="node-config-input-name"><i class="fa fa-font"></i> Name</label>
446
- <input type="text" id="node-config-input-name" />
447
- </div>
448
-
449
- <div class="form-row">
450
- <label class="towb_editorlabel" for="node-config-input-level"><i class="fa fa-signal"></i> Level</label>
451
- <input type="text" id="node-config-input-level" />
452
- </div>
453
-
454
- <div class="form-row">
455
- <label class="towb_editorlabel" for="node-config-input-loki_host"><i class="fa fa-server"></i> Host</label>
456
- <input class="required" type="text" id="node-config-input-loki_host" />
457
- </div>
458
- <div class="form-row">
459
- <label class="towb_editorlabel" for="node-config-input-loki_tenantid"><i class="fa fa-building-o"></i> Tenant ID</label>
460
- <input class="" type="text" id="node-config-input-loki_tenantid" />
461
- </div>
462
- <div class="form-row">
463
- <label class="towb_editorlabel" for="node-config-input-loki_userid"><i class="fa fa-user"></i> Username</label>
464
- <input class="" type="text" id="node-config-input-loki_userid" />
465
- </div>
466
- <div class="form-row">
467
- <label class="towb_editorlabel" for="node-config-input-loki_authtoken"><i class="fa fa-key"></i> Auth Token</label>
468
- <input class="" type="password" id="node-config-input-loki_authtoken" />
469
- </div>
470
-
471
- <div class="form-row">
472
- <label class="towb_editorlabel" for="node-config-input-templateEditor"><i class="fa fa-code"></i> Template</label>
473
- <div style="height: 250px; min-height:150px;" class="node-text-editor" id="node-config-input-templateEditor"></div>
474
- </div>
475
- </div>
476
-
477
- </div>
478
- </script>
479
-
480
- <script type="text/markdown" data-help-name='LokiLoggerConfigNode'>
481
- Pushes log messages to a Grafana Loki instance using the Loki HTTP API.
482
-
483
- ### Properties
484
- : *name* (string) : A descriptive name for this logger configuration.
485
- : *level* (level) : The minimum log level. Messages below this threshold are suppressed. Options: DEBUG, INFO, WARNING, ERROR.
486
- : *host* (string) : The base URL of the Loki instance, including port (e.g. `http://localhost:3100`).
487
- : *tenant ID* (string) : The tenant identifier for multi-tenant Loki deployments (`X-Scope-OrgID` header). Leave blank for single-tenant deployments.
488
- : *username* (string) : Username for Loki authentication.
489
- : *auth token* (string) : Authentication token or password for Loki.
490
- : *template* (mustache) : A Mustache/Handlebars template that formats the log message body.
491
-
492
- ### Mustache Templating
493
- Mustache/Handlebars templates build the message string pushed to Loki.
494
-
495
- #### Provided Properties
496
- : *msg* (object) : The Node-RED message object passed through the node.
497
- : *currentTime* (string) : The current time in ISO 8601 format.
498
-
499
- #### Helpers
500
- : *json* (helper) : Serialises an object to a JSON string using `JSON.stringify`.
501
-
502
- #### Examples
503
- - `{{{json msg}}}` — serialises the full message object as JSON.
504
-
505
- #### References
506
- - [Grafana Loki — HTTP API](https://grafana.com/docs/loki/latest/reference/loki-http-api/)
507
- - [Mustache — Wikipedia](https://en.wikipedia.org/wiki/Mustache_(template_system))
508
- - [Mustache — Playground](https://jgonggrijp.gitlab.io/wontache/playground.html)
509
- </script>
510
369
  <!-- webhook -->
511
370
  <script type="text/javascript">
512
371
  // CSS
package/build/Nodes.js CHANGED
@@ -12,7 +12,6 @@ const NodeManager = require("@theotherwillembotha/node-red-plugincore").NodeMana
12
12
  const DelegatedConfigReferenceNode = require("@theotherwillembotha/node-red-plugincore").DelegatedConfigReferenceNode;
13
13
  const ConsoleLoggerConfigNode = require("@theotherwillembotha/node-red-plugincore").ConsoleLoggerConfigNode;
14
14
  const RestLoggerConfigNode = require("@theotherwillembotha/node-red-plugincore").RestLoggerConfigNode;
15
- const LokiLoggerConfigNode = require("@theotherwillembotha/node-red-plugincore").LokiLoggerConfigNode;
16
15
  const MetricsConfigNode = require("@theotherwillembotha/node-red-plugincore").MetricsConfigNode;
17
16
  const CounterMetricConfigNode = require("@theotherwillembotha/node-red-plugincore").CounterMetricConfigNode;
18
17
  const GaugeMetricConfigNode = require("@theotherwillembotha/node-red-plugincore").GaugeMetricConfigNode;
@@ -23,7 +22,6 @@ let manager = new NodeManager(RED);
23
22
  manager.registerNodeType("DelegatedConfigReferenceNode", DelegatedConfigReferenceNode);
24
23
  manager.registerNodeType("ConsoleLoggerConfigNode", ConsoleLoggerConfigNode);
25
24
  manager.registerNodeType("RestLoggerConfigNode", RestLoggerConfigNode);
26
- manager.registerNodeType("LokiLoggerConfigNode", LokiLoggerConfigNode);
27
25
  manager.registerNodeType("MetricsConfigNode", MetricsConfigNode);
28
26
  manager.registerNodeType("CounterMetricConfigNode", CounterMetricConfigNode);
29
27
  manager.registerNodeType("GaugeMetricConfigNode", GaugeMetricConfigNode);
package/build/Plugins.js CHANGED
@@ -46,7 +46,7 @@ module.exports = function (RED) {
46
46
  RED.events.on('runtime-event', async (event) => {
47
47
  // startup deployment.
48
48
  if ("runtime-deploy" === event?.id && startupDeployment) {
49
- console.log("STARTUP DEPLOYMENT");
49
+ //console.log("STARTUP DEPLOYMENT");
50
50
  startupDeployment = false;
51
51
  const flows = await runtime.flows.getFlows({});
52
52
  await plugin.instance.onDeploy(flows);
@@ -54,7 +54,7 @@ module.exports = function (RED) {
54
54
 
55
55
  // stopping flows on redeployment.
56
56
  if ("runtime-state" === event?.id && event?.payload?.state === "stop" && event?.payload?.deploy) {
57
- console.log("REDEPLOY!");
57
+ //console.log("REDEPLOY!");
58
58
  const flows = await runtime.flows.getFlows({});
59
59
  await plugin.instance.onDeploy(flows);
60
60
  }
@@ -12,11 +12,8 @@ const js_beautify_1 = __importDefault(require("js-beautify"));
12
12
  const markdown_it_1 = __importDefault(require("markdown-it"));
13
13
  const handlebars_1 = __importDefault(require("handlebars"));
14
14
  class BaseNode {
15
- _node;
16
15
  node() { return this._node; }
17
- _config;
18
16
  config() { return this._config; }
19
- _flow;
20
17
  flow() { return this._flow; }
21
18
  // THIS value is imported from NodeRed Node itself.
22
19
  id() { return this.config().id; }
@@ -51,15 +48,10 @@ class ConfigNode extends BaseNode {
51
48
  }
52
49
  exports.ConfigNode = ConfigNode;
53
50
  class NodeDescriptor {
54
- _group;
55
- _id;
56
- _name;
57
- _sourceFile;
58
- _dependencies = [];
59
- _templates = [];
60
- _package;
61
- _tags = [];
62
51
  constructor(group, id, name, sourceFile, pkg) {
52
+ this._dependencies = [];
53
+ this._templates = [];
54
+ this._tags = [];
63
55
  this._group = group;
64
56
  this._id = id;
65
57
  this._name = name;
@@ -94,10 +86,6 @@ class NodeDescriptor {
94
86
  }
95
87
  exports.NodeDescriptor = NodeDescriptor;
96
88
  class TemplateDescriptor {
97
- _name;
98
- _dependencies;
99
- _clazz;
100
- _templateFile;
101
89
  constructor(name, clazz, templateFile, dependencies) {
102
90
  this._name = name;
103
91
  this._clazz = clazz;
@@ -119,12 +107,6 @@ class TemplateDescriptor {
119
107
  }
120
108
  exports.TemplateDescriptor = TemplateDescriptor;
121
109
  class ServiceDescriptor {
122
- _id;
123
- _name;
124
- _type;
125
- _sourceFile;
126
- _clazz;
127
- _dependencies;
128
110
  constructor(id, name, type, sourceFile, clazz, dependencies) {
129
111
  this._id = id;
130
112
  this._name = name;
@@ -156,10 +138,6 @@ exports.Template = Template;
156
138
  const POST_CONSTRUCT_KEY = Symbol('postConstructInitializers');
157
139
  // Builder class for post-construct decorators
158
140
  class PostConstructDecoratorBuilder {
159
- decoratorName;
160
- initLogic;
161
- validator;
162
- defaultConfig;
163
141
  constructor(decoratorName) {
164
142
  this.decoratorName = decoratorName;
165
143
  }
@@ -291,11 +269,9 @@ let runPostConstructInitializers = function (instance) {
291
269
  };
292
270
  // ************************************************
293
271
  class NodeManager {
294
- static PLUGINID = "node-red-contrib-theotherwillembotha/services-plugin";
295
- static _RED;
296
- nodeTypeService;
297
- typeBacklog = [];
272
+ static { this.PLUGINID = "node-red-contrib-theotherwillembotha/services-plugin"; }
298
273
  constructor(RED) {
274
+ this.typeBacklog = [];
299
275
  NodeManager._RED = RED;
300
276
  let nodeTypeServiceListener = async (pluginID) => {
301
277
  if (pluginID === "@theotherwillembotha/nodetypeservice") {
@@ -342,7 +318,7 @@ class NodeManager {
342
318
  console.error(`Type "${typeName}" has no associated type. Make sure that it was exported and included in the index.js file!`);
343
319
  }
344
320
  let nodeConstructor = function (config) {
345
- console.log("constructing node", typeName);
321
+ //console.log("constructing node", typeName);
346
322
  try {
347
323
  // instantiate the node.
348
324
  NodeManager.RED.nodes.createNode(this, config);
@@ -388,7 +364,6 @@ class NodeManager {
388
364
  }
389
365
  exports.NodeManager = NodeManager;
390
366
  class BaseService {
391
- _name;
392
367
  constructor(name) {
393
368
  this._name = name;
394
369
  }
@@ -441,26 +416,16 @@ let beautifyOptions = {
441
416
  },
442
417
  };
443
418
  class NodeBuilder {
444
- // see https://nodered.org/docs/creating-nodes/node-html#node-definition
445
- _name;
446
- _category;
447
- _defaults = {};
448
- _credentials; // TODO
449
- _color;
450
- _label;
451
- _icon;
452
- _paletteLabel;
453
- _labelStyle;
454
- _inputs;
455
- _outputs = [];
456
- _onIncludeOnce = [];
457
- _onIncludeEditPrepare = [];
458
- _onIncludeEditSave = [];
459
- _onIncludeEditCancel = [];
460
- _onIncludeEditDelete = [];
461
- _onIncludeEditForm = [];
462
- _onIncludeDocumentation = [];
463
419
  constructor(name, category) {
420
+ this._defaults = {};
421
+ this._outputs = [];
422
+ this._onIncludeOnce = [];
423
+ this._onIncludeEditPrepare = [];
424
+ this._onIncludeEditSave = [];
425
+ this._onIncludeEditCancel = [];
426
+ this._onIncludeEditDelete = [];
427
+ this._onIncludeEditForm = [];
428
+ this._onIncludeDocumentation = [];
464
429
  this._name = name;
465
430
  this._category = category;
466
431
  }
@@ -38,18 +38,17 @@ const fs = __importStar(require("fs"));
38
38
  const NodeConstructor_1 = require("./NodeConstructor");
39
39
  const templatePropertyKeys = ["onIncludeOnce", "onIncludeDefaults", "onIncludeEditPrepare", "onIncludeEditPrepare", "onIncludeEditSave", "onIncludeEditForm"];
40
40
  class NodeGenerator {
41
- static headerWidth = 50;
42
- static warning = `
41
+ static { this.headerWidth = 50; }
42
+ static { this.warning = `
43
43
  This file was automatically generated using the NODERED Core utility.
44
44
  Any modifications to his file will be overwritten the next time the code is regenerated.
45
45
 
46
46
  You have been warned.
47
- `;
48
- _rootFolder;
49
- _nodes = {};
50
- _services = [];
51
- _templates = [];
47
+ `; }
52
48
  constructor(rootFolder) {
49
+ this._nodes = {};
50
+ this._services = [];
51
+ this._templates = [];
53
52
  this._rootFolder = rootFolder;
54
53
  }
55
54
  addDependency(dependency) {
@@ -208,7 +207,7 @@ module.exports = function (RED) {
208
207
  RED.events.on('runtime-event', async (event) => {
209
208
  // startup deployment.
210
209
  if ("runtime-deploy" === event?.id && startupDeployment) {
211
- console.log("STARTUP DEPLOYMENT");
210
+ //console.log("STARTUP DEPLOYMENT");
212
211
  startupDeployment = false;
213
212
  const flows = await runtime.flows.getFlows({});
214
213
  await plugin.instance.onDeploy(flows);
@@ -216,7 +215,7 @@ module.exports = function (RED) {
216
215
 
217
216
  // stopping flows on redeployment.
218
217
  if ("runtime-state" === event?.id && event?.payload?.state === "stop" && event?.payload?.deploy) {
219
- console.log("REDEPLOY!");
218
+ //console.log("REDEPLOY!");
220
219
  const flows = await runtime.flows.getFlows({});
221
220
  await plugin.instance.onDeploy(flows);
222
221
  }
@@ -265,7 +264,6 @@ class TypeUtility {
265
264
  }
266
265
  }
267
266
  class Hierarchy {
268
- types;
269
267
  constructor(types) {
270
268
  this.types = types;
271
269
  }
@@ -1 +1 @@
1
- {"version":3,"file":"LoggerDecorator.d.ts","sourceRoot":"","sources":["../../../src/core/logger/LoggerDecorator.ts"],"names":[],"mappings":"AAKA,wBAAgB,MAAM,CAAC,KAAK,CAAC,EAAC,MAAM,GAAE,QAAQ,CAmG7C"}
1
+ {"version":3,"file":"LoggerDecorator.d.ts","sourceRoot":"","sources":["../../../src/core/logger/LoggerDecorator.ts"],"names":[],"mappings":"AAIA,wBAAgB,MAAM,CAAC,KAAK,CAAC,EAAC,MAAM,GAAE,QAAQ,CAuG7C"}
@@ -2,41 +2,40 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Logger = Logger;
4
4
  const NodeConstructor_1 = require("../NodeConstructor");
5
+ const LoggerService_1 = require("./service/LoggerService");
5
6
  function Logger(debug) {
6
7
  return function (target, propertyKey) {
7
8
  // if the type is a string, then its probably defined in the local (core) module.
8
9
  if (typeof propertyKey === "string") {
9
10
  const valueSymbol = Symbol(`_${String(propertyKey)}_value`);
11
+ //console.log("BINDING:", "target", target, "propertyKey", propertyKey );
10
12
  Object.defineProperty(target, propertyKey, {
11
13
  get: function () {
14
+ //console.log("setting logger on node " + this.name() + " (localized)");
12
15
  if (!this[valueSymbol]) {
13
- let node = this;
14
- //console.log("setting logger on node " + node.name() + " (localized)");
15
- let config = node.config();
16
- let logger;
17
- if (config.logEnabled) {
18
- let registration = {
16
+ try {
17
+ let node = this;
18
+ let config = node.config();
19
+ if (!config.logEnabled) {
20
+ return this[valueSymbol] = LoggerService_1.DoNothingAppender.get();
21
+ }
22
+ // get the logger config node.
23
+ let loggerConfigNode = NodeConstructor_1.NodeManager.RED.nodes.getNode(config.logger).node();
24
+ let loggerTemplateConfig = {
19
25
  id: config.id,
20
26
  flow: node.flow(),
21
27
  type: node.type(),
22
28
  name: node.name(),
23
- enabled: config.logEnabled,
24
- override: config.logTemplateOverrideEnabled,
25
- template: config.logTemplateOverride
29
+ level: loggerConfigNode.config().level,
30
+ template: (config.logTemplateOverrideEnabled) ? config.logTemplateOverride : loggerConfigNode.config().template,
26
31
  };
27
32
  // get a reference to the loggerService.
28
- try {
29
- logger = NodeConstructor_1.NodeManager.RED.nodes.getNode(config.logger).node().registerLogger(registration);
30
- }
31
- catch (e) {
32
- console.log("failed getting logger ", config.logger, e);
33
- logger = { log() { } };
34
- }
33
+ return this[valueSymbol] = loggerConfigNode.registerTemplate(loggerTemplateConfig);
35
34
  }
36
- else {
37
- logger = { log() { } };
35
+ catch (e) {
36
+ console.log(`failed getting logger "${this?.config()?.logger}"`, e);
37
+ return this[valueSymbol] = LoggerService_1.DoNothingAppender.get();
38
38
  }
39
- this[valueSymbol] = logger;
40
39
  }
41
40
  return this[valueSymbol];
42
41
  },
@@ -47,39 +46,36 @@ function Logger(debug) {
47
46
  }
48
47
  else {
49
48
  let property = propertyKey;
50
- //property.addInitializer(() => {
51
49
  property.addInitializer(function () {
52
50
  let node = this;
53
51
  const valueSymbol = Symbol(`_${String(property.name)}_value`);
52
+ //console.log("ADDING INITIALIZER:", "node", node, "property.name", property.name );
54
53
  Object.defineProperty(node, property.name, {
55
54
  get: function () {
55
+ //console.log("setting logger on node " + node.name()+ " (externalized)");
56
56
  if (!this[valueSymbol]) {
57
- //console.log("setting logger on node " + node.name()+ " (externalized)");
58
- let config = node.config();
59
- let logger;
60
- if (config.logEnabled) {
61
- let registration = {
57
+ try {
58
+ let config = node.config();
59
+ if (!config.logEnabled) {
60
+ return this[valueSymbol] = LoggerService_1.DoNothingAppender.get();
61
+ }
62
+ // get the logger config node.
63
+ let loggerConfigNode = NodeConstructor_1.NodeManager.RED.nodes.getNode(config.logger).node();
64
+ let loggerTemplateConfig = {
62
65
  id: config.id,
63
66
  flow: node.flow(),
64
67
  type: node.type(),
65
68
  name: node.name(),
66
- enabled: config.logEnabled,
67
- override: config.logTemplateOverrideEnabled,
68
- template: config.logTemplateOverride
69
+ level: loggerConfigNode?.config().level ?? 'info',
70
+ template: (config.logTemplateOverrideEnabled) ? config.logTemplateOverride : (loggerConfigNode?.config().template ?? 'message:{{msg}}'),
69
71
  };
70
72
  // get a reference to the loggerService.
71
- try {
72
- logger = NodeConstructor_1.NodeManager.RED.nodes.getNode(config.logger).node().registerLogger(registration);
73
- }
74
- catch (e) {
75
- console.log("failed getting logger ", config.logger, e);
76
- logger = { log() { } };
77
- }
73
+ return this[valueSymbol] = loggerConfigNode.registerTemplate(loggerTemplateConfig);
78
74
  }
79
- else {
80
- logger = { log() { } };
75
+ catch (e) {
76
+ console.log("failed getting logger ", e);
77
+ return this[valueSymbol] = LoggerService_1.DoNothingAppender.get();
81
78
  }
82
- this[valueSymbol] = logger;
83
79
  }
84
80
  return this[valueSymbol];
85
81
  },
@@ -1,16 +1,20 @@
1
1
  import { Node } from "node-red";
2
- import { ConfigNode, ConfigNodeConfig } from "../../NodeConstructor";
3
- import { Log, LoggerRegistration } from "../service/LoggerService";
4
- import { Level } from "../service/LoggerServiceTypes";
5
- interface ConsoleLoggerConfigNodeConfig extends ConfigNodeConfig {
6
- id: string;
2
+ import { LoggerConfigNodeConfig, BaseLoggerConfig, AbstractLogger, LoggerConfigNode, Log, Level } from "../service/LoggerService";
3
+ import { LoggerTemplateConfig } from "../template/LoggerTemplate";
4
+ interface ConsoleLoggerConfigNodeConfig extends LoggerConfigNodeConfig {
7
5
  level: Level;
8
6
  template: string;
9
7
  }
10
- export declare class ConsoleLoggerConfigNode extends ConfigNode<ConsoleLoggerConfigNodeConfig> {
8
+ export declare class ConsoleLoggerConfigNode extends LoggerConfigNode<ConsoleLoggerConfigNodeConfig, ConsoleLogger> {
11
9
  private _logger;
12
10
  constructor(node: Node, config: ConsoleLoggerConfigNodeConfig);
13
- registerLogger(registration: LoggerRegistration): Log;
11
+ protected logger(): ConsoleLogger;
12
+ }
13
+ export interface ConsoleLoggerConfig extends BaseLoggerConfig {
14
+ }
15
+ declare class ConsoleLogger extends AbstractLogger<ConsoleLoggerConfig> {
16
+ constructor(config: ConsoleLoggerConfig);
17
+ protected createLogger(config: LoggerTemplateConfig): Log;
14
18
  }
15
19
  export {};
16
20
  //# sourceMappingURL=ConsoleLoggerConfigNode.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConsoleLoggerConfigNode.d.ts","sourceRoot":"","sources":["../../../../src/core/logger/node/ConsoleLoggerConfigNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,EAAa,GAAG,EAAE,kBAAkB,EAAiB,MAAM,0BAA0B,CAAA;AAE5F,OAAO,EAAE,KAAK,EAAgB,MAAM,+BAA+B,CAAC;AAGpE,UAAU,6BAA8B,SAAQ,gBAAgB;IAC5D,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAC,KAAK,CAAC;IACZ,QAAQ,EAAC,MAAM,CAAC;CACnB;AAED,qBASa,uBAAwB,SAAQ,UAAU,CAAC,6BAA6B,CAAC;IAElF,OAAO,CAAC,OAAO,CAAkB;gBAErB,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,6BAA6B;IAetD,cAAc,CAAC,YAAY,EAAC,kBAAkB,GAAE,GAAG;CAG7D"}
1
+ {"version":3,"file":"ConsoleLoggerConfigNode.d.ts","sourceRoot":"","sources":["../../../../src/core/logger/node/ConsoleLoggerConfigNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAiB,sBAAsB,EAAE,gBAAgB,EAAE,cAAc,EAAU,gBAAgB,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAA;AAGxJ,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAElE,UAAU,6BAA8B,SAAQ,sBAAsB;IAClE,KAAK,EAAC,KAAK,CAAC;IACZ,QAAQ,EAAC,MAAM,CAAC;CACnB;AAED,qBASa,uBAAwB,SAAQ,gBAAgB,CAAC,6BAA6B,EAAE,aAAa,CAAC;IAEvG,OAAO,CAAC,OAAO,CAAiB;gBAEpB,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,6BAA6B;IAgB7D,SAAS,CAAC,MAAM,IAAG,aAAa;CAGnC;AAED,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB;CAE5D;AAED,cAAM,aAAc,SAAQ,cAAc,CAAC,mBAAmB,CAAC;gBAE/C,MAAM,EAAC,mBAAmB;IAItC,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,oBAAoB,GAAG,GAAG;CAG5D"}
@@ -10,27 +10,25 @@ var __metadata = (this && this.__metadata) || function (k, v) {
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.ConsoleLoggerConfigNode = void 0;
13
- const NodeConstructor_1 = require("../../NodeConstructor");
14
13
  const LoggerService_1 = require("../service/LoggerService");
15
14
  const NodeGenerator_1 = require("../../NodeGenerator");
16
- const LoggerServiceTypes_1 = require("../service/LoggerServiceTypes");
17
15
  const NodeDescriptionDecorator_1 = require("../../tagging/NodeDescriptionDecorator");
18
- let ConsoleLoggerConfigNode = class ConsoleLoggerConfigNode extends NodeConstructor_1.ConfigNode {
19
- _logger;
16
+ let ConsoleLoggerConfigNode = class ConsoleLoggerConfigNode extends LoggerService_1.LoggerConfigNode {
20
17
  constructor(node, config) {
21
18
  super(node, config);
22
19
  let _this = this;
23
- // instantiate the logger.
20
+ // create logger config
24
21
  let loggerConfig = {
25
22
  id: this.id(),
26
- type: LoggerServiceTypes_1.PlatformType.console,
27
- template: config.template,
23
+ type: "CONSOLE",
28
24
  level: config.level,
25
+ template: config.template,
29
26
  };
30
- this._logger = LoggerService_1.LoggerService.get(loggerConfig);
27
+ // create logger instance:
28
+ this._logger = new ConsoleLogger(loggerConfig);
31
29
  }
32
- registerLogger(registration) {
33
- return this._logger.register(registration);
30
+ logger() {
31
+ return this._logger;
34
32
  }
35
33
  };
36
34
  exports.ConsoleLoggerConfigNode = ConsoleLoggerConfigNode;
@@ -46,3 +44,19 @@ exports.ConsoleLoggerConfigNode = ConsoleLoggerConfigNode = __decorate([
46
44
  }),
47
45
  __metadata("design:paramtypes", [Object, Object])
48
46
  ], ConsoleLoggerConfigNode);
47
+ class ConsoleLogger extends LoggerService_1.AbstractLogger {
48
+ constructor(config) {
49
+ super(config);
50
+ }
51
+ createLogger(config) {
52
+ return new ConsoleAppender(config);
53
+ }
54
+ }
55
+ class ConsoleAppender extends LoggerService_1.Log {
56
+ constructor(config) {
57
+ super(config);
58
+ }
59
+ writeToLog(level, message, tags) {
60
+ console.log(new Date().toISOString(), this.config().id, level, tags, message);
61
+ }
62
+ }