Compare commits
1359 Commits
0.20.0-bet
...
1.1.2
Author | SHA1 | Date | |
---|---|---|---|
|
43db1824be | ||
|
7f671c9f3f | ||
|
580cc00967 | ||
|
612c565cfd | ||
|
979c5351a8 | ||
|
97b7479081 | ||
|
1df2f5e96a | ||
|
32163d5f21 | ||
|
1c337f6817 | ||
|
6df26f2400 | ||
|
a9431a5aee | ||
|
5a3c832a98 | ||
|
c4b5bb22db | ||
|
2b5a976f35 | ||
|
ae1ca85924 | ||
|
c9acfdb1d7 | ||
|
11ac8fbf13 | ||
|
dc541444ba | ||
|
8ea25bcd1c | ||
|
f5e46a663a | ||
|
64ec415a54 | ||
|
57154b2853 | ||
|
0243a902b2 | ||
|
6c04402a98 | ||
|
ef7c9b5c2a | ||
|
73448a6039 | ||
|
176a0ff99b | ||
|
b96d562700 | ||
|
7a3ead8f3b | ||
|
f72903ccc2 | ||
|
668678b2c4 | ||
|
e2802175a5 | ||
|
71c5b1be86 | ||
|
44da085e0b | ||
|
362554ad3b | ||
|
f01866d76f | ||
|
53490cd368 | ||
|
c171088838 | ||
|
0cc944dc5a | ||
|
8bd8834237 | ||
|
84fc739c8d | ||
|
a7fa2cf0c9 | ||
|
1137cd5ca5 | ||
|
d47906b525 | ||
|
13a59a882e | ||
|
3b7348f862 | ||
|
07585f01e3 | ||
|
5042137006 | ||
|
a2ea79130c | ||
|
979401f3ac | ||
|
4c98db2269 | ||
|
209c5f337c | ||
|
8080ed4787 | ||
|
f3be5f0e67 | ||
|
fb2d185c5f | ||
|
f2d696b48e | ||
|
5596d2df8e | ||
|
b72ca439e2 | ||
|
432ed264c2 | ||
|
0a411cbe4f | ||
|
581f71911a | ||
|
e548bf8bc2 | ||
|
1d944bab51 | ||
|
6f407750f5 | ||
|
19ffe8f308 | ||
|
c9069d472f | ||
|
68d3cc7507 | ||
|
0c90376752 | ||
|
f5eb832cd2 | ||
|
c3a058a479 | ||
|
bc87210ce3 | ||
|
d595eb2614 | ||
|
cb4d118ccc | ||
|
62c723866a | ||
|
c9e54f2ba9 | ||
|
e2c86c4b96 | ||
|
4469a334fd | ||
|
aca379db6e | ||
|
9ce5210c33 | ||
|
4dd68452b4 | ||
|
714b3d3fe0 | ||
|
2378e0d961 | ||
|
f78bbdc29f | ||
|
708620f929 | ||
|
9f0490fc12 | ||
|
d37eebd8ed | ||
|
bfeda23ce5 | ||
|
52eb158231 | ||
|
afb782410d | ||
|
aebb7da3c7 | ||
|
b90710945a | ||
|
56efd51c06 | ||
|
76728d1783 | ||
|
5b1fe9aa0a | ||
|
e3c8466819 | ||
|
6a70cd1975 | ||
|
2c45771024 | ||
|
ebca8c0217 | ||
|
752a080876 | ||
|
0541d9189d | ||
|
0e454b08c8 | ||
|
2d0ca20a03 | ||
|
61d9ccf263 | ||
|
1c30584153 | ||
|
5c5bebd689 | ||
|
d9548a2891 | ||
|
d25e027201 | ||
|
93211470d1 | ||
|
b5800205c4 | ||
|
eeebf04509 | ||
|
f4f99f594d | ||
|
5e8e739f78 | ||
|
a15adc43af | ||
|
07556592c1 | ||
|
7694349078 | ||
|
4f3cb3103e | ||
|
842cd1ecf0 | ||
|
81a4f42673 | ||
|
152e695f4c | ||
|
5a0c10b80e | ||
|
06adf3d346 | ||
|
7be824640c | ||
|
c061487a16 | ||
|
97fd34150f | ||
|
6d294a0c74 | ||
|
fe4ef354ac | ||
|
d28b8b5e8d | ||
|
f2b30d9a3f | ||
|
0a614f2741 | ||
|
a9fb50787b | ||
|
ce7d7a8e01 | ||
|
7006c00233 | ||
|
21866634b3 | ||
|
34dfd50702 | ||
|
d9502a6c00 | ||
|
95f7b9205a | ||
|
d14d4944a0 | ||
|
b4b2729e96 | ||
|
299b81f51b | ||
|
ad6b18e66f | ||
|
091a462a42 | ||
|
cb218a57f1 | ||
|
ba8649117d | ||
|
20daebd965 | ||
|
7c2786969a | ||
|
565aae5967 | ||
|
16a634063a | ||
|
4c28b5b227 | ||
|
a7a949377b | ||
|
c048b1a25b | ||
|
f7e7f7ed01 | ||
|
5dfcb80de8 | ||
|
c8f6100a6a | ||
|
c0f4e07e10 | ||
|
3c259b2c22 | ||
|
3b3a2d4edc | ||
|
e930098b51 | ||
|
43d5df4a12 | ||
|
914cfdbc55 | ||
|
aa8f4af339 | ||
|
b6fbe7d07d | ||
|
bf9d6c7ac4 | ||
|
139ae547c6 | ||
|
8b252b458c | ||
|
efecfa328b | ||
|
5651e7107f | ||
|
b6b3ceef4d | ||
|
e44d89c2af | ||
|
3e74d75f28 | ||
|
6d737b9e4c | ||
|
dec82589d1 | ||
|
f0193b0f67 | ||
|
fdf8eb0657 | ||
|
2ce424b567 | ||
|
8995fa9ed1 | ||
|
dc412b305c | ||
|
d7505da997 | ||
|
4b54a81dfd | ||
|
132254b3a5 | ||
|
9128b12960 | ||
|
e9104df047 | ||
|
bae52613ab | ||
|
18af906fd3 | ||
|
d45415ab22 | ||
|
c6c42740c5 | ||
|
b4c033ca50 | ||
|
b67f2d874b | ||
|
a8d8540346 | ||
|
cbf1afc9fe | ||
|
8a798e620a | ||
|
774751a25c | ||
|
13718032f6 | ||
|
1b497b340b | ||
|
bb41ab482c | ||
|
215aab0fe4 | ||
|
666822cf51 | ||
|
40101df6ec | ||
|
4adcb9c439 | ||
|
a6cd0bf7e9 | ||
|
8158744829 | ||
|
70c0c7bc14 | ||
|
fdda29f048 | ||
|
95cc8ea80d | ||
|
18f8dde712 | ||
|
effff3405b | ||
|
9d8cbcb993 | ||
|
3345f2f3b8 | ||
|
bcf1d986a4 | ||
|
a51e74bfa1 | ||
|
cf00acac04 | ||
|
876a7a4646 | ||
|
95d1b7bc36 | ||
|
d4ae0b0a2e | ||
|
36739fb444 | ||
|
7906c28abb | ||
|
f87b40941f | ||
|
05f816fc5d | ||
|
f9a157fe18 | ||
|
ca213589ac | ||
|
c5ca9fafee | ||
|
82b3a97d99 | ||
|
1c94064c57 | ||
|
7969dd431f | ||
|
22e7ddcb1d | ||
|
b1eafac67a | ||
|
5d81cec00c | ||
|
9512450d7c | ||
|
ed1998162f | ||
|
ac2a21f992 | ||
|
ad78ce0eb6 | ||
|
8ce49c25d4 | ||
|
4c24bd4ab9 | ||
|
0de49e2a75 | ||
|
05c3f459ad | ||
|
50aaef5103 | ||
|
38872049fd | ||
|
5dc1cc54d5 | ||
|
57f0fbbb98 | ||
|
977fef03b0 | ||
|
7d67e6a276 | ||
|
0832be5970 | ||
|
2343fbd86a | ||
|
367ebc1dd4 | ||
|
15cc88de6c | ||
|
64b3c11682 | ||
|
b8784185e8 | ||
|
fdc721baa1 | ||
|
03b64bc493 | ||
|
a6a781f67c | ||
|
fe1f8ca0a8 | ||
|
a600feb5de | ||
|
1f2c0a78c2 | ||
|
e4b9c6a2ee | ||
|
a69db4d572 | ||
|
12c92072d0 | ||
|
e674d9246b | ||
|
b71f81af57 | ||
|
b3535281ef | ||
|
5f5e6ea845 | ||
|
64d2e80690 | ||
|
b6e0568e76 | ||
|
dca5b3b2a0 | ||
|
243915516e | ||
|
bc3683d8f6 | ||
|
1d36ce0fdf | ||
|
88d4d306f3 | ||
|
184d928cf7 | ||
|
fbd911ed27 | ||
|
dec3762b7a | ||
|
a849872c21 | ||
|
1d71fb3554 | ||
|
0d3bf0cd00 | ||
|
6c766eba86 | ||
|
cc760acb62 | ||
|
f4d4bf8779 | ||
|
90f62e5e4a | ||
|
f1bd3e1711 | ||
|
01dde8bea5 | ||
|
341c66a199 | ||
|
bc1fb2770b | ||
|
9f1373945b | ||
|
266ee2ca81 | ||
|
35738cc1a3 | ||
|
ff310f89bd | ||
|
2dd004f6cd | ||
|
964b7e0e23 | ||
|
bc039bde81 | ||
|
9505f82d9b | ||
|
9189db5531 | ||
|
bfa5f39b6d | ||
|
15f97bbf26 | ||
|
90ba761325 | ||
|
ddd428f76e | ||
|
0c83fa7060 | ||
|
f2e2c7e4d0 | ||
|
717bfffa63 | ||
|
a764a4a44b | ||
|
247fa0ce7c | ||
|
13932b2cfb | ||
|
0bd0540d2f | ||
|
9a17cc503c | ||
|
89a048e5fa | ||
|
88bc022e2a | ||
|
00e080459e | ||
|
5b197adf33 | ||
|
9019c31f91 | ||
|
2e14703b16 | ||
|
f87698438d | ||
|
4af1cf1d1f | ||
|
d6ad7dc6eb | ||
|
f25e4ea520 | ||
|
17891d373b | ||
|
9f29149d87 | ||
|
010e20989a | ||
|
c885f2edaa | ||
|
ae5a7176ba | ||
|
ee13cd10fe | ||
|
b0f9bf2c62 | ||
|
9fbfc3d677 | ||
|
189389f96a | ||
|
2af7066512 | ||
|
9cbc40a229 | ||
|
18bf220ca4 | ||
|
8750c4b121 | ||
|
417d2cb40a | ||
|
36b0698432 | ||
|
0edc57f0e3 | ||
|
3d76137247 | ||
|
df9d231389 | ||
|
e2aebaf0e7 | ||
|
20e84a847a | ||
|
ad4779e32f | ||
|
90537e42ba | ||
|
4615465599 | ||
|
95418724fa | ||
|
989cb05257 | ||
|
d7df20413d | ||
|
f7e0f55c13 | ||
|
e16f48c9fd | ||
|
4694644043 | ||
|
f468d6e947 | ||
|
9a19477796 | ||
|
00d41c6de2 | ||
|
fc2a9a85ff | ||
|
78c86880e4 | ||
|
aca61c0354 | ||
|
73dde4de51 | ||
|
597c4a2e4f | ||
|
62ec7f4d37 | ||
|
319c7e9e9f | ||
|
580492b0c8 | ||
|
655ce7b87a | ||
|
4e09b404a2 | ||
|
748f831495 | ||
|
bb3b87814c | ||
|
0bfe20182f | ||
|
4245c0a0ad | ||
|
25aadc690a | ||
|
12dc4ab1fa | ||
|
55a5917282 | ||
|
a5b33d11fc | ||
|
d2d872f51c | ||
|
5c0b500f48 | ||
|
28418288e3 | ||
|
0150769c17 | ||
|
2eaea02489 | ||
|
1a9c4b7714 | ||
|
d9f710aa52 | ||
|
2069cc4392 | ||
|
f78be9050a | ||
|
feb5d13e1c | ||
|
a3b0448f53 | ||
|
3dfbefb9f5 | ||
|
9f6bac1b1b | ||
|
0f2ed14d16 | ||
|
3e898c487a | ||
|
efb9dce92f | ||
|
f024e0bbed | ||
|
3f1bb6771a | ||
|
0b3ced5203 | ||
|
373267c53b | ||
|
ae3e250269 | ||
|
33200b2d08 | ||
|
b032e00d01 | ||
|
fda95dfc5d | ||
|
bc96f2d0cb | ||
|
c649e1b4a2 | ||
|
f54ed8ebd1 | ||
|
b82167fefa | ||
|
2efc2bc186 | ||
|
f572c11912 | ||
|
4595a77c41 | ||
|
7c1853431a | ||
|
e26eb85718 | ||
|
821b5686f2 | ||
|
c989f466ed | ||
|
97c771f93a | ||
|
54dbdde9cb | ||
|
513957eea1 | ||
|
5eed4672ed | ||
|
aafa4fe0b9 | ||
|
572c03631d | ||
|
2f869a55e2 | ||
|
161f6090c1 | ||
|
efad7270b7 | ||
|
24eb78d137 | ||
|
e969a1c97c | ||
|
4f31632863 | ||
|
1d417c07cd | ||
|
344c9fe57e | ||
|
9d4400349b | ||
|
24f7000918 | ||
|
6ff3286d78 | ||
|
f058de8bcd | ||
|
fbfc74e5ca | ||
|
1b5654001c | ||
|
e0f3e94e2b | ||
|
5da89892b4 | ||
|
a6ecb54cc4 | ||
|
04da13eaf9 | ||
|
7fa4df082e | ||
|
ae001c5e82 | ||
|
e7f942eda7 | ||
|
fa8236ee2c | ||
|
08ec04c889 | ||
|
e5150ea012 | ||
|
222ece2533 | ||
|
294696daf5 | ||
|
d099356207 | ||
|
5c06761b1a | ||
|
05fc3c5eca | ||
|
9d4e2adde4 | ||
|
a8db3d8dd3 | ||
|
6ae7c51dc5 | ||
|
84771f5864 | ||
|
4304d44851 | ||
|
1018c0e8a5 | ||
|
b1d0013214 | ||
|
94ef25bbb9 | ||
|
13830ffc9c | ||
|
e0bef941b4 | ||
|
03e9522d98 | ||
|
1bdbd31b96 | ||
|
ef9db701f8 | ||
|
afb564a4fc | ||
|
3e7f58dedd | ||
|
e46d8345db | ||
|
2e364b6d9a | ||
|
b4177836a8 | ||
|
5b2ee21204 | ||
|
9b6e798eb6 | ||
|
7c91c4ae5a | ||
|
7bc3b662e4 | ||
|
64af1f7e9b | ||
|
f0038e9796 | ||
|
768aa4ac92 | ||
|
f61c137ea3 | ||
|
20a8059758 | ||
|
58696c6ad4 | ||
|
b5ed018bae | ||
|
91b7dd988e | ||
|
b0c3c78899 | ||
|
282f00e091 | ||
|
5cd2791506 | ||
|
9b2e9ec41a | ||
|
08ef9ee682 | ||
|
a8bc753720 | ||
|
266df86d98 | ||
|
85a1f59a93 | ||
|
43258ee816 | ||
|
c4ca0b6e91 | ||
|
1bf3b3077e | ||
|
c9194c3635 | ||
|
27c462fee9 | ||
|
7886e5d57c | ||
|
6912dec166 | ||
|
b8e610e1b6 | ||
|
421b5846f2 | ||
|
6a30f2cbc8 | ||
|
a8b1e91843 | ||
|
20f97d0d13 | ||
|
4c78f06c2b | ||
|
c700d5c922 | ||
|
a9508a2c04 | ||
|
09d55a0cbd | ||
|
b165129388 | ||
|
0ef3471f8f | ||
|
9ba9998bd6 | ||
|
72126730ef | ||
|
fd2213232c | ||
|
369c5754f2 | ||
|
fc3d0ab053 | ||
|
1c63d7ff31 | ||
|
de971fa53f | ||
|
d005eb46cf | ||
|
d1dd7d1d51 | ||
|
b78ef006ec | ||
|
134c68c98e | ||
|
82539fc420 | ||
|
7a5604697f | ||
|
84d2b8ad6d | ||
|
9a0c843f29 | ||
|
4d96d95370 | ||
|
51ea5dc342 | ||
|
97d58e34f2 | ||
|
86ce5c591b | ||
|
dea47a6e3d | ||
|
7621cf3377 | ||
|
5090b01b8e | ||
|
6675fdf3c2 | ||
|
491812fac5 | ||
|
8a82552bdc | ||
|
bd4fc2e5cc | ||
|
32aa4c41ce | ||
|
2a6bedbd8d | ||
|
83942c2551 | ||
|
458d794f52 | ||
|
95982ad464 | ||
|
7723ff461b | ||
|
0ca36a89e3 | ||
|
cc5fdd9844 | ||
|
d09ee6611f | ||
|
bba6855872 | ||
|
43970b404e | ||
|
1868289b71 | ||
|
37bcd5c603 | ||
|
c9ad5bea93 | ||
|
a09b3bb6c7 | ||
|
3d6170be5e | ||
|
00477fd67a | ||
|
21c57f968a | ||
|
f7d2314d64 | ||
|
5ecf8c83db | ||
|
608834eafb | ||
|
1fd4b2b9fc | ||
|
01a143cd5a | ||
|
6321b21a1a | ||
|
8405826fab | ||
|
22de8855c1 | ||
|
1830478ec3 | ||
|
6d98b93135 | ||
|
54978e4d64 | ||
|
9d567d61fe | ||
|
79feb691bd | ||
|
e16fe1e6a5 | ||
|
04d3981921 | ||
|
40c3099e4e | ||
|
3f86fd7176 | ||
|
9e6bc46540 | ||
|
5e892f222b | ||
|
2da1554caa | ||
|
a53d0c091e | ||
|
f88bfa059d | ||
|
2e38999506 | ||
|
42b841cb78 | ||
|
c0d007ffa9 | ||
|
127b361979 | ||
|
e3dab3cf20 | ||
|
569b9f3d06 | ||
|
d6b5494625 | ||
|
f76edf74f9 | ||
|
5c199d3bb4 | ||
|
634a51635c | ||
|
4f9395e881 | ||
|
8035531a27 | ||
|
cc177533e8 | ||
|
cd210d9fbf | ||
|
87b9b56b65 | ||
|
bffcaa1c17 | ||
|
33cbb2ada8 | ||
|
d08e77cf36 | ||
|
1f8ed9dcb9 | ||
|
53b127902c | ||
|
389cbf4900 | ||
|
80d100f3f9 | ||
|
a05589c5a6 | ||
|
7d32636133 | ||
|
3db5f928ee | ||
|
797da3bc8e | ||
|
1e8d695311 | ||
|
00eb474e02 | ||
|
ad6104baeb | ||
|
cd552ab202 | ||
|
bbd471ad93 | ||
|
0f1ca1c7cf | ||
|
62fc554d25 | ||
|
84dc34e68f | ||
|
0bb77bfa7f | ||
|
b6702a0c3b | ||
|
a781a1dd4d | ||
|
d771527f77 | ||
|
3d9945b60c | ||
|
5897045f24 | ||
|
b2f53a183e | ||
|
be3dd63360 | ||
|
f951fe6939 | ||
|
0622be843b | ||
|
272fbc0cb0 | ||
|
36bf2a3c38 | ||
|
663ed9833a | ||
|
fcf757f715 | ||
|
88e729664a | ||
|
c03abdb5e7 | ||
|
6d3eb7bb4b | ||
|
7ffd37d9cb | ||
|
87aacb4270 | ||
|
3f756aac21 | ||
|
504d13943d | ||
|
59b1466e5d | ||
|
d5d9ac5c76 | ||
|
bb12ec702a | ||
|
82490b0a58 | ||
|
2cbf625483 | ||
|
44f2a986a2 | ||
|
c3df1c6cde | ||
|
6b52206186 | ||
|
9d4238e5cc | ||
|
c16c119a7d | ||
|
b49835c72f | ||
|
ee6f6ae391 | ||
|
95a51aafdc | ||
|
5e7cd79ed9 | ||
|
aba6173e23 | ||
|
468beee045 | ||
|
70ad66bcff | ||
|
e2c3b35391 | ||
|
448de23f59 | ||
|
74a015c329 | ||
|
44a07c74fd | ||
|
0f8af4ba1c | ||
|
214d788029 | ||
|
530bf22bd5 | ||
|
ccc98370eb | ||
|
7640bc029c | ||
|
3f72eb51a0 | ||
|
8801ace247 | ||
|
faf46e4447 | ||
|
63978e226b | ||
|
b96164d4f5 | ||
|
944070dfb1 | ||
|
f0584df1d0 | ||
|
ba209c2bdd | ||
|
c6e2f28b97 | ||
|
2436bb0128 | ||
|
9c4640e010 | ||
|
1ee43113b1 | ||
|
902f477ee3 | ||
|
9c1d46ff92 | ||
|
fe0d4f08f3 | ||
|
9cbd0fceea | ||
|
b22a4f94ab | ||
|
14c2005bbc | ||
|
a4c351fd4f | ||
|
a364d4950d | ||
|
d017dd75cd | ||
|
021df83c3f | ||
|
7805974736 | ||
|
c1dae95f71 | ||
|
e7c2ff3bd2 | ||
|
25459b52a1 | ||
|
d45274494d | ||
|
b81be8f358 | ||
|
aa6c0b9d6e | ||
|
64580237d5 | ||
|
b93165592e | ||
|
83c1e44925 | ||
|
3088115aba | ||
|
fc93e502b8 | ||
|
e90e6eaac3 | ||
|
2f4dcba54d | ||
|
683c6a748e | ||
|
175a871ee0 | ||
|
b4e2061e85 | ||
|
2aef99c440 | ||
|
6c125e125f | ||
|
88cbc32abc | ||
|
8f45e8f84a | ||
|
21635aadfe | ||
|
d5234888b3 | ||
|
f478afb58a | ||
|
a54ca699b5 | ||
|
1f5ff0c6d3 | ||
|
2a2541df59 | ||
|
cd629c1699 | ||
|
ff96773295 | ||
|
4d6828ec14 | ||
|
dae1d6057e | ||
|
6726c42cc8 | ||
|
4f6023e44c | ||
|
9e16d7f433 | ||
|
aa86cfc55f | ||
|
6931cb9895 | ||
|
d32d04bd4e | ||
|
0b3e9bf5e2 | ||
|
a4af7b8e21 | ||
|
72deee5d74 | ||
|
5e9e523d4c | ||
|
c54509df3d | ||
|
63cc9adeaa | ||
|
74d760a46d | ||
|
d46531def8 | ||
|
eb09ec6834 | ||
|
9bd9c6a400 | ||
|
7321e206c5 | ||
|
2c7917f0ca | ||
|
d94b20a908 | ||
|
b1b1fe21dd | ||
|
1db3af7c8e | ||
|
397fe31f97 | ||
|
bc283aa025 | ||
|
9dbdf0947b | ||
|
7c21bf4555 | ||
|
361dc194ee | ||
|
8c1aa83d12 | ||
|
d2755a8049 | ||
|
1b78bd1684 | ||
|
5f67f1f078 | ||
|
07061928df | ||
|
18ff2df65c | ||
|
7b1411d171 | ||
|
3a1d0f3695 | ||
|
2cd5e1d3c5 | ||
|
000765fb77 | ||
|
0ff324b0db | ||
|
a96d5096fe | ||
|
e8ef476a6d | ||
|
22b9df62d1 | ||
|
6026da867b | ||
|
4d58902ba7 | ||
|
4dc1343445 | ||
|
080487cb33 | ||
|
0febcf4f9e | ||
|
cd23f711ed | ||
|
f9b147af42 | ||
|
775f1110d3 | ||
|
57649a9b81 | ||
|
72a268b70a | ||
|
f86a171dff | ||
|
e022b782a9 | ||
|
bd67731bb7 | ||
|
25de4e4782 | ||
|
c590247afa | ||
|
5d36539271 | ||
|
0d673486a3 | ||
|
29f1651a18 | ||
|
dd20a3e685 | ||
|
75a5b1354c | ||
|
dae9ac8173 | ||
|
78b735276b | ||
|
e10dd54e2b | ||
|
cb8deab1f9 | ||
|
e5c27d0236 | ||
|
faf6fa9450 | ||
|
873bdc6733 | ||
|
8a40b075b5 | ||
|
56c41374bf | ||
|
a08c2c6437 | ||
|
e94634544c | ||
|
07fe5b247b | ||
|
c1c694035d | ||
|
147d2a02be | ||
|
6f91786f4d | ||
|
f62a933d1c | ||
|
451835fbeb | ||
|
547e7a1b21 | ||
|
053e3ba923 | ||
|
bf65dcd49b | ||
|
a1d186112a | ||
|
ca7a298509 | ||
|
ff4d58f648 | ||
|
a1e10e99fa | ||
|
16bda530f6 | ||
|
bf9e04d9db | ||
|
8df86a75b1 | ||
|
5056203023 | ||
|
a0026e66ce | ||
|
f75dd2209d | ||
|
e35f6d9e35 | ||
|
3cb00ce4e0 | ||
|
8e18cf5986 | ||
|
81f80600f5 | ||
|
895156675f | ||
|
1c424e2e0a | ||
|
0124bb17e8 | ||
|
2c89b2d262 | ||
|
c7bbe2f1fe | ||
|
88609a8829 | ||
|
329beb166c | ||
|
e36f3d937c | ||
|
1395092ca6 | ||
|
c09004dbc8 | ||
|
7efe4a2776 | ||
|
b763e0b0cb | ||
|
ddd0d1bef3 | ||
|
dbca2178c0 | ||
|
af742ea536 | ||
|
14c1a86b9b | ||
|
ee3dc8c4cd | ||
|
1ed148aaf5 | ||
|
3327adb1ae | ||
|
4d5f771f9f | ||
|
aa69d663ed | ||
|
29d1894f9a | ||
|
e5738d608c | ||
|
9775d3a33d | ||
|
ad4cf8d631 | ||
|
a27e8777aa | ||
|
d23edcc0b5 | ||
|
52373e5bef | ||
|
bb70e796a1 | ||
|
7957ec4369 | ||
|
3365d26b40 | ||
|
d3c111b533 | ||
|
ec876eb102 | ||
|
dddfb1ec08 | ||
|
6fc9c03d70 | ||
|
199ff071e8 | ||
|
7e4a06044a | ||
|
d047b75cb7 | ||
|
6fb6b13037 | ||
|
460c5a1ae3 | ||
|
9955bcc339 | ||
|
0a3ab996eb | ||
|
46f912a6f9 | ||
|
01e0f24752 | ||
|
7178c63e10 | ||
|
30c402eb83 | ||
|
2601cc898c | ||
|
d2a8823808 | ||
|
6b61fa9f6f | ||
|
247052df5f | ||
|
8eb28555bc | ||
|
73132475dc | ||
|
42c6487ff3 | ||
|
8d2ca25fd6 | ||
|
5c5919a7eb | ||
|
34cdbfc852 | ||
|
1bc50194aa | ||
|
4a75236e74 | ||
|
64b2f881c4 | ||
|
4709ddea5d | ||
|
6ef49152f3 | ||
|
1c44b0bc98 | ||
|
11bce8c17c | ||
|
b42fff1055 | ||
|
1b2e442513 | ||
|
a4d48077ba | ||
|
901e2527d8 | ||
|
f0839571d0 | ||
|
89d0d6ec93 | ||
|
922ab1d17b | ||
|
7c7be378bc | ||
|
ec01f8f54b | ||
|
5a094b44c4 | ||
|
3c657a6645 | ||
|
3129d44ff1 | ||
|
00306f82c5 | ||
|
7def676a17 | ||
|
6c48735854 | ||
|
a0b1831cdb | ||
|
db9fb8480a | ||
|
c138e2ffb4 | ||
|
473c45794e | ||
|
a12aa81d73 | ||
|
0033e279f1 | ||
|
a25e98d0cb | ||
|
bc65480f27 | ||
|
8582cda124 | ||
|
d963dfdbb6 | ||
|
f7e9c109f6 | ||
|
30c3004f27 | ||
|
17653761b9 | ||
|
4f049fd94b | ||
|
f98d1c95cc | ||
|
a2b5c0247b | ||
|
bca9b5d8c0 | ||
|
bc789c7f9f | ||
|
28bda9fa41 | ||
|
18aeeab041 | ||
|
c7427a5f7c | ||
|
03aa6c7d3a | ||
|
10077ae750 | ||
|
74eec25285 | ||
|
b6055479a1 | ||
|
69b781419f | ||
|
da6db24f9e | ||
|
2b66723d42 | ||
|
00a3e25714 | ||
|
8ccbd2d8f9 | ||
|
8307f26099 | ||
|
c686f7eefc | ||
|
311c7b1158 | ||
|
a17325f028 | ||
|
b734097d16 | ||
|
afaf077aca | ||
|
bf14af6a1f | ||
|
e72faef839 | ||
|
b274bafe8e | ||
|
7bed967755 | ||
|
944b81b71c | ||
|
cd529d53ae | ||
|
0d680a58f3 | ||
|
b30d519523 | ||
|
83932e1725 | ||
|
4ce0e39760 | ||
|
84232f25f0 | ||
|
2daedf8fd5 | ||
|
fe084a4478 | ||
|
5bf9646a76 | ||
|
2b1f28e6c2 | ||
|
5b8bd6e64f | ||
|
426fd499ce | ||
|
17d3a5840d | ||
|
be49e1d383 | ||
|
daa98e8925 | ||
|
58784b7568 | ||
|
419a183167 | ||
|
675b4bde14 | ||
|
ee6ee99577 | ||
|
3bc1f69e75 | ||
|
5b9df6d5f2 | ||
|
9f062ec1b8 | ||
|
b52a47bd03 | ||
|
5e20134f4f | ||
|
89d267d6a2 | ||
|
607bc42f59 | ||
|
880757fb5d | ||
|
c8acc6a12e | ||
|
7d4c2442da | ||
|
e5255b0c7c | ||
|
ac3ef9b6fc | ||
|
7b5a41c3ff | ||
|
d5b0d2a886 | ||
|
4d60447242 | ||
|
78bee3dc59 | ||
|
e2db958510 | ||
|
16440072fb | ||
|
be2dd6dc32 | ||
|
189bde7c9c | ||
|
6a4760e291 | ||
|
c082bb97e0 | ||
|
c8e14f91e7 | ||
|
6032d096ec | ||
|
defa9a2270 | ||
|
77a913f858 | ||
|
6e3fa974ba | ||
|
7926055b97 | ||
|
ffd10e656e | ||
|
59c1828078 | ||
|
6164271fe8 | ||
|
26ba35933d | ||
|
87359937c9 | ||
|
9b938f6515 | ||
|
6c3913785d | ||
|
542cf3147d | ||
|
fb9828badc | ||
|
2505ac3f98 | ||
|
fde8548166 | ||
|
fe91295704 | ||
|
15b99c5749 | ||
|
9d66ca4a49 | ||
|
b749a27f86 | ||
|
083212cffe | ||
|
c4e8756210 | ||
|
3a6448f727 | ||
|
fe18df25ba | ||
|
db65460ec0 | ||
|
0ad3eceb82 | ||
|
a376d6e361 | ||
|
45c7f3f3ca | ||
|
238de59a2a | ||
|
96255e51d2 | ||
|
18c3223105 | ||
|
b9e97792f3 | ||
|
cbce9b8637 | ||
|
5ab90b85da | ||
|
f3e1e8a2c7 | ||
|
e41b292e54 | ||
|
86928bbb2d | ||
|
2f5ec8b5bf | ||
|
a42d7d867e | ||
|
14ac6446de | ||
|
260a9723a4 | ||
|
4e7b000dcd | ||
|
2254e4c57e | ||
|
d517697564 | ||
|
25a27733b9 | ||
|
6ab520984c | ||
|
04d7106956 | ||
|
db5589f2aa | ||
|
d06dbbb4bd | ||
|
b7a62bd9e7 | ||
|
93ad9a3aa6 | ||
|
f1855174f0 | ||
|
a2dedba0ef | ||
|
5a65f445f0 | ||
|
f52289b2c3 | ||
|
3b5ea0f15f | ||
|
238bcb8698 | ||
|
3ee8bcad8c | ||
|
f0a51bafbe | ||
|
944f3bd329 | ||
|
8bb7b2e88b | ||
|
aab0b0b4bf | ||
|
083d6c5125 | ||
|
c2167a2c5f | ||
|
1a695e0451 | ||
|
8847f325ed | ||
|
94c9da468e | ||
|
24b38407e4 | ||
|
f49d1ae860 | ||
|
8b3b541a56 | ||
|
a974e84ad1 | ||
|
c4f4115bcb | ||
|
3c5adbee31 | ||
|
55645e3730 | ||
|
d918bb568c | ||
|
b1bff62bf7 | ||
|
d11d389ae4 | ||
|
a73c159160 | ||
|
7adf102d8d | ||
|
e4d3ff623a | ||
|
2433d59f00 | ||
|
8c68e76c3e | ||
|
0b204de5a9 | ||
|
93c811ab70 | ||
|
3ff861099a | ||
|
f22762539f | ||
|
677442a3c0 | ||
|
b73f12cdba | ||
|
28fbb61e81 | ||
|
c1104d1cd6 | ||
|
e346702292 | ||
|
90887779ea | ||
|
a941b1437c | ||
|
04bdcbd490 | ||
|
87a815fd6f | ||
|
d623848c87 | ||
|
46abd0cc42 | ||
|
e315325d91 | ||
|
f3fc083330 | ||
|
92cb57eb7b | ||
|
d645fbff2f | ||
|
8486f4d43a | ||
|
60b1a05894 | ||
|
f955d63707 | ||
|
f106019938 | ||
|
2473249c8b | ||
|
d13dc4fba3 | ||
|
41a0af032c | ||
|
70cf7b0c5a | ||
|
14f6788ab9 | ||
|
bb67049d90 | ||
|
ae2162beaf | ||
|
19f2c5e07f | ||
|
8abc5b3889 | ||
|
4d37c28bc7 | ||
|
cc0933eee4 | ||
|
2de9a804a0 | ||
|
ffeb2e91f4 | ||
|
8cf5ec9e5a | ||
|
ea0526f29a | ||
|
cfcb3a69e5 | ||
|
e3e0378857 | ||
|
ccc3809daa | ||
|
c97786e12c | ||
|
400071879f | ||
|
4cd6e20c91 | ||
|
460e3ad395 | ||
|
6f08bd6fc5 | ||
|
eed3a749db | ||
|
6587d12fbd | ||
|
f8dd68ecc4 | ||
|
f0aef2b853 | ||
|
7d27df1b97 | ||
|
457ec86c25 | ||
|
a24c66958f | ||
|
617628b886 | ||
|
6b7e623d33 | ||
|
5ca85b7e83 | ||
|
5965bf3332 | ||
|
baf2dd293b | ||
|
2cc19e7e32 | ||
|
53ab6f8569 | ||
|
cf8faac7ef | ||
|
86947a384d | ||
|
22855279bd | ||
|
e56fdecdc6 | ||
|
dc75a5812f | ||
|
33e20c9969 | ||
|
109204897f | ||
|
3b3a2d62f8 | ||
|
b1b4b3fb63 | ||
|
d583c68de5 | ||
|
d360f30af6 | ||
|
ed033565a4 | ||
|
2d6acfae1b | ||
|
10da894124 | ||
|
6dda8f21e4 | ||
|
1a9d759002 | ||
|
df24e13eb5 | ||
|
2ab19937af | ||
|
390b86cd8e | ||
|
423aba5bab | ||
|
dc0b9231cd | ||
|
3b177bedf8 | ||
|
12ce719213 | ||
|
320433b1bf | ||
|
7f35e2280e | ||
|
c514d988df | ||
|
749a080397 | ||
|
b105a12505 | ||
|
abaf363ddd | ||
|
16db9d4290 | ||
|
a694b0364d | ||
|
b68835f171 | ||
|
32714c5dac | ||
|
245e06f026 | ||
|
e0111d3fe6 | ||
|
a71d4223ff | ||
|
20cba6411b | ||
|
502a8112b5 | ||
|
308c6ee4da | ||
|
cae003d4fa | ||
|
b9b900e908 | ||
|
8bdba9178a | ||
|
97f11e38cd | ||
|
c4f5df0cd0 | ||
|
9ed3a6748a | ||
|
359c0354f6 | ||
|
fc77c089fa | ||
|
137a7ac48c | ||
|
42b60aef4e | ||
|
5ab7380ad1 | ||
|
afa25df1af | ||
|
5cb888328e | ||
|
78aeb94917 | ||
|
5f3e9a19ea | ||
|
420e8c001b | ||
|
c63b8a4ebc | ||
|
5f5feaed5f | ||
|
87a1f616b0 | ||
|
cc051544f9 | ||
|
85a438a40f | ||
|
877260a243 | ||
|
83d99043a8 | ||
|
6a57d25f4a | ||
|
91473e731e | ||
|
1d91ac1169 | ||
|
2850477a71 | ||
|
651b1c92c3 | ||
|
77e74eb37b | ||
|
5bb2bc7077 | ||
|
98a001a8ca | ||
|
0d75ff336d | ||
|
8567f1655e | ||
|
68b94737ed | ||
|
094c92ed85 | ||
|
42ab6deff1 | ||
|
3a257e1e00 | ||
|
2bf9a353a6 | ||
|
bbe41febf1 | ||
|
031362a633 | ||
|
4418f8bfce | ||
|
364175fa9d | ||
|
13cf2b48e1 | ||
|
e4f6694223 | ||
|
59093f1721 | ||
|
db5e79a19b | ||
|
f0b1585b52 | ||
|
50228c5970 | ||
|
b98e85016a | ||
|
bc540eefb6 | ||
|
3f1c4b4117 | ||
|
5e7689a151 | ||
|
42845cfcc0 | ||
|
caad0eca67 | ||
|
67f8ec7f87 | ||
|
d8d37a66e4 | ||
|
69db23f2f6 | ||
|
c3f6bcad56 | ||
|
ab1521bf26 | ||
|
fafe8b88c2 | ||
|
9276988ff6 | ||
|
85179edf1b | ||
|
2f1ba6cf1f | ||
|
93674b4e29 | ||
|
20851664e8 | ||
|
38c87a056c | ||
|
ad77565508 | ||
|
0e02e21967 | ||
|
1e35a6ce5e | ||
|
90b167eba1 | ||
|
5b1defad9f | ||
|
8dc1ad8168 | ||
|
126a42056d | ||
|
5866dad79a | ||
|
9dac679b72 | ||
|
12ff3abeda | ||
|
0f07fb4479 | ||
|
d9d98439b2 | ||
|
d251a30cb8 | ||
|
a2632fdcc8 | ||
|
10c818474c | ||
|
5e8279cf51 | ||
|
4c8c081c31 | ||
|
bad2baba7f | ||
|
b5da6f9c74 | ||
|
7ec999475e | ||
|
742bf85a89 | ||
|
c9c6f41aad | ||
|
b0d93df387 | ||
|
3e20892fdf | ||
|
369f8b3fe0 | ||
|
337dfba2b8 | ||
|
493687b5bb | ||
|
c7587960fb | ||
|
5c962aa899 | ||
|
3e9d2a8062 | ||
|
c2aa8a206a | ||
|
6d8ea2b6a4 | ||
|
b581e33611 | ||
|
5e43a02cd3 | ||
|
6f37d5ca5c | ||
|
3263008379 | ||
|
4588089bd6 | ||
|
44b75f0b92 | ||
|
162bd6a8c3 | ||
|
0c13603185 | ||
|
ed2a45e975 | ||
|
0fa165c606 | ||
|
fe63ab1242 | ||
|
faf808da69 | ||
|
71709cd662 | ||
|
d92040b804 | ||
|
3662fbb462 | ||
|
d89ae3ebbf | ||
|
6175fecdd8 | ||
|
fab632da62 | ||
|
c1e3b0d971 | ||
|
7b15ba31ea | ||
|
f11d4ccd45 | ||
|
fbec803129 | ||
|
0f57d1a433 | ||
|
63829b6382 | ||
|
8ac3899ddc | ||
|
59fb4ea6f8 | ||
|
92bb9bb3c3 | ||
|
1795c491a8 | ||
|
ea333c19f7 | ||
|
28ef879c07 | ||
|
10839abf24 | ||
|
9832394f8e | ||
|
dd89ea3731 | ||
|
5d9fd6dc3b | ||
|
f7c87e26db | ||
|
f98f4085bf | ||
|
543519d055 | ||
|
5a9fcd9267 | ||
|
fe2360883f | ||
|
b45ddadb09 | ||
|
a3cbe80a36 | ||
|
ee6c6266cc | ||
|
d6bd35287f | ||
|
962a29110c | ||
|
a242475b38 | ||
|
d59bf84470 | ||
|
161ee17f45 | ||
|
8aa00b0cfc | ||
|
afe89c3621 | ||
|
bdf68311b4 | ||
|
afa69f4c0e | ||
|
6fe2b24592 | ||
|
7442b356e3 | ||
|
1d7be6457f | ||
|
c9ff05ba80 | ||
|
faae184f1c | ||
|
515a8a9bbb | ||
|
58914e5c5f | ||
|
c944eaab5c | ||
|
d3d9533493 | ||
|
9c474cc089 | ||
|
3f1b0b986f | ||
|
28e08ebaf5 | ||
|
3213c03754 | ||
|
4447288a4c | ||
|
eee4e83a1e | ||
|
a67b492620 | ||
|
6062ff2748 | ||
|
3b11195caa | ||
|
9946ea111c | ||
|
7074d66f8e | ||
|
008b26f329 | ||
|
b246f0779f | ||
|
dc89218702 | ||
|
3c013b3533 | ||
|
fe0d0f08e4 | ||
|
38b5063038 | ||
|
e55481a454 | ||
|
7063a88513 | ||
|
a9bf3d0226 | ||
|
781b3aff1b | ||
|
b011b9203b | ||
|
39344fcae5 | ||
|
a046b357da | ||
|
d8e4020cec | ||
|
f80b172022 | ||
|
66fc4b536c | ||
|
1f97ccdddb | ||
|
308d6889a7 | ||
|
c3b9982c44 | ||
|
fab796e4e4 | ||
|
749db6ba82 | ||
|
12d6c4ddf5 | ||
|
430a03bb14 | ||
|
43f21fc7aa | ||
|
b27da3d1a0 | ||
|
4463a8e3b2 | ||
|
9e74ddac48 | ||
|
5f62e41d62 | ||
|
19a103d3a0 | ||
|
8fb6bc059e | ||
|
8f61a0d258 | ||
|
7fa589e430 | ||
|
6d8d826764 | ||
|
a40e84e1f6 | ||
|
4844c2123f | ||
|
236d437430 | ||
|
ae726c199b | ||
|
e7f54f005c | ||
|
e7b1ec6904 | ||
|
f4f664a4a2 | ||
|
fec52a8151 | ||
|
d8b4c1e209 | ||
|
eac853c7dd | ||
|
a04337a270 | ||
|
50d7e16365 | ||
|
ef7bc931b7 | ||
|
41de771074 | ||
|
2ebdd6c5cb | ||
|
b51cfcc753 | ||
|
91cc03dd80 | ||
|
9d673a213e | ||
|
97e789538e | ||
|
e05ff01d57 | ||
|
0748dff355 | ||
|
28d4084aa0 | ||
|
afd2ccfb4f | ||
|
057127f4de | ||
|
2937b25d6d | ||
|
419f26db87 | ||
|
be1b9c0e43 | ||
|
894d28c60b | ||
|
06cc08d9f7 | ||
|
75393c0b28 | ||
|
bdc1da70c1 | ||
|
7cef990ba6 | ||
|
a713c92530 | ||
|
1db1ec7b5e |
3
.github/ISSUE_TEMPLATE.md
vendored
@@ -28,7 +28,8 @@ To help us understand the issue, please fill-in as much of the following informa
|
||||
### Please tell us about your environment:
|
||||
|
||||
- [ ] Node-RED version:
|
||||
- [ ] node.js version:
|
||||
- [ ] Node.js version:
|
||||
- [ ] npm version:
|
||||
- [ ] Platform/OS:
|
||||
- [ ] Browser:
|
||||
- [ ] running in Docker:
|
||||
|
39
.github/ISSUE_TEMPLATE/--bug_report.md
vendored
Normal file
@@ -0,0 +1,39 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Reproducible software issues in the core of Node-RED
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
<!--
|
||||
This issue tracker is for problems with the Node-RED runtime, the editor or the core nodes.
|
||||
|
||||
If your issue is:
|
||||
- a general 'how-to' type question,
|
||||
- a feature request or suggestion for a change,
|
||||
- or problems with 3rd party (`node-red-contrib-`) nodes
|
||||
|
||||
please use the [Node-RED Forum](https://discourse.nodered.org) or [slack team](https://nodered.org/slack).
|
||||
|
||||
You could also consider asking a question on [Stack Overflow](https://stackoverflow.com/questions/tagged/node-red) and tag it `node-red`.
|
||||
|
||||
That way the whole Node-RED user community can help, rather than rely on the core development team.
|
||||
|
||||
To help us understand the issue, please fill-in as much of the following information as you can:
|
||||
-->
|
||||
|
||||
### What are the steps to reproduce?
|
||||
|
||||
### What happens?
|
||||
|
||||
### What do you expect to happen?
|
||||
|
||||
### Please tell us about your environment:
|
||||
|
||||
- [ ] Node-RED version:
|
||||
- [ ] Node.js version:
|
||||
- [ ] npm version:
|
||||
- [ ] Platform/OS:
|
||||
- [ ] Browser:
|
17
.github/ISSUE_TEMPLATE/-anything-else.md
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
---
|
||||
name: Anything Else
|
||||
about: Something that is not a bug report
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
Please DO NOT raise an issue.
|
||||
|
||||
We DO NOT use the issue tracker for general support or feature requests. Only bug reports should be raised here using the 'Bug report' template.
|
||||
|
||||
For general support, please use the [Node-RED Forum](https://discourse.nodered.org) or [slack team](https://nodered.org/slack). You could also consider asking a question on [Stack Overflow](https://stackoverflow.com/questions/tagged/node-red) and tag it `node-red`.
|
||||
That way the whole Node-RED user community can help, rather than rely on the core development team.
|
||||
|
||||
For feature requests, please use the Node-RED Forum](https://discourse.nodered.org). Many ideas have already been discussed there and you should search that for your request before starting a new discussion.
|
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -29,6 +29,6 @@ the [forum](https://discourse.nodered.org) or
|
||||
<!-- Put an `x` in the boxes that apply -->
|
||||
|
||||
- [ ] I have read the [contribution guidelines](https://github.com/node-red/node-red/blob/master/CONTRIBUTING.md)
|
||||
- [ ] For non-bugfix PRs, I have discussed this change on the mailing list/slack team.
|
||||
- [ ] For non-bugfix PRs, I have discussed this change on the forum/slack team.
|
||||
- [ ] I have run `grunt` to verify the unit tests pass
|
||||
- [ ] I have added suitable unit tests to cover the new/changed functionality
|
||||
|
29
.github/scripts/update-node-red-docker.js
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
const fs = require("fs");
|
||||
|
||||
const newVersion = require("../../package.json").version;
|
||||
|
||||
if (process.env.GITHUB_REF !== "refs/tags/"+newVersion) {
|
||||
console.log(`GITHUB_REF doesn't match the package.json version: ${process.env.GITHUB_REF} !== ${newVersion}`);
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
if (!/^\d+\.\d+\.\d+$/.test(newVersion)) {
|
||||
console.log(`Not updating for a non-stable release - ${newVersion}`);
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
const currentVersion = require("../../../node-red-docker/package.json").version;
|
||||
|
||||
console.log(`Update from ${currentVersion} to ${newVersion}`)
|
||||
|
||||
updateFile(__dirname+"/../../../node-red-docker/package.json", currentVersion, newVersion);
|
||||
updateFile(__dirname+"/../../../node-red-docker/docker-custom/package.json", currentVersion, newVersion);
|
||||
updateFile(__dirname+"/../../../node-red-docker/README.md", currentVersion, newVersion);
|
||||
|
||||
console.log(`::set-env name=newVersion::${newVersion}`);
|
||||
|
||||
function updateFile(path,from,to) {
|
||||
let contents = fs.readFileSync(path,"utf8");
|
||||
contents = contents.replace(new RegExp(from.replace(/\./g,"\\."),"g"), to);
|
||||
fs.writeFileSync(path, contents);
|
||||
}
|
40
.github/workflows/build.yml
vendored
Normal file
@@ -0,0 +1,40 @@
|
||||
name: PublishDockerImage
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
jobs:
|
||||
generate:
|
||||
name: 'Update node-red-docker image'
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Check out node-red repository
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
path: 'node-red'
|
||||
- name: Check out node-red-docker repository
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: 'node-red/node-red-docker'
|
||||
path: 'node-red-docker'
|
||||
- uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: '12'
|
||||
- run: node ./node-red/.github/scripts/update-node-red-docker.js
|
||||
id: updateFiles
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@v2
|
||||
with:
|
||||
token: ${{ secrets.NR_REPO_TOKEN }}
|
||||
committer: GitHub <noreply@github.com>
|
||||
author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
|
||||
path: 'node-red-docker'
|
||||
commit-message: 'Bump to ${{ env.newVersion }}'
|
||||
title: '🚀 Update to Node-RED ${{ env.newVersion }} release'
|
||||
body: |
|
||||
Updates the Node-RED Docker repo for the ${{ env.newVersion }} release.
|
||||
|
||||
Once this is merged, you will need to create a new release with the tag `v${{ env.newVersion }}`.
|
||||
|
||||
This PR was auto-generated by a GitHub Action. Any questions, speak to @knolleary
|
1
.gitignore
vendored
@@ -22,3 +22,4 @@ packages/node_modules/@node-red/editor-client/public
|
||||
!test/**/node_modules
|
||||
docs
|
||||
!packages/node_modules/**/docs
|
||||
.vscode
|
@@ -1,10 +1,15 @@
|
||||
sudo: false
|
||||
addons:
|
||||
chrome: stable
|
||||
language: node_js
|
||||
matrix:
|
||||
include:
|
||||
- node_js: "14"
|
||||
- node_js: "12"
|
||||
- node_js: "10"
|
||||
script:
|
||||
- ./node_modules/.bin/grunt && istanbul report text && ( cat coverage/lcov.info | $(npm get prefix)/bin/coveralls || true ) && rm -rf coverage
|
||||
- scripts/install-ui-test-dependencies.sh && grunt test-ui
|
||||
before_script:
|
||||
- npm install -g istanbul coveralls
|
||||
- node_js: "8"
|
||||
|
15
API.md
Normal file
@@ -0,0 +1,15 @@
|
||||
Node-RED Modules
|
||||
---
|
||||
|
||||
Node-RED provides a set of node modules that implement different parts of the
|
||||
application.
|
||||
|
||||
Module | Description
|
||||
-------|-------
|
||||
[node-red](node-red.html) | the main module that pulls together all of the internal modules and provides the executable version of Node-RED
|
||||
[@node-red/editor-api](@node-red_editor-api.html) | an Express application that serves the Node-RED editor and provides the Admin HTTP API
|
||||
[@node-red/runtime](@node-red_runtime.html) | the core runtime of Node-RED
|
||||
[@node-red/util](@node-red_util.html) | common utilities for the Node-RED runtime and editor modules
|
||||
@node-red/registry | the internal node registry
|
||||
@node-red/nodes | the default set of core nodes
|
||||
@node-red/editor-client | the client-side resources of the Node-RED editor application
|
1076
CHANGELOG.md
@@ -26,7 +26,7 @@ relevant nodes, press Ctrl-E and copy the flow data from the Export dialog.
|
||||
At a minimum, please include:
|
||||
|
||||
- Version of Node-RED - either release number if you downloaded a zip, or the first few lines of `git log` if you are cloning the repository directly.
|
||||
- Version of node.js - what does `node -v` say?
|
||||
- Version of Node.js - what does `node -v` say?
|
||||
|
||||
## Feature requests
|
||||
|
||||
|
125
Gruntfile.js
@@ -16,6 +16,7 @@
|
||||
|
||||
var path = require("path");
|
||||
var fs = require("fs-extra");
|
||||
var sass = require("node-sass");
|
||||
|
||||
module.exports = function(grunt) {
|
||||
|
||||
@@ -25,9 +26,13 @@ module.exports = function(grunt) {
|
||||
nodemonArgs.push(flowFile);
|
||||
}
|
||||
|
||||
var browserstack = grunt.option('browserstack');
|
||||
if (browserstack) {
|
||||
process.env.BROWSERSTACK = true;
|
||||
}
|
||||
var nonHeadless = grunt.option('non-headless');
|
||||
if (nonHeadless) {
|
||||
process.env.NODE_RED_NON_HEADLESS = 'true';
|
||||
process.env.NODE_RED_NON_HEADLESS = true;
|
||||
}
|
||||
grunt.initConfig({
|
||||
pkg: grunt.file.readJSON('package.json'),
|
||||
@@ -79,20 +84,20 @@ module.exports = function(grunt) {
|
||||
//"loopfunc": true, // allow functions to be defined in loops
|
||||
//"sub": true // don't warn that foo['bar'] should be written as foo.bar
|
||||
},
|
||||
all: [
|
||||
'Gruntfile.js',
|
||||
'red.js',
|
||||
'packages/**/*.js'
|
||||
],
|
||||
core: {
|
||||
files: {
|
||||
src: [
|
||||
'Gruntfile.js',
|
||||
'red.js',
|
||||
'packages/**/*.js',
|
||||
]
|
||||
}
|
||||
},
|
||||
// all: [
|
||||
// 'Gruntfile.js',
|
||||
// 'red.js',
|
||||
// 'packages/**/*.js'
|
||||
// ],
|
||||
// core: {
|
||||
// files: {
|
||||
// src: [
|
||||
// 'Gruntfile.js',
|
||||
// 'red.js',
|
||||
// 'packages/**/*.js',
|
||||
// ]
|
||||
// }
|
||||
// },
|
||||
nodes: {
|
||||
files: {
|
||||
src: [ 'nodes/core/*/*.js' ]
|
||||
@@ -100,7 +105,7 @@ module.exports = function(grunt) {
|
||||
},
|
||||
editor: {
|
||||
files: {
|
||||
src: [ 'editor/js/**/*.js' ]
|
||||
src: [ 'packages/node_modules/@node-red/editor-client/src/js/**/*.js' ]
|
||||
}
|
||||
},
|
||||
tests: {
|
||||
@@ -120,6 +125,7 @@ module.exports = function(grunt) {
|
||||
src: [
|
||||
// Ensure editor source files are concatenated in
|
||||
// the right order
|
||||
"packages/node_modules/@node-red/editor-client/src/js/polyfills.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/js/jquery-addons.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/js/red.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/js/events.js",
|
||||
@@ -145,17 +151,22 @@ module.exports = function(grunt) {
|
||||
"packages/node_modules/@node-red/editor-client/src/js/ui/common/tabs.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/js/ui/common/stack.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/js/ui/common/toggleButton.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/js/ui/common/colorPicker.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/js/ui/actions.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/js/ui/diff.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/js/ui/keyboard.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/js/ui/statusBar.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/js/ui/view.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/js/ui/view-tools.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/js/ui/palette.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/js/ui/tab-info.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/js/ui/tab-info-outliner.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/js/ui/tab-help.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/js/ui/tab-config.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/js/ui/tab-context.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/js/ui/palette-editor.js",
|
||||
@@ -167,8 +178,10 @@ module.exports = function(grunt) {
|
||||
"packages/node_modules/@node-red/editor-client/src/js/ui/library.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/js/ui/notifications.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/js/ui/search.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/js/ui/actionList.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/js/ui/typeSearch.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/js/ui/group.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/js/ui/userSettings.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/js/ui/projects/projects.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/js/ui/projects/projectSettings.js",
|
||||
@@ -181,22 +194,23 @@ module.exports = function(grunt) {
|
||||
vendor: {
|
||||
files: {
|
||||
"packages/node_modules/@node-red/editor-client/public/vendor/vendor.js": [
|
||||
"packages/node_modules/@node-red/editor-client/src/vendor/jquery/js/jquery-1.11.3.min.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/vendor/bootstrap/js/bootstrap.min.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/vendor/jquery/js/jquery-ui-1.10.3.custom.min.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/vendor/jquery/js/jquery-3.5.1.min.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/vendor/jquery/js/jquery-migrate-3.3.0.min.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/vendor/jquery/js/jquery-ui.min.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/vendor/jquery/js/jquery.ui.touch-punch.min.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/vendor/marked/marked.min.js",
|
||||
"node_modules/marked/marked.min.js",
|
||||
"node_modules/dompurify/dist/purify.min.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/vendor/d3/d3.v3.min.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/vendor/i18next/i18next.min.js"
|
||||
],
|
||||
"packages/node_modules/@node-red/editor-client/public/vendor/vendor.css": [
|
||||
// TODO: resolve relative resource paths in
|
||||
// bootstrap/FA/jquery
|
||||
],
|
||||
"packages/node_modules/@node-red/editor-client/public/vendor/jsonata/jsonata.min.js": [
|
||||
"packages/node_modules/@node-red/editor-client/src/vendor/i18next/i18next.min.js",
|
||||
"node_modules/jsonata/jsonata-es5.min.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/vendor/jsonata/formatter.js"
|
||||
"packages/node_modules/@node-red/editor-client/src/vendor/jsonata/formatter.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/vendor/ace/ace.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/vendor/ace/ext-language_tools.js",
|
||||
],
|
||||
// "packages/node_modules/@node-red/editor-client/public/vendor/vendor.css": [
|
||||
// // TODO: resolve relative resource paths in
|
||||
// // bootstrap/FA/jquery
|
||||
// ],
|
||||
"packages/node_modules/@node-red/editor-client/public/vendor/ace/worker-jsonata.js": [
|
||||
"node_modules/jsonata/jsonata-es5.min.js",
|
||||
"packages/node_modules/@node-red/editor-client/src/vendor/jsonata/worker-jsonata.js"
|
||||
@@ -217,15 +231,12 @@ module.exports = function(grunt) {
|
||||
sass: {
|
||||
build: {
|
||||
options: {
|
||||
implementation: sass,
|
||||
outputStyle: 'compressed'
|
||||
},
|
||||
files: [{
|
||||
dest: 'packages/node_modules/@node-red/editor-client/public/red/style.min.css',
|
||||
src: 'packages/node_modules/@node-red/editor-client/src/sass/style.scss'
|
||||
},
|
||||
{
|
||||
dest: 'packages/node_modules/@node-red/editor-client/public/vendor/bootstrap/css/bootstrap.min.css',
|
||||
src: 'packages/node_modules/@node-red/editor-client/src/vendor/bootstrap/css/bootstrap.css'
|
||||
}]
|
||||
}
|
||||
},
|
||||
@@ -277,7 +288,7 @@ module.exports = function(grunt) {
|
||||
files: [
|
||||
'packages/node_modules/@node-red/editor-client/src/js/**/*.js'
|
||||
],
|
||||
tasks: ['copy:build','concat','uglify','attachCopyright:js']
|
||||
tasks: ['copy:build','concat',/*'uglify',*/ 'attachCopyright:js']
|
||||
},
|
||||
sass: {
|
||||
files: [
|
||||
@@ -352,9 +363,7 @@ module.exports = function(grunt) {
|
||||
cwd: 'packages/node_modules/@node-red/editor-client/src/vendor',
|
||||
src: [
|
||||
'ace/**',
|
||||
//'bootstrap/css/**',
|
||||
'bootstrap/img/**',
|
||||
'jquery/css/**',
|
||||
'jquery/css/base/**',
|
||||
'font-awesome/**'
|
||||
],
|
||||
expand: true,
|
||||
@@ -438,6 +447,7 @@ module.exports = function(grunt) {
|
||||
jsdoc : {
|
||||
modules: {
|
||||
src: [
|
||||
'API.md',
|
||||
'packages/node_modules/node-red/lib/red.js',
|
||||
'packages/node_modules/@node-red/runtime/lib/index.js',
|
||||
'packages/node_modules/@node-red/runtime/lib/api/*.js',
|
||||
@@ -451,7 +461,7 @@ module.exports = function(grunt) {
|
||||
configure: './jsdoc.json'
|
||||
}
|
||||
},
|
||||
editor: {
|
||||
_editor: {
|
||||
src: [
|
||||
'packages/node_modules/@node-red/editor-client/src/js'
|
||||
],
|
||||
@@ -498,7 +508,9 @@ module.exports = function(grunt) {
|
||||
grunt.loadNpmTasks('grunt-chmod');
|
||||
grunt.loadNpmTasks('grunt-jsonlint');
|
||||
grunt.loadNpmTasks('grunt-mocha-istanbul');
|
||||
grunt.loadNpmTasks('grunt-webdriver');
|
||||
if (fs.existsSync(path.join("node_modules", "grunt-webdriver"))) {
|
||||
grunt.loadNpmTasks('grunt-webdriver');
|
||||
}
|
||||
grunt.loadNpmTasks('grunt-jsdoc');
|
||||
grunt.loadNpmTasks('grunt-jsdoc-to-markdown');
|
||||
grunt.loadNpmTasks('grunt-npm-command');
|
||||
@@ -557,12 +569,25 @@ module.exports = function(grunt) {
|
||||
});
|
||||
|
||||
grunt.registerTask('verifyUiTestDependencies', function() {
|
||||
if (!fs.existsSync(path.join("node_modules", "chromedriver"))) {
|
||||
grunt.fail.fatal('You need to run "npm install chromedriver@2" before running UI test.');
|
||||
if (!fs.existsSync(path.join("node_modules", "grunt-webdriver"))) {
|
||||
grunt.fail.fatal('You need to install the UI test dependencies first.\nUse the script in "scripts/install-ui-test-dependencies.sh"');
|
||||
return false;
|
||||
}
|
||||
});
|
||||
grunt.registerTask('generatePublishScript',
|
||||
'Generates a script to publish build output to npm',
|
||||
function () {
|
||||
const done = this.async();
|
||||
const generatePublishScript = require("./scripts/generate-publish-script.js");
|
||||
generatePublishScript().then(function(output) {
|
||||
grunt.log.writeln(output);
|
||||
|
||||
const filePath = path.join(grunt.config.get('paths.dist'),"modules","publish.sh");
|
||||
grunt.file.write(filePath,output);
|
||||
|
||||
done();
|
||||
});
|
||||
});
|
||||
grunt.registerTask('setDevEnv',
|
||||
'Sets NODE_ENV=development so non-minified assets are used',
|
||||
function () {
|
||||
@@ -581,9 +606,15 @@ module.exports = function(grunt) {
|
||||
'Runs code style check on editor code',
|
||||
['jshint:editor']);
|
||||
|
||||
grunt.registerTask('test-ui',
|
||||
'Builds editor content then runs unit tests on editor ui',
|
||||
['verifyUiTestDependencies','build','jshint:editor','webdriver:all']);
|
||||
if (!fs.existsSync(path.join("node_modules", "grunt-webdriver"))) {
|
||||
grunt.registerTask('test-ui',
|
||||
'Builds editor content then runs unit tests on editor ui',
|
||||
['verifyUiTestDependencies']);
|
||||
} else {
|
||||
grunt.registerTask('test-ui',
|
||||
'Builds editor content then runs unit tests on editor ui',
|
||||
['verifyUiTestDependencies','build','jshint:editor','webdriver:all']);
|
||||
}
|
||||
|
||||
grunt.registerTask('test-nodes',
|
||||
'Runs unit tests on core nodes',
|
||||
@@ -592,6 +623,10 @@ module.exports = function(grunt) {
|
||||
grunt.registerTask('build',
|
||||
'Builds editor content',
|
||||
['clean:build','jsonlint','concat:build','concat:vendor','copy:build','uglify:build','sass:build','attachCopyright']);
|
||||
|
||||
grunt.registerTask('build-dev',
|
||||
'Developer mode: build dev version',
|
||||
['clean:build','concat:build','concat:vendor','copy:build','sass:build','setDevEnv']);
|
||||
|
||||
grunt.registerTask('dev',
|
||||
'Developer mode: run node-red, watch for source changes and build/restart',
|
||||
@@ -599,7 +634,7 @@ module.exports = function(grunt) {
|
||||
|
||||
grunt.registerTask('release',
|
||||
'Create distribution zip file',
|
||||
['build','verifyPackageDependencies','clean:release','mkdir:release','chmod:release','compress:release','pack-modules']);
|
||||
['build','verifyPackageDependencies','clean:release','mkdir:release','chmod:release','compress:release','pack-modules','generatePublishScript']);
|
||||
|
||||
grunt.registerTask('pack-modules',
|
||||
'Create module pack files for release',
|
||||
@@ -612,5 +647,5 @@ module.exports = function(grunt) {
|
||||
|
||||
grunt.registerTask('docs',
|
||||
'Generates API documentation',
|
||||
['jsdoc','jsdoc2md']);
|
||||
['jsdoc']);
|
||||
};
|
||||
|
@@ -5,9 +5,9 @@ http://nodered.org
|
||||
[](https://travis-ci.org/node-red/node-red)
|
||||
[](https://coveralls.io/r/node-red/node-red?branch=master)
|
||||
|
||||
A visual tool for wiring the Internet of Things.
|
||||
Low-code programming for event-driven applications.
|
||||
|
||||

|
||||

|
||||
|
||||
## Quick Start
|
||||
|
||||
@@ -56,7 +56,7 @@ This project adheres to the [Contributor Covenant 1.4](http://contributor-covena
|
||||
|
||||
## Authors
|
||||
|
||||
Node-RED is a project of the [JS Foundation](http://js.foundation).
|
||||
Node-RED is a project of the [OpenJS Foundation](https://openjsf.org).
|
||||
|
||||
It was created by [IBM Emerging Technology](https://www.ibm.com/blogs/emerging-technology/).
|
||||
|
||||
@@ -67,4 +67,4 @@ It was created by [IBM Emerging Technology](https://www.ibm.com/blogs/emerging-t
|
||||
|
||||
## Copyright and license
|
||||
|
||||
Copyright JS Foundation and other contributors, http://js.foundation under [the Apache 2.0 license](LICENSE).
|
||||
Copyright JS Foundation and other contributors, https://openjsf.org under [the Apache 2.0 license](LICENSE).
|
||||
|
13
SECURITY.md
Normal file
@@ -0,0 +1,13 @@
|
||||
# Security Policy
|
||||
|
||||
## Supported Versions
|
||||
|
||||
| Version | Supported |
|
||||
| ------- | ------------------ |
|
||||
| 1.0.0 | :white_check_mark: |
|
||||
| 0.20.x | :white_check_mark: |
|
||||
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
Please report any potential security issues to `team@nodered.org`. This will notify the core project team who will respond accordingly.
|
106
package.json
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "node-red",
|
||||
"version": "0.20.0-beta.5",
|
||||
"description": "A visual tool for wiring the Internet of Things",
|
||||
"version": "1.1.2",
|
||||
"description": "Low-code programming for event-driven applications",
|
||||
"homepage": "http://nodered.org",
|
||||
"license": "Apache-2.0",
|
||||
"repository": {
|
||||
@@ -13,6 +13,8 @@
|
||||
"start": "node packages/node_modules/node-red/red.js",
|
||||
"test": "grunt",
|
||||
"build": "grunt build",
|
||||
"dev": "grunt dev",
|
||||
"build-dev": "grunt build-dev",
|
||||
"docs": "grunt docs"
|
||||
},
|
||||
"contributors": [
|
||||
@@ -24,94 +26,94 @@
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"ajv": "6.8.1",
|
||||
"ajv": "6.12.3",
|
||||
"basic-auth": "2.0.1",
|
||||
"bcryptjs": "2.4.3",
|
||||
"body-parser": "1.18.3",
|
||||
"body-parser": "1.19.0",
|
||||
"cheerio": "0.22.0",
|
||||
"clone": "2.1.2",
|
||||
"cookie": "0.3.1",
|
||||
"cookie-parser": "1.4.3",
|
||||
"content-type": "1.0.4",
|
||||
"cookie": "0.4.1",
|
||||
"cookie-parser": "1.4.5",
|
||||
"cors": "2.8.5",
|
||||
"cron": "1.6.0",
|
||||
"denque": "1.4.0",
|
||||
"express": "4.16.4",
|
||||
"express-session": "1.15.6",
|
||||
"fs-extra": "7.0.1",
|
||||
"cron": "1.7.2",
|
||||
"denque": "1.4.1",
|
||||
"express": "4.17.1",
|
||||
"express-session": "1.17.1",
|
||||
"fs-extra": "8.1.0",
|
||||
"fs.notify": "0.0.4",
|
||||
"hash-sum": "1.0.2",
|
||||
"https-proxy-agent": "2.2.1",
|
||||
"i18next": "14.1.1",
|
||||
"hash-sum": "2.0.0",
|
||||
"https-proxy-agent": "5.0.0",
|
||||
"i18next": "15.1.2",
|
||||
"iconv-lite": "0.6.2",
|
||||
"is-utf8": "0.2.1",
|
||||
"js-yaml": "3.12.1",
|
||||
"js-yaml": "3.14.0",
|
||||
"json-stringify-safe": "5.0.1",
|
||||
"jsonata": "1.6.4",
|
||||
"media-typer": "1.0.1",
|
||||
"memorystore": "1.6.0",
|
||||
"mime": "2.4.0",
|
||||
"jsonata": "1.8.3",
|
||||
"lodash.clonedeep": "^4.5.0",
|
||||
"media-typer": "1.1.0",
|
||||
"memorystore": "1.6.2",
|
||||
"mime": "2.4.6",
|
||||
"moment-timezone": "^0.5.31",
|
||||
"mqtt": "2.18.8",
|
||||
"multer": "1.4.1",
|
||||
"mustache": "3.0.1",
|
||||
"node-red-node-email": "1.0.*",
|
||||
"node-red-node-feedparser": "^0.1.14",
|
||||
"node-red-node-rbe": "0.2.*",
|
||||
"node-red-node-sentiment": "^0.1.0",
|
||||
"node-red-node-tail": "^0.0.2",
|
||||
"node-red-node-twitter": "^1.1.0",
|
||||
"nopt": "4.0.1",
|
||||
"multer": "1.4.2",
|
||||
"mustache": "4.0.1",
|
||||
"node-red-admin": "^0.2.6",
|
||||
"node-red-node-rbe": "^0.2.9",
|
||||
"node-red-node-sentiment": "^0.1.6",
|
||||
"node-red-node-tail": "^0.1.0",
|
||||
"nopt": "4.0.3",
|
||||
"oauth2orize": "1.11.0",
|
||||
"on-headers": "1.0.1",
|
||||
"passport": "0.4.0",
|
||||
"on-headers": "1.0.2",
|
||||
"passport": "0.4.1",
|
||||
"passport-http-bearer": "1.0.1",
|
||||
"passport-oauth2-client-password": "0.1.2",
|
||||
"raw-body": "2.3.3",
|
||||
"raw-body": "2.4.1",
|
||||
"request": "2.88.0",
|
||||
"semver": "5.6.0",
|
||||
"uglify-js": "3.4.9",
|
||||
"semver": "6.3.0",
|
||||
"uglify-js": "3.10.0",
|
||||
"when": "3.7.8",
|
||||
"ws": "6.1.3",
|
||||
"xml2js": "0.4.19"
|
||||
"ws": "6.2.1",
|
||||
"xml2js": "0.4.23"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"bcrypt": "~2.0.0"
|
||||
"bcrypt": "3.0.8"
|
||||
},
|
||||
"devDependencies": {
|
||||
"grunt": "~1.0.3",
|
||||
"marked": "0.8.2",
|
||||
"dompurify": "2.0.12",
|
||||
"grunt": "~1.0.4",
|
||||
"grunt-chmod": "~1.1.1",
|
||||
"grunt-cli": "~1.3.2",
|
||||
"grunt-concurrent": "~2.3.1",
|
||||
"grunt-contrib-clean": "~1.1.0",
|
||||
"grunt-contrib-compress": "~1.4.0",
|
||||
"grunt-contrib-clean": "~2.0.0",
|
||||
"grunt-contrib-compress": "~1.5.0",
|
||||
"grunt-contrib-concat": "~1.0.1",
|
||||
"grunt-contrib-copy": "~1.0.0",
|
||||
"grunt-contrib-jshint": "~1.1.0",
|
||||
"grunt-contrib-uglify": "~3.4.0",
|
||||
"grunt-contrib-jshint": "~2.1.0",
|
||||
"grunt-contrib-uglify": "~4.0.1",
|
||||
"grunt-contrib-watch": "~1.1.0",
|
||||
"grunt-jsdoc": "^2.2.1",
|
||||
"grunt-jsdoc-to-markdown": "^4.0.0",
|
||||
"grunt-jsonlint": "~1.1.0",
|
||||
"grunt-jsonlint": "~2.0.0",
|
||||
"grunt-mkdir": "~1.0.0",
|
||||
"grunt-mocha-istanbul": "5.0.2",
|
||||
"grunt-nodemon": "~0.4.2",
|
||||
"grunt-npm-command": "~0.1.2",
|
||||
"grunt-sass": "~2.0.0",
|
||||
"grunt-sass": "~3.1.0",
|
||||
"grunt-simple-mocha": "~0.4.1",
|
||||
"grunt-webdriver": "^2.0.3",
|
||||
"http-proxy": "^1.16.2",
|
||||
"http-proxy": "1.18.1",
|
||||
"istanbul": "0.4.5",
|
||||
"jsdoc-nr-template": "github:node-red/jsdoc-nr-template",
|
||||
"minami": "1.2.3",
|
||||
"mocha": "^5.2.0",
|
||||
"mosca": "^2.8.3",
|
||||
"node-red-node-test-helper": "^0.2.5",
|
||||
"node-sass": "^4.14.1",
|
||||
"should": "^8.4.0",
|
||||
"sinon": "1.17.7",
|
||||
"stoppable": "^1.1.0",
|
||||
"supertest": "3.4.2",
|
||||
"wdio-chromedriver-service": "^0.1.5",
|
||||
"wdio-mocha-framework": "^0.6.4",
|
||||
"wdio-spec-reporter": "^0.1.5",
|
||||
"webdriverio": "^4.14.1",
|
||||
"node-red-node-test-helper": "node-red/node-red-node-test-helper",
|
||||
"jsdoc-nr-template": "node-red/jsdoc-nr-template"
|
||||
"supertest": "3.4.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
|
@@ -30,7 +30,8 @@ module.exports = {
|
||||
scope: req.params.scope,
|
||||
id: req.params.id,
|
||||
key: req.params[0],
|
||||
store: req.query['store']
|
||||
store: req.query['store'],
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.context.getValue(opts).then(function(result) {
|
||||
res.json(result);
|
||||
@@ -45,7 +46,8 @@ module.exports = {
|
||||
scope: req.params.scope,
|
||||
id: req.params.id,
|
||||
key: req.params[0],
|
||||
store: req.query['store']
|
||||
store: req.query['store'],
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.context.delete(opts).then(function(result) {
|
||||
res.status(204).end();
|
||||
|
@@ -24,7 +24,8 @@ module.exports = {
|
||||
get: function(req,res) {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
id: req.params.id
|
||||
id: req.params.id,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.flows.getFlow(opts).then(function(result) {
|
||||
return res.json(result);
|
||||
@@ -35,7 +36,8 @@ module.exports = {
|
||||
post: function(req,res) {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
flow: req.body
|
||||
flow: req.body,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.flows.addFlow(opts).then(function(id) {
|
||||
return res.json({id:id});
|
||||
@@ -47,7 +49,8 @@ module.exports = {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
id: req.params.id,
|
||||
flow: req.body
|
||||
flow: req.body,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.flows.updateFlow(opts).then(function(id) {
|
||||
return res.json({id:id});
|
||||
@@ -58,7 +61,8 @@ module.exports = {
|
||||
delete: function(req,res) {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
id: req.params.id
|
||||
id: req.params.id,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.flows.deleteFlow(opts).then(function() {
|
||||
res.status(204).end();
|
||||
|
@@ -27,7 +27,8 @@ module.exports = {
|
||||
return res.status(400).json({code:"invalid_api_version", message:"Invalid API Version requested"});
|
||||
}
|
||||
var opts = {
|
||||
user: req.user
|
||||
user: req.user,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.flows.getFlows(opts).then(function(result) {
|
||||
if (version === "v1") {
|
||||
@@ -46,7 +47,8 @@ module.exports = {
|
||||
}
|
||||
var opts = {
|
||||
user: req.user,
|
||||
deploymentType: req.get("Node-RED-Deployment-Type")||"full"
|
||||
deploymentType: req.get("Node-RED-Deployment-Type")||"full",
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
|
||||
if (opts.deploymentType !== 'reload') {
|
||||
|
@@ -48,13 +48,13 @@ module.exports = {
|
||||
// Nodes
|
||||
adminApp.get("/nodes",needsPermission("nodes.read"),nodes.getAll,apiUtil.errorHandler);
|
||||
adminApp.post("/nodes",needsPermission("nodes.write"),nodes.post,apiUtil.errorHandler);
|
||||
adminApp.get(/\/nodes\/messages/,needsPermission("nodes.read"),nodes.getModuleCatalogs,apiUtil.errorHandler);
|
||||
adminApp.get(/\/nodes\/((@[^\/]+\/)?[^\/]+\/[^\/]+)\/messages/,needsPermission("nodes.read"),nodes.getModuleCatalog,apiUtil.errorHandler);
|
||||
adminApp.get(/\/nodes\/((@[^\/]+\/)?[^\/]+)$/,needsPermission("nodes.read"),nodes.getModule,apiUtil.errorHandler);
|
||||
adminApp.put(/\/nodes\/((@[^\/]+\/)?[^\/]+)$/,needsPermission("nodes.write"),nodes.putModule,apiUtil.errorHandler);
|
||||
adminApp.delete(/\/nodes\/((@[^\/]+\/)?[^\/]+)$/,needsPermission("nodes.write"),nodes.delete,apiUtil.errorHandler);
|
||||
adminApp.get(/\/nodes\/((@[^\/]+\/)?[^\/]+)\/([^\/]+)$/,needsPermission("nodes.read"),nodes.getSet,apiUtil.errorHandler);
|
||||
adminApp.put(/\/nodes\/((@[^\/]+\/)?[^\/]+)\/([^\/]+)$/,needsPermission("nodes.write"),nodes.putSet,apiUtil.errorHandler);
|
||||
adminApp.get(/^\/nodes\/messages/,needsPermission("nodes.read"),nodes.getModuleCatalogs,apiUtil.errorHandler);
|
||||
adminApp.get(/^\/nodes\/((@[^\/]+\/)?[^\/]+\/[^\/]+)\/messages/,needsPermission("nodes.read"),nodes.getModuleCatalog,apiUtil.errorHandler);
|
||||
adminApp.get(/^\/nodes\/((@[^\/]+\/)?[^\/]+)$/,needsPermission("nodes.read"),nodes.getModule,apiUtil.errorHandler);
|
||||
adminApp.put(/^\/nodes\/((@[^\/]+\/)?[^\/]+)$/,needsPermission("nodes.write"),nodes.putModule,apiUtil.errorHandler);
|
||||
adminApp.delete(/^\/nodes\/((@[^\/]+\/)?[^\/]+)$/,needsPermission("nodes.write"),nodes.delete,apiUtil.errorHandler);
|
||||
adminApp.get(/^\/nodes\/((@[^\/]+\/)?[^\/]+)\/([^\/]+)$/,needsPermission("nodes.read"),nodes.getSet,apiUtil.errorHandler);
|
||||
adminApp.put(/^\/nodes\/((@[^\/]+\/)?[^\/]+)\/([^\/]+)$/,needsPermission("nodes.write"),nodes.putSet,apiUtil.errorHandler);
|
||||
|
||||
// Context
|
||||
adminApp.get("/context/:scope(global)",needsPermission("context.read"),context.get,apiUtil.errorHandler);
|
||||
|
@@ -24,7 +24,8 @@ module.exports = {
|
||||
},
|
||||
getAll: function(req,res) {
|
||||
var opts = {
|
||||
user: req.user
|
||||
user: req.user,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
if (req.get("accept") == "application/json") {
|
||||
runtimeAPI.nodes.getNodeList(opts).then(function(list) {
|
||||
@@ -42,7 +43,9 @@ module.exports = {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
module: req.body.module,
|
||||
version: req.body.version
|
||||
version: req.body.version,
|
||||
url: req.body.url,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.nodes.addModule(opts).then(function(info) {
|
||||
res.json(info);
|
||||
@@ -54,7 +57,8 @@ module.exports = {
|
||||
delete: function(req,res) {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
module: req.params[0]
|
||||
module: req.params[0],
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.nodes.removeModule(opts).then(function() {
|
||||
res.status(204).end();
|
||||
@@ -66,7 +70,8 @@ module.exports = {
|
||||
getSet: function(req,res) {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
id: req.params[0] + "/" + req.params[2]
|
||||
id: req.params[0] + "/" + req.params[2],
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
if (req.get("accept") === "application/json") {
|
||||
runtimeAPI.nodes.getNodeInfo(opts).then(function(result) {
|
||||
@@ -87,7 +92,8 @@ module.exports = {
|
||||
getModule: function(req,res) {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
module: req.params[0]
|
||||
module: req.params[0],
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.nodes.getModuleInfo(opts).then(function(result) {
|
||||
res.send(result);
|
||||
@@ -106,7 +112,8 @@ module.exports = {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
id: req.params[0] + "/" + req.params[2],
|
||||
enabled: body.enabled
|
||||
enabled: body.enabled,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.nodes.setNodeSetState(opts).then(function(result) {
|
||||
res.send(result);
|
||||
@@ -125,7 +132,8 @@ module.exports = {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
module: req.params[0],
|
||||
enabled: body.enabled
|
||||
enabled: body.enabled,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.nodes.setModuleState(opts).then(function(result) {
|
||||
res.send(result);
|
||||
@@ -139,7 +147,8 @@ module.exports = {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
module: req.params[0],
|
||||
lang: req.query.lng
|
||||
lang: req.query.lng,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.nodes.getModuleCatalog(opts).then(function(result) {
|
||||
res.json(result);
|
||||
@@ -152,7 +161,8 @@ module.exports = {
|
||||
getModuleCatalogs: function(req,res) {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
lang: req.query.lng
|
||||
lang: req.query.lng,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.nodes.getModuleCatalogs(opts).then(function(result) {
|
||||
res.json(result);
|
||||
@@ -164,7 +174,8 @@ module.exports = {
|
||||
|
||||
getIcons: function(req,res) {
|
||||
var opts = {
|
||||
user: req.user
|
||||
user: req.user,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.nodes.getIconList(opts).then(function(list) {
|
||||
res.json(list);
|
||||
|
@@ -36,6 +36,7 @@ var log = require("@node-red/util").log; // TODO: separate module
|
||||
passport.use(strategies.bearerStrategy.BearerStrategy);
|
||||
passport.use(strategies.clientPasswordStrategy.ClientPasswordStrategy);
|
||||
passport.use(strategies.anonymousStrategy);
|
||||
passport.use(strategies.tokensStrategy);
|
||||
|
||||
var server = oauth2orize.createServer();
|
||||
|
||||
@@ -60,7 +61,7 @@ function init(_settings,storage) {
|
||||
function needsPermission(permission) {
|
||||
return function(req,res,next) {
|
||||
if (settings && settings.adminAuth) {
|
||||
return passport.authenticate(['bearer','anon'],{ session: false })(req,res,function() {
|
||||
return passport.authenticate(['bearer','tokens','anon'],{ session: false })(req,res,function() {
|
||||
if (!req.user) {
|
||||
return next();
|
||||
}
|
||||
@@ -100,7 +101,10 @@ function login(req,res) {
|
||||
}
|
||||
} else if (mergedAdminAuth.type === "strategy") {
|
||||
|
||||
var urlPrefix = (settings.httpAdminRoot==='/')?"":settings.httpAdminRoot;
|
||||
var urlPrefix = (settings.httpAdminRoot||"").replace(/\/$/,"");
|
||||
if (urlPrefix.length > 0) {
|
||||
urlPrefix += "/";
|
||||
}
|
||||
response = {
|
||||
"type":"strategy",
|
||||
"prompts":[{type:"button",label:mergedAdminAuth.strategy.label, url: urlPrefix + "auth/strategy"}]
|
||||
@@ -199,7 +203,7 @@ function genericStrategy(adminApp,strategy) {
|
||||
if (/^post$/i.test(options.callbackMethod)) {
|
||||
callbackMethodFunc = adminApp.post;
|
||||
}
|
||||
callbackMethodFunc('/auth/strategy/callback',
|
||||
callbackMethodFunc.call(adminApp,'/auth/strategy/callback',
|
||||
passport.authenticate(strategy.name, {session:false, failureRedirect: settings.httpAdminRoot }),
|
||||
completeGenerateStrategyAuth
|
||||
);
|
||||
|
@@ -123,9 +123,57 @@ AnonymousStrategy.prototype.authenticate = function(req) {
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function authenticateUserToken(req) {
|
||||
return new Promise( (resolve,reject) => {
|
||||
var token = null;
|
||||
var tokenHeader = Users.tokenHeader();
|
||||
if (Users.tokenHeader() === null) {
|
||||
// No custom user token provided. Fail the request
|
||||
reject();
|
||||
return;
|
||||
} else if (Users.tokenHeader() === 'authorization') {
|
||||
if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') {
|
||||
token = req.headers.authorization.split(' ')[1];
|
||||
}
|
||||
} else {
|
||||
token = req.headers[Users.tokenHeader()];
|
||||
}
|
||||
if (token) {
|
||||
Users.tokens(token).then(function(user) {
|
||||
if (user) {
|
||||
resolve(user);
|
||||
} else {
|
||||
reject();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
reject();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function TokensStrategy() {
|
||||
passport.Strategy.call(this);
|
||||
this.name = 'tokens';
|
||||
}
|
||||
util.inherits(TokensStrategy, passport.Strategy);
|
||||
TokensStrategy.prototype.authenticate = function(req) {
|
||||
authenticateUserToken(req).then(user => {
|
||||
this.success(user,{scope:user.permissions});
|
||||
}).catch(err => {
|
||||
this.fail(401);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
module.exports = {
|
||||
bearerStrategy: bearerStrategy,
|
||||
clientPasswordStrategy: clientPasswordStrategy,
|
||||
passwordTokenExchange: passwordTokenExchange,
|
||||
anonymousStrategy: new AnonymousStrategy()
|
||||
anonymousStrategy: new AnonymousStrategy(),
|
||||
tokensStrategy: new TokensStrategy(),
|
||||
authenticateUserToken: authenticateUserToken
|
||||
}
|
||||
|
@@ -56,7 +56,7 @@ function expireSessions() {
|
||||
}
|
||||
if (nextExpiry < Number.MAX_SAFE_INTEGER) {
|
||||
// Allow 5 seconds grace
|
||||
expiryTimeout = setTimeout(expireSessions,(nextExpiry - Date.now()) + 5000)
|
||||
expiryTimeout = setTimeout(expireSessions,Math.min(2147483647,(nextExpiry - Date.now()) + 5000))
|
||||
}
|
||||
if (modified) {
|
||||
return storage.saveSessions(sessions);
|
||||
@@ -129,7 +129,7 @@ module.exports = {
|
||||
sessions[accessToken] = session;
|
||||
|
||||
if (!expiryTimeout) {
|
||||
expiryTimeout = setTimeout(expireSessions,(accessTokenExpiresAt - Date.now()) + 5000)
|
||||
expiryTimeout = setTimeout(expireSessions,Math.min(2147483647,(accessTokenExpiresAt - Date.now()) + 5000))
|
||||
}
|
||||
|
||||
return storage.saveSessions(sessions).then(function() {
|
||||
|
@@ -59,7 +59,9 @@ function getDefaultUser() {
|
||||
var api = {
|
||||
get: get,
|
||||
authenticate: authenticate,
|
||||
default: getDefaultUser
|
||||
default: getDefaultUser,
|
||||
tokens: getDefaultUser,
|
||||
tokenHeader: null
|
||||
}
|
||||
|
||||
function init(config) {
|
||||
@@ -105,6 +107,14 @@ function init(config) {
|
||||
} else {
|
||||
api.default = getDefaultUser;
|
||||
}
|
||||
if (config.tokens && typeof config.tokens === "function") {
|
||||
api.tokens = config.tokens;
|
||||
if (config.tokenHeader && typeof config.tokenHeader === "string") {
|
||||
api.tokenHeader = config.tokenHeader.toLowerCase();
|
||||
} else {
|
||||
api.tokenHeader = "authorization";
|
||||
}
|
||||
}
|
||||
}
|
||||
function cleanUser(user) {
|
||||
if (user && user.hasOwnProperty('password')) {
|
||||
@@ -118,5 +128,7 @@ module.exports = {
|
||||
init: init,
|
||||
get: function(username) { return api.get(username).then(cleanUser)},
|
||||
authenticate: function() { return api.authenticate.apply(null, arguments) },
|
||||
default: function() { return api.default(); }
|
||||
default: function() { return api.default(); },
|
||||
tokens: function(token) { return api.tokens(token); },
|
||||
tokenHeader: function() { return api.tokenHeader }
|
||||
};
|
||||
|
@@ -21,6 +21,7 @@ var log = require("@node-red/util").log; // TODO: separate module
|
||||
var Tokens;
|
||||
var Users;
|
||||
var Permissions;
|
||||
var Strategies;
|
||||
|
||||
var server;
|
||||
var settings;
|
||||
@@ -44,6 +45,7 @@ function init(_server,_settings,_runtimeAPI) {
|
||||
Tokens.onSessionExpiry(handleSessionExpiry);
|
||||
Users = require("../auth/users");
|
||||
Permissions = require("../auth/permissions");
|
||||
Strategies = require("../auth/strategies");
|
||||
|
||||
}
|
||||
function handleSessionExpiry(session) {
|
||||
@@ -63,17 +65,18 @@ function generateSession(length) {
|
||||
return token.join("");
|
||||
}
|
||||
|
||||
function CommsConnection(ws) {
|
||||
function CommsConnection(ws, user) {
|
||||
this.session = generateSession(32);
|
||||
this.ws = ws;
|
||||
this.stack = [];
|
||||
this.user = null;
|
||||
this.user = user;
|
||||
this.lastSentTime = 0;
|
||||
var self = this;
|
||||
|
||||
log.audit({event: "comms.open"});
|
||||
log.trace("comms.open "+self.session);
|
||||
var pendingAuth = (settings.adminAuth != null);
|
||||
var preAuthed = !!user;
|
||||
var pendingAuth = !this.user && (settings.adminAuth != null);
|
||||
|
||||
if (!pendingAuth) {
|
||||
addActiveConnection(self);
|
||||
@@ -130,8 +133,16 @@ function CommsConnection(ws) {
|
||||
}
|
||||
});
|
||||
} else {
|
||||
log.audit({event: "comms.auth.fail"});
|
||||
completeConnection(null,null,false);
|
||||
Users.tokens(msg.auth).then(function(user) {
|
||||
if (user) {
|
||||
self.user = user;
|
||||
log.audit({event: "comms.auth",user:self.user});
|
||||
completeConnection(user.permissions,msg.auth,true);
|
||||
} else {
|
||||
log.audit({event: "comms.auth.fail"});
|
||||
completeConnection(null,null,false);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
} else {
|
||||
@@ -191,8 +202,8 @@ function start() {
|
||||
var commsPath = settings.httpAdminRoot || "/";
|
||||
commsPath = (commsPath.slice(0,1) != "/" ? "/":"") + commsPath + (commsPath.slice(-1) == "/" ? "":"/") + "comms";
|
||||
wsServer = new ws.Server({ noServer: true });
|
||||
wsServer.on('connection',function(ws) {
|
||||
var commsConnection = new CommsConnection(ws);
|
||||
wsServer.on('connection',function(ws, request, user) {
|
||||
var commsConnection = new CommsConnection(ws, user);
|
||||
});
|
||||
wsServer.on('error', function(err) {
|
||||
log.warn(log._("comms.error-server",{message:err.toString()}));
|
||||
@@ -201,8 +212,26 @@ function start() {
|
||||
server.on('upgrade', function upgrade(request, socket, head) {
|
||||
const pathname = url.parse(request.url).pathname;
|
||||
if (pathname === commsPath) {
|
||||
if (Users.tokenHeader() !== null && request.headers[Users.tokenHeader()]) {
|
||||
// The user has provided custom token handling. For the websocket,
|
||||
// the token could be provided in two ways:
|
||||
// - as an http header (only possible with a reverse proxy setup)
|
||||
// - passed over the connected websock in an auth packet
|
||||
// If the header is present, verify the token. If not, use the auth
|
||||
// packet over the connected socket
|
||||
//
|
||||
Strategies.authenticateUserToken(request).then(user => {
|
||||
wsServer.handleUpgrade(request, socket, head, function done(ws) {
|
||||
wsServer.emit('connection', ws, request, user);
|
||||
});
|
||||
}).catch(err => {
|
||||
log.audit({event: "comms.auth.fail"});
|
||||
socket.destroy();
|
||||
})
|
||||
return
|
||||
}
|
||||
wsServer.handleUpgrade(request, socket, head, function done(ws) {
|
||||
wsServer.emit('connection', ws, request);
|
||||
wsServer.emit('connection', ws, request, null);
|
||||
});
|
||||
}
|
||||
// Don't destroy the socket as other listeners may want to handle the
|
||||
|
@@ -25,8 +25,8 @@ var auth = require("../auth");
|
||||
var nodes = require("../admin/nodes"); // TODO: move /icons into here
|
||||
var needsPermission;
|
||||
var runtimeAPI;
|
||||
var log = require("@node-red/util").log; // TODO: separate module
|
||||
var i18n = require("@node-red/util").i18n; // TODO: separate module
|
||||
var log = require("@node-red/util").log;
|
||||
var i18n = require("@node-red/util").i18n;
|
||||
|
||||
var apiUtil = require("../util");
|
||||
|
||||
@@ -88,14 +88,13 @@ module.exports = {
|
||||
// Locales
|
||||
var locales = require("./locales");
|
||||
locales.init(runtimeAPI);
|
||||
editorApp.get(/locales\/(.+)\/?$/,locales.get,apiUtil.errorHandler);
|
||||
editorApp.get(/^\/locales\/(.+)\/?$/,locales.get,apiUtil.errorHandler);
|
||||
|
||||
// Library
|
||||
var library = require("./library");
|
||||
library.init(runtimeAPI);
|
||||
editorApp.get("/library/flows",needsPermission("library.read"),library.getAll,apiUtil.errorHandler);
|
||||
editorApp.get(/library\/([^\/]+)(?:$|\/(.*))/,needsPermission("library.read"),library.getEntry);
|
||||
editorApp.post(/library\/([^\/]+)\/(.*)/,needsPermission("library.write"),library.saveEntry);
|
||||
editorApp.get(/^\/library\/([^\/]+)\/([^\/]+)(?:$|\/(.*))/,needsPermission("library.read"),library.getEntry);
|
||||
editorApp.post(/^\/library\/([^\/]+)\/([^\/]+)\/(.*)/,needsPermission("library.write"),library.saveEntry);
|
||||
|
||||
|
||||
// Credentials
|
||||
|
@@ -25,23 +25,12 @@ module.exports = {
|
||||
init: function(_runtimeAPI) {
|
||||
runtimeAPI = _runtimeAPI;
|
||||
},
|
||||
|
||||
getAll: function(req,res) {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
type: 'flows'
|
||||
}
|
||||
runtimeAPI.library.getEntries(opts).then(function(result) {
|
||||
res.json(result);
|
||||
}).catch(function(err) {
|
||||
apiUtils.rejectHandler(req,res,err);
|
||||
});
|
||||
},
|
||||
getEntry: function(req,res) {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
type: req.params[0],
|
||||
path: req.params[1]||""
|
||||
library: req.params[0],
|
||||
type: req.params[1],
|
||||
path: req.params[2]||""
|
||||
}
|
||||
runtimeAPI.library.getEntry(opts).then(function(result) {
|
||||
if (typeof result === "string") {
|
||||
@@ -62,8 +51,9 @@ module.exports = {
|
||||
saveEntry: function(req,res) {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
type: req.params[0],
|
||||
path: req.params[1]||""
|
||||
library: req.params[0],
|
||||
type: req.params[1],
|
||||
path: req.params[2]||""
|
||||
}
|
||||
// TODO: horrible inconsistencies between flows and all other types
|
||||
if (opts.type === "flows") {
|
||||
|
@@ -15,7 +15,7 @@
|
||||
**/
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
//var apiUtil = require('../util');
|
||||
// var apiUtil = require('../util');
|
||||
|
||||
var i18n = require("@node-red/util").i18n; // TODO: separate module
|
||||
|
||||
@@ -41,7 +41,7 @@ module.exports = {
|
||||
var namespace = req.params[0];
|
||||
var lngs = req.query.lng;
|
||||
namespace = namespace.replace(/\.json$/,"");
|
||||
var lang = req.query.lng; //apiUtil.determineLangFromHeaders(req.acceptsLanguages() || []);
|
||||
var lang = req.query.lng || i18n.defaultLang; //apiUtil.determineLangFromHeaders(req.acceptsLanguages() || []);
|
||||
var prevLang = i18n.i.language;
|
||||
// Trigger a load from disk of the language if it is not the default
|
||||
i18n.i.changeLanguage(lang, function(){
|
||||
|
@@ -22,7 +22,8 @@ var needsPermission = require("../auth").needsPermission;
|
||||
|
||||
function listProjects(req,res) {
|
||||
var opts = {
|
||||
user: req.user
|
||||
user: req.user,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.projects.listProjects(opts).then(function(result) {
|
||||
res.json(result);
|
||||
@@ -33,7 +34,8 @@ function listProjects(req,res) {
|
||||
function getProject(req,res) {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
id: req.params.id
|
||||
id: req.params.id,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.projects.getProject(opts).then(function(data) {
|
||||
if (data) {
|
||||
@@ -49,7 +51,8 @@ function getProjectStatus(req,res) {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
id: req.params.id,
|
||||
remote: req.query.remote
|
||||
remote: req.query.remote,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.projects.getStatus(opts).then(function(data){
|
||||
if (data) {
|
||||
@@ -64,7 +67,8 @@ function getProjectStatus(req,res) {
|
||||
function getProjectRemotes(req,res) {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
id: req.params.id
|
||||
id: req.params.id,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.projects.getRemotes(opts).then(function(data) {
|
||||
res.json(data);
|
||||
@@ -98,7 +102,8 @@ module.exports = {
|
||||
app.post("/", needsPermission("projects.write"), function(req,res) {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
project: req.body
|
||||
project: req.body,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.projects.createProject(opts).then(function(result) {
|
||||
res.json(result);
|
||||
@@ -112,7 +117,8 @@ module.exports = {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
id: req.params.id,
|
||||
project: req.body
|
||||
project: req.body,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
|
||||
if (req.body.active) {
|
||||
@@ -150,7 +156,8 @@ module.exports = {
|
||||
app.delete("/:id", needsPermission("projects.write"), function(req,res) {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
id: req.params.id
|
||||
id: req.params.id,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.projects.deleteProject(opts).then(function() {
|
||||
res.status(204).end();
|
||||
@@ -168,7 +175,8 @@ module.exports = {
|
||||
app.get("/:id/files", needsPermission("projects.read"), function(req,res) {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
id: req.params.id
|
||||
id: req.params.id,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.projects.getFiles(opts).then(function(data) {
|
||||
res.json(data);
|
||||
@@ -185,7 +193,8 @@ module.exports = {
|
||||
user: req.user,
|
||||
id: req.params.id,
|
||||
path: req.params[0],
|
||||
tree: req.params.treeish
|
||||
tree: req.params.treeish,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.projects.getFile(opts).then(function(data) {
|
||||
res.json({content:data});
|
||||
@@ -199,7 +208,8 @@ module.exports = {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
id: req.params.id,
|
||||
path: req.params[0]
|
||||
path: req.params[0],
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
|
||||
runtimeAPI.projects.revertFile(opts).then(function() {
|
||||
@@ -214,7 +224,8 @@ module.exports = {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
id: req.params.id,
|
||||
path: req.params[0]
|
||||
path: req.params[0],
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.projects.stageFile(opts).then(function() {
|
||||
getProjectStatus(req,res);
|
||||
@@ -228,7 +239,8 @@ module.exports = {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
id: req.params.id,
|
||||
path: req.body.files
|
||||
path: req.body.files,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.projects.stageFile(opts).then(function() {
|
||||
getProjectStatus(req,res);
|
||||
@@ -242,7 +254,8 @@ module.exports = {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
id: req.params.id,
|
||||
message: req.body.message
|
||||
message: req.body.message,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.projects.commit(opts).then(function() {
|
||||
getProjectStatus(req,res);
|
||||
@@ -256,7 +269,8 @@ module.exports = {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
id: req.params.id,
|
||||
path: req.params[0]
|
||||
path: req.params[0],
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.projects.unstageFile(opts).then(function() {
|
||||
getProjectStatus(req,res);
|
||||
@@ -269,7 +283,8 @@ module.exports = {
|
||||
app.delete("/:id/stage", needsPermission("projects.write"), function(req, res) {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
id: req.params.id
|
||||
id: req.params.id,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.projects.unstageFile(opts).then(function() {
|
||||
getProjectStatus(req,res);
|
||||
@@ -284,7 +299,8 @@ module.exports = {
|
||||
user: req.user,
|
||||
id: req.params.id,
|
||||
path: req.params[0],
|
||||
type: req.params.type
|
||||
type: req.params.type,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.projects.getFileDiff(opts).then(function(data) {
|
||||
res.json({
|
||||
@@ -301,7 +317,8 @@ module.exports = {
|
||||
user: req.user,
|
||||
id: req.params.id,
|
||||
limit: req.query.limit || 20,
|
||||
before: req.query.before
|
||||
before: req.query.before,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.projects.getCommits(opts).then(function(data) {
|
||||
res.json(data);
|
||||
@@ -315,7 +332,8 @@ module.exports = {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
id: req.params.id,
|
||||
sha: req.params.sha
|
||||
sha: req.params.sha,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.projects.getCommit(opts).then(function(data) {
|
||||
res.json({commit:data});
|
||||
@@ -330,7 +348,8 @@ module.exports = {
|
||||
user: req.user,
|
||||
id: req.params.id,
|
||||
remote: req.params[0],
|
||||
track: req.query.u
|
||||
track: req.query.u,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.projects.push(opts).then(function(data) {
|
||||
res.status(204).end();
|
||||
@@ -346,7 +365,8 @@ module.exports = {
|
||||
id: req.params.id,
|
||||
remote: req.params[0],
|
||||
track: req.query.setUpstream,
|
||||
allowUnrelatedHistories: req.query.allowUnrelatedHistories
|
||||
allowUnrelatedHistories: req.query.allowUnrelatedHistories,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.projects.pull(opts).then(function(data) {
|
||||
res.status(204).end();
|
||||
@@ -359,7 +379,8 @@ module.exports = {
|
||||
app.delete("/:id/merge", needsPermission("projects.write"), function(req, res) {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
id: req.params.id
|
||||
id: req.params.id,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.projects.abortMerge(opts).then(function() {
|
||||
res.status(204).end();
|
||||
@@ -374,7 +395,8 @@ module.exports = {
|
||||
user: req.user,
|
||||
id: req.params.id,
|
||||
path: req.params[0],
|
||||
resolution: req.body.resolutions
|
||||
resolution: req.body.resolutions,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.projects.resolveMerge(opts).then(function() {
|
||||
res.status(204).end();
|
||||
@@ -388,7 +410,8 @@ module.exports = {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
id: req.params.id,
|
||||
remote: false
|
||||
remote: false,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.projects.getBranches(opts).then(function(data) {
|
||||
res.json(data);
|
||||
@@ -403,7 +426,8 @@ module.exports = {
|
||||
user: req.user,
|
||||
id: req.params.id,
|
||||
branch: req.params.branchName,
|
||||
force: !!req.query.force
|
||||
force: !!req.query.force,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.projects.deleteBranch(opts).then(function(data) {
|
||||
res.status(204).end();
|
||||
@@ -417,7 +441,8 @@ module.exports = {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
id: req.params.id,
|
||||
remote: true
|
||||
remote: true,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.projects.getBranches(opts).then(function(data) {
|
||||
res.json(data);
|
||||
@@ -431,7 +456,8 @@ module.exports = {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
id: req.params.id,
|
||||
branch: req.params[0]
|
||||
branch: req.params[0],
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.projects.getBranchStatus(opts).then(function(data) {
|
||||
res.json(data);
|
||||
@@ -446,7 +472,8 @@ module.exports = {
|
||||
user: req.user,
|
||||
id: req.params.id,
|
||||
branch: req.body.name,
|
||||
create: req.body.create
|
||||
create: req.body.create,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.projects.setBranch(opts).then(function(data) {
|
||||
res.json(data);
|
||||
@@ -463,7 +490,8 @@ module.exports = {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
id: req.params.id,
|
||||
remote: req.body
|
||||
remote: req.body,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
if (/^https?:\/\/[^/]+@/i.test(req.body.url)) {
|
||||
res.status(400).json({error:"unexpected_error", message:"Git http url must not include username/password"});
|
||||
@@ -481,7 +509,8 @@ module.exports = {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
id: req.params.id,
|
||||
remote: req.params.remoteName
|
||||
remote: req.params.remoteName,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.projects.removeRemote(opts).then(function(data) {
|
||||
getProjectRemotes(req,res);
|
||||
@@ -497,7 +526,8 @@ module.exports = {
|
||||
var opts = {
|
||||
user: req.user,
|
||||
id: req.params.id,
|
||||
remote: remote
|
||||
remote: remote,
|
||||
req: apiUtils.getRequestLogObject(req)
|
||||
}
|
||||
runtimeAPI.projects.updateRemote(opts).then(function() {
|
||||
res.status(204).end();
|
||||
|
@@ -19,6 +19,8 @@ var sshkeys = require("./sshkeys");
|
||||
var theme = require("./theme");
|
||||
var clone = require("clone");
|
||||
|
||||
var i18n = require("@node-red/util").i18n
|
||||
|
||||
function extend(target, source) {
|
||||
var keys = Object.keys(source);
|
||||
var i = keys.length;
|
||||
@@ -53,12 +55,14 @@ module.exports = {
|
||||
user: req.user
|
||||
}
|
||||
runtimeAPI.settings.getRuntimeSettings(opts).then(function(result) {
|
||||
result.editorTheme = result.editorTheme||{};
|
||||
var themeSettings = theme.settings();
|
||||
if (themeSettings) {
|
||||
// result.editorTheme may already exist with the palette
|
||||
// disabled. Need to merge that into the receive settings
|
||||
result.editorTheme = extend(clone(themeSettings),result.editorTheme||{});
|
||||
result.editorTheme = extend(clone(themeSettings),result.editorTheme);
|
||||
}
|
||||
result.editorTheme.languages = i18n.availableLanguages("editor");
|
||||
res.json(result);
|
||||
});
|
||||
},
|
||||
|
@@ -28,7 +28,7 @@ var defaultContext = {
|
||||
},
|
||||
header: {
|
||||
title: "Node-RED",
|
||||
image: "red/images/node-red.png"
|
||||
image: "red/images/node-red.svg"
|
||||
},
|
||||
asset: {
|
||||
red: (process.env.NODE_ENV == "development")? "red/red.js":"red/red.min.js",
|
||||
@@ -169,6 +169,9 @@ module.exports = {
|
||||
}
|
||||
}
|
||||
}
|
||||
themeApp.get("/", function(req,res) {
|
||||
res.json(themeContext);
|
||||
})
|
||||
|
||||
if (theme.hasOwnProperty("menu")) {
|
||||
themeSettings.menu = theme.menu;
|
||||
|
@@ -25,7 +25,7 @@ var theme = require("./theme");
|
||||
|
||||
var runtimeAPI;
|
||||
var editorClientDir = path.dirname(require.resolve("@node-red/editor-client"));
|
||||
var defaultNodeIcon = path.join(editorClientDir,"public","red","images","icons","arrow-in.png");
|
||||
var defaultNodeIcon = path.join(editorClientDir,"public","red","images","icons","arrow-in.svg");
|
||||
var editorTemplatePath = path.join(editorClientDir,"templates","index.mst");
|
||||
var editorTemplate;
|
||||
|
||||
|
@@ -42,7 +42,7 @@ var editor;
|
||||
/**
|
||||
* Initialise the module.
|
||||
* @param {Object} settings The runtime settings
|
||||
* @param {HTTPServer} server An instance of HTTP Server
|
||||
* @param {HTTPServer} _server An instance of HTTP Server
|
||||
* @param {Storage} storage An instance of Node-RED Storage
|
||||
* @param {Runtime} runtimeAPI An instance of Node-RED Runtime
|
||||
* @memberof @node-red/editor-api
|
||||
@@ -59,6 +59,12 @@ function init(settings,_server,storage,runtimeAPI) {
|
||||
});
|
||||
adminApp.use(corsHandler);
|
||||
|
||||
if (settings.httpAdminMiddleware) {
|
||||
if (typeof settings.httpAdminMiddleware === "function") {
|
||||
adminApp.use(settings.httpAdminMiddleware)
|
||||
}
|
||||
}
|
||||
|
||||
auth.init(settings,storage);
|
||||
|
||||
var maxApiRequestSize = settings.apiMaxLength || '5mb';
|
||||
|
@@ -43,9 +43,22 @@ module.exports = {
|
||||
rejectHandler: function(req,res,err) {
|
||||
//TODO: why this when errorHandler also?!
|
||||
log.audit({event: "api.error",error:err.code||"unexpected_error",message:err.message||err.toString()},req);
|
||||
res.status(err.status||400).json({
|
||||
var response = {
|
||||
code: err.code||"unexpected_error",
|
||||
message: err.message||err.toString()
|
||||
});
|
||||
};
|
||||
// Handle auth failures on a specific remote
|
||||
// TODO: don't hardcode this here - allow users of rejectHandler to identify extra props to send
|
||||
if (err.remote) {
|
||||
response.remote = err.remote;
|
||||
}
|
||||
res.status(err.status||400).json(response);
|
||||
},
|
||||
getRequestLogObject: function(req) {
|
||||
return {
|
||||
user: req.user,
|
||||
path: req.path,
|
||||
ip: (req.headers && req.headers['x-forwarded-for']) || (req.connection && req.connection.remoteAddress) || undefined
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@node-red/editor-api",
|
||||
"version": "0.20.0-beta.5",
|
||||
"version": "1.1.2",
|
||||
"license": "Apache-2.0",
|
||||
"main": "./lib/index.js",
|
||||
"repository": {
|
||||
@@ -16,22 +16,25 @@
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"@node-red/util": "0.20.0-beta.5",
|
||||
"@node-red/editor-client": "0.20.0-beta.5",
|
||||
"@node-red/util": "1.1.2",
|
||||
"@node-red/editor-client": "1.1.2",
|
||||
"bcryptjs": "2.4.3",
|
||||
"body-parser": "1.18.3",
|
||||
"body-parser": "1.19.0",
|
||||
"clone": "2.1.2",
|
||||
"cors": "2.8.5",
|
||||
"express-session": "1.15.6",
|
||||
"express": "4.16.4",
|
||||
"memorystore": "1.6.0",
|
||||
"mime": "2.4.0",
|
||||
"mustache": "3.0.1",
|
||||
"express-session": "1.17.1",
|
||||
"express": "4.17.1",
|
||||
"memorystore": "1.6.2",
|
||||
"mime": "2.4.6",
|
||||
"mustache": "4.0.1",
|
||||
"oauth2orize": "1.11.0",
|
||||
"passport-http-bearer": "1.0.1",
|
||||
"passport-oauth2-client-password": "0.1.2",
|
||||
"passport": "0.4.0",
|
||||
"passport": "0.4.1",
|
||||
"when": "3.7.8",
|
||||
"ws": "6.1.3"
|
||||
"ws": "6.2.1"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"bcrypt": "3.0.6"
|
||||
}
|
||||
}
|
||||
|
@@ -26,8 +26,7 @@
|
||||
"status" : "Status",
|
||||
"enabled" : "Aktiviert",
|
||||
"disabled" : "Inaktiviert",
|
||||
"info" : "Beschreibung",
|
||||
"tip" : "Beschreibung akzeptiert Markdown und wird auf der Registerkarte Info angezeigt."
|
||||
"info" : "Beschreibung"
|
||||
},
|
||||
"menu" : {
|
||||
"label" : {
|
||||
@@ -35,11 +34,11 @@
|
||||
"view" : "Ansicht",
|
||||
"grid" : "Gitter",
|
||||
"showGrid" : "Raster anzeigen",
|
||||
"snapGrid" : "Einrasten am Raster",
|
||||
"snapGrid" : "Am Raster ausrichten",
|
||||
"gridSize" : "Rastergröße",
|
||||
"textDir" : "Textrichtung",
|
||||
"defaultDir" : "Standard",
|
||||
"ltr" : "Links-nach-rechts",
|
||||
"ltr" : "Von links nach rechts",
|
||||
"rtl" : "Von rechts nach links",
|
||||
"auto" : "Kontextuell"
|
||||
},
|
||||
@@ -48,24 +47,21 @@
|
||||
},
|
||||
"settings" : "Einstellungen",
|
||||
"userSettings" : "Benutzereinstellungen",
|
||||
"nodes" : "Knoten",
|
||||
"displayStatus" : "Knotenstatus anzeigen",
|
||||
"displayConfig" : "Konfigurationsknoten",
|
||||
"nodes" : "Nodes",
|
||||
"displayStatus" : "Nodestatus anzeigen",
|
||||
"displayConfig" : "Konfigurations-Node",
|
||||
"import" : "Import",
|
||||
"export" : "Exportieren",
|
||||
"search" : "Flows durchsuchen",
|
||||
"searchInput" : "durchsuchen Sie Ihre Flows",
|
||||
"clipboard" : "Zwischenablage",
|
||||
"library" : "Bibliothek",
|
||||
"examples" : "Beispiele",
|
||||
"searchInput" : "Flows durchsuchen",
|
||||
"subflows" : "Subflow",
|
||||
"createSubflow" : "Subflow erstellen",
|
||||
"selectionToSubflow" : "Auswahl für Subflow",
|
||||
"selectionToSubflow" : "Auswahl zu Subflow",
|
||||
"flows" : "Flows",
|
||||
"add" : "Hinzufügen",
|
||||
"rename" : "Umbenennen",
|
||||
"delete" : "Löschen",
|
||||
"keyboardShortcuts" : "Tastaturkurzbefehle",
|
||||
"keyboardShortcuts" : "Tastenkürzel",
|
||||
"login" : "Anmelden",
|
||||
"logout" : "Abmelden",
|
||||
"editPalette" : "Palette verwalten",
|
||||
@@ -87,17 +83,17 @@
|
||||
"notAuthorized" : "Keine Berechtigung",
|
||||
"errors" : {
|
||||
"settings" : "Sie müssen angemeldet sein, um auf die Einstellungen zuzugreifen.",
|
||||
"deploy" : "Sie müssen angemeldet sein, um Änderungen implementieren zu können.",
|
||||
"deploy" : "Sie müssen angemeldet sein, um Änderungen anwenden zu können.",
|
||||
"notAuthorized" : "Sie müssen angemeldet sein, um diese Aktion ausführen zu können."
|
||||
}
|
||||
},
|
||||
"notification" : {
|
||||
"warning" : "<strong> Warnung </strong>: __message__",
|
||||
"warnings" : {
|
||||
"undeployedChanges" : "Knoten hat nicht implementierte Änderungen",
|
||||
"nodeActionDisabled" : "In Subflow inaktivierte Knotenaktionen",
|
||||
"missing-types" : "<p> Die Flows wurden aufgrund fehlender Knotentypen gestoppt. </p>",
|
||||
"restartRequired" : "Knoten-RED muss erneut gestartet werden, damit aufgerüstete Module aktiviert werden können",
|
||||
"undeployedChanges" : "Node hat nicht implementierte Änderungen",
|
||||
"nodeActionDisabled" : "In Subflow inaktivierte Nodeaktionen",
|
||||
"missing-types" : "<p> Die Flows wurden aufgrund fehlender Nodetypen gestoppt. </p>",
|
||||
"restartRequired" : "Node-RED muss erneut gestartet werden, damit aufgerüstete Module aktiviert werden können",
|
||||
"credentials_load_failed" : "<p> Die Flows wurden gestoppt, da die Berechtigungsnachweise nicht entschlüsselt werden konnten. </p> <p> Die Datei mit dem Datenflowberechtigungsnachweis ist verschlüsselt, aber der Verschlüsselungsschlüssel des Projekts fehlt oder ist ungültig. </p>",
|
||||
"credentials_load_failed_reset" : "<p> Die Berechtigungsnachweise konnten nicht entschlüsselt werden </p> <p> Die Datei mit dem Flow-Berechtigungsnachweis ist verschlüsselt, aber der Chiffrierschlüssel des Projekts fehlt oder ist ungültig. </p> <p> Die Datei des Flow-Berechtigungsnachweises wird bei der nächsten Implementierung zurückgesetzt. Alle vorhandenen Datenflowberechtigungsnachweise werden gelöscht. </p>",
|
||||
"missing_flow_file" : "<p> Die Projektflowdatei wurde nicht gefunden. </p> <p> Das Projekt ist nicht mit einer Flow-Datei konfiguriert. </p>",
|
||||
@@ -136,19 +132,19 @@
|
||||
}
|
||||
},
|
||||
"clipboard" : {
|
||||
"nodes" : "Knoten",
|
||||
"selectNodes" : "Wählen Sie den Text oben aus, und kopieren Sie die Datei in die Zwischenablage.",
|
||||
"pasteNodes" : "Knoten hier einfügen",
|
||||
"importNodes" : "Knoten importieren",
|
||||
"exportNodes" : "Knoten in Zwischenablage exportieren",
|
||||
"clipboard" : "Zwischenablage",
|
||||
"nodes" : "Nodes",
|
||||
"pasteNodes" : "Nodes hier einfügen",
|
||||
"importNodes" : "Nodes importieren",
|
||||
"exportNodes" : "Nodes in Zwischenablage exportieren",
|
||||
"importUnrecognised" : "Importierter Typ nicht erkannt:",
|
||||
"importUnrecognised_plural" : "Importierte Typen nicht erkannt:",
|
||||
"nodesExported" : "Knoten, die in die Zwischenablage exportiert wurden",
|
||||
"nodeCopied" : "__count__ Knoten kopiert",
|
||||
"nodeCopied_plural" : "__count__ Knoten kopiert",
|
||||
"nodesExported" : "Nodes, die in die Zwischenablage exportiert wurden",
|
||||
"nodeCopied" : "__count__ Node kopiert",
|
||||
"nodeCopied_plural" : "__count__ Nodes kopiert",
|
||||
"invalidFlow" : "Ungültiger Nachrichtenflow: __message__",
|
||||
"export" : {
|
||||
"selected" : "Ausgewählte Knoten",
|
||||
"selected" : "Ausgewählte Nodes",
|
||||
"current" : "Aktueller Flow",
|
||||
"all" : "alle Flows",
|
||||
"compact" : "kompakt",
|
||||
@@ -164,16 +160,16 @@
|
||||
"copyMessageValue_truncated" : "Abgeschnittene Wert kopiert"
|
||||
},
|
||||
"deploy" : {
|
||||
"deploy" : "Implementieren",
|
||||
"deploy" : "deploy",
|
||||
"full" : "Voll",
|
||||
"fullDesc" : "Implementiert alles im Arbeitsbereich",
|
||||
"modifiedFlows" : "Geänderte Flows",
|
||||
"modifiedFlowsDesc" : "Implementiert nur Flows, die geänderte Knoten enthalten.",
|
||||
"modifiedNodes" : "Geänderte Knoten",
|
||||
"modifiedNodesDesc" : "Implementiert nur Knoten, die sich geändert haben.",
|
||||
"modifiedFlowsDesc" : "Implementiert nur Flows, die geänderte Nodes enthalten.",
|
||||
"modifiedNodes" : "Geänderte Nodes",
|
||||
"modifiedNodesDesc" : "Implementiert nur Nodes, die sich geändert haben.",
|
||||
"successfulDeploy" : "Erfolgreich implementiert",
|
||||
"deployFailed" : "Implementieren fehlgeschlagen: __message__",
|
||||
"unusedConfigNodes" : "Sie haben einige nicht verwendete Konfigurationsknoten.",
|
||||
"deployFailed" : "Deploy fehlgeschlagen: __message__",
|
||||
"unusedConfigNodes" : "Sie haben einige nicht verwendete Konfigurations-Nodes.",
|
||||
"unusedConfigNodesLink" : "Klicken Sie hier, um sie zu sehen",
|
||||
"errors" : {
|
||||
"noResponse" : "Keine Antwort vom Server"
|
||||
@@ -181,16 +177,16 @@
|
||||
"confirm" : {
|
||||
"button" : {
|
||||
"ignore" : "Ignorieren",
|
||||
"confirm" : "Implementieren bestätigen",
|
||||
"confirm" : "Deploy bestätigen",
|
||||
"review" : "Änderungen prüfen",
|
||||
"cancel" : "Abbrechen",
|
||||
"merge" : "Zusammenführen",
|
||||
"overwrite" : "Ignorieren & implementieren"
|
||||
"overwrite" : "Ignorieren & deployen"
|
||||
},
|
||||
"undeployedChanges" : "Sie haben nicht implementierte Änderungen.\n\nWenn Sie diese Seite verlassen, gehen diese Änderungen verloren.",
|
||||
"improperlyConfigured" : "Der Arbeitsbereich enthält einige Knoten, die nicht ordnungsgemäß konfiguriert sind:",
|
||||
"unknown" : "Der Arbeitsbereich enthält einige unbekannte Knotentypen:",
|
||||
"confirm" : "Sind Sie sicher, dass Sie implementieren möchten?",
|
||||
"improperlyConfigured" : "Der Arbeitsbereich enthält einige Nodes, die nicht ordnungsgemäß konfiguriert sind:",
|
||||
"unknown" : "Der Arbeitsbereich enthält einige unbekannte Node-Typen:",
|
||||
"confirm" : "Sind Sie sicher, dass Sie deployen möchten?",
|
||||
"doNotWarn" : "warnen Sie nicht noch einmal.",
|
||||
"conflict" : "Auf dem Server wird eine aktuellere Gruppe von Datenflüssen ausgeführt.",
|
||||
"backgroundUpdate" : "Die Datenflüsse auf dem Server wurden aktualisiert.",
|
||||
@@ -203,7 +199,7 @@
|
||||
"diff" : {
|
||||
"unresolvedCount" : "__count__ unaufgelöster Konflikt",
|
||||
"unresolvedCount_plural" : "__count__ unaufgelöste Konflikte",
|
||||
"globalNodes" : "Globale Knoten",
|
||||
"globalNodes" : "Globale Nodes",
|
||||
"flowProperties" : "Flow-Eigenschaften",
|
||||
"type" : {
|
||||
"added" : "hinzugefügt",
|
||||
@@ -215,13 +211,13 @@
|
||||
"movedTo" : "verschoben zu __id__",
|
||||
"movedFrom" : "verschoben von __id__"
|
||||
},
|
||||
"nodeCount" : "__count__, Knoten",
|
||||
"nodeCount_plural" : "__count__-Knoten",
|
||||
"nodeCount" : "__count__, Node",
|
||||
"nodeCount_plural" : "__count__-Nodes",
|
||||
"local" : "Lokale Änderungen",
|
||||
"remote" : "Ferne Änderungen",
|
||||
"reviewChanges" : "Änderungen prüfen",
|
||||
"noBinaryFileShowed" : "Der Inhalt der Binärdatei kann nicht angezeigt",
|
||||
"viewCommitDiff" : "Änderungen festschreiben",
|
||||
"viewCommitDiff" : "Änderungen committen",
|
||||
"compareChanges" : "Änderungen vergleichen",
|
||||
"saveConflict" : "Konfliktlösung speichern",
|
||||
"conflictHeader" : "<span> __resolved__ </span> von <span> __unresolved__ </span> -Konflikten behoben",
|
||||
@@ -230,8 +226,8 @@
|
||||
"newVersionError" : "Neue Version enthält keine gültige JSON-Datei:"
|
||||
},
|
||||
"subflow" : {
|
||||
"editSubflow" : "Flowschablone bearbeiten: __name__",
|
||||
"edit" : "Flowsschablone bearbeiten",
|
||||
"editSubflow" : "Subflow bearbeiten: __name__",
|
||||
"edit" : "Subflow bearbeiten",
|
||||
"subflowInstances" : "Es ist __count__ Instanz dieser Subflow-Vorlage vorhanden.",
|
||||
"subflowInstances_plural" : "Es gibt __count__ Instanzen dieser Subflow-Vorlage.",
|
||||
"editSubflowProperties" : "Eigenschaften bearbeiten",
|
||||
@@ -240,9 +236,8 @@
|
||||
"deleteSubflow" : "Subflow löschen",
|
||||
"info" : "Beschreibung",
|
||||
"category" : "Kategorie",
|
||||
"format" : "Markdown-Format",
|
||||
"errors" : {
|
||||
"noNodesSelected" : "<strong> Subflow kann nicht erstellt werden </strong>: Es wurden keine Knoten ausgewählt.",
|
||||
"noNodesSelected" : "<strong> Subflow kann nicht erstellt werden </strong>: Es wurden keine Nodes ausgewählt.",
|
||||
"multipleInputsToSelection" : "<strong> Subflow kann nicht erstellt werden </strong>: Mehrere Eingaben zur Auswahl"
|
||||
}
|
||||
},
|
||||
@@ -252,13 +247,13 @@
|
||||
"configUpdate" : "Aktualisieren",
|
||||
"configDelete" : "Löschen",
|
||||
"nodesUse" : "__count__node verwendet diese Konfiguration",
|
||||
"nodesUse_plural" : "__count__ -Knoten verwenden diese Konfiguration",
|
||||
"addNewConfig" : "Neuen __type__config-Knoten hinzufügen",
|
||||
"editNode" : "__type__ Knoten bearbeiten",
|
||||
"editConfig" : "__type__config-Knoten bearbeiten",
|
||||
"nodesUse_plural" : "__count__ -Nodes verwenden diese Konfiguration",
|
||||
"addNewConfig" : "Neuen __type__config-Node hinzufügen",
|
||||
"editNode" : "__type__ Node bearbeiten",
|
||||
"editConfig" : "__type__config-Node bearbeiten",
|
||||
"addNewType" : "Neuen __type__ hinzufügen ...",
|
||||
"nodeProperties" : "Knoteneigenschaften",
|
||||
"portLabels" : "Knoteneinstellungen",
|
||||
"nodeProperties" : "Node-Eigenschaften",
|
||||
"portLabels" : "Node-Einstellungen",
|
||||
"labelInputs" : "Eingänge",
|
||||
"labelOutputs" : "Ausgänge",
|
||||
"settingIcon" : "Symbol",
|
||||
@@ -267,11 +262,11 @@
|
||||
"searchIcons" : "Suchsymbole",
|
||||
"useDefault" : "Standardwert verwenden",
|
||||
"errors" : {
|
||||
"scopeChange" : "Wenn Sie den Geltungsbereich ändern, wird er für Knoten in anderen Nachrichtenflüssen, die ihn verwenden, nicht verfügbar sein."
|
||||
"scopeChange" : "Wenn Sie den Geltungsbereich ändern, wird er für Nodes in anderen Nachrichtenflüssen, die ihn verwenden, nicht verfügbar sein."
|
||||
}
|
||||
},
|
||||
"keyboard" : {
|
||||
"title" : "Tastaturkurzbefehle",
|
||||
"title" : "Tastenkürzel",
|
||||
"keyboard" : "Tastatur",
|
||||
"filterActions" : "Filteraktionen",
|
||||
"shortcut" : "Direktaufruf",
|
||||
@@ -279,48 +274,45 @@
|
||||
"unassigned" : "Nicht zugeordnet",
|
||||
"global" : "global",
|
||||
"workspace" : "Arbeitsbereich",
|
||||
"selectAll" : "Alle Knoten auswählen",
|
||||
"selectAllConnected" : "Alle verbundenen Knoten auswählen",
|
||||
"addRemoveNode" : "Knoten aus Auswahl hinzufügen/entfernen",
|
||||
"editSelected" : "Ausgewählten Knoten bearbeiten",
|
||||
"deleteSelected" : "Ausgewählte Knoten oder ausgewählten Link löschen",
|
||||
"importNode" : "Knoten importieren",
|
||||
"exportNode" : "Knoten exportieren",
|
||||
"nudgeNode" : "Ausgewählte Knoten verschieben (1px)",
|
||||
"moveNode" : "Ausgewählte Knoten verschieben (20px)",
|
||||
"toggleSidebar" : "Seitenleiste ein-/ausschalten",
|
||||
"copyNode" : "Ausgewählte Knoten kopieren",
|
||||
"cutNode" : "Ausgewählte Knoten ausschneiden",
|
||||
"pasteNode" : "Knoten einfügen",
|
||||
"selectAll" : "Alle Nodes auswählen",
|
||||
"selectAllConnected" : "Alle verbundenen Nodes auswählen",
|
||||
"addRemoveNode" : "Node aus Auswahl hinzufügen/entfernen",
|
||||
"editSelected" : "Ausgewählten Node bearbeiten",
|
||||
"deleteSelected" : "Ausgewählte Node oder ausgewählten Link löschen",
|
||||
"importNode" : "Node importieren",
|
||||
"exportNode" : "Node exportieren",
|
||||
"nudgeNode" : "Ausgewählte Nodes verschieben (1px)",
|
||||
"moveNode" : "Ausgewählte Nodes verschieben (20px)",
|
||||
"toggleSidebar" : "Seitenleiste ein-/ausblenden",
|
||||
"copyNode" : "Ausgewählte Nodes kopieren",
|
||||
"cutNode" : "Ausgewählte Nodes ausschneiden",
|
||||
"pasteNode" : "Node einfügen",
|
||||
"undoChange" : "Letzte Änderung rückgängig machen",
|
||||
"searchBox" : "Suchfeld öffnen",
|
||||
"managePalette" : "Palette verwalten"
|
||||
},
|
||||
"library" : {
|
||||
"library" : "Bibliothek",
|
||||
"openLibrary" : "Bibliothek öffnen ...",
|
||||
"saveToLibrary" : "In Bibliothek speichern ...",
|
||||
"typeLibrary" : "__type__, Bibliothek",
|
||||
"unnamedType" : "Unbenannt __type__",
|
||||
"exportToLibrary" : "Knoten in Bibliothek exportieren",
|
||||
"dialogSaveOverwrite" : "Ein __libraryType__ mit dem Namen __libraryName__ ist bereits vorhanden. Überschreiben?",
|
||||
"invalidFilename" : "Ungültiger Dateiname",
|
||||
"savedNodes" : "Gespeicherte Knoten",
|
||||
"savedNodes" : "Gespeicherte Nodes",
|
||||
"savedType" : "Gespeichert __type__",
|
||||
"saveFailed" : "Speichern fehlgeschlagen: __message__",
|
||||
"filename" : "Name der Datei",
|
||||
"folder" : "Ordner",
|
||||
"filenamePlaceholder" : "Datei",
|
||||
"fullFilenamePlaceholder" : "a/b/Datei",
|
||||
"folderPlaceholder" : "a/b",
|
||||
"breadcrumb" : "Bibliothek"
|
||||
"types": {
|
||||
"examples" : "Beispiele"
|
||||
}
|
||||
},
|
||||
"palette" : {
|
||||
"noInfo" : "Keine Informationen verfügbar",
|
||||
"filter" : "Filterknoten",
|
||||
"filter" : "Nodes filtern",
|
||||
"search" : "Suchmodule",
|
||||
"addCategory" : "Neu hinzufügen ...",
|
||||
"label" : {
|
||||
"subflows" : "untergeordnete Nachrichtenflüsse",
|
||||
"subflows" : "Subflows",
|
||||
"input" : "Eingabe",
|
||||
"output" : "Ausgabe",
|
||||
"function" : "Funktion",
|
||||
@@ -330,15 +322,15 @@
|
||||
"advanced" : "fortgeschritten"
|
||||
},
|
||||
"event" : {
|
||||
"nodeAdded" : "Knoten zur Palette hinzugefügt:",
|
||||
"nodeAdded_plural" : "Die Palette wurde der Palette hinzugefügt.",
|
||||
"nodeRemoved" : "Knoten aus Palette entfernt:",
|
||||
"nodeRemoved_plural" : "Knoten aus Palette entfernt:",
|
||||
"nodeEnabled" : "Knoten aktiviert:",
|
||||
"nodeEnabled_plural" : "Knoten aktiviert:",
|
||||
"nodeDisabled" : "Knoten inaktiviert:",
|
||||
"nodeDisabled_plural" : "Knoten inaktiviert:",
|
||||
"nodeUpgraded" : "Knotenmodul __module__ aktualisiert auf Version __version__"
|
||||
"nodeAdded" : "Node zur Palette hinzugefügt:",
|
||||
"nodeAdded_plural" : "Die Nodes wurde der Palette hinzugefügt.",
|
||||
"nodeRemoved" : "Node aus Palette entfernt:",
|
||||
"nodeRemoved_plural" : "Nodes aus Palette entfernt:",
|
||||
"nodeEnabled" : "Node aktiviert:",
|
||||
"nodeEnabled_plural" : "Nodes aktiviert:",
|
||||
"nodeDisabled" : "Node inaktiviert:",
|
||||
"nodeDisabled_plural" : "Nodes inaktiviert:",
|
||||
"nodeUpgraded" : "Node-Modul __module__ aktualisiert auf Version __version__"
|
||||
},
|
||||
"editor" : {
|
||||
"title" : "Palette verwalten",
|
||||
@@ -362,8 +354,8 @@
|
||||
"yearsMonthsV" : "____ Jahre, __count__ Monat vor",
|
||||
"yearsMonthsV_plural" : "____ Jahre, __count__ Monaten"
|
||||
},
|
||||
"nodeCount" : "__label__, Knoten",
|
||||
"nodeCount_plural" : "__label__ Knoten",
|
||||
"nodeCount" : "__label__, Node",
|
||||
"nodeCount_plural" : "__label__ Nodes",
|
||||
"moduleCount" : "__count__ Modul verfügbar",
|
||||
"moduleCount_plural" : "__count__-Module verfügbar",
|
||||
"inuse" : "im Gebrauch",
|
||||
@@ -374,17 +366,17 @@
|
||||
"remove" : "entfernen",
|
||||
"update" : "Update auf __version__",
|
||||
"updated" : "aktualisiert",
|
||||
"install" : "installieren",
|
||||
"installed" : "installiert",
|
||||
"install" : "Installieren",
|
||||
"installed" : "Installiert",
|
||||
"loading" : "Kataloge werden geladen ...",
|
||||
"tab-nodes" : "Knoten",
|
||||
"tab-install" : "installieren",
|
||||
"tab-nodes" : "Nodes",
|
||||
"tab-install" : "Installieren",
|
||||
"sort" : "Sortierung:",
|
||||
"sortAZ" : "a-z",
|
||||
"sortRecent" : "kürzlich",
|
||||
"more" : "+ __count__ mehr",
|
||||
"errors" : {
|
||||
"catalogLoadFailed" : "<p> Fehler beim Laden des Knotenkatalogs. </p> <p> Weitere Informationen finden Sie in der Browserkonsole. </p>",
|
||||
"catalogLoadFailed" : "<p> Fehler beim Laden des Node-Katalogs. </p> <p> Weitere Informationen finden Sie in der Browserkonsole. </p>",
|
||||
"installFailed" : "<p> Installation fehlgeschlagen: __module__ </p> <p> __message__ </p> <p> Überprüfen Sie das Protokoll auf weitere Informationen. </p>",
|
||||
"removeFailed" : "<p> Entfernen fehlgeschlagen: __module__ </p> <p> __message__ </p> <p> Überprüfen Sie das Protokoll auf weitere Informationen. </p>",
|
||||
"updateFailed" : "<p> Aktualisierung fehlgeschlagen: __module__ </p> <p> __message__ </p> <p> Überprüfen Sie das Protokoll auf weitere Informationen. </p>",
|
||||
@@ -393,22 +385,22 @@
|
||||
},
|
||||
"confirm" : {
|
||||
"install" : {
|
||||
"body" : "<p> Installieren von '__module__' </p> <p> Vor der Installation von lesen Sie bitte die Dokumentation des Knotens. Einige Knoten haben Abhängigkeiten, die nicht automatisch aufgelöst werden können und einen Neustart von 'Node-RED' erfordern. </p>",
|
||||
"title" : "Knoten installieren"
|
||||
"body" : "<p> Installieren von '__module__' </p> <p> Vor der Installation von lesen Sie bitte die Dokumentation des Nodes. Einige Nodes haben Abhängigkeiten, die nicht automatisch aufgelöst werden können und einen Neustart von 'Node-RED' erfordern. </p>",
|
||||
"title" : "Nodes installieren"
|
||||
},
|
||||
"remove" : {
|
||||
"body" : "<p> Entfernen von '__module__' </p> <p>-Der Knoten deinstalliert ihn aus Node-RED. Der Knoten kann weiterhin Ressourcen verwenden, bis Node-RED erneut gestartet wird. </p>",
|
||||
"title" : "Knoten entfernen"
|
||||
"body" : "<p> Entfernen von '__module__' </p> <p>-Der Node deinstalliert ihn aus Node-RED. Der Node kann weiterhin Ressourcen verwenden, bis Node-RED erneut gestartet wird. </p>",
|
||||
"title" : "Nodes entfernen"
|
||||
},
|
||||
"update" : {
|
||||
"body" : "<p> Aktualisieren von '__module__' </p> <p> Für die Aktualisierung des Knotens ist ein Neustart von 'Node-RED' erforderlich, damit die Aktualisierung abgeschlossen werden kann. Dies muss manuell geschehen. </p>",
|
||||
"title" : "Knoten aktualisieren"
|
||||
"body" : "<p> Aktualisieren von '__module__' </p> <p> Für die Aktualisierung des Nodes ist ein Neustart von 'Node-RED' erforderlich, damit die Aktualisierung abgeschlossen werden kann. Dies muss manuell geschehen. </p>",
|
||||
"title" : "Nodes aktualisieren"
|
||||
},
|
||||
"cannotUpdate" : {
|
||||
"body" : "Es ist eine Aktualisierung für diesen Knoten verfügbar, aber sie ist nicht an einer Position installiert, die vom Palettenmanager aktualisiert werden kann. <br/> <br/> Weitere Informationen zum Aktualisieren dieses Knotens finden Sie in der Dokumentation."
|
||||
"body" : "Es ist eine Aktualisierung für diesen Node verfügbar, aber sie ist nicht an einer Position installiert, die vom Palettenmanager aktualisiert werden kann. <br/> <br/> Weitere Informationen zum Aktualisieren dieses Nodes finden Sie in der Dokumentation."
|
||||
},
|
||||
"button" : {
|
||||
"review" : "Knoteninformationen öffnen",
|
||||
"review" : "Node-Informationen öffnen",
|
||||
"install" : "installieren",
|
||||
"remove" : "Entfernen",
|
||||
"update" : "Aktualisieren"
|
||||
@@ -418,10 +410,10 @@
|
||||
},
|
||||
"sidebar" : {
|
||||
"info" : {
|
||||
"name" : "Knoteninformationen",
|
||||
"name" : "Node-Informationen",
|
||||
"tabName" : "Name",
|
||||
"label" : "info",
|
||||
"node" : "Knoten",
|
||||
"node" : "Node",
|
||||
"type" : "Typ",
|
||||
"id" : "ID",
|
||||
"status" : "Status",
|
||||
@@ -437,32 +429,32 @@
|
||||
"showLess" : "Weniger anzeigen",
|
||||
"flow" : "Flow",
|
||||
"selection" : "Auswahl",
|
||||
"nodes" : "__count__ Knoten",
|
||||
"nodes" : "__count__ Nodes",
|
||||
"flowDesc" : "Beschreibung des Flows",
|
||||
"subflowDesc" : "Beschreibung des Subflows",
|
||||
"nodeHelp" : "Knotenhilfe",
|
||||
"nodeHelp" : "Node-Hilfe",
|
||||
"none" : "Keine",
|
||||
"arrayItems" : "__count__ items",
|
||||
"showTips" : "Sie können die Tipps in der Anzeige \"Einstellungen\" öffnen."
|
||||
},
|
||||
"config" : {
|
||||
"name" : "Konfigurationsknoten",
|
||||
"name" : "Konfigurations-Node",
|
||||
"label" : "Konfiguration",
|
||||
"global" : "Bei allen Flows",
|
||||
"none" : "keine",
|
||||
"subflows" : "Subflows",
|
||||
"flows" : "Flows",
|
||||
"filterUnused" : "Nicht verwendet",
|
||||
"filterAll" : "alle",
|
||||
"filterUnused" : "Nicht verwendet",
|
||||
"filtered" : "__count__ verdeckt"
|
||||
},
|
||||
"context" : {
|
||||
"name" : "Kontextdaten",
|
||||
"label" : "Kontext",
|
||||
"none" : "keine ausgewählt",
|
||||
"refresh" : "Aktualisierung zum Laden",
|
||||
"refresh" : "Zum Aktualisieren neu laden",
|
||||
"empty" : "leer",
|
||||
"node" : "Knoten",
|
||||
"node" : "Node",
|
||||
"flow" : "Flow",
|
||||
"global" : "Global"
|
||||
},
|
||||
@@ -485,7 +477,7 @@
|
||||
"none" : "Keine",
|
||||
"install" : "installieren",
|
||||
"removeFromProject" : "Aus Projekt entfernen",
|
||||
"addToProject" : "zu Projekt hinzufügen",
|
||||
"addToProject" : "Zu Projekt hinzufügen",
|
||||
"files" : "Dateien",
|
||||
"flow" : "Flow",
|
||||
"credentials" : "Berechtigungsnachweis",
|
||||
@@ -518,7 +510,7 @@
|
||||
},
|
||||
"userSettings" : {
|
||||
"committerDetail" : "Committer-Details",
|
||||
"committerTip" : "Leer Wert für Systemstandardwert belassen",
|
||||
"committerTip" : "Leer lassen für Systemstandard",
|
||||
"userName" : "Benutzername",
|
||||
"email" : "E-Mail",
|
||||
"sshKeys" : "SSH-Schlüssel",
|
||||
@@ -552,7 +544,7 @@
|
||||
"revertChanges" : "Änderungen zurücksetzen",
|
||||
"localChanges" : "Lokale Änderungen",
|
||||
"none" : "Keine",
|
||||
"conflictResolve" : "Alle Konflikte wurden aufgelöst. Festschreiben der Änderungen, um den Mischvorgang abzuschließen.",
|
||||
"conflictResolve" : "Alle Konflikte wurden aufgelöst. Committe die Änderungen, um den Merge Request abzuschließen.",
|
||||
"localFiles" : "Lokale Dateien",
|
||||
"all" : "alle",
|
||||
"unmergedChanges" : "Nicht zusammengeführte Änderungen",
|
||||
@@ -610,13 +602,13 @@
|
||||
},
|
||||
"typedInput" : {
|
||||
"type" : {
|
||||
"str" : "Zeichenfolge",
|
||||
"num" : "Anzahl",
|
||||
"str" : "String",
|
||||
"num" : "Number",
|
||||
"re" : "Regulärer Ausdruck",
|
||||
"bool" : "boolean",
|
||||
"json" : "JSON",
|
||||
"bin" : "Puffer",
|
||||
"date" : "Zeitmarke",
|
||||
"bin" : "Buffer",
|
||||
"date" : "timestamp",
|
||||
"jsonata" : "Ausdruck",
|
||||
"env" : "env, Variable"
|
||||
}
|
||||
@@ -626,7 +618,7 @@
|
||||
},
|
||||
"search" : {
|
||||
"empty" : "Keine Übereinstimmungen gefunden",
|
||||
"addNode" : "Knoten hinzufügen ..."
|
||||
"addNode" : "Node hinzufügen ..."
|
||||
},
|
||||
"expressionEditor" : {
|
||||
"functions" : "Funktionen",
|
||||
@@ -658,10 +650,10 @@
|
||||
"title" : "Markdown-Editor"
|
||||
},
|
||||
"bufferEditor" : {
|
||||
"title" : "Puffereditor",
|
||||
"title" : "Buffereditor",
|
||||
"modeString" : "Als UTF-8-Zeichenfolge bearbeiten",
|
||||
"modeArray" : "Als JSON-Array bearbeiten",
|
||||
"modeDesc" : "<h3> Puffereditor </h3> <p> Der Puffertyp wird als JSON-Array mit Bytewerten gespeichert. Der Editor versucht, den eingegebenen Wert als JSON-Array zu parsen. Wenn es sich nicht um ein gültiges JSON handelt, wird es als UTF-8-Zeichenfolge behandelt und in ein Array der einzelnen Zeichencodepunkte konvertiert. </p> <p> Beispiel: Der Wert <code> Hello World </code> wird in das JSON-Array konvertiert: <pre> [ 72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100] </pre> </p>"
|
||||
"modeDesc" : "<h3> Buffereditor </h3> <p> Der Buffertyp wird als JSON-Array mit Bytewerten gespeichert. Der Editor versucht, den eingegebenen Wert als JSON-Array zu parsen. Wenn es sich nicht um ein gültiges JSON handelt, wird es als UTF-8-Zeichenfolge behandelt und in ein Array der einzelnen Zeichencodepunkte konvertiert. </p> <p> Beispiel: Der Wert <code> Hello World </code> wird in das JSON-Array konvertiert: <pre> [ 72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100] </pre> </p>"
|
||||
},
|
||||
"projects" : {
|
||||
"config-git" : "Git-Client konfigurieren",
|
||||
@@ -826,4 +818,4 @@
|
||||
"code" : "code"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,23 +1,23 @@
|
||||
{
|
||||
"info" : {
|
||||
"tip0" : "Sie können die ausgewählten Knoten oder Verbindungen mit {{ core:delete-selection }} entfernen.",
|
||||
"tip1" : "Suche nach Knoten mit {{ core:search }}",
|
||||
"tip0" : "Sie können die ausgewählten Nodes oder Verbindungen mit {{ core:delete-selection }} entfernen.",
|
||||
"tip1" : "Suche nach Nodes mit {{ core:search }}",
|
||||
"tip2" : "{{ core:toggle-sidebar }} schaltet die Ansicht dieser Seitenleiste ein.",
|
||||
"tip3" : "Sie können Ihre Palette von Knoten mit {{ core:manage-palette }} verwalten.",
|
||||
"tip4" : "Ihre Flow-Konfigurationsknoten werden in der Seitenleiste angezeigt. Es kann über das Menü oder mit {{ core:show-config-tab }} aufgerufen werden.",
|
||||
"tip3" : "Sie können Ihre Palette von Nodes mit {{ core:manage-palette }} verwalten.",
|
||||
"tip4" : "Ihre Flow-Konfigurations-Nodes werden in der Seitenleiste angezeigt. Es kann über das Menü oder mit {{ core:show-config-tab }} aufgerufen werden.",
|
||||
"tip5" : "Aktiviert oder inaktiviert diese Tipps von der Option in den Einstellungen",
|
||||
"tip6" : "Verschieben Sie die ausgewählten Knoten mit Hilfe der [left] [up] [down] und [right] Tasten. Halten Sie [Shift] gedrückt, um das Fenster weiter zu schieben",
|
||||
"tip7" : "Wenn Sie einen Knoten auf eine Verbindung ziehen, wird er in die Verbindung eingefügt.",
|
||||
"tip8" : "Die ausgewählten Knoten exportieren oder die aktuelle Registerkarte mit {{ core:show-export-dialog }}",
|
||||
"tip6" : "Verschieben Sie die ausgewählten Nodes mit Hilfe der [left] [up] [down] und [right] Tasten. Halten Sie [Shift] gedrückt, um das Fenster weiter zu schieben",
|
||||
"tip7" : "Wenn Sie einen Node auf eine Verbindung ziehen, wird er in die Verbindung eingefügt.",
|
||||
"tip8" : "Die ausgewählten Nodes exportieren oder die aktuelle Registerkarte mit {{ core:show-export-dialog }}",
|
||||
"tip9" : "Importieren Sie einen Flow, indem Sie sein JSON in den Editor ziehen oder mit {{ core:show-import-dialog }}.",
|
||||
"tip10" : "[Umschalt] [Klicken] und ziehen Sie auf einen Knotenanschluss, um alle angeschlossenen Verbindungen oder nur die ausgewählte zu verschieben.",
|
||||
"tip10" : "[Umschalt] [Klicken] und ziehen Sie auf einen Node-Anschluss, um alle angeschlossenen Verbindungen oder nur die ausgewählte zu verschieben.",
|
||||
"tip11" : "Die Registerkarte \"Info\" mit {{ core:show-info-tab }} oder der Registerkarte \"Debug\" mit {{ core:show-debug-tab }} anzeigen",
|
||||
"tip12" : "[ctrl] [Klicken] in den Arbeitsbereich, um den Schnellhinzufügedialog zu öffnen.",
|
||||
"tip13" : "Halten Sie [ctrl] gedrückt, wenn Sie auf einem Knotenanschluss klicken, um eine Schnellverbindung zu aktivieren.",
|
||||
"tip14" : "Halten Sie [Umschalt] gedrückt, wenn Sie auf einen Knoten klicken, um auch alle verbundenen Knoten auszuwählen.",
|
||||
"tip15" : "Halten Sie [ctrl] gedrückt, wenn Sie auf einen Knoten klicken, um ihn aus der aktuellen Auswahl hinzuzufügen oder zu entfernen.",
|
||||
"tip13" : "Halten Sie [ctrl] gedrückt, wenn Sie auf einem Node-Anschluss klicken, um eine Schnellverbindung zu aktivieren.",
|
||||
"tip14" : "Halten Sie [Umschalt] gedrückt, wenn Sie auf einen Node klicken, um auch alle verbundenen Nodes auszuwählen.",
|
||||
"tip15" : "Halten Sie [ctrl] gedrückt, wenn Sie auf einen Node klicken, um ihn aus der aktuellen Auswahl hinzuzufügen oder zu entfernen.",
|
||||
"tip16" : "Indexzungen wechseln mit {{ core:show-previous-tab }} und {{ core:show-next-tab }}",
|
||||
"tip17" : "Sie können die Änderungen im Editierrahmen des Knotens mit {{ core:confirm-edit-tray }} bestätigen oder sie mit {{ core:cancel-edit-tray }} abbrechen.",
|
||||
"tip18" : "Durch Drücken von {{ core:edit-selected-node }} wird der erste Knoten in der aktuellen Auswahl bearbeitet."
|
||||
"tip17" : "Sie können die Änderungen im Editierrahmen des Nodes mit {{ core:confirm-edit-tray }} bestätigen oder sie mit {{ core:cancel-edit-tray }} abbrechen.",
|
||||
"tip18" : "Durch Drücken von {{ core:edit-selected-node }} wird der erste Node in der aktuellen Auswahl bearbeitet."
|
||||
}
|
||||
}
|
@@ -53,7 +53,7 @@
|
||||
},
|
||||
"$now" : {
|
||||
"args" : "",
|
||||
"desc" : "Generiert eine Zeitmarke im ISO-8601-kompatiblen Format und gibt sie als Zeichenfolge zurück."
|
||||
"desc" : "Generiert einen Zeitstempel im ISO-8601-kompatiblen Format und gibt sie als Zeichenfolge zurück."
|
||||
},
|
||||
"$base64encode" : {
|
||||
"args" : "Zeichenfolge",
|
||||
@@ -201,7 +201,7 @@
|
||||
},
|
||||
"$fromMillis" : {
|
||||
"args" : "Anzahl",
|
||||
"desc" : "Konvertieren Sie eine Zahl, die Millisekunden seit der Unix-Epoche (1. Januar 1970 (UTC)) in eine Zeitmarkenzeichenfolge im ISO 8601-Format darstellt."
|
||||
"desc" : "Konvertieren Sie eine Zahl, die Millisekunden seit der Unix-Epoche (1. Januar 1970 (UTC)) enthält in eine Zeitangabe im ISO 8601-Format."
|
||||
},
|
||||
"$formatNumber" : {
|
||||
"args" : "Zahl, Bild [, Optionen]",
|
||||
@@ -212,8 +212,8 @@
|
||||
"desc" : "Transformiere die `Zahl` in eine Zeichenfolge und formatiert sie in eine ganze Zahl, die in der durch das `radix` -Argument angegebenen Zahlenbasis dargestellt wird. Wenn 'radix' nicht angegeben wird, wird standardmäßig die Basis 10 verwendet. 'radix` kann zwischen 2 und 36 liegen, andernfalls wird ein Fehler ausgelöst."
|
||||
},
|
||||
"$toMillis" : {
|
||||
"args" : "Zeitmarke",
|
||||
"desc" : "Konvertieren Sie eine Zeichenfolge `Zeitmarke' im ISO 8601-Format in die Anzahl der Millisekunden seit der Unix-Epoche (1. Januar 1970 (UTC)) als Zahl. Es wird ein Fehler ausgelöst, wenn die Zeichenfolge nicht das richtige Format hat."
|
||||
"args" : "timestamp",
|
||||
"desc" : "Konvertieren Sie eine Zeitangabe im ISO 8601-Format in die Anzahl der Millisekunden seit der Unix-Epoche (1. Januar 1970 (UTC)) als Zahl. Es wird ein Fehler ausgelöst, wenn die Zeichenfolge nicht das richtige Format hat."
|
||||
},
|
||||
"$env" : {
|
||||
"args" : "arg",
|
||||
|
@@ -14,9 +14,35 @@
|
||||
"back": "Back",
|
||||
"next": "Next",
|
||||
"clone": "Clone project",
|
||||
"cont": "Continue"
|
||||
"cont": "Continue",
|
||||
"style": "Style",
|
||||
"line": "Outline",
|
||||
"fill": "Fill",
|
||||
"label": "Label",
|
||||
"color": "Color",
|
||||
"position": "Position",
|
||||
"enable": "Enable",
|
||||
"disable": "Disable"
|
||||
},
|
||||
"type": {
|
||||
"string": "string",
|
||||
"number": "number",
|
||||
"boolean": "boolean",
|
||||
"array": "array",
|
||||
"buffer": "buffer",
|
||||
"object": "object",
|
||||
"jsonString": "JSON string",
|
||||
"undefined": "undefined",
|
||||
"null": "null"
|
||||
}
|
||||
},
|
||||
"event": {
|
||||
"loadPalette": "Loading Palette",
|
||||
"loadNodeCatalogs": "Loading Node catalogs",
|
||||
"loadNodes": "Loading Nodes __count__",
|
||||
"loadFlows": "Loading Flows",
|
||||
"importFlows": "Adding Flows to workspace"
|
||||
},
|
||||
"workspace": {
|
||||
"defaultName": "Flow __number__",
|
||||
"editFlow": "Edit flow: __name__",
|
||||
@@ -24,10 +50,12 @@
|
||||
"delete": "Are you sure you want to delete '__label__'?",
|
||||
"dropFlowHere": "Drop the flow here",
|
||||
"addFlow": "Add Flow",
|
||||
"listFlows": "List Flows",
|
||||
"status": "Status",
|
||||
"enabled": "Enabled",
|
||||
"disabled":"Disabled",
|
||||
"info": "Description"
|
||||
"info": "Description",
|
||||
"selectNodes": "Click nodes to select"
|
||||
},
|
||||
"menu": {
|
||||
"label": {
|
||||
@@ -41,7 +69,9 @@
|
||||
"defaultDir": "Default",
|
||||
"ltr": "Left-to-right",
|
||||
"rtl": "Right-to-left",
|
||||
"auto": "Contextual"
|
||||
"auto": "Contextual",
|
||||
"language": "Language",
|
||||
"browserDefault": "Browser default"
|
||||
},
|
||||
"sidebar": {
|
||||
"show": "Show sidebar"
|
||||
@@ -58,9 +88,6 @@
|
||||
"export": "Export",
|
||||
"search": "Search flows",
|
||||
"searchInput": "search your flows",
|
||||
"clipboard": "Clipboard",
|
||||
"library": "Library",
|
||||
"examples": "Examples",
|
||||
"subflows": "Subflows",
|
||||
"createSubflow": "Create Subflow",
|
||||
"selectionToSubflow": "Selection to Subflow",
|
||||
@@ -79,7 +106,12 @@
|
||||
"projects-new": "New",
|
||||
"projects-open": "Open",
|
||||
"projects-settings": "Project Settings",
|
||||
"showNodeLabelDefault": "Show label of newly added nodes"
|
||||
"showNodeLabelDefault": "Show label of newly added nodes",
|
||||
"groups": "Groups",
|
||||
"groupSelection": "Group selection",
|
||||
"ungroupSelection": "Ungroup selection",
|
||||
"groupMergeSelection": "Merge selection",
|
||||
"groupRemoveSelection": "Remove from group"
|
||||
}
|
||||
},
|
||||
"actions": {
|
||||
@@ -135,7 +167,12 @@
|
||||
"updated": "Project '__project__' updated",
|
||||
"pull": "Project '__project__' reloaded",
|
||||
"revert": "Project '__project__' reverted",
|
||||
"merge-complete": "Git merge completed"
|
||||
"merge-complete": "Git merge completed",
|
||||
"setupCredentials": "Setup credentials",
|
||||
"setupProjectFiles": "Setup project files",
|
||||
"no": "No thanks",
|
||||
"createDefault": "Create default project files",
|
||||
"mergeConflict": "Show merge conflicts"
|
||||
},
|
||||
"label": {
|
||||
"manage-project-dep": "Manage project dependencies",
|
||||
@@ -148,16 +185,18 @@
|
||||
}
|
||||
},
|
||||
"clipboard": {
|
||||
"clipboard": "Clipboard",
|
||||
"nodes": "Nodes",
|
||||
"node": "__count__ node",
|
||||
"node_plural": "__count__ nodes",
|
||||
"configNode": "__count__ configuration node",
|
||||
"configNode_plural": "__count__ configuration nodes",
|
||||
"group": "__count__ group",
|
||||
"group_plural": "__count__ groups",
|
||||
"flow": "__count__ flow",
|
||||
"flow_plural": "__count__ flows",
|
||||
"subflow": "__count__ subflow",
|
||||
"subflow_plural": "__count__ subflows",
|
||||
"selectNodes": "Select the text above and copy to the clipboard.",
|
||||
"pasteNodes": "Paste flow json or",
|
||||
"selectFile": "select a file to import",
|
||||
"importNodes": "Import nodes",
|
||||
@@ -169,6 +208,9 @@
|
||||
"nodesImported": "Imported:",
|
||||
"nodeCopied": "__count__ node copied",
|
||||
"nodeCopied_plural": "__count__ nodes copied",
|
||||
"groupCopied": "__count__ group copied",
|
||||
"groupCopied_plural": "__count__ groups copied",
|
||||
"groupStyleCopied": "Group style copied",
|
||||
"invalidFlow": "Invalid flow: __message__",
|
||||
"export": {
|
||||
"selected":"selected nodes",
|
||||
@@ -176,7 +218,11 @@
|
||||
"all":"all flows",
|
||||
"compact":"compact",
|
||||
"formatted":"formatted",
|
||||
"copy": "Export to clipboard"
|
||||
"copy": "Copy to clipboard",
|
||||
"export": "Export to library",
|
||||
"exportAs": "Export as",
|
||||
"overwrite": "Replace",
|
||||
"exists": "<p><b>\"__file__\"</b> already exists.</p><p>Do you want to replace it?</p>"
|
||||
},
|
||||
"import": {
|
||||
"import": "Import to",
|
||||
@@ -266,8 +312,9 @@
|
||||
"newVersionError": "New Version doesn't contain valid JSON:"
|
||||
},
|
||||
"subflow": {
|
||||
"editSubflow": "Edit flow template: __name__",
|
||||
"edit": "Edit flow template",
|
||||
"editSubflowInstance": "Edit subflow instance: __name__",
|
||||
"editSubflow": "Edit subflow template: __name__",
|
||||
"edit": "Edit subflow template",
|
||||
"subflowInstances": "There is __count__ instance of this subflow template",
|
||||
"subflowInstances_plural": "There are __count__ instances of this subflow template",
|
||||
"editSubflowProperties": "edit properties",
|
||||
@@ -286,6 +333,13 @@
|
||||
"multipleInputsToSelection": "<strong>Cannot create subflow</strong>: multiple inputs to selection"
|
||||
}
|
||||
},
|
||||
"group": {
|
||||
"editGroup": "Edit group: __name__",
|
||||
"errors": {
|
||||
"cannotCreateDiffGroups": "Cannot create group using nodes from different groups",
|
||||
"cannotAddSubflowPorts": "Cannot add subflow ports to a group"
|
||||
}
|
||||
},
|
||||
"editor": {
|
||||
"configEdit": "Edit",
|
||||
"configAdd": "Add",
|
||||
@@ -299,10 +353,12 @@
|
||||
"addNewType": "Add new __type__...",
|
||||
"nodeProperties": "node properties",
|
||||
"label": "Label",
|
||||
"color": "Color",
|
||||
"portLabels": "Port labels",
|
||||
"labelInputs": "Inputs",
|
||||
"labelOutputs": "Outputs",
|
||||
"settingIcon": "Icon",
|
||||
"default": "default",
|
||||
"noDefaultLabel": "none",
|
||||
"defaultLabel": "use default label",
|
||||
"searchIcons": "Search icons",
|
||||
@@ -310,8 +366,45 @@
|
||||
"description": "Description",
|
||||
"show": "Show",
|
||||
"hide": "Hide",
|
||||
"locale": "Select UI Language",
|
||||
"icon": "Icon",
|
||||
"inputType": "Input type",
|
||||
"selectType": "select types...",
|
||||
"inputs" : {
|
||||
"input": "input",
|
||||
"select": "select",
|
||||
"checkbox": "checkbox",
|
||||
"spinner": "spinner",
|
||||
"none": "none",
|
||||
"hidden": "hide property"
|
||||
},
|
||||
"types": {
|
||||
"str": "string",
|
||||
"num": "number",
|
||||
"bool": "bool",
|
||||
"json": "JSON",
|
||||
"bin": "buffer",
|
||||
"env": "env variable",
|
||||
"cred": "credential"
|
||||
},
|
||||
"menu": {
|
||||
"input": "input",
|
||||
"select": "select",
|
||||
"checkbox": "checkbox",
|
||||
"spinner": "spinner",
|
||||
"hidden": "label only"
|
||||
},
|
||||
"select": {
|
||||
"label": "Label",
|
||||
"value": "Value"
|
||||
},
|
||||
"spinner": {
|
||||
"min": "Minimum",
|
||||
"max": "Maximum"
|
||||
},
|
||||
"errors": {
|
||||
"scopeChange": "Changing the scope will make it unavailable to nodes in other flows that use it"
|
||||
"scopeChange": "Changing the scope will make it unavailable to nodes in other flows that use it",
|
||||
"invalidProperties": "Invalid properties:"
|
||||
}
|
||||
},
|
||||
"keyboard": {
|
||||
@@ -339,25 +432,26 @@
|
||||
"pasteNode": "Paste nodes",
|
||||
"undoChange": "Undo the last change performed",
|
||||
"searchBox": "Open search box",
|
||||
"managePalette": "Manage palette"
|
||||
"managePalette": "Manage palette",
|
||||
"actionList":"Action list"
|
||||
},
|
||||
"library": {
|
||||
"library": "Library",
|
||||
"openLibrary": "Open Library...",
|
||||
"saveToLibrary": "Save to Library...",
|
||||
"typeLibrary": "__type__ library",
|
||||
"unnamedType": "Unnamed __type__",
|
||||
"exportToLibrary": "Export nodes to library",
|
||||
"exportedToLibrary": "Nodes exported to library",
|
||||
"dialogSaveOverwrite": "A __libraryType__ called __libraryName__ already exists. Overwrite?",
|
||||
"invalidFilename": "Invalid filename",
|
||||
"savedNodes": "Saved nodes",
|
||||
"savedType": "Saved __type__",
|
||||
"saveFailed": "Save failed: __message__",
|
||||
"filename": "Filename",
|
||||
"folder": "Folder",
|
||||
"filenamePlaceholder": "file",
|
||||
"fullFilenamePlaceholder": "a/b/file",
|
||||
"folderPlaceholder": "a/b",
|
||||
"breadcrumb": "Library"
|
||||
"newFolder": "New folder",
|
||||
"types": {
|
||||
"local": "Local",
|
||||
"examples": "Examples"
|
||||
}
|
||||
},
|
||||
"palette": {
|
||||
"noInfo": "no information available",
|
||||
@@ -366,9 +460,13 @@
|
||||
"addCategory": "Add new...",
|
||||
"label": {
|
||||
"subflows": "subflows",
|
||||
"network": "network",
|
||||
"common": "common",
|
||||
"input": "input",
|
||||
"output": "output",
|
||||
"function": "function",
|
||||
"sequence": "sequence",
|
||||
"parser": "parser",
|
||||
"social": "social",
|
||||
"storage": "storage",
|
||||
"analysis": "analysis",
|
||||
@@ -469,11 +567,12 @@
|
||||
},
|
||||
"sidebar": {
|
||||
"info": {
|
||||
"name": "Node information",
|
||||
"name": "Information",
|
||||
"tabName": "Name",
|
||||
"label": "info",
|
||||
"node": "Node",
|
||||
"type": "Type",
|
||||
"group": "Group",
|
||||
"module": "Module",
|
||||
"id": "ID",
|
||||
"status": "Status",
|
||||
@@ -496,7 +595,29 @@
|
||||
"nodeHelp": "Node Help",
|
||||
"none":"None",
|
||||
"arrayItems": "__count__ items",
|
||||
"showTips":"You can open the tips from the settings panel"
|
||||
"showTips":"You can open the tips from the settings panel",
|
||||
"outline": "Outline",
|
||||
"empty": "empty",
|
||||
"globalConfig": "Global Configuration Nodes",
|
||||
"triggerAction": "Trigger action",
|
||||
"find": "Find in workspace",
|
||||
"search": {
|
||||
"configNodes": "Configuration nodes",
|
||||
"unusedConfigNodes": "Unused configuration nodes",
|
||||
"invalidNodes": "Invalid nodes",
|
||||
"uknownNodes": "Unknown nodes",
|
||||
"unusedSubflows": "Unused subflows"
|
||||
}
|
||||
},
|
||||
"help": {
|
||||
"name": "Help",
|
||||
"label": "help",
|
||||
"search": "Search help",
|
||||
"nodeHelp": "Node Help",
|
||||
"showHelp": "Show help",
|
||||
"showInOutline": "Show in outline",
|
||||
"showTopics": "Show topics",
|
||||
"noHelp": "No help topic selected"
|
||||
},
|
||||
"config": {
|
||||
"name": "Configuration nodes",
|
||||
@@ -505,8 +626,10 @@
|
||||
"none": "none",
|
||||
"subflows": "subflows",
|
||||
"flows": "flows",
|
||||
"filterUnused":"unused",
|
||||
"filterAll":"all",
|
||||
"filterAll": "all",
|
||||
"showAllConfigNodes": "Show all config nodes",
|
||||
"filterUnused": "unused",
|
||||
"showAllUnusedConfigNodes": "Show all unused config nodes",
|
||||
"filtered": "__count__ hidden"
|
||||
},
|
||||
"context": {
|
||||
@@ -518,7 +641,10 @@
|
||||
"node": "Node",
|
||||
"flow": "Flow",
|
||||
"global": "Global",
|
||||
"deleteConfirm": "Are you sure you want to delete this item?"
|
||||
"deleteConfirm": "Are you sure you want to delete this item?",
|
||||
"autoRefresh": "Refresh on selection change",
|
||||
"refrsh": "Refresh",
|
||||
"delete": "Delete"
|
||||
},
|
||||
"palette": {
|
||||
"name": "Palette management",
|
||||
@@ -533,6 +659,7 @@
|
||||
"noSummaryAvailable": "No summary available",
|
||||
"editDescription": "Edit project description",
|
||||
"editDependencies": "Edit project dependencies",
|
||||
"noDescriptionAvailable": "No description available",
|
||||
"editReadme": "Edit README.md",
|
||||
"showProjectSettings": "Show project settings",
|
||||
"projectSettings": {
|
||||
@@ -545,12 +672,16 @@
|
||||
"files": "Files",
|
||||
"flow": "Flow",
|
||||
"credentials": "Credentials",
|
||||
"package":"Package",
|
||||
"packageCreate":"File will be created when changes are saved",
|
||||
"fileNotExist":"File does not exist",
|
||||
"selectFile": "Select File",
|
||||
"invalidEncryptionKey": "Invalid encryption key",
|
||||
"encryptionEnabled": "Encryption enabled",
|
||||
"encryptionDisabled": "Encryption disabled",
|
||||
"setTheEncryptionKey": "Set the encryption key:",
|
||||
"resetTheEncryptionKey": "Reset the encryption key:",
|
||||
"changeTheEncryptionKey": "Change the encryption key:",
|
||||
"setTheEncryptionKey": "Set the encryption key",
|
||||
"resetTheEncryptionKey": "Reset the encryption key",
|
||||
"changeTheEncryptionKey": "Change the encryption key",
|
||||
"currentKey": "Current key",
|
||||
"newKey": "New key",
|
||||
"credentialsAlert": "This will delete all existing credentials",
|
||||
@@ -682,7 +813,8 @@
|
||||
"bin": "buffer",
|
||||
"date": "timestamp",
|
||||
"jsonata": "expression",
|
||||
"env": "env variable"
|
||||
"env": "env variable",
|
||||
"cred": "credential"
|
||||
}
|
||||
},
|
||||
"editableList": {
|
||||
@@ -714,12 +846,28 @@
|
||||
"jsEditor": {
|
||||
"title": "JavaScript editor"
|
||||
},
|
||||
"textEditor": {
|
||||
"title": "Text editor"
|
||||
},
|
||||
"jsonEditor": {
|
||||
"title": "JSON editor",
|
||||
"format": "format JSON"
|
||||
"format": "format JSON",
|
||||
"rawMode": "Edit JSON",
|
||||
"uiMode": "Visual editor",
|
||||
"insertAbove": "Insert above",
|
||||
"insertBelow": "Insert below",
|
||||
"addItem": "Add item",
|
||||
"copyPath": "Copy path to item",
|
||||
"expandItems": "Expand items",
|
||||
"collapseItems": "Collapse items",
|
||||
"duplicate": "Duplicate",
|
||||
"error": {
|
||||
"invalidJSON": "Invalid JSON: "
|
||||
}
|
||||
},
|
||||
"markdownEditor": {
|
||||
"title": "Markdown editor",
|
||||
"expand": "Expand",
|
||||
"format": "Formatted with markdown",
|
||||
"heading1": "Heading 1",
|
||||
"heading2": "Heading 2",
|
||||
@@ -749,6 +897,7 @@
|
||||
"desc2": "If you are not sure, you can skip this for now. You will still be able to create your first project from the 'Projects' menu at any time.",
|
||||
"create": "Create Project",
|
||||
"clone": "Clone Repository",
|
||||
"openExistingProject": "Open existing project",
|
||||
"not-right-now": "Not right now"
|
||||
},
|
||||
"git-config": {
|
||||
@@ -885,7 +1034,8 @@
|
||||
"passphrase": "Passphrase",
|
||||
"retry": "Retry",
|
||||
"update-failed": "Failed to update auth",
|
||||
"unhandled": "Unhandled error response"
|
||||
"unhandled": "Unhandled error response",
|
||||
"host-key-verify-failed": "<p>Host key verification failed.</p><p>The repository host key could not be verified. Please update your <code>known_hosts</code> file and try again.</p>"
|
||||
},
|
||||
"create-branch-list": {
|
||||
"invalid": "Invalid branch",
|
||||
@@ -905,8 +1055,18 @@
|
||||
},
|
||||
"editor-tab": {
|
||||
"properties": "Properties",
|
||||
"envProperties": "Environment Variables",
|
||||
"description": "Description",
|
||||
"appearance": "Appearance",
|
||||
"env": "Environment Variables"
|
||||
"preview": "UI Preview",
|
||||
"defaultValue": "Default value"
|
||||
},
|
||||
"languages" : {
|
||||
"de": "German",
|
||||
"en-US": "English",
|
||||
"ja": "Japanese",
|
||||
"ko": "Korean",
|
||||
"zh-CN": "Chinese(Simplified)",
|
||||
"zh-TW": "Chinese(Traditional)"
|
||||
}
|
||||
}
|
||||
|
2
packages/node_modules/@node-red/editor-client/locales/en-US/infotips.json
vendored
Normal file → Executable file
@@ -4,7 +4,7 @@
|
||||
"tip1" : "Search for nodes using {{core:search}}",
|
||||
"tip2" : "{{core:toggle-sidebar}} will toggle the view of this sidebar",
|
||||
"tip3" : "You can manage your palette of nodes with {{core:manage-palette}}",
|
||||
"tip4" : "Your flow configuration nodes are listed in the sidebar panel. It can been accessed from the menu or with {{core:show-config-tab}}",
|
||||
"tip4" : "Your flow configuration nodes are listed in the sidebar panel. It can be accessed from the menu or with {{core:show-config-tab}}",
|
||||
"tip5" : "Enable or disable these tips from the option in the settings",
|
||||
"tip6" : "Move the selected nodes using the [left] [up] [down] and [right] keys. Hold [shift] to nudge them further",
|
||||
"tip7" : "Dragging a node onto a wire will splice it into the link",
|
||||
|
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"$string": {
|
||||
"args": "arg",
|
||||
"desc": "Casts the *arg* parameter to a string using the following casting rules:\n\n - Strings are unchanged\n - Functions are converted to an empty string\n - Numeric infinity and NaN throw an error because they cannot be represented as a JSON number\n - All other values are converted to a JSON string using the `JSON.stringify` function"
|
||||
"args": "arg[, prettify]",
|
||||
"desc": "Casts the `arg` parameter to a string using the following casting rules:\n\n - Strings are unchanged\n - Functions are converted to an empty string\n - Numeric infinity and NaN throw an error because they cannot be represented as a JSON number\n - All other values are converted to a JSON string using the `JSON.stringify` function. If `prettify` is true, then \"prettified\" JSON is produced. i.e One line per field and lines will be indented based on the field depth."
|
||||
},
|
||||
"$length": {
|
||||
"args": "str",
|
||||
@@ -185,7 +185,7 @@
|
||||
},
|
||||
"$reduce": {
|
||||
"args":"array, function [, init]",
|
||||
"desc":"Returns an aggregated value derived from applying the `function` parameter successively to each value in `array` in combination with the result of the previous application of the function.\n\nThe function must accept two arguments, and behaves like an infix operator between each value within the `array`.\n\nThe optional `init` parameter is used as the initial value in the aggregation."
|
||||
"desc":"Returns an aggregated value derived from applying the `function` parameter successively to each value in `array` in combination with the result of the previous application of the function.\n\nThe function must accept two arguments, and behaves like an infix operator between each value within the `array`. The signature of `function` must be of the form: `myfunc($accumulator, $value[, $index[, $array]])`\n\nThe optional `init` parameter is used as the initial value in the aggregation."
|
||||
},
|
||||
"$flowContext": {
|
||||
"args": "string[, string]",
|
||||
@@ -230,6 +230,45 @@
|
||||
"$parseInteger": {
|
||||
"args": "string, picture",
|
||||
"desc": "Parses the contents of the `string` parameter to an integer (as a JSON number) using the format specified by the `picture` string. The `picture` string parameter has the same format as `$formatInteger`."
|
||||
|
||||
},
|
||||
"$error": {
|
||||
"args": "[str]",
|
||||
"desc": "Throws an error with a message. The optional `str` will replace the default message of `$error() function evaluated`"
|
||||
},
|
||||
"$assert": {
|
||||
"args": "arg, str",
|
||||
"desc": "If `arg` is true the function returns undefined. If `arg` is false an exception is thrown with `str` as the message of the exception."
|
||||
},
|
||||
"$single": {
|
||||
"args": "array, function",
|
||||
"desc": "Returns the one and only value in the `array` parameter that satisfies the `function` predicate (i.e. the `function` returns Boolean `true` when passed the value). Throws an exception if the number of matching values is not exactly one.\n\nThe function should be supplied in the following signature: `function(value [, index [, array]])` where value is each input of the array, index is the position of that value and the whole array is passed as the third argument"
|
||||
},
|
||||
"$encodeUrl": {
|
||||
"args": "str",
|
||||
"desc": "Encodes a Uniform Resource Locator (URL) component by replacing each instance of certain characters by one, two, three, or four escape sequences representing the UTF-8 encoding of the character.\n\nExample: `$encodeUrlComponent(\"?x=test\")` => `\"%3Fx%3Dtest\"`"
|
||||
},
|
||||
"$encodeUrlComponent": {
|
||||
"args": "str",
|
||||
"desc": "Encodes a Uniform Resource Locator (URL) by replacing each instance of certain characters by one, two, three, or four escape sequences representing the UTF-8 encoding of the character. \n\nExample: `$encodeUrl(\"https://mozilla.org/?x=шеллы\")` => `\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\"`"
|
||||
},
|
||||
"$decodeUrl": {
|
||||
"args": "str",
|
||||
"desc": "Decodes a Uniform Resource Locator (URL) component previously created by encodeUrlComponent. \n\nExample: `$decodeUrlComponent(\"%3Fx%3Dtest\")` => `\"?x=test\"`"
|
||||
},
|
||||
"$decodeUrlComponent": {
|
||||
"args": "str",
|
||||
"desc": "Decodes a Uniform Resource Locator (URL) previously created by encodeUrl. \n\nExample: `$decodeUrl(\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\")` => `\"https://mozilla.org/?x=шеллы\"`"
|
||||
},
|
||||
"$distinct": {
|
||||
"args": "array",
|
||||
"desc": "Returns an array with duplicate values removed from `array`"
|
||||
},
|
||||
"$type": {
|
||||
"args": "value",
|
||||
"desc": "Returns the type of `value` as a string. If `value` is undefined, this will return `undefined`"
|
||||
},
|
||||
"$moment": {
|
||||
"args": "[str]",
|
||||
"desc": "Gets a date object using the Moment library."
|
||||
}
|
||||
}
|
||||
|
240
packages/node_modules/@node-red/editor-client/locales/ja/editor.json
vendored
Executable file → Normal file
@@ -14,9 +14,35 @@
|
||||
"back": "戻る",
|
||||
"next": "進む",
|
||||
"clone": "プロジェクトをクローン",
|
||||
"cont": "続ける"
|
||||
"cont": "続ける",
|
||||
"style": "形式",
|
||||
"line": "線",
|
||||
"fill": "塗りつぶし",
|
||||
"label": "ラベル",
|
||||
"color": "色",
|
||||
"position": "配置",
|
||||
"enable": "有効",
|
||||
"disable": "無効"
|
||||
},
|
||||
"type": {
|
||||
"string": "文字列",
|
||||
"number": "数値",
|
||||
"boolean": "真偽値",
|
||||
"array": "配列",
|
||||
"buffer": "バッファ",
|
||||
"object": "オブジェクト",
|
||||
"jsonString": "JSON文字列",
|
||||
"undefined": "undefined",
|
||||
"null": "null"
|
||||
}
|
||||
},
|
||||
"event": {
|
||||
"loadPalette": "パレットを読み込み中",
|
||||
"loadNodeCatalogs": "ノードカタログを読み込み中",
|
||||
"loadNodes": "ノードを読み込み中 __count__",
|
||||
"loadFlows": "フローを読み込み中",
|
||||
"importFlows": "ワークスペースにフローを追加中"
|
||||
},
|
||||
"workspace": {
|
||||
"defaultName": "フロー __number__",
|
||||
"editFlow": "フローを編集: __name__",
|
||||
@@ -24,10 +50,12 @@
|
||||
"delete": "本当に '__label__' を削除しますか?",
|
||||
"dropFlowHere": "ここにフローをドロップしてください",
|
||||
"addFlow": "フローの追加",
|
||||
"listFlows": "フロー一覧",
|
||||
"status": "状態",
|
||||
"enabled": "有効",
|
||||
"disabled": "無効",
|
||||
"info": "詳細"
|
||||
"info": "詳細",
|
||||
"selectNodes": "ノードをクリックして選択"
|
||||
},
|
||||
"menu": {
|
||||
"label": {
|
||||
@@ -41,7 +69,9 @@
|
||||
"defaultDir": "標準",
|
||||
"ltr": "左から右",
|
||||
"rtl": "右から左",
|
||||
"auto": "文脈"
|
||||
"auto": "文脈",
|
||||
"language": "表示言語",
|
||||
"browserDefault": "ブラウザのデフォルト"
|
||||
},
|
||||
"sidebar": {
|
||||
"show": "サイドバーを表示"
|
||||
@@ -52,15 +82,12 @@
|
||||
"settings": "設定",
|
||||
"userSettings": "ユーザ設定",
|
||||
"nodes": "ノード",
|
||||
"displayStatus": "ノードの状態を表示",
|
||||
"displayStatus": "ノードのステータスを表示",
|
||||
"displayConfig": "ノードの設定",
|
||||
"import": "読み込み",
|
||||
"export": "書き出し",
|
||||
"search": "ノードを検索",
|
||||
"searchInput": "ノードを検索",
|
||||
"clipboard": "クリップボード",
|
||||
"library": "ライブラリ",
|
||||
"examples": "サンプル",
|
||||
"subflows": "サブフロー",
|
||||
"createSubflow": "サブフローを作成",
|
||||
"selectionToSubflow": "選択部分をサブフロー化",
|
||||
@@ -79,7 +106,12 @@
|
||||
"projects-new": "新規",
|
||||
"projects-open": "開く",
|
||||
"projects-settings": "設定",
|
||||
"showNodeLabelDefault": "追加したノードのラベルを表示する"
|
||||
"showNodeLabelDefault": "追加したノードのラベルを表示",
|
||||
"groups": "グループ",
|
||||
"groupSelection": "選択部分をグループ化",
|
||||
"ungroupSelection": "選択部分をグループ解除",
|
||||
"groupMergeSelection": "選択部分をマージ",
|
||||
"groupRemoveSelection": "グループから削除"
|
||||
}
|
||||
},
|
||||
"actions": {
|
||||
@@ -107,7 +139,7 @@
|
||||
"undeployedChanges": "ノードの変更をデプロイしていません",
|
||||
"nodeActionDisabled": "ノードのアクションは無効になっています",
|
||||
"nodeActionDisabledSubflow": "ノードのアクションは、サブフロー内で無効になっています",
|
||||
"missing-types": "不明なノードが存在するため、フローを停止しました。詳細はログを確認してください。",
|
||||
"missing-types": "<p>不明なノードが存在するため、フローを停止しました。</p>",
|
||||
"safe-mode": "<p>セーフモードでフローを停止しました</p><p>フローを変更し、再起動するために変更をデプロイできます</p>",
|
||||
"restartRequired": "更新されたモジュールを有効化するため、Node-REDを再起動する必要があります",
|
||||
"credentials_load_failed": "<p>認証情報を復号できないため、フローを停止しました</p><p>フローの認証情報ファイルは暗号化されています。しかし、プロジェクトの暗号鍵が存在しない、または不正です</p>",
|
||||
@@ -125,7 +157,7 @@
|
||||
"lostConnectionTry": "すぐに接続",
|
||||
"cannotAddSubflowToItself": "サブフロー自身を追加できません",
|
||||
"cannotAddCircularReference": "循環参照を検出したため、サブフローを追加できません",
|
||||
"unsupportedVersion": "<p>サポートされていないバージョンのNode.jsを使用しています。</p><p><br/>最新のNode.js LTSに更新してください。</p>",
|
||||
"unsupportedVersion": "<p>サポートされていないバージョンのNode.jsを使用しています。</p><p>最新のNode.js LTSに更新してください。</p>",
|
||||
"failedToAppendNode": "<p>'__module__'がロードできませんでした。</p><p>__error__</p>"
|
||||
},
|
||||
"project": {
|
||||
@@ -135,7 +167,12 @@
|
||||
"updated": "プロジェクト'__project__'を更新しました",
|
||||
"pull": "プロジェクト'__project__'を再ロードしました",
|
||||
"revert": "プロジェクト'__project__'を取り消しました",
|
||||
"merge-complete": "Gitマージが完了しました"
|
||||
"merge-complete": "Gitマージが完了しました",
|
||||
"setupCredentials": "認証情報を設定",
|
||||
"setupProjectFiles": "プロジェクトファイルの設定",
|
||||
"no": "結構です",
|
||||
"createDefault": "デフォルトのプロジェクトファイルを作成",
|
||||
"mergeConflict": "マージの衝突を表示"
|
||||
},
|
||||
"label": {
|
||||
"manage-project-dep": "プロジェクトの依存関係の管理",
|
||||
@@ -148,16 +185,18 @@
|
||||
}
|
||||
},
|
||||
"clipboard": {
|
||||
"clipboard": "クリップボード",
|
||||
"nodes": "ノード",
|
||||
"node": "__count__ 個のノード",
|
||||
"node_plural": "__count__ 個のノード",
|
||||
"configNode": "__count__ 個の設定ノード",
|
||||
"configNode_plural": "__count__ 個の設定ノード",
|
||||
"group": "__count__ 個のグループ",
|
||||
"group_plural": "__count__ 個のグループ",
|
||||
"flow": "__count__ 個のフロー",
|
||||
"flow_plural": "__count__ 個のフロー",
|
||||
"subflow": "__count__ 個のサブフロー",
|
||||
"subflow_plural": "__count__ 個のサブフロー",
|
||||
"selectNodes": "上のテキストを選択し、クリップボードへコピーしてください",
|
||||
"pasteNodes": "JSON形式のフローデータを貼り付けてください",
|
||||
"selectFile": "読み込むファイルを選択してください",
|
||||
"importNodes": "フローをクリップボートから読み込み",
|
||||
@@ -169,6 +208,9 @@
|
||||
"nodesImported": "読み込みました:",
|
||||
"nodeCopied": "__count__ 個のノードをコピーしました",
|
||||
"nodeCopied_plural": "__count__ 個のノードをコピーしました",
|
||||
"groupCopied": "__count__ 個のグループをコピーしました",
|
||||
"groupCopied_plural": "__count__ 個のグループをコピーしました",
|
||||
"groupStyleCopied": "グループの形式をコピーしました",
|
||||
"invalidFlow": "不正なフロー: __message__",
|
||||
"export": {
|
||||
"selected": "選択したフロー",
|
||||
@@ -176,7 +218,11 @@
|
||||
"all": "全てのタブ",
|
||||
"compact": "インデントのないJSONフォーマット",
|
||||
"formatted": "インデント付きのJSONフォーマット",
|
||||
"copy": "書き出し"
|
||||
"copy": "書き出し",
|
||||
"export": "ライブラリに書き出し",
|
||||
"exportAs": "書き出し先",
|
||||
"overwrite": "更新",
|
||||
"exists": "<p><b>\"__file__\"</b>は既に存在します。</p><p>更新しますか?</p>"
|
||||
},
|
||||
"import": {
|
||||
"import": "読み込み先",
|
||||
@@ -266,8 +312,9 @@
|
||||
"newVersionError": "新しいバージョンは正しいJSON形式ではありません:"
|
||||
},
|
||||
"subflow": {
|
||||
"editSubflow": "フローのテンプレートを編集: __name__",
|
||||
"edit": "フローのテンプレートを編集",
|
||||
"editSubflowInstance": "サブフローインスタンスを編集: __name__",
|
||||
"editSubflow": "サブフローのテンプレートを編集: __name__",
|
||||
"edit": "サブフローのテンプレートを編集",
|
||||
"subflowInstances": "このサブフローのテンプレートのインスタンスが __count__ 個存在します",
|
||||
"subflowInstances_plural": "このサブフローのテンプレートのインスタンスが __count__ 個存在します",
|
||||
"editSubflowProperties": "プロパティを編集",
|
||||
@@ -286,6 +333,13 @@
|
||||
"multipleInputsToSelection": "<strong>サブフローを作成できません</strong>: 複数の入力が選択されています"
|
||||
}
|
||||
},
|
||||
"group": {
|
||||
"editGroup": "__name__ グループを編集",
|
||||
"errors": {
|
||||
"cannotCreateDiffGroups": "異なるグループのノードを使用してグループを作成することはできません",
|
||||
"cannotAddSubflowPorts": "グループにサブフローの端子を追加できません"
|
||||
}
|
||||
},
|
||||
"editor": {
|
||||
"configEdit": "編集",
|
||||
"configAdd": "追加",
|
||||
@@ -299,10 +353,12 @@
|
||||
"addNewType": "新規に __type__ を追加...",
|
||||
"nodeProperties": "プロパティ",
|
||||
"label": "ラベル",
|
||||
"color": "色",
|
||||
"portLabels": "ポートラベル",
|
||||
"labelInputs": "入力",
|
||||
"labelOutputs": "出力",
|
||||
"settingIcon": "アイコン",
|
||||
"default": "デフォルト",
|
||||
"noDefaultLabel": "なし",
|
||||
"defaultLabel": "既定のラベルを使用",
|
||||
"searchIcons": "アイコンを検索",
|
||||
@@ -310,8 +366,45 @@
|
||||
"description": "詳細",
|
||||
"show": "表示",
|
||||
"hide": "非表示",
|
||||
"locale": "UI言語の選択",
|
||||
"icon": "記号",
|
||||
"inputType": "入力形式",
|
||||
"selectType": "形式選択...",
|
||||
"inputs": {
|
||||
"input": "入力",
|
||||
"select": "メニュー",
|
||||
"checkbox": "チェックボックス",
|
||||
"spinner": "スピナー",
|
||||
"none": "無し",
|
||||
"hidden": "非表示"
|
||||
},
|
||||
"types": {
|
||||
"str": "文字列",
|
||||
"num": "数値",
|
||||
"bool": "真偽",
|
||||
"json": "JSON",
|
||||
"bin": "バッファ",
|
||||
"env": "環境変数",
|
||||
"cred": "認証情報"
|
||||
},
|
||||
"menu": {
|
||||
"input": "入力",
|
||||
"select": "選択",
|
||||
"checkbox": "チェックボックス",
|
||||
"spinner": "数値",
|
||||
"hidden": "ラベルのみ"
|
||||
},
|
||||
"select": {
|
||||
"label": "ラベル",
|
||||
"value": "値"
|
||||
},
|
||||
"spinner": {
|
||||
"min": "最小値",
|
||||
"max": "最大値"
|
||||
},
|
||||
"errors": {
|
||||
"scopeChange": "スコープの変更は、他のフローで使われているノードを無効にします"
|
||||
"scopeChange": "スコープの変更は、他のフローで使われているノードを無効にします",
|
||||
"invalidProperties": "プロパティが不正です:"
|
||||
}
|
||||
},
|
||||
"keyboard": {
|
||||
@@ -339,25 +432,26 @@
|
||||
"pasteNode": "ノードを貼り付け",
|
||||
"undoChange": "変更操作を戻す",
|
||||
"searchBox": "ノードを検索",
|
||||
"managePalette": "パレットの管理"
|
||||
"managePalette": "パレットの管理",
|
||||
"actionList": "動作一覧"
|
||||
},
|
||||
"library": {
|
||||
"library": "ライブラリ",
|
||||
"openLibrary": "ライブラリを開く",
|
||||
"saveToLibrary": "ライブラリへ保存",
|
||||
"typeLibrary": "__type__ ライブラリ",
|
||||
"unnamedType": "名前なし __type__",
|
||||
"exportToLibrary": "ライブラリへフローを書き出す",
|
||||
"exportedToLibrary": "ライブラリにノードを書き出しました",
|
||||
"dialogSaveOverwrite": "__libraryName__ という __libraryType__ は既に存在しています 上書きしますか?",
|
||||
"invalidFilename": "不正なファイル名",
|
||||
"savedNodes": "フローを保存しました",
|
||||
"savedType": "__type__ を保存しました",
|
||||
"saveFailed": "保存に失敗しました: __message__",
|
||||
"filename": "ファイル名",
|
||||
"folder": "フォルダ",
|
||||
"filenamePlaceholder": "ファイル",
|
||||
"fullFilenamePlaceholder": "a/b/file",
|
||||
"folderPlaceholder": "a/b",
|
||||
"breadcrumb": "ライブラリ"
|
||||
"newFolder": "新規フォルダ",
|
||||
"types": {
|
||||
"local": "ローカル",
|
||||
"examples": "サンプル"
|
||||
}
|
||||
},
|
||||
"palette": {
|
||||
"noInfo": "情報がありません",
|
||||
@@ -366,9 +460,13 @@
|
||||
"addCategory": "新規追加...",
|
||||
"label": {
|
||||
"subflows": "サブフロー",
|
||||
"network": "ネットワーク",
|
||||
"common": "共通",
|
||||
"input": "入力",
|
||||
"output": "出力",
|
||||
"function": "機能",
|
||||
"sequence": "シーケンス",
|
||||
"parser": "パーサ",
|
||||
"social": "ソーシャル",
|
||||
"storage": "ストレージ",
|
||||
"analysis": "分析",
|
||||
@@ -436,7 +534,7 @@
|
||||
"more": "+ さらに __count__ 個",
|
||||
"errors": {
|
||||
"catalogLoadFailed": "<p>ノードのカタログの読み込みに失敗しました。</p><p>詳細はブラウザのコンソールを確認してください。</p>",
|
||||
"installFailed": "<p.追加処理が失敗しました: __module__</p><p>__message__</p><p>詳細はログを確認してください。</p>",
|
||||
"installFailed": "<p>追加処理が失敗しました: __module__</p><p>__message__</p><p>詳細はログを確認してください。</p>",
|
||||
"removeFailed": "<p>削除処理が失敗しました: __module__</p><p>__message__</p><p>詳細はログを確認してください。</p>",
|
||||
"updateFailed": "<p>更新処理が失敗しました: __module__</p><p>__message__</p><p>詳細はログを確認してください。</p>",
|
||||
"enableFailed": "<p>有効化処理が失敗しました: __module__</p><p>__message__</p><p>詳細はログを確認してください。</p>",
|
||||
@@ -474,6 +572,7 @@
|
||||
"label": "情報",
|
||||
"node": "ノード",
|
||||
"type": "型",
|
||||
"group": "グループ",
|
||||
"module": "モジュール",
|
||||
"id": "ID",
|
||||
"status": "状態",
|
||||
@@ -496,7 +595,29 @@
|
||||
"nodeHelp": "ノードのヘルプ",
|
||||
"none": "なし",
|
||||
"arrayItems": "__count__ 要素",
|
||||
"showTips": "設定からヒントを表示できます"
|
||||
"showTips": "設定からヒントを表示できます",
|
||||
"outline": "アウトライン",
|
||||
"empty": "空",
|
||||
"globalConfig": "グローバル設定ノード",
|
||||
"triggerAction": "アクションを実行",
|
||||
"find": "ワークスペース内を検索",
|
||||
"search": {
|
||||
"configNodes": "設定ノード",
|
||||
"unusedConfigNodes": "未使用の設定ノード",
|
||||
"invalidNodes": "不正なノード",
|
||||
"uknownNodes": "未知のノード",
|
||||
"unusedSubflows": "未使用のサブフロー"
|
||||
}
|
||||
},
|
||||
"help": {
|
||||
"name": "ヘルプ",
|
||||
"label": "ヘルプ",
|
||||
"search": "ヘルプを検索",
|
||||
"nodeHelp": "ノードヘルプ",
|
||||
"showHelp": "ヘルプを表示",
|
||||
"showInOutline": "アウトラインに表示",
|
||||
"showTopics": "トピックを表示",
|
||||
"noHelp": "ヘルプのトピックが未選択"
|
||||
},
|
||||
"config": {
|
||||
"name": "ノードの設定を表示",
|
||||
@@ -505,8 +626,10 @@
|
||||
"none": "なし",
|
||||
"subflows": "サブフロー",
|
||||
"flows": "フロー",
|
||||
"filterUnused": "未使用",
|
||||
"filterAll": "全て",
|
||||
"showAllConfigNodes": "全設定ノードを表示",
|
||||
"filterUnused": "未使用",
|
||||
"showAllUnusedConfigNodes": "未使用の全設定ノードを表示",
|
||||
"filtered": "__count__ 個が無効"
|
||||
},
|
||||
"context": {
|
||||
@@ -515,10 +638,13 @@
|
||||
"none": "選択されていません",
|
||||
"refresh": "読み込みのため更新してください",
|
||||
"empty": "データが存在しません",
|
||||
"node": "Node",
|
||||
"flow": "Flow",
|
||||
"global": "Global",
|
||||
"deleteConfirm": "データを削除しても良いですか?"
|
||||
"node": "ノード",
|
||||
"flow": "フロー",
|
||||
"global": "グローバル",
|
||||
"deleteConfirm": "データを削除しても良いですか?",
|
||||
"autoRefresh": "選択対象が変化した場合更新",
|
||||
"refrsh": "更新",
|
||||
"delete": "削除"
|
||||
},
|
||||
"palette": {
|
||||
"name": "パレットの管理",
|
||||
@@ -530,9 +656,10 @@
|
||||
"description": "詳細",
|
||||
"dependencies": "依存関係",
|
||||
"settings": "設定",
|
||||
"noSummaryAvailable": "サマリが存在しません",
|
||||
"noSummaryAvailable": "要約が存在しません",
|
||||
"editDescription": "プロジェクトの詳細を編集",
|
||||
"editDependencies": "プロジェクトの依存関係を編集",
|
||||
"noDescriptionAvailable": "詳細が存在しません",
|
||||
"editReadme": "README.mdを編集",
|
||||
"showProjectSettings": "プロジェクト設定を表示",
|
||||
"projectSettings": {
|
||||
@@ -545,12 +672,16 @@
|
||||
"files": "ファイル",
|
||||
"flow": "フロー",
|
||||
"credentials": "認証情報",
|
||||
"package": "パッケージ",
|
||||
"packageCreate": "変更が保存された時にファイルが作成されます",
|
||||
"fileNotExist": "ファイルが存在しません",
|
||||
"selectFile": "ファイルを選択",
|
||||
"invalidEncryptionKey": "不正な暗号化キー",
|
||||
"encryptionEnabled": "暗号化が有効になっています",
|
||||
"encryptionDisabled": "暗号化が無効になっています",
|
||||
"setTheEncryptionKey": "暗号化キーを設定:",
|
||||
"resetTheEncryptionKey": "暗号化キーを初期化:",
|
||||
"changeTheEncryptionKey": "暗号化キーを変更:",
|
||||
"setTheEncryptionKey": "暗号化キーを設定",
|
||||
"resetTheEncryptionKey": "暗号化キーを初期化",
|
||||
"changeTheEncryptionKey": "暗号化キーを変更",
|
||||
"currentKey": "現在のキー",
|
||||
"newKey": "新規のキー",
|
||||
"credentialsAlert": "既存の認証情報は全て削除されます",
|
||||
@@ -682,7 +813,8 @@
|
||||
"bin": "バッファ",
|
||||
"date": "日時",
|
||||
"jsonata": "JSONata式",
|
||||
"env": "環境変数"
|
||||
"env": "環境変数",
|
||||
"cred": "認証情報"
|
||||
}
|
||||
},
|
||||
"editableList": {
|
||||
@@ -714,12 +846,28 @@
|
||||
"jsEditor": {
|
||||
"title": "JavaScriptエディタ"
|
||||
},
|
||||
"textEditor": {
|
||||
"title": "テキストエディタ"
|
||||
},
|
||||
"jsonEditor": {
|
||||
"title": "JSONエディタ",
|
||||
"format": "JSONフォーマット"
|
||||
"format": "JSONフォーマット",
|
||||
"rawMode": "JSONを編集",
|
||||
"uiMode": "ビジュアルエディタ",
|
||||
"insertAbove": "上に挿入",
|
||||
"insertBelow": "下に挿入",
|
||||
"addItem": "要素を追加",
|
||||
"copyPath": "要素のパスをコピー",
|
||||
"expandItems": "要素を展開",
|
||||
"collapseItems": "要素を折り畳む",
|
||||
"duplicate": "複製",
|
||||
"error": {
|
||||
"invalidJSON": "不正なJSON: "
|
||||
}
|
||||
},
|
||||
"markdownEditor": {
|
||||
"title": "マークダウンエディタ",
|
||||
"expand": "拡大",
|
||||
"format": "マークダウン形式で記述",
|
||||
"heading1": "見出しレベル1",
|
||||
"heading2": "見出しレベル2",
|
||||
@@ -749,6 +897,7 @@
|
||||
"desc2": "とりあえずこの処理をスキップしてもかまいません。「プロジェクト」メニューから、いつでもプロジェクトの作成を開始できます。",
|
||||
"create": "プロジェクトの作成",
|
||||
"clone": "プロジェクトのクローン",
|
||||
"openExistingProject": "既存のプロジェクトを開く",
|
||||
"not-right-now": "後にする"
|
||||
},
|
||||
"git-config": {
|
||||
@@ -879,13 +1028,14 @@
|
||||
"confirm": "<p>デプロイされていない変更は失われます。</p><p>続けますか?</p>"
|
||||
},
|
||||
"send-req": {
|
||||
"auth-req": "リポジトリ対する認証が必要です",
|
||||
"auth-req": "リポジトリに対する認証が必要です",
|
||||
"username": "ユーザ名",
|
||||
"password": "パスワード",
|
||||
"passphrase": "パスフレーズ",
|
||||
"retry": "リトライ",
|
||||
"update-failed": "認証の更新に失敗しました",
|
||||
"unhandled": "エラー応答が処理されませんでした"
|
||||
"unhandled": "エラー応答が処理されませんでした",
|
||||
"host-key-verify-failed": "<p>ホストキーの検証に失敗</p><p>リポジトリのホストキーを検証できませんでした。<code>known_hosts</code>ファイルを更新して、もう一度試してください。</p>"
|
||||
},
|
||||
"create-branch-list": {
|
||||
"invalid": "不正なブランチ",
|
||||
@@ -905,8 +1055,18 @@
|
||||
},
|
||||
"editor-tab": {
|
||||
"properties": "プロパティ",
|
||||
"envProperties": "環境変数",
|
||||
"description": "説明",
|
||||
"appearance": "外観",
|
||||
"env": "環境変数"
|
||||
"preview": "UIプレビュー",
|
||||
"defaultValue": "デフォルト値"
|
||||
},
|
||||
"languages": {
|
||||
"de": "ドイツ語",
|
||||
"en-US": "英語",
|
||||
"ja": "日本語",
|
||||
"ko": "韓国語",
|
||||
"zh-CN": "中国語(簡体)",
|
||||
"zh-TW": "中国語(繁体)"
|
||||
}
|
||||
}
|
||||
|
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"$string": {
|
||||
"args": "arg",
|
||||
"desc": "以下の型変換ルールを用いて、引数 *arg* を文字列へ型変換します。:\n\n - 文字列は変換しません。\n - 関数は空の文字列に変換します。\n - JSONの数値として表現できないため、無限大やNaNはエラーになります。\n - 他の値は `JSON.stringify` 関数を用いて、JSONの文字列へ変換します。"
|
||||
"args": "arg[, prettify]",
|
||||
"desc": "以下の型変換ルールを用いて、引数 *arg* を文字列へ型変換します。:\n\n - 文字列は変換しません。\n - 関数は空の文字列に変換します。\n - JSONの数値として表現できないため、無限大やNaNはエラーになります。\n - 他の値は `JSON.stringify` 関数を用いて、JSONの文字列へ変換します。`prettify`が真の場合、JSONを整形出力します。フィールドを1行毎に出力。フィールドのネスト深さによってインデントを行います。"
|
||||
},
|
||||
"$length": {
|
||||
"args": "str",
|
||||
@@ -185,7 +185,7 @@
|
||||
},
|
||||
"$reduce": {
|
||||
"args": "array, function [, init]",
|
||||
"desc": "配列の各要素値に関数 `function` を連続的に適用して得られる集約値を返します。 `function` の適用の際には、直前の `function` の適用結果と要素値が引数として与えられます。\n\n関数 `function` は引数を2つ取り、配列の各要素の間に配置する中置演算子のように作用しなくてはなりません。\n\n任意の引数 `init` には、集約時の初期値を設定します。"
|
||||
"desc": "配列の各要素値に関数 `function` を連続的に適用して得られる集約値を返します。 `function` の適用の際には、直前の `function` の適用結果と要素値が引数として与えられます。\n\n関数 `function` は引数を2つ取り、配列の各要素の間に配置する中置演算子のように作用しなくてはなりません。関数`function`のシグネチャは`myfunc($accumulator, $value[, $index[, $array]])`という形式でなければなりません。\n\n任意の引数 `init` には、集約時の初期値を設定します。"
|
||||
},
|
||||
"$flowContext": {
|
||||
"args": "string",
|
||||
@@ -221,7 +221,7 @@
|
||||
},
|
||||
"$eval": {
|
||||
"args": "expr [, context]",
|
||||
"desc": "JSONリテラルもしくはJSONata式を表す`expr`を評価します。評価の際には現在のコンテクストをコンテクストして用います。"
|
||||
"desc": "JSONリテラルもしくはJSONata式を表す`expr`を評価します。評価の際には現在のコンテキストをコンテキストとして用います。"
|
||||
},
|
||||
"$formatInteger": {
|
||||
"args": "number, picture",
|
||||
@@ -230,5 +230,45 @@
|
||||
"$parseInteger": {
|
||||
"args": "string, picture",
|
||||
"desc": "`picture`文字列の指定に従って、`string`パラメータを整数(JSON数値)に変換します。`picture`文字列は`$formatInteger`と同じ形式です。"
|
||||
},
|
||||
"$error": {
|
||||
"args": "[str]",
|
||||
"desc": "メッセージを指定して例外を送出します。メッセージ`str`を省略した場合は`$error() function evaluated`をメッセージとします。"
|
||||
},
|
||||
"$assert": {
|
||||
"args": "arg, str",
|
||||
"desc": "`arg`が真の場合、undefinedを返します。偽の場合、`str`をメッセージとする例外を送出します。"
|
||||
},
|
||||
"$single": {
|
||||
"args": "array, function",
|
||||
"desc": "`array`の要素のうち、条件判定関数`function`を満たす(`function`に与えた場合に真偽値`true`を返す)要素が1つのみである場合、それを返します。マッチする要素が1つのみでない場合、例外を送出します。\n\n指定する関数は`function(value [, index [, array]])`というシグネチャでなければなりません。ここで、`value`は`array`の要素値、`index`は要素の添字、第三引数には配列全体を渡します。"
|
||||
},
|
||||
"$encodeUrl": {
|
||||
"args": "str",
|
||||
"desc": "Uniform Resource Locator (URL)を構成する文字を1、2、3、もしくは、4文字エスケープシーケンスのUTF-8文字エンコーディングで置換します。\n\n例: `$encodeUrlComponent(\"?x=test\")` => `\"%3Fx%3Dtest\"`"
|
||||
},
|
||||
"$encodeUrlComponent": {
|
||||
"args": "str",
|
||||
"desc": "Uniform Resource Locator (URL)要素を構成する文字を1、2、3、もしくは、4文字エスケープシーケンスのUTF-8文字エンコーディングで置換します。\n\n例: `$encodeUrl(\"https://mozilla.org/?x=шеллы\")` => `\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\"`"
|
||||
},
|
||||
"$decodeUrl": {
|
||||
"args": "str",
|
||||
"desc": "encodeUrlComponentで置換したUniform Resource Locator (URL)をデコードします。\n\n例: `$decodeUrlComponent(\"%3Fx%3Dtest\")` => `\"?x=test\"`"
|
||||
},
|
||||
"$decodeUrlComponent": {
|
||||
"args": "str",
|
||||
"desc": "encodeUrlで置換したUniform Resource Locator (URL)要素をデコードします。 \n\n例: `$decodeUrl(\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\")` => `\"https://mozilla.org/?x=шеллы\"`"
|
||||
},
|
||||
"$distinct": {
|
||||
"args": "array",
|
||||
"desc": "配列`array`から重複要素を削除した配列を返します。"
|
||||
},
|
||||
"$type": {
|
||||
"args": "value",
|
||||
"desc": "`value` の型を文字列として返します。もし `value` が未定義の場合、 `undefined` が返されます。"
|
||||
},
|
||||
"$moment": {
|
||||
"args": "[str]",
|
||||
"desc": "Momentライブラリを使用して日付オブジェクトを取得します。"
|
||||
}
|
||||
}
|
||||
|
900
packages/node_modules/@node-red/editor-client/locales/ko/editor.json
vendored
Executable file
@@ -0,0 +1,900 @@
|
||||
{
|
||||
"common": {
|
||||
"label": {
|
||||
"name": "이름",
|
||||
"ok": "확인",
|
||||
"done": "완료",
|
||||
"cancel": "취소",
|
||||
"delete": "삭제",
|
||||
"close": "닫기",
|
||||
"load": "열기",
|
||||
"save": "저장",
|
||||
"import": "가져오기",
|
||||
"export": "내보내기",
|
||||
"back": "뒤로",
|
||||
"next": "앞으로",
|
||||
"clone": "프로젝트 복제",
|
||||
"cont": "계속하기"
|
||||
}
|
||||
},
|
||||
"workspace": {
|
||||
"defaultName": "플로우 __number__",
|
||||
"editFlow": "플로우 수정 : __name__",
|
||||
"confirmDelete": "삭제 확인",
|
||||
"delete": "정말로 '__label__' 을(를) 삭제하시겠습니까?",
|
||||
"dropFlowHere": "플로우를 이곳에 가져오세요",
|
||||
"addFlow": "플로우 추가",
|
||||
"status": "상태",
|
||||
"enabled": "사용가능",
|
||||
"disabled": "사용불가능",
|
||||
"info": "상세내역"
|
||||
},
|
||||
"menu": {
|
||||
"label": {
|
||||
"view": {
|
||||
"view": "창",
|
||||
"grid": "눈금선",
|
||||
"showGrid": "눈금선 보이기",
|
||||
"snapGrid": "노드 배치 보조 켜기",
|
||||
"gridSize": "눈금선 크기",
|
||||
"textDir": "텍스트 방향",
|
||||
"defaultDir": "기본",
|
||||
"ltr": "왼쪽 -> 오른쪽",
|
||||
"rtl": "오른쪽 -> 왼쪽",
|
||||
"auto": "자동배분"
|
||||
},
|
||||
"sidebar": {
|
||||
"show": "우측사이드바 보이기"
|
||||
},
|
||||
"palette": {
|
||||
"show": "팔렛트 보이기"
|
||||
},
|
||||
"settings": "설정",
|
||||
"userSettings": "사용자 설정",
|
||||
"nodes": "노드설정",
|
||||
"displayStatus": "노드상태 보이기",
|
||||
"displayConfig": "설정노드 보기",
|
||||
"import": "가져오기",
|
||||
"export": "내보내기",
|
||||
"search": "플로우 겅색",
|
||||
"searchInput": "플로우 검색",
|
||||
"subflows": "보조 플로우",
|
||||
"createSubflow": "보조 플로우 생성",
|
||||
"selectionToSubflow": "보조 플로우 선택",
|
||||
"flows": "플로우",
|
||||
"add": "추가",
|
||||
"rename": "이름변경",
|
||||
"delete": "삭제",
|
||||
"keyboardShortcuts": "단축키",
|
||||
"login": "로그인",
|
||||
"logout": "로그아웃",
|
||||
"editPalette": "팔렛트 관리",
|
||||
"other": "기타",
|
||||
"showTips": "Tip 보기",
|
||||
"help": "Node-RED 웹사이트",
|
||||
"projects": "프로젝트",
|
||||
"projects-new": "신규",
|
||||
"projects-open": "열기",
|
||||
"projects-settings": "프로젝트 설정",
|
||||
"showNodeLabelDefault": "새로 추가된 노드의 라벨 보이기"
|
||||
}
|
||||
},
|
||||
"actions": {
|
||||
"toggle-navigator": "네비게이터 표시/비표시",
|
||||
"zoom-out": "축소하기",
|
||||
"zoom-reset": "확대/축소 초기화",
|
||||
"zoom-in": "확대하기"
|
||||
},
|
||||
"user": {
|
||||
"loggedInAs": "__name__ 에 로그인됨",
|
||||
"username": "사용자명",
|
||||
"password": "비밀번호",
|
||||
"login": "로그인",
|
||||
"loginFailed": "로그인 실패",
|
||||
"notAuthorized": "권한이 없습니다",
|
||||
"errors": {
|
||||
"settings": "로그인 후 설정이 가능합니다",
|
||||
"deploy": "로그인 후 배포가 가능합니다",
|
||||
"notAuthorized": "이 기능은 로그인 후 사용가능합니다"
|
||||
}
|
||||
},
|
||||
"notification": {
|
||||
"warning": "<strong>경고</strong>: __message__",
|
||||
"warnings": {
|
||||
"undeployedChanges": "변경사항 배포가 취소되었습니다",
|
||||
"nodeActionDisabled": "노드 실행이 비활성화 되었습니다",
|
||||
"nodeActionDisabledSubflow": "보조 플로우에서 노드 실행이 비활성화 되었습니다",
|
||||
"missing-types": "<p>타입이 없는 노드로인해 플로우가 중지되었습니다</p>",
|
||||
"safe-mode": "<p>[안전모드] 플로우가 정지되었습니다.</p><p>플로우의 수정과 배포가 가능합니다. 다시 배포버튼을 누르세요.</p>",
|
||||
"restartRequired": "업그레이드한 모듈을 유효화하기 위해 Node-RED를 재시작 합니다 ",
|
||||
"credentials_load_failed": "<p>인증정보 복호화에 실패하여 플로우가 멈췄습니다. </p><p>인증정보는 암호화 되어있습니다. 프로젝트의 암호화 키가 깨졌거나 정상적이지 않습니다.</p>",
|
||||
"credentials_load_failed_reset": "<p>인증정보를 복호화할 수 없습니다</p><p>인증정보는 암호화 되어있습니다. 프로젝트의 암호화 키가 깨졌거나 정상적이지 않습니다.</p><p>다음 배포시 플로우의 인증정보는 초기화 될것입니다. 기존 모든 플로우의 인증정보가 지워집니다.</p>",
|
||||
"missing_flow_file": "<p>프로젝트 플로우 파일을 찾을 수 없습니다</p><p>프로젝트의 플로우 파일이 설정되지 않았습니다</p>",
|
||||
"missing_package_file": "<p>프로젝트 패키지 파일을 찾을 수 없습니다</p><p>프로젝트의 package.json 파일이 없습니다</p>",
|
||||
"project_empty": "<p>프로젝트가 누락되어 있습니다.</p><p>기본 프로젝트 파일을 만드시겠습니까?<br/>그렇지 않으면 수동으로 편집가 외부에 프로젝트 파일을 만드셔야 합니다.</p>",
|
||||
"project_not_found": "<p>'__project__' 가 없습니다.</p>",
|
||||
"git_merge_conflict": "<p>변경사항 자동병합에 실패했습니다.</p><p>병합되지 않은 충돌을 수정 후 재등록 하세요.</p>"
|
||||
},
|
||||
"error": "<strong>에러</strong>: __message__",
|
||||
"errors": {
|
||||
"lostConnection": "서버와 연결이 끊어졌습니다. 재접속을 시도합니다 ...",
|
||||
"lostConnectionReconnect": "서버와 연결이 끊어졌습니다. __time__ 초 안에 재접속을 시도합니다.",
|
||||
"lostConnectionTry": "지금 재접속",
|
||||
"cannotAddSubflowToItself": "서브플로우 자기자신을 추가할 수 없습니다",
|
||||
"cannotAddCircularReference": "순환참조가 발견되었습니다. 서브플로우를 추가할 수 없습니다",
|
||||
"unsupportedVersion": "<p>지원하지 않는 Node.js를 사용하고 있습니다</p><p>Node.js LTS 버전을 사용해 주세요</p>",
|
||||
"failedToAppendNode": "<p>'__module__' 읽어오기 실패</p><p>__error__</p>"
|
||||
},
|
||||
"project": {
|
||||
"change-branch": "로컬지점으로 '__project__' 변경",
|
||||
"merge-abort": "Git 병합을 중지했습니다.",
|
||||
"loaded": "'__project__' 프로젝트를 열었습니다",
|
||||
"updated": "'__project__'가 변경 되었습니다",
|
||||
"pull": "'__project__'를 다시 가져왔습니다",
|
||||
"revert": "'__project__'를 취소했습니다",
|
||||
"merge-complete": "Git 병합이 완료되었습니다"
|
||||
},
|
||||
"label": {
|
||||
"manage-project-dep": "프로젝트 의존성 관리",
|
||||
"setup-cred": "인증정보 설정",
|
||||
"setup-project": "프로젝트 파일 설정",
|
||||
"create-default-package": "기본 패키지 파일 생성",
|
||||
"no-thanks": "괜찮습니다",
|
||||
"create-default-project": "기본 프로젝트 파일 생성",
|
||||
"show-merge-conflicts": "병합 충돌 보여주기"
|
||||
}
|
||||
},
|
||||
"clipboard": {
|
||||
"clipboard": "클립보드",
|
||||
"nodes": "노드",
|
||||
"node": "__count__ 개의 노드",
|
||||
"node_plural": "__count__ 개의 노드",
|
||||
"configNode": "__count__ 개의 설정 노드",
|
||||
"configNode_plural": "__count__ 개의 설정 노드",
|
||||
"flow": "__count__ 개의 플로우",
|
||||
"flow_plural": "__count__ 개의 플로우",
|
||||
"subflow": "__count__ 개의 서브 플로우",
|
||||
"subflow_plural": "__count__ 개의 서브 플로우",
|
||||
"pasteNodes": "여기에 노드를 붙여넣기 하세요",
|
||||
"selectFile": "불러올 파일을 선택하세요",
|
||||
"importNodes": "노드 불러오기",
|
||||
"exportNodes": "클립보드에 노드 내보내기",
|
||||
"download": "다운로드",
|
||||
"importUnrecognised": "알 수 없는 형식 :",
|
||||
"importUnrecognised_plural": "알 수 없는 형식 :",
|
||||
"nodesExported": "클립보드에 노드 내보내기",
|
||||
"nodesImported": "불러오기 : ",
|
||||
"nodeCopied": "__count__개의 노드가 복사 되었습니다",
|
||||
"nodeCopied_plural": "__count__개의 노드가 복사 되었습니다",
|
||||
"invalidFlow": "정상적지 않은 플로우 : __message__",
|
||||
"export": {
|
||||
"selected": "선택된 노드",
|
||||
"current": "현재 플로우",
|
||||
"all": "모든 플로우",
|
||||
"compact": "압축형식",
|
||||
"formatted": "서식유지",
|
||||
"copy": "클립보드로 내보내기"
|
||||
},
|
||||
"import": {
|
||||
"import": "가져올 위치 : ",
|
||||
"newFlow": "새로운 플로우",
|
||||
"errors": {
|
||||
"notArray": "입력이 JSON 배열이 아닙니다",
|
||||
"itemNotObject": "입력이 올바른 플로우가 아닙니다 - __index__는 노드 오브젝트가 아닙니다",
|
||||
"missingId": "입력이 올바른 플로우가 아닙니다 - __index__의 'id' 속성이 없습니다",
|
||||
"missingType": "입력이 올바른 플로우가 아닙니다 - __index__의 'type' 속성이 없습니다"
|
||||
}
|
||||
},
|
||||
"copyMessagePath": "Path가 복사 되었습니다",
|
||||
"copyMessageValue": "Value가 복사 되었습니다",
|
||||
"copyMessageValue_truncated": "Truncated value가 복사 되었습니다"
|
||||
},
|
||||
"deploy": {
|
||||
"deploy": "배포하기",
|
||||
"full": "전체",
|
||||
"fullDesc": "작업공간 내 모든 플로우를 배포합니다",
|
||||
"modifiedFlows": "변경된 플로우",
|
||||
"modifiedFlowsDesc": "변경사항이 있는 플로우만 배포합니다",
|
||||
"modifiedNodes": "변경된 노드",
|
||||
"modifiedNodesDesc": "변경사항이 있는 노드만 배포합니다",
|
||||
"restartFlows": "플로우 재시작",
|
||||
"restartFlowsDesc": "현재 배포된 플로우를 재시작합니다",
|
||||
"successfulDeploy": "배포가 성공했습니다",
|
||||
"successfulRestart": "플로우 재시작을 성공했습니다",
|
||||
"deployFailed": "배포 실패 : __message__",
|
||||
"unusedConfigNodes": "사용되지 않는 설정노드가 있습니다",
|
||||
"unusedConfigNodesLink": "여기를 클릭하면 볼 수 있습니다",
|
||||
"errors": {
|
||||
"noResponse": "서버의 응답이 없습니다"
|
||||
},
|
||||
"confirm": {
|
||||
"button": {
|
||||
"ignore": "무시",
|
||||
"confirm": "배포 확인",
|
||||
"review": "변경사항 보기",
|
||||
"cancel": "취소",
|
||||
"merge": "병합",
|
||||
"overwrite": "무시하고 배포하기"
|
||||
},
|
||||
"undeployedChanges": "배포되지 않은 변경사항이 있습니다.\n\n이 페이지를 떠나면 변경사항이 사라집니다",
|
||||
"improperlyConfigured": "작업공간에 올바르게 구성되지 않은 노드가 있습니다 :",
|
||||
"unknown": "작업공간에 알려지지 않는 노드타입이 있습니다 :",
|
||||
"confirm": "배포하시겠습니까?",
|
||||
"doNotWarn": "이 경고를 무시",
|
||||
"conflict": "서버가 최신 플로우를 사용중입니다",
|
||||
"backgroundUpdate": "플로우가 변경되었습니다",
|
||||
"conflictChecking": "변경사항이 자동으로 병합될 수 있는지 확인",
|
||||
"conflictAutoMerge": "변경사항에 충돌이 없습니다. 자동병합이 가능합니다",
|
||||
"conflictManualMerge": "변경사항에 충돌이 있습니다. 배포하기 전에 충돌을 해결하세요",
|
||||
"plusNMore": "+ __count__ 개 더보기"
|
||||
}
|
||||
},
|
||||
"eventLog": {
|
||||
"title": "이벤트 로그",
|
||||
"view": "로그 보기"
|
||||
},
|
||||
"diff": {
|
||||
"unresolvedCount": "__count__개의 충돌이 해결되지 않음",
|
||||
"unresolvedCount_plural": "__count__개의 충돌이 해결되지 않음",
|
||||
"globalNodes": "Global 노드",
|
||||
"flowProperties": "플로우 속성",
|
||||
"type": {
|
||||
"added": "추가됨",
|
||||
"changed": "변경됨",
|
||||
"unchanged": "변경없음",
|
||||
"deleted": "삭제됨",
|
||||
"flowDeleted": "플로우 삭제됨",
|
||||
"flowAdded": "플로우 추가됨",
|
||||
"movedTo": "__id__로 이동됨",
|
||||
"movedFrom": "__id__로 부터 이동됨"
|
||||
},
|
||||
"nodeCount": "__count__ 개의 노드",
|
||||
"nodeCount_plural": "__count__ 개의 노드",
|
||||
"local": "로컬 변경사항",
|
||||
"remote": "원격 변경사항",
|
||||
"reviewChanges": "변경사항 살펴보기",
|
||||
"noBinaryFileShowed": "바이너리파일 내용을 볼수 없습니다",
|
||||
"viewCommitDiff": "변경사항 보기",
|
||||
"compareChanges": "변경사항 비교",
|
||||
"saveConflict": "충돌 해결내용 저장",
|
||||
"conflictHeader": "<span>__unresolved__</span> 개 중 <span>__resolved__</span> 충돌이 해결됨",
|
||||
"commonVersionError": "Common Version의 JSON 형식이 올바르지 않습니다 :",
|
||||
"oldVersionError": "Old Version의 JSON 형식이 올바르지 않습니다 :",
|
||||
"newVersionError": "New Version의 JSON 형식이 올바르지 않습니다 :"
|
||||
},
|
||||
"subflow": {
|
||||
"editSubflow": "플로우 템플릿 수정 : __name__",
|
||||
"edit": "플로우 템플릿 수정",
|
||||
"subflowInstances": "서브 플로우 템플릿에 __count__개의 인스턴스가 있습니다",
|
||||
"subflowInstances_plural": "서브 플로우 템플릿에 __count__개의 인스턴스가 있습니다",
|
||||
"editSubflowProperties": "속성 수정",
|
||||
"input": "입력:",
|
||||
"output": "출력:",
|
||||
"deleteSubflow": "서브 플로우 삭제",
|
||||
"info": "상세내역",
|
||||
"category": "카테고리",
|
||||
"errors": {
|
||||
"noNodesSelected": "<strong>서브 플로우를 생성할 수 없습니다</strong> : 노드가 선택되지 않았습니다",
|
||||
"multipleInputsToSelection": "<strong>서브 플로우를 생성할 수 없습니다</strong> : 복수의 입력이 선택되었습니다"
|
||||
}
|
||||
},
|
||||
"editor": {
|
||||
"configEdit": "수정",
|
||||
"configAdd": "추가",
|
||||
"configUpdate": "변경",
|
||||
"configDelete": "삭제",
|
||||
"nodesUse": "__count__개의 노드가 이 설정을 사용중입니다",
|
||||
"nodesUse_plural": "__count__개의 노드가 이 설정을 사용중입니다",
|
||||
"addNewConfig": "__type__의 설정노드 추가",
|
||||
"editNode": "__type__의 노드 수정",
|
||||
"editConfig": "__type__의 설정노드 수정",
|
||||
"addNewType": "__type__의 노드타입 추가 ...",
|
||||
"nodeProperties": "노드 속성",
|
||||
"label": "명칭",
|
||||
"portLabels": "포트 설정",
|
||||
"labelInputs": "입력",
|
||||
"labelOutputs": "출력",
|
||||
"settingIcon": "아이콘",
|
||||
"noDefaultLabel": "없음",
|
||||
"defaultLabel": "기본 명칭",
|
||||
"searchIcons": "아이콘 조회",
|
||||
"useDefault": "기본설정 사용",
|
||||
"description": "상세 내역",
|
||||
"show": "보이기",
|
||||
"hide": "숨기기",
|
||||
"errors": {
|
||||
"scopeChange": "범위를 변경하게 되면 다른 플로우의 노드가 사용이 불가능해 집니다."
|
||||
}
|
||||
},
|
||||
"keyboard": {
|
||||
"title": "키보드 단축키",
|
||||
"keyboard": "키보드",
|
||||
"filterActions": "필터",
|
||||
"shortcut": "단축키",
|
||||
"scope": "범위",
|
||||
"unassigned": "미할당",
|
||||
"global": "글로벌",
|
||||
"workspace": "작업공간",
|
||||
"selectAll": "모든 노드 선택",
|
||||
"selectAllConnected": "모든 연결된 노드 선택",
|
||||
"addRemoveNode": "노드 추가/삭제",
|
||||
"editSelected": "선택된 노드 수정",
|
||||
"deleteSelected": "선택된 노드나 링크를 삭제",
|
||||
"importNode": "노드 불러오기",
|
||||
"exportNode": "노드 내보내기",
|
||||
"nudgeNode": "선택된 노드 이동 (1px)",
|
||||
"moveNode": "선택된 노드 이동 (20px)",
|
||||
"toggleSidebar": "사이드바 표시/비표시",
|
||||
"togglePalette": "팔렛트 표시/비표시",
|
||||
"copyNode": "선택된 노드 복사",
|
||||
"cutNode": "선택된 노드 잘라내기",
|
||||
"pasteNode": "노드 붙여넣기",
|
||||
"undoChange": "마지막 변경 되돌리기",
|
||||
"searchBox": "검색창 열기",
|
||||
"managePalette": "팔렛트 관리"
|
||||
},
|
||||
"library": {
|
||||
"library": "라이브러리",
|
||||
"openLibrary": "라이브러리 열기...",
|
||||
"saveToLibrary": "라이브러리로 저장...",
|
||||
"typeLibrary": "__type__ 라이브러리",
|
||||
"unnamedType": "이름없는 __type__",
|
||||
"dialogSaveOverwrite": "__libraryType__이 __libraryName__으로 이미 등록되어있습니다. 덮어쓸까요?",
|
||||
"invalidFilename": "파일명이 올바르지 않습니다",
|
||||
"savedNodes": "저장된 노드",
|
||||
"savedType": "저장된 __type__",
|
||||
"saveFailed": "저장 실패 : __message__",
|
||||
"types": {
|
||||
"examples": "예시"
|
||||
}
|
||||
},
|
||||
"palette": {
|
||||
"noInfo": "정보 없음",
|
||||
"filter": "필터",
|
||||
"search": "모듈 검색",
|
||||
"addCategory": "추가 ...",
|
||||
"label": {
|
||||
"subflows": "서브 플로우",
|
||||
"input": "입력",
|
||||
"output": "출력",
|
||||
"function": "기능",
|
||||
"social": "소셜",
|
||||
"storage": "저장",
|
||||
"analysis": "분석",
|
||||
"advanced": "그 외"
|
||||
},
|
||||
"actions": {
|
||||
"collapse-all": "모든 카테고리 접기",
|
||||
"expand-all": "모든 카테고리 펼치기"
|
||||
},
|
||||
"event": {
|
||||
"nodeAdded": "팔렛트에 노드가 추가되었습니다:",
|
||||
"nodeAdded_plural": "팔렛트에 노드가 추가되었습니다:",
|
||||
"nodeRemoved": "팔렛트에서 노드가 삭제되었습니다:",
|
||||
"nodeRemoved_plural": "팔렛트에서 노드가 삭제되었습니다:",
|
||||
"nodeEnabled": "노드가 활성화 되었습니다:",
|
||||
"nodeEnabled_plural": "노드가 활성화 되었습니다:",
|
||||
"nodeDisabled": "노드가 비활성화 되었습니다:",
|
||||
"nodeDisabled_plural": "노드가 비활성화 되었습니다:",
|
||||
"nodeUpgraded": "__module__ 노드모듈이 __version__으로 업그레이드 되었습니다"
|
||||
},
|
||||
"editor": {
|
||||
"title": "팔렛트 관리",
|
||||
"palette": "팔렛트",
|
||||
"times": {
|
||||
"seconds": "몇초 전",
|
||||
"minutes": "몇분 전",
|
||||
"minutesV": "__count__분 전",
|
||||
"hoursV": "__count__시간 전",
|
||||
"hoursV_plural": "__count__시간 전",
|
||||
"daysV": "__count__일 전",
|
||||
"daysV_plural": "__count__일 전",
|
||||
"weeksV": "__count__주 전",
|
||||
"weeksV_plural": "__count__주 전",
|
||||
"monthsV": "__count__달 전",
|
||||
"monthsV_plural": "__count__달 전",
|
||||
"yearsV": "__count__년 전",
|
||||
"yearsV_plural": "__count__년 전",
|
||||
"yearMonthsV": "__y__년, __count__월 전",
|
||||
"yearMonthsV_plural": "__y__년, __count__월 전",
|
||||
"yearsMonthsV": "__y__년, __count__월 전",
|
||||
"yearsMonthsV_plural": "__y__년, __count__월 전"
|
||||
},
|
||||
"nodeCount": "__label__ 개의 노드",
|
||||
"nodeCount_plural": "__label__ 개의 노드",
|
||||
"moduleCount": "__count__ 개의 모듈 사용가능",
|
||||
"moduleCount_plural": "__count__ 개의 모듈 사용가능",
|
||||
"inuse": "사용중",
|
||||
"enableall": "모두 활성화",
|
||||
"disableall": "모두 비활성화",
|
||||
"enable": "활성화",
|
||||
"disable": "비활성화",
|
||||
"remove": "삭제",
|
||||
"update": "__version__으로 업데이트",
|
||||
"updated": "업데이트 됨",
|
||||
"install": "설치",
|
||||
"installed": "설치됨",
|
||||
"conflict": "충돌",
|
||||
"conflictTip": "<p>노드타입이 이미 설치 되어 있습니다.<br/>/p><p>충돌모듈 : <code>__module__</code></p>",
|
||||
"loading": "카탈로그 여는중...",
|
||||
"tab-nodes": "설치된 노드",
|
||||
"tab-install": "설치가능한 노드",
|
||||
"sort": "정렬:",
|
||||
"sortAZ": "a-z",
|
||||
"sortRecent": "최근",
|
||||
"more": "+ __count__ 개 더 보기",
|
||||
"errors": {
|
||||
"catalogLoadFailed": "<p>노드 카탈로그를 설치하지 못했습니다.</p><p>브라우저 콘솔로그를 참고하세요.</p>",
|
||||
"installFailed": "<p>설치 실패 : __module__</p><p>__message__</p><p>브라우저 콘솔로그를 참고하세요.</p>",
|
||||
"removeFailed": "<p>삭제 실패 : __module__</p><p>__message__</p><p>브라우저 콘솔로그를 참고하세요.</p>",
|
||||
"updateFailed": "<p>업데이트 실패 : __module__</p><p>__message__</p><p>브라우저 콘솔로그를 참고하세요.</p>",
|
||||
"enableFailed": "<p>활성화 실패 : __module__</p><p>__message__</p><p>브라우저 콘솔로그를 참고하세요.</p>",
|
||||
"disableFailed": "<p>비활성화 실패 : __module__</p><p>__message__</p><p>브라우저 콘솔로그를 참고하세요.</p>"
|
||||
},
|
||||
"confirm": {
|
||||
"install": {
|
||||
"body": "<p>'__module__' 설치중</p><p>설치하기 전 노드 설명서를 읽으세요. 어떤 노드은 의존성이 자동으로 해결되지 않거나, Node-RED의 재시작이 필요할 수 있습니다.</p>",
|
||||
"title": "노드 설치"
|
||||
},
|
||||
"remove": {
|
||||
"body": "<p>'__module__' 삭제중</p><p>Node-RED에서 노드를 제거합니다. Node-RED가 재시작되기까지 리소스가 계속 사용될 수도 있습니다.</p>",
|
||||
"title": "노드 삭제"
|
||||
},
|
||||
"update": {
|
||||
"body": "<p>'__module__' 업데이트중</p><p>업데이트 반영을 위해 Node-RED를 수동으로 재시작해야 할 경우도 있습니다.</p>",
|
||||
"title": "노드 변경"
|
||||
},
|
||||
"cannotUpdate": {
|
||||
"body": "이 노드에 대한 업데이트가 있지만, 팔레트 관리자가 변경할 수 있는 위치에 설치되지 않았습니다.<br/><br/>이 노드를 변경하는 방법은 설명서를 참조하세요"
|
||||
},
|
||||
"button": {
|
||||
"review": "노드정보 열기",
|
||||
"install": "설치",
|
||||
"remove": "삭제",
|
||||
"update": "업데이트"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"sidebar": {
|
||||
"info": {
|
||||
"name": "노드정보",
|
||||
"tabName": "이름",
|
||||
"label": "정보",
|
||||
"node": "노드",
|
||||
"type": "타입",
|
||||
"module": "모듈",
|
||||
"id": "ID",
|
||||
"status": "상태",
|
||||
"enabled": "활성화",
|
||||
"disabled": "비활성화",
|
||||
"subflow": "서브 플로우",
|
||||
"instances": "인스턴스",
|
||||
"properties": "속성",
|
||||
"info": "정보",
|
||||
"desc": "상세 내역",
|
||||
"blank": "공백",
|
||||
"null": "null",
|
||||
"showMore": "더 보기",
|
||||
"showLess": "간단히",
|
||||
"flow": "플로우",
|
||||
"selection": "선택",
|
||||
"nodes": "__count__ 개의 노드",
|
||||
"flowDesc": "플로우 상세내역",
|
||||
"subflowDesc": "서브 플로우 상세내역",
|
||||
"nodeHelp": "노드 도움말",
|
||||
"none": "없음",
|
||||
"arrayItems": "__count__ 개의 항목",
|
||||
"showTips": "설정에서 도움말을 열 수 있습니다. "
|
||||
},
|
||||
"config": {
|
||||
"name": "노드 설정",
|
||||
"label": "설정",
|
||||
"global": "모든 플로우",
|
||||
"none": "없음",
|
||||
"subflows": "보조 플로우",
|
||||
"flows": "플로우",
|
||||
"filterAll": "전체",
|
||||
"filterUnused": "미사용",
|
||||
"filtered": "__count__ 개 숨김"
|
||||
},
|
||||
"context": {
|
||||
"name": "Context 데이터",
|
||||
"label": "context",
|
||||
"none": "선택 없음",
|
||||
"refresh": "새로고침",
|
||||
"empty": "공백",
|
||||
"node": "노드",
|
||||
"flow": "플로우",
|
||||
"global": "Global",
|
||||
"deleteConfirm": "정말로 이 아이템을 지우시겠습니까?"
|
||||
},
|
||||
"palette": {
|
||||
"name": "팔레트 관리",
|
||||
"label": "팔레트"
|
||||
},
|
||||
"project": {
|
||||
"label": "프로젝트",
|
||||
"name": "프로젝트",
|
||||
"description": "상세내역",
|
||||
"dependencies": "의존성",
|
||||
"settings": "설정",
|
||||
"noSummaryAvailable": "요약 없음",
|
||||
"editDescription": "프로젝트 상세내역 수정",
|
||||
"editDependencies": "프로젝트 의존성 수정",
|
||||
"editReadme": "README.md 수정",
|
||||
"showProjectSettings": "프로젝트 설정 보이기",
|
||||
"projectSettings": {
|
||||
"title": "프로젝트 설정",
|
||||
"edit": "수정",
|
||||
"none": "없음",
|
||||
"install": "설치",
|
||||
"removeFromProject": "프로젝트에서 삭제",
|
||||
"addToProject": "프로젝트에 추가",
|
||||
"files": "파일",
|
||||
"flow": "플로우",
|
||||
"credentials": "인증정보",
|
||||
"invalidEncryptionKey": "잘못된 암호화 키",
|
||||
"encryptionEnabled": "암호화 활성화",
|
||||
"encryptionDisabled": "암호화 비활성화",
|
||||
"setTheEncryptionKey": "암호화 키 설정 :",
|
||||
"resetTheEncryptionKey": "암호화 키 초기화 :",
|
||||
"changeTheEncryptionKey": "암호화 키 변경:",
|
||||
"currentKey": "현재 키",
|
||||
"newKey": "새로운 키",
|
||||
"credentialsAlert": "모든 인증정보를 삭제합니다",
|
||||
"versionControl": "버전 관리",
|
||||
"branches": "브랜치",
|
||||
"noBranches": "브랜치 없음",
|
||||
"deleteConfirm": "다시 되돌릴 수 없습니다. '__name__'의 로컬 브랜치를 삭제 히시겠습니까?",
|
||||
"unmergedConfirm": "'__name__'의 병합되지 않은 수정사항을 잃어버릴 수 있습니다. 그래도 삭제 하시겠습니까?",
|
||||
"deleteUnmergedBranch": "미병합 브랜치 삭제",
|
||||
"gitRemotes": "Git 원격",
|
||||
"addRemote": "원격 추가",
|
||||
"addRemote2": "원격 추가",
|
||||
"remoteName": "원격 이름",
|
||||
"nameRule": "A-Z 0-9 _ -의 문자만 사용이 가능합니다",
|
||||
"url": "URL",
|
||||
"urlRule": "https://, ssh:// or file://",
|
||||
"urlRule2": "URL안에 사용자아이디/비밀번호를 사용하지 마세요",
|
||||
"noRemotes": "원격 없음",
|
||||
"deleteRemoteConfrim": "원격 '__name__'를 정말로 삭제하시겠습니까?",
|
||||
"deleteRemote": "원격 삭제"
|
||||
},
|
||||
"userSettings": {
|
||||
"committerDetail": "Committer 상세내역",
|
||||
"committerTip": "시스템 기본값을 사용하려면 비워두세요",
|
||||
"userName": "사용자명",
|
||||
"email": "이메일",
|
||||
"sshKeys": "SSH키",
|
||||
"sshKeysTip": "원격저장소에 대한 보안연결을 허용합니다",
|
||||
"add": "키 추가",
|
||||
"addSshKey": "SSH키 추가",
|
||||
"addSshKeyTip": "public/private 키쌍을 추가합니다",
|
||||
"name": "이름",
|
||||
"nameRule": "A-Z 0-9 _ -의 문자만 사용이 가능합니다",
|
||||
"passphrase": "암호",
|
||||
"passphraseShort": "암호가 너무 짧습니다",
|
||||
"optional": "선택항목",
|
||||
"cancel": "취소",
|
||||
"generate": "Key 생성",
|
||||
"noSshKeys": "SSH키 없음",
|
||||
"copyPublicKey": "클립보드로 public key 복사",
|
||||
"delete": "키 삭제",
|
||||
"gitConfig": "Git 설정",
|
||||
"deleteConfirm": "다시 되돌릴 수 없습니다. __name__의 SSH키를 삭제하시겠습니까?"
|
||||
},
|
||||
"versionControl": {
|
||||
"unstagedChanges": "변경사항을 언스테이징",
|
||||
"stagedChanges": "스테이징된 변경사항",
|
||||
"unstageChange": "스테이징 되지않은 변경사항",
|
||||
"stageChange": "변경사항을 스테이징",
|
||||
"unstageAllChange": "모든 변경사항 언스테이징",
|
||||
"stageAllChange": "모든 변경사항 스테이징",
|
||||
"commitChanges": "변경사항 커밋",
|
||||
"resolveConflicts": "충돌 해결",
|
||||
"head": "HEAD",
|
||||
"staged": "스테이징 됨",
|
||||
"unstaged": "스테이징 안됨",
|
||||
"local": "로컬",
|
||||
"remote": "리모트",
|
||||
"revert": "다시 복원할 수 없습니다. '__file__'을 되돌리시겠습니까?",
|
||||
"revertChanges": "변경사항 되돌리기",
|
||||
"localChanges": "로컬 변경사항",
|
||||
"none": "없음",
|
||||
"conflictResolve": "모든 충돌이 해결되었습니다. 변경사항을 적용하여 병합을 완료하세요",
|
||||
"localFiles": "로컬 파일",
|
||||
"all": "전체",
|
||||
"unmergedChanges": "병합되지 않은 변경사항",
|
||||
"abortMerge": "병합 중단",
|
||||
"commit": "커밋",
|
||||
"changeToCommit": "커밋 변경사항",
|
||||
"commitPlaceholder": "커밋 메시지를 입력하세요",
|
||||
"cancelCapital": "취소",
|
||||
"commitCapital": "커밋",
|
||||
"commitHistory": "커밋 이력",
|
||||
"branch": "브랜치 :",
|
||||
"moreCommits": "커밋 더보기",
|
||||
"changeLocalBranch": "로컬 브랜치 변경",
|
||||
"createBranchPlaceholder": "브렌치 찾기/생성",
|
||||
"upstream": "업스트림",
|
||||
"localOverwrite": "브랜치에 반영할 변경사항이 있습니다. 변경사항을 커밋하거나, 변경내역을 취소해야 합니다",
|
||||
"manageRemoteBranch": "원격 브랜치 관리",
|
||||
"unableToAccess": "원격저장소에 접근할 수 없습니다",
|
||||
"retry": "재시도",
|
||||
"setUpstreamBranch": "업스트림 브랜치로 설정",
|
||||
"createRemoteBranchPlaceholder": "리모드 브랜치 찾기/생성",
|
||||
"trackedUpstreamBranch": "생성된 브랜치는 트래킹된 업스트림 브랜치로 설정됩니다",
|
||||
"selectUpstreamBranch": "브랜치가 생성될 것입니다. 트래킹된 업스트림 브랜치로 설정하세요",
|
||||
"pushFailed": "리모트에 최신 커밋이 있기 때문에 push할 수 없습니다. 먼저 pull과 병합을 하신 후 push하세요",
|
||||
"push": "push",
|
||||
"pull": "pull",
|
||||
"unablePull": "<p>원격저장소의 변경사항을 가져올 수 없습니다, 당신의 unstaged 로컬 변경사항을 덮어씁니다.</p><p>변경사항을 적용하고 다시 시도하세요</p>",
|
||||
"showUnstagedChanges": "unstaged 변경사항 보여주기",
|
||||
"connectionFailed": "원격저장소 연결 불가 : ",
|
||||
"pullUnrelatedHistory": "<p>원격저장소에 연관없는 커밋 기록이 있습니다.</p><p>모든 변경사항을 로컬 저장소로 가져 오시겠습니까?</p>",
|
||||
"pullChanges": "Pull 변경사항",
|
||||
"history": "이력",
|
||||
"projectHistory": "프로젝트 이력",
|
||||
"daysAgo": "__count__일 전",
|
||||
"daysAgo_plural": "__count__일 전",
|
||||
"hoursAgo": "__count__시간 전",
|
||||
"hoursAgo_plural": "__count__시간 전",
|
||||
"minsAgo": "__count__분 전",
|
||||
"minsAgo_plural": "__count__분 전",
|
||||
"secondsAgo": "몇초 전",
|
||||
"notTracking": "당신의 로컬 브랜치는 원격브랜치를 트래킹하고 있지 않습니다",
|
||||
"statusUnmergedChanged": "당신의 저장소는 병합되지 않은 변경사항을 가지고 있습니다. 충돌을 수정하고 결과를 커밋하세요",
|
||||
"repositoryUpToDate": "당신의 저장소는 최신상태 입니다",
|
||||
"commitsAhead": "당신의 저장소가 원격지보다 __count__ 커밋을 앞서 있습니다. 이제 커밋 할 수 있습니다.",
|
||||
"commitsAhead_plural": "당신의 저장소가 원격지보다 __count__ 커밋을 앞서 있습니다. 지금 커밋할 수 있습니다.",
|
||||
"commitsBehind": "당신의 저장소가 원격지보다 __count__ 커밋이 늦습니다. 이제 pull 할 수 있습니다.",
|
||||
"commitsBehind_plural": "당신의 저장소가 원격지보다 __count__ 커밋이 늦습니다. 이제 pull 할 수 있습니다.",
|
||||
"commitsAheadAndBehind1": "당신의 저장소가 __count__ 커밋이 늦고, ",
|
||||
"commitsAheadAndBehind1_plural": "당신의 저장소가 __count__ 커밋이 늦고 ",
|
||||
"commitsAheadAndBehind2": "__count__ 커밋이 원격지보다 앞서 있습니다. ",
|
||||
"commitsAheadAndBehind2_plural": "__count__ 커밋이 원격지보다 앞서 있습니다.",
|
||||
"commitsAheadAndBehind3": "push하기전에 리모트 저장소에서 pull을 먼저 수행하세요.",
|
||||
"commitsAheadAndBehind3_plural": "push하기전에 리모트 저장소에서 pull을 먼저 수행하세요.",
|
||||
"refreshCommitHistory": "커밋 기록 새로고침",
|
||||
"refreshChanges": "변경사항 새로고침"
|
||||
}
|
||||
}
|
||||
},
|
||||
"typedInput": {
|
||||
"type": {
|
||||
"str": "string",
|
||||
"num": "number",
|
||||
"re": "regular expression",
|
||||
"bool": "boolean",
|
||||
"json": "JSON",
|
||||
"bin": "buffer",
|
||||
"date": "timestamp",
|
||||
"jsonata": "expression",
|
||||
"env": "env variable"
|
||||
}
|
||||
},
|
||||
"editableList": {
|
||||
"add": "추가"
|
||||
},
|
||||
"search": {
|
||||
"empty": "결과 없음",
|
||||
"addNode": "노드 추가 ..."
|
||||
},
|
||||
"expressionEditor": {
|
||||
"functions": "기능",
|
||||
"functionReference": "기능 참조",
|
||||
"insert": "삽입",
|
||||
"title": "JSONata 형식 에디터",
|
||||
"test": "테스트",
|
||||
"data": "예제 메세지",
|
||||
"result": "결과",
|
||||
"format": "형식",
|
||||
"compatMode": "호환모드 사용",
|
||||
"compatModeDesc": "<h3>JSONata호환 모드</h3><p> 입력된 형식은 <code>msg</code> 를 참조하고 있어, 호환모드로 평가합니다. 이 모드는 후에 폐지될 예정이니, <code>msg</code> 를 사용하지 않도록 해 주시길 바랍니다. </p><p> JSONata를 Node-RED에서 처음 지원했을 때에는 <code>msg</code> 오브젝트의 참조가 필요했습니다. 예를 들어 <code>msg.payload</code> 는 payload를 참고하기 위해 사용되었습니다. </p><p> 직접 메시지에 대하여 식을 평가하도록 되었기에, 이 형식은 사용할 수 없게 됩니다. payload를 참조하려면 단순히 <code>payload</code> 로 지정해 주십시오. </p>",
|
||||
"noMatch": "결과 없음",
|
||||
"errors": {
|
||||
"invalid-expr": "유효하지 않은 JSONata 형식 :\n __message__",
|
||||
"invalid-msg": "유효하지 않은 예시 JSON 메세지 :\n __message__",
|
||||
"context-unsupported": "컨텍스트 기능을 테스트 할 수 없습니다.\n $flowContext 또는 $globalContext",
|
||||
"eval": "형식 오류 :\n __message__"
|
||||
}
|
||||
},
|
||||
"jsEditor": {
|
||||
"title": "자바스크립트 에디터"
|
||||
},
|
||||
"jsonEditor": {
|
||||
"title": "JSON 에디터",
|
||||
"format": "JSON 형식"
|
||||
},
|
||||
"markdownEditor": {
|
||||
"title": "Markdown 에디터",
|
||||
"format": "Markdown 형식",
|
||||
"heading1": "제목 레벨1",
|
||||
"heading2": "제목 레벨2",
|
||||
"heading3": "제목 레벨3",
|
||||
"bold": "강조",
|
||||
"italic": "이탤릭",
|
||||
"code": "코드",
|
||||
"ordered-list": "번호 목차",
|
||||
"unordered-list": "목차",
|
||||
"quote": "인용",
|
||||
"link": "링크",
|
||||
"horizontal-rule": "나눔줄",
|
||||
"toggle-preview": "미리보기 전환"
|
||||
},
|
||||
"bufferEditor": {
|
||||
"title": "Buffer 에디터",
|
||||
"modeString": "UTF-8 문자열로 처리",
|
||||
"modeArray": "JSON 배열로 처리",
|
||||
"modeDesc": "<h3>Buffer 에디터</h3><p>버퍼타입은 byet값의 JSON배열로 저장됩니다. 이 에디터는 입력된 값을 JSON 배열로 구문분석 합니다. 만약 유효한 JSON이 아닌경우 UTF-8 문자열로 처리되어 각 문자코드 번호의 배열로 변환됩니다.</p><p>예를들어 <code>Hello World</code> 라는 값은 다음의 JSON 배열로 변환됩니다.<pre>[72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]</pre></p>"
|
||||
},
|
||||
"projects": {
|
||||
"config-git": "Git client 설정",
|
||||
"welcome": {
|
||||
"hello": "안녕하세요. Node-RED에서 프로젝트 기능을 이용할 수 있게 되었습니다.",
|
||||
"desc0": "플로우 파일을 관리하는 새로운 방법이며, 버전을 관리할 수 도 있습니다.",
|
||||
"desc1": "무선 프로젝트를 작성하거나 기존의 Git저장소에서 프로젝트를 복제할 수 있습니다.",
|
||||
"desc2": "이 기능을 건너뛰어도 상관없습니다. 언제든지 프로젝트 메뉴에서 첫번째 프로젝트를 만들 수 있습니다.",
|
||||
"create": "프로젝트 생성",
|
||||
"clone": "프로젝트 복제",
|
||||
"not-right-now": "나중에"
|
||||
},
|
||||
"git-config": {
|
||||
"setup": "버전관리 클라이언트를 설정합니다",
|
||||
"desc0": "Node-RED는 오픈소스 Git로 버전관리를 할 수 있습니다. 프로젝트 파일의 변경사항을 추적하고 원격저장소로 push할 수 있습니다.",
|
||||
"desc1": "당신이 변경사항을 커밋하면 git은 누가 변경사항을 만들었는지 사용자명과 이메일 정보를 기록합니다. 사용자명은 꼭 당신의 실명일 필요는 없습니다.",
|
||||
"desc2": "당신의 Git 클라이언트는 아래와 같이 이미 설정되었습니다.",
|
||||
"desc3": "당신은 git config의 설정탭에서 설정을 변경할 수 있습니다.",
|
||||
"username": "사용자명",
|
||||
"email": "이메일"
|
||||
},
|
||||
"project-details": {
|
||||
"create": "프로젝트 생성",
|
||||
"desc0": "프로젝트는 Git 저장소로 관리되어집니다. 다른 사람과 협업하거나 공유하기 쉬워집니다.",
|
||||
"desc1": "당신은 여러 개의 프로젝트를 생성할 수 있고 에디터에서 프로젝트를 선택할 수 있습니다.",
|
||||
"desc2": "시작하려면 프로젝트 이름과 프로젝트의 상세설명이 필요합니다.",
|
||||
"already-exists": "프로젝트가 이미 존재합니다",
|
||||
"must-contain": "A-Z 0-9 _ -의 문자만 사용이 가능합니다",
|
||||
"project-name": "프로젝트명",
|
||||
"desc": "상세설명",
|
||||
"opt": "옵션"
|
||||
},
|
||||
"clone-project": {
|
||||
"clone": "프로젝트 복제",
|
||||
"desc0": "프로젝트가 있는 저장소를 가지고 있다면, 즉시 복제하여 사용할 수 있습니다.",
|
||||
"already-exists": "프로젝트가 이미 존재합니다",
|
||||
"must-contain": "A-Z 0-9 _ -의 문자만 사용이 가능합니다",
|
||||
"project-name": "프로젝트명",
|
||||
"no-info-in-url": "URL안에 사용자아이디/비밀번호를 사용하지 마세요",
|
||||
"git-url": "Git 저장소 URL",
|
||||
"protocols": "https://, ssh:// 혹은 file://",
|
||||
"auth-failed": "인증 실패",
|
||||
"username": "사용자명",
|
||||
"passwd": "패스워드",
|
||||
"ssh-key": "SSH키",
|
||||
"passphrase": "패스워드",
|
||||
"ssh-key-desc": "저장소를 복제하기 전에 접속을 위해 SSH키를 먼저 추가하세요.",
|
||||
"ssh-key-add": "ssh키 추가",
|
||||
"credential-key": "인증 암호화 키",
|
||||
"cant-get-ssh-key": "에러! 선택한 SSH키 경로를 가져올 수 없습니다",
|
||||
"already-exists2": "이미 존재합니다",
|
||||
"git-error": "git 에러",
|
||||
"connection-failed": "접속 실패",
|
||||
"not-git-repo": "Git저장소가 아닙니다",
|
||||
"repo-not-found": "저장소가 없습니다"
|
||||
},
|
||||
"default-files": {
|
||||
"create": "프로젝트 파일 생성",
|
||||
"desc0": "프로젝트는 당신의 플로우, README, package.json 파일을 포함합니다.",
|
||||
"desc1": "Git 저장소에서 관리하고 싶은 다른 파일들을 포함할 수 있습니다.",
|
||||
"desc2": "당신이 이미 가지고 있는 flow, 자격증명파일이 프로젝트로 복사될 것입니다.",
|
||||
"flow-file": "플로우 파일",
|
||||
"credentials-file": "자격증명 파일"
|
||||
},
|
||||
"encryption-config": {
|
||||
"setup": "자격인증 파일의 암호화 설정",
|
||||
"desc0": "플로우의 자격인증 파일 암호화를 통해 내용을 안전하게 유지할 수 있습니다.",
|
||||
"desc1": "자격증명을 공용 Git저장소에 저장하려면 비밀키 구문을 제공하여 암호화 해야 합니다",
|
||||
"desc2": "당신의 플로우 자격인증 파일은 암호화 되어 있지 않습니다.",
|
||||
"desc3": "즉, 암호 및 액세스 토큰과 같은 내용을 파일에 액세스 할 수있는 모든 사람이 열람할 수 있습니다.",
|
||||
"desc4": "자격증명을 공용 Git저장소에 저장하려면 비밀키 구문을 제공하여 암호화 해야 합니다",
|
||||
"desc5": "당신의 플로우 자격증명파일은 setting파일의 credentialSecret속성으로 암호화되어 있습니다.",
|
||||
"desc6": "당신의 플로우 자격증명파일은 시스템이 생성된 키에 의해 암호화 되어있습니다. 이 프로젝트용 새로운 비밀키를 지정해 주세요.",
|
||||
"desc7": "키는 프로젝트파일과는 별개로 보존됩니다. 다른 Node-RED에서 이 프로젝트를 이용하려면 이 프로젝트의 키가 필요합니다.",
|
||||
"credentials": "자격인증",
|
||||
"enable": "암호화 활성화",
|
||||
"disable": "암호화 비활성화",
|
||||
"disabled": "비활성화됨",
|
||||
"copy": "기존 키를 복사",
|
||||
"use-custom": "커스텀키 사용",
|
||||
"desc8": "자격증명 파일이 암호화되어 있지 않아, 간단히 해당내용이 열람될 수 있습니다.",
|
||||
"create-project-files": "프로젝트 생성",
|
||||
"create-project": "프로젝트 생성",
|
||||
"already-exists": "이미 존재합니다.",
|
||||
"git-error": "git 에러",
|
||||
"git-auth-error": "git 인증 에러"
|
||||
},
|
||||
"create-success": {
|
||||
"success": "당신의 첫번째 프로젝트 생성이 성공하였습니다.",
|
||||
"desc0": "앞으로 이와 같이 Node-RED를 사용할 수 있습니다.",
|
||||
"desc1": "사이드바의 '정보'탭은 현재 활성화된 프로젝트를 보여줍니다. 이름 옆에 있는 버틀을 사용하여 프로젝트 설정화면을 불러올 수 있습니다.",
|
||||
"desc2": "사이드바의 '이력'탭은 프로젝트의 변경된 파일을 확인하고 커밋할 수 있습니다. 커밋의 전체 기록을 보여주고 변경사항을 원격 저장소에 push할 수 있습니다."
|
||||
},
|
||||
"create": {
|
||||
"projects": "프로젝트",
|
||||
"already-exists": "프로젝트가 이미 존재합니다",
|
||||
"must-contain": "A-Z 0-9 _ -의 문자만 사용이 가능합니다",
|
||||
"no-info-in-url": "URL안에 사용자아이디/비밀번호를 사용하지 마세요",
|
||||
"open": "프로젝트 열기",
|
||||
"create": "프로젝트 생성",
|
||||
"clone": "프로젝트 복제",
|
||||
"project-name": "프로젝트명",
|
||||
"desc": "상세내역",
|
||||
"opt": "옵션",
|
||||
"flow-file": "플로우 파일",
|
||||
"credentials": "자격증명",
|
||||
"enable-encryption": "암호화 활성화",
|
||||
"disable-encryption": "암호화 비활성화",
|
||||
"encryption-key": "암호화 키",
|
||||
"desc0": "자격증명 정보를 안전하게 하는 문구",
|
||||
"desc1": "자격증명 파일이 암호화되어 있지 않아, 간단히 해당내용이 열람될 수 있습니다.",
|
||||
"git-url": "Git 저장소 URL",
|
||||
"protocols": "https://, ssh:// 혹은 file://",
|
||||
"auth-failed": "인증 실패",
|
||||
"username": "사용자명",
|
||||
"password": "패스워드",
|
||||
"ssh-key": "SSH키",
|
||||
"passphrase": "패스워드",
|
||||
"desc2": "저장소를 복제하기 전에 접속을 위해 SSH키를 먼저 추가하세요.",
|
||||
"add-ssh-key": "ssh키 추가",
|
||||
"credentials-encryption-key": "자격인증 암호화 키",
|
||||
"already-exists-2": "이미 존재합니다",
|
||||
"git-error": "git 에러",
|
||||
"con-failed": "접속 실패",
|
||||
"not-git": "git 저장소가 아닙니다",
|
||||
"no-resource": "저장소아 없습니다",
|
||||
"cant-get-ssh-key-path": "에러! 선택한 SSH키 경로를 가져올 수 없습니다.",
|
||||
"unexpected_error": "예기치 않은 에러"
|
||||
},
|
||||
"delete": {
|
||||
"confirm": "프로젝트를 정말 지우시겠습니까?"
|
||||
},
|
||||
"create-project-list": {
|
||||
"search": "프로젝트 검색",
|
||||
"current": "현재"
|
||||
},
|
||||
"require-clean": {
|
||||
"confirm": "<p>변경사항을 배포하지 않아 내용이 손실될 수 있습니다.</p><p>계속 할까요?</p>"
|
||||
},
|
||||
"send-req": {
|
||||
"auth-req": "저장소에 대한 인증이 필요합니다.",
|
||||
"username": "사용자명",
|
||||
"password": "패스워드",
|
||||
"passphrase": "패스워드",
|
||||
"retry": "재시도",
|
||||
"update-failed": "인증 변경 실패",
|
||||
"unhandled": "오류 응답 미처리"
|
||||
},
|
||||
"create-branch-list": {
|
||||
"invalid": "올바르지 않은 브랜치",
|
||||
"create": "브랜치 생성",
|
||||
"current": "현재"
|
||||
},
|
||||
"create-default-file-set": {
|
||||
"no-active": "활성화된 프로젝트 없이 기본 파일을 만들 수 없습니다.",
|
||||
"no-empty": "비어있지 않은 프로젝트에 기본 파일을 만들 수 없습니다.",
|
||||
"git-error": "git 에러"
|
||||
},
|
||||
"errors": {
|
||||
"no-username-email": "당신의 Git 클라이언트에 사용자명/이메일이 설정되지 않았습니다.",
|
||||
"unexpected": "예기치 않은 에러가 발생했습니다.",
|
||||
"code": "코드"
|
||||
}
|
||||
},
|
||||
"editor-tab": {
|
||||
"properties": "속성",
|
||||
"description": "상세 내역",
|
||||
"appearance": "모양"
|
||||
}
|
||||
}
|
23
packages/node_modules/@node-red/editor-client/locales/ko/infotips.json
vendored
Executable file
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"info": {
|
||||
"tip0": "{{core:delete-selection}}를 사용하여 선택된 노드나 링크를 삭제할 수 있습니다.",
|
||||
"tip1": "{{core:search}}를 활용하여 노드를 검색할 수 있습니다.",
|
||||
"tip2": "{{core:toggle-sidebar}}를 사용하여 사이드바를 표시/비표시 전환 할 수 있습니다.",
|
||||
"tip3": "{{core:manage-palette}}를 사용하여 노드 팔레트를 관리 할 수 있습니다.",
|
||||
"tip4": "플로우 안의 설정노드가 사이드바에 표시됩니다. 메뉴 혹은 {{core:show-config-tab}}를 사용하여 엑세스 할 수 있습니다.",
|
||||
"tip5": "설정에서 이 팁을 활성화/비활성화 할 수 있습니다.",
|
||||
"tip6": "[left] [up] [down] [right] 키를 사용하여 선택된 노드를 움직일 수 있습니다. [shift]키를 누른 채로 움직이면 이동폭이 늘어납니다.",
|
||||
"tip7": "노드를 와이어 사이로 드래그 하여 연결할 수도 있습니다.",
|
||||
"tip8": "{{core:show-export-dialog}}를 사용하여 선택한 노드 또는 현재탭을 내보낼 수 있습니다.",
|
||||
"tip9": "JSON파일을 에디터로 드래그하거나 {{core:show-import-dialog}}를 사용하여 플로우 가져올 수 있습니다.",
|
||||
"tip10": "[shift] [click] 하고서 드래그하여 선택한 와이어를 이동할 수 있습니다.",
|
||||
"tip11": "{{core:show-info-tab}}를 사용하여 정보탭을 표시하거나 {{core:show-debug-tab}}를 사용하여 디버그탭을 표시할 수 있습니다.",
|
||||
"tip12": "작업공간에서 [ctrl] [click]을 사용하여 빠른추가 대회상자를 열 수 있습니다.",
|
||||
"tip13": "[ctrl]을 누른 상태로 노드의 포트를 클릭하여 빠르게 연결할 수 있습니다.",
|
||||
"tip14": "[shift]를 누른 상태로 노드를 클릭하여 연결된 모든 노드를 선택할 수 있습니다.",
|
||||
"tip15": "[ctrl]을 누른 상태로 노드를 클릭하여 현재 선택영역에 노드를 추가/제거 할 수 있습니다.",
|
||||
"tip16": "{{core:show-previous-tab}}와 {{core:show-next-tab}}를 사용하여 탭을 전환할 수 있습니다.",
|
||||
"tip17": "노드 편집 창에서 {{core : confirm-edit-tray}}로 변경 사항을 확인하거나 {{core : cancel-edit-tray}}로 취소 할 수 있습니다.",
|
||||
"tip18": "{{core : edit-selected-node}}를 누르면 현재 선택 영역의 첫 번째 노드가 편집됩니다."
|
||||
}
|
||||
}
|
222
packages/node_modules/@node-red/editor-client/locales/ko/jsonata.json
vendored
Executable file
@@ -0,0 +1,222 @@
|
||||
{
|
||||
"$string": {
|
||||
"args": "arg",
|
||||
"desc": "다음과 같은 규칙을 사용하여 인수 *arg*를 문자열로 변환합니다. \n\n - 문자열은 변경되지 않습니다. \n - 함수는 빈 문자열로 변환됩니다. \n - 무한대와 NaN은 JSON수치로 표현할 수 없기 때문에 오류처리 됩니다. \n - 다른 모든 값은 `JSON.stringify` 함수를 사용하여 JSON 문자열로 변환됩니다."
|
||||
},
|
||||
"$length": {
|
||||
"args": "str",
|
||||
"desc": "문자열 `str`의 문자 수를 반환합니다. `str`가 문자열이 아닌 경우 에러를 반환합니다."
|
||||
},
|
||||
"$substring": {
|
||||
"args": "str, start[, length]",
|
||||
"desc": "(zero-offset)의 `start`에서 시작하는 첫번째 인수 `str`의 문자열을 반환합니다. 만약 `length`가 지정된 경우, 부분 문자열은 최대 `length`의 크기를 갖습니다. 만약 `start` 인수가 음수이면 `str`의 끝에서부터의 문자수를 나타냅니다."
|
||||
},
|
||||
"$substringBefore": {
|
||||
"args": "str, chars",
|
||||
"desc": "`str`에 `chars`문자가 처음으로 나오기 전까지의 부분문자열을 반환합니다. 만약 `chars`가 없으면 `str`을 반환합니다."
|
||||
},
|
||||
"$substringAfter": {
|
||||
"args": "str, chars",
|
||||
"desc": "`str`에 `chars`문자가 처음으로 나온 이후의 부분문자열을 반환합니다. 만약 `chars`가 없으면 `str`을 반환합니다."
|
||||
},
|
||||
"$uppercase": {
|
||||
"args": "str",
|
||||
"desc": "`str`의 문자를 대문자로 반환합니다."
|
||||
},
|
||||
"$lowercase": {
|
||||
"args": "str",
|
||||
"desc": "`str`의 문자를 소문자로 반환합니다."
|
||||
},
|
||||
"$trim": {
|
||||
"args": "str",
|
||||
"desc": "다음의 순서대로 `str`의 모든 공백을 자르고 정규화 합니다:\n\n - 모든 탭, 캐리지 리턴 및 줄 바꿈은 공백으로 대체됩니다. \n- 연속된 공백은 하나로 줄입니다.\n- 후행 및 선행 공백은 삭제됩니다.\n\n 만일 `str`이 지정되지 않으면 (예: 이 함수를 인수없이 호출), context값을 `str`의 값으로 사용합니다. `str`이 문자열이 아니면 에러가 발생합니다."
|
||||
},
|
||||
"$contains": {
|
||||
"args": "str, pattern",
|
||||
"desc": "`str`이 `pattern`과 일치하면 `true`를, 일치하지 않으면 `false`를 반환합니다. 만약 `str`이 지정되지 않으면 (예: 이 함수를 인수없이 호출), context값을 `str`의 값으로 사용합니다. `pattern` 인수는 문자열이나 정규표현으로 할 수 있습니다."
|
||||
},
|
||||
"$split": {
|
||||
"args": "str[, separator][, limit]",
|
||||
"desc": "`str`인수를 분할하여 부분문자열로 배열합니다. `str`이 문자열이 아니면 에러가 발생합니다. 생략가능한 인수 `separator`는 `str`을 분할하는 문자를 문자열 또는 정규표현으로 지정합니다. `separator`를 지정하지 않은 경우, 공백의 문자열로 간주하여 `str`은 단일 문자의 배열로 분리됩니다. `separator`가 문자열이 아니면 에러가 발생합니다. 생략가능한 인수 'limit`는 결과의 배열이 갖는 부분문자열의 최대수를 지정합니다. 이 수를 넘는 부분문자열은 파기됩니다. `limit`가 지정되지 않으면`str`은 결과 배열의 크기의 제한없이 완전히 분리됩니다. `limit`이 음수인 경우 에러가 발생합니다."
|
||||
},
|
||||
"$join": {
|
||||
"args": "array[, separator]",
|
||||
"desc": "문자열의 배열을 생략가능한 인수 `separator`로 구분한 하나의 문자열로 연결합니다. 배열 `array`가 문자열이 아닌 요소를 포함하는 경우, 에러가 발생합니다. `separator`를 지정하지 않은 경우, 공백의 문자열로 간주합니다(예: 문자열간의 `separator`없음). `separator`가 문자열이 아닌 경우, 에러가 발생합니다."
|
||||
},
|
||||
"$match": {
|
||||
"args": "str, pattern [, limit]",
|
||||
"desc": "`str`문자열에 `pattern`를 적용하여, 오브젝트 배열을 반환합니다. 배열요소의 오브젝트는 `str`중 일치하는 부분의 정보를 보유합니다."
|
||||
},
|
||||
"$replace": {
|
||||
"args": "str, pattern, replacement [, limit]",
|
||||
"desc": "`str`문자열에서 `pattern` 패턴을 검색하여, `replacement`로 대체합니다.\n\n임의이ㅡ 인수 `limit`는 대체 횟수의 상한값을 지정합니다."
|
||||
},
|
||||
"$now": {
|
||||
"args": "",
|
||||
"desc": "ISO 8601 호환 형식으로 타임 스탬프를 생성하고 이를 문자열로 반환합니다."
|
||||
},
|
||||
"$base64encode": {
|
||||
"args": "string",
|
||||
"desc": "ASCII 문자열을 base 64 표현으로 변환합니다. 문자열의 각 문자는 이진 데이터의 바이트로 처리됩니다. 이렇게 하려면 문자열의 모든 문자가 URI로 인코딩 된 문자열을 포함하고, 0x00에서 0xFF 범위에 있어야합니다. 해당 범위를 벗어난 유니 코드 문자는 지원되지 않습니다"
|
||||
},
|
||||
"$base64decode": {
|
||||
"args": "string",
|
||||
"desc": "UTF-8코드페이지를 이용하여, Base 64형식의 바이트값을 문자열로 변환합니다."
|
||||
},
|
||||
"$number": {
|
||||
"args": "arg",
|
||||
"desc": "`arg`를 다음과 같은 규칙을 사요하여 숫자로 변환합니다. :\n\n - 숫자는 변경되지 않습니다.\n – 올바른 JSON의 숫자는 숫자 그대로 변환됩니다.\n – 그 외의 형식은 에러를 발생합니다."
|
||||
},
|
||||
"$abs": {
|
||||
"args": "number",
|
||||
"desc": "`number`의 절대값을 반환합니다."
|
||||
},
|
||||
"$floor": {
|
||||
"args": "number",
|
||||
"desc": "`number`를 `number`보다 같거나 작은 정수로 내림하여 반환합니다."
|
||||
},
|
||||
"$ceil": {
|
||||
"args": "number",
|
||||
"desc": "`number`를 `number`와 같거나 큰 정수로 올림하여 반환합니다."
|
||||
},
|
||||
"$round": {
|
||||
"args": "number [, precision]",
|
||||
"desc": "인수 `number`를 반올림한 값을 반환합니다. 임의의 인수 `precision`에는 반올립에서 사용할 소수점이하의 자릿수를 지정합니다."
|
||||
},
|
||||
"$power": {
|
||||
"args": "base, exponent",
|
||||
"desc": "기수 `base`의 값을 지수 `exponent`만큼의 거듭 제곱으로 반환합니다."
|
||||
},
|
||||
"$sqrt": {
|
||||
"args": "number",
|
||||
"desc": "인수 `number`의 제곱근을 반환합니다."
|
||||
},
|
||||
"$random": {
|
||||
"args": "",
|
||||
"desc": "0이상 1미만의 의사난수를 반환합니다."
|
||||
},
|
||||
"$millis": {
|
||||
"args": "",
|
||||
"desc": "Unix Epoch (1970 년 1 월 1 일 UTC)부터 경과된 밀리 초 수를 숫자로 반환합니다. 평가대상식에 포함되는 $millis()의 모든 호출은 모두 같은 값을 반환합니다."
|
||||
},
|
||||
"$sum": {
|
||||
"args": "array",
|
||||
"desc": "숫자 배열 `array`의 합계를 반환합니다. `array`에 숫자가 아닌 요소가 있는 경우, 에러가 발생합니다."
|
||||
},
|
||||
"$max": {
|
||||
"args": "array",
|
||||
"desc": "숫자 배열 `array`에서 최대값을 반환합니다. `array`에 숫자가 아닌 요소가 있는 경우, 에러가 발생합니다."
|
||||
},
|
||||
"$min": {
|
||||
"args": "array",
|
||||
"desc": "숫자 배열 `array`에서 최소값을 반환합니다. `array`에 숫자가 아닌 요소가 있는 경우, 에러가 발생합니다."
|
||||
},
|
||||
"$average": {
|
||||
"args": "array",
|
||||
"desc": "숫자 배열 `array`에서 평균값을 반환합니다. `array`에 숫자가 아닌 요소가 있는 경우, 에러가 발생합니다."
|
||||
},
|
||||
"$boolean": {
|
||||
"args": "arg",
|
||||
"desc": "`arg` 값을 다음의 규칙에 의해 Boolean으로 변환합니다::\n\n - `Boolean` : 변환하지 않음\n - `string`: 비어있음 : `false`\n - `string`: 비어있지 않음 : `true`\n - `number`: `0` : `false`\n - `number`: 0이 아님 : `true`\n - `null` : `false`\n - `array`: 비어있음 : `false`\n - `array`: `true`로 변환된 요소를 가짐 : `true`\n - `array`: 모든 요소가 `false`로 변환 : `false`\n - `object`: 비어있음 : `false`\n - `object`: 비어있지 않음 : `true`\n - `function` : `false`"
|
||||
},
|
||||
"$not": {
|
||||
"args": "arg",
|
||||
"desc": "인수의 부정을 Boolean으로 변환합니다. `arg`는 가장먼저boolean으로 변환됩니다."
|
||||
},
|
||||
"$exists": {
|
||||
"args": "arg",
|
||||
"desc": "`arg` 식의 평가값이 존재하는 경우 `true`, 식의 평가결과가 미정의인 경우 (예: 존재하지 않는 참조필드로의 경로)는 `false`를 반환합니다."
|
||||
},
|
||||
"$count": {
|
||||
"args": "array",
|
||||
"desc": "`array`의 요소 갯수를 반환합니다."
|
||||
},
|
||||
"$append": {
|
||||
"args": "array, array",
|
||||
"desc": "두개의 `array`를 병합합니다."
|
||||
},
|
||||
"$sort": {
|
||||
"args": "array [, function]",
|
||||
"desc": "배열 `array`의 모든 값을 순서대로 정렬하여 반환합니다. \n\n 비교함수 `function`을 이용하는 경우, 비교함수는 아래와 같은 두개의 인수를 가져야 합니다. \n\n `function(left,right)` \n\n 비교함수는 left와 right의 두개의 값을 비교하기에, 값을 정렬하는 처리에서 호출됩니다. 만약 요구되는 정렬에서 left값을 right값보다 뒤로 두고싶은 경우에는, 비교함수는 치환을 나타내는 Boolean형의 ``true`를, 그렇지 않은 경우에는 `false`를 반환해야 합니다."
|
||||
},
|
||||
"$reverse": {
|
||||
"args": "array",
|
||||
"desc": "`array`에 포함된 모든 값의 순서를 역순으로 변환하여 반환합니다."
|
||||
},
|
||||
"$shuffle": {
|
||||
"args": "array",
|
||||
"desc": "`array`에 포함된 모든 값의 순서를 랜덤으로 반환합니다."
|
||||
},
|
||||
"$zip": {
|
||||
"args": "array, ...",
|
||||
"desc": "배열 `array1` ... arrayN`의 위치 0, 1, 2…. 의 값으로 구성된 convolved (zipped) 배열을 반환합니다."
|
||||
},
|
||||
"$keys": {
|
||||
"args": "object",
|
||||
"desc": "`object` 키를 포함하는 배열을 반환합니다. 인수가 오브젝트의 배열이면 반환되는 배열은 모든 오브젝트에있는 모든 키의 중복되지 않은 목록이 됩니다."
|
||||
},
|
||||
"$lookup": {
|
||||
"args": "object, key",
|
||||
"desc": "`object` 내의 `key`가 갖는 값을 반환합니다. 최초의 인수가 객체의 배열 인 경우, 배열 내의 모든 오브젝트를 검색하여, 존재하는 모든 키가 갖는 값을 반환합니다."
|
||||
},
|
||||
"$spread": {
|
||||
"args": "object",
|
||||
"desc": "`object`의 키/값 쌍별로 각 요소가 하나인 오브젝트 배열로 분할합니다. 만일 오브젝트 배열인 경우, 배열의 결과는 각 오브젝트에서 얻은 키/값 쌍의 오브젝트를 갖습니다."
|
||||
},
|
||||
"$merge": {
|
||||
"args": "array<object>",
|
||||
"desc": "`object`배열을 하나의 `object`로 병합합니다. 병합결과의 오브젝트는 입력배열내의 각 오브젝트의 키/값 쌍을 포함합니다. 입력 오브젝트가 같은 키를 가질경우, 반환 된 `object`에는 배열 마지막의 오브젝트의 키/값이 격납됩니다. 입력 배열이 오브젝트가 아닌 요소를 포함하는 경우, 에러가 발생합니다."
|
||||
},
|
||||
"$sift": {
|
||||
"args": "object, function",
|
||||
"desc": "함수 `function`을 충족시키는 `object` 인수 키/값 쌍만 포함하는 오브젝트를 반환합니다. \n\n 함수 `function` 다음과 같은 인수를 가져야 합니다 : \n\n `function(value [, key [, object]])`"
|
||||
},
|
||||
"$each": {
|
||||
"args": "object, function",
|
||||
"desc": "`object`의 각 키/값 쌍에, 함수`function`을 적용한 값의 배열을 반환합니다."
|
||||
},
|
||||
"$map": {
|
||||
"args": "array, function",
|
||||
"desc": "`array`의 각 값에 `function`을 적용한 결과로 이루어진 배열을 반환합니다. \n\n 함수 `function`은 다음과 같은 인수를 가져야 합니다. \n\n `function(value[, index[, array]])`"
|
||||
},
|
||||
"$filter": {
|
||||
"args": "array, function",
|
||||
"desc": "`array`의 값중, 함수 `function`의 조건을 만족하는 값으로 이루어진 배열을 반환합니다. \n\n 함수 `function`은 다음과 같은 형식을 가져야 합니다. \n\n `function(value[, index[, array]])`"
|
||||
},
|
||||
"$reduce": {
|
||||
"args": "array, function [, init]",
|
||||
"desc": "배열의 각 요소값에 함수 `function`을 연속적으로 적용하여 얻어지는 집계값을 반환합니다. `function`의 적용에는 직전의 `function`의 적용결과와 요소값이 인수로 주어집니다. \n\n 함수 `function`은 인수를 두개 뽑아, 배열의 각 요소 사이에 배치하는 중치연산자처럼 작용해야 합니다. \n\n 임의의 인수 `init`에는 집약시의 초기값을 설정합니다."
|
||||
},
|
||||
"$flowContext": {
|
||||
"args": "string[, string]",
|
||||
"desc": "플로우 컨텍스트 속성을 취득합니다."
|
||||
},
|
||||
"$globalContext": {
|
||||
"args": "string[, string]",
|
||||
"desc": "플로우의 글로벌 컨텍스트 속성을 취득합니다."
|
||||
},
|
||||
"$pad": {
|
||||
"args": "string, width [, char]",
|
||||
"desc": "문자수가 인수 `width`의 절대값이상이 되도록, 필요한 경우 여분의 패딩을 사용하여 `string`의 복사본을 반환합니다. \n\n `width`가 양수인 경우, 오른쪽으로 채워지고, 음수이면 왼쪽으로 채워집니다. \n\n 임의의 `char`인수에는 이 함수에서 사용할 패딩을 지정합니다. 지정하지 않는 경우에는, 기본값으로 공백을 사용합니다."
|
||||
},
|
||||
"$fromMillis": {
|
||||
"args": "number",
|
||||
"desc": "Unix Epoch (1970 년 1 월 1 일 UTC) 이후의 밀리 초를 나타내는 숫자를 ISO 8601 형식의 타임 스탬프 문자열로 변환합니다."
|
||||
},
|
||||
"$formatNumber": {
|
||||
"args": "number, picture [, options]",
|
||||
"desc": "`number`를 문자열로 변환하고 `picture` 문자열에 지정된 표현으로 서식을 변경합니다. \n\n 이 함수의 동작은 XPath F&O 3.1사양에 정의된 XPath/XQuery함수의 fn:format-number의 동작과 같습니다. 인수의 문자열 picture은 fn:format-number 과 같은 구문으로 수치의 서식을 정의합니다. \n\n 임의의 제3 인수 `option`은 소수점기호와 같은 기본 로케일 고유의 서식설정문자를 덮어쓰는데에 사용됩니다. 이 인수를 지정할 경우, XPath F&O 3.1사양의 수치형식에 기술되어있는 name/value 쌍을 포함하는 오브젝트여야 합니다."
|
||||
},
|
||||
"$formatBase": {
|
||||
"args": "number [, radix]",
|
||||
"desc": "`number`를 인수 `radix`에 지정한 값을 기수로하는 문자열로 변환합니다. `radix`가 지정되지 않은 경우, 기수 10이 기본값으로 설정됩니다. `radix`에는 2~36의 값을 설정할 수 있고, 그 외의 값의 경우에는 에러가 발생합니다."
|
||||
},
|
||||
"$toMillis": {
|
||||
"args": "timestamp",
|
||||
"desc": "ISO 8601 형식의 `timestamp`를 Unix Epoch (1970 년 1 월 1 일 UTC) 이후의 밀리 초 수로 변환합니다. 문자열이 올바른 형식이 아닌 경우 에러가 발생합니다."
|
||||
},
|
||||
"$env": {
|
||||
"args": "arg",
|
||||
"desc": "환경변수를 값으로 반환합니다.\n\n 이 함수는 Node-RED 정의 함수입니다."
|
||||
}
|
||||
}
|
@@ -1,15 +1,15 @@
|
||||
{
|
||||
"$string": {
|
||||
"args": "arg",
|
||||
"desc": "通过以下的类型转换规则将参数*arg*转换成字符串:\n\n - 字符串不转换。\n -函数转换成空的字符串。\n - JSON的值无法用数字表示所以用无限大或者NaN(非数)表示。\n - 用’JSON.stringify’函数将其他值转换成JSON字符串。"
|
||||
"desc": "通过以下的类型转换规则将参数 *arg* 转换成字符串:\n\n - 字符串不转换。\n -函数转换成空的字符串。\n - JSON的值无法用数字表示所以用无限大或者NaN(非数)表示。\n - 用 `JSON.stringify` 函数将其他值转换成JSON字符串。"
|
||||
},
|
||||
"$length": {
|
||||
"args": "str",
|
||||
"desc": "输出字符串’str’的字数。如果’str’不是字符串,抛出错误。"
|
||||
"desc": "输出字符串 `str` 的字数。如果 `str` 不是字符串,抛出错误。"
|
||||
},
|
||||
"$substring": {
|
||||
"args": "str, start[, length]",
|
||||
"desc": "输出`start`位置后的的首次出现的包括`str`的子字符串。 如果`length`被指定,那么的字符串中将只包括前`length`个文字。如果`start`是负数则输出从`str`末尾开始的`length`个文字"
|
||||
"desc": "输出 `start` 位置后的的首次出现的包括 `str` 的子字符串。 如果 `length` 被指定,那么的字符串中将只包括前 `length` 个文字。如果 `start` 是负数则输出从 `str` 末尾开始的 `length` 个文字"
|
||||
},
|
||||
"$substringBefore": {
|
||||
"args": "str, chars",
|
||||
@@ -17,11 +17,11 @@
|
||||
},
|
||||
"$substringAfter": {
|
||||
"args": "str, chars",
|
||||
"desc": "输出’str’中首次出现的’chars’之后的子字符串,如果’str’中不包括’chars’则输出’str’。"
|
||||
"desc": "输出 `str` 中首次出现的 `chars` 之后的子字符串,如果 `str` 中不包括 `chars` 则输出 `str` 。"
|
||||
},
|
||||
"$uppercase": {
|
||||
"args": "str",
|
||||
"desc": "`将’str’中的所有字母变为大写后输出。"
|
||||
"desc": "将 `str` 中的所有字母变为大写后输出。"
|
||||
},
|
||||
"$lowercase": {
|
||||
"args": "str",
|
||||
@@ -29,27 +29,27 @@
|
||||
},
|
||||
"$trim": {
|
||||
"args": "str",
|
||||
"desc": "将以下步骤应用于`str`来去除所有空白文字并实现标准化。\n\n – 将全部tab制表符、回车键、换行字符用空白代替。\n- 将连续的空白文字变成一个空白文字。\n- 消除开头和末尾的空白文字。\n\n如果`str`没有被指定(即在无输入参数的情况下调用本函数),将上下文的值作为`str`来使用。 如果`str` 不是字符串则抛出错误。"
|
||||
"desc": "将以下步骤应用于 `str` 来去除所有空白文字并实现标准化。\n\n – 将全部tab制表符、回车键、换行字符用空白代替。\n- 将连续的空白文字变成一个空白文字。\n- 消除开头和末尾的空白文字。\n\n如果 `str` 没有被指定(即在无输入参数的情况下调用本函数),将上下文的值作为 `str` 来使用。 如果 `str` 不是字符串则抛出错误。"
|
||||
},
|
||||
"$contains": {
|
||||
"args": "str, pattern",
|
||||
"desc": "字符串`str` 和 `pattern`匹配的话输出`true`,不匹配的情况下输出 `false`。 不指定`str`的情况下(比如用一个参数调用本函数时)、将上下文的值作为`str`来使用。参数 `pattern`可以为字符串或正则表达。"
|
||||
"desc": "字符串 `str` 和 `pattern` 匹配的话输出 `true` ,不匹配的情况下输出 `false` 。 不指定 `str` 的情况下(比如用一个参数调用本函数时)、将上下文的值作为 `str` 来使用。参数 `pattern` 可以为字符串或正则表达。"
|
||||
},
|
||||
"$split": {
|
||||
"args": "str[, separator][, limit]",
|
||||
"desc": "将参数`str`分解成由子字符串组成的数组。 如果`str`不是字符串抛出错误。可以省略的参数 `separator`中指定字符串`str`的分隔符。分隔符可以是文字或正则表达式。在不指定`separator`的情况下、将分隔符看作空的字符串并把`str`拆分成由单个字母组成的数组。如果`separator`不是字符串则抛出错误。在可省略的参数`limit`中指定分割后的子字符串的最大个数。超出个数的子字符串将被舍弃。如果`limit`没有被指定,`str` 将不考虑子字符串的个数而将字符串完全分隔。如果`limit`是负数则抛出错误。"
|
||||
"desc": "将参数 `str` 分解成由子字符串组成的数组。 如果 `str` 不是字符串抛出错误。可以省略的参数 `separator` 中指定字符串 `str` 的分隔符。分隔符可以是文字或正则表达式。在不指定 `separator` 的情况下、将分隔符看作空的字符串并把 `str` 拆分成由单个字母组成的数组。如果 `separator` 不是字符串则抛出错误。在可省略的参数 `limit` 中指定分割后的子字符串的最大个数。超出个数的子字符串将被舍弃。如果 `limit` 没有被指定,`str` 将不考虑子字符串的个数而将字符串完全分隔。如果 `limit` 是负数则抛出错误。"
|
||||
},
|
||||
"$join": {
|
||||
"args": "array[, separator]",
|
||||
"desc": "用可以省略的参数 `separator`来把多个字符串连接。如果`array`不是字符串则抛出错误。 如果没有指定`separator`,则用空字符串来连接字符(即字符串之间没有`separator`)。 如果`separator`不是字符则抛出错误。"
|
||||
"desc": "用可以省略的参数 `separator` 来把多个字符串连接。如果 `array` 不是字符串则抛出错误。 如果没有指定 `separator` ,则用空字符串来连接字符(即字符串之间没有 `separator` )。 如果 `separator` 不是字符则抛出错误。"
|
||||
},
|
||||
"$match": {
|
||||
"args": "str, pattern [, limit]",
|
||||
"desc": "对字符串`str`使用正则表达式`pattern`并输出与`str`相匹配的部分信息。"
|
||||
"desc": "对字符串 `str` 使用正则表达式 `pattern` 并输出与 `str` 相匹配的部分信息。"
|
||||
},
|
||||
"$replace": {
|
||||
"args": "str, pattern, replacement [, limit]",
|
||||
"desc": "在字符串`str`中搜索`pattern`并用`replacement`来替换。\n\n可选参数`limit`用来指定替换次数的上限。"
|
||||
"desc": "在字符串 `str` 中搜索 `pattern` 并用 `replacement` 来替换。\n\n可选参数 `limit` 用来指定替换次数的上限。"
|
||||
},
|
||||
"$now": {
|
||||
"args": "",
|
||||
@@ -65,31 +65,31 @@
|
||||
},
|
||||
"$number": {
|
||||
"args": "arg",
|
||||
"desc": "用下述的规则将参数 `arg`转换为数值。:\n\n – 数值不做转换。\n – 将字符串中合法的JSON数値表示转换成数値。\n – 其他形式的值则抛出错误。"
|
||||
"desc": "用下述的规则将参数 `arg` 转换为数值。:\n\n – 数值不做转换。\n – 将字符串中合法的JSON数値表示转换成数値。\n – 其他形式的值则抛出错误。"
|
||||
},
|
||||
"$abs": {
|
||||
"args": "number",
|
||||
"desc": "输出参数`number`的绝对值。"
|
||||
"desc": "输出参数 `number` 的绝对值。"
|
||||
},
|
||||
"$floor": {
|
||||
"args": "number",
|
||||
"desc": "输出比`number`的值小的最大整数。"
|
||||
"desc": "输出比 `number` 的值小的最大整数。"
|
||||
},
|
||||
"$ceil": {
|
||||
"args": "number",
|
||||
"desc": "输出比`number`的值大的最小整数。"
|
||||
"desc": "输出比 `number` 的值大的最小整数。"
|
||||
},
|
||||
"$round": {
|
||||
"args": "number [, precision]",
|
||||
"desc": "输出四舍五入后的参数`number`。可省略的参数 `precision`指定四舍五入后小数点下的位数。"
|
||||
"desc": "输出四舍五入后的参数 `number` 。可省略的参数 `precision` 指定四舍五入后小数点下的位数。"
|
||||
},
|
||||
"$power": {
|
||||
"args": "base, exponent",
|
||||
"desc": "输出底数`base`的`exponent`次幂。"
|
||||
"desc": "输出底数 `base` 的 `exponent` 次幂。"
|
||||
},
|
||||
"$sqrt": {
|
||||
"args": "number",
|
||||
"desc": "输出参数 `number`的平方根。"
|
||||
"desc": "输出参数 `number` 的平方根。"
|
||||
},
|
||||
"$random": {
|
||||
"args": "",
|
||||
@@ -97,35 +97,35 @@
|
||||
},
|
||||
"$millis": {
|
||||
"args": "",
|
||||
"desc": "返回从UNIX时间 (1970年1月1日 UTC/GMT的午夜)开始到现在的毫秒数。在同一个表达式的测试中所有对`$millis()`的调用将会返回相同的值。"
|
||||
"desc": "返回从UNIX时间 (1970年1月1日 UTC/GMT的午夜)开始到现在的毫秒数。在同一个表达式的测试中所有对 `$millis()` 的调用将会返回相同的值。"
|
||||
},
|
||||
"$sum": {
|
||||
"args": "array",
|
||||
"desc": "输出数组`array`的总和。如果`array`不是数值则抛出错误。"
|
||||
"desc": "输出数组 `array` 的总和。如果 `array` 不是数值则抛出错误。"
|
||||
},
|
||||
"$max": {
|
||||
"args": "array",
|
||||
"desc": "输出数组`array`的最大值。如果`array`不是数值则抛出错误。"
|
||||
"desc": "输出数组 `array` 的最大值。如果 `array` 不是数值则抛出错误。"
|
||||
},
|
||||
"$min": {
|
||||
"args": "array",
|
||||
"desc": "输出数组`array`的最小值。如果`array`不是数值则抛出错误。。"
|
||||
"desc": "输出数组 `array` 的最小值。如果 `array` 不是数值则抛出错误。。"
|
||||
},
|
||||
"$average": {
|
||||
"args": "array",
|
||||
"desc": "输出数组`array`的平均数。如果`array`不是数值则抛出错误。。"
|
||||
"desc": "输出数组 `array` 的平均数。如果 `array` 不是数值则抛出错误。。"
|
||||
},
|
||||
"$boolean": {
|
||||
"args": "arg",
|
||||
"desc": "用下述规则将数据转换成布尔值。:\n\n - 不转换布尔值`Boolean`。\n – 将空的字符串`string`转换为`false`\n – 将不为空的字符串`string`转换为`true`\n – 将为0的数字`number`转换成`false`\n –将不为0的数字`number`转换成`true`\n –将`null`转换成`false`\n –将空的数组`array`转换成`false`\n –如果数组`array`中含有可以转换成`true`的要素则转换成`true`\n –如果`array`中没有可转换成`true`的要素则转换成`false`\n – 空的对象`object`转换成`false`\n – 非空的对象`object`转换成`true`\n –将函数`function`转换成`false`"
|
||||
"desc": "用下述规则将数据转换成布尔值。:\n\n - 不转换布尔值 `Boolean` 。\n – 将空的字符串 `string` 转换为 `false` \n – 将不为空的字符串 `string` 转换为 `true` \n – 将为0的数字 `number` 转换成 `false` \n –将不为0的数字 `number` 转换成 `true` \n –将 `null` 转换成 `false` \n –将空的数组 `array` 转换成 `false` \n –如果数组 `array` 中含有可以转换成 `true` 的要素则转换成 `true` \n –如果 `array` 中没有可转换成 `true` 的要素则转换成 `false` \n – 空的对象 `object` 转换成 `false` \n – 非空的对象 `object` 转换成 `true` \n –将函数 `function` 转换成 `false` "
|
||||
},
|
||||
"$not": {
|
||||
"args": "arg",
|
||||
"desc": "输出做取反运算后的布尔值。首先将`arg`转换为布尔值。"
|
||||
"desc": "输出做取反运算后的布尔值。首先将 `arg` 转换为布尔值。"
|
||||
},
|
||||
"$exists": {
|
||||
"args": "arg",
|
||||
"desc": "如果算式`arg`的值存在则输出`true`。如果算式的值不存在(比如指向不存在区域的引用)则输出`false`。"
|
||||
"desc": "如果算式 `arg` 的值存在则输出 `true` 。如果算式的值不存在(比如指向不存在区域的引用)则输出 `false` 。"
|
||||
},
|
||||
"$count": {
|
||||
"args": "array",
|
||||
@@ -137,15 +137,15 @@
|
||||
},
|
||||
"$sort": {
|
||||
"args": "array [, function]",
|
||||
"desc": "输出排序后的数组`array`。\n\n如果使用了比较函数`function`,则下述两个参数需要被指定。\n\n`function(left, right)`\n\n该比较函数是为了比较left和right两个值而被排序算法调用的。如果用户希望left的值被置于right的值之后,那么该函数必须输出布尔值`true`来表示位置交换。而在不需要位置交换时函数必须输出`false`。"
|
||||
"desc": "输出排序后的数组 `array` 。\n\n如果使用了比较函数 `function` ,则下述两个参数需要被指定。\n\n `function(left, right)` \n\n该比较函数是为了比较left和right两个值而被排序算法调用的。如果用户希望left的值被置于right的值之后,那么该函数必须输出布尔值 `true` 来表示位置交换。而在不需要位置交换时函数必须输出 `false` 。"
|
||||
},
|
||||
"$reverse": {
|
||||
"args": "array",
|
||||
"desc": "输出倒序后的数组`array`。"
|
||||
"desc": "输出倒序后的数组 `array` 。"
|
||||
},
|
||||
"$shuffle": {
|
||||
"args": "array",
|
||||
"desc": "输出随机排序后的数组 `array`。"
|
||||
"desc": "输出随机排序后的数组 `array` 。"
|
||||
},
|
||||
"$zip": {
|
||||
"args": "array, ...",
|
||||
@@ -157,35 +157,35 @@
|
||||
},
|
||||
"$lookup": {
|
||||
"args": "object, key",
|
||||
"desc": "输出对象中与参数`key`对应的值。如果第一个参数`object`是数组,那么数组中所有的对象都将被搜索并输出这些对象中与参数`key`对应的值。"
|
||||
"desc": "输出对象中与参数 `key` 对应的值。如果第一个参数 `object` 是数组,那么数组中所有的对象都将被搜索并输出这些对象中与参数 `key` 对应的值。"
|
||||
},
|
||||
"$spread": {
|
||||
"args": "object",
|
||||
"desc": "将对象中的键值对分隔成每个要素中只含有一个键值对的数组。如果参数`object`是数组,那么返回值的数组中包含所有对象中的键值对。"
|
||||
"desc": "将对象中的键值对分隔成每个要素中只含有一个键值对的数组。如果参数 `object` 是数组,那么返回值的数组中包含所有对象中的键值对。"
|
||||
},
|
||||
"$merge": {
|
||||
"args": "array<object>",
|
||||
"desc": "将输入数组`objects`中所有的键值对合并到一个`object`中并返回。如果输入数组的要素中含有重复的键,则返回的`object`中将只包含数组中最后出现要素的值。如果输入数组中包括对象以外的元素,则抛出错误。"
|
||||
"desc": "将输入数组 `objects` 中所有的键值对合并到一个 `object` 中并返回。如果输入数组的要素中含有重复的键,则返回的 `object` 中将只包含数组中最后出现要素的值。如果输入数组中包括对象以外的元素,则抛出错误。"
|
||||
},
|
||||
"$sift": {
|
||||
"args": "object, function",
|
||||
"desc": "输出参数`object`中符合`function`的键值对。\n\n`function`必须含有下述参数。\n\n`function(value [, key [, object]])`"
|
||||
"desc": "输出参数 `object` 中符合 `function` 的键值对。\n\n `function` 必须含有下述参数。\n\n `function(value [, key [, object]])` "
|
||||
},
|
||||
"$each": {
|
||||
"args": "object, function",
|
||||
"desc": "将函数`function`应用于`object`中的所有键值对并输出由所有返回值组成的数组。"
|
||||
"desc": "将函数 `function` 应用于 `object` 中的所有键值对并输出由所有返回值组成的数组。"
|
||||
},
|
||||
"$map": {
|
||||
"args": "array, function",
|
||||
"desc": "将函数`function`应用于数组`array`中所有的值并输出由返回值组成的数组。\n\n`function`中必须含有下述参数。\n\n`function(value [, index [, array]])`"
|
||||
"desc": "将函数 `function` 应用于数组 `array` 中所有的值并输出由返回值组成的数组。\n\n `function` 中必须含有下述参数。\n\n`function(value [, index [, array]])` "
|
||||
},
|
||||
"$filter": {
|
||||
"args": "array, function",
|
||||
"desc": "输出数组`array`中符合函数`function`条件的值组成的数组。\n\n`function`必须包括下述参数。\n\n`function(value [, index [, array]])`"
|
||||
"desc": "输出数组 `array` 中符合函数 `function` 条件的值组成的数组。\n\n `function` 必须包括下述参数。\n\n `function(value [, index [, array]])`"
|
||||
},
|
||||
"$reduce": {
|
||||
"args": "array, function [, init]",
|
||||
"desc": "将`function`依次应用于数组中的各要素值。 其中,前一个要素值的计算结果将参与到下一次的函数运算中。。\n\n函数`function`接受两个参数并作为中缀表示法中的操作符。\n\n可省略的参数`init`将作为运算的初始值。"
|
||||
"desc": "将 `function` 依次应用于数组中的各要素值。 其中,前一个要素值的计算结果将参与到下一次的函数运算中。。\n\n函数 `function` 接受两个参数并作为中缀表示法中的操作符。\n\n可省略的参数 `init` 将作为运算的初始值。"
|
||||
},
|
||||
"$flowContext": {
|
||||
"args": "string",
|
||||
@@ -197,7 +197,7 @@
|
||||
},
|
||||
"$pad": {
|
||||
"args": "string, width [, char]",
|
||||
"desc": "根据需要,向字符串`string`的副本中填充文字使该字符串的字数达到`width`的绝对值并返回填充文字后的字符串。\n\n如果`width`的值为正,则向字符串`string`的右侧填充文字,如果`width`为负,则向字符串`string`的左侧填充文字。\n\n可选参数`char`用来指定填充的文字。如果未指定该参数,则填充空白文字。"
|
||||
"desc": "根据需要,向字符串 `string` 的副本中填充文字使该字符串的字数达到 `width` 的绝对值并返回填充文字后的字符串。\n\n如果 `width` 的值为正,则向字符串 `string` 的右侧填充文字,如果 `width` 为负,则向字符串 `string` 的左侧填充文字。\n\n可选参数 `char` 用来指定填充的文字。如果未指定该参数,则填充空白文字。"
|
||||
},
|
||||
"$fromMillis": {
|
||||
"args": "number",
|
||||
@@ -205,14 +205,70 @@
|
||||
},
|
||||
"$formatNumber": {
|
||||
"args": "number, picture [, options]",
|
||||
"desc": "将`number`转换成具有`picture`所指定的数值格式的字符串。\n\n此函数的功能与XPath F&O 3.1规格中定义的XPath/XQuery函数的fn:format-number功能相一致。参数`picture`用于指定数值的转换格式,其语法与fn:format-number中的定义一致。\n\n可选的第三参数`options`用来覆盖默认的局部环境格式,如小数点分隔符。如果指定该参数,那么该参数必须是包含name/value对的对象,并且name/value对必须符合XPath F&O 3.1规格中记述的数值格式。"
|
||||
"desc": "将 `number` 转换成具有 `picture` 所指定的数值格式的字符串。\n\n此函数的功能与XPath F&O 3.1规格中定义的XPath/XQuery函数的fn:format-number功能相一致。参数 `picture` 用于指定数值的转换格式,其语法与fn:format-number中的定义一致。\n\n可选的第三参数 `options` 用来覆盖默认的局部环境格式,如小数点分隔符。如果指定该参数,那么该参数必须是包含name/value对的对象,并且name/value对必须符合XPath F&O 3.1规格中记述的数值格式。"
|
||||
},
|
||||
"$formatBase": {
|
||||
"args": "number [, radix]",
|
||||
"desc": "将`number`变换为以参数`radix`的值为基数形式的字符串。如果不指定`radix`的值,则默认基数为10。指定的`radix`值必须在2~36之间,否则抛出错误。"
|
||||
"desc": "将 `number` 变换为以参数 `radix` 的值为基数形式的字符串。如果不指定 `radix` 的值,则默认基数为10。指定的 `radix` 值必须在2~36之间,否则抛出错误。"
|
||||
},
|
||||
"$toMillis": {
|
||||
"args": "timestamp",
|
||||
"desc": "将ISO 8601格式的字符串`timestamp`转换为从UNIX时间 (1970年1月1日 UTC/GMT的午夜)开始到现在的毫秒数。如果该字符串的格式不正确,则抛出错误。"
|
||||
"desc": "将ISO 8601格式的字符串 `timestamp` 转换为从UNIX时间 (1970年1月1日 UTC/GMT的午夜)开始到现在的毫秒数。如果该字符串的格式不正确,则抛出错误。"
|
||||
},
|
||||
"$env": {
|
||||
"args": "arg",
|
||||
"desc": "返回环境变量的值。\n\n这是Node-RED定义的函数。"
|
||||
},
|
||||
"$eval": {
|
||||
"args": "expr [, context]",
|
||||
"desc": "使用当前上下文来作为评估依据,分析并评估字符串 `expr` ,其中包含文字JSON或JSONata表达式。"
|
||||
},
|
||||
"$formatInteger": {
|
||||
"args": "number, picture",
|
||||
"desc": "将“数字”转换为字符串,并将其格式化为“图片”字符串指定的整数表示形式。图片字符串参数定义了数字的格式,并具有与XPath F&O 3.1 规范中的fn:format-integer相同的语法。"
|
||||
},
|
||||
"$parseInteger": {
|
||||
"args": "string, picture",
|
||||
"desc": "使用“图片”字符串指定的格式将“字符串”参数的内容解析为整数(作为JSON数字)。图片字符串参数与$formatInteger格式相同。."
|
||||
},
|
||||
"$error": {
|
||||
"args": "[str]",
|
||||
"desc": "引发错误并显示一条消息。 可选的 `str` 将替代$error()函数评估的默认消息。"
|
||||
},
|
||||
"$assert": {
|
||||
"args": "arg, str",
|
||||
"desc": "如果 `arg` 为真,则该函数返回。 如果arg为假,则抛出带有str的异常作为异常消息。"
|
||||
},
|
||||
"$single": {
|
||||
"args": "array, function",
|
||||
"desc": "返回满足参数function谓语的array参数中的唯一值 (比如:传递值时,函数返回布尔值“true”)。如果匹配值的数量不唯一时,则抛出异常。\n\n应在以下签名中提供函数: `function(value [,index [,array []]])` 其中value是数组的每个输入,index是该值的位置,整个数组作为第三个参数传递。"
|
||||
},
|
||||
"$encodeUrl": {
|
||||
"args": "str",
|
||||
"desc": "通过用表示字符的UTF-8编码的一个,两个,三个或四个转义序列替换某些字符的每个实例,对统一资源定位符(URL)组件进行编码。\n\n示例: `$encodeUrlComponent(\"?x=test\")` => `\"%3Fx%3Dtest\"`"
|
||||
},
|
||||
"$encodeUrlComponent": {
|
||||
"args": "str",
|
||||
"desc": "通过用表示字符的UTF-8编码的一个,两个,三个或四个转义序列替换某些字符的每个实例,对统一资源定位符(URL)进行编码。\n\n示例: `$encodeUrl(\"https://mozilla.org/?x=шеллы\")` => `\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\"`"
|
||||
},
|
||||
"$decodeUrl": {
|
||||
"args": "str",
|
||||
"desc": "解码以前由encodeUrlComponent创建的统一资源定位器(URL)组件。 \n\n示例: `$decodeUrlComponent(\"%3Fx%3Dtest\")` => `\"?x=test\"`"
|
||||
},
|
||||
"$decodeUrlComponent": {
|
||||
"args": "str",
|
||||
"desc": "解码先前由encodeUrl创建的统一资源定位符(URL)。 \n\n示例: `$decodeUrl(\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\")` => `\"https://mozilla.org/?x=шеллы\"`"
|
||||
},
|
||||
"$distinct": {
|
||||
"args": "array",
|
||||
"desc": "返回一个数组,其中重复的值已从 `数组` 中删除"
|
||||
},
|
||||
"$type": {
|
||||
"args": "value",
|
||||
"desc": "以字符串形式返回 `值` 的类型。 如果该 `值` 未定义,则将返回 `未定义` "
|
||||
},
|
||||
"$moment": {
|
||||
"args": "[str]",
|
||||
"desc": "使用Moment库获取日期对象。"
|
||||
}
|
||||
}
|
||||
|
1074
packages/node_modules/@node-red/editor-client/locales/zh-TW/editor.json
vendored
Normal file
23
packages/node_modules/@node-red/editor-client/locales/zh-TW/infotips.json
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"info": {
|
||||
"tip0" : "您可以用 {{core:delete-selection}} 刪除選擇的節點或連結。",
|
||||
"tip1" : "{{core:search}} 可以在流程內搜索節點。",
|
||||
"tip2": "{{core:toggle-sidebar}} 可以顯示或隱藏邊側欄。",
|
||||
"tip3": "您可以在 {{core:manage-palette}} 中管理節點的控制台。",
|
||||
"tip4": "側邊欄中會列出流程中所有的配置節點。您可以通過功能表或者 {{core:show-config-tab}} 來訪問這些節點。",
|
||||
"tip5": "您可以在設定中選擇顯示或隱藏這些提示。",
|
||||
"tip6": "您可以用[left] [up] [down] [right]鍵來移動被選中的節點。按住[shift]可以更快地移動節點。",
|
||||
"tip7": "把節點拖到連接上可以向連接中插入節點。",
|
||||
"tip8": "您可以用 {{core:show-export-dialog}} 來匯出被選中的節點或標籤頁中的流程。",
|
||||
"tip9": "您可以將流程的json文字檔拖入編輯方塊或 {{core:show-import-dialog}} 來導入流程。",
|
||||
"tip10": "按住[shift]後按一下並拖動節點可以將該節點的多個連接一併移動到其他節點的埠。",
|
||||
"tip11": "{{core:show-info-tab}} 可以顯示「資訊」標籤頁。 {{core:show-debug-tab}} 可以顯示「調試」標籤頁。",
|
||||
"tip12": "按住[ctrl]的同時點擊工作介面可以在節點的對話欄中快速添加節點。",
|
||||
"tip13": "按住[ctrl]的同時點擊節點的埠或後續節點可以快速連接多個節點。",
|
||||
"tip14": "按住[shift]的同時點擊節點會選中所有被連接的節點。",
|
||||
"tip15": "按住[ctrl]的同時點擊節點可以在選中或取消選中節點。",
|
||||
"tip16": "{{core:show-previous-tab}} 和 {{core:show-next-tab}} 可以切換標籤頁。",
|
||||
"tip17": "您可以在節點的屬性配置畫面中通過 {{core:confirm-edit-tray}} 來更改設置,或者用 {{core:cancel-edit-tray}} 來取消更改。",
|
||||
"tip18": "您可以通過點擊 {{core:edit-selected-node}} 來顯示被選中節點的屬性設置畫面。"
|
||||
}
|
||||
}
|
274
packages/node_modules/@node-red/editor-client/locales/zh-TW/jsonata.json
vendored
Normal file
@@ -0,0 +1,274 @@
|
||||
{
|
||||
"$string": {
|
||||
"args": "arg",
|
||||
"desc": "通過以下的類型轉換規則將參數*arg*轉換成字串:\n\n - 字串不轉換。\n -函數轉換成空的字串。\n - JSON的值無法用數字表示所以用無限大或者NaN(非數)表示。\n - 用’JSON.stringify’函數將其他值轉換成JSON字串。"
|
||||
},
|
||||
"$length": {
|
||||
"args": "str",
|
||||
"desc": "輸出字串’str’的字數。如果’str’不是字串,拋出錯誤。"
|
||||
},
|
||||
"$substring": {
|
||||
"args": "str, start[, length]",
|
||||
"desc": "輸出`start`位置後的的首次出現的包括`str`的子字串。 如果`length`被指定,那麼的字串中將只包括前`length`個文字。如果`start`是負數則輸出從`str`末尾開始的`length`個文字"
|
||||
},
|
||||
"$substringBefore": {
|
||||
"args": "str, chars",
|
||||
"desc": "輸出’str’中首次出現的’chars’之前的子字串,如果’str’中不包括’chars’則輸出’str’。"
|
||||
},
|
||||
"$substringAfter": {
|
||||
"args": "str, chars",
|
||||
"desc": "輸出’str’中首次出現的’chars’之後的子字串,如果’str’中不包括’chars’則輸出’str’。"
|
||||
},
|
||||
"$uppercase": {
|
||||
"args": "str",
|
||||
"desc": "`將’str’中的所有字母變為大寫後輸出。"
|
||||
},
|
||||
"$lowercase": {
|
||||
"args": "str",
|
||||
"desc": "將’str’中的所有字母變為小寫後輸出。"
|
||||
},
|
||||
"$trim": {
|
||||
"args": "str",
|
||||
"desc": "將以下步驟應用於`str`來去除所有空白文字並實現標準化。\n\n – 將全部tab定位字元、Enter鍵、換行字元用空白代替。\n- 將連續的空白文字變成一個空白文字。\n- 消除開頭和末尾的空白文字。\n\n如果`str`沒有被指定(即在無輸入參數的情況下調用本函數),將上下文的值作為`str`來使用。 如果`str` 不是字串則拋出錯誤。"
|
||||
},
|
||||
"$contains": {
|
||||
"args": "str, pattern",
|
||||
"desc": "字串`str` 和 `pattern`匹配的話輸出`true`,不匹配的情況下輸出 `false`。 不指定`str`的情況下(比如用一個參數調用本函數時)、將上下文的值作為`str`來使用。參數 `pattern`可以為字串或正則表達。"
|
||||
},
|
||||
"$split": {
|
||||
"args": "str[, separator][, limit]",
|
||||
"desc": "將參數`str`分解成由子字串組成的陣列。 如果`str`不是字串拋出錯誤。可以省略的參數 `separator`中指定字串`str`的分隔符號。分隔符號可以是文字或規則運算式。在不指定`separator`的情況下、將分隔符號看作空的字串並把`str`拆分成由單個字母組成的陣列。如果`separator`不是字串則拋出錯誤。在可省略的參數`limit`中指定分割後的子字串的最大個數。超出個數的子字串將被捨棄。如果`limit`沒有被指定,`str` 將不考慮子字串的個數而將字串完全分隔。如果`limit`是負數則拋出錯誤。"
|
||||
},
|
||||
"$join": {
|
||||
"args": "array[, separator]",
|
||||
"desc": "用可以省略的參數 `separator`來把多個字元串連接。如果`array`不是字串則拋出錯誤。 如果沒有指定`separator`,則用空字串來連接字元(即字串之間沒有`separator`)。 如果`separator`不是字元則拋出錯誤。"
|
||||
},
|
||||
"$match": {
|
||||
"args": "str, pattern [, limit]",
|
||||
"desc": "對字串`str`使用規則運算式`pattern`並輸出與`str`相匹配的部分資訊。"
|
||||
},
|
||||
"$replace": {
|
||||
"args": "str, pattern, replacement [, limit]",
|
||||
"desc": "在字串`str`中搜索`pattern`並用`replacement`來替換。\n\n可選參數`limit`用來指定替換次數的上限。"
|
||||
},
|
||||
"$now": {
|
||||
"args": "",
|
||||
"desc": "生成ISO 8601互換格式的時刻,並作為字串輸出。"
|
||||
},
|
||||
"$base64encode": {
|
||||
"args": "string",
|
||||
"desc": "將ASCII格式的字串轉換為Base 64格式。將字串中的文字視作二進位形式的資料處理。包含URI編碼在內的字串文字必須在0x00到0xFF的範圍內,否則不會被支持。"
|
||||
},
|
||||
"$base64decode": {
|
||||
"args": "string",
|
||||
"desc": "用UTF-8內碼表將Base 64形式二進位值轉換為字串。"
|
||||
},
|
||||
"$number": {
|
||||
"args": "arg",
|
||||
"desc": "用下述的規則將參數 `arg`轉換為數值。:\n\n – 數值不做轉換。\n – 將字串中合法的JSON數値表示轉換成數値。\n – 其他形式的值則拋出錯誤。"
|
||||
},
|
||||
"$abs": {
|
||||
"args": "number",
|
||||
"desc": "輸出參數`number`的絕對值。"
|
||||
},
|
||||
"$floor": {
|
||||
"args": "number",
|
||||
"desc": "輸出比`number`的值小的最大整數。"
|
||||
},
|
||||
"$ceil": {
|
||||
"args": "number",
|
||||
"desc": "輸出比`number`的值大的最小整數。"
|
||||
},
|
||||
"$round": {
|
||||
"args": "number [, precision]",
|
||||
"desc": "輸出四捨五入後的參數`number`。可省略的參數 `precision`指定四捨五入後小數點下的位數。"
|
||||
},
|
||||
"$power": {
|
||||
"args": "base, exponent",
|
||||
"desc": "輸出底數`base`的`exponent`次冪。"
|
||||
},
|
||||
"$sqrt": {
|
||||
"args": "number",
|
||||
"desc": "輸出參數 `number`的平方根。"
|
||||
},
|
||||
"$random": {
|
||||
"args": "",
|
||||
"desc": "輸出比0大,比1小的偽亂數。"
|
||||
},
|
||||
"$millis": {
|
||||
"args": "",
|
||||
"desc": "返回從UNIX時間 (1970年1月1日 UTC/GMT的午夜)開始到現在的毫秒數。在同一個運算式的測試中所有對`$millis()`的調用將會返回相同的值。"
|
||||
},
|
||||
"$sum": {
|
||||
"args": "array",
|
||||
"desc": "輸出陣列`array`的總和。如果`array`不是數值則拋出錯誤。"
|
||||
},
|
||||
"$max": {
|
||||
"args": "array",
|
||||
"desc": "輸出陣列`array`的最大值。如果`array`不是數值則拋出錯誤。"
|
||||
},
|
||||
"$min": {
|
||||
"args": "array",
|
||||
"desc": "輸出陣列`array`的最小值。如果`array`不是數值則拋出錯誤。。"
|
||||
},
|
||||
"$average": {
|
||||
"args": "array",
|
||||
"desc": "輸出陣列`array`的平均數。如果`array`不是數值則拋出錯誤。。"
|
||||
},
|
||||
"$boolean": {
|
||||
"args": "arg",
|
||||
"desc": "用下述規則將資料轉換成布林值。:\n\n - 不轉換布林值`Boolean`。\n – 將空的字串`string`轉換為`false`\n – 將不為空的字串`string`轉換為`true`\n – 將為0的數位`number`轉換成`false`\n –將不為0的數位`number`轉換成`true`\n –將`null`轉換成`false`\n –將空的陣列`array`轉換成`false`\n –如果陣列`array`中含有可以轉換成`true`的要素則轉換成`true`\n –如果`array`中沒有可轉換成`true`的要素則轉換成`false`\n – 空的物件`object`轉換成`false`\n – 非空的物件`object`轉換成`true`\n –將函數`function`轉換成`false`"
|
||||
},
|
||||
"$not": {
|
||||
"args": "arg",
|
||||
"desc": "輸出做反轉運算後的布林值。首先將`arg`轉換為布林值。"
|
||||
},
|
||||
"$exists": {
|
||||
"args": "arg",
|
||||
"desc": "如果算式`arg`的值存在則輸出`true`。如果算式的值不存在(比如指向不存在區域的引用)則輸出`false`。"
|
||||
},
|
||||
"$count": {
|
||||
"args": "array",
|
||||
"desc": "輸出陣列中的元素數。"
|
||||
},
|
||||
"$append": {
|
||||
"args": "array, array",
|
||||
"desc": "將兩個陣列連接。"
|
||||
},
|
||||
"$sort": {
|
||||
"args": "array [, function]",
|
||||
"desc": "輸出排序後的陣列`array`。\n\n如果使用了比較函數`function`,則下述兩個參數需要被指定。\n\n`function(left, right)`\n\n該比較函數是為了比較left和right兩個值而被排序演算法調用的。如果使用者希望left的值被置於right的值之後,那麼該函數必須輸出布林值`true`來表示位置交換。而在不需要位置交換時函數必須輸出`false`。"
|
||||
},
|
||||
"$reverse": {
|
||||
"args": "array",
|
||||
"desc": "輸出倒序後的陣列`array`。"
|
||||
},
|
||||
"$shuffle": {
|
||||
"args": "array",
|
||||
"desc": "輸出隨機排序後的陣列 `array`。"
|
||||
},
|
||||
"$zip": {
|
||||
"args": "array, ...",
|
||||
"desc": "將陣列中的值按索引順序打包後輸出。"
|
||||
},
|
||||
"$keys": {
|
||||
"args": "object",
|
||||
"desc": "輸出由物件內的鍵組成的陣列。如果參數是物件的陣列則輸出由所有物件中的鍵去重後組成的佇列。"
|
||||
},
|
||||
"$lookup": {
|
||||
"args": "object, key",
|
||||
"desc": "輸出對象中與參數`key`對應的值。如果第一個參數`object`是陣列,那麼陣列中所有的物件都將被搜索並輸出這些物件中與參數`key`對應的值。"
|
||||
},
|
||||
"$spread": {
|
||||
"args": "object",
|
||||
"desc": "將物件中的鍵值對分隔成每個要素中只含有一個鍵值對的陣列。如果參數`object`是陣列,那麼返回值的陣列中包含所有物件中的鍵值對。"
|
||||
},
|
||||
"$merge": {
|
||||
"args": "array<object>",
|
||||
"desc": "將輸入陣列`objects`中所有的鍵值對合併到一個`object`中並返回。如果輸入陣列的要素中含有重複的鍵,則返回的`object`中將只包含陣列中最後出現要素的值。如果輸入陣列中包括物件以外的元素,則拋出錯誤。"
|
||||
},
|
||||
"$sift": {
|
||||
"args": "object, function",
|
||||
"desc": "輸出參數`object`中符合`function`的鍵值對。\n\n`function`必須含有下述參數。\n\n`function(value [, key [, object]])`"
|
||||
},
|
||||
"$each": {
|
||||
"args": "object, function",
|
||||
"desc": "將函數`function`應用於`object`中的所有鍵值對並輸出由所有返回值組成的陣列。"
|
||||
},
|
||||
"$map": {
|
||||
"args": "array, function",
|
||||
"desc": "將函數`function`應用於陣列`array`中所有的值並輸出由返回值組成的陣列。\n\n`function`中必須含有下述參數。\n\n`function(value [, index [, array]])`"
|
||||
},
|
||||
"$filter": {
|
||||
"args": "array, function",
|
||||
"desc": "輸出陣列`array`中符合函數`function`條件的值組成的陣列。\n\n`function`必須包括下述參數。\n\n`function(value [, index [, array]])`"
|
||||
},
|
||||
"$reduce": {
|
||||
"args": "array, function [, init]",
|
||||
"desc": "將`function`依次應用於陣列中的各要素值。 其中,前一個要素值的計算結果將參與到下一次的函數運算中。。\n\n函數`function`接受兩個參數並作為中綴標記法中的操作符。\n\n可省略的參數`init`將作為運算的初始值。"
|
||||
},
|
||||
"$flowContext": {
|
||||
"args": "string",
|
||||
"desc": "獲取流上下文(流等級的上下文,可以讓所有節點共用)的屬性。"
|
||||
},
|
||||
"$globalContext": {
|
||||
"args": "string",
|
||||
"desc": "獲取全域上下文的屬性。"
|
||||
},
|
||||
"$pad": {
|
||||
"args": "string, width [, char]",
|
||||
"desc": "根據需要,向字串`string`的副本中填充文字使該字串的字數達到`width`的絕對值並返回填充文字後的字串。\n\n如果`width`的值為正,則向字串`string`的右側填充文字,如果`width`為負,則向字串`string`的左側填充文字。\n\n可選參數`char`用來指定填充的文字。如果未指定該參數,則填充空白文字。"
|
||||
},
|
||||
"$fromMillis": {
|
||||
"args": "number",
|
||||
"desc": "將表示從UNIX時間 (1970年1月1日 UTC/GMT的午夜)開始到現在的毫秒數的數值轉換成ISO 8601形式時間戳記的字串。"
|
||||
},
|
||||
"$formatNumber": {
|
||||
"args": "number, picture [, options]",
|
||||
"desc": "將`number`轉換成具有`picture`所指定的數值格式的字串。\n\n此函數的功能與XPath F&O 3.1規格中定義的XPath/XQuery函數的fn:format-number功能相一致。參數`picture`用於指定數值的轉換格式,其語法與fn:format-number中的定義一致。\n\n可選的第三參數`options`用來覆蓋預設的局部環境格式,如小數點分隔符號。如果指定該參數,那麼該參數必須是包含name/value對的物件,並且name/value對必須符合XPath F&O 3.1規格中記述的數值格式。"
|
||||
},
|
||||
"$formatBase": {
|
||||
"args": "number [, radix]",
|
||||
"desc": "將`number`變換為以參數`radix`的值為基數形式的字串。如果不指定`radix`的值,則默認基數為10。指定的`radix`值必須在2~36之間,否則拋出錯誤。"
|
||||
},
|
||||
"$toMillis": {
|
||||
"args": "timestamp",
|
||||
"desc": "將ISO 8601格式的字串`timestamp`轉換為從UNIX時間 (1970年1月1日 UTC/GMT的午夜)開始到現在的毫秒數。如果該字串的格式不正確,則拋出錯誤。"
|
||||
},
|
||||
"$env": {
|
||||
"args": "arg",
|
||||
"desc": "返回環境變量的值。\n\n這是Node-RED定義的函數。"
|
||||
},
|
||||
"$eval": {
|
||||
"args": "expr [, context]",
|
||||
"desc": "使用當前上下文來作為評估依據,分析並評估字符串`expr`,其中包含文字JSON或JSONata表達式。"
|
||||
},
|
||||
"$formatInteger": {
|
||||
"args": "number, picture",
|
||||
"desc": "將“數字”轉換為字符串,並將其格式化為“圖片”字符串指定的整數表示形式。圖片字符串參數定義了數字的格式,並具有與XPath F&O 3.1 規範中的fn:format-integer相同的語法。"
|
||||
},
|
||||
"$parseInteger": {
|
||||
"args": "string, picture",
|
||||
"desc": "使用“圖片”字符串指定的格式將“字符串”參數的內容解析為整數(作為JSON數字)。圖片字符串參數與$formatInteger格式相同。."
|
||||
},
|
||||
"$error": {
|
||||
"args": "[str]",
|
||||
"desc": "引發錯誤並顯示一條消息。 可選的`str`將替代$error()函數評估的默認消息。"
|
||||
},
|
||||
"$assert": {
|
||||
"args": "arg, str",
|
||||
"desc": "如果`arg`為真,則該函數返回。 如果arg為假,則拋出帶有str的異常作為異常消息。"
|
||||
},
|
||||
"$single": {
|
||||
"args": "array, function",
|
||||
"desc": "返回滿足參數function謂語的array參數中的唯一值 (比如:傳遞值時,函數返回布林值“true”)。如果匹配值的數量不唯一時,則拋出異常。\n\n應在以下簽名中提供函數:`function(value [,index [,array []]])`其中value是數組的每個輸入,index是該值的位置,整個數組作為第三個參數傳遞。"
|
||||
},
|
||||
"$encodeUrl": {
|
||||
"args": "str",
|
||||
"desc": "通過用表示字符的UTF-8編碼的一個,兩個,三個或四個轉義序列替換某些字符的每個實例,對統一資源定位符(URL)組件進行編碼。\n\n示例:`$encodeUrlComponent(\"?x=test\")` => `\"%3Fx%3Dtest\"`"
|
||||
},
|
||||
"$encodeUrlComponent": {
|
||||
"args": "str",
|
||||
"desc": "通過用表示字符的UTF-8編碼的一個,兩個,三個或四個轉義序列替換某些字符的每個實例,對統一資源定位符(URL)進行編碼。\n\n示例: `$encodeUrl(\"https://mozilla.org/?x=шеллы\")` => `\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\"`"
|
||||
},
|
||||
"$decodeUrl": {
|
||||
"args": "str",
|
||||
"desc": "解碼以前由encodeUrlComponent創建的統一資源定位器(URL)組件。 \n\n示例: `$decodeUrlComponent(\"%3Fx%3Dtest\")` => `\"?x=test\"`"
|
||||
},
|
||||
"$decodeUrlComponent": {
|
||||
"args": "str",
|
||||
"desc": "解碼先前由encodeUrl創建的統一資源定位符(URL)。 \n\n示例: `$decodeUrl(\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\")` => `\"https://mozilla.org/?x=шеллы\"`"
|
||||
},
|
||||
"$distinct": {
|
||||
"args": "array",
|
||||
"desc": "返回一個數組,其中重復的值已從`數組`中刪除"
|
||||
},
|
||||
"$type": {
|
||||
"args": "value",
|
||||
"desc": "以字符串形式返回`值`的類型。 如果該`值`未定義,則將返回`未定義`"
|
||||
},
|
||||
"$moment": {
|
||||
"args": "[str]",
|
||||
"desc": "使用Moment庫獲取日期對象。"
|
||||
}
|
||||
}
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@node-red/editor-client",
|
||||
"version": "0.20.0-beta.5",
|
||||
"version": "1.1.2",
|
||||
"license": "Apache-2.0",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
@@ -1,4 +1,4 @@
|
||||
ace.define("ace/snippets/nrjavascript",[],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="nrjavascript"});
|
||||
ace.define("ace/snippets/nrjavascript",[],function(e,t,n){"use strict";t.snippetText='# Prototype\nsnippet proto\n ${1:class_name}.prototype.${2:method_name} = function(${3:first_argument}) {\n ${4:// body...}\n };\n# Function\nsnippet fun\n function ${1?:function_name}(${2:argument}) {\n ${3:// body...}\n }\n# Anonymous Function\nregex /((=)\\s*|(:)\\s*|(\\()|\\b)/f/(\\))?/\nsnippet f\n function${M1?: ${1:functionName}}($2) {\n ${0:$TM_SELECTED_TEXT}\n }${M2?;}${M3?,}${M4?)}\n# Immediate function\ntrigger \\(?f\\(\nendTrigger \\)?\nsnippet f(\n (function(${1}) {\n ${0:${TM_SELECTED_TEXT:/* code */}}\n }(${1}));\n# if\nsnippet if\n if (${1:true}) {\n ${0}\n }\n# if ... else\nsnippet ife\n if (${1:true}) {\n ${2}\n } else {\n ${0}\n }\n# tertiary conditional\nsnippet ter\n ${1:/* condition */} ? ${2:a} : ${3:b}\n# switch\nsnippet switch\n switch (${1:expression}) {\n case \'${3:case}\':\n ${4:// code}\n break;\n ${5}\n default:\n ${2:// code}\n }\n# case\nsnippet case\n case \'${1:case}\':\n ${2:// code}\n break;\n ${3}\n\n# while (...) {...}\nsnippet wh\n while (${1:/* condition */}) {\n ${0:/* code */}\n }\n# try\nsnippet try\n try {\n ${0:/* code */}\n } catch (e) {}\n# do...while\nsnippet do\n do {\n ${2:/* code */}\n } while (${1:/* condition */});\n# Object Method\nsnippet :f\nregex /([,{[])|^\\s*/:f/\n ${1:method_name}: function(${2:attribute}) {\n ${0}\n }${3:,}\n# setTimeout function\nsnippet setTimeout\nregex /\\b/st|timeout|setTimeo?u?t?/\n setTimeout(function() {${3:$TM_SELECTED_TEXT}}, ${1:10});\n# console.log (Firebug)\nsnippet cl\n console.log(${1});\n# return\nsnippet ret\n return ${1:result}\n# for (property in object ) { ... }\nsnippet fori\n for (var ${1:prop} in ${2:Things}) {\n ${0:$2[$1]}\n }\n# hasOwnProperty\nsnippet has\n hasOwnProperty(${1})\n# docstring\nsnippet /**\n /**\n * ${1:description}\n *\n */\nsnippet @par\nregex /^\\s*\\*\\s*/@(para?m?)?/\n @param {${1:type}} ${2:name} ${3:description}\nsnippet @ret\n @return {${1:type}} ${2:description}\n# JSON.parse\nsnippet jsonp\n JSON.parse(${1:jstr});\n# JSON.stringify\nsnippet jsons\n JSON.stringify(${1:object});\n# self-defining function\nsnippet sdf\n var ${1:function_name} = function(${2:argument}) {\n ${3:// initial code ...}\n\n $1 = function($2) {\n ${4:// main code}\n };\n }\n# \nsnippet for-\n for (var ${1:i} = ${2:Things}.length; ${1:i}--; ) {\n ${0:${2:Things}[${1:i}];}\n }\n# for (...) {...}\nsnippet for\n for (var ${1:i} = 0; $1 < ${2:Things}.length; $1++) {\n ${3:$2[$1]}$0\n }\n# for (...) {...} (Improved Native For-Loop)\nsnippet forr\n for (var ${1:i} = ${2:Things}.length - 1; $1 >= 0; $1--) {\n ${3:$2[$1]}$0\n }\n# Node-RED Specific Funcs\nsnippet nodes\n node.send(${1:msg})\nsnippet clone\n RED.util.cloneMessage(${1:msg})\nsnippet nodel\n node.log($1)\nsnippet nodew\n node.warn($1)\nsnippet nodee\n node.error($1)\nsnippet noded\n node.debug($1)\nsnippet done\n node.done($1)\nsnippet flowg\n flow.get($1)\nsnippet flows\n flow.set($1, $2)\nsnippet globalg\n global.get($1)\nsnippet globals\n global.set($1, $2)\n',t.scope="nrjavascript"});
|
||||
(function() {
|
||||
ace.require(["ace/snippets/nrjavascript"], function(m) {
|
||||
if (typeof module == "object" && typeof exports == "object" && module) {
|
||||
@@ -6,4 +6,3 @@ ace.define("ace/snippets/nrjavascript",[],function(e,t,n){"use strict";t.snippet
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
Before Width: | Height: | Size: 291 B |
1
packages/node_modules/@node-red/editor-client/src/images/deploy-flows-o.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="27" height="18" xmlns="http://www.w3.org/2000/svg"><g color="#000"><path fill="#fff" d="M0 5.002h10v5H0zM17 .002h10v5H17z"/><path d="M17 13.002h10v5H17z"/></g><path d="M9.5 7.502h2l4-5h2" fill="none" stroke="#fff" stroke-width="1.5"/></svg>
|
After Width: | Height: | Size: 252 B |
Before Width: | Height: | Size: 386 B |
1
packages/node_modules/@node-red/editor-client/src/images/deploy-flows.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="32" height="32" xmlns="http://www.w3.org/2000/svg"><path color="#000" fill="#8c101c" d="M0 .002h32v32H0z"/><g color="#000"><path fill="#fff" d="M2 13.002h10v5H2zM19 8.002h10v5H19z"/><path d="M19 21.002h10v5H19z"/></g><path d="M11.5 15.502h2l4-5h2" fill="none" stroke="#fff" stroke-width="1.5"/></svg>
|
After Width: | Height: | Size: 312 B |
Before Width: | Height: | Size: 289 B |
1
packages/node_modules/@node-red/editor-client/src/images/deploy-full-o.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="27" height="18" xmlns="http://www.w3.org/2000/svg"><g fill="#fff" color="#000"><path d="M0 5h10v5H0zM17 0h10v5H17zM17 13h10v5H17z"/></g><path d="M9.5 7.5h2l4-5h2" fill="none" stroke="#fff" stroke-width="1.5"/></svg>
|
After Width: | Height: | Size: 227 B |
Before Width: | Height: | Size: 368 B |
1
packages/node_modules/@node-red/editor-client/src/images/deploy-full.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="32" height="32" xmlns="http://www.w3.org/2000/svg"><path color="#000" fill="#8c101c" d="M0 0h32v32H0z"/><g fill="#fff" color="#000"><path d="M2 13h10v5H2zM19 8h10v5H19zM19 21h10v5H19z"/></g><path d="M11.5 15.5h2l4-5h2" fill="none" stroke="#fff" stroke-width="1.5"/></svg>
|
After Width: | Height: | Size: 283 B |
Before Width: | Height: | Size: 290 B |
1
packages/node_modules/@node-red/editor-client/src/images/deploy-nodes-o.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="27" height="18" xmlns="http://www.w3.org/2000/svg"><path color="#000" d="M0 5.002h10v5H0zM17 13.002h10v5H17z"/><path d="M9.5 7.502h2l4-5h2" fill="none" stroke="#000" stroke-width="1.5"/><path color="#000" fill="#fff" d="M17 .002h10v5H17z"/></svg>
|
After Width: | Height: | Size: 258 B |
Before Width: | Height: | Size: 392 B |
1
packages/node_modules/@node-red/editor-client/src/images/deploy-nodes.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="32" height="32" xmlns="http://www.w3.org/2000/svg"><path color="#000" fill="#8c101c" d="M0 .002h32v32H0z"/><path color="#000" d="M2 13.002h10v5H2zM19 21.002h10v5H19z"/><path d="M11.5 15.502h2l4-5h2" fill="none" stroke="#000" stroke-width="1.5"/><path color="#000" fill="#fff" d="M19 8.002h10v5H19z"/></svg>
|
After Width: | Height: | Size: 318 B |
Before Width: | Height: | Size: 1015 B |
1
packages/node_modules/@node-red/editor-client/src/images/deploy-reload.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="32" height="32" xmlns="http://www.w3.org/2000/svg"><g color="#000"><path fill="#8c101c" d="M0 .006h32v32H0z"/><path d="M11.81 25.429a10.02 10.02 0 0 0 4.19.914c5.562 0 10.107-4.545 10.107-10.106S21.562 6.131 16 6.131 5.895 10.676 5.895 16.237h3.368c0-3.74 2.997-6.737 6.738-6.737s6.737 2.996 6.737 6.737-2.996 6.738-6.737 6.738a6.775 6.775 0 0 1-2.533-.486l1.43-3.48-6.947 1.317 2.13 8.485z" fill="#fff" style="isolation:auto;mix-blend-mode:normal;text-decoration-color:#000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-transform:none;white-space:normal"/></g></svg>
|
After Width: | Height: | Size: 606 B |
Before Width: | Height: | Size: 393 B |
1
packages/node_modules/@node-red/editor-client/src/images/icons/arrow-in.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="40" height="60" viewBox="0, 0, 40, 60" xmlns="http://www.w3.org/2000/svg"><path d="M18 5v12H7v26h11v12l14-25z" fill="#fff"/></svg>
|
After Width: | Height: | Size: 143 B |
Before Width: | Height: | Size: 386 B |
Before Width: | Height: | Size: 386 B |
Before Width: | Height: | Size: 1019 B |
1
packages/node_modules/@node-red/editor-client/src/images/node-red.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="46.994" height="18.006" xmlns="http://www.w3.org/2000/svg"><g stroke="#d6d6d6"><g fill="#9e3131" stroke-linejoin="round" stroke-width="3.847" transform="matrix(.25848 0 0 .2614 -63.87 -108.483)"><rect x="249.04" y="435.92" width="50.294" height="22.953" ry="6.608"/><rect x="345.63" y="416.93" width="50.294" height="22.953" ry="6.608"/><rect x="376.71" y="459.01" width="50.294" height="22.953" ry="6.608"/></g><path d="M301.04 447.43c24.406.184 7.107-18.84 42.708-19.03M374.82 470.48c-46.966.538-28.989-22.664-73.619-22.944" fill="none" stroke-width="5.771" transform="matrix(.25848 0 0 .2614 -63.87 -108.483)"/></g></svg>
|
After Width: | Height: | Size: 636 B |
Before Width: | Height: | Size: 600 B |
Before Width: | Height: | Size: 410 B |
1
packages/node_modules/@node-red/editor-client/src/images/subflow_tab.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="40" height="40" viewBox="0, 0, 40, 40" xmlns="http://www.w3.org/2000/svg"><path d="M25 16h7c.58 0 1-.42 1-1v-2c0-.58-.42-1-1-1h-7c-.58 0-1 .42-1 1v2c0 .58.42 1 1 1zM8 28h7c.58 0 1-.42 1-1v-2c0-.58-.42-1-1-1H8c-.58 0-1 .42-1 1v2c0 .58.42 1 1 1zm-.416 11C5.624 39 4 37.375 4 35.416V4.582C4 2.622 5.625 1 7.584 1h24.832C34.376 1 36 2.623 36 4.582v30.834C36 37.376 34.375 39 32.416 39zM32 27H19c0 2.19-1.81 4-4 4H7v4.416c0 .35.235.584.584.584h24.832c.35 0 .584-.235.584-.584v-8.417zm1-2v-6h-8c-2.19 0-4-1.81-4-4h-1c-4.333-.002-8.667.004-13 0v6h8c2.19 0 4 1.81 4 4h13zm0-16V4.582c0-.35-.235-.582-.584-.582H7.584C7.234 4 7 4.233 7 4.582v8.417c4.333.002 8.667.001 13 .001h1c0-2.19 1.81-4 4-4z" color="#000" fill="#333"/></svg>
|
After Width: | Height: | Size: 732 B |
Before Width: | Height: | Size: 638 B |
1
packages/node_modules/@node-red/editor-client/src/images/typedInput/09.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="26" height="36" viewBox="0, 0, 26, 36" xmlns="http://www.w3.org/2000/svg"><path d="M14.16 27.38l1.555-.144c.132.731.383 1.261.755 1.591.371.33.848.494 1.429.494.497 0 .931-.114 1.303-.341.377-.228.686-.53.926-.908.24-.383.44-.899.602-1.546a8.122 8.122 0 0 0 .233-2.3 3.732 3.732 0 0 1-1.33 1.258 3.605 3.605 0 0 1-1.815.476c-1.09 0-2.013-.395-2.768-1.186s-1.133-1.834-1.133-3.128c0-1.336.393-2.411 1.178-3.226.79-.815 1.78-1.223 2.966-1.223.856 0 1.638.231 2.345.692.713.462 1.253 1.12 1.618 1.978.372.85.557 2.085.557 3.702 0 1.684-.182 3.026-.548 4.027-.365.994-.91 1.752-1.636 2.274-.719.52-1.563.781-2.534.781-1.03 0-1.872-.284-2.525-.853-.654-.576-1.046-1.381-1.178-2.418zm6.624-5.815c0-.928-.249-1.666-.746-2.21-.492-.546-1.085-.819-1.78-.819-.719 0-1.345.294-1.878.881s-.8 1.348-.8 2.283c0 .839.252 1.522.755 2.05.51.52 1.135.781 1.878.781.75 0 1.363-.26 1.843-.782.485-.527.728-1.255.728-2.184zM4.858 10.466c0-1.558.158-2.81.476-3.757.324-.952.8-1.686 1.429-2.201.635-.516 1.432-.773 2.39-.773.708 0 1.328.143 1.861.431.533.282.974.692 1.321 1.231.348.534.62 1.187.818 1.96.198.767.297 1.803.297 3.11 0 1.545-.16 2.794-.477 3.747-.317.947-.794 1.68-1.429 2.202-.629.515-1.426.773-2.39.773-1.27 0-2.268-.456-2.993-1.366-.869-1.097-1.303-2.882-1.303-5.357zm1.662 0c0 2.163.252 3.604.755 4.323.51.713 1.136 1.07 1.879 1.07.743 0 1.366-.36 1.87-1.079.508-.719.763-2.157.763-4.314 0-2.169-.255-3.61-.764-4.323-.503-.713-1.132-1.07-1.887-1.07-.743 0-1.336.315-1.78.944-.557.803-.836 2.286-.836 4.45z" fill="#444"/></svg>
|
After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 546 B |
1
packages/node_modules/@node-red/editor-client/src/images/typedInput/az.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="26" height="36" viewBox="0, 0, 26, 36" xmlns="http://www.w3.org/2000/svg"><path d="M13.27 29.15l6.733-8.143h-6.235V19.3h8.8v1.559l-6.69 8.09h6.892v1.707h-9.5zm4.909-10.125zM6.577 12.58q0 .827.604 1.304.605.478 1.432.478 1.007 0 1.95-.467 1.59-.774 1.59-2.534V9.824q-.349.222-.9.37-.552.15-1.082.213l-1.155.148q-1.04.138-1.56.435-.88.498-.88 1.59zM11.2 8.721q.657-.085.88-.551.127-.255.127-.732 0-.975-.7-1.41-.689-.445-1.983-.445-1.495 0-2.12.805-.35.446-.456 1.326H5.167q.053-2.1 1.357-2.916 1.315-.827 3.043-.827 2.004 0 3.255.763 1.24.764 1.24 2.375v6.542q0 .297.117.477.127.18.52.18.127 0 .286-.01.159-.021.34-.053v1.41q-.446.127-.68.16-.233.031-.636.031-.986 0-1.43-.7-.234-.37-.33-1.05-.583.764-1.675 1.326t-2.407.562q-1.58 0-2.587-.954-.996-.965-.996-2.407 0-1.58.986-2.45.986-.869 2.587-1.07zm-1.58-4.75z" fill="#444"/></svg>
|
After Width: | Height: | Size: 846 B |
Before Width: | Height: | Size: 638 B |
1
packages/node_modules/@node-red/editor-client/src/images/typedInput/bin.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="26" height="36" viewBox="0, 0, 26, 36" xmlns="http://www.w3.org/2000/svg"><path d="M18.8 33.9c3.328 0 4.776-2.603 4.776-7.066s-1.448-7.066-4.776-7.066-4.776 2.603-4.776 7.066S15.473 33.9 18.8 33.9zm0-1.429c-2.192 0-3.073-1.781-3.073-4.522v-2.23c0-2.741.88-4.523 3.073-4.523s3.073 1.782 3.073 4.522v2.231c0 2.74-.88 4.522-3.073 4.522zm-6.306 1.194v-1.429H8.892V20.002H6.328l-3.621 3.386.959 1.038 3.445-3.21h.137v11.02H3.333v1.429zm11.2-17.7v-1.429h-3.602V2.302h-2.564l-3.621 3.386.959 1.038 3.445-3.21h.137v11.02h-3.915v1.429zM7.5 16.2c3.327 0 4.776-2.603 4.776-7.066S10.828 2.068 7.5 2.068 2.725 4.67 2.725 9.134 4.173 16.2 7.5 16.2zm0-1.429c-2.193 0-3.074-1.781-3.074-4.522V8.02c0-2.741.881-4.523 3.074-4.523s3.073 1.782 3.073 4.522v2.231c0 2.74-.881 4.522-3.073 4.522z" fill="#444"/></svg>
|
After Width: | Height: | Size: 805 B |
Before Width: | Height: | Size: 646 B |
1
packages/node_modules/@node-red/editor-client/src/images/typedInput/bool.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="26" height="36" viewBox="0, 0, 26, 36" xmlns="http://www.w3.org/2000/svg"><path d="M9.96 21.98a5 5 0 1 1 6.11-7.917zm3.035-13.973c-5.512 0-10 4.488-10 10s4.488 9.998 10 9.998 10-4.486 10-9.998-4.488-10-10-10zm0 1.816c4.53 0 8.182 3.655 8.182 8.184s-3.652 8.182-8.182 8.182-8.181-3.653-8.181-8.182 3.652-8.184 8.181-8.184z" color="#000" fill="#444"/></svg>
|
After Width: | Height: | Size: 368 B |
Before Width: | Height: | Size: 809 B |
1
packages/node_modules/@node-red/editor-client/src/images/typedInput/env.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="26" height="36" viewBox="0, 0, 26, 36" xmlns="http://www.w3.org/2000/svg"><path d="M14.33 27.19q2.916-.136 4.024-2.131.58-1.024.58-2.37 0-2.132-1.569-3.24-.904-.648-3.035-1.228zM8.55 10.736q0 1.688 1.108 2.643 1.125.955 3.018 1.33V6.695q-2.234.085-3.189 1.364-.937 1.279-.937 2.677zm-3.07.205q0-2.592 1.893-4.672 1.91-2.08 5.337-2.115V1.887h1.62V4.12q3.393.239 5.2 2.012 1.825 1.757 1.91 4.655h-2.984q-.119-1.296-.699-2.233-1.074-1.723-3.427-1.808v8.287q3.956 1.108 5.371 2.08 2.302 1.603 2.302 4.74 0 4.536-2.95 6.446-1.637 1.057-4.723 1.398v3.308h-1.62v-3.308q-4.962-.324-6.735-3.513-.972-1.722-.972-4.655h3.018q.136 2.336.733 3.41 1.057 1.927 3.922 2.166v-9.293q-3.683-.699-5.44-2.336Q5.48 13.84 5.48 10.941z" fill="#444"/></svg>
|
After Width: | Height: | Size: 745 B |
Before Width: | Height: | Size: 563 B |
1
packages/node_modules/@node-red/editor-client/src/images/typedInput/expr.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="26" height="36" viewBox="0, 0, 26, 36" xmlns="http://www.w3.org/2000/svg"><g transform="translate(-337.103 -913.25) scale(1.2585)" fill="#444" stroke-width=".795"><circle cx="284.36" cy="733.68" r="1.5" color="#000" style="isolation:auto;mix-blend-mode:normal"/><circle cx="284.33" cy="740.74" r="1.5" color="#000" style="isolation:auto;mix-blend-mode:normal"/><path d="M276.18 727.78l4.396-1.565v18.515c-.711 2.606-2.922 4.394-5.812 5.812l-4.135 1.974-.559-1.192 3.353-1.639c1.459-.724 2.689-1.87 2.869-4.955z" fill-rule="evenodd"/></g></svg>
|
After Width: | Height: | Size: 556 B |
Before Width: | Height: | Size: 588 B |
1
packages/node_modules/@node-red/editor-client/src/images/typedInput/json.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="26" height="36" viewBox="0, 0, 26, 36" xmlns="http://www.w3.org/2000/svg"><path d="M15 5.225v-1.92h2.24q.608 0 1.216.288.608.256 1.12.8.48.512.8 1.312.32.768.32 1.792v5.824q0 .832.224 1.536t.608 1.216q.352.48.832.768.48.256.992.256v2.176q-.512 0-.992.256t-.832.736q-.384.48-.608 1.184t-.224 1.568v5.792q0 1.024-.32 1.792-.32.8-.8 1.312-.512.544-1.12.8-.608.288-1.216.288H15v-1.92h1.6q.48 0 .768-.256.288-.224.48-.64.16-.384.224-.896.064-.48.064-.96v-5.824q0-1.216.352-2.016.32-.8.768-1.28.448-.512.928-.736.448-.224.736-.256v-.096q-.288-.064-.736-.32-.48-.256-.928-.768t-.768-1.28q-.352-.8-.352-1.92V7.977q0-.512-.064-.992-.064-.512-.224-.896-.192-.384-.48-.608-.288-.256-.768-.256zm-3.648 0v-1.92h-2.24q-.608 0-1.216.288-.608.256-1.12.8-.48.512-.8 1.312-.32.768-.32 1.792v5.824q0 .832-.224 1.536t-.608 1.216q-.352.48-.832.768-.48.256-.992.256v2.176q.512 0 .992.256t.832.736q.384.48.608 1.184t.224 1.568v5.792q0 1.024.32 1.792.32.8.8 1.312.512.544 1.12.8.608.288 1.216.288h2.24v-1.92h-1.6q-.48 0-.768-.256-.288-.224-.48-.64-.16-.384-.224-.896-.064-.48-.064-.96v-5.824q0-1.216-.352-2.016-.32-.8-.768-1.28-.448-.512-.928-.736-.448-.224-.736-.256v-.096q.288-.064.736-.32.48-.256.928-.768t.768-1.28q.352-.8.352-1.92V7.977q0-.512.064-.992.064-.512.224-.896.192-.384.48-.608.288-.256.768-.256z" fill="#444"/></svg>
|
After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 502 B |
1
packages/node_modules/@node-red/editor-client/src/images/typedInput/re.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="26" height="36" viewBox="0, 0, 26, 36" xmlns="http://www.w3.org/2000/svg"><path d="M2 19h5v5H2zm16.099-3.304v-5.659h-2.654v5.66l-5.309-2.004-.901 2.404L14.543 18l-3.255 4.557 2.254 1.553 3.255-4.808 3.455 4.808 2.054-1.553L19 18l5.46-1.903-1.002-2.404z" color="#000" fill="#444444"/></svg>
|
After Width: | Height: | Size: 302 B |
1
packages/node_modules/@node-red/editor-client/src/images/typedInput/target.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="26" height="36" viewBox="0, 0, 26, 36" xmlns="http://www.w3.org/2000/svg"><path d="M11 5v5.77a7.542 7.542 0 0 0-5.234 5.25L1 16c-1.432 1.397-1.232 2.722 0 4l4.75-.078a7.542 7.542 0 0 0 5.22 5.297L11 31c1.316 1.303 2.649 1.363 4 0l.009-5.775A7.542 7.542 0 0 0 20.228 20H25c1.261-1.294 1.404-2.623 0-4l-4.774-.01a7.542 7.542 0 0 0-5.23-5.22L15 5c-1.3-1.273-2.63-1.393-4 0zm2 7.499c3.05 0 5.5 2.45 5.5 5.5s-2.45 5.5-5.5 5.5-5.5-2.45-5.5-5.5 2.45-5.5 5.5-5.5z" color="#000" fill="#444"/></svg>
|
After Width: | Height: | Size: 502 B |
@@ -143,7 +143,7 @@ RED.comms = (function() {
|
||||
} else {
|
||||
var msg = RED._("notification.errors.lostConnectionReconnect",{time: connectCountdown})+' <a href="#">'+ RED._("notification.errors.lostConnectionTry")+'</a>';
|
||||
errornotification.update(msg,{silent:true});
|
||||
$(errornotification).find("a").click(function(e) {
|
||||
$(errornotification).find("a").on("click", function(e) {
|
||||
e.preventDefault();
|
||||
errornotification.update(RED._("notification.errors.lostConnection"),{silent:true});
|
||||
clearInterval(connectCountdownTimer);
|
||||
|
@@ -32,14 +32,19 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
function emit(evt,arg) {
|
||||
function emit() {
|
||||
var evt = arguments[0]
|
||||
var args = Array.prototype.slice.call(arguments,1);
|
||||
if (RED.events.DEBUG) {
|
||||
console.warn(evt,args);
|
||||
}
|
||||
if (handlers[evt]) {
|
||||
for (var i=0;i<handlers[evt].length;i++) {
|
||||
try {
|
||||
handlers[evt][i](arg);
|
||||
handlers[evt][i].apply(null, args);
|
||||
} catch(err) {
|
||||
console.log("RED.events.emit error: ["+evt+"] "+(err.toString()));
|
||||
console.log(err);
|
||||
console.warn("RED.events.emit error: ["+evt+"] "+(err.toString()));
|
||||
console.warn(err);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -14,60 +14,110 @@
|
||||
* limitations under the License.
|
||||
**/
|
||||
RED.history = (function() {
|
||||
var undo_history = [];
|
||||
var undoHistory = [];
|
||||
var redoHistory = [];
|
||||
|
||||
function undoEvent(ev) {
|
||||
var i;
|
||||
var len;
|
||||
var node;
|
||||
var group;
|
||||
var subflow;
|
||||
var modifiedTabs = {};
|
||||
var inverseEv;
|
||||
if (ev) {
|
||||
if (ev.t == 'multi') {
|
||||
inverseEv = {
|
||||
t: 'multi',
|
||||
events: []
|
||||
};
|
||||
len = ev.events.length;
|
||||
for (i=len-1;i>=0;i--) {
|
||||
undoEvent(ev.events[i]);
|
||||
var r = undoEvent(ev.events[i]);
|
||||
inverseEv.events.push(r);
|
||||
}
|
||||
} else if (ev.t == 'replace') {
|
||||
inverseEv = {
|
||||
t: 'replace',
|
||||
config: RED.nodes.createCompleteNodeSet(),
|
||||
changed: {},
|
||||
rev: RED.nodes.version()
|
||||
};
|
||||
RED.nodes.clear();
|
||||
var imported = RED.nodes.import(ev.config);
|
||||
imported[0].forEach(function(n) {
|
||||
if (ev.changed[n.id]) {
|
||||
n.changed = true;
|
||||
inverseEv.changed[n.id] = true;
|
||||
}
|
||||
})
|
||||
|
||||
RED.nodes.version(ev.rev);
|
||||
} else if (ev.t == 'add') {
|
||||
inverseEv = {
|
||||
t: "delete",
|
||||
};
|
||||
if (ev.nodes) {
|
||||
inverseEv.nodes = [];
|
||||
for (i=0;i<ev.nodes.length;i++) {
|
||||
node = RED.nodes.node(ev.nodes[i]);
|
||||
if (node.z) {
|
||||
modifiedTabs[node.z] = true;
|
||||
}
|
||||
inverseEv.nodes.push(node);
|
||||
RED.nodes.remove(ev.nodes[i]);
|
||||
if (node.g) {
|
||||
var group = RED.nodes.group(node.g);
|
||||
var index = group.nodes.indexOf(node);
|
||||
if (index !== -1) {
|
||||
group.nodes.splice(index,1);
|
||||
RED.group.markDirty(group);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (ev.links) {
|
||||
inverseEv.links = [];
|
||||
for (i=0;i<ev.links.length;i++) {
|
||||
inverseEv.links.push(ev.links[i]);
|
||||
RED.nodes.removeLink(ev.links[i]);
|
||||
}
|
||||
}
|
||||
if (ev.groups) {
|
||||
inverseEv.groups = [];
|
||||
for (i = ev.groups.length - 1;i>=0;i--) {
|
||||
group = ev.groups[i];
|
||||
modifiedTabs[group.z] = true;
|
||||
// The order of groups is important
|
||||
// - to invert the action, the order is reversed
|
||||
inverseEv.groups.unshift(group);
|
||||
RED.nodes.removeGroup(group);
|
||||
}
|
||||
}
|
||||
if (ev.workspaces) {
|
||||
inverseEv.workspaces = [];
|
||||
for (i=0;i<ev.workspaces.length;i++) {
|
||||
var workspaceOrder = RED.nodes.getWorkspaceOrder();
|
||||
ev.workspaces[i]._index = workspaceOrder.indexOf(ev.workspaces[i].id);
|
||||
inverseEv.workspaces.push(ev.workspaces[i]);
|
||||
RED.nodes.removeWorkspace(ev.workspaces[i].id);
|
||||
RED.workspaces.remove(ev.workspaces[i]);
|
||||
}
|
||||
}
|
||||
if (ev.subflows) {
|
||||
inverseEv.subflows = [];
|
||||
for (i=0;i<ev.subflows.length;i++) {
|
||||
inverseEv.subflows.push(ev.subflows[i]);
|
||||
RED.nodes.removeSubflow(ev.subflows[i]);
|
||||
RED.workspaces.remove(ev.subflows[i]);
|
||||
}
|
||||
}
|
||||
if (ev.subflow) {
|
||||
inverseEv.subflow = {};
|
||||
if (ev.subflow.instances) {
|
||||
inverseEv.subflow.instances = [];
|
||||
ev.subflow.instances.forEach(function(n) {
|
||||
inverseEv.subflow.instances.push(n);
|
||||
var node = RED.nodes.node(n.id);
|
||||
if (node) {
|
||||
node.changed = n.changed;
|
||||
@@ -83,21 +133,30 @@ RED.history = (function() {
|
||||
}
|
||||
}
|
||||
if (ev.removedLinks) {
|
||||
inverseEv.createdLinks = [];
|
||||
for (i=0;i<ev.removedLinks.length;i++) {
|
||||
inverseEv.createdLinks.push(ev.removedLinks[i]);
|
||||
RED.nodes.addLink(ev.removedLinks[i]);
|
||||
}
|
||||
}
|
||||
|
||||
} else if (ev.t == "delete") {
|
||||
inverseEv = {
|
||||
t: "add"
|
||||
};
|
||||
if (ev.workspaces) {
|
||||
inverseEv.workspaces = [];
|
||||
for (i=0;i<ev.workspaces.length;i++) {
|
||||
inverseEv.workspaces.push(ev.workspaces[i]);
|
||||
RED.nodes.addWorkspace(ev.workspaces[i],ev.workspaces[i]._index);
|
||||
RED.workspaces.add(ev.workspaces[i],undefined,ev.workspaces[i]._index);
|
||||
delete ev.workspaces[i]._index;
|
||||
}
|
||||
}
|
||||
if (ev.subflows) {
|
||||
inverseEv.subflows = [];
|
||||
for (i=0;i<ev.subflows.length;i++) {
|
||||
inverseEv.subflows.push(ev.subflows[i]);
|
||||
RED.nodes.addSubflow(ev.subflows[i]);
|
||||
}
|
||||
}
|
||||
@@ -126,8 +185,11 @@ RED.history = (function() {
|
||||
}
|
||||
}
|
||||
if (ev.subflow) {
|
||||
inverseEv.subflow = {};
|
||||
if (ev.subflow.hasOwnProperty('instances')) {
|
||||
inverseEv.subflow.instances = [];
|
||||
ev.subflow.instances.forEach(function(n) {
|
||||
inverseEv.subflow.instances.push(n);
|
||||
var node = RED.nodes.node(n.id);
|
||||
if (node) {
|
||||
node.changed = n.changed;
|
||||
@@ -144,22 +206,60 @@ RED.history = (function() {
|
||||
RED.nodes.filterNodes({type:"subflow:"+subflow.id}).forEach(function(n) {
|
||||
n.inputs = subflow.in.length;
|
||||
n.outputs = subflow.out.length;
|
||||
while (n.outputs > n.ports.length) {
|
||||
n.ports.push(n.ports.length);
|
||||
}
|
||||
n.resize = true;
|
||||
n.dirty = true;
|
||||
});
|
||||
}
|
||||
if (ev.groups) {
|
||||
inverseEv.groups = [];
|
||||
var groupsToAdd = {};
|
||||
ev.groups.forEach(function(g) { groupsToAdd[g.id] = g; });
|
||||
for (i = ev.groups.length - 1;i>=0;i--) {
|
||||
RED.nodes.addGroup(ev.groups[i])
|
||||
modifiedTabs[ev.groups[i].z] = true;
|
||||
// The order of groups is important
|
||||
// - to invert the action, the order is reversed
|
||||
inverseEv.groups.unshift(ev.groups[i]);
|
||||
if (ev.groups[i].g) {
|
||||
if (!groupsToAdd[ev.groups[i].g]) {
|
||||
group = RED.nodes.group(ev.groups[i].g);
|
||||
} else {
|
||||
group = groupsToAdd[ev.groups[i].g];
|
||||
}
|
||||
if (group.nodes.indexOf(ev.groups[i]) === -1) {
|
||||
group.nodes.push(ev.groups[i]);
|
||||
}
|
||||
RED.group.markDirty(ev.groups[i])
|
||||
}
|
||||
}
|
||||
}
|
||||
if (ev.nodes) {
|
||||
inverseEv.nodes = [];
|
||||
for (i=0;i<ev.nodes.length;i++) {
|
||||
RED.nodes.add(ev.nodes[i]);
|
||||
modifiedTabs[ev.nodes[i].z] = true;
|
||||
inverseEv.nodes.push(ev.nodes[i].id);
|
||||
if (ev.nodes[i].g) {
|
||||
group = RED.nodes.group(ev.nodes[i].g);
|
||||
if (group.nodes.indexOf(ev.nodes[i]) === -1) {
|
||||
group.nodes.push(ev.nodes[i]);
|
||||
}
|
||||
RED.group.markDirty(group)
|
||||
}
|
||||
}
|
||||
}
|
||||
if (ev.links) {
|
||||
inverseEv.links = [];
|
||||
for (i=0;i<ev.links.length;i++) {
|
||||
RED.nodes.addLink(ev.links[i]);
|
||||
inverseEv.links.push(ev.links[i]);
|
||||
}
|
||||
}
|
||||
if (ev.createdLinks) {
|
||||
inverseEv.removedLinks = [];
|
||||
for (i=0;i<ev.createdLinks.length;i++) {
|
||||
inverseEv.removedLinks.push(ev.createdLinks[i]);
|
||||
RED.nodes.removeLink(ev.createdLinks[i]);
|
||||
}
|
||||
}
|
||||
if (ev.changes) {
|
||||
@@ -174,13 +274,22 @@ RED.history = (function() {
|
||||
}
|
||||
node.dirty = true;
|
||||
}
|
||||
RED.events.emit("nodes:change",node);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
if (subflow) {
|
||||
RED.events.emit("subflows:change", subflow);
|
||||
}
|
||||
} else if (ev.t == "move") {
|
||||
inverseEv = {
|
||||
t: 'move',
|
||||
nodes: []
|
||||
};
|
||||
for (i=0;i<ev.nodes.length;i++) {
|
||||
var n = ev.nodes[i];
|
||||
var rn = {n: n.n, ox: n.n.x, oy: n.n.y, dirty: true, moved: n.moved};
|
||||
inverseEv.nodes.push(rn);
|
||||
n.n.x = n.ox;
|
||||
n.n.y = n.oy;
|
||||
n.n.dirty = true;
|
||||
@@ -188,49 +297,90 @@ RED.history = (function() {
|
||||
}
|
||||
// A move could have caused a link splice
|
||||
if (ev.links) {
|
||||
inverseEv.removedLinks = [];
|
||||
for (i=0;i<ev.links.length;i++) {
|
||||
inverseEv.removedLinks.push(ev.links[i]);
|
||||
RED.nodes.removeLink(ev.links[i]);
|
||||
}
|
||||
}
|
||||
if (ev.removedLinks) {
|
||||
inverseEv.links = [];
|
||||
for (i=0;i<ev.removedLinks.length;i++) {
|
||||
inverseEv.links.push(ev.removedLinks[i]);
|
||||
RED.nodes.addLink(ev.removedLinks[i]);
|
||||
}
|
||||
}
|
||||
if (ev.addToGroup) {
|
||||
RED.group.removeFromGroup(ev.addToGroup,ev.nodes.map(function(n) { return n.n }),false);
|
||||
inverseEv.removeFromGroup = ev.addToGroup;
|
||||
} else if (ev.removeFromGroup) {
|
||||
RED.group.addToGroup(ev.removeFromGroup,ev.nodes.map(function(n) { return n.n }));
|
||||
inverseEv.addToGroup = ev.removeFromGroup;
|
||||
}
|
||||
} else if (ev.t == "edit") {
|
||||
inverseEv = {
|
||||
t: "edit",
|
||||
changes: {}
|
||||
};
|
||||
inverseEv.node = ev.node;
|
||||
for (i in ev.changes) {
|
||||
if (ev.changes.hasOwnProperty(i)) {
|
||||
inverseEv.changes[i] = ev.node[i];
|
||||
if (ev.node._def.defaults && ev.node._def.defaults[i] && ev.node._def.defaults[i].type) {
|
||||
// This is a config node property
|
||||
var currentConfigNode = RED.nodes.node(ev.node[i]);
|
||||
if (currentConfigNode) {
|
||||
currentConfigNode.users.splice(currentConfigNode.users.indexOf(ev.node),1);
|
||||
RED.events.emit("nodes:change",currentConfigNode);
|
||||
}
|
||||
var newConfigNode = RED.nodes.node(ev.changes[i]);
|
||||
if (newConfigNode) {
|
||||
newConfigNode.users.push(ev.node);
|
||||
RED.events.emit("nodes:change",newConfigNode);
|
||||
}
|
||||
}
|
||||
ev.node[i] = ev.changes[i];
|
||||
}
|
||||
}
|
||||
var eventType;
|
||||
switch(ev.node.type) {
|
||||
case 'tab': eventType = "flows"; break;
|
||||
case 'group': eventType = "groups"; break;
|
||||
case 'subflow': eventType = "subflows"; break;
|
||||
default: eventType = "nodes"; break;
|
||||
}
|
||||
eventType += ":change";
|
||||
RED.events.emit(eventType,ev.node);
|
||||
|
||||
|
||||
if (ev.node.type === 'tab' && ev.changes.hasOwnProperty('disabled')) {
|
||||
$("#red-ui-tab-"+(ev.node.id.replace(".","-"))).toggleClass('red-ui-workspace-disabled',!!ev.node.disabled);
|
||||
$("#red-ui-workspace").toggleClass("red-ui-workspace-disabled",!!ev.node.disabled);
|
||||
}
|
||||
if (ev.subflow) {
|
||||
inverseEv.subflow = {};
|
||||
if (ev.subflow.hasOwnProperty('inputCount')) {
|
||||
inverseEv.subflow.inputCount = ev.node.in.length;
|
||||
if (ev.node.in.length > ev.subflow.inputCount) {
|
||||
inverseEv.subflow.inputs = ev.node.in.slice(ev.subflow.inputCount);
|
||||
ev.node.in.splice(ev.subflow.inputCount);
|
||||
} else if (ev.subflow.inputs.length > 0) {
|
||||
ev.node.in = ev.node.in.concat(ev.subflow.inputs);
|
||||
}
|
||||
}
|
||||
if (ev.subflow.hasOwnProperty('outputCount')) {
|
||||
inverseEv.subflow.outputCount = ev.node.out.length;
|
||||
if (ev.node.out.length > ev.subflow.outputCount) {
|
||||
inverseEv.subflow.outputs = ev.node.out.slice(ev.subflow.outputCount);
|
||||
ev.node.out.splice(ev.subflow.outputCount);
|
||||
} else if (ev.subflow.outputs.length > 0) {
|
||||
ev.node.out = ev.node.out.concat(ev.subflow.outputs);
|
||||
}
|
||||
}
|
||||
if (ev.subflow.hasOwnProperty('instances')) {
|
||||
inverseEv.subflow.instances = [];
|
||||
ev.subflow.instances.forEach(function(n) {
|
||||
inverseEv.subflow.instances.push(n);
|
||||
var node = RED.nodes.node(n.id);
|
||||
if (node) {
|
||||
node.changed = n.changed;
|
||||
@@ -254,52 +404,185 @@ RED.history = (function() {
|
||||
var outputMap;
|
||||
if (ev.outputMap) {
|
||||
outputMap = {};
|
||||
inverseEv.outputMap = {};
|
||||
for (var port in ev.outputMap) {
|
||||
if (ev.outputMap.hasOwnProperty(port) && ev.outputMap[port] !== "-1") {
|
||||
outputMap[ev.outputMap[port]] = port;
|
||||
inverseEv.outputMap[ev.outputMap[port]] = port;
|
||||
}
|
||||
}
|
||||
}
|
||||
ev.node.__outputs = inverseEv.changes.outputs;
|
||||
RED.editor.updateNodeProperties(ev.node,outputMap);
|
||||
RED.editor.validateNode(ev.node);
|
||||
}
|
||||
if (ev.links) {
|
||||
inverseEv.createdLinks = [];
|
||||
for (i=0;i<ev.links.length;i++) {
|
||||
RED.nodes.addLink(ev.links[i]);
|
||||
inverseEv.createdLinks.push(ev.links[i]);
|
||||
}
|
||||
}
|
||||
if (ev.createdLinks) {
|
||||
inverseEv.links = [];
|
||||
for (i=0;i<ev.createdLinks.length;i++) {
|
||||
RED.nodes.removeLink(ev.createdLinks[i]);
|
||||
inverseEv.links.push(ev.createdLinks[i]);
|
||||
}
|
||||
}
|
||||
ev.node.dirty = true;
|
||||
ev.node.changed = ev.changed;
|
||||
} else if (ev.t == "createSubflow") {
|
||||
inverseEv = {
|
||||
t: "deleteSubflow",
|
||||
activeWorkspace: ev.activeWorkspace,
|
||||
dirty: RED.nodes.dirty()
|
||||
};
|
||||
if (ev.nodes) {
|
||||
RED.nodes.filterNodes({z:ev.subflow.subflow.id}).forEach(function(n) {
|
||||
inverseEv.movedNodes = [];
|
||||
var z = ev.activeWorkspace;
|
||||
var fullNodeList = RED.nodes.filterNodes({z:ev.subflow.subflow.id});
|
||||
fullNodeList = fullNodeList.concat(RED.nodes.groups(ev.subflow.subflow.id))
|
||||
fullNodeList.forEach(function(n) {
|
||||
n.x += ev.subflow.offsetX;
|
||||
n.y += ev.subflow.offsetY;
|
||||
n.z = ev.activeWorkspace;
|
||||
n.dirty = true;
|
||||
inverseEv.movedNodes.push(n.id);
|
||||
RED.nodes.moveNodeToTab(n, z);
|
||||
});
|
||||
inverseEv.subflows = [];
|
||||
for (i=0;i<ev.nodes.length;i++) {
|
||||
inverseEv.subflows.push(RED.nodes.node(ev.nodes[i]));
|
||||
RED.nodes.remove(ev.nodes[i]);
|
||||
}
|
||||
}
|
||||
if (ev.links) {
|
||||
inverseEv.links = [];
|
||||
for (i=0;i<ev.links.length;i++) {
|
||||
inverseEv.links.push(ev.links[i]);
|
||||
RED.nodes.removeLink(ev.links[i]);
|
||||
}
|
||||
}
|
||||
|
||||
inverseEv.subflow = ev.subflow;
|
||||
RED.nodes.removeSubflow(ev.subflow.subflow);
|
||||
RED.workspaces.remove(ev.subflow.subflow);
|
||||
|
||||
if (ev.removedLinks) {
|
||||
inverseEv.createdLinks = [];
|
||||
for (i=0;i<ev.removedLinks.length;i++) {
|
||||
inverseEv.createdLinks.push(ev.removedLinks[i]);
|
||||
RED.nodes.addLink(ev.removedLinks[i]);
|
||||
}
|
||||
}
|
||||
} else if (ev.t == "deleteSubflow") {
|
||||
inverseEv = {
|
||||
t: "createSubflow",
|
||||
activeWorkspace: ev.activeWorkspace,
|
||||
dirty: RED.nodes.dirty(),
|
||||
};
|
||||
if (ev.subflow) {
|
||||
RED.nodes.addSubflow(ev.subflow.subflow);
|
||||
inverseEv.subflow = ev.subflow;
|
||||
if (ev.subflow.subflow.g) {
|
||||
RED.group.addToGroup(RED.nodes.group(ev.subflow.subflow.g),ev.subflow.subflow);
|
||||
}
|
||||
}
|
||||
if (ev.subflows) {
|
||||
inverseEv.nodes = [];
|
||||
for (i=0;i<ev.subflows.length;i++) {
|
||||
RED.nodes.add(ev.subflows[i]);
|
||||
inverseEv.nodes.push(ev.subflows[i].id);
|
||||
}
|
||||
}
|
||||
if (ev.movedNodes) {
|
||||
ev.movedNodes.forEach(function(nid) {
|
||||
nn = RED.nodes.node(nid);
|
||||
if (!nn) {
|
||||
nn = RED.nodes.group(nid);
|
||||
}
|
||||
nn.x -= ev.subflow.offsetX;
|
||||
nn.y -= ev.subflow.offsetY;
|
||||
nn.dirty = true;
|
||||
RED.nodes.moveNodeToTab(nn, ev.subflow.subflow.id);
|
||||
});
|
||||
}
|
||||
if (ev.links) {
|
||||
inverseEv.links = [];
|
||||
for (i=0;i<ev.links.length;i++) {
|
||||
inverseEv.links.push(ev.links[i]);
|
||||
RED.nodes.addLink(ev.links[i]);
|
||||
}
|
||||
}
|
||||
if (ev.createdLinks) {
|
||||
inverseEv.removedLinks = [];
|
||||
for (i=0;i<ev.createdLinks.length;i++) {
|
||||
inverseEv.removedLinks.push(ev.createdLinks[i]);
|
||||
RED.nodes.removeLink(ev.createdLinks[i]);
|
||||
}
|
||||
}
|
||||
} else if (ev.t == "reorder") {
|
||||
inverseEv = {
|
||||
t: 'reorder',
|
||||
order: RED.nodes.getWorkspaceOrder()
|
||||
};
|
||||
if (ev.order) {
|
||||
RED.workspaces.order(ev.order);
|
||||
}
|
||||
} else if (ev.t == "createGroup") {
|
||||
inverseEv = {
|
||||
t: "ungroup",
|
||||
dirty: RED.nodes.dirty(),
|
||||
groups: []
|
||||
}
|
||||
if (ev.groups) {
|
||||
for (i=0;i<ev.groups.length;i++) {
|
||||
inverseEv.groups.push(ev.groups[i]);
|
||||
RED.group.ungroup(ev.groups[i]);
|
||||
}
|
||||
}
|
||||
} else if (ev.t == "ungroup") {
|
||||
inverseEv = {
|
||||
t: "createGroup",
|
||||
dirty: RED.nodes.dirty(),
|
||||
groups: []
|
||||
}
|
||||
if (ev.groups) {
|
||||
for (i=0;i<ev.groups.length;i++) {
|
||||
inverseEv.groups.push(ev.groups[i]);
|
||||
var nodes = ev.groups[i].nodes.slice();
|
||||
ev.groups[i].nodes = [];
|
||||
RED.nodes.addGroup(ev.groups[i]);
|
||||
RED.group.addToGroup(ev.groups[i],nodes);
|
||||
}
|
||||
}
|
||||
} else if (ev.t == "addToGroup") {
|
||||
inverseEv = {
|
||||
t: "removeFromGroup",
|
||||
dirty: RED.nodes.dirty(),
|
||||
group: ev.group,
|
||||
nodes: ev.nodes,
|
||||
reparent: ev.reparent
|
||||
}
|
||||
if (ev.nodes) {
|
||||
RED.group.removeFromGroup(ev.group,ev.nodes,(ev.hasOwnProperty('reparent')&&ev.hasOwnProperty('reparent')!==undefined)?ev.reparent:true);
|
||||
}
|
||||
} else if (ev.t == "removeFromGroup") {
|
||||
inverseEv = {
|
||||
t: "addToGroup",
|
||||
dirty: RED.nodes.dirty(),
|
||||
group: ev.group,
|
||||
nodes: ev.nodes,
|
||||
reparent: ev.reparent
|
||||
}
|
||||
if (ev.nodes) {
|
||||
RED.group.addToGroup(ev.group,ev.nodes);
|
||||
}
|
||||
}
|
||||
|
||||
if(ev.callback && typeof ev.callback === 'function') {
|
||||
inverseEv.callback = ev.callback;
|
||||
ev.callback(ev);
|
||||
}
|
||||
|
||||
Object.keys(modifiedTabs).forEach(function(id) {
|
||||
@@ -310,12 +593,13 @@ RED.history = (function() {
|
||||
});
|
||||
|
||||
RED.nodes.dirty(ev.dirty);
|
||||
RED.view.updateActive();
|
||||
RED.view.select(null);
|
||||
RED.view.redraw(true);
|
||||
RED.palette.refresh();
|
||||
RED.workspaces.refresh();
|
||||
RED.sidebar.config.refresh();
|
||||
RED.subflow.refresh();
|
||||
|
||||
return inverseEv;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -323,28 +607,45 @@ RED.history = (function() {
|
||||
return {
|
||||
//TODO: this function is a placeholder until there is a 'save' event that can be listened to
|
||||
markAllDirty: function() {
|
||||
for (var i=0;i<undo_history.length;i++) {
|
||||
undo_history[i].dirty = true;
|
||||
for (var i=0;i<undoHistory.length;i++) {
|
||||
undoHistory[i].dirty = true;
|
||||
}
|
||||
},
|
||||
list: function() {
|
||||
return undo_history
|
||||
return undoHistory;
|
||||
},
|
||||
listRedo: function() {
|
||||
return redoHistory;
|
||||
},
|
||||
depth: function() {
|
||||
return undo_history.length;
|
||||
return undoHistory.length;
|
||||
},
|
||||
push: function(ev) {
|
||||
undo_history.push(ev);
|
||||
undoHistory.push(ev);
|
||||
redoHistory = [];
|
||||
},
|
||||
pop: function() {
|
||||
var ev = undo_history.pop();
|
||||
undoEvent(ev);
|
||||
var ev = undoHistory.pop();
|
||||
var rev = undoEvent(ev);
|
||||
if (rev) {
|
||||
redoHistory.push(rev);
|
||||
}
|
||||
},
|
||||
peek: function() {
|
||||
return undo_history[undo_history.length-1];
|
||||
return undoHistory[undoHistory.length-1];
|
||||
},
|
||||
clear: function() {
|
||||
undo_history = [];
|
||||
undoHistory = [];
|
||||
redoHistory = [];
|
||||
},
|
||||
redo: function() {
|
||||
var ev = redoHistory.pop();
|
||||
if (ev) {
|
||||
var uev = undoEvent(ev);
|
||||
if (uev) {
|
||||
undoHistory.push(uev);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -21,7 +21,8 @@ RED.i18n = (function() {
|
||||
return {
|
||||
init: function(options, done) {
|
||||
apiRootUrl = options.apiRootUrl||"";
|
||||
i18n.init({
|
||||
var preferredLanguage = localStorage.getItem("editor-language");
|
||||
var opts = {
|
||||
resGetPath: apiRootUrl+'locales/__ns__?lng=__lng__',
|
||||
dynamicLoad: false,
|
||||
load:'current',
|
||||
@@ -32,7 +33,11 @@ RED.i18n = (function() {
|
||||
fallbackLng: ['en-US'],
|
||||
useCookie: false,
|
||||
returnObjectTrees: true
|
||||
},function() {
|
||||
};
|
||||
if (preferredLanguage) {
|
||||
opts.lng = preferredLanguage;
|
||||
}
|
||||
i18n.init(opts,function() {
|
||||
done();
|
||||
});
|
||||
RED["_"] = function() {
|
||||
@@ -45,8 +50,21 @@ RED.i18n = (function() {
|
||||
}
|
||||
|
||||
},
|
||||
lang: function() {
|
||||
// Gets the active message catalog language. This is based on what
|
||||
// locale the editor is using and what languages are available.
|
||||
//
|
||||
var preferredLangs = i18n.functions.toLanguages(localStorage.getItem("editor-language")||i18n.detectLanguage());
|
||||
var knownLangs = RED.settings.theme("languages")||["en-US"];
|
||||
for (var i=0;i<preferredLangs.length;i++) {
|
||||
if (knownLangs.indexOf(preferredLangs[i]) > -1) {
|
||||
return preferredLangs[i]
|
||||
}
|
||||
}
|
||||
return 'end-US'
|
||||
},
|
||||
loadNodeCatalog: function(namespace,done) {
|
||||
var languageList = i18n.functions.toLanguages(i18n.detectLanguage());
|
||||
var languageList = i18n.functions.toLanguages(localStorage.getItem("editor-language")||i18n.detectLanguage());
|
||||
var toLoad = languageList.length;
|
||||
languageList.forEach(function(lang) {
|
||||
$.ajax({
|
||||
@@ -68,7 +86,7 @@ RED.i18n = (function() {
|
||||
},
|
||||
|
||||
loadNodeCatalogs: function(done) {
|
||||
var languageList = i18n.functions.toLanguages(i18n.detectLanguage());
|
||||
var languageList = i18n.functions.toLanguages(localStorage.getItem("editor-language")||i18n.detectLanguage());
|
||||
var toLoad = languageList.length;
|
||||
|
||||
languageList.forEach(function(lang) {
|
||||
|
@@ -1,13 +1,16 @@
|
||||
{
|
||||
"*": {
|
||||
"ctrl-shift-p":"core:manage-palette",
|
||||
"alt-shift-p":"core:manage-palette",
|
||||
"ctrl-f": "core:search",
|
||||
"ctrl-shift-f": "core:list-flows",
|
||||
"ctrl-=": "core:zoom-in",
|
||||
"ctrl--": "core:zoom-out",
|
||||
"ctrl-0": "core:zoom-reset",
|
||||
"ctrl-enter": "core:confirm-edit-tray",
|
||||
"ctrl-escape": "core:cancel-edit-tray",
|
||||
"ctrl-d": "core:deploy-flows",
|
||||
"ctrl-g i": "core:show-info-tab",
|
||||
"ctrl-g h": "core:show-help-tab",
|
||||
"ctrl-g d": "core:show-debug-tab",
|
||||
"ctrl-g c": "core:show-config-tab",
|
||||
"ctrl-g x": "core:show-context-tab",
|
||||
@@ -16,19 +19,22 @@
|
||||
"ctrl-space": "core:toggle-sidebar",
|
||||
"ctrl-p": "core:toggle-palette",
|
||||
"ctrl-,": "core:show-user-settings",
|
||||
"ctrl-alt-l": "core:clear-debug-messages",
|
||||
"ctrl-alt-r": "core:show-remote-diff",
|
||||
"ctrl-alt-n": "core:new-project",
|
||||
"ctrl-alt-o": "core:open-project",
|
||||
"ctrl-g v": "core:show-version-control-tab",
|
||||
"ctrl-shift-l": "core:show-event-log"
|
||||
"ctrl-shift-l": "core:show-event-log",
|
||||
"ctrl-shift-p":"core:show-action-list"
|
||||
},
|
||||
"sidebar-node-config": {
|
||||
"red-ui-sidebar-node-config": {
|
||||
"backspace": "core:delete-config-selection",
|
||||
"delete": "core:delete-config-selection",
|
||||
"ctrl-a": "core:select-all-config-nodes",
|
||||
"ctrl-z": "core:undo"
|
||||
"ctrl-z": "core:undo",
|
||||
"ctrl-y": "core:redo"
|
||||
},
|
||||
"workspace": {
|
||||
"red-ui-workspace": {
|
||||
"backspace": "core:delete-selection",
|
||||
"delete": "core:delete-selection",
|
||||
"enter": "core:edit-selected-node",
|
||||
@@ -36,8 +42,17 @@
|
||||
"ctrl-x": "core:cut-selection-to-internal-clipboard",
|
||||
"ctrl-v": "core:paste-from-internal-clipboard",
|
||||
"ctrl-z": "core:undo",
|
||||
"ctrl-y": "core:redo",
|
||||
"ctrl-a": "core:select-all-nodes",
|
||||
"shift-?": "core:show-help",
|
||||
"w": "core:scroll-view-up",
|
||||
"d": "core:scroll-view-right",
|
||||
"s": "core:scroll-view-down",
|
||||
"a": "core:scroll-view-left",
|
||||
"shift-w": "core:step-view-up",
|
||||
"shift-d": "core:step-view-right",
|
||||
"shift-s": "core:step-view-down",
|
||||
"shift-a": "core:step-view-left",
|
||||
"up": "core:move-selection-up",
|
||||
"right": "core:move-selection-right",
|
||||
"down": "core:move-selection-down",
|
||||
@@ -47,6 +62,10 @@
|
||||
"shift-down": "core:step-selection-down",
|
||||
"shift-left": "core:step-selection-left",
|
||||
"ctrl-shift-j": "core:show-previous-tab",
|
||||
"ctrl-shift-k": "core:show-next-tab"
|
||||
"ctrl-shift-k": "core:show-next-tab",
|
||||
"ctrl-shift-g": "core:group-selection",
|
||||
"ctrl-shift-u": "core:ungroup-selection",
|
||||
"ctrl-shift-c": "core:copy-group-style",
|
||||
"ctrl-shift-v": "core:paste-group-style"
|
||||
}
|
||||
}
|
||||
|
@@ -17,6 +17,8 @@ RED.nodes = (function() {
|
||||
|
||||
var node_defs = {};
|
||||
var nodes = [];
|
||||
var nodeTabMap = {};
|
||||
|
||||
var configNodes = {};
|
||||
var links = [];
|
||||
var defaultWorkspace;
|
||||
@@ -25,13 +27,16 @@ RED.nodes = (function() {
|
||||
var subflows = {};
|
||||
var loadedFlowVersion = null;
|
||||
|
||||
var groups = {};
|
||||
var groupsByZ = {};
|
||||
|
||||
var initialLoad;
|
||||
|
||||
var dirty = false;
|
||||
|
||||
function setDirty(d) {
|
||||
dirty = d;
|
||||
RED.events.emit("nodes:change",{dirty:dirty});
|
||||
RED.events.emit("workspace:dirty",{dirty:dirty});
|
||||
}
|
||||
|
||||
var registry = (function() {
|
||||
@@ -191,18 +196,17 @@ RED.nodes = (function() {
|
||||
if (n.type.indexOf("subflow") !== 0) {
|
||||
n["_"] = n._def._;
|
||||
} else {
|
||||
var subflowId = n.type.substring(8);
|
||||
var sf = RED.nodes.subflow(subflowId);
|
||||
if (sf) {
|
||||
sf.instances.push(sf);
|
||||
}
|
||||
n["_"] = RED._;
|
||||
}
|
||||
if (n._def.category == "config") {
|
||||
configNodes[n.id] = n;
|
||||
} else {
|
||||
n.ports = [];
|
||||
if (n.wires && (n.wires.length > n.outputs)) { n.outputs = n.wires.length; }
|
||||
if (n.outputs) {
|
||||
for (var i=0;i<n.outputs;i++) {
|
||||
n.ports.push(i);
|
||||
}
|
||||
}
|
||||
n.dirty = true;
|
||||
updateConfigNodeUsers(n);
|
||||
if (n._def.category == "subflows" && typeof n.i === "undefined") {
|
||||
@@ -213,11 +217,17 @@ RED.nodes = (function() {
|
||||
n.i = nextId+1;
|
||||
}
|
||||
nodes.push(n);
|
||||
if (nodeTabMap[n.z]) {
|
||||
nodeTabMap[n.z][n.id] = n;
|
||||
} else {
|
||||
console.warn("Node added to unknown tab/subflow:",n);
|
||||
}
|
||||
}
|
||||
RED.events.emit('nodes:add',n);
|
||||
}
|
||||
function addLink(l) {
|
||||
links.push(l);
|
||||
RED.events.emit("links:add",l);
|
||||
}
|
||||
|
||||
function getNode(id) {
|
||||
@@ -246,8 +256,11 @@ RED.nodes = (function() {
|
||||
node = getNode(id);
|
||||
if (node) {
|
||||
nodes.splice(nodes.indexOf(node),1);
|
||||
if (nodeTabMap[node.z]) {
|
||||
delete nodeTabMap[node.z][node.id];
|
||||
}
|
||||
removedLinks = links.filter(function(l) { return (l.source === node) || (l.target === node); });
|
||||
removedLinks.forEach(function(l) {links.splice(links.indexOf(l), 1); });
|
||||
removedLinks.forEach(removeLink);
|
||||
var updatedConfigNode = false;
|
||||
for (var d in node._def.defaults) {
|
||||
if (node._def.defaults.hasOwnProperty(d)) {
|
||||
@@ -270,6 +283,15 @@ RED.nodes = (function() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (node.type.indexOf("subflow:") === 0) {
|
||||
var subflowId = node.type.substring(8);
|
||||
var sf = RED.nodes.subflow(subflowId);
|
||||
if (sf) {
|
||||
sf.instances.splice(sf.instances.indexOf(node),1);
|
||||
}
|
||||
}
|
||||
|
||||
if (updatedConfigNode) {
|
||||
RED.workspaces.refresh();
|
||||
}
|
||||
@@ -283,6 +305,9 @@ RED.nodes = (function() {
|
||||
RED.events.emit('nodes:remove',node);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (node && node._def.onremove) {
|
||||
// Deprecated: never documented but used by some early nodes
|
||||
console.log("Deprecated API warning: node type ",node.type," has an onremove function - should be oneditremove - please report");
|
||||
@@ -291,52 +316,105 @@ RED.nodes = (function() {
|
||||
return {links:removedLinks,nodes:removedNodes};
|
||||
}
|
||||
|
||||
function moveNodeToTab(node, z) {
|
||||
if (node.type === "group") {
|
||||
moveGroupToTab(node,z);
|
||||
return;
|
||||
}
|
||||
if (nodeTabMap[node.z]) {
|
||||
delete nodeTabMap[node.z][node.id];
|
||||
}
|
||||
if (!nodeTabMap[z]) {
|
||||
nodeTabMap[z] = {};
|
||||
}
|
||||
nodeTabMap[z][node.id] = node;
|
||||
node.z = z;
|
||||
RED.events.emit("nodes:change",node);
|
||||
}
|
||||
function moveGroupToTab(group, z) {
|
||||
var index = groupsByZ[group.z].indexOf(group);
|
||||
groupsByZ[group.z].splice(index,1);
|
||||
groupsByZ[z] = groupsByZ[z] || [];
|
||||
groupsByZ[z].push(group);
|
||||
group.z = z;
|
||||
RED.events.emit("groups:change",group);
|
||||
}
|
||||
|
||||
function removeLink(l) {
|
||||
var index = links.indexOf(l);
|
||||
if (index != -1) {
|
||||
links.splice(index,1);
|
||||
}
|
||||
RED.events.emit("links:remove",l);
|
||||
}
|
||||
|
||||
function addWorkspace(ws,targetIndex) {
|
||||
workspaces[ws.id] = ws;
|
||||
nodeTabMap[ws.id] = {};
|
||||
|
||||
ws._def = RED.nodes.getType('tab');
|
||||
if (targetIndex === undefined) {
|
||||
workspacesOrder.push(ws.id);
|
||||
} else {
|
||||
workspacesOrder.splice(targetIndex,0,ws.id);
|
||||
}
|
||||
RED.events.emit('flows:add',ws);
|
||||
if (targetIndex !== undefined) {
|
||||
RED.events.emit('flows:reorder',workspacesOrder)
|
||||
}
|
||||
}
|
||||
function getWorkspace(id) {
|
||||
return workspaces[id];
|
||||
}
|
||||
function removeWorkspace(id) {
|
||||
delete workspaces[id];
|
||||
workspacesOrder.splice(workspacesOrder.indexOf(id),1);
|
||||
|
||||
var ws = workspaces[id];
|
||||
var removedNodes = [];
|
||||
var removedLinks = [];
|
||||
var n;
|
||||
var node;
|
||||
for (n=0;n<nodes.length;n++) {
|
||||
node = nodes[n];
|
||||
if (node.z == id) {
|
||||
removedNodes.push(node);
|
||||
}
|
||||
}
|
||||
for(n in configNodes) {
|
||||
if (configNodes.hasOwnProperty(n)) {
|
||||
node = configNodes[n];
|
||||
var removedGroups = [];
|
||||
if (ws) {
|
||||
delete workspaces[id];
|
||||
delete nodeTabMap[id];
|
||||
workspacesOrder.splice(workspacesOrder.indexOf(id),1);
|
||||
var i;
|
||||
var node;
|
||||
for (i=0;i<nodes.length;i++) {
|
||||
node = nodes[i];
|
||||
if (node.z == id) {
|
||||
removedNodes.push(node);
|
||||
}
|
||||
}
|
||||
for(i in configNodes) {
|
||||
if (configNodes.hasOwnProperty(i)) {
|
||||
node = configNodes[i];
|
||||
if (node.z == id) {
|
||||
removedNodes.push(node);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (i=0;i<removedNodes.length;i++) {
|
||||
var result = removeNode(removedNodes[i].id);
|
||||
removedLinks = removedLinks.concat(result.links);
|
||||
}
|
||||
|
||||
// Must get 'removedGroups' in the right order.
|
||||
// - start with the top-most groups
|
||||
// - then recurse into them
|
||||
removedGroups = (groupsByZ[id] || []).filter(function(g) { return !g.g; });
|
||||
for (i=0;i<removedGroups.length;i++) {
|
||||
removedGroups[i].nodes.forEach(function(n) {
|
||||
if (n.type === "group") {
|
||||
removedGroups.push(n);
|
||||
}
|
||||
});
|
||||
}
|
||||
// Now remove them in the reverse order
|
||||
for (i=removedGroups.length-1; i>=0; i--) {
|
||||
removeGroup(removedGroups[i]);
|
||||
}
|
||||
RED.events.emit('flows:remove',ws);
|
||||
}
|
||||
for (n=0;n<removedNodes.length;n++) {
|
||||
var result = removeNode(removedNodes[n].id);
|
||||
removedLinks = removedLinks.concat(result.links);
|
||||
}
|
||||
return {nodes:removedNodes,links:removedLinks};
|
||||
return {nodes:removedNodes,links:removedLinks, groups: removedGroups};
|
||||
}
|
||||
|
||||
function addSubflow(sf, createNewIds) {
|
||||
@@ -357,43 +435,55 @@ RED.nodes = (function() {
|
||||
sf.name = subflowName;
|
||||
}
|
||||
subflows[sf.id] = sf;
|
||||
nodeTabMap[sf.id] = {};
|
||||
|
||||
RED.nodes.registerType("subflow:"+sf.id, {
|
||||
defaults:{
|
||||
name:{value:""},
|
||||
env:{value:[]}
|
||||
},
|
||||
icon: function() { return sf.icon||"subflow.png" },
|
||||
icon: function() { return sf.icon||"subflow.svg" },
|
||||
category: sf.category || "subflows",
|
||||
inputs: sf.in.length,
|
||||
outputs: sf.out.length,
|
||||
color: "#da9",
|
||||
color: sf.color || "#DDAA99",
|
||||
label: function() { return this.name||RED.nodes.subflow(sf.id).name },
|
||||
labelStyle: function() { return this.name?"node_label_italic":""; },
|
||||
labelStyle: function() { return this.name?"red-ui-flow-node-label-italic":""; },
|
||||
paletteLabel: function() { return RED.nodes.subflow(sf.id).name },
|
||||
inputLabels: function(i) { return sf.inputLabels?sf.inputLabels[i]:null },
|
||||
outputLabels: function(i) { return sf.outputLabels?sf.outputLabels[i]:null },
|
||||
oneditprepare: function() {
|
||||
RED.subflow.buildEditForm("subflow",this);
|
||||
RED.subflow.buildPropertiesForm(this);
|
||||
},
|
||||
oneditresize: function(size) {
|
||||
var rows = $("#dialog-form>div:not(.node-input-env-container-row)");
|
||||
// var rows = $(".dialog-form>div:not(.node-input-env-container-row)");
|
||||
var height = size.height;
|
||||
for (var i=0; i<rows.size(); i++) {
|
||||
height -= $(rows[i]).outerHeight(true);
|
||||
}
|
||||
var editorRow = $("#dialog-form>div.node-input-env-container-row");
|
||||
height -= (parseInt(editorRow.css("marginTop"))+parseInt(editorRow.css("marginBottom")));
|
||||
$("#node-input-env-container").editableList('height',height-80);
|
||||
// for (var i=0; i<rows.size(); i++) {
|
||||
// height -= $(rows[i]).outerHeight(true);
|
||||
// }
|
||||
// var editorRow = $("#dialog-form>div.node-input-env-container-row");
|
||||
// height -= (parseInt(editorRow.css("marginTop"))+parseInt(editorRow.css("marginBottom")));
|
||||
$("ol.red-ui-editor-subflow-env-list").editableList('height',height);
|
||||
},
|
||||
set:{
|
||||
module: "node-red"
|
||||
}
|
||||
});
|
||||
sf.instances = [];
|
||||
sf._def = RED.nodes.getType("subflow:"+sf.id);
|
||||
RED.events.emit("subflows:add",sf);
|
||||
}
|
||||
function getSubflow(id) {
|
||||
return subflows[id];
|
||||
}
|
||||
function removeSubflow(sf) {
|
||||
delete subflows[sf.id];
|
||||
registry.removeNodeType("subflow:"+sf.id);
|
||||
if (subflows[sf.id]) {
|
||||
delete subflows[sf.id];
|
||||
delete nodeTabMap[sf.id];
|
||||
registry.removeNodeType("subflow:"+sf.id);
|
||||
RED.events.emit("subflows:remove",sf);
|
||||
}
|
||||
}
|
||||
|
||||
function subflowContains(sfid,nodeid) {
|
||||
@@ -463,7 +553,12 @@ RED.nodes = (function() {
|
||||
node.id = n.id;
|
||||
node.type = n.type;
|
||||
node.z = n.z;
|
||||
|
||||
if (n.d === true) {
|
||||
node.d = true;
|
||||
}
|
||||
if (n.g) {
|
||||
node.g = n.g;
|
||||
}
|
||||
if (node.type == "unknown") {
|
||||
for (var p in n._orig) {
|
||||
if (n._orig.hasOwnProperty(p)) {
|
||||
@@ -476,19 +571,33 @@ RED.nodes = (function() {
|
||||
node[d] = n[d];
|
||||
}
|
||||
}
|
||||
if(exportCreds && n.credentials) {
|
||||
if (exportCreds) {
|
||||
var credentialSet = {};
|
||||
node.credentials = {};
|
||||
for (var cred in n._def.credentials) {
|
||||
if (n._def.credentials.hasOwnProperty(cred)) {
|
||||
if (n._def.credentials[cred].type == 'password') {
|
||||
if (/^subflow:/.test(node.type) && n.credentials) {
|
||||
// A subflow instance node can have arbitrary creds
|
||||
for (var sfCred in n.credentials) {
|
||||
if (n.credentials.hasOwnProperty(sfCred)) {
|
||||
if (!n.credentials._ ||
|
||||
n.credentials["has_"+cred] != n.credentials._["has_"+cred] ||
|
||||
(n.credentials["has_"+cred] && n.credentials[cred])) {
|
||||
n.credentials["has_"+sfCred] != n.credentials._["has_"+sfCred] ||
|
||||
(n.credentials["has_"+sfCred] && n.credentials[sfCred])) {
|
||||
credentialSet[sfCred] = n.credentials[sfCred];
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (n.credentials) {
|
||||
node.credentials = {};
|
||||
// All other nodes have a well-defined list of possible credentials
|
||||
for (var cred in n._def.credentials) {
|
||||
if (n._def.credentials.hasOwnProperty(cred)) {
|
||||
if (n._def.credentials[cred].type == 'password') {
|
||||
if (!n.credentials._ ||
|
||||
n.credentials["has_"+cred] != n.credentials._["has_"+cred] ||
|
||||
(n.credentials["has_"+cred] && n.credentials[cred])) {
|
||||
credentialSet[cred] = n.credentials[cred];
|
||||
}
|
||||
} else if (n.credentials[cred] != null && (!n.credentials._ || n.credentials[cred] != n.credentials._[cred])) {
|
||||
credentialSet[cred] = n.credentials[cred];
|
||||
}
|
||||
} else if (n.credentials[cred] != null && (!n.credentials._ || n.credentials[cred] != n.credentials._[cred])) {
|
||||
credentialSet[cred] = n.credentials[cred];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -497,6 +606,15 @@ RED.nodes = (function() {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (n.type === "group") {
|
||||
node.x = n.x;
|
||||
node.y = n.y;
|
||||
node.w = n.w;
|
||||
node.h = n.h;
|
||||
// In 1.1.0, we have seen an instance of this array containing `undefined`
|
||||
// Until we know how that can happen, add a filter here to remove them
|
||||
node.nodes = node.nodes.filter(function(n) { return !!n }).map(function(n) { return n.id });
|
||||
}
|
||||
if (n._def.category != "config") {
|
||||
node.x = n.x;
|
||||
node.y = n.y;
|
||||
@@ -539,7 +657,7 @@ RED.nodes = (function() {
|
||||
return node;
|
||||
}
|
||||
|
||||
function convertSubflow(n) {
|
||||
function convertSubflow(n, exportCreds) {
|
||||
var node = {};
|
||||
node.id = n.id;
|
||||
node.type = n.type;
|
||||
@@ -550,6 +668,25 @@ RED.nodes = (function() {
|
||||
node.out = [];
|
||||
node.env = n.env;
|
||||
|
||||
if (exportCreds) {
|
||||
var credentialSet = {};
|
||||
// A subflow node can have arbitrary creds
|
||||
for (var sfCred in n.credentials) {
|
||||
if (n.credentials.hasOwnProperty(sfCred)) {
|
||||
if (!n.credentials._ ||
|
||||
n.credentials["has_"+sfCred] != n.credentials._["has_"+sfCred] ||
|
||||
(n.credentials["has_"+sfCred] && n.credentials[sfCred])) {
|
||||
credentialSet[sfCred] = n.credentials[sfCred];
|
||||
}
|
||||
}
|
||||
}
|
||||
if (Object.keys(credentialSet).length > 0) {
|
||||
node.credentials = credentialSet;
|
||||
}
|
||||
}
|
||||
|
||||
node.color = n.color;
|
||||
|
||||
n.in.forEach(function(p) {
|
||||
var nIn = {x:p.x,y:p.y,wires:[]};
|
||||
var wires = links.filter(function(d) { return d.source === p });
|
||||
@@ -581,7 +718,7 @@ RED.nodes = (function() {
|
||||
node.outputLabels = n.outputLabels.slice();
|
||||
}
|
||||
if (n.icon) {
|
||||
if (n.icon !== "node-red/subflow.png") {
|
||||
if (n.icon !== "node-red/subflow.svg") {
|
||||
node.icon = n.icon;
|
||||
}
|
||||
}
|
||||
@@ -603,8 +740,18 @@ RED.nodes = (function() {
|
||||
/**
|
||||
* Converts the current node selection to an exportable JSON Object
|
||||
**/
|
||||
function createExportableNodeSet(set, exportedSubflows, exportedConfigNodes) {
|
||||
function createExportableNodeSet(set, exportedIds, exportedSubflows, exportedConfigNodes) {
|
||||
var nns = [];
|
||||
|
||||
exportedIds = exportedIds || {};
|
||||
set = set.filter(function(n) {
|
||||
if (exportedIds[n.id]) {
|
||||
return false;
|
||||
}
|
||||
exportedIds[n.id] = true;
|
||||
return true;
|
||||
})
|
||||
|
||||
exportedConfigNodes = exportedConfigNodes || {};
|
||||
exportedSubflows = exportedSubflows || {};
|
||||
for (var n=0;n<set.length;n++) {
|
||||
@@ -620,11 +767,11 @@ RED.nodes = (function() {
|
||||
subflowSet.push(n);
|
||||
}
|
||||
});
|
||||
var exportableSubflow = createExportableNodeSet(subflowSet, exportedSubflows, exportedConfigNodes);
|
||||
var exportableSubflow = createExportableNodeSet(subflowSet, exportedIds, exportedSubflows, exportedConfigNodes);
|
||||
nns = exportableSubflow.concat(nns);
|
||||
}
|
||||
}
|
||||
if (node.type != "subflow") {
|
||||
if (node.type !== "subflow") {
|
||||
var convertedNode = RED.nodes.convertNode(node);
|
||||
for (var d in node._def.defaults) {
|
||||
if (node._def.defaults[d].type && node[d] in configNodes) {
|
||||
@@ -641,6 +788,9 @@ RED.nodes = (function() {
|
||||
}
|
||||
}
|
||||
nns.push(convertedNode);
|
||||
if (node.type === "group") {
|
||||
nns = nns.concat(createExportableNodeSet(node.nodes, exportedIds, exportedSubflows, exportedConfigNodes));
|
||||
}
|
||||
} else {
|
||||
var convertedSubflow = convertSubflow(node);
|
||||
nns.push(convertedSubflow);
|
||||
@@ -663,7 +813,12 @@ RED.nodes = (function() {
|
||||
}
|
||||
for (i in subflows) {
|
||||
if (subflows.hasOwnProperty(i)) {
|
||||
nns.push(convertSubflow(subflows[i]));
|
||||
nns.push(convertSubflow(subflows[i], exportCredentials));
|
||||
}
|
||||
}
|
||||
for (i in groups) {
|
||||
if (groups.hasOwnProperty(i)) {
|
||||
nns.push(convertNode(groups[i]));
|
||||
}
|
||||
}
|
||||
for (i in configNodes) {
|
||||
@@ -766,6 +921,20 @@ RED.nodes = (function() {
|
||||
if (!$.isArray(newNodes)) {
|
||||
newNodes = [newNodes];
|
||||
}
|
||||
|
||||
// Scan for any duplicate nodes and remove them. This is a temporary
|
||||
// fix to help resolve corrupted flows caused by 0.20.0 where multiple
|
||||
// copies of the flow would get loaded at the same time.
|
||||
// If the user hit deploy they would have saved those duplicates.
|
||||
var seenIds = {};
|
||||
newNodes = newNodes.filter(function(n) {
|
||||
if (seenIds[n.id]) {
|
||||
return false;
|
||||
}
|
||||
seenIds[n.id] = true;
|
||||
return true;
|
||||
})
|
||||
|
||||
var isInitialLoad = false;
|
||||
if (!initialLoad) {
|
||||
isInitialLoad = true;
|
||||
@@ -778,6 +947,7 @@ RED.nodes = (function() {
|
||||
if (n.type != "workspace" &&
|
||||
n.type != "tab" &&
|
||||
n.type != "subflow" &&
|
||||
n.type != "group" &&
|
||||
!registry.getNodeType(n.type) &&
|
||||
n.type.substring(0,8) != "subflow:" &&
|
||||
unknownTypes.indexOf(n.type)==-1) {
|
||||
@@ -801,7 +971,7 @@ RED.nodes = (function() {
|
||||
var m = /^subflow:(.+)$/.exec(newNodes[i].type);
|
||||
if (m) {
|
||||
var subflowId = m[1];
|
||||
var parent = getSubflow(newNodes[i].z || activeWorkspace);
|
||||
var parent = getSubflow(activeWorkspace);
|
||||
if (parent) {
|
||||
var err;
|
||||
if (subflowId === parent.id) {
|
||||
@@ -823,10 +993,11 @@ RED.nodes = (function() {
|
||||
var workspace_map = {};
|
||||
var new_subflows = [];
|
||||
var subflow_map = {};
|
||||
var subflow_blacklist = {};
|
||||
var subflow_denylist = {};
|
||||
var node_map = {};
|
||||
var new_nodes = [];
|
||||
var new_links = [];
|
||||
var new_groups = [];
|
||||
var nid;
|
||||
var def;
|
||||
var configNode;
|
||||
@@ -855,7 +1026,7 @@ RED.nodes = (function() {
|
||||
} else if (n.type === "subflow") {
|
||||
var matchingSubflow = checkForMatchingSubflow(n,nodeZmap[n.id]);
|
||||
if (matchingSubflow) {
|
||||
subflow_blacklist[n.id] = matchingSubflow;
|
||||
subflow_denylist[n.id] = matchingSubflow;
|
||||
} else {
|
||||
subflow_map[n.id] = n;
|
||||
if (createNewIds) {
|
||||
@@ -906,7 +1077,7 @@ RED.nodes = (function() {
|
||||
var existingConfigNode = null;
|
||||
if (createNewIds) {
|
||||
if (n.z) {
|
||||
if (subflow_blacklist[n.z]) {
|
||||
if (subflow_denylist[n.z]) {
|
||||
continue;
|
||||
} else if (subflow_map[n.z]) {
|
||||
n.z = subflow_map[n.z].id;
|
||||
@@ -953,6 +1124,9 @@ RED.nodes = (function() {
|
||||
users:[],
|
||||
_config:{}
|
||||
};
|
||||
if (n.hasOwnProperty('d')) {
|
||||
configNode.d = n.d;
|
||||
}
|
||||
for (d in def.defaults) {
|
||||
if (def.defaults.hasOwnProperty(d)) {
|
||||
configNode[d] = n[d];
|
||||
@@ -974,7 +1148,6 @@ RED.nodes = (function() {
|
||||
}
|
||||
node_map[n.id] = configNode;
|
||||
new_nodes.push(configNode);
|
||||
RED.nodes.add(configNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -991,19 +1164,27 @@ RED.nodes = (function() {
|
||||
y:parseFloat(n.y || 0),
|
||||
z:n.z,
|
||||
type:0,
|
||||
wires:n.wires||[],
|
||||
inputLabels: n.inputLabels,
|
||||
outputLabels: n.outputLabels,
|
||||
icon: n.icon,
|
||||
info: n.info,
|
||||
changed:false,
|
||||
_config:{}
|
||||
};
|
||||
}
|
||||
if (n.type !== "group") {
|
||||
node.wires = n.wires||[];
|
||||
node.inputLabels = n.inputLabels;
|
||||
node.outputLabels = n.outputLabels;
|
||||
node.icon = n.icon;
|
||||
}
|
||||
if (n.hasOwnProperty('l')) {
|
||||
node.l = n.l;
|
||||
}
|
||||
if (n.hasOwnProperty('d')) {
|
||||
node.d = n.d;
|
||||
}
|
||||
if (n.hasOwnProperty('g')) {
|
||||
node.g = n.g;
|
||||
}
|
||||
if (createNewIds) {
|
||||
if (subflow_blacklist[n.z]) {
|
||||
if (subflow_denylist[n.z]) {
|
||||
continue;
|
||||
} else if (subflow_map[node.z]) {
|
||||
node.z = subflow_map[node.z].id;
|
||||
@@ -1038,9 +1219,19 @@ RED.nodes = (function() {
|
||||
}
|
||||
node.type = n.type;
|
||||
node._def = def;
|
||||
if (n.type.substring(0,7) === "subflow") {
|
||||
if (node.type === "group") {
|
||||
node._def = RED.group.def;
|
||||
for (d in node._def.defaults) {
|
||||
if (node._def.defaults.hasOwnProperty(d) && d !== 'inputs' && d !== 'outputs') {
|
||||
node[d] = n[d];
|
||||
node._config[d] = JSON.stringify(n[d]);
|
||||
}
|
||||
}
|
||||
node._config.x = node.x;
|
||||
node._config.y = node.y;
|
||||
} else if (n.type.substring(0,7) === "subflow") {
|
||||
var parentId = n.type.split(":")[1];
|
||||
var subflow = subflow_blacklist[parentId]||subflow_map[parentId]||getSubflow(parentId);
|
||||
var subflow = subflow_denylist[parentId]||subflow_map[parentId]||getSubflow(parentId);
|
||||
if (createNewIds) {
|
||||
parentId = subflow.id;
|
||||
node.type = "subflow:"+parentId;
|
||||
@@ -1058,8 +1249,8 @@ RED.nodes = (function() {
|
||||
color:"#fee",
|
||||
defaults: {},
|
||||
label: "unknown: "+n.type,
|
||||
labelStyle: "node_label_italic",
|
||||
outputs: n.outputs||n.wires.length,
|
||||
labelStyle: "red-ui-flow-node-label-italic",
|
||||
outputs: n.outputs|| (n.wires && n.wires.length) || 0,
|
||||
set: registry.getNodeSet("node-red/unknown")
|
||||
}
|
||||
} else {
|
||||
@@ -1128,13 +1319,13 @@ RED.nodes = (function() {
|
||||
}
|
||||
}
|
||||
}
|
||||
addNode(node);
|
||||
RED.editor.validateNode(node);
|
||||
node_map[n.id] = node;
|
||||
// If an 'unknown' config node, it will not have been caught by the
|
||||
// proper config node handling, so needs adding to new_nodes here
|
||||
if (node.type === "unknown" || node._def.category !== "config") {
|
||||
new_nodes.push(node);
|
||||
} else if (node.type === "group") {
|
||||
new_groups.push(node);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1144,6 +1335,7 @@ RED.nodes = (function() {
|
||||
var nodeTypeArrayReferences = {
|
||||
"catch":"scope",
|
||||
"status":"scope",
|
||||
"complete": "scope",
|
||||
"link in":"links",
|
||||
"link out":"links"
|
||||
}
|
||||
@@ -1168,12 +1360,17 @@ RED.nodes = (function() {
|
||||
}
|
||||
delete n.wires;
|
||||
}
|
||||
if (n.g && node_map[n.g]) {
|
||||
n.g = node_map[n.g].id;
|
||||
} else {
|
||||
delete n.g
|
||||
}
|
||||
for (var d3 in n._def.defaults) {
|
||||
if (n._def.defaults.hasOwnProperty(d3)) {
|
||||
if (n._def.defaults[d3].type && node_map[n[d3]]) {
|
||||
n[d3] = node_map[n[d3]].id;
|
||||
configNode = RED.nodes.node(n[d3]);
|
||||
if (configNode && configNode.users.indexOf(n) === -1) {
|
||||
configNode = node_map[n[d3]];
|
||||
n[d3] = configNode.id;
|
||||
if (configNode.users.indexOf(n) === -1) {
|
||||
configNode.users.push(n);
|
||||
}
|
||||
} else if (nodeTypeArrayReferences.hasOwnProperty(n.type) && nodeTypeArrayReferences[n.type] === d3 && n[d3] !== undefined && n[d3] !== null) {
|
||||
@@ -1194,10 +1391,6 @@ RED.nodes = (function() {
|
||||
return (otherNode && otherNode.z === activeWorkspace)
|
||||
});
|
||||
}
|
||||
|
||||
// With all properties now remapped to point at valid nodes,
|
||||
// we can validate the node
|
||||
RED.editor.validateNode(n);
|
||||
}
|
||||
for (i=0;i<new_subflows.length;i++) {
|
||||
n = new_subflows[i];
|
||||
@@ -1236,21 +1429,90 @@ RED.nodes = (function() {
|
||||
delete n.status.wires;
|
||||
}
|
||||
}
|
||||
// Order the groups to ensure they are outer-most to inner-most
|
||||
var groupDepthMap = {};
|
||||
for (i=0;i<new_groups.length;i++) {
|
||||
n = new_groups[i];
|
||||
if (n.g && node_map[n.g]) {
|
||||
n.g = node_map[n.g].id;
|
||||
} else {
|
||||
delete n.g;
|
||||
}
|
||||
n.nodes = n.nodes.map(function(id) {
|
||||
return node_map[id];
|
||||
})
|
||||
// Just in case the group references a node that doesn't exist for some reason
|
||||
n.nodes = n.nodes.filter(function(v) {
|
||||
if (v) {
|
||||
// Repair any nodes that have forgotten they are in this group
|
||||
if (v.g !== n.id) {
|
||||
v.g = n.id;
|
||||
}
|
||||
}
|
||||
return !!v
|
||||
});
|
||||
if (!n.g) {
|
||||
groupDepthMap[n.id] = 0;
|
||||
}
|
||||
}
|
||||
var changedDepth;
|
||||
do {
|
||||
changedDepth = false;
|
||||
for (i=0;i<new_groups.length;i++) {
|
||||
n = new_groups[i];
|
||||
if (n.g) {
|
||||
if (groupDepthMap[n.id] !== groupDepthMap[n.g] + 1) {
|
||||
groupDepthMap[n.id] = groupDepthMap[n.g] + 1;
|
||||
changedDepth = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
} while(changedDepth);
|
||||
|
||||
new_groups.sort(function(A,B) {
|
||||
return groupDepthMap[A.id] - groupDepthMap[B.id];
|
||||
});
|
||||
for (i=0;i<new_groups.length;i++) {
|
||||
n = new_groups[i];
|
||||
addGroup(n);
|
||||
}
|
||||
|
||||
// Now the nodes have been fully updated, add them.
|
||||
for (i=0;i<new_nodes.length;i++) {
|
||||
var node = new_nodes[i];
|
||||
addNode(node);
|
||||
}
|
||||
// Finally validate them all.
|
||||
// This has to be done after everything is added so that any checks for
|
||||
// dependent config nodes will pass
|
||||
for (i=0;i<new_nodes.length;i++) {
|
||||
var node = new_nodes[i];
|
||||
RED.editor.validateNode(node);
|
||||
}
|
||||
|
||||
RED.workspaces.refresh();
|
||||
return [new_nodes,new_links,new_workspaces,new_subflows,missingWorkspace];
|
||||
return [new_nodes,new_links,new_groups,new_workspaces,new_subflows,missingWorkspace];
|
||||
}
|
||||
|
||||
// TODO: supports filter.z|type
|
||||
function filterNodes(filter) {
|
||||
var result = [];
|
||||
var searchSet = nodes;
|
||||
var doZFilter = false;
|
||||
if (filter.hasOwnProperty("z")) {
|
||||
if (Object.hasOwnProperty("values") && nodeTabMap.hasOwnProperty(filter.z) ) {
|
||||
searchSet = Object.values(nodeTabMap[filter.z]);
|
||||
} else {
|
||||
doZFilter = true;
|
||||
}
|
||||
}
|
||||
|
||||
for (var n=0;n<nodes.length;n++) {
|
||||
var node = nodes[n];
|
||||
if (filter.hasOwnProperty("z") && node.z !== filter.z) {
|
||||
for (var n=0;n<searchSet.length;n++) {
|
||||
var node = searchSet[n];
|
||||
if (filter.hasOwnProperty("type") && node.type !== filter.type) {
|
||||
continue;
|
||||
}
|
||||
if (filter.hasOwnProperty("type") && node.type !== filter.type) {
|
||||
if (doZFilter && node.z !== filter.z) {
|
||||
continue;
|
||||
}
|
||||
result.push(node);
|
||||
@@ -1317,8 +1579,12 @@ RED.nodes = (function() {
|
||||
function clear() {
|
||||
nodes = [];
|
||||
links = [];
|
||||
nodeTabMap = {};
|
||||
configNodes = {};
|
||||
workspacesOrder = [];
|
||||
groups = {};
|
||||
groupsByZ = {};
|
||||
|
||||
var subflowIds = Object.keys(subflows);
|
||||
subflowIds.forEach(function(id) {
|
||||
RED.subflow.removeSubflow(id)
|
||||
@@ -1330,12 +1596,14 @@ RED.nodes = (function() {
|
||||
defaultWorkspace = null;
|
||||
initialLoad = null;
|
||||
RED.nodes.dirty(false);
|
||||
RED.view.redraw(true);
|
||||
RED.view.redraw(true, true);
|
||||
RED.palette.refresh();
|
||||
RED.workspaces.refresh();
|
||||
RED.sidebar.config.refresh();
|
||||
RED.sidebar.info.refresh();
|
||||
|
||||
RED.events.emit("workspace:clear");
|
||||
|
||||
// var node_defs = {};
|
||||
// var nodes = [];
|
||||
// var configNodes = {};
|
||||
@@ -1347,6 +1615,31 @@ RED.nodes = (function() {
|
||||
// var loadedFlowVersion = null;
|
||||
}
|
||||
|
||||
function addGroup(group) {
|
||||
groupsByZ[group.z] = groupsByZ[group.z] || [];
|
||||
groupsByZ[group.z].push(group);
|
||||
groups[group.id] = group;
|
||||
RED.events.emit("groups:add",group);
|
||||
}
|
||||
function removeGroup(group) {
|
||||
var i = groupsByZ[group.z].indexOf(group);
|
||||
groupsByZ[group.z].splice(i,1);
|
||||
if (groupsByZ[group.z].length === 0) {
|
||||
delete groupsByZ[group.z];
|
||||
}
|
||||
if (group.g) {
|
||||
if (groups[group.g]) {
|
||||
var index = groups[group.g].nodes.indexOf(group);
|
||||
groups[group.g].nodes.splice(index,1);
|
||||
}
|
||||
}
|
||||
RED.group.markDirty(group);
|
||||
|
||||
delete groups[group.id];
|
||||
RED.events.emit("groups:remove",group);
|
||||
}
|
||||
|
||||
|
||||
return {
|
||||
init: function() {
|
||||
RED.events.on("registry:node-type-added",function(type) {
|
||||
@@ -1373,8 +1666,12 @@ RED.nodes = (function() {
|
||||
delete configNodes[n.id];
|
||||
} else {
|
||||
nodes.splice(nodes.indexOf(n),1);
|
||||
if (nodeTabMap[n.z]) {
|
||||
delete nodeTabMap[n.z][n.id];
|
||||
}
|
||||
}
|
||||
reimportList.push(convertNode(n));
|
||||
RED.events.emit('nodes:remove',n);
|
||||
});
|
||||
|
||||
// Remove any links between nodes that are going to be reimported.
|
||||
@@ -1387,8 +1684,9 @@ RED.nodes = (function() {
|
||||
});
|
||||
removeLinks.forEach(removeLink);
|
||||
|
||||
|
||||
RED.view.redraw(true);
|
||||
// Force the redraw to be synchronous so the view updates
|
||||
// *now* and removes the unknown node
|
||||
RED.view.redraw(true, true);
|
||||
var result = importNodes(reimportList,false);
|
||||
var newNodeMap = {};
|
||||
result[0].forEach(function(n) {
|
||||
@@ -1426,6 +1724,8 @@ RED.nodes = (function() {
|
||||
remove: removeNode,
|
||||
clear: clear,
|
||||
|
||||
moveNodeToTab: moveNodeToTab,
|
||||
|
||||
addLink: addLink,
|
||||
removeLink: removeLink,
|
||||
|
||||
@@ -1440,6 +1740,11 @@ RED.nodes = (function() {
|
||||
subflow: getSubflow,
|
||||
subflowContains: subflowContains,
|
||||
|
||||
addGroup: addGroup,
|
||||
removeGroup: removeGroup,
|
||||
group: function(id) { return groups[id] },
|
||||
groups: function(z) { return groupsByZ[z]||[] },
|
||||
|
||||
eachNode: function(cb) {
|
||||
for (var n=0;n<nodes.length;n++) {
|
||||
if (cb(nodes[n]) === false) {
|
||||
|
41
packages/node_modules/@node-red/editor-client/src/js/polyfills.js
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
(function() {
|
||||
var isIE11 = !!window.MSInputMethodContext && !!document.documentMode;
|
||||
|
||||
if (isIE11) {
|
||||
// IE11 DOMTokenList.toggle does not support the two-argument variety
|
||||
window.DOMTokenList.prototype.toggle = function(cl,bo) {
|
||||
if (arguments.length === 1) {
|
||||
bo = !this.contains(cl);
|
||||
}
|
||||
this[!!bo?"add":"remove"](cl);
|
||||
}
|
||||
|
||||
// IE11 does not provide classList on SVGElements
|
||||
if (! ("classList" in SVGElement.prototype)) {
|
||||
Object.defineProperty(SVGElement.prototype, 'classList', Object.getOwnPropertyDescriptor(HTMLElement.prototype, 'classList'));
|
||||
}
|
||||
|
||||
// IE11 does not provide children on SVGElements
|
||||
if (! ("children" in SVGElement.prototype)) {
|
||||
Object.defineProperty(SVGElement.prototype, 'children', Object.getOwnPropertyDescriptor(HTMLElement.prototype, 'children'));
|
||||
}
|
||||
|
||||
Array.from = function() {
|
||||
if (arguments.length > 1) {
|
||||
throw new Error("Node-RED's IE11 Array.from polyfill doesn't support multiple arguments");
|
||||
}
|
||||
var arrayLike = arguments[0]
|
||||
var result = [];
|
||||
if (arrayLike.forEach) {
|
||||
arrayLike.forEach(function(i) {
|
||||
result.push(i);
|
||||
})
|
||||
} else {
|
||||
for (var i=0;i<arrayLike.length;i++) {
|
||||
result.push(arrayList[i]);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
})();
|