@flowfuse/node-red-dashboard 0.7.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/LICENSE +201 -0
- package/README.md +53 -0
- package/dist/css/app.d047b42b.css +1 -0
- package/dist/css/chunk-vendors.2378ce49.css +24 -0
- package/dist/fonts/materialdesignicons-webfont.3de8526e.woff +0 -0
- package/dist/fonts/materialdesignicons-webfont.477c6ab0.woff2 +0 -0
- package/dist/fonts/materialdesignicons-webfont.48a1ce0c.eot +0 -0
- package/dist/fonts/materialdesignicons-webfont.dfd403cf.ttf +0 -0
- package/dist/index.html +1 -0
- package/dist/js/app.854a8cd5.js +2 -0
- package/dist/js/app.854a8cd5.js.map +1 -0
- package/dist/js/chunk-vendors.174e8921.js +43 -0
- package/dist/js/chunk-vendors.174e8921.js.map +1 -0
- package/nodes/config/locales/en-US/ui_base.json +19 -0
- package/nodes/config/locales/en-US/ui_group.html +4 -0
- package/nodes/config/locales/en-US/ui_group.json +16 -0
- package/nodes/config/ui_base.html +807 -0
- package/nodes/config/ui_base.js +678 -0
- package/nodes/config/ui_group.html +55 -0
- package/nodes/config/ui_group.js +34 -0
- package/nodes/config/ui_page.html +84 -0
- package/nodes/config/ui_page.js +33 -0
- package/nodes/config/ui_theme.html +101 -0
- package/nodes/config/ui_theme.js +15 -0
- package/nodes/store/index.js +34 -0
- package/nodes/utils/index.js +35 -0
- package/nodes/widgets/locales/en-US/ui_button.html +7 -0
- package/nodes/widgets/locales/en-US/ui_button.json +24 -0
- package/nodes/widgets/locales/en-US/ui_chart.html +41 -0
- package/nodes/widgets/locales/en-US/ui_chart.json +17 -0
- package/nodes/widgets/locales/en-US/ui_dropdown.html +24 -0
- package/nodes/widgets/locales/en-US/ui_form.html +16 -0
- package/nodes/widgets/locales/en-US/ui_form.json +36 -0
- package/nodes/widgets/locales/en-US/ui_markdown.html +10 -0
- package/nodes/widgets/locales/en-US/ui_slider.html +9 -0
- package/nodes/widgets/locales/en-US/ui_switch.html +32 -0
- package/nodes/widgets/locales/en-US/ui_template.html +59 -0
- package/nodes/widgets/locales/en-US/ui_template.json +18 -0
- package/nodes/widgets/locales/en-US/ui_text.html +16 -0
- package/nodes/widgets/locales/en-US/ui_text_input.html +19 -0
- package/nodes/widgets/ui_button.html +146 -0
- package/nodes/widgets/ui_button.js +65 -0
- package/nodes/widgets/ui_chart.html +314 -0
- package/nodes/widgets/ui_chart.js +195 -0
- package/nodes/widgets/ui_dropdown.html +199 -0
- package/nodes/widgets/ui_dropdown.js +19 -0
- package/nodes/widgets/ui_form.html +368 -0
- package/nodes/widgets/ui_form.js +18 -0
- package/nodes/widgets/ui_markdown.html +134 -0
- package/nodes/widgets/ui_markdown.js +14 -0
- package/nodes/widgets/ui_notification.html +139 -0
- package/nodes/widgets/ui_notification.js +14 -0
- package/nodes/widgets/ui_radio_group.html +186 -0
- package/nodes/widgets/ui_radio_group.js +20 -0
- package/nodes/widgets/ui_slider.html +162 -0
- package/nodes/widgets/ui_slider.js +31 -0
- package/nodes/widgets/ui_switch.html +194 -0
- package/nodes/widgets/ui_switch.js +98 -0
- package/nodes/widgets/ui_table.html +149 -0
- package/nodes/widgets/ui_table.js +16 -0
- package/nodes/widgets/ui_template.html +283 -0
- package/nodes/widgets/ui_template.js +19 -0
- package/nodes/widgets/ui_text.html +358 -0
- package/nodes/widgets/ui_text.js +98 -0
- package/nodes/widgets/ui_text_input.html +141 -0
- package/nodes/widgets/ui_text_input.js +37 -0
- package/package.json +114 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
module.exports = function (RED) {
|
|
2
|
+
function TextNode (config) {
|
|
3
|
+
const node = this
|
|
4
|
+
|
|
5
|
+
RED.nodes.createNode(this, config)
|
|
6
|
+
|
|
7
|
+
let style = ''
|
|
8
|
+
if (config.style) {
|
|
9
|
+
if (config.color) {
|
|
10
|
+
style += `color: ${config.color};`
|
|
11
|
+
}
|
|
12
|
+
if (config.fontSize) {
|
|
13
|
+
style += `font-size: ${config.fontSize}px;`
|
|
14
|
+
style += `line-height: ${config.fontSize}px;`
|
|
15
|
+
}
|
|
16
|
+
if (config.font) {
|
|
17
|
+
style += `font-family: ${config.font};`
|
|
18
|
+
}
|
|
19
|
+
config.style = style
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// which group are we rendering this widget
|
|
23
|
+
const group = RED.nodes.getNode(config.group)
|
|
24
|
+
// inform the dashboard UI that we are adding this node
|
|
25
|
+
group.register(node, config)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
RED.nodes.registerType('ui-text', TextNode)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// module.exports = function(RED) {
|
|
32
|
+
// var ui = require('../ui')(RED);
|
|
33
|
+
|
|
34
|
+
// function TextNode(config) {
|
|
35
|
+
// RED.nodes.createNode(this, config);
|
|
36
|
+
// var node = this;
|
|
37
|
+
|
|
38
|
+
// var group = RED.nodes.getNode(config.group);
|
|
39
|
+
// if (!group) { return; }
|
|
40
|
+
// var tab = RED.nodes.getNode(group.config.tab);
|
|
41
|
+
// if (!tab) { return; }
|
|
42
|
+
|
|
43
|
+
// var layout = config.layout||"row-spread";
|
|
44
|
+
// var angLayout = "row";
|
|
45
|
+
// var angLayoutAlign = "space-between center";
|
|
46
|
+
// if (layout === "row-spread") { angLayout = 'row'; angLayoutAlign = 'space-between center'}
|
|
47
|
+
// else if (layout === "row-left") { angLayout = 'row'; angLayoutAlign = 'start center'}
|
|
48
|
+
// else if (layout === "row-center") { angLayout = 'row'; angLayoutAlign = 'center center'}
|
|
49
|
+
// else if (layout === "row-right") { angLayout = 'row'; angLayoutAlign = 'end center'}
|
|
50
|
+
// else if (layout === "col-center") { angLayout = 'column'; angLayoutAlign = 'center center'}
|
|
51
|
+
// let style = "";
|
|
52
|
+
// if (config.style) {
|
|
53
|
+
// if (config.color) {
|
|
54
|
+
// style += `color: ${config.color};`
|
|
55
|
+
// }
|
|
56
|
+
// if (config.fontSize) {
|
|
57
|
+
// style += `font-size: ${config.fontSize}px;`
|
|
58
|
+
// }
|
|
59
|
+
// if (config.font) {
|
|
60
|
+
// style += `font-family: ${config.font};`
|
|
61
|
+
// }
|
|
62
|
+
// }
|
|
63
|
+
// var done = ui.add({
|
|
64
|
+
// emitOnlyNewValues: false,
|
|
65
|
+
// node: node,
|
|
66
|
+
// tab: tab,
|
|
67
|
+
// group: group,
|
|
68
|
+
// control: {
|
|
69
|
+
// type: 'text',
|
|
70
|
+
// label: config.label,
|
|
71
|
+
// order: config.order,
|
|
72
|
+
// format: config.format,
|
|
73
|
+
// width: config.width || group.config.width || 6,
|
|
74
|
+
// height: config.height || 1,
|
|
75
|
+
// layout: angLayout,
|
|
76
|
+
// layoutAlign: angLayoutAlign,
|
|
77
|
+
// className: config.className || '',
|
|
78
|
+
// style: style,
|
|
79
|
+
// },
|
|
80
|
+
// convert: function(value,oldValue,msg) {
|
|
81
|
+
// if (value !== undefined && value !== null) {
|
|
82
|
+
// if (Buffer.isBuffer(value)) {
|
|
83
|
+
// value = value.toString('binary');
|
|
84
|
+
// }
|
|
85
|
+
// else {
|
|
86
|
+
// value = value.toString();
|
|
87
|
+
// }
|
|
88
|
+
// }
|
|
89
|
+
// else {
|
|
90
|
+
// msg.payload = oldValue;
|
|
91
|
+
// }
|
|
92
|
+
// return value;
|
|
93
|
+
// }
|
|
94
|
+
// });
|
|
95
|
+
// node.on("close", done);
|
|
96
|
+
// }
|
|
97
|
+
// RED.nodes.registerType("ui_text", TextNode);
|
|
98
|
+
// };
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
<script type="text/javascript">
|
|
2
|
+
(function () {
|
|
3
|
+
function hasProperty (obj, prop) {
|
|
4
|
+
return Object.prototype.hasOwnProperty.call(obj, prop)
|
|
5
|
+
}
|
|
6
|
+
RED.nodes.registerType('ui-text-input', {
|
|
7
|
+
category: RED._('@flowforge/node-red-dashboard/ui-base:ui-base.label.category'),
|
|
8
|
+
color: RED._('@flowforge/node-red-dashboard/ui-base:ui-base.colors.light'),
|
|
9
|
+
defaults: {
|
|
10
|
+
group: { type: 'ui-group', required: true },
|
|
11
|
+
name: { value: '' },
|
|
12
|
+
label: { value: 'text' },
|
|
13
|
+
order: { value: 0 },
|
|
14
|
+
width: {
|
|
15
|
+
value: 0,
|
|
16
|
+
validate: function (v) {
|
|
17
|
+
const width = v || 0
|
|
18
|
+
const currentGroup = $('#node-input-group').val() || this.group
|
|
19
|
+
const groupNode = RED.nodes.node(currentGroup)
|
|
20
|
+
const valid = !groupNode || +width <= +groupNode.width
|
|
21
|
+
$('#node-input-size').toggleClass('input-error', !valid)
|
|
22
|
+
return valid
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
height: { value: 0 },
|
|
26
|
+
topic: { value: 'topic', validate: (hasProperty(RED.validators, 'typedInput') ? RED.validators.typedInput('topicType') : function (v) { return true }) },
|
|
27
|
+
topicType: { value: 'msg' },
|
|
28
|
+
mode: { value: 'text', required: true },
|
|
29
|
+
passthru: { value: true },
|
|
30
|
+
className: { value: '' }
|
|
31
|
+
},
|
|
32
|
+
inputs: 1,
|
|
33
|
+
outputs: 1,
|
|
34
|
+
outputLabels: function () { return this.mode },
|
|
35
|
+
icon: 'font-awesome/fa-i-cursor',
|
|
36
|
+
paletteLabel: 'text input',
|
|
37
|
+
oneditprepare: function () {
|
|
38
|
+
$('#node-input-size').elementSizer({
|
|
39
|
+
width: '#node-input-width',
|
|
40
|
+
height: '#node-input-height',
|
|
41
|
+
group: '#node-input-group'
|
|
42
|
+
})
|
|
43
|
+
// topic
|
|
44
|
+
$('#node-input-topic').typedInput({
|
|
45
|
+
default: 'str',
|
|
46
|
+
typeField: $('#node-input-topicType'),
|
|
47
|
+
types: ['str', 'msg', 'flow', 'global']
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
// use jQuery UI tooltip to convert the plain old title attribute to a nice tooltip
|
|
51
|
+
$('.ui-node-popover-title').tooltip({
|
|
52
|
+
show: {
|
|
53
|
+
effect: 'slideDown',
|
|
54
|
+
delay: 150
|
|
55
|
+
}
|
|
56
|
+
})
|
|
57
|
+
},
|
|
58
|
+
label: function () {
|
|
59
|
+
return this.name || (~this.label.indexOf('{' + '{') ? null : this.label) || this.mode + ' input'
|
|
60
|
+
},
|
|
61
|
+
labelStyle: function () { return this.name ? 'node_label_italic' : '' }
|
|
62
|
+
})
|
|
63
|
+
})()
|
|
64
|
+
</script>
|
|
65
|
+
|
|
66
|
+
<script type="text/html" data-template-name="ui-text-input">
|
|
67
|
+
<div class="form-row">
|
|
68
|
+
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
|
|
69
|
+
<input type="text" id="node-input-name">
|
|
70
|
+
</div>
|
|
71
|
+
<div class="form-row">
|
|
72
|
+
<label for="node-input-group"><i class="fa fa-table"></i> Group</label>
|
|
73
|
+
<input type="text" id="node-input-group">
|
|
74
|
+
</div>
|
|
75
|
+
<div class="form-row">
|
|
76
|
+
<label><i class="fa fa-object-group"></i> Size</label>
|
|
77
|
+
<input type="hidden" id="node-input-width">
|
|
78
|
+
<input type="hidden" id="node-input-height">
|
|
79
|
+
<button class="editor-button" id="node-input-size"></button>
|
|
80
|
+
</div>
|
|
81
|
+
<div class="form-row">
|
|
82
|
+
<label for="node-input-label"><i class="fa fa-i-cursor"></i> Label</label>
|
|
83
|
+
<input type="text" id="node-input-label">
|
|
84
|
+
</div>
|
|
85
|
+
<div class="form-row">
|
|
86
|
+
<label for="node-input-className"><i class="fa fa-code"></i> Class</label>
|
|
87
|
+
<div style="display: inline;">
|
|
88
|
+
<input style="width: 70%;" type="text" id="node-input-className" placeholder="Optional CSS class name(s)" style="flex-grow: 1;">
|
|
89
|
+
<a
|
|
90
|
+
data-html="true"
|
|
91
|
+
title="Dynamic Property: Class names can also be set by sending a message to the node with a msg.topic of 'ui-property:class' and a payload containing the class name(s) to be applied. NOTE: classes set at runtime will be applied in addition to any class(es) set in the nodes class field."
|
|
92
|
+
class="red-ui-button ui-node-popover-title"
|
|
93
|
+
style="margin-left: 4px; cursor: help; font-size: 0.625rem; border-radius: 50%; width: 24px; height: 24px; display: inline-flex; justify-content: center; align-items: center;">
|
|
94
|
+
<i style="font-family: ui-serif;">fx</i>
|
|
95
|
+
</a>
|
|
96
|
+
</div>
|
|
97
|
+
</div>
|
|
98
|
+
<div class="form-row">
|
|
99
|
+
<label for="node-input-mode"><i class="fa fa-keyboard-o"></i> Mode</label>
|
|
100
|
+
<select id="node-input-mode">
|
|
101
|
+
<option value="text">text input (single line)</option>
|
|
102
|
+
<option value="textarea">text area (multi-line)</option>
|
|
103
|
+
<option value="email">email address</option>
|
|
104
|
+
<option value="password">password</option>
|
|
105
|
+
<option value="number">number</option>
|
|
106
|
+
<option value="color">color picker</option>
|
|
107
|
+
<option value="time">time picker</option>
|
|
108
|
+
<option value="week">week picker</option>
|
|
109
|
+
<option value="month">month picker</option>
|
|
110
|
+
<option value="datetime-local">datetime picker</option>
|
|
111
|
+
</select>
|
|
112
|
+
<!--<label for="node-input-delay" style="text-align:right; width:100px"><i class="fa fa-clock-o"></i> Delay (ms)</label>
|
|
113
|
+
<input type="text" style="width:58px" id="node-input-delay">-->
|
|
114
|
+
</div>
|
|
115
|
+
<div class="form-row">
|
|
116
|
+
<label for="node-input-topic" style="padding-left:25px; margin-right:-25px">Topic</label>
|
|
117
|
+
<input type="text" id="node-input-topic">
|
|
118
|
+
<input type="hidden" id="node-input-topicType">
|
|
119
|
+
</div>
|
|
120
|
+
<div class="form-row">
|
|
121
|
+
<label style="width:auto" for="node-input-passthru"><i class="fa fa-arrow-right"></i> If <code>msg</code> arrives on input, pass through to output: </label>
|
|
122
|
+
<input type="checkbox" checked id="node-input-passthru" style="display:inline-block; width:auto; margin-top: 0; margin-left: 3px;">
|
|
123
|
+
</div>
|
|
124
|
+
<!--<div class="form-row">
|
|
125
|
+
<label style="width:auto" for="node-input-sendOnBlur">Send value on focus leave: </label>
|
|
126
|
+
<input type="checkbox" checked id="node-input-sendOnBlur" style="display:inline-block; width:auto; vertical-align:top;">
|
|
127
|
+
</div>
|
|
128
|
+
<div class="form-row">
|
|
129
|
+
<label style="width:auto" for="node-input-payload"><i class="fa fa-envelope-o"></i> When changed, send:</label>
|
|
130
|
+
</div>
|
|
131
|
+
<div class="form-row">
|
|
132
|
+
<label style="padding-left: 25px; margin-right: -25px">Payload</label>
|
|
133
|
+
<label style="width:auto">Current value</label>
|
|
134
|
+
</div>
|
|
135
|
+
<div class="form-row">
|
|
136
|
+
<label for="node-input-topic" style="padding-left: 25px; margin-right: -25px">Topic</label>
|
|
137
|
+
<input type="text" id="node-input-topic">
|
|
138
|
+
<input type="hidden" id="node-input-topicType">
|
|
139
|
+
</div>-->
|
|
140
|
+
<div class="form-tips">Setting <b>Delay</b> to 0 waits for Enter or Tab key, to send input.</span></div>
|
|
141
|
+
</script>
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
const datastore = require('../store/index.js')
|
|
2
|
+
|
|
3
|
+
module.exports = function (RED) {
|
|
4
|
+
function TextInputNode (config) {
|
|
5
|
+
const node = this
|
|
6
|
+
|
|
7
|
+
// create node in Node-RED
|
|
8
|
+
RED.nodes.createNode(this, config)
|
|
9
|
+
|
|
10
|
+
// this ndoe need to store content/value from UI
|
|
11
|
+
node.value = null
|
|
12
|
+
|
|
13
|
+
// which group are we rendering this widget
|
|
14
|
+
const group = RED.nodes.getNode(config.group)
|
|
15
|
+
|
|
16
|
+
const evts = {
|
|
17
|
+
onChange: true,
|
|
18
|
+
onInput: function (msg, send) {
|
|
19
|
+
// store the latest msg passed to node
|
|
20
|
+
datastore.save(node.id, msg)
|
|
21
|
+
// only send msg on if we have passthru enabled
|
|
22
|
+
if (config.passthru) {
|
|
23
|
+
send(msg)
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// inform the dashboard UI that we are adding this node
|
|
29
|
+
group.register(node, config, evts)
|
|
30
|
+
|
|
31
|
+
node.on('close', async function (done) {
|
|
32
|
+
done()
|
|
33
|
+
})
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
RED.nodes.registerType('ui-text-input', TextInputNode)
|
|
37
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@flowfuse/node-red-dashboard",
|
|
3
|
+
"homepage": "https://dashboard.flowfuse.com",
|
|
4
|
+
"version": "0.7.0",
|
|
5
|
+
"description": "A collection of Node-RED nodes that provide functionality to build your own UI applications (inc. forms, buttons, charts) within Node-RED.",
|
|
6
|
+
"author": {
|
|
7
|
+
"name": "Joe Pavitt",
|
|
8
|
+
"url": "https://github.com/joepavitt"
|
|
9
|
+
},
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "https://github.com/FlowFuse/node-red-dashboard.git"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist/*",
|
|
16
|
+
"nodes/*"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"serve": "vue-cli-service serve",
|
|
20
|
+
"build": "vue-cli-service build",
|
|
21
|
+
"build:dev": "vue-cli-service build --mode development",
|
|
22
|
+
"docs:dev": "vitepress dev docs",
|
|
23
|
+
"docs:build": "vitepress build docs",
|
|
24
|
+
"lint": "eslint -c .eslintrc.json \"nodes/**/*.js\" \"nodes/**/*.html\" \"ui/src/**/*.js\" \"ui/src/**/*.vue\" \"test/**/*.js\"",
|
|
25
|
+
"test": "mocha \"test/**/*.spec.js\"",
|
|
26
|
+
"test:debug": "mocha --inspect=9226 \"test/**/*.spec.js\""
|
|
27
|
+
},
|
|
28
|
+
"license": "Apache-2.0",
|
|
29
|
+
"keywords": [
|
|
30
|
+
"node-red"
|
|
31
|
+
],
|
|
32
|
+
"node-red": {
|
|
33
|
+
"version": ">=3.0.0",
|
|
34
|
+
"nodes": {
|
|
35
|
+
"ui-base": "nodes/config/ui_base.js",
|
|
36
|
+
"ui-page": "nodes/config/ui_page.js",
|
|
37
|
+
"ui-group": "nodes/config/ui_group.js",
|
|
38
|
+
"ui-theme": "nodes/config/ui_theme.js",
|
|
39
|
+
"ui-form": "nodes/widgets/ui_form.js",
|
|
40
|
+
"ui-text-input": "nodes/widgets/ui_text_input.js",
|
|
41
|
+
"ui-button": "nodes/widgets/ui_button.js",
|
|
42
|
+
"ui-dropdown": "nodes/widgets/ui_dropdown.js",
|
|
43
|
+
"ui-radio-group": "nodes/widgets/ui_radio_group.js",
|
|
44
|
+
"ui-slider": "nodes/widgets/ui_slider.js",
|
|
45
|
+
"ui-switch": "nodes/widgets/ui_switch.js",
|
|
46
|
+
"ui-text": "nodes/widgets/ui_text.js",
|
|
47
|
+
"ui-table": "nodes/widgets/ui_table.js",
|
|
48
|
+
"ui-chart": "nodes/widgets/ui_chart.js",
|
|
49
|
+
"ui-notification": "nodes/widgets/ui_notification.js",
|
|
50
|
+
"ui-markdown": "nodes/widgets/ui_markdown.js",
|
|
51
|
+
"ui-template": "nodes/widgets/ui_template.js"
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
"dependencies": {
|
|
55
|
+
"chartjs-adapter-luxon": "^1.3.1",
|
|
56
|
+
"core-js": "^3.32.0",
|
|
57
|
+
"express": "^4.18.2",
|
|
58
|
+
"socket.io": "^4.7.1",
|
|
59
|
+
"vue": "^3.3.4"
|
|
60
|
+
},
|
|
61
|
+
"devDependencies": {
|
|
62
|
+
"@babel/core": "^7.22.20",
|
|
63
|
+
"@babel/eslint-parser": "^7.22.15",
|
|
64
|
+
"@babel/plugin-transform-private-methods": "^7.22.5",
|
|
65
|
+
"@mdi/font": "~6.9.96",
|
|
66
|
+
"@unhead/vue": "^1.7.4",
|
|
67
|
+
"@vue/cli-plugin-babel": "~5.0.8",
|
|
68
|
+
"@vue/cli-plugin-eslint": "~5.0.8",
|
|
69
|
+
"@vue/cli-service": "~5.0.8",
|
|
70
|
+
"chart.js": "^4.4.0",
|
|
71
|
+
"dompurify": "^3.0.5",
|
|
72
|
+
"eslint": "^8.49.0",
|
|
73
|
+
"eslint-config-standard": "^17.1.0",
|
|
74
|
+
"eslint-plugin-html": "^7.1.0",
|
|
75
|
+
"eslint-plugin-import": "^2.28.1",
|
|
76
|
+
"eslint-plugin-n": "^16.1.0",
|
|
77
|
+
"eslint-plugin-no-only-tests": "^3.1.0",
|
|
78
|
+
"eslint-plugin-promise": "^6.1.1",
|
|
79
|
+
"eslint-plugin-vue": "^8.7.1",
|
|
80
|
+
"eslint-plugin-vuetify": "^2.0.5",
|
|
81
|
+
"glob": "^10.3.4",
|
|
82
|
+
"highlight.js": "^11.8.0",
|
|
83
|
+
"luxon": "^3.4.3",
|
|
84
|
+
"marked": "^4.3.0",
|
|
85
|
+
"marked-highlight": "^2.0.6",
|
|
86
|
+
"medium-zoom": "^1.0.8",
|
|
87
|
+
"mermaid": "^10.4.0",
|
|
88
|
+
"mocha": "^10.2.0",
|
|
89
|
+
"node-red": "^3.1.0",
|
|
90
|
+
"node-red-node-test-helper": "^0.3.2",
|
|
91
|
+
"should": "^13.2.3",
|
|
92
|
+
"should-sinon": "^0.0.6",
|
|
93
|
+
"sinon": "^15.2.0",
|
|
94
|
+
"socket.io-client": "^4.7.2",
|
|
95
|
+
"vitepress": "^1.0.0-beta.7",
|
|
96
|
+
"vue-router": "^4.2.4",
|
|
97
|
+
"vuetify": "^3.3.16",
|
|
98
|
+
"vuex": "^4.1.0"
|
|
99
|
+
},
|
|
100
|
+
"overrides": {
|
|
101
|
+
"node-red-node-test-helper": {
|
|
102
|
+
"semver": "^7.5.4"
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
"browserslist": [
|
|
106
|
+
"> 1%",
|
|
107
|
+
"last 2 versions",
|
|
108
|
+
"not dead",
|
|
109
|
+
"not ie 11"
|
|
110
|
+
],
|
|
111
|
+
"engines": {
|
|
112
|
+
"node": ">=14"
|
|
113
|
+
}
|
|
114
|
+
}
|