Compare commits
668 Commits
server-v2.
...
android-v3
Author | SHA1 | Date | |
---|---|---|---|
|
7683284352 | ||
|
e84ea8ab04 | ||
|
b638056150 | ||
|
ff86c253d3 | ||
|
86d9f7e1cb | ||
|
385fe7bbe0 | ||
|
313587097a | ||
|
8393ccc7f8 | ||
|
e3ba605592 | ||
|
035557de9f | ||
|
97ff2b51f1 | ||
|
87f7fb6841 | ||
|
9fe31544f7 | ||
|
89dfbe3ec1 | ||
|
0c640c5e77 | ||
|
a3eec19b32 | ||
|
c0c3b4d23e | ||
|
1812587970 | ||
|
1bb724fe0e | ||
|
346f49fa66 | ||
|
55d25308f8 | ||
|
514a8cf841 | ||
|
837826ea4f | ||
|
681d1d67f3 | ||
|
d2f3252de2 | ||
|
859d3e867e | ||
|
238683e36f | ||
|
2ae08ff46e | ||
|
ce672915da | ||
|
a2071bfed2 | ||
|
03c3feef16 | ||
|
b3f4414026 | ||
|
04c6863d7f | ||
|
b678e2fb5d | ||
|
1179de7c36 | ||
|
58ca1a938b | ||
|
9713034f18 | ||
|
28b8818c4d | ||
|
2e2a2b3193 | ||
|
42900bcc66 | ||
|
ce451c5850 | ||
|
5b4477f7bd | ||
|
660ebcfc77 | ||
|
86872fb07c | ||
|
c55bb95950 | ||
|
d613d1ab4e | ||
|
cd5d648eec | ||
|
384b17738a | ||
|
500c8facdb | ||
|
6f76fe728f | ||
|
2488dd3806 | ||
|
9d3cccdf71 | ||
|
8dc75efc4c | ||
|
7caed19a32 | ||
|
a301470ac5 | ||
|
f899c97c4c | ||
|
8630c8e630 | ||
|
29daec2c07 | ||
|
ce3a28de70 | ||
|
1e6cc11868 | ||
|
3e0f6994a1 | ||
|
c10e617870 | ||
|
cade585292 | ||
|
f60e105d77 | ||
|
b622f9b938 | ||
|
00084c5798 | ||
|
554fb7026a | ||
|
04a6c36b5c | ||
|
adbf819cc0 | ||
|
3062f83367 | ||
|
bdb2e588f3 | ||
|
688d807eee | ||
|
06aa64016f | ||
|
06c7c132b8 | ||
|
fcb837ca99 | ||
|
7f34afcaea | ||
|
876fa324e5 | ||
|
f781183250 | ||
|
c1ae449ce2 | ||
|
c4aa18a63e | ||
|
27b86fbb00 | ||
|
569c6d8479 | ||
|
d3e2d3fc4a | ||
|
9b5ee63638 | ||
|
dee68681f5 | ||
|
f85db1496e | ||
|
0839b0314e | ||
|
40dbb8bd7f | ||
|
2de5c1bbf8 | ||
|
20edc63785 | ||
|
b936f9ba7c | ||
|
a5419e61d5 | ||
|
ec4d4141ef | ||
|
b5a16f756a | ||
|
0331d2a8db | ||
|
79eedcf6a6 | ||
|
0715340dc0 | ||
|
a59ad20bd5 | ||
|
e3de158d18 | ||
|
e9514e742b | ||
|
d2c060cd97 | ||
|
57fc70cec1 | ||
|
180f52dab2 | ||
|
0c6df3dd73 | ||
|
b29bf7de5d | ||
|
382f0d8218 | ||
|
55d72a8f68 | ||
|
e9ebd845b9 | ||
|
ea29cf4e13 | ||
|
d260d0efce | ||
|
e92f89df99 | ||
|
44e8950f1b | ||
|
32141d4e23 | ||
|
7d068cfb87 | ||
|
9c3e751ebc | ||
|
eecad1aefc | ||
|
eb06ac673b | ||
|
5e2c54f2ad | ||
|
15649c89f1 | ||
|
42483a4d46 | ||
|
56b010ba0e | ||
|
cfd98e3a4d | ||
|
40db753417 | ||
|
3d2c100fe9 | ||
|
fd4d7ead43 | ||
|
073df50244 | ||
|
6973734d5b | ||
|
b44b30124c | ||
|
60f447dd49 | ||
|
7638bdf171 | ||
|
9dc480e8d1 | ||
|
c2dbb9606f | ||
|
a40c3b792e | ||
|
08aa2ae939 | ||
|
85d98f5254 | ||
|
310a90744a | ||
|
b3ec92a57e | ||
|
b9eb4522f5 | ||
|
04298f0eba | ||
|
a53a8d67a1 | ||
|
6467bf0fc1 | ||
|
4ac0cdf556 | ||
|
3e34f150b8 | ||
|
e72cce0d07 | ||
|
78b8839ae3 | ||
|
49cd17e520 | ||
|
c16ce1c434 | ||
|
8eea3953f3 | ||
|
8cb9c08bcb | ||
|
bc7a0fa095 | ||
|
298549e51a | ||
|
da393f6c34 | ||
|
8bdac6ffbf | ||
|
55cafb8891 | ||
|
238468ddaa | ||
|
b152732d7f | ||
|
56dde88003 | ||
|
9e0a0468b2 | ||
|
e203397f89 | ||
|
3e22041672 | ||
|
0d018a8d7a | ||
|
c3954d7326 | ||
|
d7401d70a7 | ||
|
bae16f7a65 | ||
|
25cd5affca | ||
|
91004f5714 | ||
|
c35085d1d5 | ||
|
17a8ce5010 | ||
|
4d8fcff6d5 | ||
|
75cb639ed2 | ||
|
3222b620b9 | ||
|
d7a0d74c4d | ||
|
52810c51f5 | ||
|
1b96a16586 | ||
|
971c4e5e84 | ||
|
9ef0a504ec | ||
|
e59211deea | ||
|
3177729663 | ||
|
70c7804a43 | ||
|
c40682f16f | ||
|
406c778cfd | ||
|
9d17ab429d | ||
|
20f8bb76f7 | ||
|
5e4c35a18f | ||
|
9a6484c488 | ||
|
1dfebf5ed3 | ||
|
be2f4d3d79 | ||
|
a1cea6776f | ||
|
3c10282848 | ||
|
d9a16b5c0f | ||
|
28c7268f82 | ||
|
3eab87ae69 | ||
|
9acbac6613 | ||
|
9a10cd4bec | ||
|
5aba1e38a2 | ||
|
b812027281 | ||
|
dfc08da40c | ||
|
f5f47f3c08 | ||
|
8d5ee36745 | ||
|
7068670554 | ||
|
6e3162f92f | ||
|
6494b74d0c | ||
|
d26d9f16d9 | ||
|
4c6969b17d | ||
|
9a2a251eec | ||
|
f6c7213f69 | ||
|
4827d0bf92 | ||
|
f0f6590312 | ||
|
fa83d48141 | ||
|
c409160ad7 | ||
|
ff1f1b190e | ||
|
53d5cf55bc | ||
|
f19b1c5364 | ||
|
07fbd547dc | ||
|
cb540a5abb | ||
|
a7b303259c | ||
|
ee181c1fd6 | ||
|
2e8fc99c5c | ||
|
4a78cd2564 | ||
|
95e42c4ca7 | ||
|
98bb0250f2 | ||
|
5aba5e544d | ||
|
0ca36bbf66 | ||
|
5d3034d418 | ||
|
438dddda6e | ||
|
8bd6132398 | ||
|
d1c6c0622b | ||
|
bd5b3feabe | ||
|
22f4d19dd1 | ||
|
a86f859b42 | ||
|
4bef8aa632 | ||
|
40ae03c438 | ||
|
afedc53354 | ||
|
0d5bca20d3 | ||
|
f254255ba5 | ||
|
fc1c1a3c20 | ||
|
3c31b2bc38 | ||
|
b4cc6803e7 | ||
|
2ac7997c07 | ||
|
0055345689 | ||
|
f43f5c0a34 | ||
|
dee66ec6ad | ||
|
094175c067 | ||
|
e5a643e796 | ||
|
ef9a1daf18 | ||
|
9035fe67a4 | ||
|
fc1da80086 | ||
|
d5ac7c6bc0 | ||
|
28fd9c3039 | ||
|
83599234a9 | ||
|
c2e49ebb2b | ||
|
64684dc896 | ||
|
0b63ba1a28 | ||
|
47f95cb294 | ||
|
69cbd45782 | ||
|
31368f3148 | ||
|
1fb1d4714c | ||
|
69e591c01d | ||
|
2bc0d5e8e7 | ||
|
57c182b9a4 | ||
|
ac721cf8f4 | ||
|
935f90422f | ||
|
c308f858f1 | ||
|
5ce5edf7ba | ||
|
16594eaae3 | ||
|
1548eab677 | ||
|
ae9c8f27da | ||
|
ea6b704754 | ||
|
ff62bd8ff7 | ||
|
774d924abd | ||
|
9a115c9e93 | ||
|
9f5109aed7 | ||
|
dd04a39f3b | ||
|
514123d2b6 | ||
|
fbeaf31a14 | ||
|
e5e191110c | ||
|
836e23c082 | ||
|
4c5e708977 | ||
|
1b846fca90 | ||
|
f1a833ef21 | ||
|
4a61ff2df3 | ||
|
2e3783f1c6 | ||
|
de03679be0 | ||
|
5820f63ea6 | ||
|
bfc31127af | ||
|
d1db799b5c | ||
|
5a30a790ca | ||
|
ab8f1492b1 | ||
|
7cfe9bb4b6 | ||
|
563b9d8f71 | ||
|
2aea7fcc25 | ||
|
e2a79c16c1 | ||
|
2d0a53eaca | ||
|
0b2bb80bb8 | ||
|
f378662196 | ||
|
6588adbfe0 | ||
|
7ae9f30922 | ||
|
1cfbf000d6 | ||
|
7f50cb9787 | ||
|
7dbbcb06b5 | ||
|
4b520222ed | ||
|
d4b32d3a91 | ||
|
9aaea7fb69 | ||
|
6e1331e580 | ||
|
9f81f4cc49 | ||
|
530375f221 | ||
|
640174b7cd | ||
|
279416b66d | ||
|
9602323e0f | ||
|
115eb5defb | ||
|
012fe0fb44 | ||
|
771ada0184 | ||
|
cb21a91fac | ||
|
3000afca49 | ||
|
b7189d57f2 | ||
|
e5d53b6276 | ||
|
ecb6ac3554 | ||
|
1b27e4c07d | ||
|
4151c65fc2 | ||
|
c626386ebd | ||
|
7dfa3137c4 | ||
|
0f9da943cd | ||
|
485a685e5a | ||
|
3a0b180487 | ||
|
605233c572 | ||
|
37344fe718 | ||
|
f74570b403 | ||
|
13f907e7f1 | ||
|
f2ee35c82a | ||
|
29d4a026e2 | ||
|
c7e312e959 | ||
|
e6a811e259 | ||
|
5408dd71d3 | ||
|
edc8865e50 | ||
|
a80fea9c4b | ||
|
92c85ca07c | ||
|
296d586b04 | ||
|
6f0fd4219e | ||
|
35fe392058 | ||
|
61f8a2afd3 | ||
|
347ba9bb38 | ||
|
802f6c462e | ||
|
39b44ff439 | ||
|
627b830739 | ||
|
d58185afe0 | ||
|
0b3a5a431d | ||
|
c54603025b | ||
|
debd8a6ebe | ||
|
d614d40cfd | ||
|
628877147e | ||
|
c163491371 | ||
|
16d77bfa10 | ||
|
11e1a49b5c | ||
|
b1877fcd0d | ||
|
4b7f0bfbb9 | ||
|
2f06697aa2 | ||
|
07aba918a0 | ||
|
01ec640bdb | ||
|
c1e5adf658 | ||
|
a364f66d4b | ||
|
a906e73b22 | ||
|
8b9ce9ec72 | ||
|
e462881502 | ||
|
0e8f0a2dc1 | ||
|
2252a06a50 | ||
|
6ecc478402 | ||
|
da06383458 | ||
|
a56c78db8b | ||
|
6ebc7993be | ||
|
b8243e5518 | ||
|
a5a4aaf765 | ||
|
0f793a4cf0 | ||
|
ce11761dc9 | ||
|
437b3bbfe8 | ||
|
6dbfa6e4d8 | ||
|
3451133fd7 | ||
|
1932187e0f | ||
|
eefde7baba | ||
|
a225c11822 | ||
|
b35246cd64 | ||
|
4289c08538 | ||
|
b58ca5095c | ||
|
a2e5125335 | ||
|
7938eab6e2 | ||
|
b322ff247c | ||
|
fc8fadce2b | ||
|
9485c323d1 | ||
|
40749cabff | ||
|
cddd8213d5 | ||
|
fd48697fb2 | ||
|
28819931a3 | ||
|
815fe8d3ba | ||
|
564adb9a57 | ||
|
987417502f | ||
|
43d36f9415 | ||
|
24776ee6ce | ||
|
9a26e8aafd | ||
|
0e45336140 | ||
|
2d4fc08f2b | ||
|
b51e16c255 | ||
|
bc8392ad52 | ||
|
dba218a681 | ||
|
e83306c1f7 | ||
|
a0f003f9d5 | ||
|
0e6b5b338c | ||
|
ddbd3601ab | ||
|
236d977c41 | ||
|
7c539976dd | ||
|
fa0b741529 | ||
|
a133bb06a3 | ||
|
e71ec2bc49 | ||
|
99e8818ba0 | ||
|
e4197a985e | ||
|
c023cee0b8 | ||
|
e42fa68114 | ||
|
582f0853bb | ||
|
07ee20a0ff | ||
|
7f78e94d6e | ||
|
3fbf5ef5d0 | ||
|
25b12a2366 | ||
|
07b4117aa1 | ||
|
8abd9b401b | ||
|
1c5a79c353 | ||
|
149e409bfa | ||
|
e4854b0bc2 | ||
|
857e25d84f | ||
|
af59295968 | ||
|
c94ec4e064 | ||
|
999baf4b3d | ||
|
bfb802cd09 | ||
|
61cd924bb1 | ||
|
3e13a95053 | ||
|
b69d752734 | ||
|
821cc346f7 | ||
|
8402c20a3f | ||
|
4c50706d54 | ||
|
0f9d6a12b0 | ||
|
13da286b55 | ||
|
da4d57c1db | ||
|
7b06090255 | ||
|
2cc4ac087b | ||
|
c4ff7857b1 | ||
|
938e639a01 | ||
|
fe3ad3e9b4 | ||
|
681d413b36 | ||
|
8b452106be | ||
|
72a8724a5b | ||
|
04112b025c | ||
|
bea9edf64b | ||
|
fd432f928d | ||
|
a8f6676fb3 | ||
|
6720fd1f0e | ||
|
f3518cddbe | ||
|
d4d400217b | ||
|
a863f92490 | ||
|
aaf4dcc50c | ||
|
cfd34da03f | ||
|
c24467c15e | ||
|
3ed6ad5948 | ||
|
de0ae7653f | ||
|
a9691f6b1c | ||
|
1a7d463f09 | ||
|
47a49fd5de | ||
|
be949390f8 | ||
|
b26a9f1b22 | ||
|
b7b0f770ee | ||
|
1ae5d4ea9b | ||
|
aa267f0dc6 | ||
|
691618b50c | ||
|
33ed7545a9 | ||
|
d8d0e705f2 | ||
|
bdc970d718 | ||
|
4636d1539c | ||
|
bc1165be46 | ||
|
f5e1e45f6f | ||
|
352ee6496e | ||
|
fdbfa78e53 | ||
|
dfe5383d4b | ||
|
eb1e9e0436 | ||
|
3d7f864982 | ||
|
1ffe30b359 | ||
|
5d5bd3abd6 | ||
|
747264bd89 | ||
|
7bd1bdb0e3 | ||
|
d5ec92e540 | ||
|
2b50e99bb1 | ||
|
a4c5164bea | ||
|
88d6c94e6b | ||
|
4f45c977e2 | ||
|
cbf7e24c47 | ||
|
7ebc98633a | ||
|
1d4e3fe3ea | ||
|
94e0ea403a | ||
|
d217478852 | ||
|
4c9cbd61a4 | ||
|
d07a540618 | ||
|
720b6f0190 | ||
|
33fff4c8f0 | ||
|
6f83ccd044 | ||
|
7d68dafaed | ||
|
4f066b06d2 | ||
|
a11bed1bb2 | ||
|
96c9e29025 | ||
|
2519b73117 | ||
|
639bfc4533 | ||
|
97a04ea9e3 | ||
|
150ee7631e | ||
|
9a68157b86 | ||
|
12878672e4 | ||
|
15f019789b | ||
|
311905f6d2 | ||
|
a74035c22f | ||
|
361e56e9b4 | ||
|
04fa761258 | ||
|
b2109dab99 | ||
|
61a3962eda | ||
|
97af8cb7f5 | ||
|
17bdec22ca | ||
|
1d176b31ff | ||
|
32e76d7988 | ||
|
94e3582bb8 | ||
|
b9b2d37fdd | ||
|
a465d0ee8d | ||
|
a29666d442 | ||
|
d3ccb9786b | ||
|
2625f0d89e | ||
|
1cd0c3742e | ||
|
2e94b01700 | ||
|
20b1c2e7cb | ||
|
4e8863d81f | ||
|
a34a911b1e | ||
|
2bf2395f1b | ||
|
a6b150e63a | ||
|
50a7b21f8d | ||
|
76e8186858 | ||
|
763716397b | ||
|
68e04f944f | ||
|
91b51adc48 | ||
|
4c12c25bd8 | ||
|
c0dcf1d3e3 | ||
|
efa35d9317 | ||
|
3c210a012a | ||
|
92667bafc1 | ||
|
fc7d053521 | ||
|
47072b3813 | ||
|
7a13003af5 | ||
|
723b708d89 | ||
|
36a24a5ed8 | ||
|
091bf4a3d7 | ||
|
ce8e5e61be | ||
|
b8462c4754 | ||
|
73ad7e0572 | ||
|
2bf4f39ca1 | ||
|
29b8fcd5bb | ||
|
2a96012577 | ||
|
474e8c95a0 | ||
|
906b7c3a33 | ||
|
0a2afdb010 | ||
|
a281163353 | ||
|
9aa7240d5e | ||
|
9cf63168da | ||
|
430f73c47a | ||
|
7e8c87e908 | ||
|
4e09b6f2a4 | ||
|
d02058d337 | ||
|
f95ee689fd | ||
|
164e53ee7d | ||
|
cb1322f01e | ||
|
cc22d71408 | ||
|
ff7c13ac85 | ||
|
302bc4dcc7 | ||
|
ebfc5da0fe | ||
|
00eee19077 | ||
|
4048d83dd7 | ||
|
48b8fae625 | ||
|
60fbc6e022 | ||
|
ae73b5b87c | ||
|
6bc2ef9869 | ||
|
206d4ab56d | ||
|
96456aa851 | ||
|
adf0ccee2f | ||
|
01394e43d9 | ||
|
39c19db69c | ||
|
105e408dca | ||
|
37dbea1613 | ||
|
2512adebd2 | ||
|
28538de028 | ||
|
a0b4f5acac | ||
|
30a5bda5b9 | ||
|
c5865b3bf5 | ||
|
a9f6b38120 | ||
|
75447f7267 | ||
|
ca703adf6a | ||
|
f38abc5718 | ||
|
d733a7f5ae | ||
|
0f388b13c7 | ||
|
754ca39926 | ||
|
8a05baa97f | ||
|
1df00a1e5a | ||
|
5e63b623ca | ||
|
f8a25cb275 | ||
|
1e866ead3e | ||
|
3970b0876d | ||
|
6b711f655d | ||
|
65d3ed0c67 | ||
|
512e37b46a | ||
|
ed15b5e5da | ||
|
f9d1157266 | ||
|
cda0538681 | ||
|
3342b138b4 | ||
|
9285bb7a88 | ||
|
590769b1ae | ||
|
0873b1900b | ||
|
5df499e6c7 | ||
|
d89c686555 | ||
|
d81497f7b8 | ||
|
8cd377013e | ||
|
c623d98bda | ||
|
02232c0ca3 | ||
|
8ae3210378 | ||
|
bf907f21c4 | ||
|
cec5f1f3ba | ||
|
b4928eb7e5 | ||
|
3dcbb2ed51 | ||
|
e744cf0171 | ||
|
1ffafdcefc | ||
|
e48303aeb7 | ||
|
fb13e0ca80 | ||
|
7345cd4678 | ||
|
5341501d53 | ||
|
1fcfa9c591 | ||
|
1cd2d9254f | ||
|
ee18271f9b | ||
|
bf59b23efe | ||
|
973193623a | ||
|
495f088320 | ||
|
d264bdd14d | ||
|
144ec1eea2 | ||
|
7d60bfc192 | ||
|
b5428ddc2a | ||
|
2075626d42 | ||
|
4b9307015e | ||
|
9c88cb2151 | ||
|
45dcca865d | ||
|
c421a5a732 | ||
|
f7158f5e27 | ||
|
780c269e14 | ||
|
5eb0cda8b9 | ||
|
3b4eb16110 | ||
|
674bbf9667 | ||
|
f7e64e9681 | ||
|
4ec2fb216e | ||
|
ddebeb68b2 | ||
|
8b09d71d5b | ||
|
3df499714b | ||
|
6e9ff89dda | ||
|
880215acc4 | ||
|
d4157e14fe | ||
|
b237a92e02 | ||
|
0bd164642e | ||
|
872fadf454 | ||
|
404e86cef4 | ||
|
5f6b2f1a63 | ||
|
858205a72b | ||
|
dc8ea620a6 | ||
|
28527541f5 | ||
|
b1051a3144 | ||
|
815a0a5db4 |
303
.eslintignore
@@ -52,7 +52,7 @@ packages/app-desktop/packageInfo.js
|
|||||||
packages/app-desktop/services/electron-context-menu.js
|
packages/app-desktop/services/electron-context-menu.js
|
||||||
packages/app-desktop/vendor/lib/
|
packages/app-desktop/vendor/lib/
|
||||||
packages/app-mobile/android
|
packages/app-mobile/android
|
||||||
packages/app-mobile/components/NoteEditor/**/*.bundle.js
|
packages/app-mobile/**/*.bundle.js
|
||||||
packages/app-mobile/ios
|
packages/app-mobile/ios
|
||||||
packages/app-mobile/lib/rnInjectedJs/
|
packages/app-mobile/lib/rnInjectedJs/
|
||||||
packages/app-mobile/locales
|
packages/app-mobile/locales
|
||||||
@@ -86,14 +86,41 @@ packages/lib/countable/Countable.js
|
|||||||
|
|
||||||
# AUTO-GENERATED - EXCLUDED TYPESCRIPT BUILD
|
# AUTO-GENERATED - EXCLUDED TYPESCRIPT BUILD
|
||||||
packages/app-cli/app/LinkSelector.js
|
packages/app-cli/app/LinkSelector.js
|
||||||
|
packages/app-cli/app/app.js
|
||||||
packages/app-cli/app/base-command.js
|
packages/app-cli/app/base-command.js
|
||||||
|
packages/app-cli/app/command-apidoc.js
|
||||||
|
packages/app-cli/app/command-attach.js
|
||||||
|
packages/app-cli/app/command-cat.js
|
||||||
|
packages/app-cli/app/command-config.js
|
||||||
|
packages/app-cli/app/command-cp.js
|
||||||
packages/app-cli/app/command-done.test.js
|
packages/app-cli/app/command-done.test.js
|
||||||
|
packages/app-cli/app/command-done.js
|
||||||
|
packages/app-cli/app/command-dump.js
|
||||||
packages/app-cli/app/command-e2ee.js
|
packages/app-cli/app/command-e2ee.js
|
||||||
|
packages/app-cli/app/command-edit.js
|
||||||
|
packages/app-cli/app/command-exit.js
|
||||||
|
packages/app-cli/app/command-export-sync-status.js
|
||||||
|
packages/app-cli/app/command-export.js
|
||||||
|
packages/app-cli/app/command-geoloc.js
|
||||||
|
packages/app-cli/app/command-help.js
|
||||||
|
packages/app-cli/app/command-import.js
|
||||||
|
packages/app-cli/app/command-ls.js
|
||||||
packages/app-cli/app/command-mkbook.test.js
|
packages/app-cli/app/command-mkbook.test.js
|
||||||
packages/app-cli/app/command-mkbook.js
|
packages/app-cli/app/command-mkbook.js
|
||||||
|
packages/app-cli/app/command-mv.js
|
||||||
|
packages/app-cli/app/command-ren.js
|
||||||
|
packages/app-cli/app/command-restore.js
|
||||||
|
packages/app-cli/app/command-rmbook.test.js
|
||||||
|
packages/app-cli/app/command-rmbook.js
|
||||||
|
packages/app-cli/app/command-rmnote.test.js
|
||||||
|
packages/app-cli/app/command-rmnote.js
|
||||||
|
packages/app-cli/app/command-set.js
|
||||||
packages/app-cli/app/command-settingschema.js
|
packages/app-cli/app/command-settingschema.js
|
||||||
packages/app-cli/app/command-sync.js
|
packages/app-cli/app/command-sync.js
|
||||||
packages/app-cli/app/command-testing.js
|
packages/app-cli/app/command-testing.js
|
||||||
|
packages/app-cli/app/command-use.js
|
||||||
|
packages/app-cli/app/command-version.js
|
||||||
|
packages/app-cli/app/gui/FolderListWidget.js
|
||||||
packages/app-cli/app/gui/StatusBarWidget.js
|
packages/app-cli/app/gui/StatusBarWidget.js
|
||||||
packages/app-cli/app/services/plugins/PluginRunner.js
|
packages/app-cli/app/services/plugins/PluginRunner.js
|
||||||
packages/app-cli/app/setupCommand.js
|
packages/app-cli/app/setupCommand.js
|
||||||
@@ -120,6 +147,7 @@ packages/app-desktop/bridge.js
|
|||||||
packages/app-desktop/checkForUpdates.js
|
packages/app-desktop/checkForUpdates.js
|
||||||
packages/app-desktop/commands/copyDevCommand.js
|
packages/app-desktop/commands/copyDevCommand.js
|
||||||
packages/app-desktop/commands/editProfileConfig.js
|
packages/app-desktop/commands/editProfileConfig.js
|
||||||
|
packages/app-desktop/commands/emptyTrash.js
|
||||||
packages/app-desktop/commands/exportFolders.js
|
packages/app-desktop/commands/exportFolders.js
|
||||||
packages/app-desktop/commands/exportNotes.js
|
packages/app-desktop/commands/exportNotes.js
|
||||||
packages/app-desktop/commands/focusElement.js
|
packages/app-desktop/commands/focusElement.js
|
||||||
@@ -145,8 +173,6 @@ packages/app-desktop/gui/ConfigScreen/controls/ToggleAdvancedSettingsButton.js
|
|||||||
packages/app-desktop/gui/ConfigScreen/controls/plugins/PluginBox.js
|
packages/app-desktop/gui/ConfigScreen/controls/plugins/PluginBox.js
|
||||||
packages/app-desktop/gui/ConfigScreen/controls/plugins/PluginsStates.js
|
packages/app-desktop/gui/ConfigScreen/controls/plugins/PluginsStates.js
|
||||||
packages/app-desktop/gui/ConfigScreen/controls/plugins/SearchPlugins.js
|
packages/app-desktop/gui/ConfigScreen/controls/plugins/SearchPlugins.js
|
||||||
packages/app-desktop/gui/ConfigScreen/controls/plugins/useOnInstallHandler.test.js
|
|
||||||
packages/app-desktop/gui/ConfigScreen/controls/plugins/useOnInstallHandler.js
|
|
||||||
packages/app-desktop/gui/Dialog.js
|
packages/app-desktop/gui/Dialog.js
|
||||||
packages/app-desktop/gui/DialogButtonRow.js
|
packages/app-desktop/gui/DialogButtonRow.js
|
||||||
packages/app-desktop/gui/DialogButtonRow/useKeyboardHandler.js
|
packages/app-desktop/gui/DialogButtonRow/useKeyboardHandler.js
|
||||||
@@ -165,6 +191,7 @@ packages/app-desktop/gui/IconButton.js
|
|||||||
packages/app-desktop/gui/ImportScreen.js
|
packages/app-desktop/gui/ImportScreen.js
|
||||||
packages/app-desktop/gui/ItemList.js
|
packages/app-desktop/gui/ItemList.js
|
||||||
packages/app-desktop/gui/JoplinCloudConfigScreen.js
|
packages/app-desktop/gui/JoplinCloudConfigScreen.js
|
||||||
|
packages/app-desktop/gui/JoplinCloudLoginScreen.js
|
||||||
packages/app-desktop/gui/KeymapConfig/KeymapConfigScreen.js
|
packages/app-desktop/gui/KeymapConfig/KeymapConfigScreen.js
|
||||||
packages/app-desktop/gui/KeymapConfig/ShortcutRecorder.js
|
packages/app-desktop/gui/KeymapConfig/ShortcutRecorder.js
|
||||||
packages/app-desktop/gui/KeymapConfig/styles/index.js
|
packages/app-desktop/gui/KeymapConfig/styles/index.js
|
||||||
@@ -194,10 +221,13 @@ packages/app-desktop/gui/MainScreen/commands/openItem.js
|
|||||||
packages/app-desktop/gui/MainScreen/commands/openNote.js
|
packages/app-desktop/gui/MainScreen/commands/openNote.js
|
||||||
packages/app-desktop/gui/MainScreen/commands/openPdfViewer.js
|
packages/app-desktop/gui/MainScreen/commands/openPdfViewer.js
|
||||||
packages/app-desktop/gui/MainScreen/commands/openTag.js
|
packages/app-desktop/gui/MainScreen/commands/openTag.js
|
||||||
|
packages/app-desktop/gui/MainScreen/commands/permanentlyDeleteNote.js
|
||||||
packages/app-desktop/gui/MainScreen/commands/print.js
|
packages/app-desktop/gui/MainScreen/commands/print.js
|
||||||
packages/app-desktop/gui/MainScreen/commands/renameFolder.js
|
packages/app-desktop/gui/MainScreen/commands/renameFolder.js
|
||||||
packages/app-desktop/gui/MainScreen/commands/renameTag.js
|
packages/app-desktop/gui/MainScreen/commands/renameTag.js
|
||||||
packages/app-desktop/gui/MainScreen/commands/resetLayout.js
|
packages/app-desktop/gui/MainScreen/commands/resetLayout.js
|
||||||
|
packages/app-desktop/gui/MainScreen/commands/restoreFolder.js
|
||||||
|
packages/app-desktop/gui/MainScreen/commands/restoreNote.js
|
||||||
packages/app-desktop/gui/MainScreen/commands/revealResourceFile.js
|
packages/app-desktop/gui/MainScreen/commands/revealResourceFile.js
|
||||||
packages/app-desktop/gui/MainScreen/commands/search.js
|
packages/app-desktop/gui/MainScreen/commands/search.js
|
||||||
packages/app-desktop/gui/MainScreen/commands/setTags.js
|
packages/app-desktop/gui/MainScreen/commands/setTags.js
|
||||||
@@ -207,6 +237,7 @@ packages/app-desktop/gui/MainScreen/commands/showNoteProperties.js
|
|||||||
packages/app-desktop/gui/MainScreen/commands/showPrompt.js
|
packages/app-desktop/gui/MainScreen/commands/showPrompt.js
|
||||||
packages/app-desktop/gui/MainScreen/commands/showShareFolderDialog.js
|
packages/app-desktop/gui/MainScreen/commands/showShareFolderDialog.js
|
||||||
packages/app-desktop/gui/MainScreen/commands/showShareNoteDialog.js
|
packages/app-desktop/gui/MainScreen/commands/showShareNoteDialog.js
|
||||||
|
packages/app-desktop/gui/MainScreen/commands/showSpellCheckerMenu.test.js
|
||||||
packages/app-desktop/gui/MainScreen/commands/showSpellCheckerMenu.js
|
packages/app-desktop/gui/MainScreen/commands/showSpellCheckerMenu.js
|
||||||
packages/app-desktop/gui/MainScreen/commands/toggleEditors.js
|
packages/app-desktop/gui/MainScreen/commands/toggleEditors.js
|
||||||
packages/app-desktop/gui/MainScreen/commands/toggleLayoutMoveMode.js
|
packages/app-desktop/gui/MainScreen/commands/toggleLayoutMoveMode.js
|
||||||
@@ -224,27 +255,30 @@ packages/app-desktop/gui/Navigator.js
|
|||||||
packages/app-desktop/gui/NoteContentPropertiesDialog.js
|
packages/app-desktop/gui/NoteContentPropertiesDialog.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/Toolbar.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/Toolbar.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/index.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/index.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/setupVim.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/normalizeAccelerator.test.js
|
||||||
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/normalizeAccelerator.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/types.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/types.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useContextMenu.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useContextMenu.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useCursorUtils.test.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useEditorSearchExtension.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useCursorUtils.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useEditorSearchHandler.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useEditorSearch.js
|
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useExternalPlugins.js
|
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useJoplinCommands.js
|
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useJoplinMode.js
|
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useKeymap.js
|
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useLineSorting.js
|
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useListIdent.js
|
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useScrollHandler.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useScrollHandler.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useScrollUtils.js
|
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useStyles.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useStyles.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useWebviewIpcMessage.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useWebviewIpcMessage.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v5/CodeMirror.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v5/CodeMirror.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v5/Editor.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v5/Editor.js
|
||||||
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v5/utils/useCursorUtils.test.js
|
||||||
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v5/utils/useCursorUtils.js
|
||||||
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v5/utils/useExternalPlugins.js
|
||||||
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v5/utils/useJoplinCommands.js
|
||||||
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v5/utils/useJoplinMode.js
|
||||||
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v5/utils/useKeymap.js
|
||||||
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v5/utils/useLineSorting.js
|
||||||
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v5/utils/useListIdent.js
|
||||||
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v5/utils/useScrollUtils.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/CodeMirror.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/CodeMirror.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/Editor.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/Editor.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/useEditorCommands.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/useEditorCommands.js
|
||||||
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/utils/useKeymap.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/PlainEditor/PlainEditor.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/PlainEditor/PlainEditor.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/styles/index.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/styles/index.js
|
||||||
@@ -256,6 +290,7 @@ packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/utils/shouldPasteResources.
|
|||||||
packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/utils/types.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/utils/types.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/utils/useContextMenu.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/utils/useContextMenu.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/utils/useScroll.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/utils/useScroll.js
|
||||||
|
packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/utils/useWebViewApi.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteEditor.js
|
packages/app-desktop/gui/NoteEditor/NoteEditor.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteTitle/NoteTitleBar.js
|
packages/app-desktop/gui/NoteEditor/NoteTitle/NoteTitleBar.js
|
||||||
packages/app-desktop/gui/NoteEditor/commands/focusElementNoteBody.js
|
packages/app-desktop/gui/NoteEditor/commands/focusElementNoteBody.js
|
||||||
@@ -272,6 +307,7 @@ packages/app-desktop/gui/NoteEditor/utils/clipboardUtils.js
|
|||||||
packages/app-desktop/gui/NoteEditor/utils/contextMenu.js
|
packages/app-desktop/gui/NoteEditor/utils/contextMenu.js
|
||||||
packages/app-desktop/gui/NoteEditor/utils/contextMenuUtils.js
|
packages/app-desktop/gui/NoteEditor/utils/contextMenuUtils.js
|
||||||
packages/app-desktop/gui/NoteEditor/utils/index.js
|
packages/app-desktop/gui/NoteEditor/utils/index.js
|
||||||
|
packages/app-desktop/gui/NoteEditor/utils/markupRenderOptions.js
|
||||||
packages/app-desktop/gui/NoteEditor/utils/resourceHandling.test.js
|
packages/app-desktop/gui/NoteEditor/utils/resourceHandling.test.js
|
||||||
packages/app-desktop/gui/NoteEditor/utils/resourceHandling.js
|
packages/app-desktop/gui/NoteEditor/utils/resourceHandling.js
|
||||||
packages/app-desktop/gui/NoteEditor/utils/types.js
|
packages/app-desktop/gui/NoteEditor/utils/types.js
|
||||||
@@ -286,9 +322,7 @@ packages/app-desktop/gui/NoteEditor/utils/useNoteSearchBar.js
|
|||||||
packages/app-desktop/gui/NoteEditor/utils/usePluginServiceRegistration.js
|
packages/app-desktop/gui/NoteEditor/utils/usePluginServiceRegistration.js
|
||||||
packages/app-desktop/gui/NoteEditor/utils/useSearchMarkers.js
|
packages/app-desktop/gui/NoteEditor/utils/useSearchMarkers.js
|
||||||
packages/app-desktop/gui/NoteEditor/utils/useWindowCommandHandler.js
|
packages/app-desktop/gui/NoteEditor/utils/useWindowCommandHandler.js
|
||||||
packages/app-desktop/gui/NoteList/NoteList.js
|
|
||||||
packages/app-desktop/gui/NoteList/NoteList2.js
|
packages/app-desktop/gui/NoteList/NoteList2.js
|
||||||
packages/app-desktop/gui/NoteList/NoteListSource.js
|
|
||||||
packages/app-desktop/gui/NoteList/commands/focusElementNoteList.js
|
packages/app-desktop/gui/NoteList/commands/focusElementNoteList.js
|
||||||
packages/app-desktop/gui/NoteList/commands/index.js
|
packages/app-desktop/gui/NoteList/commands/index.js
|
||||||
packages/app-desktop/gui/NoteList/utils/canManuallySortNotes.js
|
packages/app-desktop/gui/NoteList/utils/canManuallySortNotes.js
|
||||||
@@ -305,9 +339,18 @@ packages/app-desktop/gui/NoteList/utils/useVisibleRange.js
|
|||||||
packages/app-desktop/gui/NoteListControls/NoteListControls.js
|
packages/app-desktop/gui/NoteListControls/NoteListControls.js
|
||||||
packages/app-desktop/gui/NoteListControls/commands/focusSearch.js
|
packages/app-desktop/gui/NoteListControls/commands/focusSearch.js
|
||||||
packages/app-desktop/gui/NoteListControls/commands/index.js
|
packages/app-desktop/gui/NoteListControls/commands/index.js
|
||||||
packages/app-desktop/gui/NoteListItem.js
|
packages/app-desktop/gui/NoteListHeader/NoteListHeader.js
|
||||||
|
packages/app-desktop/gui/NoteListHeader/NoteListHeaderItem.js
|
||||||
|
packages/app-desktop/gui/NoteListHeader/types.js
|
||||||
|
packages/app-desktop/gui/NoteListHeader/useDragAndDrop.test.js
|
||||||
|
packages/app-desktop/gui/NoteListHeader/useDragAndDrop.js
|
||||||
|
packages/app-desktop/gui/NoteListHeader/utils/getColumnTitle.js
|
||||||
|
packages/app-desktop/gui/NoteListHeader/utils/useContextMenu.js
|
||||||
|
packages/app-desktop/gui/NoteListHeader/utils/validateColumns.test.js
|
||||||
|
packages/app-desktop/gui/NoteListHeader/utils/validateColumns.js
|
||||||
packages/app-desktop/gui/NoteListItem/NoteListItem.js
|
packages/app-desktop/gui/NoteListItem/NoteListItem.js
|
||||||
packages/app-desktop/gui/NoteListItem/utils/getNoteTitleHtml.js
|
packages/app-desktop/gui/NoteListItem/utils/getNoteTitleHtml.js
|
||||||
|
packages/app-desktop/gui/NoteListItem/utils/prepareViewProps.test.js
|
||||||
packages/app-desktop/gui/NoteListItem/utils/prepareViewProps.js
|
packages/app-desktop/gui/NoteListItem/utils/prepareViewProps.js
|
||||||
packages/app-desktop/gui/NoteListItem/utils/types.js
|
packages/app-desktop/gui/NoteListItem/utils/types.js
|
||||||
packages/app-desktop/gui/NoteListItem/utils/useItemElement.js
|
packages/app-desktop/gui/NoteListItem/utils/useItemElement.js
|
||||||
@@ -322,6 +365,7 @@ packages/app-desktop/gui/NoteSearchBar.js
|
|||||||
packages/app-desktop/gui/NoteStatusBar.js
|
packages/app-desktop/gui/NoteStatusBar.js
|
||||||
packages/app-desktop/gui/NoteTextViewer.js
|
packages/app-desktop/gui/NoteTextViewer.js
|
||||||
packages/app-desktop/gui/NoteToolbar/NoteToolbar.js
|
packages/app-desktop/gui/NoteToolbar/NoteToolbar.js
|
||||||
|
packages/app-desktop/gui/NotyfContext.js
|
||||||
packages/app-desktop/gui/OneDriveLoginScreen.js
|
packages/app-desktop/gui/OneDriveLoginScreen.js
|
||||||
packages/app-desktop/gui/PasswordInput/PasswordInput.js
|
packages/app-desktop/gui/PasswordInput/PasswordInput.js
|
||||||
packages/app-desktop/gui/PdfViewer.js
|
packages/app-desktop/gui/PdfViewer.js
|
||||||
@@ -366,6 +410,7 @@ packages/app-desktop/gui/ToolbarBase.js
|
|||||||
packages/app-desktop/gui/ToolbarButton/ToolbarButton.js
|
packages/app-desktop/gui/ToolbarButton/ToolbarButton.js
|
||||||
packages/app-desktop/gui/ToolbarButton/styles/index.js
|
packages/app-desktop/gui/ToolbarButton/styles/index.js
|
||||||
packages/app-desktop/gui/ToolbarSpace.js
|
packages/app-desktop/gui/ToolbarSpace.js
|
||||||
|
packages/app-desktop/gui/TrashNotification/TrashNotification.js
|
||||||
packages/app-desktop/gui/dialogs.js
|
packages/app-desktop/gui/dialogs.js
|
||||||
packages/app-desktop/gui/hooks/useEffectDebugger.js
|
packages/app-desktop/gui/hooks/useEffectDebugger.js
|
||||||
packages/app-desktop/gui/hooks/useImperativeHandlerDebugger.js
|
packages/app-desktop/gui/hooks/useImperativeHandlerDebugger.js
|
||||||
@@ -381,6 +426,7 @@ packages/app-desktop/gui/style/StyledMessage.js
|
|||||||
packages/app-desktop/gui/style/StyledTextInput.js
|
packages/app-desktop/gui/style/StyledTextInput.js
|
||||||
packages/app-desktop/gui/utils/NoteListUtils.js
|
packages/app-desktop/gui/utils/NoteListUtils.js
|
||||||
packages/app-desktop/gui/utils/convertToScreenCoordinates.js
|
packages/app-desktop/gui/utils/convertToScreenCoordinates.js
|
||||||
|
packages/app-desktop/gui/utils/dragAndDrop.js
|
||||||
packages/app-desktop/gui/utils/loadScript.js
|
packages/app-desktop/gui/utils/loadScript.js
|
||||||
packages/app-desktop/gulpfile.js
|
packages/app-desktop/gulpfile.js
|
||||||
packages/app-desktop/integration-tests/main.spec.js
|
packages/app-desktop/integration-tests/main.spec.js
|
||||||
@@ -392,6 +438,7 @@ packages/app-desktop/integration-tests/util/activateMainMenuItem.js
|
|||||||
packages/app-desktop/integration-tests/util/createStartupArgs.js
|
packages/app-desktop/integration-tests/util/createStartupArgs.js
|
||||||
packages/app-desktop/integration-tests/util/firstNonDevToolsWindow.js
|
packages/app-desktop/integration-tests/util/firstNonDevToolsWindow.js
|
||||||
packages/app-desktop/integration-tests/util/setFilePickerResponse.js
|
packages/app-desktop/integration-tests/util/setFilePickerResponse.js
|
||||||
|
packages/app-desktop/integration-tests/util/setMessageBoxResponse.js
|
||||||
packages/app-desktop/integration-tests/util/test.js
|
packages/app-desktop/integration-tests/util/test.js
|
||||||
packages/app-desktop/playwright.config.js
|
packages/app-desktop/playwright.config.js
|
||||||
packages/app-desktop/plugins/GotoAnything.js
|
packages/app-desktop/plugins/GotoAnything.js
|
||||||
@@ -413,7 +460,6 @@ packages/app-desktop/services/plugins/hooks/useThemeCss.js
|
|||||||
packages/app-desktop/services/plugins/hooks/useViewIsReady.js
|
packages/app-desktop/services/plugins/hooks/useViewIsReady.js
|
||||||
packages/app-desktop/services/plugins/hooks/useWebviewToPluginMessages.js
|
packages/app-desktop/services/plugins/hooks/useWebviewToPluginMessages.js
|
||||||
packages/app-desktop/services/restart.js
|
packages/app-desktop/services/restart.js
|
||||||
packages/app-desktop/services/share/invitationRespond.js
|
|
||||||
packages/app-desktop/services/sortOrder/PerFolderSortOrderService.test.js
|
packages/app-desktop/services/sortOrder/PerFolderSortOrderService.test.js
|
||||||
packages/app-desktop/services/sortOrder/PerFolderSortOrderService.js
|
packages/app-desktop/services/sortOrder/PerFolderSortOrderService.js
|
||||||
packages/app-desktop/services/sortOrder/notesSortOrderUtils.test.js
|
packages/app-desktop/services/sortOrder/notesSortOrderUtils.test.js
|
||||||
@@ -422,13 +468,22 @@ packages/app-desktop/services/spellChecker/SpellCheckerServiceDriverNative.js
|
|||||||
packages/app-desktop/tools/copy7Zip.js
|
packages/app-desktop/tools/copy7Zip.js
|
||||||
packages/app-desktop/tools/notarizeMacApp.js
|
packages/app-desktop/tools/notarizeMacApp.js
|
||||||
packages/app-desktop/tools/renameReleaseAssets.js
|
packages/app-desktop/tools/renameReleaseAssets.js
|
||||||
|
packages/app-desktop/utils/7zip/getPathToExecutable7Zip.js
|
||||||
|
packages/app-desktop/utils/7zip/pathToBundled7Zip.js
|
||||||
packages/app-desktop/utils/checkForUpdatesUtils.test.js
|
packages/app-desktop/utils/checkForUpdatesUtils.test.js
|
||||||
packages/app-desktop/utils/checkForUpdatesUtils.js
|
packages/app-desktop/utils/checkForUpdatesUtils.js
|
||||||
packages/app-desktop/utils/checkForUpdatesUtilsTestData.js
|
packages/app-desktop/utils/checkForUpdatesUtilsTestData.js
|
||||||
|
packages/app-desktop/utils/isSafeToOpen.test.js
|
||||||
|
packages/app-desktop/utils/isSafeToOpen.js
|
||||||
packages/app-desktop/utils/markupLanguageUtils.js
|
packages/app-desktop/utils/markupLanguageUtils.js
|
||||||
packages/app-desktop/utils/restartInSafeModeFromMain.test.js
|
packages/app-desktop/utils/restartInSafeModeFromMain.test.js
|
||||||
packages/app-desktop/utils/restartInSafeModeFromMain.js
|
packages/app-desktop/utils/restartInSafeModeFromMain.js
|
||||||
packages/app-mobile/PluginAssetsLoader.js
|
packages/app-mobile/PluginAssetsLoader.js
|
||||||
|
packages/app-mobile/commands/index.js
|
||||||
|
packages/app-mobile/commands/openItem.js
|
||||||
|
packages/app-mobile/commands/openNote.js
|
||||||
|
packages/app-mobile/commands/scrollToHash.js
|
||||||
|
packages/app-mobile/commands/util/goToNote.js
|
||||||
packages/app-mobile/components/ActionButton.js
|
packages/app-mobile/components/ActionButton.js
|
||||||
packages/app-mobile/components/BackButtonDialogBox.js
|
packages/app-mobile/components/BackButtonDialogBox.js
|
||||||
packages/app-mobile/components/CameraView.js
|
packages/app-mobile/components/CameraView.js
|
||||||
@@ -439,14 +494,24 @@ packages/app-mobile/components/ExtendedWebView.js
|
|||||||
packages/app-mobile/components/FolderPicker.js
|
packages/app-mobile/components/FolderPicker.js
|
||||||
packages/app-mobile/components/Icon.js
|
packages/app-mobile/components/Icon.js
|
||||||
packages/app-mobile/components/Modal.js
|
packages/app-mobile/components/Modal.js
|
||||||
|
packages/app-mobile/components/ModalDialog.js
|
||||||
packages/app-mobile/components/NoteBodyViewer/NoteBodyViewer.js
|
packages/app-mobile/components/NoteBodyViewer/NoteBodyViewer.js
|
||||||
|
packages/app-mobile/components/NoteBodyViewer/bundledJs/Renderer.test.js
|
||||||
|
packages/app-mobile/components/NoteBodyViewer/bundledJs/Renderer.js
|
||||||
|
packages/app-mobile/components/NoteBodyViewer/bundledJs/noteBodyViewerBundle.js
|
||||||
|
packages/app-mobile/components/NoteBodyViewer/bundledJs/types.js
|
||||||
|
packages/app-mobile/components/NoteBodyViewer/bundledJs/utils/addPluginAssets.js
|
||||||
|
packages/app-mobile/components/NoteBodyViewer/bundledJs/utils/makeResourceModel.js
|
||||||
|
packages/app-mobile/components/NoteBodyViewer/hooks/useContentScripts.js
|
||||||
packages/app-mobile/components/NoteBodyViewer/hooks/useEditPopup.test.js
|
packages/app-mobile/components/NoteBodyViewer/hooks/useEditPopup.test.js
|
||||||
packages/app-mobile/components/NoteBodyViewer/hooks/useEditPopup.js
|
packages/app-mobile/components/NoteBodyViewer/hooks/useEditPopup.js
|
||||||
packages/app-mobile/components/NoteBodyViewer/hooks/useOnMessage.js
|
packages/app-mobile/components/NoteBodyViewer/hooks/useOnMessage.js
|
||||||
packages/app-mobile/components/NoteBodyViewer/hooks/useOnResourceLongPress.js
|
packages/app-mobile/components/NoteBodyViewer/hooks/useOnResourceLongPress.js
|
||||||
|
packages/app-mobile/components/NoteBodyViewer/hooks/useRenderer.js
|
||||||
|
packages/app-mobile/components/NoteBodyViewer/hooks/useRerenderHandler.js
|
||||||
packages/app-mobile/components/NoteBodyViewer/hooks/useSource.js
|
packages/app-mobile/components/NoteBodyViewer/hooks/useSource.js
|
||||||
|
packages/app-mobile/components/NoteBodyViewer/types.js
|
||||||
packages/app-mobile/components/NoteEditor/CodeMirror/CodeMirror.js
|
packages/app-mobile/components/NoteEditor/CodeMirror/CodeMirror.js
|
||||||
packages/app-mobile/components/NoteEditor/CodeMirror/webviewLogger.js
|
|
||||||
packages/app-mobile/components/NoteEditor/EditLinkDialog.js
|
packages/app-mobile/components/NoteEditor/EditLinkDialog.js
|
||||||
packages/app-mobile/components/NoteEditor/ImageEditor/ImageEditor.js
|
packages/app-mobile/components/NoteEditor/ImageEditor/ImageEditor.js
|
||||||
packages/app-mobile/components/NoteEditor/ImageEditor/autosave.js
|
packages/app-mobile/components/NoteEditor/ImageEditor/autosave.js
|
||||||
@@ -464,16 +529,29 @@ packages/app-mobile/components/NoteEditor/MarkdownToolbar/ToggleSpaceButton.js
|
|||||||
packages/app-mobile/components/NoteEditor/MarkdownToolbar/Toolbar.js
|
packages/app-mobile/components/NoteEditor/MarkdownToolbar/Toolbar.js
|
||||||
packages/app-mobile/components/NoteEditor/MarkdownToolbar/ToolbarButton.js
|
packages/app-mobile/components/NoteEditor/MarkdownToolbar/ToolbarButton.js
|
||||||
packages/app-mobile/components/NoteEditor/MarkdownToolbar/ToolbarOverflowRows.js
|
packages/app-mobile/components/NoteEditor/MarkdownToolbar/ToolbarOverflowRows.js
|
||||||
|
packages/app-mobile/components/NoteEditor/MarkdownToolbar/buttons/useActionButtons.js
|
||||||
|
packages/app-mobile/components/NoteEditor/MarkdownToolbar/buttons/useHeaderButtons.js
|
||||||
|
packages/app-mobile/components/NoteEditor/MarkdownToolbar/buttons/useInlineFormattingButtons.js
|
||||||
|
packages/app-mobile/components/NoteEditor/MarkdownToolbar/buttons/useListButtons.js
|
||||||
|
packages/app-mobile/components/NoteEditor/MarkdownToolbar/buttons/usePluginButtons.js
|
||||||
packages/app-mobile/components/NoteEditor/MarkdownToolbar/types.js
|
packages/app-mobile/components/NoteEditor/MarkdownToolbar/types.js
|
||||||
packages/app-mobile/components/NoteEditor/NoteEditor.test.js
|
packages/app-mobile/components/NoteEditor/NoteEditor.test.js
|
||||||
packages/app-mobile/components/NoteEditor/NoteEditor.js
|
packages/app-mobile/components/NoteEditor/NoteEditor.js
|
||||||
packages/app-mobile/components/NoteEditor/SearchPanel.js
|
packages/app-mobile/components/NoteEditor/SearchPanel.js
|
||||||
|
packages/app-mobile/components/NoteEditor/commandDeclarations.js
|
||||||
|
packages/app-mobile/components/NoteEditor/hooks/useCodeMirrorPlugins.js
|
||||||
|
packages/app-mobile/components/NoteEditor/hooks/useEditorCommandHandler.test.js
|
||||||
|
packages/app-mobile/components/NoteEditor/hooks/useEditorCommandHandler.js
|
||||||
|
packages/app-mobile/components/NoteEditor/hooks/useKeyboardVisible.js
|
||||||
packages/app-mobile/components/NoteEditor/types.js
|
packages/app-mobile/components/NoteEditor/types.js
|
||||||
packages/app-mobile/components/NoteList.js
|
packages/app-mobile/components/NoteList.js
|
||||||
packages/app-mobile/components/ProfileSwitcher/ProfileEditor.js
|
packages/app-mobile/components/ProfileSwitcher/ProfileEditor.js
|
||||||
packages/app-mobile/components/ProfileSwitcher/ProfileSwitcher.js
|
packages/app-mobile/components/ProfileSwitcher/ProfileSwitcher.js
|
||||||
packages/app-mobile/components/ProfileSwitcher/useProfileConfig.js
|
packages/app-mobile/components/ProfileSwitcher/useProfileConfig.js
|
||||||
packages/app-mobile/components/ScreenHeader.js
|
packages/app-mobile/components/ScreenHeader/WarningBanner.test.js
|
||||||
|
packages/app-mobile/components/ScreenHeader/WarningBanner.js
|
||||||
|
packages/app-mobile/components/ScreenHeader/WarningBox.js
|
||||||
|
packages/app-mobile/components/ScreenHeader/index.js
|
||||||
packages/app-mobile/components/SelectDateTimeDialog.js
|
packages/app-mobile/components/SelectDateTimeDialog.js
|
||||||
packages/app-mobile/components/SideMenu.js
|
packages/app-mobile/components/SideMenu.js
|
||||||
packages/app-mobile/components/TextInput.js
|
packages/app-mobile/components/TextInput.js
|
||||||
@@ -484,15 +562,20 @@ packages/app-mobile/components/biometrics/biometricAuthenticate.js
|
|||||||
packages/app-mobile/components/biometrics/sensorInfo.js
|
packages/app-mobile/components/biometrics/sensorInfo.js
|
||||||
packages/app-mobile/components/getResponsiveValue.test.js
|
packages/app-mobile/components/getResponsiveValue.test.js
|
||||||
packages/app-mobile/components/getResponsiveValue.js
|
packages/app-mobile/components/getResponsiveValue.js
|
||||||
|
packages/app-mobile/components/global-style.js
|
||||||
packages/app-mobile/components/screens/ConfigScreen/ConfigScreen.js
|
packages/app-mobile/components/screens/ConfigScreen/ConfigScreen.js
|
||||||
packages/app-mobile/components/screens/ConfigScreen/FileSystemPathSelector.js
|
packages/app-mobile/components/screens/ConfigScreen/FileSystemPathSelector.js
|
||||||
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/ExportDebugReportButton.js
|
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/ExportDebugReportButton.js
|
||||||
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/ExportProfileButton.js
|
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/ExportProfileButton.js
|
||||||
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/NoteExportButton.test.js
|
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/NoteExportButton.test.js
|
||||||
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/NoteExportButton.js
|
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/NoteExportButton.js
|
||||||
|
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/NoteImportButton.js
|
||||||
|
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/TaskButton.js
|
||||||
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/utils/exportAllFolders.js
|
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/utils/exportAllFolders.js
|
||||||
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/utils/exportDebugReport.js
|
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/utils/exportDebugReport.js
|
||||||
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/utils/exportProfile.js
|
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/utils/exportProfile.js
|
||||||
|
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/utils/makeImportExportCacheDirectory.js
|
||||||
|
packages/app-mobile/components/screens/ConfigScreen/SectionDescription.js
|
||||||
packages/app-mobile/components/screens/ConfigScreen/SectionHeader.js
|
packages/app-mobile/components/screens/ConfigScreen/SectionHeader.js
|
||||||
packages/app-mobile/components/screens/ConfigScreen/SectionSelector.js
|
packages/app-mobile/components/screens/ConfigScreen/SectionSelector.js
|
||||||
packages/app-mobile/components/screens/ConfigScreen/SettingComponent.js
|
packages/app-mobile/components/screens/ConfigScreen/SettingComponent.js
|
||||||
@@ -500,16 +583,59 @@ packages/app-mobile/components/screens/ConfigScreen/SettingItem.js
|
|||||||
packages/app-mobile/components/screens/ConfigScreen/SettingsButton.js
|
packages/app-mobile/components/screens/ConfigScreen/SettingsButton.js
|
||||||
packages/app-mobile/components/screens/ConfigScreen/SettingsToggle.js
|
packages/app-mobile/components/screens/ConfigScreen/SettingsToggle.js
|
||||||
packages/app-mobile/components/screens/ConfigScreen/configScreenStyles.js
|
packages/app-mobile/components/screens/ConfigScreen/configScreenStyles.js
|
||||||
|
packages/app-mobile/components/screens/ConfigScreen/plugins/PluginBox/ActionButton.js
|
||||||
|
packages/app-mobile/components/screens/ConfigScreen/plugins/PluginBox/index.js
|
||||||
|
packages/app-mobile/components/screens/ConfigScreen/plugins/PluginStates.test.js
|
||||||
|
packages/app-mobile/components/screens/ConfigScreen/plugins/PluginStates.js
|
||||||
|
packages/app-mobile/components/screens/ConfigScreen/plugins/PluginToggle.js
|
||||||
|
packages/app-mobile/components/screens/ConfigScreen/plugins/PluginUploadButton.js
|
||||||
|
packages/app-mobile/components/screens/ConfigScreen/plugins/SearchPlugins.test.js
|
||||||
|
packages/app-mobile/components/screens/ConfigScreen/plugins/SearchPlugins.js
|
||||||
|
packages/app-mobile/components/screens/ConfigScreen/plugins/testUtils/newRepoApi.js
|
||||||
|
packages/app-mobile/components/screens/ConfigScreen/plugins/testUtils/pluginServiceSetup.js
|
||||||
|
packages/app-mobile/components/screens/ConfigScreen/plugins/utils/openWebsiteForPlugin.js
|
||||||
|
packages/app-mobile/components/screens/ConfigScreen/plugins/utils/useRepoApi.js
|
||||||
packages/app-mobile/components/screens/ConfigScreen/types.js
|
packages/app-mobile/components/screens/ConfigScreen/types.js
|
||||||
|
packages/app-mobile/components/screens/JoplinCloudLoginScreen.js
|
||||||
packages/app-mobile/components/screens/LogScreen.js
|
packages/app-mobile/components/screens/LogScreen.js
|
||||||
packages/app-mobile/components/screens/Note.js
|
packages/app-mobile/components/screens/Note.js
|
||||||
|
packages/app-mobile/components/screens/NoteTagsDialog.js
|
||||||
packages/app-mobile/components/screens/Notes.js
|
packages/app-mobile/components/screens/Notes.js
|
||||||
|
packages/app-mobile/components/screens/ShareManager/AcceptedShareItem.js
|
||||||
|
packages/app-mobile/components/screens/ShareManager/IncomingShareItem.js
|
||||||
|
packages/app-mobile/components/screens/ShareManager/index.test.js
|
||||||
|
packages/app-mobile/components/screens/ShareManager/index.js
|
||||||
packages/app-mobile/components/screens/UpgradeSyncTargetScreen.js
|
packages/app-mobile/components/screens/UpgradeSyncTargetScreen.js
|
||||||
packages/app-mobile/components/screens/encryption-config.js
|
packages/app-mobile/components/screens/encryption-config.js
|
||||||
packages/app-mobile/components/screens/search.js
|
packages/app-mobile/components/screens/search.js
|
||||||
|
packages/app-mobile/components/screens/status.js
|
||||||
packages/app-mobile/components/side-menu-content.js
|
packages/app-mobile/components/side-menu-content.js
|
||||||
packages/app-mobile/components/voiceTyping/VoiceTypingDialog.js
|
packages/app-mobile/components/voiceTyping/VoiceTypingDialog.js
|
||||||
packages/app-mobile/gulpfile.js
|
packages/app-mobile/gulpfile.js
|
||||||
|
packages/app-mobile/plugins/PlatformImplementation.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/PluginRunner.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/PluginRunnerWebView.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/backgroundPage/initializeDialogWebView.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/backgroundPage/initializePluginBackgroundIframe.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/backgroundPage/pluginRunnerBackgroundPage.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/backgroundPage/startStopPlugin.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/backgroundPage/utils/getFormData.test.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/backgroundPage/utils/getFormData.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/backgroundPage/utils/makeSandboxedIframe.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/backgroundPage/utils/reportUnhandledErrors.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/backgroundPage/utils/wrapConsoleLog.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/dialogs/PluginDialogManager.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/dialogs/PluginDialogWebView.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/dialogs/PluginPanelViewer.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/dialogs/PluginUserWebView.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/dialogs/hooks/useDialogMessenger.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/dialogs/hooks/useDialogSize.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/dialogs/hooks/useViewInfos.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/dialogs/hooks/useWebViewSetup.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/types.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/utils/createOnLogHandler.js
|
||||||
|
packages/app-mobile/plugins/hooks/usePlugin.js
|
||||||
|
packages/app-mobile/plugins/loadPlugins.js
|
||||||
packages/app-mobile/root.js
|
packages/app-mobile/root.js
|
||||||
packages/app-mobile/services/AlarmServiceDriver.android.js
|
packages/app-mobile/services/AlarmServiceDriver.android.js
|
||||||
packages/app-mobile/services/AlarmServiceDriver.ios.js
|
packages/app-mobile/services/AlarmServiceDriver.ios.js
|
||||||
@@ -526,22 +652,39 @@ packages/app-mobile/utils/ShareExtension.js
|
|||||||
packages/app-mobile/utils/ShareUtils.test.js
|
packages/app-mobile/utils/ShareUtils.test.js
|
||||||
packages/app-mobile/utils/ShareUtils.js
|
packages/app-mobile/utils/ShareUtils.js
|
||||||
packages/app-mobile/utils/TlsUtils.js
|
packages/app-mobile/utils/TlsUtils.js
|
||||||
|
packages/app-mobile/utils/appDefaultState.js
|
||||||
packages/app-mobile/utils/autodetectTheme.js
|
packages/app-mobile/utils/autodetectTheme.js
|
||||||
packages/app-mobile/utils/checkPermissions.js
|
packages/app-mobile/utils/checkPermissions.js
|
||||||
packages/app-mobile/utils/createRootStyle.js
|
packages/app-mobile/utils/createRootStyle.js
|
||||||
packages/app-mobile/utils/debounce.js
|
packages/app-mobile/utils/debounce.js
|
||||||
|
packages/app-mobile/utils/fs-driver/constants.js
|
||||||
packages/app-mobile/utils/fs-driver/fs-driver-rn.js
|
packages/app-mobile/utils/fs-driver/fs-driver-rn.js
|
||||||
packages/app-mobile/utils/fs-driver/runOnDeviceTests.js
|
packages/app-mobile/utils/fs-driver/runOnDeviceTests.js
|
||||||
|
packages/app-mobile/utils/fs-driver/tarCreate.js
|
||||||
|
packages/app-mobile/utils/fs-driver/tarExtract.test.js
|
||||||
|
packages/app-mobile/utils/fs-driver/tarExtract.js
|
||||||
|
packages/app-mobile/utils/fs-driver/testUtil/createFilesFromPathRecord.js
|
||||||
|
packages/app-mobile/utils/fs-driver/testUtil/verifyDirectoryMatches.js
|
||||||
|
packages/app-mobile/utils/initializeCommandService.js
|
||||||
|
packages/app-mobile/utils/ipc/RNToWebViewMessenger.js
|
||||||
|
packages/app-mobile/utils/ipc/WebViewToRNMessenger.js
|
||||||
|
packages/app-mobile/utils/pickDocument.js
|
||||||
|
packages/app-mobile/utils/polyfills/bufferPolyfill.js
|
||||||
|
packages/app-mobile/utils/polyfills/index.js
|
||||||
packages/app-mobile/utils/setupNotifications.js
|
packages/app-mobile/utils/setupNotifications.js
|
||||||
packages/app-mobile/utils/shareHandler.js
|
packages/app-mobile/utils/shareHandler.js
|
||||||
|
packages/app-mobile/utils/showMessageBox.js
|
||||||
|
packages/app-mobile/utils/testing/createMockReduxStore.js
|
||||||
packages/app-mobile/utils/types.js
|
packages/app-mobile/utils/types.js
|
||||||
packages/default-plugins/build.js
|
packages/default-plugins/build.js
|
||||||
packages/default-plugins/buildDefaultPlugins.js
|
packages/default-plugins/buildDefaultPlugins.js
|
||||||
packages/default-plugins/commands/buildAll.js
|
packages/default-plugins/commands/buildAll.js
|
||||||
packages/default-plugins/commands/editPatch.js
|
packages/default-plugins/commands/editPatch.js
|
||||||
|
packages/default-plugins/utils/getCurrentCommitHash.js
|
||||||
packages/default-plugins/utils/getPathToPatchFileFor.js
|
packages/default-plugins/utils/getPathToPatchFileFor.js
|
||||||
packages/default-plugins/utils/readRepositoryJson.js
|
packages/default-plugins/utils/readRepositoryJson.js
|
||||||
packages/default-plugins/utils/waitForCliInput.js
|
packages/default-plugins/utils/waitForCliInput.js
|
||||||
|
packages/editor/CodeMirror/CodeMirror5Emulation/CodeMirror5BuiltInOptions.js
|
||||||
packages/editor/CodeMirror/CodeMirror5Emulation/CodeMirror5Emulation.test.js
|
packages/editor/CodeMirror/CodeMirror5Emulation/CodeMirror5Emulation.test.js
|
||||||
packages/editor/CodeMirror/CodeMirror5Emulation/CodeMirror5Emulation.js
|
packages/editor/CodeMirror/CodeMirror5Emulation/CodeMirror5Emulation.js
|
||||||
packages/editor/CodeMirror/CodeMirror5Emulation/Decorator.js
|
packages/editor/CodeMirror/CodeMirror5Emulation/Decorator.js
|
||||||
@@ -550,12 +693,23 @@ packages/editor/CodeMirror/CodeMirrorControl.js
|
|||||||
packages/editor/CodeMirror/configFromSettings.js
|
packages/editor/CodeMirror/configFromSettings.js
|
||||||
packages/editor/CodeMirror/createEditor.test.js
|
packages/editor/CodeMirror/createEditor.test.js
|
||||||
packages/editor/CodeMirror/createEditor.js
|
packages/editor/CodeMirror/createEditor.js
|
||||||
|
packages/editor/CodeMirror/editorCommands/duplicateLine.test.js
|
||||||
|
packages/editor/CodeMirror/editorCommands/duplicateLine.js
|
||||||
packages/editor/CodeMirror/editorCommands/editorCommands.js
|
packages/editor/CodeMirror/editorCommands/editorCommands.js
|
||||||
|
packages/editor/CodeMirror/editorCommands/insertLineAfter.test.js
|
||||||
|
packages/editor/CodeMirror/editorCommands/insertLineAfter.js
|
||||||
|
packages/editor/CodeMirror/editorCommands/sortSelectedLines.test.js
|
||||||
|
packages/editor/CodeMirror/editorCommands/sortSelectedLines.js
|
||||||
packages/editor/CodeMirror/editorCommands/supportsCommand.js
|
packages/editor/CodeMirror/editorCommands/supportsCommand.js
|
||||||
|
packages/editor/CodeMirror/editorCommands/swapLine.test.js
|
||||||
packages/editor/CodeMirror/editorCommands/swapLine.js
|
packages/editor/CodeMirror/editorCommands/swapLine.js
|
||||||
packages/editor/CodeMirror/getScrollFraction.js
|
packages/editor/CodeMirror/getScrollFraction.js
|
||||||
|
packages/editor/CodeMirror/markdown/codeBlockLanguages/allLanguages.js
|
||||||
|
packages/editor/CodeMirror/markdown/codeBlockLanguages/defaultLanguage.js
|
||||||
|
packages/editor/CodeMirror/markdown/codeBlockLanguages/lookUpLanguage.js
|
||||||
packages/editor/CodeMirror/markdown/computeSelectionFormatting.test.js
|
packages/editor/CodeMirror/markdown/computeSelectionFormatting.test.js
|
||||||
packages/editor/CodeMirror/markdown/computeSelectionFormatting.js
|
packages/editor/CodeMirror/markdown/computeSelectionFormatting.js
|
||||||
|
packages/editor/CodeMirror/markdown/decoratorExtension.test.js
|
||||||
packages/editor/CodeMirror/markdown/decoratorExtension.js
|
packages/editor/CodeMirror/markdown/decoratorExtension.js
|
||||||
packages/editor/CodeMirror/markdown/markdownCommands.bulletedVsChecklist.test.js
|
packages/editor/CodeMirror/markdown/markdownCommands.bulletedVsChecklist.test.js
|
||||||
packages/editor/CodeMirror/markdown/markdownCommands.test.js
|
packages/editor/CodeMirror/markdown/markdownCommands.test.js
|
||||||
@@ -565,15 +719,20 @@ packages/editor/CodeMirror/markdown/markdownMathParser.test.js
|
|||||||
packages/editor/CodeMirror/markdown/markdownMathParser.js
|
packages/editor/CodeMirror/markdown/markdownMathParser.js
|
||||||
packages/editor/CodeMirror/markdown/markdownReformatter.test.js
|
packages/editor/CodeMirror/markdown/markdownReformatter.test.js
|
||||||
packages/editor/CodeMirror/markdown/markdownReformatter.js
|
packages/editor/CodeMirror/markdown/markdownReformatter.js
|
||||||
packages/editor/CodeMirror/markdown/syntaxHighlightingLanguages.js
|
|
||||||
packages/editor/CodeMirror/pluginApi/PluginLoader.js
|
packages/editor/CodeMirror/pluginApi/PluginLoader.js
|
||||||
packages/editor/CodeMirror/pluginApi/codeMirrorRequire.js
|
packages/editor/CodeMirror/pluginApi/codeMirrorRequire.js
|
||||||
|
packages/editor/CodeMirror/pluginApi/customEditorCompletion.test.js
|
||||||
|
packages/editor/CodeMirror/pluginApi/customEditorCompletion.js
|
||||||
|
packages/editor/CodeMirror/testUtil/createEditorControl.js
|
||||||
packages/editor/CodeMirror/testUtil/createEditorSettings.js
|
packages/editor/CodeMirror/testUtil/createEditorSettings.js
|
||||||
packages/editor/CodeMirror/testUtil/createTestEditor.js
|
packages/editor/CodeMirror/testUtil/createTestEditor.js
|
||||||
packages/editor/CodeMirror/testUtil/forceFullParse.js
|
packages/editor/CodeMirror/testUtil/forceFullParse.js
|
||||||
packages/editor/CodeMirror/testUtil/loadLanguages.js
|
packages/editor/CodeMirror/testUtil/loadLanguages.js
|
||||||
|
packages/editor/CodeMirror/testUtil/pressReleaseKey.js
|
||||||
|
packages/editor/CodeMirror/testUtil/typeText.js
|
||||||
packages/editor/CodeMirror/theme.js
|
packages/editor/CodeMirror/theme.js
|
||||||
packages/editor/CodeMirror/util/isInSyntaxNode.js
|
packages/editor/CodeMirror/util/isInSyntaxNode.js
|
||||||
|
packages/editor/CodeMirror/util/setupVim.js
|
||||||
packages/editor/SelectionFormatting.js
|
packages/editor/SelectionFormatting.js
|
||||||
packages/editor/events.js
|
packages/editor/events.js
|
||||||
packages/editor/types.js
|
packages/editor/types.js
|
||||||
@@ -596,6 +755,7 @@ packages/generator-joplin/generators/app/templates/api/noteListType.js
|
|||||||
packages/generator-joplin/generators/app/templates/api/types.js
|
packages/generator-joplin/generators/app/templates/api/types.js
|
||||||
packages/generator-joplin/generators/app/templates/api_index.js
|
packages/generator-joplin/generators/app/templates/api_index.js
|
||||||
packages/generator-joplin/generators/app/templates/src/index.js
|
packages/generator-joplin/generators/app/templates/src/index.js
|
||||||
|
packages/generator-joplin/tools/updateCategories.js
|
||||||
packages/htmlpack/src/index.js
|
packages/htmlpack/src/index.js
|
||||||
packages/lib/ArrayUtils.js
|
packages/lib/ArrayUtils.js
|
||||||
packages/lib/AsyncActionQueue.js
|
packages/lib/AsyncActionQueue.js
|
||||||
@@ -635,21 +795,31 @@ packages/lib/commands/openMasterPasswordDialog.js
|
|||||||
packages/lib/commands/synchronize.js
|
packages/lib/commands/synchronize.js
|
||||||
packages/lib/components/EncryptionConfigScreen/utils.js
|
packages/lib/components/EncryptionConfigScreen/utils.js
|
||||||
packages/lib/components/shared/config/config-shared.js
|
packages/lib/components/shared/config/config-shared.js
|
||||||
|
packages/lib/components/shared/config/plugins/types.js
|
||||||
|
packages/lib/components/shared/config/plugins/useOnDeleteHandler.js
|
||||||
|
packages/lib/components/shared/config/plugins/useOnInstallHandler.test.js
|
||||||
|
packages/lib/components/shared/config/plugins/useOnInstallHandler.js
|
||||||
packages/lib/components/shared/config/shouldShowMissingPasswordWarning.test.js
|
packages/lib/components/shared/config/shouldShowMissingPasswordWarning.test.js
|
||||||
packages/lib/components/shared/config/shouldShowMissingPasswordWarning.js
|
packages/lib/components/shared/config/shouldShowMissingPasswordWarning.js
|
||||||
packages/lib/components/shared/note-screen-shared.js
|
packages/lib/components/shared/note-screen-shared.js
|
||||||
packages/lib/components/shared/reduxSharedMiddleware.js
|
packages/lib/components/shared/reduxSharedMiddleware.js
|
||||||
|
packages/lib/components/shared/side-menu-shared.test.js
|
||||||
|
packages/lib/components/shared/side-menu-shared.js
|
||||||
packages/lib/database-driver-better-sqlite.js
|
packages/lib/database-driver-better-sqlite.js
|
||||||
packages/lib/database.js
|
packages/lib/database.js
|
||||||
packages/lib/debug/DebugService.js
|
packages/lib/debug/DebugService.js
|
||||||
|
packages/lib/determineBaseAppDirs.js
|
||||||
packages/lib/dom.js
|
packages/lib/dom.js
|
||||||
|
packages/lib/downloadController.js
|
||||||
packages/lib/errorUtils.js
|
packages/lib/errorUtils.js
|
||||||
packages/lib/errors.js
|
packages/lib/errors.js
|
||||||
packages/lib/eventManager.js
|
packages/lib/eventManager.js
|
||||||
packages/lib/file-api-driver-joplinServer.js
|
packages/lib/file-api-driver-joplinServer.js
|
||||||
packages/lib/file-api-driver-memory.js
|
packages/lib/file-api-driver-memory.js
|
||||||
packages/lib/file-api-driver.test.js
|
packages/lib/file-api-driver.test.js
|
||||||
|
packages/lib/file-api.test.js
|
||||||
packages/lib/file-api.js
|
packages/lib/file-api.js
|
||||||
|
packages/lib/folders-screen-utils.js
|
||||||
packages/lib/fs-driver-base.js
|
packages/lib/fs-driver-base.js
|
||||||
packages/lib/fs-driver-node.js
|
packages/lib/fs-driver-node.js
|
||||||
packages/lib/fsDriver.test.js
|
packages/lib/fsDriver.test.js
|
||||||
@@ -657,6 +827,7 @@ packages/lib/geolocation-node.js
|
|||||||
packages/lib/hooks/useAsyncEffect.js
|
packages/lib/hooks/useAsyncEffect.js
|
||||||
packages/lib/hooks/useElementSize.js
|
packages/lib/hooks/useElementSize.js
|
||||||
packages/lib/hooks/useEventListener.js
|
packages/lib/hooks/useEventListener.js
|
||||||
|
packages/lib/hooks/usePrevious.js
|
||||||
packages/lib/htmlUtils.test.js
|
packages/lib/htmlUtils.test.js
|
||||||
packages/lib/htmlUtils.js
|
packages/lib/htmlUtils.js
|
||||||
packages/lib/htmlUtils2.test.js
|
packages/lib/htmlUtils2.test.js
|
||||||
@@ -697,19 +868,29 @@ packages/lib/models/Search.js
|
|||||||
packages/lib/models/Setting.test.js
|
packages/lib/models/Setting.test.js
|
||||||
packages/lib/models/Setting.js
|
packages/lib/models/Setting.js
|
||||||
packages/lib/models/SmartFilter.js
|
packages/lib/models/SmartFilter.js
|
||||||
|
packages/lib/models/Tag.test.js
|
||||||
packages/lib/models/Tag.js
|
packages/lib/models/Tag.js
|
||||||
packages/lib/models/dateTimeFormats.test.js
|
packages/lib/models/dateTimeFormats.test.js
|
||||||
packages/lib/models/settings/FileHandler.js
|
packages/lib/models/settings/FileHandler.js
|
||||||
|
packages/lib/models/settings/settingValidations.test.js
|
||||||
|
packages/lib/models/settings/settingValidations.js
|
||||||
|
packages/lib/models/utils/getCollator.js
|
||||||
|
packages/lib/models/utils/getConflictFolderId.js
|
||||||
packages/lib/models/utils/isItemId.js
|
packages/lib/models/utils/isItemId.js
|
||||||
packages/lib/models/utils/itemCanBeEncrypted.js
|
packages/lib/models/utils/itemCanBeEncrypted.js
|
||||||
|
packages/lib/models/utils/onFolderDrop.test.js
|
||||||
|
packages/lib/models/utils/onFolderDrop.js
|
||||||
packages/lib/models/utils/paginatedFeed.js
|
packages/lib/models/utils/paginatedFeed.js
|
||||||
packages/lib/models/utils/paginationToSql.js
|
packages/lib/models/utils/paginationToSql.js
|
||||||
|
packages/lib/models/utils/readOnly.test.js
|
||||||
packages/lib/models/utils/readOnly.js
|
packages/lib/models/utils/readOnly.js
|
||||||
|
packages/lib/models/utils/resourceUtils.js
|
||||||
packages/lib/models/utils/types.js
|
packages/lib/models/utils/types.js
|
||||||
packages/lib/models/utils/userData.test.js
|
packages/lib/models/utils/userData.test.js
|
||||||
packages/lib/models/utils/userData.js
|
packages/lib/models/utils/userData.js
|
||||||
packages/lib/net-utils.js
|
packages/lib/net-utils.js
|
||||||
packages/lib/ntp.js
|
packages/lib/ntp.js
|
||||||
|
packages/lib/onedrive-api.test.js
|
||||||
packages/lib/onedrive-api.js
|
packages/lib/onedrive-api.js
|
||||||
packages/lib/path-utils.js
|
packages/lib/path-utils.js
|
||||||
packages/lib/reducer.js
|
packages/lib/reducer.js
|
||||||
@@ -731,6 +912,7 @@ packages/lib/services/KvStore.js
|
|||||||
packages/lib/services/MigrationService.js
|
packages/lib/services/MigrationService.js
|
||||||
packages/lib/services/NavService.js
|
packages/lib/services/NavService.js
|
||||||
packages/lib/services/PostMessageService.js
|
packages/lib/services/PostMessageService.js
|
||||||
|
packages/lib/services/ReportService.test.js
|
||||||
packages/lib/services/ReportService.js
|
packages/lib/services/ReportService.js
|
||||||
packages/lib/services/ResourceEditWatcher/index.js
|
packages/lib/services/ResourceEditWatcher/index.js
|
||||||
packages/lib/services/ResourceEditWatcher/reducer.js
|
packages/lib/services/ResourceEditWatcher/reducer.js
|
||||||
@@ -752,10 +934,14 @@ packages/lib/services/commands/propsHaveChanged.js
|
|||||||
packages/lib/services/commands/stateToWhenClauseContext.js
|
packages/lib/services/commands/stateToWhenClauseContext.js
|
||||||
packages/lib/services/contextkey/contextkey.js
|
packages/lib/services/contextkey/contextkey.js
|
||||||
packages/lib/services/database/addMigrationFile.js
|
packages/lib/services/database/addMigrationFile.js
|
||||||
|
packages/lib/services/database/isSqliteSyntaxError.js
|
||||||
packages/lib/services/database/migrations/42.js
|
packages/lib/services/database/migrations/42.js
|
||||||
packages/lib/services/database/migrations/43.js
|
packages/lib/services/database/migrations/43.js
|
||||||
packages/lib/services/database/migrations/44.js
|
packages/lib/services/database/migrations/44.js
|
||||||
packages/lib/services/database/migrations/45.js
|
packages/lib/services/database/migrations/45.js
|
||||||
|
packages/lib/services/database/migrations/46.js
|
||||||
|
packages/lib/services/database/migrations/47.js
|
||||||
|
packages/lib/services/database/migrations/index.js
|
||||||
packages/lib/services/database/sqlStringToLines.js
|
packages/lib/services/database/sqlStringToLines.js
|
||||||
packages/lib/services/database/types.js
|
packages/lib/services/database/types.js
|
||||||
packages/lib/services/debug/populateDatabase.js
|
packages/lib/services/debug/populateDatabase.js
|
||||||
@@ -794,6 +980,7 @@ packages/lib/services/interop/InteropService_Importer_Raw.js
|
|||||||
packages/lib/services/interop/Module.test.js
|
packages/lib/services/interop/Module.test.js
|
||||||
packages/lib/services/interop/Module.js
|
packages/lib/services/interop/Module.js
|
||||||
packages/lib/services/interop/types.js
|
packages/lib/services/interop/types.js
|
||||||
|
packages/lib/services/joplinCloudUtils.js
|
||||||
packages/lib/services/joplinServer/personalizedUserContentBaseUrl.js
|
packages/lib/services/joplinServer/personalizedUserContentBaseUrl.js
|
||||||
packages/lib/services/keychain/KeychainService.js
|
packages/lib/services/keychain/KeychainService.js
|
||||||
packages/lib/services/keychain/KeychainServiceDriver.dummy.js
|
packages/lib/services/keychain/KeychainServiceDriver.dummy.js
|
||||||
@@ -802,6 +989,12 @@ packages/lib/services/keychain/KeychainServiceDriver.node.js
|
|||||||
packages/lib/services/keychain/KeychainServiceDriverBase.js
|
packages/lib/services/keychain/KeychainServiceDriverBase.js
|
||||||
packages/lib/services/noteList/defaultLeftToRightListRenderer.js
|
packages/lib/services/noteList/defaultLeftToRightListRenderer.js
|
||||||
packages/lib/services/noteList/defaultListRenderer.js
|
packages/lib/services/noteList/defaultListRenderer.js
|
||||||
|
packages/lib/services/noteList/defaultMultiColumnsRenderer.js
|
||||||
|
packages/lib/services/noteList/depNameToNoteProp.js
|
||||||
|
packages/lib/services/noteList/renderTemplate.test.js
|
||||||
|
packages/lib/services/noteList/renderTemplate.js
|
||||||
|
packages/lib/services/noteList/renderViewProps.test.js
|
||||||
|
packages/lib/services/noteList/renderViewProps.js
|
||||||
packages/lib/services/noteList/renderers.js
|
packages/lib/services/noteList/renderers.js
|
||||||
packages/lib/services/ocr/OcrDriverBase.js
|
packages/lib/services/ocr/OcrDriverBase.js
|
||||||
packages/lib/services/ocr/OcrService.test.js
|
packages/lib/services/ocr/OcrService.test.js
|
||||||
@@ -847,6 +1040,13 @@ packages/lib/services/plugins/defaultPlugins/desktopDefaultPluginsInfo.js
|
|||||||
packages/lib/services/plugins/reducer.js
|
packages/lib/services/plugins/reducer.js
|
||||||
packages/lib/services/plugins/utils/createViewHandle.js
|
packages/lib/services/plugins/utils/createViewHandle.js
|
||||||
packages/lib/services/plugins/utils/executeSandboxCall.js
|
packages/lib/services/plugins/utils/executeSandboxCall.js
|
||||||
|
packages/lib/services/plugins/utils/getPluginNamespacedSettingKey.js
|
||||||
|
packages/lib/services/plugins/utils/getPluginSettingKeyPrefix.js
|
||||||
|
packages/lib/services/plugins/utils/getPluginSettingValue.js
|
||||||
|
packages/lib/services/plugins/utils/isCompatible/index.test.js
|
||||||
|
packages/lib/services/plugins/utils/isCompatible/index.js
|
||||||
|
packages/lib/services/plugins/utils/isCompatible/minVersionForPlatform.js
|
||||||
|
packages/lib/services/plugins/utils/isCompatible/types.js
|
||||||
packages/lib/services/plugins/utils/loadContentScripts.js
|
packages/lib/services/plugins/utils/loadContentScripts.js
|
||||||
packages/lib/services/plugins/utils/makeListener.js
|
packages/lib/services/plugins/utils/makeListener.js
|
||||||
packages/lib/services/plugins/utils/manifestFromObject.js
|
packages/lib/services/plugins/utils/manifestFromObject.js
|
||||||
@@ -854,6 +1054,8 @@ packages/lib/services/plugins/utils/mapEventHandlersToIds.js
|
|||||||
packages/lib/services/plugins/utils/types.js
|
packages/lib/services/plugins/utils/types.js
|
||||||
packages/lib/services/plugins/utils/validatePluginId.test.js
|
packages/lib/services/plugins/utils/validatePluginId.test.js
|
||||||
packages/lib/services/plugins/utils/validatePluginId.js
|
packages/lib/services/plugins/utils/validatePluginId.js
|
||||||
|
packages/lib/services/plugins/utils/validatePluginPlatforms.test.js
|
||||||
|
packages/lib/services/plugins/utils/validatePluginPlatforms.js
|
||||||
packages/lib/services/plugins/utils/validatePluginVersion.test.js
|
packages/lib/services/plugins/utils/validatePluginVersion.test.js
|
||||||
packages/lib/services/plugins/utils/validatePluginVersion.js
|
packages/lib/services/plugins/utils/validatePluginVersion.js
|
||||||
packages/lib/services/profileConfig/index.test.js
|
packages/lib/services/profileConfig/index.test.js
|
||||||
@@ -869,6 +1071,7 @@ packages/lib/services/rest/actionApi.desktop.js
|
|||||||
packages/lib/services/rest/routes/auth.js
|
packages/lib/services/rest/routes/auth.js
|
||||||
packages/lib/services/rest/routes/events.test.js
|
packages/lib/services/rest/routes/events.test.js
|
||||||
packages/lib/services/rest/routes/events.js
|
packages/lib/services/rest/routes/events.js
|
||||||
|
packages/lib/services/rest/routes/folders.test.js
|
||||||
packages/lib/services/rest/routes/folders.js
|
packages/lib/services/rest/routes/folders.js
|
||||||
packages/lib/services/rest/routes/master_keys.js
|
packages/lib/services/rest/routes/master_keys.js
|
||||||
packages/lib/services/rest/routes/notes.test.js
|
packages/lib/services/rest/routes/notes.test.js
|
||||||
@@ -887,18 +1090,20 @@ packages/lib/services/rest/utils/paginatedResults.js
|
|||||||
packages/lib/services/rest/utils/readonlyProperties.js
|
packages/lib/services/rest/utils/readonlyProperties.js
|
||||||
packages/lib/services/rest/utils/requestFields.js
|
packages/lib/services/rest/utils/requestFields.js
|
||||||
packages/lib/services/rest/utils/requestPaginationOptions.js
|
packages/lib/services/rest/utils/requestPaginationOptions.js
|
||||||
packages/lib/services/searchengine/SearchEngine.resources.test.js
|
packages/lib/services/search/SearchEngine.resources.test.js
|
||||||
packages/lib/services/searchengine/SearchEngine.js
|
packages/lib/services/search/SearchEngine.test.js
|
||||||
packages/lib/services/searchengine/SearchEngineUtils.test.js
|
packages/lib/services/search/SearchEngine.js
|
||||||
packages/lib/services/searchengine/SearchEngineUtils.js
|
packages/lib/services/search/SearchEngineUtils.test.js
|
||||||
packages/lib/services/searchengine/SearchFilter.test.js
|
packages/lib/services/search/SearchEngineUtils.js
|
||||||
packages/lib/services/searchengine/filterParser.test.js
|
packages/lib/services/search/SearchFilter.test.js
|
||||||
packages/lib/services/searchengine/filterParser.js
|
packages/lib/services/search/filterParser.test.js
|
||||||
packages/lib/services/searchengine/gotoAnythingStyleQuery.test.js
|
packages/lib/services/search/filterParser.js
|
||||||
packages/lib/services/searchengine/gotoAnythingStyleQuery.js
|
packages/lib/services/search/gotoAnythingStyleQuery.test.js
|
||||||
packages/lib/services/searchengine/queryBuilder.js
|
packages/lib/services/search/gotoAnythingStyleQuery.js
|
||||||
|
packages/lib/services/search/queryBuilder.js
|
||||||
packages/lib/services/share/ShareService.test.js
|
packages/lib/services/share/ShareService.test.js
|
||||||
packages/lib/services/share/ShareService.js
|
packages/lib/services/share/ShareService.js
|
||||||
|
packages/lib/services/share/invitationRespond.js
|
||||||
packages/lib/services/share/reducer.js
|
packages/lib/services/share/reducer.js
|
||||||
packages/lib/services/spellChecker/SpellCheckerService.js
|
packages/lib/services/spellChecker/SpellCheckerService.js
|
||||||
packages/lib/services/spellChecker/SpellCheckerServiceDriverBase.js
|
packages/lib/services/spellChecker/SpellCheckerServiceDriverBase.js
|
||||||
@@ -930,13 +1135,28 @@ packages/lib/services/synchronizer/syncInfoUtils.js
|
|||||||
packages/lib/services/synchronizer/synchronizer_LockHandler.test.js
|
packages/lib/services/synchronizer/synchronizer_LockHandler.test.js
|
||||||
packages/lib/services/synchronizer/synchronizer_MigrationHandler.test.js
|
packages/lib/services/synchronizer/synchronizer_MigrationHandler.test.js
|
||||||
packages/lib/services/synchronizer/tools.js
|
packages/lib/services/synchronizer/tools.js
|
||||||
|
packages/lib/services/synchronizer/utils/checkDisabledSyncItemsNotification.js
|
||||||
packages/lib/services/synchronizer/utils/handleConflictAction.js
|
packages/lib/services/synchronizer/utils/handleConflictAction.js
|
||||||
packages/lib/services/synchronizer/utils/handleSyncStartupOperation.js
|
packages/lib/services/synchronizer/utils/handleSyncStartupOperation.js
|
||||||
packages/lib/services/synchronizer/utils/resourceRemotePath.js
|
packages/lib/services/synchronizer/utils/resourceRemotePath.js
|
||||||
packages/lib/services/synchronizer/utils/syncDeleteStep.js
|
packages/lib/services/synchronizer/utils/syncDeleteStep.js
|
||||||
packages/lib/services/synchronizer/utils/types.js
|
packages/lib/services/synchronizer/utils/types.js
|
||||||
|
packages/lib/services/trash/emptyTrash.test.js
|
||||||
|
packages/lib/services/trash/emptyTrash.js
|
||||||
|
packages/lib/services/trash/getTrashFolderId.js
|
||||||
|
packages/lib/services/trash/index.test.js
|
||||||
|
packages/lib/services/trash/index.js
|
||||||
|
packages/lib/services/trash/isTrashableItem.js
|
||||||
|
packages/lib/services/trash/permanentlyDeleteOldItems.test.js
|
||||||
|
packages/lib/services/trash/permanentlyDeleteOldItems.js
|
||||||
|
packages/lib/services/trash/restoreItems.test.js
|
||||||
|
packages/lib/services/trash/restoreItems.js
|
||||||
packages/lib/shim-init-node.js
|
packages/lib/shim-init-node.js
|
||||||
packages/lib/shim.js
|
packages/lib/shim.js
|
||||||
|
packages/lib/string-utils.test.js
|
||||||
|
packages/lib/string-utils.js
|
||||||
|
packages/lib/testing/share/makeMockShareInvitation.js
|
||||||
|
packages/lib/testing/share/mockShareService.js
|
||||||
packages/lib/testing/syncTargetUtils.js
|
packages/lib/testing/syncTargetUtils.js
|
||||||
packages/lib/testing/test-utils-synchronizer.js
|
packages/lib/testing/test-utils-synchronizer.js
|
||||||
packages/lib/testing/test-utils.js
|
packages/lib/testing/test-utils.js
|
||||||
@@ -952,9 +1172,24 @@ packages/lib/themes/solarizedLight.js
|
|||||||
packages/lib/themes/type.js
|
packages/lib/themes/type.js
|
||||||
packages/lib/time.js
|
packages/lib/time.js
|
||||||
packages/lib/types.js
|
packages/lib/types.js
|
||||||
|
packages/lib/utils/ActionLogger.test.js
|
||||||
|
packages/lib/utils/ActionLogger.js
|
||||||
packages/lib/utils/credentialFiles.js
|
packages/lib/utils/credentialFiles.js
|
||||||
|
packages/lib/utils/focusHandler.js
|
||||||
|
packages/lib/utils/ipc/RemoteMessenger.test.js
|
||||||
|
packages/lib/utils/ipc/RemoteMessenger.js
|
||||||
|
packages/lib/utils/ipc/TestMessenger.js
|
||||||
|
packages/lib/utils/ipc/WindowMessenger.js
|
||||||
|
packages/lib/utils/ipc/types.js
|
||||||
|
packages/lib/utils/ipc/utils/mergeCallbacksAndSerializable.test.js
|
||||||
|
packages/lib/utils/ipc/utils/mergeCallbacksAndSerializable.js
|
||||||
|
packages/lib/utils/ipc/utils/separateCallbacksFromSerializable.test.js
|
||||||
|
packages/lib/utils/ipc/utils/separateCallbacksFromSerializable.js
|
||||||
|
packages/lib/utils/ipc/utils/separateCallbacksFromSerializableArray.js
|
||||||
packages/lib/utils/joplinCloud.js
|
packages/lib/utils/joplinCloud.js
|
||||||
packages/lib/utils/processStartFlags.js
|
packages/lib/utils/processStartFlags.js
|
||||||
|
packages/lib/utils/replaceUnsupportedCharacters.test.js
|
||||||
|
packages/lib/utils/replaceUnsupportedCharacters.js
|
||||||
packages/lib/utils/userFetcher.js
|
packages/lib/utils/userFetcher.js
|
||||||
packages/lib/utils/webDAVUtils.test.js
|
packages/lib/utils/webDAVUtils.test.js
|
||||||
packages/lib/utils/webDAVUtils.js
|
packages/lib/utils/webDAVUtils.js
|
||||||
@@ -1022,15 +1257,18 @@ packages/renderer/MdToHtml/rules/link_open.js
|
|||||||
packages/renderer/MdToHtml/rules/mermaid.js
|
packages/renderer/MdToHtml/rules/mermaid.js
|
||||||
packages/renderer/MdToHtml/rules/sanitize_html.js
|
packages/renderer/MdToHtml/rules/sanitize_html.js
|
||||||
packages/renderer/MdToHtml/rules/source_map.js
|
packages/renderer/MdToHtml/rules/source_map.js
|
||||||
|
packages/renderer/MdToHtml/rules/tableHorizontallyScrollable.js
|
||||||
packages/renderer/MdToHtml/setupLinkify.js
|
packages/renderer/MdToHtml/setupLinkify.js
|
||||||
packages/renderer/MdToHtml/validateLinks.js
|
packages/renderer/MdToHtml/validateLinks.js
|
||||||
|
packages/renderer/assetsToHeaders.js
|
||||||
|
packages/renderer/defaultResourceModel.js
|
||||||
packages/renderer/headerAnchor.js
|
packages/renderer/headerAnchor.js
|
||||||
packages/renderer/highlight.js
|
packages/renderer/highlight.js
|
||||||
packages/renderer/htmlUtils.test.js
|
packages/renderer/htmlUtils.test.js
|
||||||
packages/renderer/htmlUtils.js
|
packages/renderer/htmlUtils.js
|
||||||
packages/renderer/index.js
|
packages/renderer/index.js
|
||||||
packages/renderer/noteStyle.js
|
packages/renderer/noteStyle.js
|
||||||
packages/renderer/pathUtils.js
|
packages/renderer/types.js
|
||||||
packages/renderer/utils.js
|
packages/renderer/utils.js
|
||||||
packages/tools/build-release-stats.test.js
|
packages/tools/build-release-stats.test.js
|
||||||
packages/tools/build-release-stats.js
|
packages/tools/build-release-stats.js
|
||||||
@@ -1051,6 +1289,7 @@ packages/tools/packageJsonLint.js
|
|||||||
packages/tools/postPreReleasesToForum.js
|
packages/tools/postPreReleasesToForum.js
|
||||||
packages/tools/release-android.js
|
packages/tools/release-android.js
|
||||||
packages/tools/release-cli.js
|
packages/tools/release-cli.js
|
||||||
|
packages/tools/release-clipper.js
|
||||||
packages/tools/release-electron.js
|
packages/tools/release-electron.js
|
||||||
packages/tools/release-ios.js
|
packages/tools/release-ios.js
|
||||||
packages/tools/release-plugin-repo-cli.js
|
packages/tools/release-plugin-repo-cli.js
|
||||||
|
15
.eslintrc.js
@@ -101,6 +101,19 @@ module.exports = {
|
|||||||
'no-unneeded-ternary': 'error',
|
'no-unneeded-ternary': 'error',
|
||||||
'github/array-foreach': ['error'],
|
'github/array-foreach': ['error'],
|
||||||
|
|
||||||
|
'no-restricted-properties': ['error',
|
||||||
|
{
|
||||||
|
'property': 'focus',
|
||||||
|
'message': 'Please use focusHandler::focus() instead',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'property': 'blur',
|
||||||
|
'message': 'Please use focusHandler::blur() instead',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
|
||||||
|
'@typescript-eslint/no-explicit-any': ['error'],
|
||||||
|
|
||||||
// -------------------------------
|
// -------------------------------
|
||||||
// Formatting
|
// Formatting
|
||||||
// -------------------------------
|
// -------------------------------
|
||||||
@@ -253,7 +266,7 @@ module.exports = {
|
|||||||
selector: 'enumMember',
|
selector: 'enumMember',
|
||||||
format: null,
|
format: null,
|
||||||
'filter': {
|
'filter': {
|
||||||
'regex': '^(GET|POST|PUT|DELETE|PATCH|HEAD|SQLite|PostgreSQL|ASC|DESC|E2EE|OR|AND|UNION|INTERSECT|EXCLUSION|INCLUSION|EUR|GBP|USD|SJCL.*)$',
|
'regex': '^(GET|POST|PUT|DELETE|PATCH|HEAD|SQLite|PostgreSQL|ASC|DESC|E2EE|OR|AND|UNION|INTERSECT|EXCLUSION|INCLUSION|EUR|GBP|USD|SJCL.*|iOS)$',
|
||||||
'match': true,
|
'match': true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
4
.github/PULL_REQUEST_TEMPLATE
vendored
@@ -20,6 +20,6 @@ If it's not related to any platform (such as a translation, change to the docume
|
|||||||
|
|
||||||
Then please append the issue that you've addressed or fixed. Use "Resolves #123" for new features or improvements and "Fixes #123" for bug fixes.
|
Then please append the issue that you've addressed or fixed. Use "Resolves #123" for new features or improvements and "Fixes #123" for bug fixes.
|
||||||
|
|
||||||
AND PLEASE READ THE GUIDE: https://github.com/laurent22/joplin/blob/dev/CONTRIBUTING.md
|
AND PLEASE READ THE GUIDE: https://github.com/laurent22/joplin/blob/dev/readme/dev/index.md
|
||||||
|
|
||||||
-->
|
-->
|
72
.github/scripts/run_ci.sh
vendored
@@ -90,7 +90,7 @@ if [ "$RUN_TESTS" == "1" ]; then
|
|||||||
# On Linux, we run the Joplin Server tests using PostgreSQL
|
# On Linux, we run the Joplin Server tests using PostgreSQL
|
||||||
if [ "$IS_LINUX" == "1" ]; then
|
if [ "$IS_LINUX" == "1" ]; then
|
||||||
echo "Running Joplin Server tests using PostgreSQL..."
|
echo "Running Joplin Server tests using PostgreSQL..."
|
||||||
sudo docker-compose --file docker-compose.db-dev.yml up -d
|
sudo docker compose --file docker-compose.db-dev.yml up -d
|
||||||
cmdResult=$?
|
cmdResult=$?
|
||||||
if [ $cmdResult -ne 0 ]; then
|
if [ $cmdResult -ne 0 ]; then
|
||||||
exit $cmdResult
|
exit $cmdResult
|
||||||
@@ -107,7 +107,7 @@ if [ "$RUN_TESTS" == "1" ]; then
|
|||||||
#
|
#
|
||||||
# https://stackoverflow.com/questions/38558989
|
# https://stackoverflow.com/questions/38558989
|
||||||
export NODE_OPTIONS="--max-old-space-size=32768"
|
export NODE_OPTIONS="--max-old-space-size=32768"
|
||||||
yarn run test-ci
|
yarn test-ci
|
||||||
testResult=$?
|
testResult=$?
|
||||||
if [ $testResult -ne 0 ]; then
|
if [ $testResult -ne 0 ]; then
|
||||||
exit $testResult
|
exit $testResult
|
||||||
@@ -122,13 +122,13 @@ fi
|
|||||||
if [ "$RUN_TESTS" == "1" ]; then
|
if [ "$RUN_TESTS" == "1" ]; then
|
||||||
echo "Step: Running linter..."
|
echo "Step: Running linter..."
|
||||||
|
|
||||||
yarn run linter-ci ./
|
yarn linter-ci ./
|
||||||
testResult=$?
|
testResult=$?
|
||||||
if [ $testResult -ne 0 ]; then
|
if [ $testResult -ne 0 ]; then
|
||||||
exit $testResult
|
exit $testResult
|
||||||
fi
|
fi
|
||||||
|
|
||||||
yarn run packageJsonLint
|
yarn packageJsonLint
|
||||||
testResult=$?
|
testResult=$?
|
||||||
if [ $testResult -ne 0 ]; then
|
if [ $testResult -ne 0 ]; then
|
||||||
exit $testResult
|
exit $testResult
|
||||||
@@ -141,15 +141,13 @@ fi
|
|||||||
# for Linux only is sufficient.
|
# for Linux only is sufficient.
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
|
|
||||||
if [ "$IS_PULL_REQUEST" == "1" ]; then
|
if [ "$IS_LINUX" == "1" ]; then
|
||||||
if [ "$IS_LINUX" == "1" ]; then
|
echo "Step: Validating translations..."
|
||||||
echo "Step: Validating translations..."
|
|
||||||
|
|
||||||
node packages/tools/validate-translation.js
|
node packages/tools/validate-translation.js
|
||||||
testResult=$?
|
testResult=$?
|
||||||
if [ $testResult -ne 0 ]; then
|
if [ $testResult -ne 0 ]; then
|
||||||
exit $testResult
|
exit $testResult
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -175,19 +173,17 @@ fi
|
|||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# Check .gitignore and .eslintignore files - they should be updated when
|
# Check .gitignore and .eslintignore files - they should be updated when
|
||||||
# new TypeScript files are added by running `yarn run updateIgnored`.
|
# new TypeScript files are added by running `yarn updateIgnored`.
|
||||||
# See coding_style.md
|
# See coding_style.md
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
|
|
||||||
if [ "$IS_PULL_REQUEST" == "1" ]; then
|
if [ "$IS_LINUX" == "1" ]; then
|
||||||
if [ "$IS_LINUX" == "1" ]; then
|
echo "Step: Checking for files that should have been ignored..."
|
||||||
echo "Step: Checking for files that should have been ignored..."
|
|
||||||
|
|
||||||
node packages/tools/checkIgnoredFiles.js
|
node packages/tools/checkIgnoredFiles.js
|
||||||
testResult=$?
|
testResult=$?
|
||||||
if [ $testResult -ne 0 ]; then
|
if [ $testResult -ne 0 ]; then
|
||||||
exit $testResult
|
exit $testResult
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -196,11 +192,27 @@ fi
|
|||||||
# =============================================================================
|
# =============================================================================
|
||||||
|
|
||||||
if [ "$RUN_TESTS" == "1" ]; then
|
if [ "$RUN_TESTS" == "1" ]; then
|
||||||
echo "Step: Check that the website still builds..."
|
if [ "$IS_LINUX" == "1" ]; then
|
||||||
|
echo "Step: Check that the website still builds..."
|
||||||
|
|
||||||
mkdir -p ../joplin-website/docs
|
mkdir -p ../joplin-website/docs
|
||||||
ll ../joplin-website/docs/api/references/plugin_api
|
CROWDIN_PERSONAL_TOKEN="$CROWDIN_PERSONAL_TOKEN" yarn crowdinDownload
|
||||||
SKIP_SPONSOR_PROCESSING=1 yarn run buildWebsite
|
SKIP_SPONSOR_PROCESSING=1 yarn buildWebsite
|
||||||
|
testResult=$?
|
||||||
|
if [ $testResult -ne 0 ]; then
|
||||||
|
exit $testResult
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# Spellchecking
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
if [ "$IS_LINUX" == "1" ]; then
|
||||||
|
echo "Step: Spellchecking..."
|
||||||
|
|
||||||
|
yarn spellcheck --all
|
||||||
testResult=$?
|
testResult=$?
|
||||||
if [ $testResult -ne 0 ]; then
|
if [ $testResult -ne 0 ]; then
|
||||||
exit $testResult
|
exit $testResult
|
||||||
@@ -253,14 +265,14 @@ if [ "$IS_DESKTOP_RELEASE" == "1" ]; then
|
|||||||
# "python" and seems to no longer respect the PYTHON_PATH environment variable.
|
# "python" and seems to no longer respect the PYTHON_PATH environment variable.
|
||||||
# We work around this by aliasing python.
|
# We work around this by aliasing python.
|
||||||
alias python=$(which python3)
|
alias python=$(which python3)
|
||||||
USE_HARD_LINKS=false yarn run dist
|
USE_HARD_LINKS=false yarn dist
|
||||||
else
|
else
|
||||||
USE_HARD_LINKS=false yarn run dist
|
USE_HARD_LINKS=false yarn dist
|
||||||
fi
|
fi
|
||||||
elif [[ $IS_LINUX = 1 ]] && [ "$IS_SERVER_RELEASE" == "1" ]; then
|
elif [[ $IS_LINUX = 1 ]] && [ "$IS_SERVER_RELEASE" == "1" ]; then
|
||||||
echo "Step: Building Docker Image..."
|
echo "Step: Building Docker Image..."
|
||||||
cd "$ROOT_DIR"
|
cd "$ROOT_DIR"
|
||||||
yarn run buildServerDocker --tag-name $GIT_TAG_NAME --push-images --repository $SERVER_REPOSITORY
|
yarn buildServerDocker --tag-name $GIT_TAG_NAME --push-images --repository $SERVER_REPOSITORY
|
||||||
else
|
else
|
||||||
echo "Step: Building but *not* publishing desktop application..."
|
echo "Step: Building but *not* publishing desktop application..."
|
||||||
|
|
||||||
@@ -274,8 +286,8 @@ else
|
|||||||
export CSC_IDENTITY_AUTO_DISCOVERY=false
|
export CSC_IDENTITY_AUTO_DISCOVERY=false
|
||||||
npm pkg set 'build.mac.identity'=null --json
|
npm pkg set 'build.mac.identity'=null --json
|
||||||
|
|
||||||
USE_HARD_LINKS=false yarn run dist --publish=never
|
USE_HARD_LINKS=false yarn dist --publish=never
|
||||||
else
|
else
|
||||||
USE_HARD_LINKS=false yarn run dist --publish=never
|
USE_HARD_LINKS=false yarn dist --publish=never
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
4
.github/workflows/build-android.yml
vendored
@@ -26,9 +26,9 @@ jobs:
|
|||||||
sudo apt-get update || true
|
sudo apt-get update || true
|
||||||
sudo apt-get install -y libsecret-1-dev
|
sudo apt-get install -y libsecret-1-dev
|
||||||
|
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- uses: actions/setup-node@v2
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: '18'
|
node-version: '18'
|
||||||
cache: 'yarn'
|
cache: 'yarn'
|
||||||
|
12
.github/workflows/build-macos-m1.yml
vendored
@@ -19,9 +19,9 @@ jobs:
|
|||||||
runs-on: macos-latest
|
runs-on: macos-latest
|
||||||
steps:
|
steps:
|
||||||
|
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v4
|
||||||
- uses: olegtarasov/get-tag@v2.1
|
- uses: olegtarasov/get-tag@v2.1.3
|
||||||
- uses: actions/setup-node@v2
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
# We need to pin the version to 18.15, because 18.16+ fails with this error:
|
# We need to pin the version to 18.15, because 18.16+ fails with this error:
|
||||||
# https://github.com/facebook/react-native/issues/36440
|
# https://github.com/facebook/react-native/issues/36440
|
||||||
@@ -40,7 +40,7 @@ jobs:
|
|||||||
brew install pango
|
brew install pango
|
||||||
|
|
||||||
# See github-action-main.yml for explanation
|
# See github-action-main.yml for explanation
|
||||||
- uses: actions/setup-python@v4
|
- uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: '3.11'
|
python-version: '3.11'
|
||||||
|
|
||||||
@@ -67,7 +67,7 @@ jobs:
|
|||||||
|
|
||||||
if [[ $GIT_TAG_NAME = v* ]]; then
|
if [[ $GIT_TAG_NAME = v* ]]; then
|
||||||
echo "Building and publishing desktop application..."
|
echo "Building and publishing desktop application..."
|
||||||
PYTHON_PATH=$(which python) USE_HARD_LINKS=false yarn run dist --mac --arm64
|
PYTHON_PATH=$(which python) USE_HARD_LINKS=false yarn dist --mac --arm64
|
||||||
|
|
||||||
yarn renameReleaseAssets --repo="$GH_REPO" --tag="$GIT_TAG_NAME" --token="$GITHUB_TOKEN"
|
yarn renameReleaseAssets --repo="$GH_REPO" --tag="$GIT_TAG_NAME" --token="$GITHUB_TOKEN"
|
||||||
else
|
else
|
||||||
@@ -80,5 +80,5 @@ jobs:
|
|||||||
export CSC_IDENTITY_AUTO_DISCOVERY=false
|
export CSC_IDENTITY_AUTO_DISCOVERY=false
|
||||||
npm pkg set 'build.mac.identity'=null --json
|
npm pkg set 'build.mac.identity'=null --json
|
||||||
|
|
||||||
PYTHON_PATH=$(which python) USE_HARD_LINKS=false yarn run dist --mac --arm64 --publish=never
|
PYTHON_PATH=$(which python) USE_HARD_LINKS=false yarn dist --mac --arm64 --publish=never
|
||||||
fi
|
fi
|
||||||
|
2
.github/workflows/close-stale-issues.yml
vendored
@@ -9,7 +9,7 @@ jobs:
|
|||||||
if: github.repository == 'laurent22/joplin'
|
if: github.repository == 'laurent22/joplin'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/stale@v4
|
- uses: actions/stale@v9
|
||||||
with:
|
with:
|
||||||
# Use this to do a dry run from a pull request
|
# Use this to do a dry run from a pull request
|
||||||
# debug-only: true
|
# debug-only: true
|
||||||
|
19
.github/workflows/github-actions-main.yml
vendored
@@ -81,9 +81,9 @@ jobs:
|
|||||||
sudo apt-get update || true
|
sudo apt-get update || true
|
||||||
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
|
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
|
||||||
|
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v4
|
||||||
- uses: olegtarasov/get-tag@v2.1
|
- uses: olegtarasov/get-tag@v2.1.3
|
||||||
- uses: actions/setup-node@v2
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
# We need to pin the version to 18.15, because 18.16+ fails with this error:
|
# We need to pin the version to 18.15, because 18.16+ fails with this error:
|
||||||
# https://github.com/facebook/react-native/issues/36440
|
# https://github.com/facebook/react-native/issues/36440
|
||||||
@@ -109,7 +109,7 @@ jobs:
|
|||||||
# Python to an earlier version.
|
# Python to an earlier version.
|
||||||
# Fixes error `ModuleNotFoundError: No module named 'distutils'`
|
# Fixes error `ModuleNotFoundError: No module named 'distutils'`
|
||||||
# Ref: https://github.com/nodejs/node-gyp/issues/2869
|
# Ref: https://github.com/nodejs/node-gyp/issues/2869
|
||||||
- uses: actions/setup-python@v4
|
- uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: '3.11'
|
python-version: '3.11'
|
||||||
|
|
||||||
@@ -127,6 +127,7 @@ jobs:
|
|||||||
BUILD_SEQUENCIAL: 1
|
BUILD_SEQUENCIAL: 1
|
||||||
SERVER_REPOSITORY: joplin/server
|
SERVER_REPOSITORY: joplin/server
|
||||||
SERVER_TAG_PREFIX: server
|
SERVER_TAG_PREFIX: server
|
||||||
|
CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}
|
||||||
run: |
|
run: |
|
||||||
"${GITHUB_WORKSPACE}/.github/scripts/run_ci.sh"
|
"${GITHUB_WORKSPACE}/.github/scripts/run_ci.sh"
|
||||||
|
|
||||||
@@ -141,7 +142,7 @@ jobs:
|
|||||||
# To ensure that the operations stop on failure, all commands
|
# To ensure that the operations stop on failure, all commands
|
||||||
# should be on one line with "&&" in between.
|
# should be on one line with "&&" in between.
|
||||||
run: |
|
run: |
|
||||||
yarn install && cd packages/app-desktop && yarn run dist
|
yarn install && cd packages/app-desktop && yarn dist
|
||||||
|
|
||||||
# Build and package the Windows app, without publishing it, just to
|
# Build and package the Windows app, without publishing it, just to
|
||||||
# verify that the build process hasn't been broken.
|
# verify that the build process hasn't been broken.
|
||||||
@@ -153,7 +154,7 @@ jobs:
|
|||||||
SERVER_REPOSITORY: joplin/server
|
SERVER_REPOSITORY: joplin/server
|
||||||
SERVER_TAG_PREFIX: server
|
SERVER_TAG_PREFIX: server
|
||||||
run: |
|
run: |
|
||||||
yarn install && cd packages/app-desktop && yarn run dist --publish=never
|
yarn install && cd packages/app-desktop && yarn dist --publish=never
|
||||||
|
|
||||||
ServerDockerImage:
|
ServerDockerImage:
|
||||||
needs: pre_job
|
needs: pre_job
|
||||||
@@ -180,9 +181,9 @@ jobs:
|
|||||||
sudo apt-get update || true
|
sudo apt-get update || true
|
||||||
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
|
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
|
||||||
|
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- uses: actions/setup-node@v2
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: '18'
|
node-version: '18'
|
||||||
cache: 'yarn'
|
cache: 'yarn'
|
||||||
@@ -197,7 +198,7 @@ jobs:
|
|||||||
BUILD_SEQUENCIAL: 1
|
BUILD_SEQUENCIAL: 1
|
||||||
run: |
|
run: |
|
||||||
yarn install
|
yarn install
|
||||||
yarn run buildServerDocker --tag-name server-v0.0.0 --repository joplin/server
|
yarn buildServerDocker --tag-name server-v0.0.0 --repository joplin/server
|
||||||
|
|
||||||
# Basic test to ensure that the created build is valid. It should exit with
|
# Basic test to ensure that the created build is valid. It should exit with
|
||||||
# code 0 if it works.
|
# code 0 if it works.
|
||||||
|
301
.gitignore
vendored
@@ -66,14 +66,41 @@ docs/**/*.mustache
|
|||||||
|
|
||||||
# AUTO-GENERATED - EXCLUDED TYPESCRIPT BUILD
|
# AUTO-GENERATED - EXCLUDED TYPESCRIPT BUILD
|
||||||
packages/app-cli/app/LinkSelector.js
|
packages/app-cli/app/LinkSelector.js
|
||||||
|
packages/app-cli/app/app.js
|
||||||
packages/app-cli/app/base-command.js
|
packages/app-cli/app/base-command.js
|
||||||
|
packages/app-cli/app/command-apidoc.js
|
||||||
|
packages/app-cli/app/command-attach.js
|
||||||
|
packages/app-cli/app/command-cat.js
|
||||||
|
packages/app-cli/app/command-config.js
|
||||||
|
packages/app-cli/app/command-cp.js
|
||||||
packages/app-cli/app/command-done.test.js
|
packages/app-cli/app/command-done.test.js
|
||||||
|
packages/app-cli/app/command-done.js
|
||||||
|
packages/app-cli/app/command-dump.js
|
||||||
packages/app-cli/app/command-e2ee.js
|
packages/app-cli/app/command-e2ee.js
|
||||||
|
packages/app-cli/app/command-edit.js
|
||||||
|
packages/app-cli/app/command-exit.js
|
||||||
|
packages/app-cli/app/command-export-sync-status.js
|
||||||
|
packages/app-cli/app/command-export.js
|
||||||
|
packages/app-cli/app/command-geoloc.js
|
||||||
|
packages/app-cli/app/command-help.js
|
||||||
|
packages/app-cli/app/command-import.js
|
||||||
|
packages/app-cli/app/command-ls.js
|
||||||
packages/app-cli/app/command-mkbook.test.js
|
packages/app-cli/app/command-mkbook.test.js
|
||||||
packages/app-cli/app/command-mkbook.js
|
packages/app-cli/app/command-mkbook.js
|
||||||
|
packages/app-cli/app/command-mv.js
|
||||||
|
packages/app-cli/app/command-ren.js
|
||||||
|
packages/app-cli/app/command-restore.js
|
||||||
|
packages/app-cli/app/command-rmbook.test.js
|
||||||
|
packages/app-cli/app/command-rmbook.js
|
||||||
|
packages/app-cli/app/command-rmnote.test.js
|
||||||
|
packages/app-cli/app/command-rmnote.js
|
||||||
|
packages/app-cli/app/command-set.js
|
||||||
packages/app-cli/app/command-settingschema.js
|
packages/app-cli/app/command-settingschema.js
|
||||||
packages/app-cli/app/command-sync.js
|
packages/app-cli/app/command-sync.js
|
||||||
packages/app-cli/app/command-testing.js
|
packages/app-cli/app/command-testing.js
|
||||||
|
packages/app-cli/app/command-use.js
|
||||||
|
packages/app-cli/app/command-version.js
|
||||||
|
packages/app-cli/app/gui/FolderListWidget.js
|
||||||
packages/app-cli/app/gui/StatusBarWidget.js
|
packages/app-cli/app/gui/StatusBarWidget.js
|
||||||
packages/app-cli/app/services/plugins/PluginRunner.js
|
packages/app-cli/app/services/plugins/PluginRunner.js
|
||||||
packages/app-cli/app/setupCommand.js
|
packages/app-cli/app/setupCommand.js
|
||||||
@@ -100,6 +127,7 @@ packages/app-desktop/bridge.js
|
|||||||
packages/app-desktop/checkForUpdates.js
|
packages/app-desktop/checkForUpdates.js
|
||||||
packages/app-desktop/commands/copyDevCommand.js
|
packages/app-desktop/commands/copyDevCommand.js
|
||||||
packages/app-desktop/commands/editProfileConfig.js
|
packages/app-desktop/commands/editProfileConfig.js
|
||||||
|
packages/app-desktop/commands/emptyTrash.js
|
||||||
packages/app-desktop/commands/exportFolders.js
|
packages/app-desktop/commands/exportFolders.js
|
||||||
packages/app-desktop/commands/exportNotes.js
|
packages/app-desktop/commands/exportNotes.js
|
||||||
packages/app-desktop/commands/focusElement.js
|
packages/app-desktop/commands/focusElement.js
|
||||||
@@ -125,8 +153,6 @@ packages/app-desktop/gui/ConfigScreen/controls/ToggleAdvancedSettingsButton.js
|
|||||||
packages/app-desktop/gui/ConfigScreen/controls/plugins/PluginBox.js
|
packages/app-desktop/gui/ConfigScreen/controls/plugins/PluginBox.js
|
||||||
packages/app-desktop/gui/ConfigScreen/controls/plugins/PluginsStates.js
|
packages/app-desktop/gui/ConfigScreen/controls/plugins/PluginsStates.js
|
||||||
packages/app-desktop/gui/ConfigScreen/controls/plugins/SearchPlugins.js
|
packages/app-desktop/gui/ConfigScreen/controls/plugins/SearchPlugins.js
|
||||||
packages/app-desktop/gui/ConfigScreen/controls/plugins/useOnInstallHandler.test.js
|
|
||||||
packages/app-desktop/gui/ConfigScreen/controls/plugins/useOnInstallHandler.js
|
|
||||||
packages/app-desktop/gui/Dialog.js
|
packages/app-desktop/gui/Dialog.js
|
||||||
packages/app-desktop/gui/DialogButtonRow.js
|
packages/app-desktop/gui/DialogButtonRow.js
|
||||||
packages/app-desktop/gui/DialogButtonRow/useKeyboardHandler.js
|
packages/app-desktop/gui/DialogButtonRow/useKeyboardHandler.js
|
||||||
@@ -145,6 +171,7 @@ packages/app-desktop/gui/IconButton.js
|
|||||||
packages/app-desktop/gui/ImportScreen.js
|
packages/app-desktop/gui/ImportScreen.js
|
||||||
packages/app-desktop/gui/ItemList.js
|
packages/app-desktop/gui/ItemList.js
|
||||||
packages/app-desktop/gui/JoplinCloudConfigScreen.js
|
packages/app-desktop/gui/JoplinCloudConfigScreen.js
|
||||||
|
packages/app-desktop/gui/JoplinCloudLoginScreen.js
|
||||||
packages/app-desktop/gui/KeymapConfig/KeymapConfigScreen.js
|
packages/app-desktop/gui/KeymapConfig/KeymapConfigScreen.js
|
||||||
packages/app-desktop/gui/KeymapConfig/ShortcutRecorder.js
|
packages/app-desktop/gui/KeymapConfig/ShortcutRecorder.js
|
||||||
packages/app-desktop/gui/KeymapConfig/styles/index.js
|
packages/app-desktop/gui/KeymapConfig/styles/index.js
|
||||||
@@ -174,10 +201,13 @@ packages/app-desktop/gui/MainScreen/commands/openItem.js
|
|||||||
packages/app-desktop/gui/MainScreen/commands/openNote.js
|
packages/app-desktop/gui/MainScreen/commands/openNote.js
|
||||||
packages/app-desktop/gui/MainScreen/commands/openPdfViewer.js
|
packages/app-desktop/gui/MainScreen/commands/openPdfViewer.js
|
||||||
packages/app-desktop/gui/MainScreen/commands/openTag.js
|
packages/app-desktop/gui/MainScreen/commands/openTag.js
|
||||||
|
packages/app-desktop/gui/MainScreen/commands/permanentlyDeleteNote.js
|
||||||
packages/app-desktop/gui/MainScreen/commands/print.js
|
packages/app-desktop/gui/MainScreen/commands/print.js
|
||||||
packages/app-desktop/gui/MainScreen/commands/renameFolder.js
|
packages/app-desktop/gui/MainScreen/commands/renameFolder.js
|
||||||
packages/app-desktop/gui/MainScreen/commands/renameTag.js
|
packages/app-desktop/gui/MainScreen/commands/renameTag.js
|
||||||
packages/app-desktop/gui/MainScreen/commands/resetLayout.js
|
packages/app-desktop/gui/MainScreen/commands/resetLayout.js
|
||||||
|
packages/app-desktop/gui/MainScreen/commands/restoreFolder.js
|
||||||
|
packages/app-desktop/gui/MainScreen/commands/restoreNote.js
|
||||||
packages/app-desktop/gui/MainScreen/commands/revealResourceFile.js
|
packages/app-desktop/gui/MainScreen/commands/revealResourceFile.js
|
||||||
packages/app-desktop/gui/MainScreen/commands/search.js
|
packages/app-desktop/gui/MainScreen/commands/search.js
|
||||||
packages/app-desktop/gui/MainScreen/commands/setTags.js
|
packages/app-desktop/gui/MainScreen/commands/setTags.js
|
||||||
@@ -187,6 +217,7 @@ packages/app-desktop/gui/MainScreen/commands/showNoteProperties.js
|
|||||||
packages/app-desktop/gui/MainScreen/commands/showPrompt.js
|
packages/app-desktop/gui/MainScreen/commands/showPrompt.js
|
||||||
packages/app-desktop/gui/MainScreen/commands/showShareFolderDialog.js
|
packages/app-desktop/gui/MainScreen/commands/showShareFolderDialog.js
|
||||||
packages/app-desktop/gui/MainScreen/commands/showShareNoteDialog.js
|
packages/app-desktop/gui/MainScreen/commands/showShareNoteDialog.js
|
||||||
|
packages/app-desktop/gui/MainScreen/commands/showSpellCheckerMenu.test.js
|
||||||
packages/app-desktop/gui/MainScreen/commands/showSpellCheckerMenu.js
|
packages/app-desktop/gui/MainScreen/commands/showSpellCheckerMenu.js
|
||||||
packages/app-desktop/gui/MainScreen/commands/toggleEditors.js
|
packages/app-desktop/gui/MainScreen/commands/toggleEditors.js
|
||||||
packages/app-desktop/gui/MainScreen/commands/toggleLayoutMoveMode.js
|
packages/app-desktop/gui/MainScreen/commands/toggleLayoutMoveMode.js
|
||||||
@@ -204,27 +235,30 @@ packages/app-desktop/gui/Navigator.js
|
|||||||
packages/app-desktop/gui/NoteContentPropertiesDialog.js
|
packages/app-desktop/gui/NoteContentPropertiesDialog.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/Toolbar.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/Toolbar.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/index.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/index.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/setupVim.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/normalizeAccelerator.test.js
|
||||||
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/normalizeAccelerator.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/types.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/types.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useContextMenu.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useContextMenu.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useCursorUtils.test.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useEditorSearchExtension.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useCursorUtils.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useEditorSearchHandler.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useEditorSearch.js
|
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useExternalPlugins.js
|
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useJoplinCommands.js
|
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useJoplinMode.js
|
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useKeymap.js
|
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useLineSorting.js
|
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useListIdent.js
|
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useScrollHandler.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useScrollHandler.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useScrollUtils.js
|
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useStyles.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useStyles.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useWebviewIpcMessage.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/useWebviewIpcMessage.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v5/CodeMirror.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v5/CodeMirror.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v5/Editor.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v5/Editor.js
|
||||||
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v5/utils/useCursorUtils.test.js
|
||||||
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v5/utils/useCursorUtils.js
|
||||||
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v5/utils/useExternalPlugins.js
|
||||||
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v5/utils/useJoplinCommands.js
|
||||||
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v5/utils/useJoplinMode.js
|
||||||
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v5/utils/useKeymap.js
|
||||||
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v5/utils/useLineSorting.js
|
||||||
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v5/utils/useListIdent.js
|
||||||
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v5/utils/useScrollUtils.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/CodeMirror.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/CodeMirror.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/Editor.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/Editor.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/useEditorCommands.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/useEditorCommands.js
|
||||||
|
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/utils/useKeymap.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/PlainEditor/PlainEditor.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/PlainEditor/PlainEditor.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/styles/index.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/styles/index.js
|
||||||
@@ -236,6 +270,7 @@ packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/utils/shouldPasteResources.
|
|||||||
packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/utils/types.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/utils/types.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/utils/useContextMenu.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/utils/useContextMenu.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/utils/useScroll.js
|
packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/utils/useScroll.js
|
||||||
|
packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/utils/useWebViewApi.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteEditor.js
|
packages/app-desktop/gui/NoteEditor/NoteEditor.js
|
||||||
packages/app-desktop/gui/NoteEditor/NoteTitle/NoteTitleBar.js
|
packages/app-desktop/gui/NoteEditor/NoteTitle/NoteTitleBar.js
|
||||||
packages/app-desktop/gui/NoteEditor/commands/focusElementNoteBody.js
|
packages/app-desktop/gui/NoteEditor/commands/focusElementNoteBody.js
|
||||||
@@ -252,6 +287,7 @@ packages/app-desktop/gui/NoteEditor/utils/clipboardUtils.js
|
|||||||
packages/app-desktop/gui/NoteEditor/utils/contextMenu.js
|
packages/app-desktop/gui/NoteEditor/utils/contextMenu.js
|
||||||
packages/app-desktop/gui/NoteEditor/utils/contextMenuUtils.js
|
packages/app-desktop/gui/NoteEditor/utils/contextMenuUtils.js
|
||||||
packages/app-desktop/gui/NoteEditor/utils/index.js
|
packages/app-desktop/gui/NoteEditor/utils/index.js
|
||||||
|
packages/app-desktop/gui/NoteEditor/utils/markupRenderOptions.js
|
||||||
packages/app-desktop/gui/NoteEditor/utils/resourceHandling.test.js
|
packages/app-desktop/gui/NoteEditor/utils/resourceHandling.test.js
|
||||||
packages/app-desktop/gui/NoteEditor/utils/resourceHandling.js
|
packages/app-desktop/gui/NoteEditor/utils/resourceHandling.js
|
||||||
packages/app-desktop/gui/NoteEditor/utils/types.js
|
packages/app-desktop/gui/NoteEditor/utils/types.js
|
||||||
@@ -266,9 +302,7 @@ packages/app-desktop/gui/NoteEditor/utils/useNoteSearchBar.js
|
|||||||
packages/app-desktop/gui/NoteEditor/utils/usePluginServiceRegistration.js
|
packages/app-desktop/gui/NoteEditor/utils/usePluginServiceRegistration.js
|
||||||
packages/app-desktop/gui/NoteEditor/utils/useSearchMarkers.js
|
packages/app-desktop/gui/NoteEditor/utils/useSearchMarkers.js
|
||||||
packages/app-desktop/gui/NoteEditor/utils/useWindowCommandHandler.js
|
packages/app-desktop/gui/NoteEditor/utils/useWindowCommandHandler.js
|
||||||
packages/app-desktop/gui/NoteList/NoteList.js
|
|
||||||
packages/app-desktop/gui/NoteList/NoteList2.js
|
packages/app-desktop/gui/NoteList/NoteList2.js
|
||||||
packages/app-desktop/gui/NoteList/NoteListSource.js
|
|
||||||
packages/app-desktop/gui/NoteList/commands/focusElementNoteList.js
|
packages/app-desktop/gui/NoteList/commands/focusElementNoteList.js
|
||||||
packages/app-desktop/gui/NoteList/commands/index.js
|
packages/app-desktop/gui/NoteList/commands/index.js
|
||||||
packages/app-desktop/gui/NoteList/utils/canManuallySortNotes.js
|
packages/app-desktop/gui/NoteList/utils/canManuallySortNotes.js
|
||||||
@@ -285,9 +319,18 @@ packages/app-desktop/gui/NoteList/utils/useVisibleRange.js
|
|||||||
packages/app-desktop/gui/NoteListControls/NoteListControls.js
|
packages/app-desktop/gui/NoteListControls/NoteListControls.js
|
||||||
packages/app-desktop/gui/NoteListControls/commands/focusSearch.js
|
packages/app-desktop/gui/NoteListControls/commands/focusSearch.js
|
||||||
packages/app-desktop/gui/NoteListControls/commands/index.js
|
packages/app-desktop/gui/NoteListControls/commands/index.js
|
||||||
packages/app-desktop/gui/NoteListItem.js
|
packages/app-desktop/gui/NoteListHeader/NoteListHeader.js
|
||||||
|
packages/app-desktop/gui/NoteListHeader/NoteListHeaderItem.js
|
||||||
|
packages/app-desktop/gui/NoteListHeader/types.js
|
||||||
|
packages/app-desktop/gui/NoteListHeader/useDragAndDrop.test.js
|
||||||
|
packages/app-desktop/gui/NoteListHeader/useDragAndDrop.js
|
||||||
|
packages/app-desktop/gui/NoteListHeader/utils/getColumnTitle.js
|
||||||
|
packages/app-desktop/gui/NoteListHeader/utils/useContextMenu.js
|
||||||
|
packages/app-desktop/gui/NoteListHeader/utils/validateColumns.test.js
|
||||||
|
packages/app-desktop/gui/NoteListHeader/utils/validateColumns.js
|
||||||
packages/app-desktop/gui/NoteListItem/NoteListItem.js
|
packages/app-desktop/gui/NoteListItem/NoteListItem.js
|
||||||
packages/app-desktop/gui/NoteListItem/utils/getNoteTitleHtml.js
|
packages/app-desktop/gui/NoteListItem/utils/getNoteTitleHtml.js
|
||||||
|
packages/app-desktop/gui/NoteListItem/utils/prepareViewProps.test.js
|
||||||
packages/app-desktop/gui/NoteListItem/utils/prepareViewProps.js
|
packages/app-desktop/gui/NoteListItem/utils/prepareViewProps.js
|
||||||
packages/app-desktop/gui/NoteListItem/utils/types.js
|
packages/app-desktop/gui/NoteListItem/utils/types.js
|
||||||
packages/app-desktop/gui/NoteListItem/utils/useItemElement.js
|
packages/app-desktop/gui/NoteListItem/utils/useItemElement.js
|
||||||
@@ -302,6 +345,7 @@ packages/app-desktop/gui/NoteSearchBar.js
|
|||||||
packages/app-desktop/gui/NoteStatusBar.js
|
packages/app-desktop/gui/NoteStatusBar.js
|
||||||
packages/app-desktop/gui/NoteTextViewer.js
|
packages/app-desktop/gui/NoteTextViewer.js
|
||||||
packages/app-desktop/gui/NoteToolbar/NoteToolbar.js
|
packages/app-desktop/gui/NoteToolbar/NoteToolbar.js
|
||||||
|
packages/app-desktop/gui/NotyfContext.js
|
||||||
packages/app-desktop/gui/OneDriveLoginScreen.js
|
packages/app-desktop/gui/OneDriveLoginScreen.js
|
||||||
packages/app-desktop/gui/PasswordInput/PasswordInput.js
|
packages/app-desktop/gui/PasswordInput/PasswordInput.js
|
||||||
packages/app-desktop/gui/PdfViewer.js
|
packages/app-desktop/gui/PdfViewer.js
|
||||||
@@ -346,6 +390,7 @@ packages/app-desktop/gui/ToolbarBase.js
|
|||||||
packages/app-desktop/gui/ToolbarButton/ToolbarButton.js
|
packages/app-desktop/gui/ToolbarButton/ToolbarButton.js
|
||||||
packages/app-desktop/gui/ToolbarButton/styles/index.js
|
packages/app-desktop/gui/ToolbarButton/styles/index.js
|
||||||
packages/app-desktop/gui/ToolbarSpace.js
|
packages/app-desktop/gui/ToolbarSpace.js
|
||||||
|
packages/app-desktop/gui/TrashNotification/TrashNotification.js
|
||||||
packages/app-desktop/gui/dialogs.js
|
packages/app-desktop/gui/dialogs.js
|
||||||
packages/app-desktop/gui/hooks/useEffectDebugger.js
|
packages/app-desktop/gui/hooks/useEffectDebugger.js
|
||||||
packages/app-desktop/gui/hooks/useImperativeHandlerDebugger.js
|
packages/app-desktop/gui/hooks/useImperativeHandlerDebugger.js
|
||||||
@@ -361,6 +406,7 @@ packages/app-desktop/gui/style/StyledMessage.js
|
|||||||
packages/app-desktop/gui/style/StyledTextInput.js
|
packages/app-desktop/gui/style/StyledTextInput.js
|
||||||
packages/app-desktop/gui/utils/NoteListUtils.js
|
packages/app-desktop/gui/utils/NoteListUtils.js
|
||||||
packages/app-desktop/gui/utils/convertToScreenCoordinates.js
|
packages/app-desktop/gui/utils/convertToScreenCoordinates.js
|
||||||
|
packages/app-desktop/gui/utils/dragAndDrop.js
|
||||||
packages/app-desktop/gui/utils/loadScript.js
|
packages/app-desktop/gui/utils/loadScript.js
|
||||||
packages/app-desktop/gulpfile.js
|
packages/app-desktop/gulpfile.js
|
||||||
packages/app-desktop/integration-tests/main.spec.js
|
packages/app-desktop/integration-tests/main.spec.js
|
||||||
@@ -372,6 +418,7 @@ packages/app-desktop/integration-tests/util/activateMainMenuItem.js
|
|||||||
packages/app-desktop/integration-tests/util/createStartupArgs.js
|
packages/app-desktop/integration-tests/util/createStartupArgs.js
|
||||||
packages/app-desktop/integration-tests/util/firstNonDevToolsWindow.js
|
packages/app-desktop/integration-tests/util/firstNonDevToolsWindow.js
|
||||||
packages/app-desktop/integration-tests/util/setFilePickerResponse.js
|
packages/app-desktop/integration-tests/util/setFilePickerResponse.js
|
||||||
|
packages/app-desktop/integration-tests/util/setMessageBoxResponse.js
|
||||||
packages/app-desktop/integration-tests/util/test.js
|
packages/app-desktop/integration-tests/util/test.js
|
||||||
packages/app-desktop/playwright.config.js
|
packages/app-desktop/playwright.config.js
|
||||||
packages/app-desktop/plugins/GotoAnything.js
|
packages/app-desktop/plugins/GotoAnything.js
|
||||||
@@ -393,7 +440,6 @@ packages/app-desktop/services/plugins/hooks/useThemeCss.js
|
|||||||
packages/app-desktop/services/plugins/hooks/useViewIsReady.js
|
packages/app-desktop/services/plugins/hooks/useViewIsReady.js
|
||||||
packages/app-desktop/services/plugins/hooks/useWebviewToPluginMessages.js
|
packages/app-desktop/services/plugins/hooks/useWebviewToPluginMessages.js
|
||||||
packages/app-desktop/services/restart.js
|
packages/app-desktop/services/restart.js
|
||||||
packages/app-desktop/services/share/invitationRespond.js
|
|
||||||
packages/app-desktop/services/sortOrder/PerFolderSortOrderService.test.js
|
packages/app-desktop/services/sortOrder/PerFolderSortOrderService.test.js
|
||||||
packages/app-desktop/services/sortOrder/PerFolderSortOrderService.js
|
packages/app-desktop/services/sortOrder/PerFolderSortOrderService.js
|
||||||
packages/app-desktop/services/sortOrder/notesSortOrderUtils.test.js
|
packages/app-desktop/services/sortOrder/notesSortOrderUtils.test.js
|
||||||
@@ -402,13 +448,22 @@ packages/app-desktop/services/spellChecker/SpellCheckerServiceDriverNative.js
|
|||||||
packages/app-desktop/tools/copy7Zip.js
|
packages/app-desktop/tools/copy7Zip.js
|
||||||
packages/app-desktop/tools/notarizeMacApp.js
|
packages/app-desktop/tools/notarizeMacApp.js
|
||||||
packages/app-desktop/tools/renameReleaseAssets.js
|
packages/app-desktop/tools/renameReleaseAssets.js
|
||||||
|
packages/app-desktop/utils/7zip/getPathToExecutable7Zip.js
|
||||||
|
packages/app-desktop/utils/7zip/pathToBundled7Zip.js
|
||||||
packages/app-desktop/utils/checkForUpdatesUtils.test.js
|
packages/app-desktop/utils/checkForUpdatesUtils.test.js
|
||||||
packages/app-desktop/utils/checkForUpdatesUtils.js
|
packages/app-desktop/utils/checkForUpdatesUtils.js
|
||||||
packages/app-desktop/utils/checkForUpdatesUtilsTestData.js
|
packages/app-desktop/utils/checkForUpdatesUtilsTestData.js
|
||||||
|
packages/app-desktop/utils/isSafeToOpen.test.js
|
||||||
|
packages/app-desktop/utils/isSafeToOpen.js
|
||||||
packages/app-desktop/utils/markupLanguageUtils.js
|
packages/app-desktop/utils/markupLanguageUtils.js
|
||||||
packages/app-desktop/utils/restartInSafeModeFromMain.test.js
|
packages/app-desktop/utils/restartInSafeModeFromMain.test.js
|
||||||
packages/app-desktop/utils/restartInSafeModeFromMain.js
|
packages/app-desktop/utils/restartInSafeModeFromMain.js
|
||||||
packages/app-mobile/PluginAssetsLoader.js
|
packages/app-mobile/PluginAssetsLoader.js
|
||||||
|
packages/app-mobile/commands/index.js
|
||||||
|
packages/app-mobile/commands/openItem.js
|
||||||
|
packages/app-mobile/commands/openNote.js
|
||||||
|
packages/app-mobile/commands/scrollToHash.js
|
||||||
|
packages/app-mobile/commands/util/goToNote.js
|
||||||
packages/app-mobile/components/ActionButton.js
|
packages/app-mobile/components/ActionButton.js
|
||||||
packages/app-mobile/components/BackButtonDialogBox.js
|
packages/app-mobile/components/BackButtonDialogBox.js
|
||||||
packages/app-mobile/components/CameraView.js
|
packages/app-mobile/components/CameraView.js
|
||||||
@@ -419,14 +474,24 @@ packages/app-mobile/components/ExtendedWebView.js
|
|||||||
packages/app-mobile/components/FolderPicker.js
|
packages/app-mobile/components/FolderPicker.js
|
||||||
packages/app-mobile/components/Icon.js
|
packages/app-mobile/components/Icon.js
|
||||||
packages/app-mobile/components/Modal.js
|
packages/app-mobile/components/Modal.js
|
||||||
|
packages/app-mobile/components/ModalDialog.js
|
||||||
packages/app-mobile/components/NoteBodyViewer/NoteBodyViewer.js
|
packages/app-mobile/components/NoteBodyViewer/NoteBodyViewer.js
|
||||||
|
packages/app-mobile/components/NoteBodyViewer/bundledJs/Renderer.test.js
|
||||||
|
packages/app-mobile/components/NoteBodyViewer/bundledJs/Renderer.js
|
||||||
|
packages/app-mobile/components/NoteBodyViewer/bundledJs/noteBodyViewerBundle.js
|
||||||
|
packages/app-mobile/components/NoteBodyViewer/bundledJs/types.js
|
||||||
|
packages/app-mobile/components/NoteBodyViewer/bundledJs/utils/addPluginAssets.js
|
||||||
|
packages/app-mobile/components/NoteBodyViewer/bundledJs/utils/makeResourceModel.js
|
||||||
|
packages/app-mobile/components/NoteBodyViewer/hooks/useContentScripts.js
|
||||||
packages/app-mobile/components/NoteBodyViewer/hooks/useEditPopup.test.js
|
packages/app-mobile/components/NoteBodyViewer/hooks/useEditPopup.test.js
|
||||||
packages/app-mobile/components/NoteBodyViewer/hooks/useEditPopup.js
|
packages/app-mobile/components/NoteBodyViewer/hooks/useEditPopup.js
|
||||||
packages/app-mobile/components/NoteBodyViewer/hooks/useOnMessage.js
|
packages/app-mobile/components/NoteBodyViewer/hooks/useOnMessage.js
|
||||||
packages/app-mobile/components/NoteBodyViewer/hooks/useOnResourceLongPress.js
|
packages/app-mobile/components/NoteBodyViewer/hooks/useOnResourceLongPress.js
|
||||||
|
packages/app-mobile/components/NoteBodyViewer/hooks/useRenderer.js
|
||||||
|
packages/app-mobile/components/NoteBodyViewer/hooks/useRerenderHandler.js
|
||||||
packages/app-mobile/components/NoteBodyViewer/hooks/useSource.js
|
packages/app-mobile/components/NoteBodyViewer/hooks/useSource.js
|
||||||
|
packages/app-mobile/components/NoteBodyViewer/types.js
|
||||||
packages/app-mobile/components/NoteEditor/CodeMirror/CodeMirror.js
|
packages/app-mobile/components/NoteEditor/CodeMirror/CodeMirror.js
|
||||||
packages/app-mobile/components/NoteEditor/CodeMirror/webviewLogger.js
|
|
||||||
packages/app-mobile/components/NoteEditor/EditLinkDialog.js
|
packages/app-mobile/components/NoteEditor/EditLinkDialog.js
|
||||||
packages/app-mobile/components/NoteEditor/ImageEditor/ImageEditor.js
|
packages/app-mobile/components/NoteEditor/ImageEditor/ImageEditor.js
|
||||||
packages/app-mobile/components/NoteEditor/ImageEditor/autosave.js
|
packages/app-mobile/components/NoteEditor/ImageEditor/autosave.js
|
||||||
@@ -444,16 +509,29 @@ packages/app-mobile/components/NoteEditor/MarkdownToolbar/ToggleSpaceButton.js
|
|||||||
packages/app-mobile/components/NoteEditor/MarkdownToolbar/Toolbar.js
|
packages/app-mobile/components/NoteEditor/MarkdownToolbar/Toolbar.js
|
||||||
packages/app-mobile/components/NoteEditor/MarkdownToolbar/ToolbarButton.js
|
packages/app-mobile/components/NoteEditor/MarkdownToolbar/ToolbarButton.js
|
||||||
packages/app-mobile/components/NoteEditor/MarkdownToolbar/ToolbarOverflowRows.js
|
packages/app-mobile/components/NoteEditor/MarkdownToolbar/ToolbarOverflowRows.js
|
||||||
|
packages/app-mobile/components/NoteEditor/MarkdownToolbar/buttons/useActionButtons.js
|
||||||
|
packages/app-mobile/components/NoteEditor/MarkdownToolbar/buttons/useHeaderButtons.js
|
||||||
|
packages/app-mobile/components/NoteEditor/MarkdownToolbar/buttons/useInlineFormattingButtons.js
|
||||||
|
packages/app-mobile/components/NoteEditor/MarkdownToolbar/buttons/useListButtons.js
|
||||||
|
packages/app-mobile/components/NoteEditor/MarkdownToolbar/buttons/usePluginButtons.js
|
||||||
packages/app-mobile/components/NoteEditor/MarkdownToolbar/types.js
|
packages/app-mobile/components/NoteEditor/MarkdownToolbar/types.js
|
||||||
packages/app-mobile/components/NoteEditor/NoteEditor.test.js
|
packages/app-mobile/components/NoteEditor/NoteEditor.test.js
|
||||||
packages/app-mobile/components/NoteEditor/NoteEditor.js
|
packages/app-mobile/components/NoteEditor/NoteEditor.js
|
||||||
packages/app-mobile/components/NoteEditor/SearchPanel.js
|
packages/app-mobile/components/NoteEditor/SearchPanel.js
|
||||||
|
packages/app-mobile/components/NoteEditor/commandDeclarations.js
|
||||||
|
packages/app-mobile/components/NoteEditor/hooks/useCodeMirrorPlugins.js
|
||||||
|
packages/app-mobile/components/NoteEditor/hooks/useEditorCommandHandler.test.js
|
||||||
|
packages/app-mobile/components/NoteEditor/hooks/useEditorCommandHandler.js
|
||||||
|
packages/app-mobile/components/NoteEditor/hooks/useKeyboardVisible.js
|
||||||
packages/app-mobile/components/NoteEditor/types.js
|
packages/app-mobile/components/NoteEditor/types.js
|
||||||
packages/app-mobile/components/NoteList.js
|
packages/app-mobile/components/NoteList.js
|
||||||
packages/app-mobile/components/ProfileSwitcher/ProfileEditor.js
|
packages/app-mobile/components/ProfileSwitcher/ProfileEditor.js
|
||||||
packages/app-mobile/components/ProfileSwitcher/ProfileSwitcher.js
|
packages/app-mobile/components/ProfileSwitcher/ProfileSwitcher.js
|
||||||
packages/app-mobile/components/ProfileSwitcher/useProfileConfig.js
|
packages/app-mobile/components/ProfileSwitcher/useProfileConfig.js
|
||||||
packages/app-mobile/components/ScreenHeader.js
|
packages/app-mobile/components/ScreenHeader/WarningBanner.test.js
|
||||||
|
packages/app-mobile/components/ScreenHeader/WarningBanner.js
|
||||||
|
packages/app-mobile/components/ScreenHeader/WarningBox.js
|
||||||
|
packages/app-mobile/components/ScreenHeader/index.js
|
||||||
packages/app-mobile/components/SelectDateTimeDialog.js
|
packages/app-mobile/components/SelectDateTimeDialog.js
|
||||||
packages/app-mobile/components/SideMenu.js
|
packages/app-mobile/components/SideMenu.js
|
||||||
packages/app-mobile/components/TextInput.js
|
packages/app-mobile/components/TextInput.js
|
||||||
@@ -464,15 +542,20 @@ packages/app-mobile/components/biometrics/biometricAuthenticate.js
|
|||||||
packages/app-mobile/components/biometrics/sensorInfo.js
|
packages/app-mobile/components/biometrics/sensorInfo.js
|
||||||
packages/app-mobile/components/getResponsiveValue.test.js
|
packages/app-mobile/components/getResponsiveValue.test.js
|
||||||
packages/app-mobile/components/getResponsiveValue.js
|
packages/app-mobile/components/getResponsiveValue.js
|
||||||
|
packages/app-mobile/components/global-style.js
|
||||||
packages/app-mobile/components/screens/ConfigScreen/ConfigScreen.js
|
packages/app-mobile/components/screens/ConfigScreen/ConfigScreen.js
|
||||||
packages/app-mobile/components/screens/ConfigScreen/FileSystemPathSelector.js
|
packages/app-mobile/components/screens/ConfigScreen/FileSystemPathSelector.js
|
||||||
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/ExportDebugReportButton.js
|
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/ExportDebugReportButton.js
|
||||||
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/ExportProfileButton.js
|
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/ExportProfileButton.js
|
||||||
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/NoteExportButton.test.js
|
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/NoteExportButton.test.js
|
||||||
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/NoteExportButton.js
|
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/NoteExportButton.js
|
||||||
|
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/NoteImportButton.js
|
||||||
|
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/TaskButton.js
|
||||||
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/utils/exportAllFolders.js
|
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/utils/exportAllFolders.js
|
||||||
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/utils/exportDebugReport.js
|
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/utils/exportDebugReport.js
|
||||||
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/utils/exportProfile.js
|
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/utils/exportProfile.js
|
||||||
|
packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/utils/makeImportExportCacheDirectory.js
|
||||||
|
packages/app-mobile/components/screens/ConfigScreen/SectionDescription.js
|
||||||
packages/app-mobile/components/screens/ConfigScreen/SectionHeader.js
|
packages/app-mobile/components/screens/ConfigScreen/SectionHeader.js
|
||||||
packages/app-mobile/components/screens/ConfigScreen/SectionSelector.js
|
packages/app-mobile/components/screens/ConfigScreen/SectionSelector.js
|
||||||
packages/app-mobile/components/screens/ConfigScreen/SettingComponent.js
|
packages/app-mobile/components/screens/ConfigScreen/SettingComponent.js
|
||||||
@@ -480,16 +563,59 @@ packages/app-mobile/components/screens/ConfigScreen/SettingItem.js
|
|||||||
packages/app-mobile/components/screens/ConfigScreen/SettingsButton.js
|
packages/app-mobile/components/screens/ConfigScreen/SettingsButton.js
|
||||||
packages/app-mobile/components/screens/ConfigScreen/SettingsToggle.js
|
packages/app-mobile/components/screens/ConfigScreen/SettingsToggle.js
|
||||||
packages/app-mobile/components/screens/ConfigScreen/configScreenStyles.js
|
packages/app-mobile/components/screens/ConfigScreen/configScreenStyles.js
|
||||||
|
packages/app-mobile/components/screens/ConfigScreen/plugins/PluginBox/ActionButton.js
|
||||||
|
packages/app-mobile/components/screens/ConfigScreen/plugins/PluginBox/index.js
|
||||||
|
packages/app-mobile/components/screens/ConfigScreen/plugins/PluginStates.test.js
|
||||||
|
packages/app-mobile/components/screens/ConfigScreen/plugins/PluginStates.js
|
||||||
|
packages/app-mobile/components/screens/ConfigScreen/plugins/PluginToggle.js
|
||||||
|
packages/app-mobile/components/screens/ConfigScreen/plugins/PluginUploadButton.js
|
||||||
|
packages/app-mobile/components/screens/ConfigScreen/plugins/SearchPlugins.test.js
|
||||||
|
packages/app-mobile/components/screens/ConfigScreen/plugins/SearchPlugins.js
|
||||||
|
packages/app-mobile/components/screens/ConfigScreen/plugins/testUtils/newRepoApi.js
|
||||||
|
packages/app-mobile/components/screens/ConfigScreen/plugins/testUtils/pluginServiceSetup.js
|
||||||
|
packages/app-mobile/components/screens/ConfigScreen/plugins/utils/openWebsiteForPlugin.js
|
||||||
|
packages/app-mobile/components/screens/ConfigScreen/plugins/utils/useRepoApi.js
|
||||||
packages/app-mobile/components/screens/ConfigScreen/types.js
|
packages/app-mobile/components/screens/ConfigScreen/types.js
|
||||||
|
packages/app-mobile/components/screens/JoplinCloudLoginScreen.js
|
||||||
packages/app-mobile/components/screens/LogScreen.js
|
packages/app-mobile/components/screens/LogScreen.js
|
||||||
packages/app-mobile/components/screens/Note.js
|
packages/app-mobile/components/screens/Note.js
|
||||||
|
packages/app-mobile/components/screens/NoteTagsDialog.js
|
||||||
packages/app-mobile/components/screens/Notes.js
|
packages/app-mobile/components/screens/Notes.js
|
||||||
|
packages/app-mobile/components/screens/ShareManager/AcceptedShareItem.js
|
||||||
|
packages/app-mobile/components/screens/ShareManager/IncomingShareItem.js
|
||||||
|
packages/app-mobile/components/screens/ShareManager/index.test.js
|
||||||
|
packages/app-mobile/components/screens/ShareManager/index.js
|
||||||
packages/app-mobile/components/screens/UpgradeSyncTargetScreen.js
|
packages/app-mobile/components/screens/UpgradeSyncTargetScreen.js
|
||||||
packages/app-mobile/components/screens/encryption-config.js
|
packages/app-mobile/components/screens/encryption-config.js
|
||||||
packages/app-mobile/components/screens/search.js
|
packages/app-mobile/components/screens/search.js
|
||||||
|
packages/app-mobile/components/screens/status.js
|
||||||
packages/app-mobile/components/side-menu-content.js
|
packages/app-mobile/components/side-menu-content.js
|
||||||
packages/app-mobile/components/voiceTyping/VoiceTypingDialog.js
|
packages/app-mobile/components/voiceTyping/VoiceTypingDialog.js
|
||||||
packages/app-mobile/gulpfile.js
|
packages/app-mobile/gulpfile.js
|
||||||
|
packages/app-mobile/plugins/PlatformImplementation.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/PluginRunner.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/PluginRunnerWebView.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/backgroundPage/initializeDialogWebView.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/backgroundPage/initializePluginBackgroundIframe.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/backgroundPage/pluginRunnerBackgroundPage.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/backgroundPage/startStopPlugin.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/backgroundPage/utils/getFormData.test.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/backgroundPage/utils/getFormData.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/backgroundPage/utils/makeSandboxedIframe.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/backgroundPage/utils/reportUnhandledErrors.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/backgroundPage/utils/wrapConsoleLog.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/dialogs/PluginDialogManager.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/dialogs/PluginDialogWebView.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/dialogs/PluginPanelViewer.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/dialogs/PluginUserWebView.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/dialogs/hooks/useDialogMessenger.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/dialogs/hooks/useDialogSize.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/dialogs/hooks/useViewInfos.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/dialogs/hooks/useWebViewSetup.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/types.js
|
||||||
|
packages/app-mobile/plugins/PluginRunner/utils/createOnLogHandler.js
|
||||||
|
packages/app-mobile/plugins/hooks/usePlugin.js
|
||||||
|
packages/app-mobile/plugins/loadPlugins.js
|
||||||
packages/app-mobile/root.js
|
packages/app-mobile/root.js
|
||||||
packages/app-mobile/services/AlarmServiceDriver.android.js
|
packages/app-mobile/services/AlarmServiceDriver.android.js
|
||||||
packages/app-mobile/services/AlarmServiceDriver.ios.js
|
packages/app-mobile/services/AlarmServiceDriver.ios.js
|
||||||
@@ -506,22 +632,39 @@ packages/app-mobile/utils/ShareExtension.js
|
|||||||
packages/app-mobile/utils/ShareUtils.test.js
|
packages/app-mobile/utils/ShareUtils.test.js
|
||||||
packages/app-mobile/utils/ShareUtils.js
|
packages/app-mobile/utils/ShareUtils.js
|
||||||
packages/app-mobile/utils/TlsUtils.js
|
packages/app-mobile/utils/TlsUtils.js
|
||||||
|
packages/app-mobile/utils/appDefaultState.js
|
||||||
packages/app-mobile/utils/autodetectTheme.js
|
packages/app-mobile/utils/autodetectTheme.js
|
||||||
packages/app-mobile/utils/checkPermissions.js
|
packages/app-mobile/utils/checkPermissions.js
|
||||||
packages/app-mobile/utils/createRootStyle.js
|
packages/app-mobile/utils/createRootStyle.js
|
||||||
packages/app-mobile/utils/debounce.js
|
packages/app-mobile/utils/debounce.js
|
||||||
|
packages/app-mobile/utils/fs-driver/constants.js
|
||||||
packages/app-mobile/utils/fs-driver/fs-driver-rn.js
|
packages/app-mobile/utils/fs-driver/fs-driver-rn.js
|
||||||
packages/app-mobile/utils/fs-driver/runOnDeviceTests.js
|
packages/app-mobile/utils/fs-driver/runOnDeviceTests.js
|
||||||
|
packages/app-mobile/utils/fs-driver/tarCreate.js
|
||||||
|
packages/app-mobile/utils/fs-driver/tarExtract.test.js
|
||||||
|
packages/app-mobile/utils/fs-driver/tarExtract.js
|
||||||
|
packages/app-mobile/utils/fs-driver/testUtil/createFilesFromPathRecord.js
|
||||||
|
packages/app-mobile/utils/fs-driver/testUtil/verifyDirectoryMatches.js
|
||||||
|
packages/app-mobile/utils/initializeCommandService.js
|
||||||
|
packages/app-mobile/utils/ipc/RNToWebViewMessenger.js
|
||||||
|
packages/app-mobile/utils/ipc/WebViewToRNMessenger.js
|
||||||
|
packages/app-mobile/utils/pickDocument.js
|
||||||
|
packages/app-mobile/utils/polyfills/bufferPolyfill.js
|
||||||
|
packages/app-mobile/utils/polyfills/index.js
|
||||||
packages/app-mobile/utils/setupNotifications.js
|
packages/app-mobile/utils/setupNotifications.js
|
||||||
packages/app-mobile/utils/shareHandler.js
|
packages/app-mobile/utils/shareHandler.js
|
||||||
|
packages/app-mobile/utils/showMessageBox.js
|
||||||
|
packages/app-mobile/utils/testing/createMockReduxStore.js
|
||||||
packages/app-mobile/utils/types.js
|
packages/app-mobile/utils/types.js
|
||||||
packages/default-plugins/build.js
|
packages/default-plugins/build.js
|
||||||
packages/default-plugins/buildDefaultPlugins.js
|
packages/default-plugins/buildDefaultPlugins.js
|
||||||
packages/default-plugins/commands/buildAll.js
|
packages/default-plugins/commands/buildAll.js
|
||||||
packages/default-plugins/commands/editPatch.js
|
packages/default-plugins/commands/editPatch.js
|
||||||
|
packages/default-plugins/utils/getCurrentCommitHash.js
|
||||||
packages/default-plugins/utils/getPathToPatchFileFor.js
|
packages/default-plugins/utils/getPathToPatchFileFor.js
|
||||||
packages/default-plugins/utils/readRepositoryJson.js
|
packages/default-plugins/utils/readRepositoryJson.js
|
||||||
packages/default-plugins/utils/waitForCliInput.js
|
packages/default-plugins/utils/waitForCliInput.js
|
||||||
|
packages/editor/CodeMirror/CodeMirror5Emulation/CodeMirror5BuiltInOptions.js
|
||||||
packages/editor/CodeMirror/CodeMirror5Emulation/CodeMirror5Emulation.test.js
|
packages/editor/CodeMirror/CodeMirror5Emulation/CodeMirror5Emulation.test.js
|
||||||
packages/editor/CodeMirror/CodeMirror5Emulation/CodeMirror5Emulation.js
|
packages/editor/CodeMirror/CodeMirror5Emulation/CodeMirror5Emulation.js
|
||||||
packages/editor/CodeMirror/CodeMirror5Emulation/Decorator.js
|
packages/editor/CodeMirror/CodeMirror5Emulation/Decorator.js
|
||||||
@@ -530,12 +673,23 @@ packages/editor/CodeMirror/CodeMirrorControl.js
|
|||||||
packages/editor/CodeMirror/configFromSettings.js
|
packages/editor/CodeMirror/configFromSettings.js
|
||||||
packages/editor/CodeMirror/createEditor.test.js
|
packages/editor/CodeMirror/createEditor.test.js
|
||||||
packages/editor/CodeMirror/createEditor.js
|
packages/editor/CodeMirror/createEditor.js
|
||||||
|
packages/editor/CodeMirror/editorCommands/duplicateLine.test.js
|
||||||
|
packages/editor/CodeMirror/editorCommands/duplicateLine.js
|
||||||
packages/editor/CodeMirror/editorCommands/editorCommands.js
|
packages/editor/CodeMirror/editorCommands/editorCommands.js
|
||||||
|
packages/editor/CodeMirror/editorCommands/insertLineAfter.test.js
|
||||||
|
packages/editor/CodeMirror/editorCommands/insertLineAfter.js
|
||||||
|
packages/editor/CodeMirror/editorCommands/sortSelectedLines.test.js
|
||||||
|
packages/editor/CodeMirror/editorCommands/sortSelectedLines.js
|
||||||
packages/editor/CodeMirror/editorCommands/supportsCommand.js
|
packages/editor/CodeMirror/editorCommands/supportsCommand.js
|
||||||
|
packages/editor/CodeMirror/editorCommands/swapLine.test.js
|
||||||
packages/editor/CodeMirror/editorCommands/swapLine.js
|
packages/editor/CodeMirror/editorCommands/swapLine.js
|
||||||
packages/editor/CodeMirror/getScrollFraction.js
|
packages/editor/CodeMirror/getScrollFraction.js
|
||||||
|
packages/editor/CodeMirror/markdown/codeBlockLanguages/allLanguages.js
|
||||||
|
packages/editor/CodeMirror/markdown/codeBlockLanguages/defaultLanguage.js
|
||||||
|
packages/editor/CodeMirror/markdown/codeBlockLanguages/lookUpLanguage.js
|
||||||
packages/editor/CodeMirror/markdown/computeSelectionFormatting.test.js
|
packages/editor/CodeMirror/markdown/computeSelectionFormatting.test.js
|
||||||
packages/editor/CodeMirror/markdown/computeSelectionFormatting.js
|
packages/editor/CodeMirror/markdown/computeSelectionFormatting.js
|
||||||
|
packages/editor/CodeMirror/markdown/decoratorExtension.test.js
|
||||||
packages/editor/CodeMirror/markdown/decoratorExtension.js
|
packages/editor/CodeMirror/markdown/decoratorExtension.js
|
||||||
packages/editor/CodeMirror/markdown/markdownCommands.bulletedVsChecklist.test.js
|
packages/editor/CodeMirror/markdown/markdownCommands.bulletedVsChecklist.test.js
|
||||||
packages/editor/CodeMirror/markdown/markdownCommands.test.js
|
packages/editor/CodeMirror/markdown/markdownCommands.test.js
|
||||||
@@ -545,15 +699,20 @@ packages/editor/CodeMirror/markdown/markdownMathParser.test.js
|
|||||||
packages/editor/CodeMirror/markdown/markdownMathParser.js
|
packages/editor/CodeMirror/markdown/markdownMathParser.js
|
||||||
packages/editor/CodeMirror/markdown/markdownReformatter.test.js
|
packages/editor/CodeMirror/markdown/markdownReformatter.test.js
|
||||||
packages/editor/CodeMirror/markdown/markdownReformatter.js
|
packages/editor/CodeMirror/markdown/markdownReformatter.js
|
||||||
packages/editor/CodeMirror/markdown/syntaxHighlightingLanguages.js
|
|
||||||
packages/editor/CodeMirror/pluginApi/PluginLoader.js
|
packages/editor/CodeMirror/pluginApi/PluginLoader.js
|
||||||
packages/editor/CodeMirror/pluginApi/codeMirrorRequire.js
|
packages/editor/CodeMirror/pluginApi/codeMirrorRequire.js
|
||||||
|
packages/editor/CodeMirror/pluginApi/customEditorCompletion.test.js
|
||||||
|
packages/editor/CodeMirror/pluginApi/customEditorCompletion.js
|
||||||
|
packages/editor/CodeMirror/testUtil/createEditorControl.js
|
||||||
packages/editor/CodeMirror/testUtil/createEditorSettings.js
|
packages/editor/CodeMirror/testUtil/createEditorSettings.js
|
||||||
packages/editor/CodeMirror/testUtil/createTestEditor.js
|
packages/editor/CodeMirror/testUtil/createTestEditor.js
|
||||||
packages/editor/CodeMirror/testUtil/forceFullParse.js
|
packages/editor/CodeMirror/testUtil/forceFullParse.js
|
||||||
packages/editor/CodeMirror/testUtil/loadLanguages.js
|
packages/editor/CodeMirror/testUtil/loadLanguages.js
|
||||||
|
packages/editor/CodeMirror/testUtil/pressReleaseKey.js
|
||||||
|
packages/editor/CodeMirror/testUtil/typeText.js
|
||||||
packages/editor/CodeMirror/theme.js
|
packages/editor/CodeMirror/theme.js
|
||||||
packages/editor/CodeMirror/util/isInSyntaxNode.js
|
packages/editor/CodeMirror/util/isInSyntaxNode.js
|
||||||
|
packages/editor/CodeMirror/util/setupVim.js
|
||||||
packages/editor/SelectionFormatting.js
|
packages/editor/SelectionFormatting.js
|
||||||
packages/editor/events.js
|
packages/editor/events.js
|
||||||
packages/editor/types.js
|
packages/editor/types.js
|
||||||
@@ -576,6 +735,7 @@ packages/generator-joplin/generators/app/templates/api/noteListType.js
|
|||||||
packages/generator-joplin/generators/app/templates/api/types.js
|
packages/generator-joplin/generators/app/templates/api/types.js
|
||||||
packages/generator-joplin/generators/app/templates/api_index.js
|
packages/generator-joplin/generators/app/templates/api_index.js
|
||||||
packages/generator-joplin/generators/app/templates/src/index.js
|
packages/generator-joplin/generators/app/templates/src/index.js
|
||||||
|
packages/generator-joplin/tools/updateCategories.js
|
||||||
packages/htmlpack/src/index.js
|
packages/htmlpack/src/index.js
|
||||||
packages/lib/ArrayUtils.js
|
packages/lib/ArrayUtils.js
|
||||||
packages/lib/AsyncActionQueue.js
|
packages/lib/AsyncActionQueue.js
|
||||||
@@ -615,21 +775,31 @@ packages/lib/commands/openMasterPasswordDialog.js
|
|||||||
packages/lib/commands/synchronize.js
|
packages/lib/commands/synchronize.js
|
||||||
packages/lib/components/EncryptionConfigScreen/utils.js
|
packages/lib/components/EncryptionConfigScreen/utils.js
|
||||||
packages/lib/components/shared/config/config-shared.js
|
packages/lib/components/shared/config/config-shared.js
|
||||||
|
packages/lib/components/shared/config/plugins/types.js
|
||||||
|
packages/lib/components/shared/config/plugins/useOnDeleteHandler.js
|
||||||
|
packages/lib/components/shared/config/plugins/useOnInstallHandler.test.js
|
||||||
|
packages/lib/components/shared/config/plugins/useOnInstallHandler.js
|
||||||
packages/lib/components/shared/config/shouldShowMissingPasswordWarning.test.js
|
packages/lib/components/shared/config/shouldShowMissingPasswordWarning.test.js
|
||||||
packages/lib/components/shared/config/shouldShowMissingPasswordWarning.js
|
packages/lib/components/shared/config/shouldShowMissingPasswordWarning.js
|
||||||
packages/lib/components/shared/note-screen-shared.js
|
packages/lib/components/shared/note-screen-shared.js
|
||||||
packages/lib/components/shared/reduxSharedMiddleware.js
|
packages/lib/components/shared/reduxSharedMiddleware.js
|
||||||
|
packages/lib/components/shared/side-menu-shared.test.js
|
||||||
|
packages/lib/components/shared/side-menu-shared.js
|
||||||
packages/lib/database-driver-better-sqlite.js
|
packages/lib/database-driver-better-sqlite.js
|
||||||
packages/lib/database.js
|
packages/lib/database.js
|
||||||
packages/lib/debug/DebugService.js
|
packages/lib/debug/DebugService.js
|
||||||
|
packages/lib/determineBaseAppDirs.js
|
||||||
packages/lib/dom.js
|
packages/lib/dom.js
|
||||||
|
packages/lib/downloadController.js
|
||||||
packages/lib/errorUtils.js
|
packages/lib/errorUtils.js
|
||||||
packages/lib/errors.js
|
packages/lib/errors.js
|
||||||
packages/lib/eventManager.js
|
packages/lib/eventManager.js
|
||||||
packages/lib/file-api-driver-joplinServer.js
|
packages/lib/file-api-driver-joplinServer.js
|
||||||
packages/lib/file-api-driver-memory.js
|
packages/lib/file-api-driver-memory.js
|
||||||
packages/lib/file-api-driver.test.js
|
packages/lib/file-api-driver.test.js
|
||||||
|
packages/lib/file-api.test.js
|
||||||
packages/lib/file-api.js
|
packages/lib/file-api.js
|
||||||
|
packages/lib/folders-screen-utils.js
|
||||||
packages/lib/fs-driver-base.js
|
packages/lib/fs-driver-base.js
|
||||||
packages/lib/fs-driver-node.js
|
packages/lib/fs-driver-node.js
|
||||||
packages/lib/fsDriver.test.js
|
packages/lib/fsDriver.test.js
|
||||||
@@ -637,6 +807,7 @@ packages/lib/geolocation-node.js
|
|||||||
packages/lib/hooks/useAsyncEffect.js
|
packages/lib/hooks/useAsyncEffect.js
|
||||||
packages/lib/hooks/useElementSize.js
|
packages/lib/hooks/useElementSize.js
|
||||||
packages/lib/hooks/useEventListener.js
|
packages/lib/hooks/useEventListener.js
|
||||||
|
packages/lib/hooks/usePrevious.js
|
||||||
packages/lib/htmlUtils.test.js
|
packages/lib/htmlUtils.test.js
|
||||||
packages/lib/htmlUtils.js
|
packages/lib/htmlUtils.js
|
||||||
packages/lib/htmlUtils2.test.js
|
packages/lib/htmlUtils2.test.js
|
||||||
@@ -677,19 +848,29 @@ packages/lib/models/Search.js
|
|||||||
packages/lib/models/Setting.test.js
|
packages/lib/models/Setting.test.js
|
||||||
packages/lib/models/Setting.js
|
packages/lib/models/Setting.js
|
||||||
packages/lib/models/SmartFilter.js
|
packages/lib/models/SmartFilter.js
|
||||||
|
packages/lib/models/Tag.test.js
|
||||||
packages/lib/models/Tag.js
|
packages/lib/models/Tag.js
|
||||||
packages/lib/models/dateTimeFormats.test.js
|
packages/lib/models/dateTimeFormats.test.js
|
||||||
packages/lib/models/settings/FileHandler.js
|
packages/lib/models/settings/FileHandler.js
|
||||||
|
packages/lib/models/settings/settingValidations.test.js
|
||||||
|
packages/lib/models/settings/settingValidations.js
|
||||||
|
packages/lib/models/utils/getCollator.js
|
||||||
|
packages/lib/models/utils/getConflictFolderId.js
|
||||||
packages/lib/models/utils/isItemId.js
|
packages/lib/models/utils/isItemId.js
|
||||||
packages/lib/models/utils/itemCanBeEncrypted.js
|
packages/lib/models/utils/itemCanBeEncrypted.js
|
||||||
|
packages/lib/models/utils/onFolderDrop.test.js
|
||||||
|
packages/lib/models/utils/onFolderDrop.js
|
||||||
packages/lib/models/utils/paginatedFeed.js
|
packages/lib/models/utils/paginatedFeed.js
|
||||||
packages/lib/models/utils/paginationToSql.js
|
packages/lib/models/utils/paginationToSql.js
|
||||||
|
packages/lib/models/utils/readOnly.test.js
|
||||||
packages/lib/models/utils/readOnly.js
|
packages/lib/models/utils/readOnly.js
|
||||||
|
packages/lib/models/utils/resourceUtils.js
|
||||||
packages/lib/models/utils/types.js
|
packages/lib/models/utils/types.js
|
||||||
packages/lib/models/utils/userData.test.js
|
packages/lib/models/utils/userData.test.js
|
||||||
packages/lib/models/utils/userData.js
|
packages/lib/models/utils/userData.js
|
||||||
packages/lib/net-utils.js
|
packages/lib/net-utils.js
|
||||||
packages/lib/ntp.js
|
packages/lib/ntp.js
|
||||||
|
packages/lib/onedrive-api.test.js
|
||||||
packages/lib/onedrive-api.js
|
packages/lib/onedrive-api.js
|
||||||
packages/lib/path-utils.js
|
packages/lib/path-utils.js
|
||||||
packages/lib/reducer.js
|
packages/lib/reducer.js
|
||||||
@@ -711,6 +892,7 @@ packages/lib/services/KvStore.js
|
|||||||
packages/lib/services/MigrationService.js
|
packages/lib/services/MigrationService.js
|
||||||
packages/lib/services/NavService.js
|
packages/lib/services/NavService.js
|
||||||
packages/lib/services/PostMessageService.js
|
packages/lib/services/PostMessageService.js
|
||||||
|
packages/lib/services/ReportService.test.js
|
||||||
packages/lib/services/ReportService.js
|
packages/lib/services/ReportService.js
|
||||||
packages/lib/services/ResourceEditWatcher/index.js
|
packages/lib/services/ResourceEditWatcher/index.js
|
||||||
packages/lib/services/ResourceEditWatcher/reducer.js
|
packages/lib/services/ResourceEditWatcher/reducer.js
|
||||||
@@ -732,10 +914,14 @@ packages/lib/services/commands/propsHaveChanged.js
|
|||||||
packages/lib/services/commands/stateToWhenClauseContext.js
|
packages/lib/services/commands/stateToWhenClauseContext.js
|
||||||
packages/lib/services/contextkey/contextkey.js
|
packages/lib/services/contextkey/contextkey.js
|
||||||
packages/lib/services/database/addMigrationFile.js
|
packages/lib/services/database/addMigrationFile.js
|
||||||
|
packages/lib/services/database/isSqliteSyntaxError.js
|
||||||
packages/lib/services/database/migrations/42.js
|
packages/lib/services/database/migrations/42.js
|
||||||
packages/lib/services/database/migrations/43.js
|
packages/lib/services/database/migrations/43.js
|
||||||
packages/lib/services/database/migrations/44.js
|
packages/lib/services/database/migrations/44.js
|
||||||
packages/lib/services/database/migrations/45.js
|
packages/lib/services/database/migrations/45.js
|
||||||
|
packages/lib/services/database/migrations/46.js
|
||||||
|
packages/lib/services/database/migrations/47.js
|
||||||
|
packages/lib/services/database/migrations/index.js
|
||||||
packages/lib/services/database/sqlStringToLines.js
|
packages/lib/services/database/sqlStringToLines.js
|
||||||
packages/lib/services/database/types.js
|
packages/lib/services/database/types.js
|
||||||
packages/lib/services/debug/populateDatabase.js
|
packages/lib/services/debug/populateDatabase.js
|
||||||
@@ -774,6 +960,7 @@ packages/lib/services/interop/InteropService_Importer_Raw.js
|
|||||||
packages/lib/services/interop/Module.test.js
|
packages/lib/services/interop/Module.test.js
|
||||||
packages/lib/services/interop/Module.js
|
packages/lib/services/interop/Module.js
|
||||||
packages/lib/services/interop/types.js
|
packages/lib/services/interop/types.js
|
||||||
|
packages/lib/services/joplinCloudUtils.js
|
||||||
packages/lib/services/joplinServer/personalizedUserContentBaseUrl.js
|
packages/lib/services/joplinServer/personalizedUserContentBaseUrl.js
|
||||||
packages/lib/services/keychain/KeychainService.js
|
packages/lib/services/keychain/KeychainService.js
|
||||||
packages/lib/services/keychain/KeychainServiceDriver.dummy.js
|
packages/lib/services/keychain/KeychainServiceDriver.dummy.js
|
||||||
@@ -782,6 +969,12 @@ packages/lib/services/keychain/KeychainServiceDriver.node.js
|
|||||||
packages/lib/services/keychain/KeychainServiceDriverBase.js
|
packages/lib/services/keychain/KeychainServiceDriverBase.js
|
||||||
packages/lib/services/noteList/defaultLeftToRightListRenderer.js
|
packages/lib/services/noteList/defaultLeftToRightListRenderer.js
|
||||||
packages/lib/services/noteList/defaultListRenderer.js
|
packages/lib/services/noteList/defaultListRenderer.js
|
||||||
|
packages/lib/services/noteList/defaultMultiColumnsRenderer.js
|
||||||
|
packages/lib/services/noteList/depNameToNoteProp.js
|
||||||
|
packages/lib/services/noteList/renderTemplate.test.js
|
||||||
|
packages/lib/services/noteList/renderTemplate.js
|
||||||
|
packages/lib/services/noteList/renderViewProps.test.js
|
||||||
|
packages/lib/services/noteList/renderViewProps.js
|
||||||
packages/lib/services/noteList/renderers.js
|
packages/lib/services/noteList/renderers.js
|
||||||
packages/lib/services/ocr/OcrDriverBase.js
|
packages/lib/services/ocr/OcrDriverBase.js
|
||||||
packages/lib/services/ocr/OcrService.test.js
|
packages/lib/services/ocr/OcrService.test.js
|
||||||
@@ -827,6 +1020,13 @@ packages/lib/services/plugins/defaultPlugins/desktopDefaultPluginsInfo.js
|
|||||||
packages/lib/services/plugins/reducer.js
|
packages/lib/services/plugins/reducer.js
|
||||||
packages/lib/services/plugins/utils/createViewHandle.js
|
packages/lib/services/plugins/utils/createViewHandle.js
|
||||||
packages/lib/services/plugins/utils/executeSandboxCall.js
|
packages/lib/services/plugins/utils/executeSandboxCall.js
|
||||||
|
packages/lib/services/plugins/utils/getPluginNamespacedSettingKey.js
|
||||||
|
packages/lib/services/plugins/utils/getPluginSettingKeyPrefix.js
|
||||||
|
packages/lib/services/plugins/utils/getPluginSettingValue.js
|
||||||
|
packages/lib/services/plugins/utils/isCompatible/index.test.js
|
||||||
|
packages/lib/services/plugins/utils/isCompatible/index.js
|
||||||
|
packages/lib/services/plugins/utils/isCompatible/minVersionForPlatform.js
|
||||||
|
packages/lib/services/plugins/utils/isCompatible/types.js
|
||||||
packages/lib/services/plugins/utils/loadContentScripts.js
|
packages/lib/services/plugins/utils/loadContentScripts.js
|
||||||
packages/lib/services/plugins/utils/makeListener.js
|
packages/lib/services/plugins/utils/makeListener.js
|
||||||
packages/lib/services/plugins/utils/manifestFromObject.js
|
packages/lib/services/plugins/utils/manifestFromObject.js
|
||||||
@@ -834,6 +1034,8 @@ packages/lib/services/plugins/utils/mapEventHandlersToIds.js
|
|||||||
packages/lib/services/plugins/utils/types.js
|
packages/lib/services/plugins/utils/types.js
|
||||||
packages/lib/services/plugins/utils/validatePluginId.test.js
|
packages/lib/services/plugins/utils/validatePluginId.test.js
|
||||||
packages/lib/services/plugins/utils/validatePluginId.js
|
packages/lib/services/plugins/utils/validatePluginId.js
|
||||||
|
packages/lib/services/plugins/utils/validatePluginPlatforms.test.js
|
||||||
|
packages/lib/services/plugins/utils/validatePluginPlatforms.js
|
||||||
packages/lib/services/plugins/utils/validatePluginVersion.test.js
|
packages/lib/services/plugins/utils/validatePluginVersion.test.js
|
||||||
packages/lib/services/plugins/utils/validatePluginVersion.js
|
packages/lib/services/plugins/utils/validatePluginVersion.js
|
||||||
packages/lib/services/profileConfig/index.test.js
|
packages/lib/services/profileConfig/index.test.js
|
||||||
@@ -849,6 +1051,7 @@ packages/lib/services/rest/actionApi.desktop.js
|
|||||||
packages/lib/services/rest/routes/auth.js
|
packages/lib/services/rest/routes/auth.js
|
||||||
packages/lib/services/rest/routes/events.test.js
|
packages/lib/services/rest/routes/events.test.js
|
||||||
packages/lib/services/rest/routes/events.js
|
packages/lib/services/rest/routes/events.js
|
||||||
|
packages/lib/services/rest/routes/folders.test.js
|
||||||
packages/lib/services/rest/routes/folders.js
|
packages/lib/services/rest/routes/folders.js
|
||||||
packages/lib/services/rest/routes/master_keys.js
|
packages/lib/services/rest/routes/master_keys.js
|
||||||
packages/lib/services/rest/routes/notes.test.js
|
packages/lib/services/rest/routes/notes.test.js
|
||||||
@@ -867,18 +1070,20 @@ packages/lib/services/rest/utils/paginatedResults.js
|
|||||||
packages/lib/services/rest/utils/readonlyProperties.js
|
packages/lib/services/rest/utils/readonlyProperties.js
|
||||||
packages/lib/services/rest/utils/requestFields.js
|
packages/lib/services/rest/utils/requestFields.js
|
||||||
packages/lib/services/rest/utils/requestPaginationOptions.js
|
packages/lib/services/rest/utils/requestPaginationOptions.js
|
||||||
packages/lib/services/searchengine/SearchEngine.resources.test.js
|
packages/lib/services/search/SearchEngine.resources.test.js
|
||||||
packages/lib/services/searchengine/SearchEngine.js
|
packages/lib/services/search/SearchEngine.test.js
|
||||||
packages/lib/services/searchengine/SearchEngineUtils.test.js
|
packages/lib/services/search/SearchEngine.js
|
||||||
packages/lib/services/searchengine/SearchEngineUtils.js
|
packages/lib/services/search/SearchEngineUtils.test.js
|
||||||
packages/lib/services/searchengine/SearchFilter.test.js
|
packages/lib/services/search/SearchEngineUtils.js
|
||||||
packages/lib/services/searchengine/filterParser.test.js
|
packages/lib/services/search/SearchFilter.test.js
|
||||||
packages/lib/services/searchengine/filterParser.js
|
packages/lib/services/search/filterParser.test.js
|
||||||
packages/lib/services/searchengine/gotoAnythingStyleQuery.test.js
|
packages/lib/services/search/filterParser.js
|
||||||
packages/lib/services/searchengine/gotoAnythingStyleQuery.js
|
packages/lib/services/search/gotoAnythingStyleQuery.test.js
|
||||||
packages/lib/services/searchengine/queryBuilder.js
|
packages/lib/services/search/gotoAnythingStyleQuery.js
|
||||||
|
packages/lib/services/search/queryBuilder.js
|
||||||
packages/lib/services/share/ShareService.test.js
|
packages/lib/services/share/ShareService.test.js
|
||||||
packages/lib/services/share/ShareService.js
|
packages/lib/services/share/ShareService.js
|
||||||
|
packages/lib/services/share/invitationRespond.js
|
||||||
packages/lib/services/share/reducer.js
|
packages/lib/services/share/reducer.js
|
||||||
packages/lib/services/spellChecker/SpellCheckerService.js
|
packages/lib/services/spellChecker/SpellCheckerService.js
|
||||||
packages/lib/services/spellChecker/SpellCheckerServiceDriverBase.js
|
packages/lib/services/spellChecker/SpellCheckerServiceDriverBase.js
|
||||||
@@ -910,13 +1115,28 @@ packages/lib/services/synchronizer/syncInfoUtils.js
|
|||||||
packages/lib/services/synchronizer/synchronizer_LockHandler.test.js
|
packages/lib/services/synchronizer/synchronizer_LockHandler.test.js
|
||||||
packages/lib/services/synchronizer/synchronizer_MigrationHandler.test.js
|
packages/lib/services/synchronizer/synchronizer_MigrationHandler.test.js
|
||||||
packages/lib/services/synchronizer/tools.js
|
packages/lib/services/synchronizer/tools.js
|
||||||
|
packages/lib/services/synchronizer/utils/checkDisabledSyncItemsNotification.js
|
||||||
packages/lib/services/synchronizer/utils/handleConflictAction.js
|
packages/lib/services/synchronizer/utils/handleConflictAction.js
|
||||||
packages/lib/services/synchronizer/utils/handleSyncStartupOperation.js
|
packages/lib/services/synchronizer/utils/handleSyncStartupOperation.js
|
||||||
packages/lib/services/synchronizer/utils/resourceRemotePath.js
|
packages/lib/services/synchronizer/utils/resourceRemotePath.js
|
||||||
packages/lib/services/synchronizer/utils/syncDeleteStep.js
|
packages/lib/services/synchronizer/utils/syncDeleteStep.js
|
||||||
packages/lib/services/synchronizer/utils/types.js
|
packages/lib/services/synchronizer/utils/types.js
|
||||||
|
packages/lib/services/trash/emptyTrash.test.js
|
||||||
|
packages/lib/services/trash/emptyTrash.js
|
||||||
|
packages/lib/services/trash/getTrashFolderId.js
|
||||||
|
packages/lib/services/trash/index.test.js
|
||||||
|
packages/lib/services/trash/index.js
|
||||||
|
packages/lib/services/trash/isTrashableItem.js
|
||||||
|
packages/lib/services/trash/permanentlyDeleteOldItems.test.js
|
||||||
|
packages/lib/services/trash/permanentlyDeleteOldItems.js
|
||||||
|
packages/lib/services/trash/restoreItems.test.js
|
||||||
|
packages/lib/services/trash/restoreItems.js
|
||||||
packages/lib/shim-init-node.js
|
packages/lib/shim-init-node.js
|
||||||
packages/lib/shim.js
|
packages/lib/shim.js
|
||||||
|
packages/lib/string-utils.test.js
|
||||||
|
packages/lib/string-utils.js
|
||||||
|
packages/lib/testing/share/makeMockShareInvitation.js
|
||||||
|
packages/lib/testing/share/mockShareService.js
|
||||||
packages/lib/testing/syncTargetUtils.js
|
packages/lib/testing/syncTargetUtils.js
|
||||||
packages/lib/testing/test-utils-synchronizer.js
|
packages/lib/testing/test-utils-synchronizer.js
|
||||||
packages/lib/testing/test-utils.js
|
packages/lib/testing/test-utils.js
|
||||||
@@ -932,9 +1152,24 @@ packages/lib/themes/solarizedLight.js
|
|||||||
packages/lib/themes/type.js
|
packages/lib/themes/type.js
|
||||||
packages/lib/time.js
|
packages/lib/time.js
|
||||||
packages/lib/types.js
|
packages/lib/types.js
|
||||||
|
packages/lib/utils/ActionLogger.test.js
|
||||||
|
packages/lib/utils/ActionLogger.js
|
||||||
packages/lib/utils/credentialFiles.js
|
packages/lib/utils/credentialFiles.js
|
||||||
|
packages/lib/utils/focusHandler.js
|
||||||
|
packages/lib/utils/ipc/RemoteMessenger.test.js
|
||||||
|
packages/lib/utils/ipc/RemoteMessenger.js
|
||||||
|
packages/lib/utils/ipc/TestMessenger.js
|
||||||
|
packages/lib/utils/ipc/WindowMessenger.js
|
||||||
|
packages/lib/utils/ipc/types.js
|
||||||
|
packages/lib/utils/ipc/utils/mergeCallbacksAndSerializable.test.js
|
||||||
|
packages/lib/utils/ipc/utils/mergeCallbacksAndSerializable.js
|
||||||
|
packages/lib/utils/ipc/utils/separateCallbacksFromSerializable.test.js
|
||||||
|
packages/lib/utils/ipc/utils/separateCallbacksFromSerializable.js
|
||||||
|
packages/lib/utils/ipc/utils/separateCallbacksFromSerializableArray.js
|
||||||
packages/lib/utils/joplinCloud.js
|
packages/lib/utils/joplinCloud.js
|
||||||
packages/lib/utils/processStartFlags.js
|
packages/lib/utils/processStartFlags.js
|
||||||
|
packages/lib/utils/replaceUnsupportedCharacters.test.js
|
||||||
|
packages/lib/utils/replaceUnsupportedCharacters.js
|
||||||
packages/lib/utils/userFetcher.js
|
packages/lib/utils/userFetcher.js
|
||||||
packages/lib/utils/webDAVUtils.test.js
|
packages/lib/utils/webDAVUtils.test.js
|
||||||
packages/lib/utils/webDAVUtils.js
|
packages/lib/utils/webDAVUtils.js
|
||||||
@@ -1002,15 +1237,18 @@ packages/renderer/MdToHtml/rules/link_open.js
|
|||||||
packages/renderer/MdToHtml/rules/mermaid.js
|
packages/renderer/MdToHtml/rules/mermaid.js
|
||||||
packages/renderer/MdToHtml/rules/sanitize_html.js
|
packages/renderer/MdToHtml/rules/sanitize_html.js
|
||||||
packages/renderer/MdToHtml/rules/source_map.js
|
packages/renderer/MdToHtml/rules/source_map.js
|
||||||
|
packages/renderer/MdToHtml/rules/tableHorizontallyScrollable.js
|
||||||
packages/renderer/MdToHtml/setupLinkify.js
|
packages/renderer/MdToHtml/setupLinkify.js
|
||||||
packages/renderer/MdToHtml/validateLinks.js
|
packages/renderer/MdToHtml/validateLinks.js
|
||||||
|
packages/renderer/assetsToHeaders.js
|
||||||
|
packages/renderer/defaultResourceModel.js
|
||||||
packages/renderer/headerAnchor.js
|
packages/renderer/headerAnchor.js
|
||||||
packages/renderer/highlight.js
|
packages/renderer/highlight.js
|
||||||
packages/renderer/htmlUtils.test.js
|
packages/renderer/htmlUtils.test.js
|
||||||
packages/renderer/htmlUtils.js
|
packages/renderer/htmlUtils.js
|
||||||
packages/renderer/index.js
|
packages/renderer/index.js
|
||||||
packages/renderer/noteStyle.js
|
packages/renderer/noteStyle.js
|
||||||
packages/renderer/pathUtils.js
|
packages/renderer/types.js
|
||||||
packages/renderer/utils.js
|
packages/renderer/utils.js
|
||||||
packages/tools/build-release-stats.test.js
|
packages/tools/build-release-stats.test.js
|
||||||
packages/tools/build-release-stats.js
|
packages/tools/build-release-stats.js
|
||||||
@@ -1031,6 +1269,7 @@ packages/tools/packageJsonLint.js
|
|||||||
packages/tools/postPreReleasesToForum.js
|
packages/tools/postPreReleasesToForum.js
|
||||||
packages/tools/release-android.js
|
packages/tools/release-android.js
|
||||||
packages/tools/release-cli.js
|
packages/tools/release-cli.js
|
||||||
|
packages/tools/release-clipper.js
|
||||||
packages/tools/release-electron.js
|
packages/tools/release-electron.js
|
||||||
packages/tools/release-ios.js
|
packages/tools/release-ios.js
|
||||||
packages/tools/release-plugin-repo-cli.js
|
packages/tools/release-plugin-repo-cli.js
|
||||||
|
@@ -0,0 +1,62 @@
|
|||||||
|
diff --git a/android/src/newarch/java/com/reactnativecommunity/slider/ReactSliderManager.java b/android/src/newarch/java/com/reactnativecommunity/slider/ReactSliderManager.java
|
||||||
|
index a5bb95eec3337b93a2338a2869a2bda176c91cae..87817688eb280c2f702c26dc35558c6a0a4db1ea 100644
|
||||||
|
--- a/android/src/newarch/java/com/reactnativecommunity/slider/ReactSliderManager.java
|
||||||
|
+++ b/android/src/newarch/java/com/reactnativecommunity/slider/ReactSliderManager.java
|
||||||
|
@@ -42,12 +42,20 @@ public class ReactSliderManager extends SimpleViewManager<ReactSlider> implement
|
||||||
|
public void onProgressChanged(SeekBar seekbar, int progress, boolean fromUser) {
|
||||||
|
ReactSlider slider = (ReactSlider)seekbar;
|
||||||
|
|
||||||
|
- if(progress < slider.getLowerLimit()) {
|
||||||
|
- progress = slider.getLowerLimit();
|
||||||
|
- seekbar.setProgress(progress);
|
||||||
|
- } else if (progress > slider.getUpperLimit()) {
|
||||||
|
- progress = slider.getUpperLimit();
|
||||||
|
- seekbar.setProgress(progress);
|
||||||
|
+ // During initialization, lowerLimit can be greater than upperLimit.
|
||||||
|
+ //
|
||||||
|
+ // If a change event is received during this, we need a check to prevent
|
||||||
|
+ // infinite recursion.
|
||||||
|
+ //
|
||||||
|
+ // Issue: https://github.com/callstack/react-native-slider/issues/571
|
||||||
|
+ if (slider.getLowerLimit() <= slider.getUpperLimit()) {
|
||||||
|
+ if(progress < slider.getLowerLimit()) {
|
||||||
|
+ progress = slider.getLowerLimit();
|
||||||
|
+ seekbar.setProgress(progress);
|
||||||
|
+ } else if (progress > slider.getUpperLimit()) {
|
||||||
|
+ progress = slider.getUpperLimit();
|
||||||
|
+ seekbar.setProgress(progress);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
ReactContext reactContext = (ReactContext) seekbar.getContext();
|
||||||
|
diff --git a/android/src/oldarch/java/com/reactnativecommunity/slider/ReactSliderManager.java b/android/src/oldarch/java/com/reactnativecommunity/slider/ReactSliderManager.java
|
||||||
|
index 3ff5930f85a3cd92c2549925f41058abb188a57e..ab3681fdfe0b736c97020e1434e450c8183e6f18 100644
|
||||||
|
--- a/android/src/oldarch/java/com/reactnativecommunity/slider/ReactSliderManager.java
|
||||||
|
+++ b/android/src/oldarch/java/com/reactnativecommunity/slider/ReactSliderManager.java
|
||||||
|
@@ -30,12 +30,20 @@ public class ReactSliderManager extends SimpleViewManager<ReactSlider> {
|
||||||
|
public void onProgressChanged(SeekBar seekbar, int progress, boolean fromUser) {
|
||||||
|
ReactSlider slider = (ReactSlider)seekbar;
|
||||||
|
|
||||||
|
- if(progress < slider.getLowerLimit()) {
|
||||||
|
- progress = slider.getLowerLimit();
|
||||||
|
- seekbar.setProgress(progress);
|
||||||
|
- } else if(progress > slider.getUpperLimit()) {
|
||||||
|
- progress = slider.getUpperLimit();
|
||||||
|
- seekbar.setProgress(progress);
|
||||||
|
+ // During initialization, lowerLimit can be greater than upperLimit.
|
||||||
|
+ //
|
||||||
|
+ // If a change event is received during this, we need a check to prevent
|
||||||
|
+ // infinite recursion.
|
||||||
|
+ //
|
||||||
|
+ // Issue: https://github.com/callstack/react-native-slider/issues/571
|
||||||
|
+ if (slider.getLowerLimit() <= slider.getUpperLimit()) {
|
||||||
|
+ if(progress < slider.getLowerLimit()) {
|
||||||
|
+ progress = slider.getLowerLimit();
|
||||||
|
+ seekbar.setProgress(progress);
|
||||||
|
+ } else if (progress > slider.getUpperLimit()) {
|
||||||
|
+ progress = slider.getUpperLimit();
|
||||||
|
+ seekbar.setProgress(progress);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
ReactContext reactContext = (ReactContext) seekbar.getContext();
|
33
.yarn/patches/husky-npm-3.1.0-5cc13e4e34.patch
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
diff --git a/lib/runner/index.js b/lib/runner/index.js
|
||||||
|
index 87e3b3957619728e3ed1ca61e2d83df1c49f928f..6d5ab905415da0577341c8f5b67d4806adcf7549 100644
|
||||||
|
--- a/lib/runner/index.js
|
||||||
|
+++ b/lib/runner/index.js
|
||||||
|
@@ -68,15 +68,19 @@ function run([, scriptPath, hookName = '', HUSKY_GIT_PARAMS], getStdinFn = get_s
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
catch (err) {
|
||||||
|
- const noVerifyMessage = [
|
||||||
|
- 'commit-msg',
|
||||||
|
- 'pre-commit',
|
||||||
|
- 'pre-rebase',
|
||||||
|
- 'pre-push'
|
||||||
|
- ].includes(hookName)
|
||||||
|
- ? '(add --no-verify to bypass)'
|
||||||
|
- : '(cannot be bypassed with --no-verify due to Git specs)';
|
||||||
|
- console.log(`husky > ${hookName} hook failed ${noVerifyMessage}`);
|
||||||
|
+ // We do not want to print this "add --no-verify to bypass" message because that's
|
||||||
|
+ // literally what some developers do instead of trying to fix the errors.
|
||||||
|
+
|
||||||
|
+ // const noVerifyMessage = [
|
||||||
|
+ // 'commit-msg',
|
||||||
|
+ // 'pre-commit',
|
||||||
|
+ // 'pre-rebase',
|
||||||
|
+ // 'pre-push'
|
||||||
|
+ // ].includes(hookName)
|
||||||
|
+ // ? '(add --no-verify to bypass)'
|
||||||
|
+ // : '(cannot be bypassed with --no-verify due to Git specs)';
|
||||||
|
+
|
||||||
|
+ console.log(`husky > ${hookName} hook failed (Please fix the errors listed above and try again)`);
|
||||||
|
return err.code;
|
||||||
|
}
|
||||||
|
});
|
After Width: | Height: | Size: 87 KiB |
BIN
Assets/WebsiteAssets/images/news/20240127-promo-tile.png
Normal file
After Width: | Height: | Size: 282 KiB |
BIN
Assets/WebsiteAssets/images/news/20240301-rte-colors.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
Assets/WebsiteAssets/images/ocr/search_results.png
Normal file
After Width: | Height: | Size: 40 KiB |
BIN
Assets/WebsiteAssets/images/publish_note/Banner.png
Normal file
After Width: | Height: | Size: 99 KiB |
BIN
Assets/WebsiteAssets/images/sponsors/BestKru.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
Assets/WebsiteAssets/images/sponsors/Celebian.png
Normal file
After Width: | Height: | Size: 3.8 KiB |
@@ -1,4 +1,76 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Joplin]]></title><description><![CDATA[Joplin, the open source note-taking application]]></description><link>https://joplinapp.org</link><generator>RSS for Node</generator><lastBuildDate>Mon, 04 Dec 2023 00:00:00 GMT</lastBuildDate><atom:link href="https://joplinapp.org/rss.xml" rel="self" type="application/rss+xml"/><pubDate>Mon, 04 Dec 2023 00:00:00 GMT</pubDate><item><title><![CDATA[What's new in Joplin 2.13]]></title><description><![CDATA[<h2>Desktop<a name="desktop" href="#desktop" class="heading-anchor">🔗</a></h2>
|
<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Joplin]]></title><description><![CDATA[Joplin, the open source note-taking application]]></description><link>https://joplinapp.org</link><generator>RSS for Node</generator><lastBuildDate>Fri, 01 Mar 2024 00:00:00 GMT</lastBuildDate><atom:link href="https://joplinapp.org/rss.xml" rel="self" type="application/rss+xml"/><pubDate>Fri, 01 Mar 2024 00:00:00 GMT</pubDate><item><title><![CDATA[What's new in Joplin 2.14]]></title><description><![CDATA[<h2>OCR<a name="ocr" href="#ocr" class="heading-anchor">🔗</a></h2>
|
||||||
|
<p>Optical Character Recognition (OCR) in Joplin enables the transformation of text-containing images into machine-readable text formats. From this version you can enable OCR in the Configuration screen under the "General" section. Once activated, Joplin scans images and PDFs, extracting text data for searchability.</p>
|
||||||
|
<p>While OCR search is available on both desktop and mobile apps, document scanning is limited to the desktop due to resource demands. For more information head to the <a href="https://joplinapp.org/help/apps/ocr">OCR official documentation</a>!</p>
|
||||||
|
<h2>Bundled plugins<a name="bundled-plugins" href="#bundled-plugins" class="heading-anchor">🔗</a></h2>
|
||||||
|
<p>Joplin will now bundle high quality plugins that we feel will benefit most users. With this version we include the great <a href="https://github.com/JackGruber/joplin-plugin-backup">Backup plugin</a> by JackGruber. This will provide another layer of safety when using Joplin as by default it will automatically backup your notes in a "JoplinBackup" folder in your home directory.</p>
|
||||||
|
<p>Note that, just like any other plugin, you can change the plugin configuration or even disable it from the settings.</p>
|
||||||
|
<h2>ENEX importer<a name="enex-importer" href="#enex-importer" class="heading-anchor">🔗</a></h2>
|
||||||
|
<p>As usual in recent version, there are plenty of improvements to the <a href="https://joplinapp.org/help/apps/import_export#importing-from-evernote">Joplin ENEX importer</a>. Besides the various fixes and enhancement to support this format, we've added a few useful features:</p>
|
||||||
|
<h3>Restore note links after importing an ENEX file<a name="restore-note-links-after-importing-an-enex-file" href="#restore-note-links-after-importing-an-enex-file" class="heading-anchor">🔗</a></h3>
|
||||||
|
<p>Evernote Export files do not include the necessary information to reliably restore the links between notes, so for a long time this feature was not supported by the importer.</p>
|
||||||
|
<p>Now however Joplin will try to guess what note is linked to what other note based on the note title, which in many cases will give the expected result. But not always - when that happens, and Joplin cannot detect the link target, the application leaves the original Evernote link. That way you can manually restore it yourself or at least find back what the note was linked to.</p>
|
||||||
|
<h3>Import a directory of ENEX files<a name="import-a-directory-of-enex-files" href="#import-a-directory-of-enex-files" class="heading-anchor">🔗</a></h3>
|
||||||
|
<p>It is notoriously difficult to export data from Evernote because, among other issues, you can only export one notebook at a time, which is an obvious problems when you have dozens of notebooks. Unfortunately we cannot improve this part of the process since this up to Evernote, however we now make it easier to import all these notebook files by adding support for importing a folder of ENEX files. To use this feature, go to File > Import, and select one of the "ENEX (Directory)" options.</p>
|
||||||
|
<p>This will process all the ENEX files in that directory and create a notebook in Joplin for each of them.</p>
|
||||||
|
<h2>Beta Markdown editor<a name="beta-markdown-editor" href="#beta-markdown-editor" class="heading-anchor">🔗</a></h2>
|
||||||
|
<p>This version features further improvements to the new Markdown editor based on <a href="https://codemirror.net/">CodeMirror 6</a>. The goal eventually is to be able to use the same editor on both the desktop and mobile application (which already uses CodeMirror 6), which will allow a more consistent user experience across devices.</p>
|
||||||
|
<p>Plugin support has also been improved in this version - plugin authors can now write native CodeMirror 6 extensions using the plugin API. For more information check the documentation on <a href="https://joplinapp.org/help/api/tutorials/cm6_plugin/">how to create a Markdown plugin</a>!</p>
|
||||||
|
<p>Another benefit of this new editor is that, in a future version, it will allow us to support plugins on the mobile application since a plugin written for the desktop app will work on mobile too. There are several other advantages that Henry <a href="https://discourse.joplinapp.org/t/pre-release-v2-13-is-now-available-updated-18-11-2023/32697/12?u=laurent">listed in this forum post</a>.</p>
|
||||||
|
<h2>Rich text editor improvements<a name="rich-text-editor-improvements" href="#rich-text-editor-improvements" class="heading-anchor">🔗</a></h2>
|
||||||
|
<p>We continue making improvements to the Rich Text Editor (RTE) in particular to improve interoperability with other applications, such as LibreOffice, Office or web browsers, as well as better handling of copy and paste.</p>
|
||||||
|
<p>Another notable addition is support for setting colours, which was a frequently asked feature. To use the feature, select it from the "..." button in the toolbar. Note that once applied the colours will work in the Markdown editor too!</p>
|
||||||
|
<p><img src="https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/news/20240301-rte-colors.png" alt=""></p>
|
||||||
|
<p>See below for the full list of RTE changes:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Fixed: Rich text editor: Fix context menu not shown in some cases</li>
|
||||||
|
<li>Improved: Speed up pasting text and images in Rich Text Editor</li>
|
||||||
|
<li>Fixed: Fix drag-and-drop of images and text in the rich text editor</li>
|
||||||
|
<li>Fixed: Fix images with SVG data URLs corrupted in the rich text editor</li>
|
||||||
|
<li>Fixed: Pasting rich text in the RTE sometimes result in invalid markup</li>
|
||||||
|
<li>Fixed: Rich text editor: Fix newline behavior in new notes</li>
|
||||||
|
<li>Improved: Add support for changing text colors in rich text editor</li>
|
||||||
|
<li>Fixed: Fix HTML resource links lost when editing notes in the rich text editor</li>
|
||||||
|
<li>Fixed: Fix code blocks with blank lines break tables in the rich text editor</li>
|
||||||
|
<li>Fixed: Copied and pasted text from Firefox to RTE does not include images</li>
|
||||||
|
<li>Fixed: Pasting rich text in the RTE sometimes result in invalid markup</li>
|
||||||
|
<li>Fixed: Fixed copying and pasting an image from Chrome in RTE</li>
|
||||||
|
</ul>
|
||||||
|
<h1>Full changelog<a name="full-changelog" href="#full-changelog" class="heading-anchor">🔗</a></h1>
|
||||||
|
<p>This is just an overview of the main features. The full changelog is available there:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Desktop: <a href="https://joplinapp.org/help/about/changelog/desktop">https://joplinapp.org/help/about/changelog/desktop</a></li>
|
||||||
|
<li>Android: <a href="https://joplinapp.org/help/about/changelog/android/">https://joplinapp.org/help/about/changelog/android/</a></li>
|
||||||
|
<li>iOS: <a href="https://joplinapp.org/help/about/changelog/ios/">https://joplinapp.org/help/about/changelog/ios/</a></li>
|
||||||
|
</ul>
|
||||||
|
]]></description><link>https://joplinapp.org/news/20240301-release-2-14</link><guid isPermaLink="false">20240301-release-2-14</guid><pubDate>Fri, 01 Mar 2024 00:00:00 GMT</pubDate><twitter-text>What's new in Joplin 2.14</twitter-text></item><item><title><![CDATA[Support for new plugin metadata]]></title><description><![CDATA[<p>The plugin manifest now supports new properties to better describe and present your plugins on Joplin Plugins website. Those are the <code>icons</code>, <code>categories</code>, <code>screenshots</code> and <code>promo_tile</code> properties.</p>
|
||||||
|
<h2>Icon<a name="icon" href="#icon" class="heading-anchor">🔗</a></h2>
|
||||||
|
<p>This is the icon that will be used in various plugin pages, including in your main plugin page. It will be shown on the main result page too. If not provided, a default icon will be displayed instead.</p>
|
||||||
|
<h2>Category<a name="category" href="#category" class="heading-anchor">🔗</a></h2>
|
||||||
|
<p>You can supply one or more category for your plugin - it will be used to filter the plugins on the website.</p>
|
||||||
|
<h2>Screenshots<a name="screenshots" href="#screenshots" class="heading-anchor">🔗</a></h2>
|
||||||
|
<p>Again you can provide one or more screenshots to present your plugin on the website.</p>
|
||||||
|
<p><img src="https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/news/20240127-icon-category-screenshot.png" alt=""></p>
|
||||||
|
<p><em>An example of plugin with icon, category and screenshot</em></p>
|
||||||
|
<h2>Promo tile<a name="promo-tile" href="#promo-tile" class="heading-anchor">🔗</a></h2>
|
||||||
|
<p>The promo tile is an optional image that is used to display your plugin on the main website page. If no promo tile is supplied, the icon will be used instead.</p>
|
||||||
|
<p><img src="https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/news/20240127-promo-tile.png" alt=""></p>
|
||||||
|
<p><em>An example of promo tile</em></p>
|
||||||
|
<h2>More information<a name="more-information" href="#more-information" class="heading-anchor">🔗</a></h2>
|
||||||
|
<p>For more information on how to set this plugin metadata, please check the <a href="https://joplinapp.org/help/api/references/plugin_manifest">Plugin Manifest documentation</a></p>
|
||||||
|
]]></description><link>https://joplinapp.org/news/20240127-new-plugin-metadata</link><guid isPermaLink="false">20240127-new-plugin-metadata</guid><pubDate>Sat, 27 Jan 2024 00:00:00 GMT</pubDate><twitter-text></twitter-text></item><item><title><![CDATA[Faster synchronisation in upcoming Joplin version!]]></title><description><![CDATA[<p>The next version of Joplin Cloud (and Joplin Server) will include a change that will make synchronisation, in particular when synchronising a new device for the first time, significantly faster. This is achieved by bundling more data with the calls that retrieve notes and other data, thus reducing the number of unnecessary requests.</p>
|
||||||
|
<p>This change will be applied soon to Joplin Cloud (and Server), and the Joplin mobile, desktop and CLI applications will be able to use it from version 2.14.</p>
|
||||||
|
<p>In my tests with about 26,000 items, synchronisation was more than twice as fast on Joplin Cloud (22.5 minutes vs 9.5 minutes):</p>
|
||||||
|
<h2>Before<a name="before" href="#before" class="heading-anchor">🔗</a></h2>
|
||||||
|
<p>Created local items: 21814. Fetched items: 26591/26591. Completed: 23/12/2023 10:38 (<strong>1346s</strong>)</p>
|
||||||
|
<p><strong>real 22m35.810s</strong><br/><br>
|
||||||
|
user 3m19.182s<br/><br>
|
||||||
|
sys 1m24.207s</p>
|
||||||
|
<h2>Optimised<a name="optimised" href="#optimised" class="heading-anchor">🔗</a></h2>
|
||||||
|
<p>Created local items: 21822. Fetched items: 26600/26600. Completed: 23/12/2023 11:48 (<strong>571s</strong>)</p>
|
||||||
|
<p><strong>real 9m38.932s</strong><br/><br>
|
||||||
|
user 1m10.119s<br/><br>
|
||||||
|
sys 0m38.013s</p>
|
||||||
|
]]></description><link>https://joplinapp.org/news/20231223-faster-sync</link><guid isPermaLink="false">20231223-faster-sync</guid><pubDate>Sat, 23 Dec 2023 00:00:00 GMT</pubDate><twitter-text>Faster synchronisation in upcoming Joplin version!</twitter-text></item><item><title><![CDATA[What's new in Joplin 2.13]]></title><description><![CDATA[<h2>Desktop<a name="desktop" href="#desktop" class="heading-anchor">🔗</a></h2>
|
||||||
<h3>Rich Text Editor improvements<a name="rich-text-editor-improvements" href="#rich-text-editor-improvements" class="heading-anchor">🔗</a></h3>
|
<h3>Rich Text Editor improvements<a name="rich-text-editor-improvements" href="#rich-text-editor-improvements" class="heading-anchor">🔗</a></h3>
|
||||||
<p>In this update, significant enhancements have been implemented in the Rich Text Editor to enhance user experience. One notable improvement is the ability to seamlessly embed various content within tables, including lists and other tables, which was a frequently requested feature:</p>
|
<p>In this update, significant enhancements have been implemented in the Rich Text Editor to enhance user experience. One notable improvement is the ability to seamlessly embed various content within tables, including lists and other tables, which was a frequently requested feature:</p>
|
||||||
<p><img src="https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/news/20231203-rte-table.png" alt=""></p>
|
<p><img src="https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/news/20231203-rte-table.png" alt=""></p>
|
||||||
@@ -71,7 +143,7 @@
|
|||||||
<p>In this release, we've undertaken numerous enhancements and addressed various bugs in the Rich Text editor. Notably, we've introduced support for plugin toolbar icons. Additionally, we've refined the editor's ability to manage text that's copied from applications like Word, Office, and LibreOffice, thereby enhancing cross-application compatibility. Among the minor yet impactful improvements, we've fine-tuned the handling of newlines and paragraphs—a highly requested feature. Another notable update is the improved automatic switching between light and dark modes.</p>
|
<p>In this release, we've undertaken numerous enhancements and addressed various bugs in the Rich Text editor. Notably, we've introduced support for plugin toolbar icons. Additionally, we've refined the editor's ability to manage text that's copied from applications like Word, Office, and LibreOffice, thereby enhancing cross-application compatibility. Among the minor yet impactful improvements, we've fine-tuned the handling of newlines and paragraphs—a highly requested feature. Another notable update is the improved automatic switching between light and dark modes.</p>
|
||||||
<p>Altogether, this release encompasses around 12 significant changes for the Rich Text editor, and rest assured, there's more to come in the future!</p>
|
<p>Altogether, this release encompasses around 12 significant changes for the Rich Text editor, and rest assured, there's more to come in the future!</p>
|
||||||
<h3>Share permissions<a name="share-permissions" href="#share-permissions" class="heading-anchor">🔗</a></h3>
|
<h3>Share permissions<a name="share-permissions" href="#share-permissions" class="heading-anchor">🔗</a></h3>
|
||||||
<p>Using Joplin Cloud Pro and Teams, you now have the ability to customize the read and write permissions for the notebooks you share. You have the option to grant other users permission to edit the notes or share them as read-only. This ensures that you can confidently share a notebook without worrying about unintentional modifications by your friends or colleagues.</p>
|
<p>Using Joplin Cloud Teams, you now have the ability to customize the read and write permissions for the notebooks you share. You have the option to grant other users permission to edit the notes or share them as read-only. This ensures that you can confidently share a notebook without worrying about unintentional modifications by your friends or colleagues.</p>
|
||||||
<p><img src="https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/news/20230825-share-permissions.png" alt=""></p>
|
<p><img src="https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/news/20230825-share-permissions.png" alt=""></p>
|
||||||
<h3>Email to Note<a name="email-to-note" href="#email-to-note" class="heading-anchor">🔗</a></h3>
|
<h3>Email to Note<a name="email-to-note" href="#email-to-note" class="heading-anchor">🔗</a></h3>
|
||||||
<p>Joplin Cloud Pro and Teams also now include the Email to Note feature, allowing you to conveniently store your emails within Joplin Cloud. By simply forwarding your emails to your Joplin Cloud address, you can transform them into notes. The email's subject will serve as the note title, while the body of the email will be the note's content. These notes will be organized within a notebook named "Inbox."</p>
|
<p>Joplin Cloud Pro and Teams also now include the Email to Note feature, allowing you to conveniently store your emails within Joplin Cloud. By simply forwarding your emails to your Joplin Cloud address, you can transform them into notes. The email's subject will serve as the note title, while the body of the email will be the note's content. These notes will be organized within a notebook named "Inbox."</p>
|
||||||
@@ -325,33 +397,4 @@
|
|||||||
]]></description><link>https://joplinapp.org/news/20220522-gsoc-contributors</link><guid isPermaLink="false">20220522-gsoc-contributors</guid><pubDate>Sun, 22 May 2022 00:00:00 GMT</pubDate><twitter-text>Joplin received 6 Contributor Projects for GSoC 2022! Welcome to our new contributors who will be working on these projects over summer!</twitter-text></item><item><title><![CDATA[GSoC "Contributor Proposals" phase is starting now!]]></title><description><![CDATA[<p>The "Contributor Proposals" phase of GSoC 2022 is starting today! If you would like to be a contributor, now is the time to choose your project idea, write your proposal, and upload it to <a href="https://summerofcode.withgoogle.com/">https://summerofcode.withgoogle.com/</a></p>
|
]]></description><link>https://joplinapp.org/news/20220522-gsoc-contributors</link><guid isPermaLink="false">20220522-gsoc-contributors</guid><pubDate>Sun, 22 May 2022 00:00:00 GMT</pubDate><twitter-text>Joplin received 6 Contributor Projects for GSoC 2022! Welcome to our new contributors who will be working on these projects over summer!</twitter-text></item><item><title><![CDATA[GSoC "Contributor Proposals" phase is starting now!]]></title><description><![CDATA[<p>The "Contributor Proposals" phase of GSoC 2022 is starting today! If you would like to be a contributor, now is the time to choose your project idea, write your proposal, and upload it to <a href="https://summerofcode.withgoogle.com/">https://summerofcode.withgoogle.com/</a></p>
|
||||||
<p>When it's done, please also let us know by posting an update on your forum introduction post.</p>
|
<p>When it's done, please also let us know by posting an update on your forum introduction post.</p>
|
||||||
<p>If you haven't created a pull request yet, it's still time to create one. Doing so will greatly increase your chances of being selected!</p>
|
<p>If you haven't created a pull request yet, it's still time to create one. Doing so will greatly increase your chances of being selected!</p>
|
||||||
]]></description><link>https://joplinapp.org/news/20220405-gsoc-contributor-proposals</link><guid isPermaLink="false">20220405-gsoc-contributor-proposals</guid><pubDate>Tue, 05 Apr 2022 00:00:00 GMT</pubDate><twitter-text></twitter-text></item><item><title><![CDATA[Joplin participates in Google Summer of Code 2022!]]></title><description><![CDATA[<p><img src="https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/news/20220308-gsoc-banner.png" alt=""></p>
|
]]></description><link>https://joplinapp.org/news/20220405-gsoc-contributor-proposals</link><guid isPermaLink="false">20220405-gsoc-contributor-proposals</guid><pubDate>Tue, 05 Apr 2022 00:00:00 GMT</pubDate><twitter-text></twitter-text></item></channel></rss>
|
||||||
<p>For the third year, Joplin has been selected as a <strong>Google Summer of Code</strong> mentor organisation! We look forward to start working with the contributors on some great new projects. This year's main themes are:</p>
|
|
||||||
<ul>
|
|
||||||
<li><strong>Mobile and tablet development</strong> - we want to improve the mobile/tablet application on iOS and Android.</li>
|
|
||||||
<li><strong>Plugin and external apps</strong> - leverage the Joplin API to create plugins and external apps.</li>
|
|
||||||
<li>And of course contributors are welcome to suggest their own ideas.</li>
|
|
||||||
</ul>
|
|
||||||
<p>Our full idea list is available here: <a href="https://joplinapp.org/help/dev/gsoc/gsoc2022/ideas">GSoC 2022 idea list</a></p>
|
|
||||||
<p>In the coming month (<strong>March 7 - April 3</strong>), contributors will start getting involved in the forum and start discussing project ideas with the mentors and community. It's also a good time to start looking at Joplin's source code, perhaps work on fixing bugs or implement small features to get familiar with the source code, and to show us your skills.</p>
|
|
||||||
<p>One difference with previous years is that anyone, not just students, are allowed to participate.</p>
|
|
||||||
<p>Additionally, last year Google only allowed smaller projects, while this year they allow again small and large projects, so we've indicated this in the idea list - the small ones are <strong>175 hours</strong>, and the large ones <strong>350 hours</strong>.</p>
|
|
||||||
]]></description><link>https://joplinapp.org/news/20220308-gsoc2022-start</link><guid isPermaLink="false">20220308-gsoc2022-start</guid><pubDate>Tue, 08 Mar 2022 00:00:00 GMT</pubDate><twitter-text></twitter-text></item><item><title><![CDATA[Joplin 2.7 is available!]]></title><description><![CDATA[<p>This new release is largely focused on bug fixing and optimising various parts of the apps. There's about 26 improvements and 25 bugs and security fixes included - as always many of these apply to both the mobile and desktop app (see the <a href="https://joplinapp.org/help/about/changelog/desktop">desktop changelog</a> and <a href="https://joplinapp.org/help/about/changelog/android/">mobile changelog</a>).</p>
|
|
||||||
<p>Many thanks to all the contributors who helped create this release!</p>
|
|
||||||
<p>Below are some of the more noticeable changes:</p>
|
|
||||||
<h2>Notebook custom icons<a name="notebook-custom-icons" href="#notebook-custom-icons" class="heading-anchor">🔗</a></h2>
|
|
||||||
<p>Since version 2.6 it was possible to assign an emoji icon to a notebook, and with this new version it's now possible to assign any custom icon. The icon may be a PNG or JPG file of any size. The app will then import the file and resize it to the correct size. To use a custom icon, follow these steps:</p>
|
|
||||||
<p>Right-click on a notebook, and select "Edit":</p>
|
|
||||||
<p><img src="https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/news/20220224-edit-notebook.png" alt=""></p>
|
|
||||||
<p>In the "Edit notebook" dialog, click "Select file..." and browse to your icon image:</p>
|
|
||||||
<p><img src="https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/news/20220224-edit-dialog.png" alt=""></p>
|
|
||||||
<p>Click "OK" and the icon will now appear next to the notebook:</p>
|
|
||||||
<p><img src="https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/news/20220224-notebook-icon.png" alt=""></p>
|
|
||||||
<p>The icon can be changed only from the desktop application at the moment, but it will sync and be displayed correctly on the mobile app too.</p>
|
|
||||||
<h2>Plugin API improvements<a name="plugin-api-improvements" href="#plugin-api-improvements" class="heading-anchor">🔗</a></h2>
|
|
||||||
<p>This version also includes a number of improvements to the plugin API, in particular it is now easier to customise the editor context menu from a plugin and dynamically add items to it depending on the context. For example, with the Rich Markdown plugin it will be possible to right-click on an image and open it, or copy it to the clipboard.</p>
|
|
||||||
<p>A few additional functions have also been added to make plugin development simpler - in particular a command to open any item, whether it's a notebook, note, tag or attachement; and functions to work with attachements, in particular to reveal an attachement in the system file explorer, and to track changes to an attachement.</p>
|
|
||||||
]]></description><link>https://joplinapp.org/news/20220224-release-2-7</link><guid isPermaLink="false">20220224-release-2-7</guid><pubDate>Thu, 24 Feb 2022 00:00:00 GMT</pubDate><twitter-text></twitter-text></item><item><title><![CDATA[Automatic deletion of disabled accounts on Joplin Cloud]]></title><description><![CDATA[<p>As of 15 Feb 2022, disabled accounts on Joplin Cloud will be automatically deleted after 90 days. A disabled account is one where the Stripe subscription has been cancelled either by the user or automatically (eg for unpaid invoices).</p>
|
|
||||||
<p>Although it is an automated system, I will manually verify each account that's queued for deletion over the next few days for additional safety (for now everything's working as expected).</p>
|
|
||||||
<p>When an account is queued for deletion, all notes, notebooks, tags, etc are removed from the system within 2 days, and permanently deleted within 7 days. User information, in particular email and full name will be removed from the system within 2 days, but archived for an additional 90 days for legal reasons, after which they will be deleted too.</p>
|
|
||||||
]]></description><link>https://joplinapp.org/news/20220215-142000</link><guid isPermaLink="false">20220215-142000</guid><pubDate>Tue, 15 Feb 2022 00:00:00 GMT</pubDate><twitter-text></twitter-text></item></channel></rss>
|
|
@@ -5,62 +5,64 @@ set -e
|
|||||||
trap 'handleError' ERR
|
trap 'handleError' ERR
|
||||||
|
|
||||||
handleError() {
|
handleError() {
|
||||||
echo ""
|
echo ""
|
||||||
echo "If you encountered an error, please consider fixing"
|
echo "If you encountered an error, please consider fixing"
|
||||||
echo "the script for your environment and creating a pull"
|
echo "the script for your environment and creating a pull"
|
||||||
echo "request instead of asking for support on GitHub or"
|
echo "request instead of asking for support on GitHub or"
|
||||||
echo "the forum. The error message above should tell you"
|
echo "the forum. The error message above should tell you"
|
||||||
echo "where and why the error happened."
|
echo "where and why the error happened."
|
||||||
}
|
}
|
||||||
|
|
||||||
#-----------------------------------------------------
|
#-----------------------------------------------------
|
||||||
# Variables
|
# Variables
|
||||||
#-----------------------------------------------------
|
#-----------------------------------------------------
|
||||||
COLOR_RED=`tput setaf 1`
|
# Only set colors, if tput available and TERM is recognized
|
||||||
COLOR_GREEN=`tput setaf 2`
|
if [[ `command -v tput` && `tput setaf 1 2>/dev/null` ]]; then
|
||||||
COLOR_YELLOW=`tput setaf 3`
|
COLOR_RED=`tput setaf 1`
|
||||||
COLOR_BLUE=`tput setaf 4`
|
COLOR_GREEN=`tput setaf 2`
|
||||||
COLOR_RESET=`tput sgr0`
|
COLOR_YELLOW=`tput setaf 3`
|
||||||
|
COLOR_BLUE=`tput setaf 4`
|
||||||
|
COLOR_RESET=`tput sgr0`
|
||||||
|
fi
|
||||||
SILENT=false
|
SILENT=false
|
||||||
ALLOW_ROOT=false
|
ALLOW_ROOT=false
|
||||||
SHOW_CHANGELOG=false
|
SHOW_CHANGELOG=false
|
||||||
INCLUDE_PRE_RELEASE=false
|
INCLUDE_PRE_RELEASE=false
|
||||||
|
|
||||||
print() {
|
print() {
|
||||||
if [[ "${SILENT}" == false ]] ; then
|
if [[ "${SILENT}" == false ]]; then
|
||||||
echo -e "$@"
|
echo -e "$@"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
showLogo() {
|
showLogo() {
|
||||||
print "${COLOR_BLUE}"
|
print "${COLOR_BLUE}"
|
||||||
print " _ _ _ "
|
print " _ _ _ "
|
||||||
print " | | ___ _ __ | (_)_ __ "
|
print " | | ___ _ __ | (_)_ __ "
|
||||||
print " _ | |/ _ \| '_ \| | | '_ \ "
|
print " _ | |/ _ \| '_ \| | | '_ \ "
|
||||||
print "| |_| | (_) | |_) | | | | | |"
|
print "| |_| | (_) | |_) | | | | | |"
|
||||||
print " \___/ \___/| .__/|_|_|_| |_|"
|
print " \___/ \___/| .__/|_|_|_| |_|"
|
||||||
print " |_|"
|
print " |_|"
|
||||||
print ""
|
print ""
|
||||||
print "Linux Installer and Updater"
|
print "Linux Installer and Updater"
|
||||||
print "${COLOR_RESET}"
|
print "${COLOR_RESET}"
|
||||||
}
|
}
|
||||||
|
|
||||||
showHelp() {
|
showHelp() {
|
||||||
showLogo
|
showLogo
|
||||||
print "Available Arguments:"
|
print "Available Arguments:"
|
||||||
print "\t" "--help" "\t" "Show this help information" "\n"
|
print "\t" "--help" "\t" "Show this help information" "\n"
|
||||||
print "\t" "--allow-root" "\t" "Allow the install to be run as root"
|
print "\t" "--allow-root" "\t" "Allow the install to be run as root"
|
||||||
print "\t" "--changelog" "\t" "Show the changelog after installation"
|
print "\t" "--changelog" "\t" "Show the changelog after installation"
|
||||||
print "\t" "--force" "\t" "Always download the latest version"
|
print "\t" "--force" "\t" "Always download the latest version"
|
||||||
print "\t" "--silent" "\t" "Don't print any output"
|
print "\t" "--silent" "\t" "Don't print any output"
|
||||||
print "\t" "--prerelease" "\t" "Check for new Versions including Pre-Releases"
|
print "\t" "--prerelease" "\t" "Check for new Versions including Pre-Releases"
|
||||||
|
|
||||||
if [[ ! -z $1 ]]; then
|
|
||||||
print "\n" "${COLOR_RED}ERROR: " "$*" "${COLOR_RESET}" "\n"
|
|
||||||
else
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
if [[ ! -z $1 ]]; then
|
||||||
|
print "\n" "${COLOR_RED}ERROR: " "$*" "${COLOR_RESET}" "\n"
|
||||||
|
else
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
#-----------------------------------------------------
|
#-----------------------------------------------------
|
||||||
@@ -71,9 +73,9 @@ optspec=":h-:"
|
|||||||
while getopts "${optspec}" OPT; do
|
while getopts "${optspec}" OPT; do
|
||||||
[ "${OPT}" = " " ] && continue
|
[ "${OPT}" = " " ] && continue
|
||||||
if [ "${OPT}" = "-" ]; then # long option: reformulate OPT and OPTARG
|
if [ "${OPT}" = "-" ]; then # long option: reformulate OPT and OPTARG
|
||||||
OPT="${OPTARG%%=*}" # extract long option name
|
OPT="${OPTARG%%=*}" # extract long option name
|
||||||
OPTARG="${OPTARG#$OPT}" # extract long option argument (may be empty)
|
OPTARG="${OPTARG#$OPT}" # extract long option argument (may be empty)
|
||||||
OPTARG="${OPTARG#=}" # if long option argument, remove assigning `=`
|
OPTARG="${OPTARG#=}" # if long option argument, remove assigning `=`
|
||||||
fi
|
fi
|
||||||
case "${OPT}" in
|
case "${OPT}" in
|
||||||
h | help ) showHelp ;;
|
h | help ) showHelp ;;
|
||||||
@@ -90,8 +92,8 @@ shift $((OPTIND-1)) # remove parsed options and args from $@ list
|
|||||||
|
|
||||||
## Check and warn if running as root.
|
## Check and warn if running as root.
|
||||||
if [[ $EUID = 0 ]] && [[ "${ALLOW_ROOT}" != true ]]; then
|
if [[ $EUID = 0 ]] && [[ "${ALLOW_ROOT}" != true ]]; then
|
||||||
showHelp "It is not recommended (nor necessary) to run this script as root. To do so anyway, please use '--allow-root'"
|
showHelp "It is not recommended (nor necessary) to run this script as root. To do so anyway, please use '--allow-root'"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
#-----------------------------------------------------
|
#-----------------------------------------------------
|
||||||
@@ -104,12 +106,12 @@ print "Checking architecture..."
|
|||||||
## uname actually gives more information than needed, but it contains all architectures (hardware and software)
|
## uname actually gives more information than needed, but it contains all architectures (hardware and software)
|
||||||
ARCHITECTURE=$(uname -m -p -i || echo "NO CHECK")
|
ARCHITECTURE=$(uname -m -p -i || echo "NO CHECK")
|
||||||
|
|
||||||
if [[ $ARCHITECTURE = "NO CHECK" ]] ; then
|
if [[ $ARCHITECTURE = "NO CHECK" ]]; then
|
||||||
print "${COLOR_YELLOW}WARNING: Can't get system architecture, skipping check${COLOR_RESET}"
|
print "${COLOR_YELLOW}WARNING: Can't get system architecture, skipping check${COLOR_RESET}"
|
||||||
elif [[ $ARCHITECTURE =~ .*aarch.*|.*arm.* ]] ; then
|
elif [[ $ARCHITECTURE =~ .*aarch.*|.*arm.* ]]; then
|
||||||
showHelp "Arm systems are not officially supported by Joplin, please search the forum (https://discourse.joplinapp.org/) for more information"
|
showHelp "Arm systems are not officially supported by Joplin, please search the forum (https://discourse.joplinapp.org/) for more information"
|
||||||
exit 1
|
exit 1
|
||||||
elif [[ $ARCHITECTURE =~ .*i386.*|.*i686.* ]] ; then
|
elif [[ $ARCHITECTURE =~ .*i386.*|.*i686.* ]]; then
|
||||||
showHelp "32-bit systems are not supported by Joplin, please search the forum (https://discourse.joplinapp.org/) for more information"
|
showHelp "32-bit systems are not supported by Joplin, please search the forum (https://discourse.joplinapp.org/) for more information"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
@@ -122,7 +124,7 @@ if [[ $(command -v ldconfig) ]]; then
|
|||||||
else
|
else
|
||||||
LIBFUSE=$(find /lib /usr/lib /lib64 /usr/lib64 /usr/local/lib -name "libfuse.so.2" 2>/dev/null | grep "libfuse.so.2" || echo '')
|
LIBFUSE=$(find /lib /usr/lib /lib64 /usr/lib64 /usr/local/lib -name "libfuse.so.2" 2>/dev/null | grep "libfuse.so.2" || echo '')
|
||||||
fi
|
fi
|
||||||
if [[ $LIBFUSE == "" ]] ; then
|
if [[ $LIBFUSE == "" ]]; then
|
||||||
print "${COLOR_RED}Error: Can't get libfuse2 on system, please install libfuse2${COLOR_RESET}"
|
print "${COLOR_RED}Error: Can't get libfuse2 on system, please install libfuse2${COLOR_RESET}"
|
||||||
print "See https://joplinapp.org/help/faq/#desktop-application-will-not-launch-on-linux and https://github.com/AppImage/AppImageKit/wiki/FUSE for more information"
|
print "See https://joplinapp.org/help/faq/#desktop-application-will-not-launch-on-linux and https://github.com/AppImage/AppImageKit/wiki/FUSE for more information"
|
||||||
exit 1
|
exit 1
|
||||||
@@ -141,17 +143,17 @@ fi
|
|||||||
|
|
||||||
# Check if it's in the latest version
|
# Check if it's in the latest version
|
||||||
if [[ -e ~/.joplin/VERSION ]] && [[ $(< ~/.joplin/VERSION) == "${RELEASE_VERSION}" ]]; then
|
if [[ -e ~/.joplin/VERSION ]] && [[ $(< ~/.joplin/VERSION) == "${RELEASE_VERSION}" ]]; then
|
||||||
print "${COLOR_GREEN}You already have the latest version${COLOR_RESET} ${RELEASE_VERSION} ${COLOR_GREEN}installed.${COLOR_RESET}"
|
print "${COLOR_GREEN}You already have the latest version${COLOR_RESET} ${RELEASE_VERSION} ${COLOR_GREEN}installed.${COLOR_RESET}"
|
||||||
([[ "$FORCE" == true ]] && print "Forcing installation...") || exit 0
|
([[ "$FORCE" == true ]] && print "Forcing installation...") || exit 0
|
||||||
else
|
else
|
||||||
[[ -e ~/.joplin/VERSION ]] && CURRENT_VERSION=$(< ~/.joplin/VERSION)
|
[[ -e ~/.joplin/VERSION ]] && CURRENT_VERSION=$(< ~/.joplin/VERSION)
|
||||||
print "The latest version is ${RELEASE_VERSION}, but you have ${CURRENT_VERSION:-no version} installed."
|
print "The latest version is ${RELEASE_VERSION}, but you have ${CURRENT_VERSION:-no version} installed."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Check if it's an update or a new install
|
# Check if it's an update or a new install
|
||||||
DOWNLOAD_TYPE="New"
|
DOWNLOAD_TYPE="New"
|
||||||
if [[ -f ~/.joplin/Joplin.AppImage ]]; then
|
if [[ -f ~/.joplin/Joplin.AppImage ]]; then
|
||||||
DOWNLOAD_TYPE="Update"
|
DOWNLOAD_TYPE="Update"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
#-----------------------------------------------------
|
#-----------------------------------------------------
|
||||||
@@ -183,8 +185,7 @@ mv "${TEMP_DIR}/joplin.png" ~/.local/share/icons/hicolor/512x512/apps/joplin.png
|
|||||||
print "${COLOR_GREEN}OK${COLOR_RESET}"
|
print "${COLOR_GREEN}OK${COLOR_RESET}"
|
||||||
|
|
||||||
# Detect desktop environment
|
# Detect desktop environment
|
||||||
if [ "$XDG_CURRENT_DESKTOP" = "" ]
|
if [ "$XDG_CURRENT_DESKTOP" = "" ]; then
|
||||||
then
|
|
||||||
DESKTOP=$(echo "${XDG_DATA_DIRS}" | sed 's/.*\(xfce\|kde\|gnome\).*/\1/')
|
DESKTOP=$(echo "${XDG_DATA_DIRS}" | sed 's/.*\(xfce\|kde\|gnome\).*/\1/')
|
||||||
else
|
else
|
||||||
DESKTOP=$XDG_CURRENT_DESKTOP
|
DESKTOP=$XDG_CURRENT_DESKTOP
|
||||||
@@ -210,8 +211,7 @@ if command -v lsb_release &> /dev/null; then
|
|||||||
# uses these to sandbox processes. Unfortunately, it doesn't look like we can get around this
|
# uses these to sandbox processes. Unfortunately, it doesn't look like we can get around this
|
||||||
# without writing the AppImage to a non-user-writable location (without invalidating other security
|
# without writing the AppImage to a non-user-writable location (without invalidating other security
|
||||||
# controls). See https://discourse.joplinapp.org/t/possible-future-requirement-for-no-sandbox-flag-for-ubuntu-23-10/.
|
# controls). See https://discourse.joplinapp.org/t/possible-future-requirement-for-no-sandbox-flag-for-ubuntu-23-10/.
|
||||||
if [[ $DISTVER = "Ubuntu23.10" || $DISTVER =~ Debian1. || ( "$DISTVER" = "Linuxmint4" && "$DISTCODENAME" = "debbie" ) || ( "$DISTVER" = "CentOS" && "$DISTMAJOR" =~ 6|7 ) ]]
|
if [[ $DISTVER = "Ubuntu23.10" || $DISTVER =~ Debian1. || ( "$DISTVER" = "Linuxmint4" && "$DISTCODENAME" = "debbie" ) || ( "$DISTVER" = "CentOS" && "$DISTMAJOR" =~ 6|7 ) ]]; then
|
||||||
then
|
|
||||||
SANDBOXPARAM="--no-sandbox"
|
SANDBOXPARAM="--no-sandbox"
|
||||||
print "${COLOR_YELLOW}WARNING${COLOR_RESET} Electron sandboxing disabled."
|
print "${COLOR_YELLOW}WARNING${COLOR_RESET} Electron sandboxing disabled."
|
||||||
print " See https://discourse.joplinapp.org/t/32160/5 for details."
|
print " See https://discourse.joplinapp.org/t/32160/5 for details."
|
||||||
@@ -222,41 +222,40 @@ fi
|
|||||||
# `.local/share/desktop` had a desktop file created.
|
# `.local/share/desktop` had a desktop file created.
|
||||||
# However some environments don't return a desktop BUT still support these desktop files
|
# However some environments don't return a desktop BUT still support these desktop files
|
||||||
# the command check was added to support all Desktops that have support for the
|
# the command check was added to support all Desktops that have support for the
|
||||||
# freedesktop standard
|
# freedesktop standard
|
||||||
# The old checks are left in place for historical reasons, but
|
# The old checks are left in place for historical reasons, but
|
||||||
# NO MORE DESKTOP ENVIRONMENTS SHOULD BE ADDED
|
# NO MORE DESKTOP ENVIRONMENTS SHOULD BE ADDED
|
||||||
# If a new environment needs to be supported, then the command check section should be re-thought
|
# If a new environment needs to be supported, then the command check section should be re-thought
|
||||||
if [[ $DESKTOP =~ .*gnome.*|.*kde.*|.*xfce.*|.*mate.*|.*lxqt.*|.*unity.*|.*x-cinnamon.*|.*deepin.*|.*pantheon.*|.*lxde.*|.*i3.*|.*sway.* ]] || [[ `command -v update-desktop-database` ]]
|
if [[ $DESKTOP =~ .*gnome.*|.*kde.*|.*xfce.*|.*mate.*|.*lxqt.*|.*unity.*|.*x-cinnamon.*|.*deepin.*|.*pantheon.*|.*lxde.*|.*i3.*|.*sway.* ]] || [[ `command -v update-desktop-database` ]]; then
|
||||||
then
|
DATA_HOME=${XDG_DATA_HOME:-~/.local/share}
|
||||||
DATA_HOME=${XDG_DATA_HOME:-~/.local/share}
|
DESKTOP_FILE_LOCATION="$DATA_HOME/applications"
|
||||||
DESKTOP_FILE_LOCATION="$DATA_HOME/applications"
|
# Only delete the desktop file if it will be replaced
|
||||||
# Only delete the desktop file if it will be replaced
|
rm -f "$DESKTOP_FILE_LOCATION/appimagekit-joplin.desktop"
|
||||||
rm -f "$DESKTOP_FILE_LOCATION/appimagekit-joplin.desktop"
|
|
||||||
|
|
||||||
# On some systems this directory doesn't exist by default
|
# On some systems this directory doesn't exist by default
|
||||||
mkdir -p "$DESKTOP_FILE_LOCATION"
|
mkdir -p "$DESKTOP_FILE_LOCATION"
|
||||||
|
|
||||||
# Tabs specifically, and not spaces, are needed for indentation with Bash heredocs
|
# No spaces or tabs should be used for indentation with Bash heredocs
|
||||||
cat >> "$DESKTOP_FILE_LOCATION/appimagekit-joplin.desktop" <<-EOF
|
cat >> "$DESKTOP_FILE_LOCATION/appimagekit-joplin.desktop" <<-EOF
|
||||||
[Desktop Entry]
|
[Desktop Entry]
|
||||||
Encoding=UTF-8
|
Encoding=UTF-8
|
||||||
Name=Joplin
|
Name=Joplin
|
||||||
Comment=Joplin for Desktop
|
Comment=Joplin for Desktop
|
||||||
Exec=${HOME}/.joplin/Joplin.AppImage ${SANDBOXPARAM} %u
|
Exec=${HOME}/.joplin/Joplin.AppImage ${SANDBOXPARAM} %u
|
||||||
Icon=joplin
|
Icon=joplin
|
||||||
StartupWMClass=Joplin
|
StartupWMClass=Joplin
|
||||||
Type=Application
|
Type=Application
|
||||||
Categories=Office;
|
Categories=Office;
|
||||||
MimeType=x-scheme-handler/joplin;
|
MimeType=x-scheme-handler/joplin;
|
||||||
X-GNOME-SingleWindow=true // should be removed eventually as it was upstream to be an XDG specification
|
X-GNOME-SingleWindow=true // should be removed eventually as it was upstream to be an XDG specification
|
||||||
SingleMainWindow=true
|
SingleMainWindow=true
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
# Update application icons
|
# Update application icons
|
||||||
[[ `command -v update-desktop-database` ]] && update-desktop-database "$DESKTOP_FILE_LOCATION" && update-desktop-database "$DATA_HOME/icons"
|
[[ `command -v update-desktop-database` ]] && update-desktop-database "$DESKTOP_FILE_LOCATION" && update-desktop-database "$DATA_HOME/icons"
|
||||||
print "${COLOR_GREEN}OK${COLOR_RESET}"
|
print "${COLOR_GREEN}OK${COLOR_RESET}"
|
||||||
else
|
else
|
||||||
print "${COLOR_RED}NOT DONE, unknown desktop '${DESKTOP}'${COLOR_RESET}"
|
print "${COLOR_RED}NOT DONE, unknown desktop '${DESKTOP}'${COLOR_RESET}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
#-----------------------------------------------------
|
#-----------------------------------------------------
|
||||||
@@ -271,8 +270,8 @@ echo "$RELEASE_VERSION" > ~/.joplin/VERSION
|
|||||||
|
|
||||||
#-----------------------------------------------------
|
#-----------------------------------------------------
|
||||||
if [[ "$SHOW_CHANGELOG" == true ]]; then
|
if [[ "$SHOW_CHANGELOG" == true ]]; then
|
||||||
NOTES=$(wget -qO - https://api.github.com/repos/laurent22/joplin/releases/latest | grep -Po '"body": "\K.*(?=")')
|
NOTES=$(wget -qO - https://api.github.com/repos/laurent22/joplin/releases/latest | grep -Po '"body": "\K.*(?=")')
|
||||||
print "${COLOR_BLUE}Changelog:${COLOR_RESET}\n${NOTES}"
|
print "${COLOR_BLUE}Changelog:${COLOR_RESET}\n${NOTES}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
#-----------------------------------------------------
|
#-----------------------------------------------------
|
||||||
|
13
README.md
@@ -31,7 +31,7 @@ Please see the [donation page](https://github.com/laurent22/joplin/blob/dev/read
|
|||||||
# Sponsors
|
# Sponsors
|
||||||
|
|
||||||
<!-- SPONSORS-ORG -->
|
<!-- SPONSORS-ORG -->
|
||||||
<a href="https://seirei.ne.jp"><img title="Serei Network" width="256" src="https://joplinapp.org/images/sponsors/SeireiNetwork.png"/></a> <a href="https://www.hosting.de/nextcloud/?mtm_campaign=managed-nextcloud&mtm_kwd=joplinapp&mtm_source=joplinapp-webseite&mtm_medium=banner"><img title="Hosting.de" width="256" src="https://joplinapp.org/images/sponsors/HostingDe.png"/></a> <a href="https://residence-greece.com/"><img title="Greece Golden Visa" width="256" src="https://joplinapp.org/images/sponsors/ResidenceGreece.jpg"/></a> <a href="https://grundstueckspreise.info/"><img title="SP Software GmbH" width="256" src="https://joplinapp.org/images/sponsors/Grundstueckspreise.png"/></a> <a href="https://tranio.com/spain/"><img title="Property for sale in Spain" width="256" src="https://joplinapp.org/images/sponsors/TranioOverseasProperty.jpg"/></a> <a href="https://citricsheep.com"><img title="Citric Sheep" width="256" src="https://joplinapp.org/images/sponsors/CitricSheep.png"/></a> <a href="https://sorted.travel/?utm_source=joplinapp "><img title="Sorted Travel" width="256" src="https://joplinapp.org/images/sponsors/SortedTravel.png"/></a>
|
<a href="https://seirei.ne.jp"><img title="Serei Network" width="256" src="https://joplinapp.org/images/sponsors/SeireiNetwork.png"/></a> <a href="https://www.hosting.de/nextcloud/?mtm_campaign=managed-nextcloud&mtm_kwd=joplinapp&mtm_source=joplinapp-webseite&mtm_medium=banner"><img title="Hosting.de" width="256" src="https://joplinapp.org/images/sponsors/HostingDe.png"/></a> <a href="https://grundstueckspreise.info/"><img title="SP Software GmbH" width="256" src="https://joplinapp.org/images/sponsors/Grundstueckspreise.png"/></a> <a href="https://citricsheep.com"><img title="Citric Sheep" width="256" src="https://joplinapp.org/images/sponsors/CitricSheep.png"/></a> <a href="https://sorted.travel/?utm_source=joplinapp"><img title="Sorted Travel" width="256" src="https://joplinapp.org/images/sponsors/SortedTravel.png"/></a> <a href="https://celebian.com"><img title="Celebian" width="256" src="https://joplinapp.org/images/sponsors/Celebian.png"/></a> <a href="https://bestkru.com"><img title="BestKru" width="256" src="https://joplinapp.org/images/sponsors/BestKru.png"/></a>
|
||||||
<!-- SPONSORS-ORG -->
|
<!-- SPONSORS-ORG -->
|
||||||
|
|
||||||
* * *
|
* * *
|
||||||
@@ -39,11 +39,12 @@ Please see the [donation page](https://github.com/laurent22/joplin/blob/dev/read
|
|||||||
<!-- SPONSORS-GITHUB -->
|
<!-- SPONSORS-GITHUB -->
|
||||||
| | | | |
|
| | | | |
|
||||||
| :---: | :---: | :---: | :---: |
|
| :---: | :---: | :---: | :---: |
|
||||||
| <img width="50" src="https://avatars2.githubusercontent.com/u/215668?s=96&v=4"/></br>[avanderberg](https://github.com/avanderberg) | <img width="50" src="https://avatars2.githubusercontent.com/u/67130?s=96&v=4"/></br>[chr15m](https://github.com/chr15m) | <img width="50" src="https://avatars2.githubusercontent.com/u/2793530?s=96&v=4"/></br>[CyberXZT](https://github.com/CyberXZT) | <img width="50" src="https://avatars2.githubusercontent.com/u/1307332?s=96&v=4"/></br>[dbrandonjohnson](https://github.com/dbrandonjohnson) |
|
| <img width="50" src="https://avatars2.githubusercontent.com/u/97193607?s=96&v=4"/></br>[Akhil-CM](https://github.com/Akhil-CM) | <img width="50" src="https://avatars2.githubusercontent.com/u/552452?s=96&v=4"/></br>[andypiper](https://github.com/andypiper) | <img width="50" src="https://avatars2.githubusercontent.com/u/215668?s=96&v=4"/></br>[avanderberg](https://github.com/avanderberg) | <img width="50" src="https://avatars2.githubusercontent.com/u/67130?s=96&v=4"/></br>[chr15m](https://github.com/chr15m) |
|
||||||
| <img width="50" src="https://avatars2.githubusercontent.com/u/14873877?s=96&v=4"/></br>[dchecks](https://github.com/dchecks) | <img width="50" src="https://avatars2.githubusercontent.com/u/56287?s=96&v=4"/></br>[fats](https://github.com/fats) | <img width="50" src="https://avatars2.githubusercontent.com/u/8030470?s=96&v=4"/></br>[Galliver7](https://github.com/Galliver7) | <img width="50" src="https://avatars2.githubusercontent.com/u/64712218?s=96&v=4"/></br>[Hegghammer](https://github.com/Hegghammer) |
|
| <img width="50" src="https://avatars2.githubusercontent.com/u/2793530?s=96&v=4"/></br>[CyberXZT](https://github.com/CyberXZT) | <img width="50" src="https://avatars2.githubusercontent.com/u/1307332?s=96&v=4"/></br>[dbrandonjohnson](https://github.com/dbrandonjohnson) | <img width="50" src="https://avatars2.githubusercontent.com/u/14873877?s=96&v=4"/></br>[dchecks](https://github.com/dchecks) | <img width="50" src="https://avatars2.githubusercontent.com/u/56287?s=96&v=4"/></br>[fats](https://github.com/fats) |
|
||||||
| <img width="50" src="https://avatars2.githubusercontent.com/u/1310474?s=96&v=4"/></br>[jknowles](https://github.com/jknowles) | <img width="50" src="https://avatars2.githubusercontent.com/u/11947658?s=96&v=4"/></br>[KentBrockman](https://github.com/KentBrockman) | <img width="50" src="https://avatars2.githubusercontent.com/u/24908652?s=96&v=4"/></br>[konishi-t](https://github.com/konishi-t) | <img width="50" src="https://avatars2.githubusercontent.com/u/42319182?s=96&v=4"/></br>[marcdw1289](https://github.com/marcdw1289) |
|
| <img width="50" src="https://avatars2.githubusercontent.com/u/8030470?s=96&v=4"/></br>[Galliver7](https://github.com/Galliver7) | <img width="50" src="https://avatars2.githubusercontent.com/u/64712218?s=96&v=4"/></br>[Hegghammer](https://github.com/Hegghammer) | <img width="50" src="https://avatars2.githubusercontent.com/u/2583421?s=96&v=4"/></br>[jamesandariese](https://github.com/jamesandariese) | <img width="50" src="https://avatars2.githubusercontent.com/u/1310474?s=96&v=4"/></br>[jknowles](https://github.com/jknowles) |
|
||||||
| <img width="50" src="https://avatars2.githubusercontent.com/u/126279083?s=96&v=4"/></br>[matmoly](https://github.com/matmoly) | <img width="50" src="https://avatars2.githubusercontent.com/u/1788010?s=96&v=4"/></br>[maxtruxa](https://github.com/maxtruxa) | <img width="50" src="https://avatars2.githubusercontent.com/u/4560672?s=96&v=4"/></br>[mu88](https://github.com/mu88) | <img width="50" src="https://avatars2.githubusercontent.com/u/31054972?s=96&v=4"/></br>[saarantras](https://github.com/saarantras) |
|
| <img width="50" src="https://avatars2.githubusercontent.com/u/11947658?s=96&v=4"/></br>[KentBrockman](https://github.com/KentBrockman) | <img width="50" src="https://avatars2.githubusercontent.com/u/24908652?s=96&v=4"/></br>[konishi-t](https://github.com/konishi-t) | <img width="50" src="https://avatars2.githubusercontent.com/u/42319182?s=96&v=4"/></br>[marcdw1289](https://github.com/marcdw1289) | <img width="50" src="https://avatars2.githubusercontent.com/u/126279083?s=96&v=4"/></br>[matmoly](https://github.com/matmoly) |
|
||||||
| <img width="50" src="https://avatars2.githubusercontent.com/u/327998?s=96&v=4"/></br>[sif](https://github.com/sif) | <img width="50" src="https://avatars2.githubusercontent.com/u/765564?s=96&v=4"/></br>[taskcruncher](https://github.com/taskcruncher) | <img width="50" src="https://avatars2.githubusercontent.com/u/333944?s=96&v=4"/></br>[tateisu](https://github.com/tateisu) | |
|
| <img width="50" src="https://avatars2.githubusercontent.com/u/1788010?s=96&v=4"/></br>[maxtruxa](https://github.com/maxtruxa) | <img width="50" src="https://avatars2.githubusercontent.com/u/4560672?s=96&v=4"/></br>[mu88](https://github.com/mu88) | <img width="50" src="https://avatars2.githubusercontent.com/u/31054972?s=96&v=4"/></br>[saarantras](https://github.com/saarantras) | <img width="50" src="https://avatars2.githubusercontent.com/u/327998?s=96&v=4"/></br>[sif](https://github.com/sif) |
|
||||||
|
| <img width="50" src="https://avatars2.githubusercontent.com/u/765564?s=96&v=4"/></br>[taskcruncher](https://github.com/taskcruncher) | <img width="50" src="https://avatars2.githubusercontent.com/u/333944?s=96&v=4"/></br>[tateisu](https://github.com/tateisu) | | |
|
||||||
<!-- SPONSORS-GITHUB -->
|
<!-- SPONSORS-GITHUB -->
|
||||||
|
|
||||||
# Community
|
# Community
|
||||||
|
962
cspell.json
@@ -1,7 +1,13 @@
|
|||||||
{
|
{
|
||||||
"version": "0.2",
|
"version": "0.2",
|
||||||
"language": "en_GB",
|
"language": "en_GB",
|
||||||
|
"ignoreRegExpList": [
|
||||||
|
"\\[.*?\\]\\(https:\\/\\/github.com\\/.*?\\)",
|
||||||
|
"by .*?\\)",
|
||||||
|
"\\| (.*?) \\| \\d+%"
|
||||||
|
],
|
||||||
"ignorePaths": [
|
"ignorePaths": [
|
||||||
|
"**/*.d.ts",
|
||||||
"**/*.min.*",
|
"**/*.min.*",
|
||||||
"**/*.svg",
|
"**/*.svg",
|
||||||
"/_mydocs",
|
"/_mydocs",
|
||||||
@@ -11,7 +17,10 @@
|
|||||||
"/Assets",
|
"/Assets",
|
||||||
"/packages/app-cli/app/fuzzing.js",
|
"/packages/app-cli/app/fuzzing.js",
|
||||||
"/packages/app-cli/build",
|
"/packages/app-cli/build",
|
||||||
|
"/packages/app-cli/tests/enex_to_md/",
|
||||||
|
"/packages/app-cli/tests/html_to_md/",
|
||||||
"/packages/app-cli/tests/support",
|
"/packages/app-cli/tests/support",
|
||||||
|
"/packages/app-cli/tests/sync",
|
||||||
"/packages/app-cli/tests/test data",
|
"/packages/app-cli/tests/test data",
|
||||||
"/packages/app-cli/tests/tmp",
|
"/packages/app-cli/tests/tmp",
|
||||||
"/packages/app-clipper/content_scripts/JSDOMParser.js",
|
"/packages/app-clipper/content_scripts/JSDOMParser.js",
|
||||||
@@ -20,14 +29,24 @@
|
|||||||
"/packages/app-clipper/popup/build/js/0.chunk.js",
|
"/packages/app-clipper/popup/build/js/0.chunk.js",
|
||||||
"/packages/app-clipper/popup/build/js/bundle.js",
|
"/packages/app-clipper/popup/build/js/bundle.js",
|
||||||
"/packages/app-clipper/popup/build/js/main.chunk.js",
|
"/packages/app-clipper/popup/build/js/main.chunk.js",
|
||||||
"/packages/app-clipper/popup/build/js/main.chunk.js",
|
|
||||||
"/packages/app-clipper/popup/config",
|
"/packages/app-clipper/popup/config",
|
||||||
|
"/packages/app-desktop/build/",
|
||||||
|
"/packages/app-desktop/utils/checkForUpdatesUtilsTestData.ts",
|
||||||
"/packages/app-desktop/vendor/",
|
"/packages/app-desktop/vendor/",
|
||||||
|
"/packages/app-mobile/ios/Pods/",
|
||||||
|
"/packages/app-mobile/lib/rnInjectedJs",
|
||||||
"/packages/app-mobile/pluginAssets",
|
"/packages/app-mobile/pluginAssets",
|
||||||
|
"/packages/app-mobile/utils/fs-driver/runOnDeviceTests.ts",
|
||||||
|
"/packages/default-plugins/plugin-sources/",
|
||||||
|
"/packages/doc-builder/build",
|
||||||
|
"/packages/doc-builder/help/",
|
||||||
|
"/packages/doc-builder/i18n/",
|
||||||
|
"/packages/doc-builder/news/",
|
||||||
"/packages/fork-sax/examples",
|
"/packages/fork-sax/examples",
|
||||||
"/packages/fork-sax/lib/sax.js",
|
"/packages/fork-sax/lib/sax.js",
|
||||||
"/packages/fork-sax/test",
|
"/packages/fork-sax/test",
|
||||||
"/packages/fork-uslug",
|
"/packages/fork-uslug",
|
||||||
|
"/packages/generator-joplin/generators/app/templates/api/",
|
||||||
"/packages/lib/locales",
|
"/packages/lib/locales",
|
||||||
"/packages/lib/mime-utils-types.js",
|
"/packages/lib/mime-utils-types.js",
|
||||||
"/packages/lib/parameters.js",
|
"/packages/lib/parameters.js",
|
||||||
@@ -36,919 +55,38 @@
|
|||||||
"/packages/lib/services/joplinServer/personalizedUserContentBaseUrl.ts",
|
"/packages/lib/services/joplinServer/personalizedUserContentBaseUrl.ts",
|
||||||
"/packages/lib/vendor",
|
"/packages/lib/vendor",
|
||||||
"/packages/lib/welcomeAssets.js",
|
"/packages/lib/welcomeAssets.js",
|
||||||
|
"/packages/renderer/highlight.ts",
|
||||||
|
"/packages/server/src/utils/testing/randomWords.ts",
|
||||||
"/packages/turndown-plugin-gfm/config",
|
"/packages/turndown-plugin-gfm/config",
|
||||||
"/packages/turndown/config",
|
"/packages/turndown/config",
|
||||||
|
"/readme/_i18n",
|
||||||
|
"/readme/about/changelog/desktop.md",
|
||||||
|
"/readme/i18n",
|
||||||
|
"cspell.json",
|
||||||
"node_modules"
|
"node_modules"
|
||||||
],
|
],
|
||||||
"words": [
|
"dictionaryDefinitions": [
|
||||||
"aàáâãäåāą",
|
{
|
||||||
"AÀÁÂÃÄÅĀĄ",
|
"name": "dictionary1",
|
||||||
"abbrev",
|
"path": "packages/tools/cspell/dictionary1.txt"
|
||||||
"ABCDEFGHIJ",
|
},
|
||||||
"Abhishek",
|
{
|
||||||
"Abkhazian",
|
"name": "dictionary2",
|
||||||
"accel",
|
"path": "packages/tools/cspell/dictionary2.txt"
|
||||||
"accum",
|
},
|
||||||
"actualkeyword",
|
{
|
||||||
"adata",
|
"name": "dictionary3",
|
||||||
"advlist",
|
"path": "packages/tools/cspell/dictionary3.txt"
|
||||||
"AGSFE",
|
},
|
||||||
"Aland",
|
{
|
||||||
"Åland",
|
"name": "dictionary4",
|
||||||
"alertbanner",
|
"path": "packages/tools/cspell/dictionary4.txt"
|
||||||
"Allaire",
|
}
|
||||||
"alse",
|
],
|
||||||
"altool",
|
"dictionaries": [
|
||||||
"aman",
|
"dictionary1",
|
||||||
"ambrt",
|
"dictionary2",
|
||||||
"Amharic",
|
"dictionary3",
|
||||||
"amothc",
|
"dictionary4"
|
||||||
"andrejilderda",
|
]
|
||||||
"anki",
|
|
||||||
"Antarctique",
|
|
||||||
"antarctiques",
|
|
||||||
"Antártico",
|
|
||||||
"anymore",
|
|
||||||
"apidoc",
|
|
||||||
"appiconset",
|
|
||||||
"applewebkit",
|
|
||||||
"approot",
|
|
||||||
"arableague",
|
|
||||||
"Aragonés",
|
|
||||||
"ARITIM",
|
|
||||||
"armeabi",
|
|
||||||
"asterix",
|
|
||||||
"atest",
|
|
||||||
"atestb",
|
|
||||||
"attribname",
|
|
||||||
"attribvalue",
|
|
||||||
"authcode",
|
|
||||||
"autocompleteitem",
|
|
||||||
"autocompleter",
|
|
||||||
"Autocompleter",
|
|
||||||
"AUTOEXEC",
|
|
||||||
"autohide",
|
|
||||||
"Avenir",
|
|
||||||
"Ayiti",
|
|
||||||
"azamah",
|
|
||||||
"Azərbaycan",
|
|
||||||
"backoff",
|
|
||||||
"Bangla",
|
|
||||||
"Bêafrîka",
|
|
||||||
"beforeinput",
|
|
||||||
"België",
|
|
||||||
"Belgien",
|
|
||||||
"Belgique",
|
|
||||||
"Bénin",
|
|
||||||
"Bhutani",
|
|
||||||
"bibtex",
|
|
||||||
"Bihari",
|
|
||||||
"Bislama",
|
|
||||||
"blabla",
|
|
||||||
"blablablabla",
|
|
||||||
"boohay",
|
|
||||||
"Bosna",
|
|
||||||
"Bouvet",
|
|
||||||
"Bouvetøya",
|
|
||||||
"browserslist",
|
|
||||||
"bthqu",
|
|
||||||
"btns",
|
|
||||||
"Bulibiya",
|
|
||||||
"bullist",
|
|
||||||
"bulma",
|
|
||||||
"Byelorussian",
|
|
||||||
"calebjohn",
|
|
||||||
"Calédonie",
|
|
||||||
"Caligraphic",
|
|
||||||
"callsites",
|
|
||||||
"Cameroun",
|
|
||||||
"cantdothat",
|
|
||||||
"Capslock",
|
|
||||||
"cardcontainer",
|
|
||||||
"cardimage",
|
|
||||||
"cardmenuitem",
|
|
||||||
"cardtext",
|
|
||||||
"Caribisch",
|
|
||||||
"CAUTOEXEC",
|
|
||||||
"cçćč",
|
|
||||||
"CÇĆČ",
|
|
||||||
"cdataend",
|
|
||||||
"cdatastart",
|
|
||||||
"cdot",
|
|
||||||
"ceaf",
|
|
||||||
"centrafricaine",
|
|
||||||
"Centrafrican",
|
|
||||||
"Česká",
|
|
||||||
"changedtitle",
|
|
||||||
"charcodes",
|
|
||||||
"checkboxclick",
|
|
||||||
"checkmark",
|
|
||||||
"chemfive",
|
|
||||||
"choiceitem",
|
|
||||||
"chromedriver",
|
|
||||||
"chromeframe",
|
|
||||||
"chromeos",
|
|
||||||
"Città",
|
|
||||||
"Cmds",
|
|
||||||
"codepoint",
|
|
||||||
"colorinput",
|
|
||||||
"colorpicker",
|
|
||||||
"colorswatch",
|
|
||||||
"colspan",
|
|
||||||
"committerdate",
|
|
||||||
"commmmmand",
|
|
||||||
"commonmark",
|
|
||||||
"COMMONMARK",
|
|
||||||
"Comores",
|
|
||||||
"compositionend",
|
|
||||||
"compositionstart",
|
|
||||||
"compositionupdate",
|
|
||||||
"conflicter",
|
|
||||||
"contenteditable",
|
|
||||||
"contextform",
|
|
||||||
"contextformbutton",
|
|
||||||
"contextformtogglebutton",
|
|
||||||
"contextkey",
|
|
||||||
"contexttoolbar",
|
|
||||||
"continuelist",
|
|
||||||
"Contrl",
|
|
||||||
"Conv",
|
|
||||||
"convo",
|
|
||||||
"copytags",
|
|
||||||
"cozic",
|
|
||||||
"Cozic",
|
|
||||||
"createdb",
|
|
||||||
"Creds",
|
|
||||||
"Crna",
|
|
||||||
"cronspec",
|
|
||||||
"cros",
|
|
||||||
"crypted",
|
|
||||||
"Curaçao",
|
|
||||||
"curso",
|
|
||||||
"customeditor",
|
|
||||||
"customkeymap",
|
|
||||||
"cyingfan",
|
|
||||||
"d'Ivoire",
|
|
||||||
"Danmark",
|
|
||||||
"Dansk",
|
|
||||||
"dataimg",
|
|
||||||
"datauri",
|
|
||||||
"Datauri",
|
|
||||||
"datetime",
|
|
||||||
"Datetime",
|
|
||||||
"davris",
|
|
||||||
"dbuuid",
|
|
||||||
"DDTHH",
|
|
||||||
"deflist",
|
|
||||||
"deinit",
|
|
||||||
"Démocratique",
|
|
||||||
"deselector",
|
|
||||||
"deuxième",
|
|
||||||
"dflt",
|
|
||||||
"dialogbox",
|
|
||||||
"dialogs",
|
|
||||||
"Dialogs",
|
|
||||||
"DIALOGS",
|
|
||||||
"Distill",
|
|
||||||
"dists",
|
|
||||||
"docid",
|
|
||||||
"docsize",
|
|
||||||
"doctypes",
|
|
||||||
"doesnotwork",
|
|
||||||
"doesntexist",
|
|
||||||
"doesntlookright",
|
|
||||||
"domelementtype",
|
|
||||||
"domhandler",
|
|
||||||
"Dominicana",
|
|
||||||
"domutils",
|
|
||||||
"DONATELINKS",
|
|
||||||
"downarrow",
|
|
||||||
"dragdrop",
|
|
||||||
"draggesture",
|
|
||||||
"dünn",
|
|
||||||
"dylib",
|
|
||||||
"dynamiclib",
|
|
||||||
"ecuatorial",
|
|
||||||
"eèéêëěēę",
|
|
||||||
"EÈÉÊËĚĒĘ",
|
|
||||||
"Eesti",
|
|
||||||
"effet",
|
|
||||||
"efgh",
|
|
||||||
"égalité",
|
|
||||||
"Éire",
|
|
||||||
"elem",
|
|
||||||
"elementpath",
|
|
||||||
"elems",
|
|
||||||
"ellipsize",
|
|
||||||
"ELOCKED",
|
|
||||||
"encryptable",
|
|
||||||
"endregion",
|
|
||||||
"enex",
|
|
||||||
"Enex",
|
|
||||||
"ENEX",
|
|
||||||
"enumber",
|
|
||||||
"eqeqeq",
|
|
||||||
"équatoriale",
|
|
||||||
"Erro",
|
|
||||||
"errorish",
|
|
||||||
"escapeplus",
|
|
||||||
"eslintignore",
|
|
||||||
"España",
|
|
||||||
"étiquette",
|
|
||||||
"EUNSPECIFIED",
|
|
||||||
"eventname",
|
|
||||||
"evermeet",
|
|
||||||
"evernote",
|
|
||||||
"Evernote",
|
|
||||||
"execa",
|
|
||||||
"expando",
|
|
||||||
"expirable",
|
|
||||||
"Expirable",
|
|
||||||
"expval",
|
|
||||||
"Færøerne",
|
|
||||||
"Fahrräder",
|
|
||||||
"FAILSAFE",
|
|
||||||
"fallbacks",
|
|
||||||
"fancymenuitem",
|
|
||||||
"fancytype",
|
|
||||||
"favorites",
|
|
||||||
"Fiber",
|
|
||||||
"filepicker",
|
|
||||||
"folderid",
|
|
||||||
"foldl",
|
|
||||||
"fontawesome",
|
|
||||||
"fontface",
|
|
||||||
"forall",
|
|
||||||
"forcewake",
|
|
||||||
"Føroyar",
|
|
||||||
"fortawesome",
|
|
||||||
"française",
|
|
||||||
"françaises",
|
|
||||||
"Gabuutih",
|
|
||||||
"gedit",
|
|
||||||
"geoip",
|
|
||||||
"Geoip",
|
|
||||||
"geoloc",
|
|
||||||
"geoplugin",
|
|
||||||
"getlastmodified",
|
|
||||||
"gettext",
|
|
||||||
"githubusercontent",
|
|
||||||
"Gora",
|
|
||||||
"gotchas",
|
|
||||||
"gradlew",
|
|
||||||
"Grønland",
|
|
||||||
"grouptoolbarbutton",
|
|
||||||
"Gruber",
|
|
||||||
"gsoc",
|
|
||||||
"gttest",
|
|
||||||
"Guåhån",
|
|
||||||
"guarentee",
|
|
||||||
"guarentees",
|
|
||||||
"Guiena",
|
|
||||||
"Guiné",
|
|
||||||
"Guinée",
|
|
||||||
"gulpfile",
|
|
||||||
"Guyane",
|
|
||||||
"gvim",
|
|
||||||
"Haïti",
|
|
||||||
"hanlder",
|
|
||||||
"Hausa",
|
|
||||||
"headerless",
|
|
||||||
"Heisenbug",
|
|
||||||
"Hercegovina",
|
|
||||||
"hift",
|
|
||||||
"highjack",
|
|
||||||
"highlited",
|
|
||||||
"historyhas",
|
|
||||||
"HMRKG",
|
|
||||||
"hoge",
|
|
||||||
"homenote",
|
|
||||||
"hotfolder",
|
|
||||||
"Howver",
|
|
||||||
"hpagent",
|
|
||||||
"Hrvatska",
|
|
||||||
"htmlentities",
|
|
||||||
"htmlfile",
|
|
||||||
"htmlpack",
|
|
||||||
"htmlpanel",
|
|
||||||
"ʻĀirani",
|
|
||||||
"icns",
|
|
||||||
"iconset",
|
|
||||||
"iconutil",
|
|
||||||
"Iforgot",
|
|
||||||
"iframes",
|
|
||||||
"ihack",
|
|
||||||
"iife",
|
|
||||||
"iìíîïī",
|
|
||||||
"IÌÍÎÏĪ",
|
|
||||||
"ijkl",
|
|
||||||
"imagelink",
|
|
||||||
"imagetools",
|
|
||||||
"immer",
|
|
||||||
"iname",
|
|
||||||
"Incl",
|
|
||||||
"infint",
|
|
||||||
"inflim",
|
|
||||||
"infty",
|
|
||||||
"inputi",
|
|
||||||
"inserttable",
|
|
||||||
"Interlingue",
|
|
||||||
"Interp",
|
|
||||||
"interupting",
|
|
||||||
"Inteval",
|
|
||||||
"Inuktitut",
|
|
||||||
"Inupiak",
|
|
||||||
"Invididual",
|
|
||||||
"IOERR",
|
|
||||||
"Ionicons",
|
|
||||||
"IPHONEOS",
|
|
||||||
"ipify",
|
|
||||||
"ipwhois",
|
|
||||||
"iscompleted",
|
|
||||||
"Ísland",
|
|
||||||
"Italiano",
|
|
||||||
"Itoophiyaa",
|
|
||||||
"itsgone",
|
|
||||||
"itunes",
|
|
||||||
"Jabuuti",
|
|
||||||
"jackgruber",
|
|
||||||
"joeattardi",
|
|
||||||
"jopext",
|
|
||||||
"joplinapp",
|
|
||||||
"JOPLINAPP",
|
|
||||||
"joplincloud",
|
|
||||||
"joplindev",
|
|
||||||
"JOPLINMOD",
|
|
||||||
"joplintest",
|
|
||||||
"jsbundles",
|
|
||||||
"justtesting",
|
|
||||||
"Kalaallit",
|
|
||||||
"kalba",
|
|
||||||
"kanban",
|
|
||||||
"Kashmiri",
|
|
||||||
"katex",
|
|
||||||
"keychain",
|
|
||||||
"keycodes",
|
|
||||||
"keymaps",
|
|
||||||
"keytar",
|
|
||||||
"Kibris",
|
|
||||||
"Kinyarwanda",
|
|
||||||
"Kirundi",
|
|
||||||
"Ködörösêse",
|
|
||||||
"Komori",
|
|
||||||
"Kpck",
|
|
||||||
"Kūki",
|
|
||||||
"Laothian",
|
|
||||||
"lastmod",
|
|
||||||
"Latvija",
|
|
||||||
"lcov",
|
|
||||||
"leaft",
|
|
||||||
"leftarrow",
|
|
||||||
"leftequilibrium",
|
|
||||||
"leftrightarrow",
|
|
||||||
"Lettish",
|
|
||||||
"Lëtzebuerg",
|
|
||||||
"Levithan",
|
|
||||||
"Liban",
|
|
||||||
"libz",
|
|
||||||
"Lietuva",
|
|
||||||
"Lietuvių",
|
|
||||||
"lineheight",
|
|
||||||
"Lingala",
|
|
||||||
"linkg",
|
|
||||||
"linkurl",
|
|
||||||
"listbox",
|
|
||||||
"listfile",
|
|
||||||
"listpreview",
|
|
||||||
"loglevel",
|
|
||||||
"longclick",
|
|
||||||
"longpress",
|
|
||||||
"longpresscancel",
|
|
||||||
"looooooong",
|
|
||||||
"ltrim",
|
|
||||||
"Luxemburg",
|
|
||||||
"Maarten",
|
|
||||||
"Madagasikara",
|
|
||||||
"Magyarország",
|
|
||||||
"majax",
|
|
||||||
"Mardown",
|
|
||||||
"markdowncalc",
|
|
||||||
"Maroc",
|
|
||||||
"MASTERKEY",
|
|
||||||
"matchinfo",
|
|
||||||
"mathchoice",
|
|
||||||
"mathjax",
|
|
||||||
"Mathjax",
|
|
||||||
"MATHJAX",
|
|
||||||
"mathllap",
|
|
||||||
"mathml",
|
|
||||||
"mathrlap",
|
|
||||||
"mathrm",
|
|
||||||
"Mauritanie",
|
|
||||||
"Maxiumm",
|
|
||||||
"Mayen",
|
|
||||||
"mchem",
|
|
||||||
"mechanim",
|
|
||||||
"mediumtext",
|
|
||||||
"menubutton",
|
|
||||||
"mergeff",
|
|
||||||
"Metadatas",
|
|
||||||
"México",
|
|
||||||
"mhchem",
|
|
||||||
"middlewares",
|
|
||||||
"migth",
|
|
||||||
"mkbook",
|
|
||||||
"MKCOL",
|
|
||||||
"mkdirp",
|
|
||||||
"mknote",
|
|
||||||
"mktodo",
|
|
||||||
"MMYY",
|
|
||||||
"modifié",
|
|
||||||
"monokai",
|
|
||||||
"MONOSPACE",
|
|
||||||
"msgctxt",
|
|
||||||
"msgfmt",
|
|
||||||
"msgmerge",
|
|
||||||
"msgstr",
|
|
||||||
"msleep",
|
|
||||||
"mtext",
|
|
||||||
"mult",
|
|
||||||
"multicursor",
|
|
||||||
"multimarkdown",
|
|
||||||
"multimd",
|
|
||||||
"multistatus",
|
|
||||||
"multitable",
|
|
||||||
"mybucket",
|
|
||||||
"mydir",
|
|
||||||
"myfile",
|
|
||||||
"mynote",
|
|
||||||
"myplugin",
|
|
||||||
"mytag",
|
|
||||||
"mytaga",
|
|
||||||
"mytagb",
|
|
||||||
"mytagc",
|
|
||||||
"mytagd",
|
|
||||||
"mytest",
|
|
||||||
"mytoken",
|
|
||||||
"myvalue",
|
|
||||||
"nanoid",
|
|
||||||
"Neaus",
|
|
||||||
"Nederlands",
|
|
||||||
"nestedmenuitem",
|
|
||||||
"newone",
|
|
||||||
"Nextcloud",
|
|
||||||
"njstrace",
|
|
||||||
"nñňń",
|
|
||||||
"NÑŇŃ",
|
|
||||||
"NOCASE",
|
|
||||||
"nodechange",
|
|
||||||
"nodir",
|
|
||||||
"noexpand",
|
|
||||||
"nojs",
|
|
||||||
"nolongershared",
|
|
||||||
"nonlatin",
|
|
||||||
"NONLATIN",
|
|
||||||
"Noreg",
|
|
||||||
"Norge",
|
|
||||||
"nospecialcharacters",
|
|
||||||
"notanumber",
|
|
||||||
"notarization",
|
|
||||||
"notetags",
|
|
||||||
"Notif",
|
|
||||||
"notindexed",
|
|
||||||
"notthere",
|
|
||||||
"nounce",
|
|
||||||
"Nounce",
|
|
||||||
"Nounces",
|
|
||||||
"npmignore",
|
|
||||||
"numadd",
|
|
||||||
"numbersareok",
|
|
||||||
"numdec",
|
|
||||||
"numdiv",
|
|
||||||
"numlist",
|
|
||||||
"Numlock",
|
|
||||||
"nummult",
|
|
||||||
"numsub",
|
|
||||||
"Nunaat",
|
|
||||||
"obelix",
|
|
||||||
"odata",
|
|
||||||
"ohno",
|
|
||||||
"OHNO",
|
|
||||||
"oldppk",
|
|
||||||
"onattribdata",
|
|
||||||
"onattribend",
|
|
||||||
"onattribname",
|
|
||||||
"onattribute",
|
|
||||||
"oncdata",
|
|
||||||
"oncdataend",
|
|
||||||
"oncdatastart",
|
|
||||||
"onclosetag",
|
|
||||||
"oncomment",
|
|
||||||
"oncommentend",
|
|
||||||
"ondeclaration",
|
|
||||||
"onedrive",
|
|
||||||
"onelink",
|
|
||||||
"onformat",
|
|
||||||
"onmatch",
|
|
||||||
"onopentag",
|
|
||||||
"onopentagend",
|
|
||||||
"onopentagname",
|
|
||||||
"onparserinit",
|
|
||||||
"onprocessinginstruction",
|
|
||||||
"onselfclosingtag",
|
|
||||||
"ontext",
|
|
||||||
"oòóôõöøō",
|
|
||||||
"OÒÓÔÕÖØŌ",
|
|
||||||
"opentag",
|
|
||||||
"opentagname",
|
|
||||||
"Opptionn",
|
|
||||||
"orignal",
|
|
||||||
"Oromo",
|
|
||||||
"Österreich",
|
|
||||||
"otherpackage",
|
|
||||||
"outdented",
|
|
||||||
"overidding",
|
|
||||||
"overriden",
|
|
||||||
"padd",
|
|
||||||
"pandoc",
|
|
||||||
"paperclip",
|
|
||||||
"passthrough",
|
|
||||||
"Päth",
|
|
||||||
"Pbuild",
|
|
||||||
"pbxproj",
|
|
||||||
"pcmag",
|
|
||||||
"pcnalx",
|
|
||||||
"pddv",
|
|
||||||
"Pehr",
|
|
||||||
"Percents",
|
|
||||||
"père",
|
|
||||||
"Perú",
|
|
||||||
"pfff",
|
|
||||||
"PGPASSWORD",
|
|
||||||
"pidfile",
|
|
||||||
"PLUGINLEGACY",
|
|
||||||
"pocount",
|
|
||||||
"Polska",
|
|
||||||
"Polski",
|
|
||||||
"Polynésie",
|
|
||||||
"Português",
|
|
||||||
"Potoczny's",
|
|
||||||
"powerpoint",
|
|
||||||
"Prakash",
|
|
||||||
"precommit",
|
|
||||||
"pred",
|
|
||||||
"preg",
|
|
||||||
"prerelease",
|
|
||||||
"Prerelease",
|
|
||||||
"presigner",
|
|
||||||
"prettycron",
|
|
||||||
"pricetag",
|
|
||||||
"Príncipe",
|
|
||||||
"privkey",
|
|
||||||
"processinginstruction",
|
|
||||||
"programatically",
|
|
||||||
"propfind",
|
|
||||||
"PROPFIND",
|
|
||||||
"propname",
|
|
||||||
"propstat",
|
|
||||||
"protcol",
|
|
||||||
"pseudoclass",
|
|
||||||
"pseudos",
|
|
||||||
"Pushto",
|
|
||||||
"quot",
|
|
||||||
"qwer",
|
|
||||||
"raisebox",
|
|
||||||
"rbga",
|
|
||||||
"readerable",
|
|
||||||
"Readerable",
|
|
||||||
"READERABLE",
|
|
||||||
"Redownload",
|
|
||||||
"reencrypt",
|
|
||||||
"reencrypted",
|
|
||||||
"Reencrypting",
|
|
||||||
"reencrypts",
|
|
||||||
"regexes",
|
|
||||||
"Regexs",
|
|
||||||
"Relavent",
|
|
||||||
"relayouted",
|
|
||||||
"rels",
|
|
||||||
"renamings",
|
|
||||||
"renderered",
|
|
||||||
"Renderered",
|
|
||||||
"República",
|
|
||||||
"republika",
|
|
||||||
"République",
|
|
||||||
"requestheaders",
|
|
||||||
"resourcetype",
|
|
||||||
"resynced",
|
|
||||||
"Rhaeto",
|
|
||||||
"rightarrow",
|
|
||||||
"rightequilibrium",
|
|
||||||
"rightleftarrows",
|
|
||||||
"rightleftharpoons",
|
|
||||||
"rmbook",
|
|
||||||
"rmnote",
|
|
||||||
"rmusin",
|
|
||||||
"rnfs",
|
|
||||||
"RNFS",
|
|
||||||
"robocopy",
|
|
||||||
"Roboto",
|
|
||||||
"România",
|
|
||||||
"roule",
|
|
||||||
"rowid",
|
|
||||||
"ROWID",
|
|
||||||
"ROWIDs",
|
|
||||||
"rowspan",
|
|
||||||
"rseidelsohn",
|
|
||||||
"rtrim",
|
|
||||||
"safeext",
|
|
||||||
"salut",
|
|
||||||
"Sangho",
|
|
||||||
"sasss",
|
|
||||||
"SAVEPOINT",
|
|
||||||
"schtroumpf",
|
|
||||||
"Schweiz",
|
|
||||||
"Scrolllock",
|
|
||||||
"scrollmap",
|
|
||||||
"seafdav",
|
|
||||||
"Seafile",
|
|
||||||
"searchengine",
|
|
||||||
"searchlimit",
|
|
||||||
"SEARCHOVERLAY",
|
|
||||||
"securerandom",
|
|
||||||
"segdir",
|
|
||||||
"selectbox",
|
|
||||||
"Sénégal",
|
|
||||||
"Serializers",
|
|
||||||
"setext",
|
|
||||||
"settingschema",
|
|
||||||
"shantanugoel",
|
|
||||||
"sharee",
|
|
||||||
"Shiftt",
|
|
||||||
"Shoft",
|
|
||||||
"shouldntendwithit",
|
|
||||||
"shouldstartwiththis",
|
|
||||||
"Shqip",
|
|
||||||
"Shqipëria",
|
|
||||||
"Sicen",
|
|
||||||
"simplemath",
|
|
||||||
"Siswati",
|
|
||||||
"sizeinput",
|
|
||||||
"SJCL",
|
|
||||||
"Slovenčina",
|
|
||||||
"Slovenija",
|
|
||||||
"Slovensko",
|
|
||||||
"softbreaks",
|
|
||||||
"Solarised",
|
|
||||||
"SOLARIZED",
|
|
||||||
"someid",
|
|
||||||
"somewhereelse",
|
|
||||||
"sourceurl",
|
|
||||||
"SPACEBAR",
|
|
||||||
"spaceno",
|
|
||||||
"Spacify",
|
|
||||||
"spdfgh",
|
|
||||||
"spellfix",
|
|
||||||
"sphemy",
|
|
||||||
"splitbutton",
|
|
||||||
"sprintf",
|
|
||||||
"sqlts",
|
|
||||||
"srcfolder",
|
|
||||||
"SSSZ",
|
|
||||||
"starttls",
|
|
||||||
"Starttls",
|
|
||||||
"stepsize",
|
|
||||||
"stevenlevithan",
|
|
||||||
"stex",
|
|
||||||
"stilltryingtohack",
|
|
||||||
"strack",
|
|
||||||
"Stringifiable",
|
|
||||||
"subdir",
|
|
||||||
"subl",
|
|
||||||
"Suomi",
|
|
||||||
"Sūriyya",
|
|
||||||
"Svenska",
|
|
||||||
"Sverige",
|
|
||||||
"svgs",
|
|
||||||
"Svizra",
|
|
||||||
"Svizzera",
|
|
||||||
"synclock",
|
|
||||||
"synclog",
|
|
||||||
"syswide",
|
|
||||||
"syswidecas",
|
|
||||||
"taboverride",
|
|
||||||
"tabpanel",
|
|
||||||
"taga",
|
|
||||||
"tagb",
|
|
||||||
"tagc",
|
|
||||||
"Tajik",
|
|
||||||
"takesover",
|
|
||||||
"targetfolder",
|
|
||||||
"Tchad",
|
|
||||||
"Teardown",
|
|
||||||
"termi",
|
|
||||||
"termutils",
|
|
||||||
"Terres",
|
|
||||||
"Tessarek",
|
|
||||||
"tessus",
|
|
||||||
"Testb",
|
|
||||||
"testcreate",
|
|
||||||
"testexportfolder",
|
|
||||||
"testingconnection",
|
|
||||||
"testingkeychain",
|
|
||||||
"testunit",
|
|
||||||
"texify",
|
|
||||||
"Texify",
|
|
||||||
"textareas",
|
|
||||||
"textexportnote",
|
|
||||||
"textstyle",
|
|
||||||
"thaaaaaaan",
|
|
||||||
"thatsok",
|
|
||||||
"thatsreallylongthatsreallylongthatsreallylongthats",
|
|
||||||
"thatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylong",
|
|
||||||
"Thevenard",
|
|
||||||
"thisisfine",
|
|
||||||
"Thmmss",
|
|
||||||
"Tiếng",
|
|
||||||
"Tigrinya",
|
|
||||||
"tiiitlllle",
|
|
||||||
"tinymce",
|
|
||||||
"titi",
|
|
||||||
"titletitle",
|
|
||||||
"tkwidget",
|
|
||||||
"tkwidgets",
|
|
||||||
"Todos",
|
|
||||||
"togglebutton",
|
|
||||||
"togglemenuitem",
|
|
||||||
"toolip",
|
|
||||||
"tooshort",
|
|
||||||
"treymo",
|
|
||||||
"tripledash",
|
|
||||||
"tsmerge",
|
|
||||||
"Tsonga",
|
|
||||||
"tttest",
|
|
||||||
"Tunisie",
|
|
||||||
"Türkçe",
|
|
||||||
"Türkiye",
|
|
||||||
"Türkmenistan",
|
|
||||||
"turndown",
|
|
||||||
"Turndown",
|
|
||||||
"TWCO",
|
|
||||||
"typeahead",
|
|
||||||
"Typora",
|
|
||||||
"tzip",
|
|
||||||
"uastring",
|
|
||||||
"uglifycss",
|
|
||||||
"uglifyjs",
|
|
||||||
"Uighur",
|
|
||||||
"unconflicted",
|
|
||||||
"underbrace",
|
|
||||||
"Undos",
|
|
||||||
"unescaping",
|
|
||||||
"unhighlighted",
|
|
||||||
"unixlike",
|
|
||||||
"unmocked",
|
|
||||||
"unserialize",
|
|
||||||
"unserialized",
|
|
||||||
"unserializes",
|
|
||||||
"unserializing",
|
|
||||||
"unshares",
|
|
||||||
"unsharing",
|
|
||||||
"unusued",
|
|
||||||
"uparrow",
|
|
||||||
"uphy",
|
|
||||||
"urlconverter",
|
|
||||||
"urlinput",
|
|
||||||
"userchrome",
|
|
||||||
"usercontent",
|
|
||||||
"userstyle",
|
|
||||||
"uslug",
|
|
||||||
"Ustd",
|
|
||||||
"utems",
|
|
||||||
"uuidgen",
|
|
||||||
"uuidv",
|
|
||||||
"uùúûüůū",
|
|
||||||
"UÙÚÛÜŮŪ",
|
|
||||||
"valign",
|
|
||||||
"Valign",
|
|
||||||
"vars",
|
|
||||||
"Vars",
|
|
||||||
"Vaticano",
|
|
||||||
"vers",
|
|
||||||
"verylongidverylongidverylongidverylongidverylongidverylongidverylongidverylongidverylongidverylongidverylongidverylongidverylongidverylongidverylongidverylongidverylongidverylongidverylongidverylongidverylongidverylongidverylongidverylongidverylongidverylongidverylongidverylongidverylongid",
|
|
||||||
"veryverylongclientidveryverylongclientidveryverylongclientidveryverylongclientid",
|
|
||||||
"veryverylongtitleveryverylongtitleveryverylongtitleveryverylongtitleveryverylongtitleveryverylongtitleveryverylongtitleveryverylongtitleveryverylongtitleveryverylongtitleveryverylongtitleveryverylongtitleveryverylongtitleveryverylongtitleveryverylongtitleveryverylongtitleveryverylongtitleveryverylongtitle",
|
|
||||||
"Việt",
|
|
||||||
"viewbox",
|
|
||||||
"Volapuk",
|
|
||||||
"Volívia",
|
|
||||||
"votearrow",
|
|
||||||
"webclipper",
|
|
||||||
"webdav",
|
|
||||||
"webfonts",
|
|
||||||
"whitespaces",
|
|
||||||
"widder",
|
|
||||||
"Wifi",
|
|
||||||
"Withflags",
|
|
||||||
"Wolof",
|
|
||||||
"WONTFIX",
|
|
||||||
"wrongclienttype",
|
|
||||||
"wrongpassword",
|
|
||||||
"wrongtype",
|
|
||||||
"Wuliwya",
|
|
||||||
"wxyz",
|
|
||||||
"xcallbackurl",
|
|
||||||
"xcassets",
|
|
||||||
"xcodeproj",
|
|
||||||
"xcrun",
|
|
||||||
"xgettext",
|
|
||||||
"xlink",
|
|
||||||
"xzvf",
|
|
||||||
"yarg",
|
|
||||||
"yosay",
|
|
||||||
"yufzkns",
|
|
||||||
"YYYYMMDDTHH",
|
|
||||||
"zxcvbn",
|
|
||||||
"zžżź",
|
|
||||||
"ZŽŻŹ",
|
|
||||||
"Ελλάδα",
|
|
||||||
"Ελληνικά",
|
|
||||||
"Κύπρος",
|
|
||||||
"Агентство",
|
|
||||||
"Антарктике",
|
|
||||||
"Беларусь",
|
|
||||||
"България",
|
|
||||||
"Гора",
|
|
||||||
"језик",
|
|
||||||
"Казахстан",
|
|
||||||
"Киргизия",
|
|
||||||
"Книги",
|
|
||||||
"Кыргызстан",
|
|
||||||
"Қазақстан",
|
|
||||||
"Македонија",
|
|
||||||
"Молдавия",
|
|
||||||
"Монгол",
|
|
||||||
"номер",
|
|
||||||
"рейтер",
|
|
||||||
"Рейтер",
|
|
||||||
"Россия",
|
|
||||||
"Русский",
|
|
||||||
"Северна",
|
|
||||||
"сообщило",
|
|
||||||
"СООБЩИЛО",
|
|
||||||
"Србија",
|
|
||||||
"српски",
|
|
||||||
"Україна",
|
|
||||||
"Црна",
|
|
||||||
"საქართველო",
|
|
||||||
"Հայաստան",
|
|
||||||
"ישראל",
|
|
||||||
"עיברית",
|
|
||||||
"إرتريا",
|
|
||||||
"اسلامي",
|
|
||||||
"اسلامی",
|
|
||||||
"افغانستان",
|
|
||||||
"الأُرْدُن",
|
|
||||||
"الإمارات",
|
|
||||||
"البحرين",
|
|
||||||
"الجزائر",
|
|
||||||
"السعودية",
|
|
||||||
"السودان",
|
|
||||||
"الصومال",
|
|
||||||
"العراق",
|
|
||||||
"العربيّة",
|
|
||||||
"ﺍﻟﻘﻤﺮي",
|
|
||||||
"الكويت",
|
|
||||||
"المتّحدة",
|
|
||||||
"المغرب",
|
|
||||||
"اليَمَن",
|
|
||||||
"ایران",
|
|
||||||
"پاکستان",
|
|
||||||
"تشاد",
|
|
||||||
"تونس",
|
|
||||||
"جمهوری",
|
|
||||||
"جيبوتي",
|
|
||||||
"دولة",
|
|
||||||
"دولتدولت",
|
|
||||||
"سلطنة",
|
|
||||||
"سوريا",
|
|
||||||
"عُمان",
|
|
||||||
"لبنان",
|
|
||||||
"ليبيا",
|
|
||||||
"موريتانيا",
|
|
||||||
"ⵍⵎⵖⵔⵉⴱ",
|
|
||||||
"ኢትዮጵያ",
|
|
||||||
"ኤርትራ",
|
|
||||||
"भारत",
|
|
||||||
"গণপ্রজাতন্ত্রী",
|
|
||||||
"লাদেশ",
|
|
||||||
"இலங்கை",
|
|
||||||
"ලංකා",
|
|
||||||
"คือค",
|
|
||||||
"คือคนไทย",
|
|
||||||
"ประเทศไทย",
|
|
||||||
"ປະຊາຊົນລາວ",
|
|
||||||
"မြန်မာ",
|
|
||||||
"កម្ពុជា"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
# For development this compose file starts the database only. The app can then
|
# For development this compose file starts the database only. The app can then
|
||||||
# be started using `yarn run start-dev`, which is useful for development, because
|
# be started using `yarn start-dev`, which is useful for development, because
|
||||||
# it means the app Docker file doesn't have to be rebuilt on each change.
|
# it means the app Docker file doesn't have to be rebuilt on each change.
|
||||||
|
|
||||||
version: '3'
|
version: '3'
|
||||||
|
@@ -14,3 +14,22 @@ module.exports = () => {
|
|||||||
global.console = jestConsole;
|
global.console = jestConsole;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// jsdom extensions
|
||||||
|
if (typeof document !== 'undefined') {
|
||||||
|
// Prevents the CodeMirror error "getClientRects is undefined".
|
||||||
|
// See https://github.com/jsdom/jsdom/issues/3002#issue-652790925
|
||||||
|
document.createRange = () => {
|
||||||
|
const range = new Range();
|
||||||
|
range.getBoundingClientRect = jest.fn();
|
||||||
|
range.getClientRects = () => {
|
||||||
|
return {
|
||||||
|
length: 0,
|
||||||
|
item: () => null,
|
||||||
|
[Symbol.iterator]: jest.fn(),
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
return range;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
@@ -186,6 +186,8 @@
|
|||||||
"packages/doc-builder/help": true,
|
"packages/doc-builder/help": true,
|
||||||
"packages/doc-builder/news": true,
|
"packages/doc-builder/news": true,
|
||||||
"packages/doc-builder/i18n": true,
|
"packages/doc-builder/i18n": true,
|
||||||
|
"packages/doc-builder/.docusaurus": true,
|
||||||
|
"packages/doc-builder/static/images": true,
|
||||||
"readme/i18n": true,
|
"readme/i18n": true,
|
||||||
"packages/app-cli/**/*.*~": true,
|
"packages/app-cli/**/*.*~": true,
|
||||||
"packages/app-cli/**/*.mo": true,
|
"packages/app-cli/**/*.mo": true,
|
||||||
|
@@ -1,19 +1,27 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
// Don't compile when committing as it will process all TS files in the
|
// # About TypeScript compilation
|
||||||
// monorepo, which is too slow. Errors should be checked during development
|
//
|
||||||
// using `npm run watch`.
|
// Don't compile when committing as it will process all TS files in the monorepo, which is too
|
||||||
|
// slow. Errors should be checked during development using `yarn watch`.
|
||||||
//
|
//
|
||||||
// Or if we add this back, we could do something like this:
|
// Or if we add this back, we could do something like this:
|
||||||
// https://stackoverflow.com/a/44748041/561309
|
// https://stackoverflow.com/a/44748041/561309
|
||||||
//
|
//
|
||||||
// The script would check where the TS file is located, then use the right
|
// The script would check where the TS file is located, then use the right tsconfig.json file
|
||||||
// tsconfig.json file along with the tsconfig override.
|
// along with the tsconfig override.
|
||||||
//
|
//
|
||||||
// '**/*.ts?(x)': () => 'npm run tsc',
|
// # Running tasks in parallel
|
||||||
'*.{js,jsx,ts,tsx}': [
|
//
|
||||||
'yarn run checkIgnoredFiles',
|
// lint-staged does not allow running concurrent tasks for the same extension, because multiple
|
||||||
// 'yarn run checkLibPaths',
|
// tasks might modify the same files. This doesn't apply to us because only one task modifies
|
||||||
'yarn run packageJsonLint',
|
// files (the linter task) while others only notify about errors. So to go around this we add
|
||||||
'yarn run linter-precommit',
|
// this fake extension "task?" to make lint-staged think those are different extension tasks
|
||||||
],
|
// that can run in parallel.
|
||||||
|
//
|
||||||
|
// See https://github.com/lint-staged/lint-staged/issues/934#issuecomment-743299357
|
||||||
|
'*.{js,jsx,ts,tsx,task1}': 'yarn checkIgnoredFiles',
|
||||||
|
'*.{js,jsx,ts,tsx,task2}': 'yarn spellcheck',
|
||||||
|
'*.{js,jsx,ts,tsx,task3}': 'yarn packageJsonLint',
|
||||||
|
'*.{js,jsx,ts,tsx,task4}': 'yarn linter-precommit',
|
||||||
|
'*.{md,mdx}': 'yarn spellcheck',
|
||||||
};
|
};
|
||||||
|
26
package.json
@@ -13,14 +13,14 @@
|
|||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"buildApiDoc": "yarn workspace joplin start apidoc ../../readme/api/references/rest_api.md",
|
"buildApiDoc": "yarn workspace joplin start apidoc ../../readme/api/references/rest_api.md",
|
||||||
"buildCommandIndex": "node packages/tools/gulp/tasks/buildCommandIndexRun.js",
|
"buildScriptIndexes": "node packages/tools/gulp/tasks/buildScriptIndexesRun.js",
|
||||||
"buildParallel": "yarn workspaces foreach --verbose --interlaced --parallel --jobs 2 --topological run build && yarn run tsc",
|
"buildParallel": "yarn workspaces foreach --verbose --interlaced --parallel --jobs 2 --topological run build && yarn tsc",
|
||||||
"buildPluginDoc": "cd packages/generate-plugin-doc && yarn run buildPluginDoc_",
|
"buildPluginDoc": "cd packages/generate-plugin-doc && yarn buildPluginDoc_",
|
||||||
"buildSequential": "yarn workspaces foreach --verbose --interlaced --topological run build && yarn run tsc",
|
"buildSequential": "yarn workspaces foreach --verbose --interlaced --topological run build && yarn tsc",
|
||||||
"buildServerDocker": "node packages/tools/buildServerDocker.js",
|
"buildServerDocker": "node packages/tools/buildServerDocker.js",
|
||||||
"buildSettingJsonSchema": "yarn workspace joplin start settingschema ../../../joplin-website/docs/schema/settings.json",
|
"buildSettingJsonSchema": "yarn workspace joplin start settingschema ../../../joplin-website/docs/schema/settings.json",
|
||||||
"buildTranslations": "node packages/tools/build-translation.js",
|
"buildTranslations": "node packages/tools/build-translation.js",
|
||||||
"buildWebsite": "node ./packages/tools/website/processDocs.js --env prod && node ./packages/tools/website/build.js && yarn run buildPluginDoc && yarn run buildSettingJsonSchema",
|
"buildWebsite": "node ./packages/tools/website/processDocs.js --env prod && node ./packages/tools/website/build.js && yarn buildPluginDoc && yarn buildSettingJsonSchema",
|
||||||
"buildWebsiteTranslations": "node packages/tools/website/buildTranslations.js",
|
"buildWebsiteTranslations": "node packages/tools/website/buildTranslations.js",
|
||||||
"checkIgnoredFiles": "node ./packages/tools/checkIgnoredFiles.js",
|
"checkIgnoredFiles": "node ./packages/tools/checkIgnoredFiles.js",
|
||||||
"checkLibPaths": "node ./packages/tools/checkLibPaths.js",
|
"checkLibPaths": "node ./packages/tools/checkLibPaths.js",
|
||||||
@@ -29,7 +29,6 @@
|
|||||||
"crowdin": "crowdin",
|
"crowdin": "crowdin",
|
||||||
"crowdinDownload": "crowdin download",
|
"crowdinDownload": "crowdin download",
|
||||||
"crowdinUpload": "crowdin upload",
|
"crowdinUpload": "crowdin upload",
|
||||||
"cspell": "cspell",
|
|
||||||
"dependencyTree": "madge",
|
"dependencyTree": "madge",
|
||||||
"generateTypes": "node packages/tools/generate-database-types",
|
"generateTypes": "node packages/tools/generate-database-types",
|
||||||
"linkChecker": "linkchecker https://joplinapp.org/ && linkchecker --check-extern https://joplinapp.org/api/references/plugin_api/classes/joplin.html",
|
"linkChecker": "linkchecker https://joplinapp.org/ && linkchecker --check-extern https://joplinapp.org/api/references/plugin_api/classes/joplin.html",
|
||||||
@@ -40,7 +39,7 @@
|
|||||||
"packageJsonLint": "node ./packages/tools/packageJsonLint.js",
|
"packageJsonLint": "node ./packages/tools/packageJsonLint.js",
|
||||||
"postinstall": "gulp build",
|
"postinstall": "gulp build",
|
||||||
"postPreReleasesToForum": "node ./packages/tools/postPreReleasesToForum",
|
"postPreReleasesToForum": "node ./packages/tools/postPreReleasesToForum",
|
||||||
"publishAll": "git pull && yarn run buildParallel && lerna version --yes --no-private --no-git-tag-version && gulp completePublishAll",
|
"publishAll": "git pull && yarn buildParallel && lerna version --yes --no-private --no-git-tag-version && gulp completePublishAll",
|
||||||
"releaseAndroid": "PATH=\"/usr/local/opt/openjdk@11/bin:$PATH\" node packages/tools/release-android.js",
|
"releaseAndroid": "PATH=\"/usr/local/opt/openjdk@11/bin:$PATH\" node packages/tools/release-android.js",
|
||||||
"releaseAndroidClean": "node packages/tools/release-android.js",
|
"releaseAndroidClean": "node packages/tools/release-android.js",
|
||||||
"releaseCli": "node packages/tools/release-cli.js",
|
"releaseCli": "node packages/tools/release-cli.js",
|
||||||
@@ -65,7 +64,7 @@
|
|||||||
},
|
},
|
||||||
"husky": {
|
"husky": {
|
||||||
"hooks": {
|
"hooks": {
|
||||||
"pre-commit": "lint-staged"
|
"pre-commit": "yarn lint-staged"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@@ -82,12 +81,12 @@
|
|||||||
"eslint-plugin-promise": "6.1.1",
|
"eslint-plugin-promise": "6.1.1",
|
||||||
"eslint-plugin-react": "7.33.2",
|
"eslint-plugin-react": "7.33.2",
|
||||||
"execa": "5.1.1",
|
"execa": "5.1.1",
|
||||||
"fs-extra": "11.1.1",
|
"fs-extra": "11.2.0",
|
||||||
"glob": "10.3.10",
|
"glob": "10.3.10",
|
||||||
"gulp": "4.0.2",
|
"gulp": "4.0.2",
|
||||||
"husky": "3.1.0",
|
"husky": "3.1.0",
|
||||||
"lerna": "3.22.1",
|
"lerna": "3.22.1",
|
||||||
"lint-staged": "14.0.1",
|
"lint-staged": "15.2.0",
|
||||||
"madge": "6.1.0",
|
"madge": "6.1.0",
|
||||||
"npm-package-json-lint": "7.1.0",
|
"npm-package-json-lint": "7.1.0",
|
||||||
"typescript": "5.2.2"
|
"typescript": "5.2.2"
|
||||||
@@ -97,7 +96,7 @@
|
|||||||
"eslint-plugin-github": "4.10.1",
|
"eslint-plugin-github": "4.10.1",
|
||||||
"http-server": "14.1.1",
|
"http-server": "14.1.1",
|
||||||
"node-gyp": "9.4.1",
|
"node-gyp": "9.4.1",
|
||||||
"nodemon": "3.0.1"
|
"nodemon": "3.0.3"
|
||||||
},
|
},
|
||||||
"packageManager": "yarn@3.6.4",
|
"packageManager": "yarn@3.6.4",
|
||||||
"resolutions": {
|
"resolutions": {
|
||||||
@@ -107,6 +106,9 @@
|
|||||||
"app-builder-lib@24.4.0": "patch:app-builder-lib@npm%3A24.4.0#./.yarn/patches/app-builder-lib-npm-24.4.0-05322ff057.patch",
|
"app-builder-lib@24.4.0": "patch:app-builder-lib@npm%3A24.4.0#./.yarn/patches/app-builder-lib-npm-24.4.0-05322ff057.patch",
|
||||||
"react-native@0.71.10": "patch:react-native@npm%3A0.71.10#./.yarn/patches/react-native-animation-fix/react-native-npm-0.71.10-f9c32562d8.patch",
|
"react-native@0.71.10": "patch:react-native@npm%3A0.71.10#./.yarn/patches/react-native-animation-fix/react-native-npm-0.71.10-f9c32562d8.patch",
|
||||||
"nanoid": "patch:nanoid@npm%3A3.3.7#./.yarn/patches/nanoid-npm-3.3.7-98824ba130.patch",
|
"nanoid": "patch:nanoid@npm%3A3.3.7#./.yarn/patches/nanoid-npm-3.3.7-98824ba130.patch",
|
||||||
"pdfjs-dist": "patch:pdfjs-dist@npm%3A3.11.174#./.yarn/patches/pdfjs-dist-npm-3.11.174-67f2fee6d6.patch"
|
"pdfjs-dist": "patch:pdfjs-dist@npm%3A3.11.174#./.yarn/patches/pdfjs-dist-npm-3.11.174-67f2fee6d6.patch",
|
||||||
|
"@react-native-community/slider": "patch:@react-native-community/slider@npm%3A4.4.4#./.yarn/patches/@react-native-community-slider-npm-4.4.4-d78e472f48.patch",
|
||||||
|
"husky": "patch:husky@npm%3A3.1.0#./.yarn/patches/husky-npm-3.1.0-5cc13e4e34.patch",
|
||||||
|
"chokidar@^2.0.0": "3.5.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -41,6 +41,7 @@ class LinkSelector {
|
|||||||
const newLinkStore: LinkStoreEntry[] = [];
|
const newLinkStore: LinkStoreEntry[] = [];
|
||||||
const lines: string[] = renderedText.split('\n');
|
const lines: string[] = renderedText.split('\n');
|
||||||
for (let i = 0; i < lines.length; i++) {
|
for (let i = 0; i < lines.length; i++) {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
const r = (lines[i] as any).matchAll(this.linkRegex_);
|
const r = (lines[i] as any).matchAll(this.linkRegex_);
|
||||||
const matches = [...r];
|
const matches = [...r];
|
||||||
// eslint-disable-next-line github/array-foreach -- Old code before rule was applied
|
// eslint-disable-next-line github/array-foreach -- Old code before rule was applied
|
||||||
@@ -63,12 +64,14 @@ class LinkSelector {
|
|||||||
this.linkStore_ = this.findLinks(this.renderedText_);
|
this.linkStore_ = this.findLinks(this.renderedText_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public updateNote(textWidget: any): void {
|
public updateNote(textWidget: any): void {
|
||||||
this.noteId_ = textWidget.noteId;
|
this.noteId_ = textWidget.noteId;
|
||||||
this.scrollTop_ = textWidget.scrollTop_;
|
this.scrollTop_ = textWidget.scrollTop_;
|
||||||
this.updateText(textWidget.renderedText_);
|
this.updateText(textWidget.renderedText_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public scrollWidget(textWidget: any): void {
|
public scrollWidget(textWidget: any): void {
|
||||||
if (this.currentLinkIndex_ === null) return;
|
if (this.currentLinkIndex_ === null) return;
|
||||||
|
|
||||||
@@ -94,6 +97,7 @@ class LinkSelector {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public changeLink(textWidget: any, offset: number): void | null {
|
public changeLink(textWidget: any, offset: number): void | null {
|
||||||
if (textWidget.noteId !== this.noteId_) {
|
if (textWidget.noteId !== this.noteId_) {
|
||||||
this.updateNote(textWidget);
|
this.updateNote(textWidget);
|
||||||
@@ -124,6 +128,7 @@ class LinkSelector {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public openLink(textWidget: any): void {
|
public openLink(textWidget: any): void {
|
||||||
if (textWidget.noteId !== this.noteId_) return;
|
if (textWidget.noteId !== this.noteId_) return;
|
||||||
if (textWidget.renderedText_ !== this.renderedText_) return;
|
if (textWidget.renderedText_ !== this.renderedText_) return;
|
||||||
|
@@ -31,7 +31,7 @@ const WindowWidget = require('tkwidgets/WindowWidget.js');
|
|||||||
const NoteWidget = require('./gui/NoteWidget.js');
|
const NoteWidget = require('./gui/NoteWidget.js');
|
||||||
const ResourceServer = require('./ResourceServer.js');
|
const ResourceServer = require('./ResourceServer.js');
|
||||||
const NoteMetadataWidget = require('./gui/NoteMetadataWidget.js');
|
const NoteMetadataWidget = require('./gui/NoteMetadataWidget.js');
|
||||||
const FolderListWidget = require('./gui/FolderListWidget.js');
|
const FolderListWidget = require('./gui/FolderListWidget').default;
|
||||||
const NoteListWidget = require('./gui/NoteListWidget.js');
|
const NoteListWidget = require('./gui/NoteListWidget.js');
|
||||||
const StatusBarWidget = require('./gui/StatusBarWidget').default;
|
const StatusBarWidget = require('./gui/StatusBarWidget').default;
|
||||||
const ConsoleWidget = require('./gui/ConsoleWidget.js');
|
const ConsoleWidget = require('./gui/ConsoleWidget.js');
|
||||||
@@ -441,6 +441,7 @@ class AppGui {
|
|||||||
if (cmd === 'activate') {
|
if (cmd === 'activate') {
|
||||||
const w = this.widget('mainWindow').focusedWidget;
|
const w = this.widget('mainWindow').focusedWidget;
|
||||||
if (w.name === 'folderList') {
|
if (w.name === 'folderList') {
|
||||||
|
// eslint-disable-next-line no-restricted-properties
|
||||||
this.widget('noteList').focus();
|
this.widget('noteList').focus();
|
||||||
} else if (w.name === 'noteList' || w.name === 'noteText') {
|
} else if (w.name === 'noteList' || w.name === 'noteText') {
|
||||||
this.processPromptCommand('edit $n');
|
this.processPromptCommand('edit $n');
|
||||||
|
@@ -1,47 +1,48 @@
|
|||||||
const BaseApplication = require('@joplin/lib/BaseApplication').default;
|
import BaseApplication from '@joplin/lib/BaseApplication';
|
||||||
const { FoldersScreenUtils } = require('@joplin/lib/folders-screen-utils.js');
|
import { refreshFolders } from '@joplin/lib/folders-screen-utils.js';
|
||||||
const ResourceService = require('@joplin/lib/services/ResourceService').default;
|
import ResourceService from '@joplin/lib/services/ResourceService';
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
import BaseModel, { ModelType } from '@joplin/lib/BaseModel';
|
||||||
const Folder = require('@joplin/lib/models/Folder').default;
|
import Folder from '@joplin/lib/models/Folder';
|
||||||
const BaseItem = require('@joplin/lib/models/BaseItem').default;
|
import BaseItem from '@joplin/lib/models/BaseItem';
|
||||||
const Note = require('@joplin/lib/models/Note').default;
|
import Note from '@joplin/lib/models/Note';
|
||||||
const Tag = require('@joplin/lib/models/Tag').default;
|
import Tag from '@joplin/lib/models/Tag';
|
||||||
const Setting = require('@joplin/lib/models/Setting').default;
|
import Setting from '@joplin/lib/models/Setting';
|
||||||
const { reg } = require('@joplin/lib/registry.js');
|
import { reg } from '@joplin/lib/registry.js';
|
||||||
const { fileExtension } = require('@joplin/lib/path-utils');
|
import { fileExtension } from '@joplin/lib/path-utils';
|
||||||
const { splitCommandString } = require('@joplin/utils');
|
import { splitCommandString } from '@joplin/utils';
|
||||||
const { splitCommandBatch } = require('@joplin/lib/string-utils');
|
import { _ } from '@joplin/lib/locale';
|
||||||
const { _ } = require('@joplin/lib/locale');
|
import { pathExists, readFile, readdirSync } from 'fs-extra';
|
||||||
const fs = require('fs-extra');
|
import RevisionService from '@joplin/lib/services/RevisionService';
|
||||||
|
import shim from '@joplin/lib/shim';
|
||||||
|
import setupCommand from './setupCommand';
|
||||||
|
import { FolderEntity, NoteEntity } from '@joplin/lib/services/database/types';
|
||||||
const { cliUtils } = require('./cli-utils.js');
|
const { cliUtils } = require('./cli-utils.js');
|
||||||
const Cache = require('@joplin/lib/Cache');
|
const Cache = require('@joplin/lib/Cache');
|
||||||
const RevisionService = require('@joplin/lib/services/RevisionService').default;
|
const { splitCommandBatch } = require('@joplin/lib/string-utils');
|
||||||
const shim = require('@joplin/lib/shim').default;
|
|
||||||
const setupCommand = require('./setupCommand').default;
|
|
||||||
|
|
||||||
class Application extends BaseApplication {
|
class Application extends BaseApplication {
|
||||||
constructor() {
|
|
||||||
super();
|
|
||||||
|
|
||||||
this.showPromptString_ = true;
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
this.commands_ = {};
|
private commands_: Record<string, any> = {};
|
||||||
this.commandMetadata_ = null;
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
this.activeCommand_ = null;
|
private commandMetadata_: any = null;
|
||||||
this.allCommandsLoaded_ = false;
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
this.showStackTraces_ = false;
|
private activeCommand_: any = null;
|
||||||
this.gui_ = null;
|
private allCommandsLoaded_ = false;
|
||||||
this.cache_ = new Cache();
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
}
|
private gui_: any = null;
|
||||||
|
private cache_ = new Cache();
|
||||||
|
|
||||||
gui() {
|
public gui() {
|
||||||
return this.gui_;
|
return this.gui_;
|
||||||
}
|
}
|
||||||
|
|
||||||
commandStdoutMaxWidth() {
|
public commandStdoutMaxWidth() {
|
||||||
return this.gui().stdoutMaxWidth();
|
return this.gui().stdoutMaxWidth();
|
||||||
}
|
}
|
||||||
|
|
||||||
async guessTypeAndLoadItem(pattern, options = null) {
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
public async guessTypeAndLoadItem(pattern: string, options: any = null) {
|
||||||
let type = BaseModel.TYPE_NOTE;
|
let type = BaseModel.TYPE_NOTE;
|
||||||
if (pattern.indexOf('/') === 0) {
|
if (pattern.indexOf('/') === 0) {
|
||||||
type = BaseModel.TYPE_FOLDER;
|
type = BaseModel.TYPE_FOLDER;
|
||||||
@@ -50,7 +51,8 @@ class Application extends BaseApplication {
|
|||||||
return this.loadItem(type, pattern, options);
|
return this.loadItem(type, pattern, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
async loadItem(type, pattern, options = null) {
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
public async loadItem(type: ModelType | 'folderOrNote', pattern: string, options: any = null) {
|
||||||
const output = await this.loadItems(type, pattern, options);
|
const output = await this.loadItems(type, pattern, options);
|
||||||
|
|
||||||
if (output.length > 1) {
|
if (output.length > 1) {
|
||||||
@@ -74,9 +76,10 @@ class Application extends BaseApplication {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async loadItems(type, pattern, options = null) {
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
public async loadItems(type: ModelType | 'folderOrNote', pattern: string, options: any = null): Promise<(FolderEntity | NoteEntity)[]> {
|
||||||
if (type === 'folderOrNote') {
|
if (type === 'folderOrNote') {
|
||||||
const folders = await this.loadItems(BaseModel.TYPE_FOLDER, pattern, options);
|
const folders: FolderEntity[] = await this.loadItems(BaseModel.TYPE_FOLDER, pattern, options);
|
||||||
if (folders.length) return folders;
|
if (folders.length) return folders;
|
||||||
return await this.loadItems(BaseModel.TYPE_NOTE, pattern, options);
|
return await this.loadItems(BaseModel.TYPE_NOTE, pattern, options);
|
||||||
}
|
}
|
||||||
@@ -99,7 +102,7 @@ class Application extends BaseApplication {
|
|||||||
let item = null;
|
let item = null;
|
||||||
if (type === BaseModel.TYPE_NOTE) {
|
if (type === BaseModel.TYPE_NOTE) {
|
||||||
if (!parent) throw new Error(_('No notebook has been specified.'));
|
if (!parent) throw new Error(_('No notebook has been specified.'));
|
||||||
item = await ItemClass.loadFolderNoteByField(parent.id, 'title', pattern);
|
item = await (ItemClass as typeof Note).loadFolderNoteByField(parent.id, 'title', pattern);
|
||||||
} else {
|
} else {
|
||||||
item = await ItemClass.loadByTitle(pattern);
|
item = await ItemClass.loadByTitle(pattern);
|
||||||
}
|
}
|
||||||
@@ -116,15 +119,15 @@ class Application extends BaseApplication {
|
|||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
setupCommand(cmd) {
|
public setupCommand(cmd: string) {
|
||||||
return setupCommand(cmd, t => this.stdout(t), () => this.store(), () => this.gui());
|
return setupCommand(cmd, (t: string) => this.stdout(t), () => this.store(), () => this.gui());
|
||||||
}
|
}
|
||||||
|
|
||||||
stdout(text) {
|
public stdout(text: string) {
|
||||||
return this.gui().stdout(text);
|
return this.gui().stdout(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
async exit(code = 0) {
|
public async exit(code = 0) {
|
||||||
const doExit = async () => {
|
const doExit = async () => {
|
||||||
this.gui().exit();
|
this.gui().exit();
|
||||||
await super.exit(code);
|
await super.exit(code);
|
||||||
@@ -144,10 +147,10 @@ class Application extends BaseApplication {
|
|||||||
await doExit();
|
await doExit();
|
||||||
}
|
}
|
||||||
|
|
||||||
commands(uiType = null) {
|
public commands(uiType: string = null) {
|
||||||
if (!this.allCommandsLoaded_) {
|
if (!this.allCommandsLoaded_) {
|
||||||
// eslint-disable-next-line github/array-foreach -- Old code before rule was applied
|
// eslint-disable-next-line github/array-foreach -- Old code before rule was applied
|
||||||
fs.readdirSync(__dirname).forEach(path => {
|
readdirSync(__dirname).forEach(path => {
|
||||||
if (path.indexOf('command-') !== 0) return;
|
if (path.indexOf('command-') !== 0) return;
|
||||||
if (path.endsWith('.test.js')) return;
|
if (path.endsWith('.test.js')) return;
|
||||||
const ext = fileExtension(path);
|
const ext = fileExtension(path);
|
||||||
@@ -164,7 +167,8 @@ class Application extends BaseApplication {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (uiType !== null) {
|
if (uiType !== null) {
|
||||||
const temp = [];
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
const temp: Record<string, any> = {};
|
||||||
for (const n in this.commands_) {
|
for (const n in this.commands_) {
|
||||||
if (!this.commands_.hasOwnProperty(n)) continue;
|
if (!this.commands_.hasOwnProperty(n)) continue;
|
||||||
const c = this.commands_[n];
|
const c = this.commands_[n];
|
||||||
@@ -177,7 +181,7 @@ class Application extends BaseApplication {
|
|||||||
return this.commands_;
|
return this.commands_;
|
||||||
}
|
}
|
||||||
|
|
||||||
async commandNames() {
|
public async commandNames() {
|
||||||
const metadata = await this.commandMetadata();
|
const metadata = await this.commandMetadata();
|
||||||
const output = [];
|
const output = [];
|
||||||
for (const n in metadata) {
|
for (const n in metadata) {
|
||||||
@@ -187,7 +191,7 @@ class Application extends BaseApplication {
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
async commandMetadata() {
|
public async commandMetadata() {
|
||||||
if (this.commandMetadata_) return this.commandMetadata_;
|
if (this.commandMetadata_) return this.commandMetadata_;
|
||||||
|
|
||||||
let output = await this.cache_.getItem('metadata');
|
let output = await this.cache_.getItem('metadata');
|
||||||
@@ -211,11 +215,11 @@ class Application extends BaseApplication {
|
|||||||
return { ...this.commandMetadata_ };
|
return { ...this.commandMetadata_ };
|
||||||
}
|
}
|
||||||
|
|
||||||
hasGui() {
|
public hasGui() {
|
||||||
return this.gui() && !this.gui().isDummy();
|
return this.gui() && !this.gui().isDummy();
|
||||||
}
|
}
|
||||||
|
|
||||||
findCommandByName(name) {
|
public findCommandByName(name: string) {
|
||||||
if (this.commands_[name]) return this.commands_[name];
|
if (this.commands_[name]) return this.commands_[name];
|
||||||
|
|
||||||
let CommandClass = null;
|
let CommandClass = null;
|
||||||
@@ -223,7 +227,8 @@ class Application extends BaseApplication {
|
|||||||
CommandClass = require(`${__dirname}/command-${name}.js`);
|
CommandClass = require(`${__dirname}/command-${name}.js`);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
if (error.message && error.message.indexOf('Cannot find module') >= 0) {
|
if (error.message && error.message.indexOf('Cannot find module') >= 0) {
|
||||||
const e = new Error(_('No such command: %s', name));
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
const e: any = new Error(_('No such command: %s', name));
|
||||||
e.type = 'notFound';
|
e.type = 'notFound';
|
||||||
throw e;
|
throw e;
|
||||||
} else {
|
} else {
|
||||||
@@ -237,17 +242,18 @@ class Application extends BaseApplication {
|
|||||||
return this.commands_[name];
|
return this.commands_[name];
|
||||||
}
|
}
|
||||||
|
|
||||||
dummyGui() {
|
public dummyGui() {
|
||||||
return {
|
return {
|
||||||
isDummy: () => {
|
isDummy: () => {
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
prompt: (initialText = '', promptString = '', options = null) => {
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
prompt: (initialText = '', promptString = '', options: any = null) => {
|
||||||
return cliUtils.prompt(initialText, promptString, options);
|
return cliUtils.prompt(initialText, promptString, options);
|
||||||
},
|
},
|
||||||
showConsole: () => {},
|
showConsole: () => {},
|
||||||
maximizeConsole: () => {},
|
maximizeConsole: () => {},
|
||||||
stdout: text => {
|
stdout: (text: string) => {
|
||||||
// eslint-disable-next-line no-console
|
// eslint-disable-next-line no-console
|
||||||
console.info(text);
|
console.info(text);
|
||||||
},
|
},
|
||||||
@@ -264,7 +270,8 @@ class Application extends BaseApplication {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
async execCommand(argv) {
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
public async execCommand(argv: string[]): Promise<any> {
|
||||||
if (!argv.length) return this.execCommand(['help']);
|
if (!argv.length) return this.execCommand(['help']);
|
||||||
// reg.logger().debug('execCommand()', argv);
|
// reg.logger().debug('execCommand()', argv);
|
||||||
const commandName = argv[0];
|
const commandName = argv[0];
|
||||||
@@ -282,12 +289,19 @@ class Application extends BaseApplication {
|
|||||||
if (outException) throw outException;
|
if (outException) throw outException;
|
||||||
}
|
}
|
||||||
|
|
||||||
currentCommand() {
|
public currentCommand() {
|
||||||
return this.activeCommand_;
|
return this.activeCommand_;
|
||||||
}
|
}
|
||||||
|
|
||||||
async loadKeymaps() {
|
public async loadKeymaps() {
|
||||||
const defaultKeyMap = [
|
interface KeyMapItem {
|
||||||
|
keys: string[];
|
||||||
|
type: 'function' | 'prompt';
|
||||||
|
command: string;
|
||||||
|
cursorPosition?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
const defaultKeyMap: KeyMapItem[] = [
|
||||||
{ keys: [':'], type: 'function', command: 'enter_command_line_mode' },
|
{ keys: [':'], type: 'function', command: 'enter_command_line_mode' },
|
||||||
{ keys: ['TAB'], type: 'function', command: 'focus_next' },
|
{ keys: ['TAB'], type: 'function', command: 'focus_next' },
|
||||||
{ keys: ['SHIFT_TAB'], type: 'function', command: 'focus_previous' },
|
{ keys: ['SHIFT_TAB'], type: 'function', command: 'focus_previous' },
|
||||||
@@ -300,10 +314,11 @@ class Application extends BaseApplication {
|
|||||||
{ keys: ['n'], type: 'function', command: 'next_link' },
|
{ keys: ['n'], type: 'function', command: 'next_link' },
|
||||||
{ keys: ['b'], type: 'function', command: 'previous_link' },
|
{ keys: ['b'], type: 'function', command: 'previous_link' },
|
||||||
{ keys: ['o'], type: 'function', command: 'open_link' },
|
{ keys: ['o'], type: 'function', command: 'open_link' },
|
||||||
{ keys: [' '], command: 'todo toggle $n' },
|
{ keys: [' '], type: 'prompt', command: 'todo toggle $n' },
|
||||||
{ keys: ['tc'], type: 'function', command: 'toggle_console' },
|
{ keys: ['tc'], type: 'function', command: 'toggle_console' },
|
||||||
{ keys: ['tm'], type: 'function', command: 'toggle_metadata' },
|
{ keys: ['tm'], type: 'function', command: 'toggle_metadata' },
|
||||||
{ keys: ['ti'], type: 'function', command: 'toggle_ids' },
|
{ keys: ['ti'], type: 'function', command: 'toggle_ids' },
|
||||||
|
{ keys: ['r'], type: 'prompt', command: 'restore $n' },
|
||||||
{ keys: ['/'], type: 'prompt', command: 'search ""', cursorPosition: -2 },
|
{ keys: ['/'], type: 'prompt', command: 'search ""', cursorPosition: -2 },
|
||||||
{ keys: ['mn'], type: 'prompt', command: 'mknote ""', cursorPosition: -2 },
|
{ keys: ['mn'], type: 'prompt', command: 'mknote ""', cursorPosition: -2 },
|
||||||
{ keys: ['mt'], type: 'prompt', command: 'mktodo ""', cursorPosition: -2 },
|
{ keys: ['mt'], type: 'prompt', command: 'mktodo ""', cursorPosition: -2 },
|
||||||
@@ -314,16 +329,16 @@ class Application extends BaseApplication {
|
|||||||
|
|
||||||
// Filter the keymap item by command so that items in keymap.json can override
|
// Filter the keymap item by command so that items in keymap.json can override
|
||||||
// the default ones.
|
// the default ones.
|
||||||
const itemsByCommand = {};
|
const itemsByCommand: Record<string, KeyMapItem> = {};
|
||||||
|
|
||||||
for (let i = 0; i < defaultKeyMap.length; i++) {
|
for (let i = 0; i < defaultKeyMap.length; i++) {
|
||||||
itemsByCommand[defaultKeyMap[i].command] = defaultKeyMap[i];
|
itemsByCommand[defaultKeyMap[i].command] = defaultKeyMap[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
const filePath = `${Setting.value('profileDir')}/keymap.json`;
|
const filePath = `${Setting.value('profileDir')}/keymap.json`;
|
||||||
if (await fs.pathExists(filePath)) {
|
if (await pathExists(filePath)) {
|
||||||
try {
|
try {
|
||||||
let configString = await fs.readFile(filePath, 'utf-8');
|
let configString = await readFile(filePath, 'utf-8');
|
||||||
configString = configString.replace(/^\s*\/\/.*/, ''); // Strip off comments
|
configString = configString.replace(/^\s*\/\/.*/, ''); // Strip off comments
|
||||||
const keymap = JSON.parse(configString);
|
const keymap = JSON.parse(configString);
|
||||||
for (let keymapIndex = 0; keymapIndex < keymap.length; keymapIndex++) {
|
for (let keymapIndex = 0; keymapIndex < keymap.length; keymapIndex++) {
|
||||||
@@ -359,10 +374,10 @@ class Application extends BaseApplication {
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
async commandList(argv) {
|
public async commandList(argv: string[]) {
|
||||||
if (argv.length && argv[0] === 'batch') {
|
if (argv.length && argv[0] === 'batch') {
|
||||||
const commands = [];
|
const commands = [];
|
||||||
const commandLines = splitCommandBatch(await fs.readFile(argv[1], 'utf-8'));
|
const commandLines = splitCommandBatch(await readFile(argv[1], 'utf-8'));
|
||||||
|
|
||||||
for (const commandLine of commandLines) {
|
for (const commandLine of commandLines) {
|
||||||
if (!commandLine.trim()) continue;
|
if (!commandLine.trim()) continue;
|
||||||
@@ -377,16 +392,17 @@ class Application extends BaseApplication {
|
|||||||
|
|
||||||
// We need this special case here because by the time the `version` command
|
// We need this special case here because by the time the `version` command
|
||||||
// runs, the keychain has already been setup.
|
// runs, the keychain has already been setup.
|
||||||
checkIfKeychainEnabled(argv) {
|
public checkIfKeychainEnabled(argv: string[]) {
|
||||||
return argv.indexOf('version') < 0;
|
return argv.indexOf('version') < 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
async start(argv) {
|
public async start(argv: string[]) {
|
||||||
const keychainEnabled = this.checkIfKeychainEnabled(argv);
|
const keychainEnabled = this.checkIfKeychainEnabled(argv);
|
||||||
|
|
||||||
argv = await super.start(argv, { keychainEnabled });
|
argv = await super.start(argv, { keychainEnabled });
|
||||||
|
|
||||||
cliUtils.setStdout(object => {
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
cliUtils.setStdout((object: any) => {
|
||||||
return this.stdout(object);
|
return this.stdout(object);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -435,7 +451,8 @@ class Application extends BaseApplication {
|
|||||||
// initialised. So we manually call dispatchUpdateAll() to force an update.
|
// initialised. So we manually call dispatchUpdateAll() to force an update.
|
||||||
Setting.dispatchUpdateAll();
|
Setting.dispatchUpdateAll();
|
||||||
|
|
||||||
await FoldersScreenUtils.refreshFolders();
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
await refreshFolders((action: any) => this.store().dispatch(action));
|
||||||
|
|
||||||
const tags = await Tag.allWithNotes();
|
const tags = await Tag.allWithNotes();
|
||||||
|
|
||||||
@@ -458,7 +475,7 @@ class Application extends BaseApplication {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let application_ = null;
|
let application_: Application = null;
|
||||||
|
|
||||||
function app() {
|
function app() {
|
||||||
if (application_) return application_;
|
if (application_) return application_;
|
||||||
@@ -466,4 +483,4 @@ function app() {
|
|||||||
return application_;
|
return application_;
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = { app };
|
export default app;
|
@@ -1,4 +1,4 @@
|
|||||||
const { app } = require('./app.js');
|
const app = require('./app').default;
|
||||||
const Note = require('@joplin/lib/models/Note').default;
|
const Note = require('@joplin/lib/models/Note').default;
|
||||||
const Folder = require('@joplin/lib/models/Folder').default;
|
const Folder = require('@joplin/lib/models/Folder').default;
|
||||||
const Tag = require('@joplin/lib/models/Tag').default;
|
const Tag = require('@joplin/lib/models/Tag').default;
|
||||||
|
@@ -3,14 +3,18 @@ import { reg } from '@joplin/lib/registry.js';
|
|||||||
|
|
||||||
export default class BaseCommand {
|
export default class BaseCommand {
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
protected stdout_: any = null;
|
protected stdout_: any = null;
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
protected prompt_: any = null;
|
protected prompt_: any = null;
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
protected dispatcher_: any;
|
protected dispatcher_: any;
|
||||||
|
|
||||||
public usage(): string {
|
public usage(): string {
|
||||||
throw new Error('Usage not defined');
|
throw new Error('Usage not defined');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public encryptionCheck(item: any) {
|
public encryptionCheck(item: any) {
|
||||||
if (item && item.encryption_applied) throw new Error(_('Cannot change encrypted item'));
|
if (item && item.encryption_applied) throw new Error(_('Cannot change encrypted item'));
|
||||||
}
|
}
|
||||||
@@ -19,6 +23,7 @@ export default class BaseCommand {
|
|||||||
throw new Error('Description not defined');
|
throw new Error('Description not defined');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public async action(_args: any) {
|
public async action(_args: any) {
|
||||||
throw new Error('Action not defined');
|
throw new Error('Action not defined');
|
||||||
}
|
}
|
||||||
@@ -31,6 +36,7 @@ export default class BaseCommand {
|
|||||||
return this.compatibleUis().indexOf(ui) >= 0;
|
return this.compatibleUis().indexOf(ui) >= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public options(): any[] {
|
public options(): any[] {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
@@ -59,6 +65,7 @@ export default class BaseCommand {
|
|||||||
this.dispatcher_ = fn;
|
this.dispatcher_ = fn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public dispatch(action: any) {
|
public dispatch(action: any) {
|
||||||
if (!this.dispatcher_) throw new Error('Dispatcher not defined');
|
if (!this.dispatcher_) throw new Error('Dispatcher not defined');
|
||||||
return this.dispatcher_(action);
|
return this.dispatcher_(action);
|
||||||
@@ -78,6 +85,7 @@ export default class BaseCommand {
|
|||||||
this.prompt_ = fn;
|
this.prompt_ = fn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public async prompt(message: string, options: any = null) {
|
public async prompt(message: string, options: any = null) {
|
||||||
if (!this.prompt_) throw new Error('Prompt is undefined');
|
if (!this.prompt_) throw new Error('Prompt is undefined');
|
||||||
return await this.prompt_(message, options);
|
return await this.prompt_(message, options);
|
||||||
|
@@ -1,33 +1,34 @@
|
|||||||
const BaseCommand = require('./base-command').default;
|
import BaseCommand from './base-command';
|
||||||
const BaseItem = require('@joplin/lib/models/BaseItem').default;
|
import BaseItem from '@joplin/lib/models/BaseItem';
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
import BaseModel from '@joplin/lib/BaseModel';
|
||||||
const { toTitleCase } = require('@joplin/lib/string-utils.js');
|
const { toTitleCase } = require('@joplin/lib/string-utils.js');
|
||||||
const { reg } = require('@joplin/lib/registry.js');
|
import { reg } from '@joplin/lib/registry.js';
|
||||||
const markdownUtils = require('@joplin/lib/markdownUtils').default;
|
import markdownUtils, { MarkdownTableRow } from '@joplin/lib/markdownUtils';
|
||||||
const Database = require('@joplin/lib/database').default;
|
import Database from '@joplin/lib/database';
|
||||||
const shim = require('@joplin/lib/shim').default;
|
import shim from '@joplin/lib/shim';
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
usage() {
|
public override usage() {
|
||||||
return 'apidoc <file>';
|
return 'apidoc <file>';
|
||||||
}
|
}
|
||||||
|
|
||||||
description() {
|
public override description() {
|
||||||
return 'Build the API doc';
|
return 'Build the API doc';
|
||||||
}
|
}
|
||||||
|
|
||||||
enabled() {
|
public override enabled() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
createPropertiesTable(tableFields) {
|
private createPropertiesTable(tableFields: MarkdownTableRow[]) {
|
||||||
const headers = [
|
const headers = [
|
||||||
{ name: 'name', label: 'Name' },
|
{ name: 'name', label: 'Name' },
|
||||||
{
|
{
|
||||||
name: 'type',
|
name: 'type',
|
||||||
label: 'Type',
|
label: 'Type',
|
||||||
filter: value => {
|
filter: (value: string|number) => {
|
||||||
return Database.enumName('fieldType', value);
|
const valueAsNumber = typeof value === 'number' ? value : parseInt(value, 10);
|
||||||
|
return Database.enumName('fieldType', valueAsNumber);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{ name: 'description', label: 'Description' },
|
{ name: 'description', label: 'Description' },
|
||||||
@@ -36,7 +37,8 @@ class Command extends BaseCommand {
|
|||||||
return markdownUtils.createMarkdownTable(headers, tableFields);
|
return markdownUtils.createMarkdownTable(headers, tableFields);
|
||||||
}
|
}
|
||||||
|
|
||||||
async action(args) {
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
public override async action(args: any) {
|
||||||
const models = [
|
const models = [
|
||||||
{
|
{
|
||||||
type: BaseModel.TYPE_NOTE,
|
type: BaseModel.TYPE_NOTE,
|
||||||
@@ -81,7 +83,7 @@ class Command extends BaseCommand {
|
|||||||
|
|
||||||
lines.push('## Authorisation');
|
lines.push('## Authorisation');
|
||||||
lines.push('');
|
lines.push('');
|
||||||
lines.push('To prevent unauthorised applications from accessing the API, the calls must be authentified. To do so, you must provide a token as a query parameter for each API call. You can get this token from the Joplin desktop application, on the Web Clipper Options screen.');
|
lines.push('To prevent unauthorised applications from accessing the API, the calls must be authenticated. To do so, you must provide a token as a query parameter for each API call. You can get this token from the Joplin desktop application, on the Web Clipper Options screen.');
|
||||||
lines.push('');
|
lines.push('');
|
||||||
lines.push('This would be an example of valid cURL call using a token:');
|
lines.push('This would be an example of valid cURL call using a token:');
|
||||||
lines.push('');
|
lines.push('');
|
||||||
@@ -148,7 +150,7 @@ class Command extends BaseCommand {
|
|||||||
lines.push('');
|
lines.push('');
|
||||||
lines.push('```shell\ncurl http://localhost:41184/notes?order_by=updated_time&order_dir=ASC&limit=10&page=2\n```');
|
lines.push('```shell\ncurl http://localhost:41184/notes?order_by=updated_time&order_dir=ASC&limit=10&page=2\n```');
|
||||||
lines.push('');
|
lines.push('');
|
||||||
lines.push('Eventually you will get some results that do not contain an "has_more" paramater, at which point you will have retrieved all the results');
|
lines.push('Eventually you will get some results that do not contain an "has_more" parameter, at which point you will have retrieved all the results');
|
||||||
lines.push('');
|
lines.push('');
|
||||||
lines.push('As an example the pseudo-code below could be used to fetch all the notes:');
|
lines.push('As an example the pseudo-code below could be used to fetch all the notes:');
|
||||||
lines.push('');
|
lines.push('');
|
||||||
@@ -198,7 +200,7 @@ async function fetchAllNotes() {
|
|||||||
|
|
||||||
lines.push('## Item type IDs');
|
lines.push('## Item type IDs');
|
||||||
lines.push('');
|
lines.push('');
|
||||||
lines.push('Item type IDs might be refered to in certain object you will retrieve from the API. This is the correspondance between name and ID:');
|
lines.push('Item type IDs might be referred to in certain objects you will retrieve from the API. This is the correspondence between name and ID:');
|
||||||
lines.push('');
|
lines.push('');
|
||||||
lines.push('Name | Value');
|
lines.push('Name | Value');
|
||||||
lines.push('---- | -----');
|
lines.push('---- | -----');
|
||||||
@@ -399,6 +401,11 @@ async function fetchAllNotes() {
|
|||||||
lines.push('Remove the tag from the note.');
|
lines.push('Remove the tag from the note.');
|
||||||
lines.push('');
|
lines.push('');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (model.type === BaseModel.TYPE_NOTE || model.type === BaseModel.TYPE_FOLDER) {
|
||||||
|
lines.push(`By default, the ${singular} will be moved **to the trash**. To permanently delete it, add the query parameter \`permanent=1\``);
|
||||||
|
lines.push('');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
@@ -1,19 +1,20 @@
|
|||||||
const BaseCommand = require('./base-command').default;
|
import BaseCommand from './base-command';
|
||||||
const { app } = require('./app.js');
|
import app from './app';
|
||||||
const { _ } = require('@joplin/lib/locale');
|
import { _ } from '@joplin/lib/locale';
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
import BaseModel from '@joplin/lib/BaseModel';
|
||||||
const shim = require('@joplin/lib/shim').default;
|
import shim from '@joplin/lib/shim';
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
usage() {
|
public override usage() {
|
||||||
return 'attach <note> <file>';
|
return 'attach <note> <file>';
|
||||||
}
|
}
|
||||||
|
|
||||||
description() {
|
public override description() {
|
||||||
return _('Attaches the given file to the note.');
|
return _('Attaches the given file to the note.');
|
||||||
}
|
}
|
||||||
|
|
||||||
async action(args) {
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
public override async action(args: any) {
|
||||||
const title = args['note'];
|
const title = args['note'];
|
||||||
|
|
||||||
const note = await app().loadItem(BaseModel.TYPE_NOTE, title, { parent: app().currentFolder() });
|
const note = await app().loadItem(BaseModel.TYPE_NOTE, title, { parent: app().currentFolder() });
|
@@ -1,24 +1,25 @@
|
|||||||
const BaseCommand = require('./base-command').default;
|
import BaseCommand from './base-command';
|
||||||
const { app } = require('./app.js');
|
import app from './app';
|
||||||
const { _ } = require('@joplin/lib/locale');
|
import { _ } from '@joplin/lib/locale';
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
import BaseModel from '@joplin/lib/BaseModel';
|
||||||
const BaseItem = require('@joplin/lib/models/BaseItem').default;
|
import BaseItem from '@joplin/lib/models/BaseItem';
|
||||||
const Note = require('@joplin/lib/models/Note').default;
|
import Note from '@joplin/lib/models/Note';
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
usage() {
|
public override usage() {
|
||||||
return 'cat <note>';
|
return 'cat <note>';
|
||||||
}
|
}
|
||||||
|
|
||||||
description() {
|
public override description() {
|
||||||
return _('Displays the given note.');
|
return _('Displays the given note.');
|
||||||
}
|
}
|
||||||
|
|
||||||
options() {
|
public override options() {
|
||||||
return [['-v, --verbose', _('Displays the complete information about note.')]];
|
return [['-v, --verbose', _('Displays the complete information about note.')]];
|
||||||
}
|
}
|
||||||
|
|
||||||
async action(args) {
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
public override async action(args: any) {
|
||||||
const title = args['note'];
|
const title = args['note'];
|
||||||
|
|
||||||
const item = await app().loadItem(BaseModel.TYPE_NOTE, title, { parent: app().currentFolder() });
|
const item = await app().loadItem(BaseModel.TYPE_NOTE, title, { parent: app().currentFolder() });
|
@@ -1,19 +1,20 @@
|
|||||||
const BaseCommand = require('./base-command').default;
|
import BaseCommand from './base-command';
|
||||||
const { _, setLocale } = require('@joplin/lib/locale');
|
import { _, setLocale } from '@joplin/lib/locale';
|
||||||
const { app } = require('./app.js');
|
import app from './app';
|
||||||
const fs = require('fs-extra');
|
import * as fs from 'fs-extra';
|
||||||
const Setting = require('@joplin/lib/models/Setting').default;
|
import Setting, { AppType } from '@joplin/lib/models/Setting';
|
||||||
|
import { ReadStream } from 'tty';
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
usage() {
|
public override usage() {
|
||||||
return 'config [name] [value]';
|
return 'config [name] [value]';
|
||||||
}
|
}
|
||||||
|
|
||||||
description() {
|
public override description() {
|
||||||
return _('Gets or sets a config value. If [value] is not provided, it will show the value of [name]. If neither [name] nor [value] is provided, it will list the current configuration.');
|
return _('Gets or sets a config value. If [value] is not provided, it will show the value of [name]. If neither [name] nor [value] is provided, it will list the current configuration.');
|
||||||
}
|
}
|
||||||
|
|
||||||
options() {
|
public override options() {
|
||||||
return [
|
return [
|
||||||
['-v, --verbose', _('Also displays unset and hidden config variables.')],
|
['-v, --verbose', _('Also displays unset and hidden config variables.')],
|
||||||
['--export', 'Writes all settings to STDOUT as JSON including secure variables.'],
|
['--export', 'Writes all settings to STDOUT as JSON including secure variables.'],
|
||||||
@@ -21,11 +22,13 @@ class Command extends BaseCommand {
|
|||||||
['--import-file <file>', 'Reads in settings from <file>. <file> must contain valid JSON.'],
|
['--import-file <file>', 'Reads in settings from <file>. <file> must contain valid JSON.'],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
async __importSettings(inputStream) {
|
|
||||||
return new Promise((resolve, reject) => {
|
private async __importSettings(inputStream: ReadStream|fs.ReadStream) {
|
||||||
|
return new Promise<void>((resolve, reject) => {
|
||||||
// being defensive and not attempting to settle twice
|
// being defensive and not attempting to settle twice
|
||||||
let isSettled = false;
|
let isSettled = false;
|
||||||
const chunks = [];
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
const chunks: any = [];
|
||||||
|
|
||||||
inputStream.on('readable', () => {
|
inputStream.on('readable', () => {
|
||||||
let chunk;
|
let chunk;
|
||||||
@@ -64,13 +67,15 @@ class Command extends BaseCommand {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
async action(args) {
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
public override async action(args: any) {
|
||||||
const verbose = args.options.verbose;
|
const verbose = args.options.verbose;
|
||||||
const isExport = args.options.export;
|
const isExport = args.options.export;
|
||||||
const isImport = args.options.import || args.options.importFile;
|
const isImport = args.options.import || args.options.importFile;
|
||||||
const importFile = args.options.importFile;
|
const importFile = args.options.importFile;
|
||||||
|
|
||||||
const renderKeyValue = name => {
|
const renderKeyValue = (name: string) => {
|
||||||
const md = Setting.settingMetadata(name);
|
const md = Setting.settingMetadata(name);
|
||||||
let value = Setting.value(name);
|
let value = Setting.value(name);
|
||||||
if (typeof value === 'object' || Array.isArray(value)) value = JSON.stringify(value);
|
if (typeof value === 'object' || Array.isArray(value)) value = JSON.stringify(value);
|
||||||
@@ -84,11 +89,12 @@ class Command extends BaseCommand {
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (isExport || (!isImport && !args.value)) {
|
if (isExport || (!isImport && !args.value)) {
|
||||||
const keys = Setting.keys(!verbose, 'cli');
|
const keys = Setting.keys(!verbose, AppType.Cli);
|
||||||
keys.sort();
|
keys.sort();
|
||||||
|
|
||||||
if (isExport) {
|
if (isExport) {
|
||||||
const resultObj = keys.reduce((acc, key) => {
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
const resultObj = keys.reduce<Record<string, any>>((acc, key) => {
|
||||||
const value = Setting.value(key);
|
const value = Setting.value(key);
|
||||||
if (!verbose && !value) return acc;
|
if (!verbose && !value) return acc;
|
||||||
acc[key] = value;
|
acc[key] = value;
|
||||||
@@ -113,7 +119,7 @@ class Command extends BaseCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (isImport) {
|
if (isImport) {
|
||||||
let fileStream = process.stdin;
|
let fileStream: ReadStream|fs.ReadStream = process.stdin;
|
||||||
if (importFile) {
|
if (importFile) {
|
||||||
fileStream = fs.createReadStream(importFile, { autoClose: true });
|
fileStream = fs.createReadStream(importFile, { autoClose: true });
|
||||||
}
|
}
|
@@ -1,19 +1,20 @@
|
|||||||
const BaseCommand = require('./base-command').default;
|
import BaseCommand from './base-command';
|
||||||
const { app } = require('./app.js');
|
import app from './app';
|
||||||
const { _ } = require('@joplin/lib/locale');
|
import { _ } from '@joplin/lib/locale';
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
import BaseModel from '@joplin/lib/BaseModel';
|
||||||
const Note = require('@joplin/lib/models/Note').default;
|
import Note from '@joplin/lib/models/Note';
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
usage() {
|
public override usage() {
|
||||||
return 'cp <note> [notebook]';
|
return 'cp <note> [notebook]';
|
||||||
}
|
}
|
||||||
|
|
||||||
description() {
|
public override description() {
|
||||||
return _('Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.');
|
return _('Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.');
|
||||||
}
|
}
|
||||||
|
|
||||||
async action(args) {
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
public override async action(args: any) {
|
||||||
let folder = null;
|
let folder = null;
|
||||||
if (args['notebook']) {
|
if (args['notebook']) {
|
||||||
folder = await app().loadItem(BaseModel.TYPE_FOLDER, args['notebook']);
|
folder = await app().loadItem(BaseModel.TYPE_FOLDER, args['notebook']);
|
||||||
@@ -28,7 +29,7 @@ class Command extends BaseCommand {
|
|||||||
|
|
||||||
for (let i = 0; i < notes.length; i++) {
|
for (let i = 0; i < notes.length; i++) {
|
||||||
const newNote = await Note.copyToFolder(notes[i].id, folder.id);
|
const newNote = await Note.copyToFolder(notes[i].id, folder.id);
|
||||||
Note.updateGeolocation(newNote.id);
|
void Note.updateGeolocation(newNote.id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -1,38 +0,0 @@
|
|||||||
const BaseCommand = require('./base-command').default;
|
|
||||||
const { app } = require('./app.js');
|
|
||||||
const { _ } = require('@joplin/lib/locale');
|
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
|
||||||
const Note = require('@joplin/lib/models/Note').default;
|
|
||||||
const time = require('@joplin/lib/time').default;
|
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
|
||||||
usage() {
|
|
||||||
return 'done <note>';
|
|
||||||
}
|
|
||||||
|
|
||||||
description() {
|
|
||||||
return _('Marks a to-do as done.');
|
|
||||||
}
|
|
||||||
|
|
||||||
static async handleAction(commandInstance, args, isCompleted) {
|
|
||||||
const note = await app().loadItem(BaseModel.TYPE_NOTE, args.note);
|
|
||||||
commandInstance.encryptionCheck(note);
|
|
||||||
if (!note) throw new Error(_('Cannot find "%s".', args.note));
|
|
||||||
if (!note.is_todo) throw new Error(_('Note is not a to-do: "%s"', args.note));
|
|
||||||
|
|
||||||
const todoCompleted = !!note.todo_completed;
|
|
||||||
|
|
||||||
if (isCompleted === todoCompleted) return;
|
|
||||||
|
|
||||||
await Note.save({
|
|
||||||
id: note.id,
|
|
||||||
todo_completed: isCompleted ? time.unixMs() : 0,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
async action(args) {
|
|
||||||
await Command.handleAction(this, args, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = Command;
|
|
41
packages/app-cli/app/command-done.ts
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
import BaseCommand from './base-command';
|
||||||
|
import app from './app';
|
||||||
|
import { _ } from '@joplin/lib/locale';
|
||||||
|
import BaseModel from '@joplin/lib/BaseModel';
|
||||||
|
import Note from '@joplin/lib/models/Note';
|
||||||
|
import time from '@joplin/lib/time';
|
||||||
|
import { NoteEntity } from '@joplin/lib/services/database/types';
|
||||||
|
|
||||||
|
class Command extends BaseCommand {
|
||||||
|
public override usage() {
|
||||||
|
return 'done <note>';
|
||||||
|
}
|
||||||
|
|
||||||
|
public override description() {
|
||||||
|
return _('Marks a to-do as done.');
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
public static async handleAction(commandInstance: BaseCommand, args: any, isCompleted: boolean) {
|
||||||
|
const note: NoteEntity = await app().loadItem(BaseModel.TYPE_NOTE, args.note);
|
||||||
|
commandInstance.encryptionCheck(note);
|
||||||
|
if (!note) throw new Error(_('Cannot find "%s".', args.note));
|
||||||
|
if (!note.is_todo) throw new Error(_('Note is not a to-do: "%s"', args.note));
|
||||||
|
|
||||||
|
const todoCompleted = !!note.todo_completed;
|
||||||
|
|
||||||
|
if (isCompleted === todoCompleted) return;
|
||||||
|
|
||||||
|
await Note.save({
|
||||||
|
id: note.id,
|
||||||
|
todo_completed: isCompleted ? time.unixMs() : 0,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
public override async action(args: any) {
|
||||||
|
await Command.handleAction(this, args, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Command;
|
@@ -1,23 +1,24 @@
|
|||||||
const BaseCommand = require('./base-command').default;
|
import BaseCommand from './base-command';
|
||||||
const Folder = require('@joplin/lib/models/Folder').default;
|
import Folder from '@joplin/lib/models/Folder';
|
||||||
const Note = require('@joplin/lib/models/Note').default;
|
import Note from '@joplin/lib/models/Note';
|
||||||
const Tag = require('@joplin/lib/models/Tag').default;
|
import Tag from '@joplin/lib/models/Tag';
|
||||||
|
import { FolderEntity, NoteEntity } from '@joplin/lib/services/database/types';
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
usage() {
|
public override usage() {
|
||||||
return 'dump';
|
return 'dump';
|
||||||
}
|
}
|
||||||
|
|
||||||
description() {
|
public override description() {
|
||||||
return 'Dumps the complete database as JSON.';
|
return 'Dumps the complete database as JSON.';
|
||||||
}
|
}
|
||||||
|
|
||||||
hidden() {
|
public override hidden() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
async action() {
|
public override async action() {
|
||||||
let items = [];
|
let items: (NoteEntity | FolderEntity)[] = [];
|
||||||
const folders = await Folder.all();
|
const folders = await Folder.all();
|
||||||
for (let i = 0; i < folders.length; i++) {
|
for (let i = 0; i < folders.length; i++) {
|
||||||
const folder = folders[i];
|
const folder = folders[i];
|
@@ -30,9 +30,11 @@ class Command extends BaseCommand {
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public async action(args: any) {
|
public async action(args: any) {
|
||||||
const options = args.options;
|
const options = args.options;
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
const askForMasterKey = async (error: any) => {
|
const askForMasterKey = async (error: any) => {
|
||||||
const masterKeyId = error.masterKeyId;
|
const masterKeyId = error.masterKeyId;
|
||||||
const password = await this.prompt(_('Enter master password:'), { type: 'string', secure: true });
|
const password = await this.prompt(_('Enter master password:'), { type: 'string', secure: true });
|
||||||
|
@@ -1,24 +1,25 @@
|
|||||||
const fs = require('fs-extra');
|
import * as fs from 'fs-extra';
|
||||||
const BaseCommand = require('./base-command').default;
|
import BaseCommand from './base-command';
|
||||||
const { splitCommandString } = require('@joplin/utils');
|
import { splitCommandString } from '@joplin/utils';
|
||||||
const uuid = require('@joplin/lib/uuid').default;
|
import uuid from '@joplin/lib/uuid';
|
||||||
const { app } = require('./app.js');
|
import app from './app';
|
||||||
const { _ } = require('@joplin/lib/locale');
|
import { _ } from '@joplin/lib/locale';
|
||||||
const Note = require('@joplin/lib/models/Note').default;
|
import Note from '@joplin/lib/models/Note';
|
||||||
const Setting = require('@joplin/lib/models/Setting').default;
|
import Setting from '@joplin/lib/models/Setting';
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
import BaseModel from '@joplin/lib/BaseModel';
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
usage() {
|
public override usage() {
|
||||||
return 'edit <note>';
|
return 'edit <note>';
|
||||||
}
|
}
|
||||||
|
|
||||||
description() {
|
public override description() {
|
||||||
return _('Edit note.');
|
return _('Edit note.');
|
||||||
}
|
}
|
||||||
|
|
||||||
async action(args) {
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
let tempFilePath = null;
|
public override async action(args: any) {
|
||||||
|
let tempFilePath: string|null = null;
|
||||||
|
|
||||||
const onFinishedEditing = async () => {
|
const onFinishedEditing = async () => {
|
||||||
if (tempFilePath) fs.removeSync(tempFilePath);
|
if (tempFilePath) fs.removeSync(tempFilePath);
|
@@ -1,23 +0,0 @@
|
|||||||
const BaseCommand = require('./base-command').default;
|
|
||||||
const { app } = require('./app.js');
|
|
||||||
const { _ } = require('@joplin/lib/locale');
|
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
|
||||||
usage() {
|
|
||||||
return 'exit';
|
|
||||||
}
|
|
||||||
|
|
||||||
description() {
|
|
||||||
return _('Exits the application.');
|
|
||||||
}
|
|
||||||
|
|
||||||
compatibleUis() {
|
|
||||||
return ['gui'];
|
|
||||||
}
|
|
||||||
|
|
||||||
async action() {
|
|
||||||
await app().exit();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = Command;
|
|
23
packages/app-cli/app/command-exit.ts
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
import BaseCommand from './base-command';
|
||||||
|
import app from './app';
|
||||||
|
import { _ } from '@joplin/lib/locale';
|
||||||
|
|
||||||
|
class Command extends BaseCommand {
|
||||||
|
public override usage() {
|
||||||
|
return 'exit';
|
||||||
|
}
|
||||||
|
|
||||||
|
public override description() {
|
||||||
|
return _('Exits the application.');
|
||||||
|
}
|
||||||
|
|
||||||
|
public override compatibleUis() {
|
||||||
|
return ['gui'];
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async action() {
|
||||||
|
await app().exit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Command;
|
@@ -1,25 +1,25 @@
|
|||||||
const BaseCommand = require('./base-command').default;
|
import BaseCommand from './base-command';
|
||||||
const { app } = require('./app.js');
|
import app from './app';
|
||||||
const Setting = require('@joplin/lib/models/Setting').default;
|
import Setting from '@joplin/lib/models/Setting';
|
||||||
const ReportService = require('@joplin/lib/services/ReportService').default;
|
import ReportService from '@joplin/lib/services/ReportService';
|
||||||
const fs = require('fs-extra');
|
import * as fs from 'fs-extra';
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
usage() {
|
public override usage() {
|
||||||
return 'export-sync-status';
|
return 'export-sync-status';
|
||||||
}
|
}
|
||||||
|
|
||||||
description() {
|
public override description() {
|
||||||
return 'Export sync status';
|
return 'Export sync status';
|
||||||
}
|
}
|
||||||
|
|
||||||
hidden() {
|
public override hidden() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
async action() {
|
public override async action() {
|
||||||
const service = new ReportService();
|
const service = new ReportService();
|
||||||
const csv = await service.basicItemList({ format: 'csv' });
|
const csv = await service.basicItemList({ format: 'csv' }) as string;
|
||||||
const filePath = `${Setting.value('profileDir')}/syncReport-${new Date().getTime()}.csv`;
|
const filePath = `${Setting.value('profileDir')}/syncReport-${new Date().getTime()}.csv`;
|
||||||
await fs.writeFileSync(filePath, csv);
|
await fs.writeFileSync(filePath, csv);
|
||||||
this.stdout(`Sync status exported to ${filePath}`);
|
this.stdout(`Sync status exported to ${filePath}`);
|
@@ -1,19 +1,20 @@
|
|||||||
const BaseCommand = require('./base-command').default;
|
import BaseCommand from './base-command';
|
||||||
const InteropService = require('@joplin/lib/services/interop/InteropService').default;
|
import InteropService from '@joplin/lib/services/interop/InteropService';
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
import BaseModel from '@joplin/lib/BaseModel';
|
||||||
const { app } = require('./app.js');
|
import app from './app';
|
||||||
const { _ } = require('@joplin/lib/locale');
|
import { _ } from '@joplin/lib/locale';
|
||||||
|
import { ExportOptions } from '@joplin/lib/services/interop/types';
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
usage() {
|
public override usage() {
|
||||||
return 'export <path>';
|
return 'export <path>';
|
||||||
}
|
}
|
||||||
|
|
||||||
description() {
|
public override description() {
|
||||||
return _('Exports Joplin data to the given path. By default, it will export the complete database including notebooks, notes, tags and resources.');
|
return _('Exports Joplin data to the given path. By default, it will export the complete database including notebooks, notes, tags and resources.');
|
||||||
}
|
}
|
||||||
|
|
||||||
options() {
|
public override options() {
|
||||||
const service = InteropService.instance();
|
const service = InteropService.instance();
|
||||||
const formats = service
|
const formats = service
|
||||||
.modules()
|
.modules()
|
||||||
@@ -23,8 +24,9 @@ class Command extends BaseCommand {
|
|||||||
return [['--format <format>', _('Destination format: %s', formats.join(', '))], ['--note <note>', _('Exports only the given note.')], ['--notebook <notebook>', _('Exports only the given notebook.')]];
|
return [['--format <format>', _('Destination format: %s', formats.join(', '))], ['--note <note>', _('Exports only the given note.')], ['--notebook <notebook>', _('Exports only the given notebook.')]];
|
||||||
}
|
}
|
||||||
|
|
||||||
async action(args) {
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
const exportOptions = {};
|
public override async action(args: any) {
|
||||||
|
const exportOptions: ExportOptions = {};
|
||||||
exportOptions.path = args.path;
|
exportOptions.path = args.path;
|
||||||
|
|
||||||
exportOptions.format = args.options.format ? args.options.format : 'jex';
|
exportOptions.format = args.options.format ? args.options.format : 'jex';
|
||||||
@@ -34,11 +36,13 @@ class Command extends BaseCommand {
|
|||||||
if (args.options.note) {
|
if (args.options.note) {
|
||||||
const notes = await app().loadItems(BaseModel.TYPE_NOTE, args.options.note, { parent: app().currentFolder() });
|
const notes = await app().loadItems(BaseModel.TYPE_NOTE, args.options.note, { parent: app().currentFolder() });
|
||||||
if (!notes.length) throw new Error(_('Cannot find "%s".', args.options.note));
|
if (!notes.length) throw new Error(_('Cannot find "%s".', args.options.note));
|
||||||
exportOptions.sourceNoteIds = notes.map(n => n.id);
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
exportOptions.sourceNoteIds = notes.map((n: any) => n.id);
|
||||||
} else if (args.options.notebook) {
|
} else if (args.options.notebook) {
|
||||||
const folders = await app().loadItems(BaseModel.TYPE_FOLDER, args.options.notebook);
|
const folders = await app().loadItems(BaseModel.TYPE_FOLDER, args.options.notebook);
|
||||||
if (!folders.length) throw new Error(_('Cannot find "%s".', args.options.notebook));
|
if (!folders.length) throw new Error(_('Cannot find "%s".', args.options.notebook));
|
||||||
exportOptions.sourceFolderIds = folders.map(n => n.id);
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
exportOptions.sourceFolderIds = folders.map((n: any) => n.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
const service = InteropService.instance();
|
const service = InteropService.instance();
|
@@ -1,19 +1,20 @@
|
|||||||
const BaseCommand = require('./base-command').default;
|
import BaseCommand from './base-command';
|
||||||
const { app } = require('./app.js');
|
import app from './app';
|
||||||
const { _ } = require('@joplin/lib/locale');
|
import { _ } from '@joplin/lib/locale';
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
import BaseModel from '@joplin/lib/BaseModel';
|
||||||
const Note = require('@joplin/lib/models/Note').default;
|
import Note from '@joplin/lib/models/Note';
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
usage() {
|
public override usage() {
|
||||||
return 'geoloc <note>';
|
return 'geoloc <note>';
|
||||||
}
|
}
|
||||||
|
|
||||||
description() {
|
public override description() {
|
||||||
return _('Displays a geolocation URL for the note.');
|
return _('Displays a geolocation URL for the note.');
|
||||||
}
|
}
|
||||||
|
|
||||||
async action(args) {
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
public override async action(args: any) {
|
||||||
const title = args['note'];
|
const title = args['note'];
|
||||||
|
|
||||||
const item = await app().loadItem(BaseModel.TYPE_NOTE, title, { parent: app().currentFolder() });
|
const item = await app().loadItem(BaseModel.TYPE_NOTE, title, { parent: app().currentFolder() });
|
@@ -1,19 +1,19 @@
|
|||||||
const BaseCommand = require('./base-command').default;
|
import BaseCommand from './base-command';
|
||||||
const { app } = require('./app.js');
|
import app from './app';
|
||||||
const { renderCommandHelp } = require('./help-utils.js');
|
const { renderCommandHelp } = require('./help-utils.js');
|
||||||
const { _ } = require('@joplin/lib/locale');
|
import { _ } from '@joplin/lib/locale';
|
||||||
const { cliUtils } = require('./cli-utils.js');
|
const { cliUtils } = require('./cli-utils.js');
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
usage() {
|
public override usage() {
|
||||||
return 'help [command]';
|
return 'help [command]';
|
||||||
}
|
}
|
||||||
|
|
||||||
description() {
|
public override description() {
|
||||||
return _('Displays usage information.');
|
return _('Displays usage information.');
|
||||||
}
|
}
|
||||||
|
|
||||||
allCommands() {
|
private allCommands() {
|
||||||
const commands = app().commands(app().uiType());
|
const commands = app().commands(app().uiType());
|
||||||
const output = [];
|
const output = [];
|
||||||
for (const n in commands) {
|
for (const n in commands) {
|
||||||
@@ -29,7 +29,8 @@ class Command extends BaseCommand {
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
async action(args) {
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
public override async action(args: any) {
|
||||||
const stdoutWidth = app().commandStdoutMaxWidth();
|
const stdoutWidth = app().commandStdoutMaxWidth();
|
||||||
|
|
||||||
if (args.command === 'shortcuts' || args.command === 'keymap') {
|
if (args.command === 'shortcuts' || args.command === 'keymap') {
|
||||||
@@ -52,7 +53,7 @@ class Command extends BaseCommand {
|
|||||||
|
|
||||||
for (let i = 0; i < keymap.length; i++) {
|
for (let i = 0; i < keymap.length; i++) {
|
||||||
const item = keymap[i];
|
const item = keymap[i];
|
||||||
const keys = item.keys.map(k => (k === ' ' ? '(SPACE)' : k));
|
const keys = item.keys.map((k: string) => (k === ' ' ? '(SPACE)' : k));
|
||||||
rows.push([keys.join(', '), item.command]);
|
rows.push([keys.join(', '), item.command]);
|
||||||
}
|
}
|
||||||
|
|
@@ -1,20 +1,22 @@
|
|||||||
const BaseCommand = require('./base-command').default;
|
import BaseCommand from './base-command';
|
||||||
const InteropService = require('@joplin/lib/services/interop/InteropService').default;
|
import InteropService from '@joplin/lib/services/interop/InteropService';
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
import BaseModel from '@joplin/lib/BaseModel';
|
||||||
const { cliUtils } = require('./cli-utils.js');
|
const { cliUtils } = require('./cli-utils.js');
|
||||||
const { app } = require('./app.js');
|
import app from './app';
|
||||||
const { _ } = require('@joplin/lib/locale');
|
import { _ } from '@joplin/lib/locale';
|
||||||
|
import { ImportOptions } from '@joplin/lib/services/interop/types';
|
||||||
|
import { unique } from '@joplin/lib/array';
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
usage() {
|
public override usage() {
|
||||||
return 'import <path> [notebook]';
|
return 'import <path> [notebook]';
|
||||||
}
|
}
|
||||||
|
|
||||||
description() {
|
public override description() {
|
||||||
return _('Imports data into Joplin.');
|
return _('Imports data into Joplin.');
|
||||||
}
|
}
|
||||||
|
|
||||||
options() {
|
public override options() {
|
||||||
const service = InteropService.instance();
|
const service = InteropService.instance();
|
||||||
const formats = service
|
const formats = service
|
||||||
.modules()
|
.modules()
|
||||||
@@ -22,18 +24,19 @@ class Command extends BaseCommand {
|
|||||||
.map(m => m.format);
|
.map(m => m.format);
|
||||||
|
|
||||||
return [
|
return [
|
||||||
['--format <format>', _('Source format: %s', ['auto'].concat(formats).join(', '))],
|
['--format <format>', _('Source format: %s', ['auto'].concat(unique(formats)).join(', '))],
|
||||||
['-f, --force', _('Do not ask for confirmation.')],
|
['-f, --force', _('Do not ask for confirmation.')],
|
||||||
['--output-format <output-format>', _('Output format: %s', 'md, html')],
|
['--output-format <output-format>', _('Output format: %s', 'md, html')],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
async action(args) {
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
public override async action(args: any) {
|
||||||
const folder = await app().loadItem(BaseModel.TYPE_FOLDER, args.notebook);
|
const folder = await app().loadItem(BaseModel.TYPE_FOLDER, args.notebook);
|
||||||
|
|
||||||
if (args.notebook && !folder) throw new Error(_('Cannot find "%s".', args.notebook));
|
if (args.notebook && !folder) throw new Error(_('Cannot find "%s".', args.notebook));
|
||||||
|
|
||||||
const importOptions = {};
|
const importOptions: ImportOptions = {};
|
||||||
importOptions.path = args.path;
|
importOptions.path = args.path;
|
||||||
importOptions.format = args.options.format ? args.options.format : 'auto';
|
importOptions.format = args.options.format ? args.options.format : 'auto';
|
||||||
importOptions.destinationFolderId = folder ? folder.id : null;
|
importOptions.destinationFolderId = folder ? folder.id : null;
|
@@ -1,28 +1,29 @@
|
|||||||
const BaseCommand = require('./base-command').default;
|
import BaseCommand from './base-command';
|
||||||
const { app } = require('./app.js');
|
import app from './app';
|
||||||
const { _ } = require('@joplin/lib/locale');
|
import { _ } from '@joplin/lib/locale';
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
import BaseModel from '@joplin/lib/BaseModel';
|
||||||
const Folder = require('@joplin/lib/models/Folder').default;
|
import Folder from '@joplin/lib/models/Folder';
|
||||||
const Setting = require('@joplin/lib/models/Setting').default;
|
import Setting from '@joplin/lib/models/Setting';
|
||||||
const Note = require('@joplin/lib/models/Note').default;
|
import Note from '@joplin/lib/models/Note';
|
||||||
const { sprintf } = require('sprintf-js');
|
const { sprintf } = require('sprintf-js');
|
||||||
const time = require('@joplin/lib/time').default;
|
import time from '@joplin/lib/time';
|
||||||
|
import { NoteEntity } from '@joplin/lib/services/database/types';
|
||||||
const { cliUtils } = require('./cli-utils.js');
|
const { cliUtils } = require('./cli-utils.js');
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
usage() {
|
public override usage() {
|
||||||
return 'ls [note-pattern]';
|
return 'ls [note-pattern]';
|
||||||
}
|
}
|
||||||
|
|
||||||
description() {
|
public override description() {
|
||||||
return _('Displays the notes in the current notebook. Use `ls /` to display the list of notebooks.');
|
return _('Displays the notes in the current notebook. Use `ls /` to display the list of notebooks.');
|
||||||
}
|
}
|
||||||
|
|
||||||
enabled() {
|
public override enabled() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
options() {
|
public override options() {
|
||||||
return [
|
return [
|
||||||
['-n, --limit <num>', _('Displays only the first top <num> notes.')],
|
['-n, --limit <num>', _('Displays only the first top <num> notes.')],
|
||||||
['-s, --sort <field>', _('Sorts the item by <field> (eg. title, updated_time, created_time).')],
|
['-s, --sort <field>', _('Sorts the item by <field> (eg. title, updated_time, created_time).')],
|
||||||
@@ -33,12 +34,14 @@ class Command extends BaseCommand {
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
async action(args) {
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
public override async action(args: any) {
|
||||||
const pattern = args['note-pattern'];
|
const pattern = args['note-pattern'];
|
||||||
let items = [];
|
let items = [];
|
||||||
const options = args.options;
|
const options = args.options;
|
||||||
|
|
||||||
const queryOptions = {};
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
const queryOptions: any = {};
|
||||||
if (options.limit) queryOptions.limit = options.limit;
|
if (options.limit) queryOptions.limit = options.limit;
|
||||||
if (options.sort) {
|
if (options.sort) {
|
||||||
queryOptions.orderBy = options.sort;
|
queryOptions.orderBy = options.sort;
|
||||||
@@ -71,7 +74,7 @@ class Command extends BaseCommand {
|
|||||||
let hasTodos = false;
|
let hasTodos = false;
|
||||||
for (let i = 0; i < items.length; i++) {
|
for (let i = 0; i < items.length; i++) {
|
||||||
const item = items[i];
|
const item = items[i];
|
||||||
if (item.is_todo) {
|
if ((item as NoteEntity).is_todo) {
|
||||||
hasTodos = true;
|
hasTodos = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -103,8 +106,8 @@ class Command extends BaseCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (hasTodos) {
|
if (hasTodos) {
|
||||||
if (item.is_todo) {
|
if ((item as NoteEntity).is_todo) {
|
||||||
row.push(sprintf('[%s]', item.todo_completed ? 'X' : ' '));
|
row.push(sprintf('[%s]', (item as NoteEntity).todo_completed ? 'X' : ' '));
|
||||||
} else {
|
} else {
|
||||||
row.push(' ');
|
row.push(' ');
|
||||||
}
|
}
|
@@ -1,5 +1,5 @@
|
|||||||
const BaseCommand = require('./base-command').default;
|
const BaseCommand = require('./base-command').default;
|
||||||
const { app } = require('./app.js');
|
import app from './app';
|
||||||
import { _ } from '@joplin/lib/locale';
|
import { _ } from '@joplin/lib/locale';
|
||||||
import BaseModel from '@joplin/lib/BaseModel';
|
import BaseModel from '@joplin/lib/BaseModel';
|
||||||
import Folder from '@joplin/lib/models/Folder';
|
import Folder from '@joplin/lib/models/Folder';
|
||||||
@@ -43,6 +43,7 @@ class Command extends BaseCommand {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public async action(args: any) {
|
public async action(args: any) {
|
||||||
const targetFolder = args.options.parent;
|
const targetFolder = args.options.parent;
|
||||||
|
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
const BaseCommand = require('./base-command').default;
|
const BaseCommand = require('./base-command').default;
|
||||||
const { app } = require('./app.js');
|
const app = require('./app').default;
|
||||||
const { _ } = require('@joplin/lib/locale');
|
const { _ } = require('@joplin/lib/locale');
|
||||||
const Note = require('@joplin/lib/models/Note').default;
|
const Note = require('@joplin/lib/models/Note').default;
|
||||||
|
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
const BaseCommand = require('./base-command').default;
|
const BaseCommand = require('./base-command').default;
|
||||||
const { app } = require('./app.js');
|
const app = require('./app').default;
|
||||||
const { _ } = require('@joplin/lib/locale');
|
const { _ } = require('@joplin/lib/locale');
|
||||||
const Note = require('@joplin/lib/models/Note').default;
|
const Note = require('@joplin/lib/models/Note').default;
|
||||||
|
|
||||||
|
@@ -1,20 +1,21 @@
|
|||||||
const BaseCommand = require('./base-command').default;
|
import BaseCommand from './base-command';
|
||||||
const { app } = require('./app.js');
|
import app from './app';
|
||||||
const { _ } = require('@joplin/lib/locale');
|
import { _ } from '@joplin/lib/locale';
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
import BaseModel from '@joplin/lib/BaseModel';
|
||||||
const Folder = require('@joplin/lib/models/Folder').default;
|
import Folder from '@joplin/lib/models/Folder';
|
||||||
const Note = require('@joplin/lib/models/Note').default;
|
import Note from '@joplin/lib/models/Note';
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
usage() {
|
public override usage() {
|
||||||
return 'mv <item> [notebook]';
|
return 'mv <item> [notebook]';
|
||||||
}
|
}
|
||||||
|
|
||||||
description() {
|
public override description() {
|
||||||
return _('Moves the given <item> to [notebook]');
|
return _('Moves the given <item> to [notebook]');
|
||||||
}
|
}
|
||||||
|
|
||||||
async action(args) {
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
public override async action(args: any) {
|
||||||
const pattern = args['item'];
|
const pattern = args['item'];
|
||||||
const destination = args['notebook'];
|
const destination = args['notebook'];
|
||||||
let folder = null;
|
let folder = null;
|
@@ -1,20 +1,21 @@
|
|||||||
const BaseCommand = require('./base-command').default;
|
import BaseCommand from './base-command';
|
||||||
const { app } = require('./app.js');
|
import app from './app';
|
||||||
const { _ } = require('@joplin/lib/locale');
|
import { _ } from '@joplin/lib/locale';
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
import BaseModel from '@joplin/lib/BaseModel';
|
||||||
const Folder = require('@joplin/lib/models/Folder').default;
|
import Folder from '@joplin/lib/models/Folder';
|
||||||
const Note = require('@joplin/lib/models/Note').default;
|
import Note from '@joplin/lib/models/Note';
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
usage() {
|
public override usage() {
|
||||||
return 'ren <item> <name>';
|
return 'ren <item> <name>';
|
||||||
}
|
}
|
||||||
|
|
||||||
description() {
|
public override description() {
|
||||||
return _('Renames the given <item> (note or notebook) to <name>.');
|
return _('Renames the given <item> (note or notebook) to <name>.');
|
||||||
}
|
}
|
||||||
|
|
||||||
async action(args) {
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
public override async action(args: any) {
|
||||||
const pattern = args['item'];
|
const pattern = args['item'];
|
||||||
const name = args['name'];
|
const name = args['name'];
|
||||||
|
|
27
packages/app-cli/app/command-restore.ts
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
import BaseCommand from './base-command';
|
||||||
|
import app from './app';
|
||||||
|
import { _ } from '@joplin/lib/locale';
|
||||||
|
import restoreItems from '@joplin/lib/services/trash/restoreItems';
|
||||||
|
|
||||||
|
class Command extends BaseCommand {
|
||||||
|
public override usage() {
|
||||||
|
return 'restore <pattern>';
|
||||||
|
}
|
||||||
|
|
||||||
|
public override description() {
|
||||||
|
return _('Restore the items matching <pattern> from the trash.');
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
public override async action(args: any) {
|
||||||
|
const pattern = args['pattern'];
|
||||||
|
|
||||||
|
const items = await app().loadItems('folderOrNote', pattern);
|
||||||
|
if (!items.length) throw new Error(_('Cannot find "%s".', pattern));
|
||||||
|
|
||||||
|
const ids = items.map(n => n.id);
|
||||||
|
await restoreItems(items[0].type_, ids, { useRestoreFolder: true });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Command;
|
@@ -1,33 +0,0 @@
|
|||||||
const BaseCommand = require('./base-command').default;
|
|
||||||
const { app } = require('./app.js');
|
|
||||||
const { _ } = require('@joplin/lib/locale');
|
|
||||||
const Folder = require('@joplin/lib/models/Folder').default;
|
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
|
||||||
usage() {
|
|
||||||
return 'rmbook <notebook>';
|
|
||||||
}
|
|
||||||
|
|
||||||
description() {
|
|
||||||
return _('Deletes the given notebook.');
|
|
||||||
}
|
|
||||||
|
|
||||||
options() {
|
|
||||||
return [['-f, --force', _('Deletes the notebook without asking for confirmation.')]];
|
|
||||||
}
|
|
||||||
|
|
||||||
async action(args) {
|
|
||||||
const pattern = args['notebook'];
|
|
||||||
const force = args.options && args.options.force === true;
|
|
||||||
|
|
||||||
const folder = await app().loadItem(BaseModel.TYPE_FOLDER, pattern);
|
|
||||||
if (!folder) throw new Error(_('Cannot find "%s".', pattern));
|
|
||||||
const ok = force ? true : await this.prompt(_('Delete notebook? All notes and sub-notebooks within this notebook will also be deleted.'), { booleanAnswerDefault: 'n' });
|
|
||||||
if (!ok) return;
|
|
||||||
|
|
||||||
await Folder.delete(folder.id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = Command;
|
|
81
packages/app-cli/app/command-rmbook.test.ts
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
import { setupDatabaseAndSynchronizer, switchClient } from '@joplin/lib/testing/test-utils';
|
||||||
|
import { setupCommandForTesting, setupApplication } from './utils/testUtils';
|
||||||
|
import Folder from '@joplin/lib/models/Folder';
|
||||||
|
import Note from '@joplin/lib/models/Note';
|
||||||
|
const Command = require('./command-rmbook');
|
||||||
|
|
||||||
|
const setUpCommand = () => {
|
||||||
|
const command = setupCommandForTesting(Command);
|
||||||
|
const promptMock = jest.fn(() => true);
|
||||||
|
command.setPrompt(promptMock);
|
||||||
|
|
||||||
|
return { command, promptMock };
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
describe('command-rmbook', () => {
|
||||||
|
beforeEach(async () => {
|
||||||
|
await setupDatabaseAndSynchronizer(1);
|
||||||
|
await switchClient(1);
|
||||||
|
await setupApplication();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should ask before moving to the trash', async () => {
|
||||||
|
await Folder.save({ title: 'folder1' });
|
||||||
|
|
||||||
|
const { command, promptMock } = setUpCommand();
|
||||||
|
|
||||||
|
await command.action({ 'notebook': 'folder1', options: {} });
|
||||||
|
|
||||||
|
expect(promptMock).toHaveBeenCalledTimes(1);
|
||||||
|
|
||||||
|
const folder1 = await Folder.loadByTitle('folder1');
|
||||||
|
expect(folder1.deleted_time).not.toBeFalsy();
|
||||||
|
expect((await Note.allItemsInTrash()).folderIds).toHaveLength(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('cancelling a prompt should prevent deletion', async () => {
|
||||||
|
await Folder.save({ title: 'folder1' });
|
||||||
|
|
||||||
|
const { command, promptMock } = setUpCommand();
|
||||||
|
promptMock.mockImplementation(() => false);
|
||||||
|
await command.action({ 'notebook': 'folder1', options: {} });
|
||||||
|
|
||||||
|
expect((await Note.allItemsInTrash()).folderIds).toHaveLength(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not prompt when the force flag is given', async () => {
|
||||||
|
const { id: folder1Id } = await Folder.save({ title: 'folder1' });
|
||||||
|
const { id: folder2Id } = await Folder.save({ title: 'folder2', parent_id: folder1Id });
|
||||||
|
|
||||||
|
const { command, promptMock } = setUpCommand();
|
||||||
|
await command.action({ 'notebook': 'folder1', options: { force: true } });
|
||||||
|
|
||||||
|
expect(promptMock).toHaveBeenCalledTimes(0);
|
||||||
|
|
||||||
|
expect((await Note.allItemsInTrash()).folderIds.includes(folder1Id)).toBe(true);
|
||||||
|
expect((await Note.allItemsInTrash()).folderIds.includes(folder2Id)).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should support permanent deletion', async () => {
|
||||||
|
const { id: folder1Id } = await Folder.save({ title: 'folder1' });
|
||||||
|
const { id: folder2Id } = await Folder.save({ title: 'folder2' });
|
||||||
|
|
||||||
|
const { command, promptMock } = setUpCommand();
|
||||||
|
await command.action({ 'notebook': 'folder1', options: { permanent: true, force: true } });
|
||||||
|
expect(promptMock).not.toHaveBeenCalled();
|
||||||
|
|
||||||
|
// Should be permanently deleted.
|
||||||
|
expect((await Note.allItemsInTrash()).folderIds.includes(folder1Id)).toBe(false);
|
||||||
|
expect(await Folder.load(folder1Id, { includeDeleted: true })).toBe(undefined);
|
||||||
|
|
||||||
|
// folder2 should not be deleted
|
||||||
|
expect(await Folder.load(folder2Id, { includeDeleted: false })).toBeTruthy();
|
||||||
|
|
||||||
|
// Should prompt before deleting
|
||||||
|
await command.action({ 'notebook': 'folder2', options: { permanent: true } });
|
||||||
|
expect(promptMock).toHaveBeenCalled();
|
||||||
|
expect(await Folder.load(folder2Id, { includeDeleted: false })).toBeUndefined();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
47
packages/app-cli/app/command-rmbook.ts
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
import BaseCommand from './base-command';
|
||||||
|
import app from './app';
|
||||||
|
import { _ } from '@joplin/lib/locale';
|
||||||
|
import Folder from '@joplin/lib/models/Folder';
|
||||||
|
import BaseModel from '@joplin/lib/BaseModel';
|
||||||
|
import { substrWithEllipsis } from '@joplin/lib/string-utils';
|
||||||
|
|
||||||
|
class Command extends BaseCommand {
|
||||||
|
public override usage() {
|
||||||
|
return 'rmbook <notebook>';
|
||||||
|
}
|
||||||
|
|
||||||
|
public override description() {
|
||||||
|
return _('Deletes the given notebook.');
|
||||||
|
}
|
||||||
|
|
||||||
|
public override options() {
|
||||||
|
return [
|
||||||
|
['-f, --force', _('Deletes the notebook without asking for confirmation.')],
|
||||||
|
['-p, --permanent', _('Permanently deletes the notebook, skipping the trash.')],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
public override async action(args: any) {
|
||||||
|
const pattern = args['notebook'];
|
||||||
|
const force = args.options && args.options.force === true;
|
||||||
|
|
||||||
|
const folder = await app().loadItem(BaseModel.TYPE_FOLDER, pattern);
|
||||||
|
if (!folder) throw new Error(_('Cannot find "%s".', pattern));
|
||||||
|
|
||||||
|
const permanent = args.options?.permanent === true || !!folder.deleted_time;
|
||||||
|
const ellipsizedFolderTitle = substrWithEllipsis(folder.title, 0, 32);
|
||||||
|
let msg;
|
||||||
|
if (permanent) {
|
||||||
|
msg = _('Permanently delete notebook "%s"?\n\nAll notes and sub-notebooks within this notebook will be permanently deleted.', ellipsizedFolderTitle);
|
||||||
|
} else {
|
||||||
|
msg = _('Move notebook "%s" to the trash?\n\nAll notes and sub-notebooks within this notebook will also be moved to the trash.', ellipsizedFolderTitle);
|
||||||
|
}
|
||||||
|
const ok = force ? true : await this.prompt(msg, { booleanAnswerDefault: 'n' });
|
||||||
|
if (!ok) return;
|
||||||
|
|
||||||
|
await Folder.delete(folder.id, { toTrash: !permanent, sourceDescription: 'rmbook command' });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Command;
|
@@ -1,34 +0,0 @@
|
|||||||
const BaseCommand = require('./base-command').default;
|
|
||||||
const { app } = require('./app.js');
|
|
||||||
const { _ } = require('@joplin/lib/locale');
|
|
||||||
const Note = require('@joplin/lib/models/Note').default;
|
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
|
||||||
usage() {
|
|
||||||
return 'rmnote <note-pattern>';
|
|
||||||
}
|
|
||||||
|
|
||||||
description() {
|
|
||||||
return _('Deletes the notes matching <note-pattern>.');
|
|
||||||
}
|
|
||||||
|
|
||||||
options() {
|
|
||||||
return [['-f, --force', _('Deletes the notes without asking for confirmation.')]];
|
|
||||||
}
|
|
||||||
|
|
||||||
async action(args) {
|
|
||||||
const pattern = args['note-pattern'];
|
|
||||||
const force = args.options && args.options.force === true;
|
|
||||||
|
|
||||||
const notes = await app().loadItems(BaseModel.TYPE_NOTE, pattern);
|
|
||||||
if (!notes.length) throw new Error(_('Cannot find "%s".', pattern));
|
|
||||||
|
|
||||||
const ok = force ? true : await this.prompt(notes.length > 1 ? _('%d notes match this pattern. Delete them?', notes.length) : _('Delete note?'), { booleanAnswerDefault: 'n' });
|
|
||||||
if (!ok) return;
|
|
||||||
const ids = notes.map(n => n.id);
|
|
||||||
await Note.batchDelete(ids);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = Command;
|
|
57
packages/app-cli/app/command-rmnote.test.ts
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
import { setupDatabaseAndSynchronizer, switchClient } from '@joplin/lib/testing/test-utils';
|
||||||
|
import { setupCommandForTesting, setupApplication } from './utils/testUtils';
|
||||||
|
import Note from '@joplin/lib/models/Note';
|
||||||
|
import Folder from '@joplin/lib/models/Folder';
|
||||||
|
import app from './app';
|
||||||
|
import { getTrashFolderId } from '@joplin/lib/services/trash';
|
||||||
|
const Command = require('./command-rmnote');
|
||||||
|
|
||||||
|
const setUpCommand = () => {
|
||||||
|
const command = setupCommandForTesting(Command);
|
||||||
|
const promptMock = jest.fn(() => true);
|
||||||
|
command.setPrompt(promptMock);
|
||||||
|
|
||||||
|
return { command, promptMock };
|
||||||
|
};
|
||||||
|
|
||||||
|
const createTestNote = async () => {
|
||||||
|
const folder = await Folder.save({ title: 'folder' });
|
||||||
|
app().switchCurrentFolder(folder);
|
||||||
|
return await Note.save({ title: 'note1', parent_id: folder.id });
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
describe('command-rmnote', () => {
|
||||||
|
beforeEach(async () => {
|
||||||
|
await setupDatabaseAndSynchronizer(1);
|
||||||
|
await switchClient(1);
|
||||||
|
await setupApplication();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should move to the trash by default, without prompting', async () => {
|
||||||
|
const { id: noteId } = await createTestNote();
|
||||||
|
|
||||||
|
const { command, promptMock } = setUpCommand();
|
||||||
|
await command.action({ 'note-pattern': 'note1', options: {} });
|
||||||
|
expect(promptMock).not.toHaveBeenCalled();
|
||||||
|
|
||||||
|
expect((await Note.allItemsInTrash()).noteIds.includes(noteId)).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should permanently delete trashed items by default, with prompting', async () => {
|
||||||
|
const { id: noteId } = await createTestNote();
|
||||||
|
const { command, promptMock } = setUpCommand();
|
||||||
|
|
||||||
|
// Should not prompt when deleting from a folder
|
||||||
|
await command.action({ 'note-pattern': 'note1', options: {} });
|
||||||
|
expect(promptMock).toHaveBeenCalledTimes(0);
|
||||||
|
|
||||||
|
// Should prompt when deleting from trash
|
||||||
|
app().switchCurrentFolder(await Folder.load(getTrashFolderId()));
|
||||||
|
await command.action({ 'note-pattern': 'note1', options: {} });
|
||||||
|
expect(promptMock).toHaveBeenCalledTimes(1);
|
||||||
|
|
||||||
|
expect(await Note.load(noteId, { includeDeleted: true })).toBe(undefined);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
56
packages/app-cli/app/command-rmnote.ts
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
import BaseCommand from './base-command';
|
||||||
|
import app from './app';
|
||||||
|
import { _ } from '@joplin/lib/locale';
|
||||||
|
import Note from '@joplin/lib/models/Note';
|
||||||
|
import BaseModel, { DeleteOptions } from '@joplin/lib/BaseModel';
|
||||||
|
import { NoteEntity } from '@joplin/lib/services/database/types';
|
||||||
|
|
||||||
|
class Command extends BaseCommand {
|
||||||
|
public override usage() {
|
||||||
|
return 'rmnote <note-pattern>';
|
||||||
|
}
|
||||||
|
|
||||||
|
public override description() {
|
||||||
|
return _('Deletes the notes matching <note-pattern>.');
|
||||||
|
}
|
||||||
|
|
||||||
|
public override options() {
|
||||||
|
return [
|
||||||
|
['-f, --force', _('Deletes the notes without asking for confirmation.')],
|
||||||
|
['-p, --permanent', _('Deletes notes permanently, skipping the trash.')],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
public override async action(args: any) {
|
||||||
|
const pattern = args['note-pattern'];
|
||||||
|
const force = args.options && args.options.force === true;
|
||||||
|
|
||||||
|
const notes: NoteEntity[] = await app().loadItems(BaseModel.TYPE_NOTE, pattern);
|
||||||
|
if (!notes.length) throw new Error(_('Cannot find "%s".', pattern));
|
||||||
|
|
||||||
|
let ok = true;
|
||||||
|
if (!force && notes.length > 1) {
|
||||||
|
ok = await this.prompt(_('%d notes match this pattern. Delete them?', notes.length), { booleanAnswerDefault: 'n' });
|
||||||
|
}
|
||||||
|
|
||||||
|
const permanent = (args.options?.permanent === true) || notes.every(n => !!n.deleted_time);
|
||||||
|
if (!force && permanent) {
|
||||||
|
const message = (
|
||||||
|
notes.length === 1 ? _('This will permanently delete the note "%s". Continue?', notes[0].title) : _('%d notes will be permanently deleted. Continue?', notes.length)
|
||||||
|
);
|
||||||
|
ok = await this.prompt(message, { booleanAnswerDefault: 'n' });
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ok) return;
|
||||||
|
|
||||||
|
const ids = notes.map(n => n.id);
|
||||||
|
const options: DeleteOptions = {
|
||||||
|
toTrash: !permanent,
|
||||||
|
sourceDescription: 'rmnote',
|
||||||
|
};
|
||||||
|
await Note.batchDelete(ids, options);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Command;
|
@@ -1,16 +1,16 @@
|
|||||||
const BaseCommand = require('./base-command').default;
|
import BaseCommand from './base-command';
|
||||||
const { app } = require('./app.js');
|
import app from './app';
|
||||||
const { _ } = require('@joplin/lib/locale');
|
import { _ } from '@joplin/lib/locale';
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
import BaseModel from '@joplin/lib/BaseModel';
|
||||||
const Database = require('@joplin/lib/database').default;
|
import Database from '@joplin/lib/database';
|
||||||
const Note = require('@joplin/lib/models/Note').default;
|
import Note from '@joplin/lib/models/Note';
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
usage() {
|
public override usage() {
|
||||||
return 'set <note> <name> [value]';
|
return 'set <note> <name> [value]';
|
||||||
}
|
}
|
||||||
|
|
||||||
description() {
|
public override description() {
|
||||||
const fields = Note.fields();
|
const fields = Note.fields();
|
||||||
const s = [];
|
const s = [];
|
||||||
for (let i = 0; i < fields.length; i++) {
|
for (let i = 0; i < fields.length; i++) {
|
||||||
@@ -22,7 +22,8 @@ class Command extends BaseCommand {
|
|||||||
return _('Sets the property <name> of the given <note> to the given [value]. Possible properties are:\n\n%s', s.join(', '));
|
return _('Sets the property <name> of the given <note> to the given [value]. Possible properties are:\n\n%s', s.join(', '));
|
||||||
}
|
}
|
||||||
|
|
||||||
async action(args) {
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
public override async action(args: any) {
|
||||||
const title = args['note'];
|
const title = args['note'];
|
||||||
const propName = args['name'];
|
const propName = args['name'];
|
||||||
let propValue = args['value'];
|
let propValue = args['value'];
|
||||||
@@ -36,7 +37,8 @@ class Command extends BaseCommand {
|
|||||||
|
|
||||||
const timestamp = Date.now();
|
const timestamp = Date.now();
|
||||||
|
|
||||||
const newNote = {
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
const newNote: any = {
|
||||||
id: notes[i].id,
|
id: notes[i].id,
|
||||||
type_: notes[i].type_,
|
type_: notes[i].type_,
|
||||||
updated_time: timestamp,
|
updated_time: timestamp,
|
@@ -35,7 +35,9 @@ class Command extends BaseCommand {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public async action(args: any) {
|
public async action(args: any) {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
const schema: Record<string, any> = {
|
const schema: Record<string, any> = {
|
||||||
title: 'JSON schema for Joplin setting files',
|
title: 'JSON schema for Joplin setting files',
|
||||||
'$id': Setting.schemaUrl,
|
'$id': Setting.schemaUrl,
|
||||||
@@ -52,6 +54,7 @@ class Command extends BaseCommand {
|
|||||||
const type = settingTypeToSchemaType(md.type);
|
const type = settingTypeToSchemaType(md.type);
|
||||||
if (!type) continue;
|
if (!type) continue;
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
const props: Record<string, any> = {};
|
const props: Record<string, any> = {};
|
||||||
props.type = type;
|
props.type = type;
|
||||||
props.default = md.value;
|
props.default = md.value;
|
||||||
@@ -61,6 +64,7 @@ class Command extends BaseCommand {
|
|||||||
if (md.description && md.description('desktop')) description.push(md.description('desktop'));
|
if (md.description && md.description('desktop')) description.push(md.description('desktop'));
|
||||||
|
|
||||||
if (description.length) props.description = description.join('. ');
|
if (description.length) props.description = description.join('. ');
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
if (md.isEnum) props.enum = Object.keys(md.options()).map((v: any) => Setting.formatValue(key, v));
|
if (md.isEnum) props.enum = Object.keys(md.options()).map((v: any) => Setting.formatValue(key, v));
|
||||||
if ('minimum' in md) props.minimum = md.minimum;
|
if ('minimum' in md) props.minimum = md.minimum;
|
||||||
if ('maximum' in md) props.maximum = md.maximum;
|
if ('maximum' in md) props.maximum = md.maximum;
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
const BaseCommand = require('./base-command').default;
|
const BaseCommand = require('./base-command').default;
|
||||||
const { app } = require('./app.js');
|
const app = require('./app').default;
|
||||||
const Setting = require('@joplin/lib/models/Setting').default;
|
const Setting = require('@joplin/lib/models/Setting').default;
|
||||||
const { _ } = require('@joplin/lib/locale');
|
const { _ } = require('@joplin/lib/locale');
|
||||||
const ReportService = require('@joplin/lib/services/ReportService').default;
|
const ReportService = require('@joplin/lib/services/ReportService').default;
|
||||||
|
@@ -7,19 +7,25 @@ import Synchronizer from '@joplin/lib/Synchronizer';
|
|||||||
import { masterKeysWithoutPassword } from '@joplin/lib/services/e2ee/utils';
|
import { masterKeysWithoutPassword } from '@joplin/lib/services/e2ee/utils';
|
||||||
import { appTypeToLockType } from '@joplin/lib/services/synchronizer/LockHandler';
|
import { appTypeToLockType } from '@joplin/lib/services/synchronizer/LockHandler';
|
||||||
const BaseCommand = require('./base-command').default;
|
const BaseCommand = require('./base-command').default;
|
||||||
const { app } = require('./app.js');
|
import app from './app';
|
||||||
const { OneDriveApiNodeUtils } = require('@joplin/lib/onedrive-api-node-utils.js');
|
const { OneDriveApiNodeUtils } = require('@joplin/lib/onedrive-api-node-utils.js');
|
||||||
import { reg } from '@joplin/lib/registry';
|
import { reg } from '@joplin/lib/registry';
|
||||||
const { cliUtils } = require('./cli-utils.js');
|
const { cliUtils } = require('./cli-utils.js');
|
||||||
const md5 = require('md5');
|
const md5 = require('md5');
|
||||||
import * as locker from 'proper-lockfile';
|
import * as locker from 'proper-lockfile';
|
||||||
import { pathExists, writeFile } from 'fs-extra';
|
import { pathExists, writeFile } from 'fs-extra';
|
||||||
|
import { checkIfLoginWasSuccessful, generateApplicationConfirmUrl } from '@joplin/lib/services/joplinCloudUtils';
|
||||||
|
import Logger from '@joplin/utils/Logger';
|
||||||
|
import { uuidgen } from '@joplin/lib/uuid';
|
||||||
|
|
||||||
|
const logger = Logger.create('command-sync');
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
|
|
||||||
private syncTargetId_: number = null;
|
private syncTargetId_: number = null;
|
||||||
// eslint-disable-next-line @typescript-eslint/ban-types -- Old code before rule was applied
|
// eslint-disable-next-line @typescript-eslint/ban-types -- Old code before rule was applied
|
||||||
private releaseLockFn_: Function = null;
|
private releaseLockFn_: Function = null;
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
private oneDriveApiUtils_: any = null;
|
private oneDriveApiUtils_: any = null;
|
||||||
|
|
||||||
public usage() {
|
public usage() {
|
||||||
@@ -54,6 +60,7 @@ class Command extends BaseCommand {
|
|||||||
// OneDrive
|
// OneDrive
|
||||||
this.oneDriveApiUtils_ = new OneDriveApiNodeUtils(syncTarget.api());
|
this.oneDriveApiUtils_ = new OneDriveApiNodeUtils(syncTarget.api());
|
||||||
const auth = await this.oneDriveApiUtils_.oauthDance({
|
const auth = await this.oneDriveApiUtils_.oauthDance({
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
log: (...s: any[]) => {
|
log: (...s: any[]) => {
|
||||||
return this.stdout(...s);
|
return this.stdout(...s);
|
||||||
},
|
},
|
||||||
@@ -84,9 +91,36 @@ class Command extends BaseCommand {
|
|||||||
Setting.setValue(`sync.${this.syncTargetId_}.auth`, response.access_token);
|
Setting.setValue(`sync.${this.syncTargetId_}.auth`, response.access_token);
|
||||||
api.setAuthToken(response.access_token);
|
api.setAuthToken(response.access_token);
|
||||||
return true;
|
return true;
|
||||||
|
} else if (syncTargetMd.name === 'joplinCloud') {
|
||||||
|
const applicationAuthId = uuidgen();
|
||||||
|
const checkForCredentials = async () => {
|
||||||
|
try {
|
||||||
|
const applicationAuthUrl = `${Setting.value('sync.10.path')}/api/application_auth/${applicationAuthId}`;
|
||||||
|
const response = await checkIfLoginWasSuccessful(applicationAuthUrl);
|
||||||
|
if (response && response.success) {
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
} catch (error) {
|
||||||
|
logger.error(error);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.stdout(_('To allow Joplin to synchronise with Joplin Cloud, please login using this URL:'));
|
||||||
|
|
||||||
|
const confirmUrl = `${Setting.value('sync.10.website')}/applications/${applicationAuthId}/confirm`;
|
||||||
|
const urlWithClient = await generateApplicationConfirmUrl(confirmUrl);
|
||||||
|
this.stdout(urlWithClient);
|
||||||
|
|
||||||
|
const authorized = await this.prompt(_('Have you authorised the application login in the above URL?'), { booleanAnswerDefault: 'y' });
|
||||||
|
if (!authorized) return false;
|
||||||
|
const result = await checkForCredentials();
|
||||||
|
if (!result) return false;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.stdout(_('Not authentified with %s. Please provide any missing credentials.', syncTargetMd.label));
|
this.stdout(_('Not authenticated with %s. Please provide any missing credentials.', syncTargetMd.label));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,6 +135,7 @@ class Command extends BaseCommand {
|
|||||||
return !!this.oneDriveApiUtils_;
|
return !!this.oneDriveApiUtils_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public async action(args: any) {
|
public async action(args: any) {
|
||||||
this.releaseLockFn_ = null;
|
this.releaseLockFn_ = null;
|
||||||
|
|
||||||
@@ -149,7 +184,9 @@ class Command extends BaseCommand {
|
|||||||
|
|
||||||
const sync = await syncTarget.synchronizer();
|
const sync = await syncTarget.synchronizer();
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
const options: any = {
|
const options: any = {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
onProgress: (report: any) => {
|
onProgress: (report: any) => {
|
||||||
const lines = Synchronizer.reportToLines(report);
|
const lines = Synchronizer.reportToLines(report);
|
||||||
if (lines.length) cliUtils.redraw(lines.join(' '));
|
if (lines.length) cliUtils.redraw(lines.join(' '));
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
const BaseCommand = require('./base-command').default;
|
const BaseCommand = require('./base-command').default;
|
||||||
const { app } = require('./app.js');
|
const app = require('./app').default;
|
||||||
const { _ } = require('@joplin/lib/locale');
|
const { _ } = require('@joplin/lib/locale');
|
||||||
const Tag = require('@joplin/lib/models/Tag').default;
|
const Tag = require('@joplin/lib/models/Tag').default;
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
const BaseModel = require('@joplin/lib/BaseModel').default;
|
||||||
|
@@ -6,11 +6,13 @@ import populateDatabase from '@joplin/lib/services/debug/populateDatabase';
|
|||||||
import { readCredentialFile } from '@joplin/lib/utils/credentialFiles';
|
import { readCredentialFile } from '@joplin/lib/utils/credentialFiles';
|
||||||
import JoplinServerApi from '@joplin/lib/JoplinServerApi';
|
import JoplinServerApi from '@joplin/lib/JoplinServerApi';
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
function randomElement(array: any[]): any {
|
function randomElement(array: any[]): any {
|
||||||
if (!array.length) return null;
|
if (!array.length) return null;
|
||||||
return array[Math.floor(Math.random() * array.length)];
|
return array[Math.floor(Math.random() * array.length)];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
function itemCount(args: any) {
|
function itemCount(args: any) {
|
||||||
const count = Number(args.arg0);
|
const count = Number(args.arg0);
|
||||||
if (!count || isNaN(count)) throw new Error('Note count must be specified');
|
if (!count || isNaN(count)) throw new Error('Note count must be specified');
|
||||||
@@ -30,6 +32,7 @@ class Command extends BaseCommand {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public options(): any[] {
|
public options(): any[] {
|
||||||
return [
|
return [
|
||||||
['--folder-count <count>', 'Folders to create'],
|
['--folder-count <count>', 'Folders to create'],
|
||||||
@@ -40,6 +43,7 @@ class Command extends BaseCommand {
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public async action(args: any) {
|
public async action(args: any) {
|
||||||
const { command, options } = args;
|
const { command, options } = args;
|
||||||
|
|
||||||
@@ -53,6 +57,7 @@ class Command extends BaseCommand {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
const promises: any[] = [];
|
const promises: any[] = [];
|
||||||
|
|
||||||
if (command === 'createRandomNotes') {
|
if (command === 'createRandomNotes') {
|
||||||
@@ -85,7 +90,7 @@ class Command extends BaseCommand {
|
|||||||
|
|
||||||
for (let i = 0; i < noteCount; i++) {
|
for (let i = 0; i < noteCount; i++) {
|
||||||
const noteId = randomElement(noteIds);
|
const noteId = randomElement(noteIds);
|
||||||
promises.push(Note.delete(noteId));
|
promises.push(Note.delete(noteId, { sourceDescription: 'command-testing' }));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
const BaseCommand = require('./base-command').default;
|
const BaseCommand = require('./base-command').default;
|
||||||
const { app } = require('./app.js');
|
const app = require('./app').default;
|
||||||
const { _ } = require('@joplin/lib/locale');
|
const { _ } = require('@joplin/lib/locale');
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
const BaseModel = require('@joplin/lib/BaseModel').default;
|
||||||
const Note = require('@joplin/lib/models/Note').default;
|
const Note = require('@joplin/lib/models/Note').default;
|
||||||
|
@@ -1,22 +1,23 @@
|
|||||||
const BaseCommand = require('./base-command').default;
|
import BaseCommand from './base-command';
|
||||||
const { app } = require('./app.js');
|
import app from './app';
|
||||||
const { _ } = require('@joplin/lib/locale');
|
import { _ } from '@joplin/lib/locale';
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
import BaseModel from '@joplin/lib/BaseModel';
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
usage() {
|
public override usage() {
|
||||||
return 'use <notebook>';
|
return 'use <notebook>';
|
||||||
}
|
}
|
||||||
|
|
||||||
description() {
|
public override description() {
|
||||||
return _('Switches to [notebook] - all further operations will happen within this notebook.');
|
return _('Switches to [notebook] - all further operations will happen within this notebook.');
|
||||||
}
|
}
|
||||||
|
|
||||||
compatibleUis() {
|
public override compatibleUis() {
|
||||||
return ['cli'];
|
return ['cli'];
|
||||||
}
|
}
|
||||||
|
|
||||||
async action(args) {
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
public override async action(args: any) {
|
||||||
const folder = await app().loadItem(BaseModel.TYPE_FOLDER, args['notebook']);
|
const folder = await app().loadItem(BaseModel.TYPE_FOLDER, args['notebook']);
|
||||||
if (!folder) throw new Error(_('Cannot find "%s".', args['notebook']));
|
if (!folder) throw new Error(_('Cannot find "%s".', args['notebook']));
|
||||||
app().switchCurrentFolder(folder);
|
app().switchCurrentFolder(folder);
|
@@ -1,17 +1,17 @@
|
|||||||
const BaseCommand = require('./base-command').default;
|
import BaseCommand from './base-command';
|
||||||
const { _ } = require('@joplin/lib/locale');
|
const { _ } = require('@joplin/lib/locale');
|
||||||
const versionInfo = require('@joplin/lib/versionInfo').default;
|
const versionInfo = require('@joplin/lib/versionInfo').default;
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
usage() {
|
public override usage() {
|
||||||
return 'version';
|
return 'version';
|
||||||
}
|
}
|
||||||
|
|
||||||
description() {
|
public override description() {
|
||||||
return _('Displays version information');
|
return _('Displays version information');
|
||||||
}
|
}
|
||||||
|
|
||||||
async action() {
|
public override async action() {
|
||||||
this.stdout(versionInfo(require('./package.json'), {}).message);
|
this.stdout(versionInfo(require('./package.json'), {}).message);
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -1,16 +1,20 @@
|
|||||||
const Folder = require('@joplin/lib/models/Folder').default;
|
import Folder from '@joplin/lib/models/Folder';
|
||||||
const Tag = require('@joplin/lib/models/Tag').default;
|
import Tag from '@joplin/lib/models/Tag';
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
import BaseModel from '@joplin/lib/BaseModel';
|
||||||
|
import Setting from '@joplin/lib/models/Setting';
|
||||||
|
import { _ } from '@joplin/lib/locale';
|
||||||
|
import { FolderEntity } from '@joplin/lib/services/database/types';
|
||||||
|
import { getDisplayParentId, getTrashFolderId } from '@joplin/lib/services/trash';
|
||||||
const ListWidget = require('tkwidgets/ListWidget.js');
|
const ListWidget = require('tkwidgets/ListWidget.js');
|
||||||
const Setting = require('@joplin/lib/models/Setting').default;
|
|
||||||
const _ = require('@joplin/lib/locale')._;
|
|
||||||
|
|
||||||
class FolderListWidget extends ListWidget {
|
export default class FolderListWidget extends ListWidget {
|
||||||
constructor() {
|
|
||||||
|
private folders_: FolderEntity[] = [];
|
||||||
|
|
||||||
|
public constructor() {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
this.tags_ = [];
|
this.tags_ = [];
|
||||||
this.folders_ = [];
|
|
||||||
this.searches_ = [];
|
this.searches_ = [];
|
||||||
this.selectedFolderId_ = null;
|
this.selectedFolderId_ = null;
|
||||||
this.selectedTagId_ = null;
|
this.selectedTagId_ = null;
|
||||||
@@ -21,7 +25,8 @@ class FolderListWidget extends ListWidget {
|
|||||||
this.trimItemTitle = false;
|
this.trimItemTitle = false;
|
||||||
this.showIds = false;
|
this.showIds = false;
|
||||||
|
|
||||||
this.itemRenderer = item => {
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
this.itemRenderer = (item: any) => {
|
||||||
const output = [];
|
const output = [];
|
||||||
if (item === '-') {
|
if (item === '-') {
|
||||||
output.push('-'.repeat(this.innerWidth));
|
output.push('-'.repeat(this.innerWidth));
|
||||||
@@ -33,13 +38,13 @@ class FolderListWidget extends ListWidget {
|
|||||||
}
|
}
|
||||||
output.push(Folder.displayTitle(item));
|
output.push(Folder.displayTitle(item));
|
||||||
|
|
||||||
if (Setting.value('showNoteCounts')) {
|
if (Setting.value('showNoteCounts') && !item.deleted_time && item.id !== getTrashFolderId()) {
|
||||||
let noteCount = item.note_count;
|
let noteCount = item.note_count;
|
||||||
// Subtract children note_count from parent folder.
|
|
||||||
if (this.folderHasChildren_(this.folders, item.id)) {
|
if (this.folderHasChildren_(this.folders, item.id)) {
|
||||||
for (let i = 0; i < this.folders.length; i++) {
|
for (let i = 0; i < this.folders.length; i++) {
|
||||||
if (this.folders[i].parent_id === item.id) {
|
if (this.folders[i].parent_id === item.id) {
|
||||||
noteCount -= this.folders[i].note_count;
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
noteCount -= (this.folders[i] as any).note_count;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -56,113 +61,122 @@ class FolderListWidget extends ListWidget {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
folderDepth(folders, folderId) {
|
public folderDepth(folders: FolderEntity[], folderId: string) {
|
||||||
let output = 0;
|
let output = 0;
|
||||||
while (true) {
|
while (true) {
|
||||||
const folder = BaseModel.byId(folders, folderId);
|
const folder = BaseModel.byId(folders, folderId);
|
||||||
if (!folder || !folder.parent_id) return output;
|
const folderParentId = getDisplayParentId(folder, folders.find(f => f.id === folder.parent_id));
|
||||||
|
if (!folder || !folderParentId) return output;
|
||||||
output++;
|
output++;
|
||||||
folderId = folder.parent_id;
|
folderId = folderParentId;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
get selectedFolderId() {
|
public get selectedFolderId() {
|
||||||
return this.selectedFolderId_;
|
return this.selectedFolderId_;
|
||||||
}
|
}
|
||||||
|
|
||||||
set selectedFolderId(v) {
|
public set selectedFolderId(v) {
|
||||||
this.selectedFolderId_ = v;
|
this.selectedFolderId_ = v;
|
||||||
this.updateIndexFromSelectedItemId();
|
this.updateIndexFromSelectedItemId();
|
||||||
this.invalidate();
|
this.invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
get selectedSearchId() {
|
public get selectedSearchId() {
|
||||||
return this.selectedSearchId_;
|
return this.selectedSearchId_;
|
||||||
}
|
}
|
||||||
|
|
||||||
set selectedSearchId(v) {
|
public set selectedSearchId(v) {
|
||||||
this.selectedSearchId_ = v;
|
this.selectedSearchId_ = v;
|
||||||
this.updateIndexFromSelectedItemId();
|
this.updateIndexFromSelectedItemId();
|
||||||
this.invalidate();
|
this.invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
get selectedTagId() {
|
public get selectedTagId() {
|
||||||
return this.selectedTagId_;
|
return this.selectedTagId_;
|
||||||
}
|
}
|
||||||
|
|
||||||
set selectedTagId(v) {
|
public set selectedTagId(v) {
|
||||||
this.selectedTagId_ = v;
|
this.selectedTagId_ = v;
|
||||||
this.updateIndexFromSelectedItemId();
|
this.updateIndexFromSelectedItemId();
|
||||||
this.invalidate();
|
this.invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
get notesParentType() {
|
public get notesParentType() {
|
||||||
return this.notesParentType_;
|
return this.notesParentType_;
|
||||||
}
|
}
|
||||||
|
|
||||||
set notesParentType(v) {
|
public set notesParentType(v) {
|
||||||
this.notesParentType_ = v;
|
this.notesParentType_ = v;
|
||||||
this.updateIndexFromSelectedItemId();
|
this.updateIndexFromSelectedItemId();
|
||||||
this.invalidate();
|
this.invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
get searches() {
|
public get searches() {
|
||||||
return this.searches_;
|
return this.searches_;
|
||||||
}
|
}
|
||||||
|
|
||||||
set searches(v) {
|
public set searches(v) {
|
||||||
this.searches_ = v;
|
this.searches_ = v;
|
||||||
this.updateItems_ = true;
|
this.updateItems_ = true;
|
||||||
this.updateIndexFromSelectedItemId();
|
this.updateIndexFromSelectedItemId();
|
||||||
this.invalidate();
|
this.invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
get tags() {
|
public get tags() {
|
||||||
return this.tags_;
|
return this.tags_;
|
||||||
}
|
}
|
||||||
|
|
||||||
set tags(v) {
|
public set tags(v) {
|
||||||
this.tags_ = v;
|
this.tags_ = v;
|
||||||
this.updateItems_ = true;
|
this.updateItems_ = true;
|
||||||
this.updateIndexFromSelectedItemId();
|
this.updateIndexFromSelectedItemId();
|
||||||
this.invalidate();
|
this.invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
get folders() {
|
public get folders() {
|
||||||
return this.folders_;
|
return this.folders_;
|
||||||
}
|
}
|
||||||
|
|
||||||
set folders(v) {
|
public set folders(v) {
|
||||||
this.folders_ = v;
|
this.folders_ = v;
|
||||||
this.updateItems_ = true;
|
this.updateItems_ = true;
|
||||||
this.updateIndexFromSelectedItemId();
|
this.updateIndexFromSelectedItemId();
|
||||||
this.invalidate();
|
this.invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
toggleShowIds() {
|
public toggleShowIds() {
|
||||||
this.showIds = !this.showIds;
|
this.showIds = !this.showIds;
|
||||||
this.invalidate();
|
this.invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
folderHasChildren_(folders, folderId) {
|
public folderHasChildren_(folders: FolderEntity[], folderId: string) {
|
||||||
for (let i = 0; i < folders.length; i++) {
|
for (let i = 0; i < folders.length; i++) {
|
||||||
const folder = folders[i];
|
const folder = folders[i];
|
||||||
if (folder.parent_id === folderId) return true;
|
const folderParentId = getDisplayParentId(folder, folders.find(f => f.id === folder.parent_id));
|
||||||
|
if (folderParentId === folderId) return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
public render() {
|
||||||
if (this.updateItems_) {
|
if (this.updateItems_) {
|
||||||
this.logger().debug('Rebuilding items...', this.notesParentType, this.selectedJoplinItemId, this.selectedSearchId);
|
this.logger().debug('Rebuilding items...', this.notesParentType, this.selectedJoplinItemId, this.selectedSearchId);
|
||||||
const wasSelectedItemId = this.selectedJoplinItemId;
|
const wasSelectedItemId = this.selectedJoplinItemId;
|
||||||
const previousParentType = this.notesParentType;
|
const previousParentType = this.notesParentType;
|
||||||
|
|
||||||
let newItems = [];
|
this.logger().info('FFFFFFFFFFFFF', JSON.stringify(this.folders, null, 4));
|
||||||
const orderFolders = parentId => {
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
|
let newItems: any[] = [];
|
||||||
|
const orderFolders = (parentId: string) => {
|
||||||
|
this.logger().info('PARENT', parentId);
|
||||||
for (let i = 0; i < this.folders.length; i++) {
|
for (let i = 0; i < this.folders.length; i++) {
|
||||||
const f = this.folders[i];
|
const f = this.folders[i];
|
||||||
const folderParentId = f.parent_id ? f.parent_id : '';
|
const originalParent = this.folders_.find(f => f.id === f.parent_id);
|
||||||
|
|
||||||
|
const folderParentId = getDisplayParentId(f, originalParent); // f.parent_id ? f.parent_id : '';
|
||||||
|
this.logger().info('FFF', f.title, folderParentId);
|
||||||
if (folderParentId === parentId) {
|
if (folderParentId === parentId) {
|
||||||
newItems.push(f);
|
newItems.push(f);
|
||||||
if (this.folderHasChildren_(this.folders, f.id)) orderFolders(f.id);
|
if (this.folderHasChildren_(this.folders, f.id)) orderFolders(f.id);
|
||||||
@@ -192,7 +206,7 @@ class FolderListWidget extends ListWidget {
|
|||||||
super.render();
|
super.render();
|
||||||
}
|
}
|
||||||
|
|
||||||
get selectedJoplinItemId() {
|
public get selectedJoplinItemId() {
|
||||||
if (!this.notesParentType) return '';
|
if (!this.notesParentType) return '';
|
||||||
if (this.notesParentType === 'Folder') return this.selectedFolderId;
|
if (this.notesParentType === 'Folder') return this.selectedFolderId;
|
||||||
if (this.notesParentType === 'Tag') return this.selectedTagId;
|
if (this.notesParentType === 'Tag') return this.selectedTagId;
|
||||||
@@ -200,17 +214,15 @@ class FolderListWidget extends ListWidget {
|
|||||||
throw new Error(`Unknown parent type: ${this.notesParentType}`);
|
throw new Error(`Unknown parent type: ${this.notesParentType}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
get selectedJoplinItem() {
|
public get selectedJoplinItem() {
|
||||||
const id = this.selectedJoplinItemId;
|
const id = this.selectedJoplinItemId;
|
||||||
const index = this.itemIndexByKey('id', id);
|
const index = this.itemIndexByKey('id', id);
|
||||||
return this.itemAt(index);
|
return this.itemAt(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
updateIndexFromSelectedItemId(itemId = null) {
|
public updateIndexFromSelectedItemId(itemId: string = null) {
|
||||||
if (itemId === null) itemId = this.selectedJoplinItemId;
|
if (itemId === null) itemId = this.selectedJoplinItemId;
|
||||||
const index = this.itemIndexByKey('id', itemId);
|
const index = this.itemIndexByKey('id', itemId);
|
||||||
this.currentIndex = index >= 0 ? index : 0;
|
this.currentIndex = index >= 0 ? index : 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = FolderListWidget;
|
|
@@ -27,6 +27,7 @@ export default class StatusBarWidget extends BaseWidget {
|
|||||||
this.invalidate();
|
this.invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public async prompt(initialText = '', promptString: any = null, options: any = null) {
|
public async prompt(initialText = '', promptString: any = null, options: any = null) {
|
||||||
if (this.promptState_) throw new Error('Another prompt already active');
|
if (this.promptState_) throw new Error('Another prompt already active');
|
||||||
if (promptString === null) promptString = ':';
|
if (promptString === null) promptString = ':';
|
||||||
@@ -86,6 +87,7 @@ export default class StatusBarWidget extends BaseWidget {
|
|||||||
|
|
||||||
// const textStyle = this.promptActive ? (s) => s : chalk.bgBlueBright.white;
|
// const textStyle = this.promptActive ? (s) => s : chalk.bgBlueBright.white;
|
||||||
// const textStyle = (s) => s;
|
// const textStyle = (s) => s;
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
const textStyle = this.promptActive ? (s: any) => s : chalk.gray;
|
const textStyle = this.promptActive ? (s: any) => s : chalk.gray;
|
||||||
|
|
||||||
this.term.drawHLine(this.absoluteInnerX, this.absoluteInnerY, this.innerWidth, textStyle(' '));
|
this.term.drawHLine(this.absoluteInnerX, this.absoluteInnerY, this.innerWidth, textStyle(' '));
|
||||||
@@ -106,6 +108,7 @@ export default class StatusBarWidget extends BaseWidget {
|
|||||||
|
|
||||||
const isSecurePrompt = !!this.promptState_.secure;
|
const isSecurePrompt = !!this.promptState_.secure;
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
const options: any = {
|
const options: any = {
|
||||||
cancelable: true,
|
cancelable: true,
|
||||||
history: this.history,
|
history: this.history,
|
||||||
@@ -118,6 +121,7 @@ export default class StatusBarWidget extends BaseWidget {
|
|||||||
if ('cursorPosition' in this.promptState_) options.cursorPosition = this.promptState_.cursorPosition;
|
if ('cursorPosition' in this.promptState_) options.cursorPosition = this.promptState_.cursorPosition;
|
||||||
if (isSecurePrompt) options.echoChar = true;
|
if (isSecurePrompt) options.echoChar = true;
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
this.inputEventEmitter_ = this.term.inputField(options, (error: any, input: any) => {
|
this.inputEventEmitter_ = this.term.inputField(options, (error: any, input: any) => {
|
||||||
let resolveResult = null;
|
let resolveResult = null;
|
||||||
const resolveFn = this.promptState_.resolve;
|
const resolveFn = this.promptState_.resolve;
|
||||||
|
@@ -10,7 +10,7 @@ if (compareVersion(nodeVersion, '10.0.0') < 0) {
|
|||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
const { app } = require('./app.js');
|
const app = require('./app').default;
|
||||||
const Folder = require('@joplin/lib/models/Folder').default;
|
const Folder = require('@joplin/lib/models/Folder').default;
|
||||||
const Resource = require('@joplin/lib/models/Resource').default;
|
const Resource = require('@joplin/lib/models/Resource').default;
|
||||||
const BaseItem = require('@joplin/lib/models/BaseItem').default;
|
const BaseItem = require('@joplin/lib/models/BaseItem').default;
|
||||||
|
@@ -8,14 +8,17 @@ import uuid from '@joplin/lib/uuid';
|
|||||||
const sandboxProxy = require('@joplin/lib/services/plugins/sandboxProxy');
|
const sandboxProxy = require('@joplin/lib/services/plugins/sandboxProxy');
|
||||||
|
|
||||||
function createConsoleWrapper(pluginId: string) {
|
function createConsoleWrapper(pluginId: string) {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
const wrapper: any = {};
|
const wrapper: any = {};
|
||||||
|
|
||||||
for (const n in console) {
|
for (const n in console) {
|
||||||
// eslint-disable-next-line no-console
|
// eslint-disable-next-line no-console
|
||||||
if (!console.hasOwnProperty(n)) continue;
|
if (!console.hasOwnProperty(n)) continue;
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
wrapper[n] = (...args: any[]) => {
|
wrapper[n] = (...args: any[]) => {
|
||||||
const newArgs = args.slice();
|
const newArgs = args.slice();
|
||||||
newArgs.splice(0, 0, `Plugin "${pluginId}":`);
|
newArgs.splice(0, 0, `Plugin "${pluginId}":`);
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
return (console as any)[n](...newArgs);
|
return (console as any)[n](...newArgs);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -33,6 +36,7 @@ function createConsoleWrapper(pluginId: string) {
|
|||||||
export default class PluginRunner extends BasePluginRunner {
|
export default class PluginRunner extends BasePluginRunner {
|
||||||
|
|
||||||
private eventHandlers_: EventHandlers = {};
|
private eventHandlers_: EventHandlers = {};
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
private activeSandboxCalls_: any = {};
|
private activeSandboxCalls_: any = {};
|
||||||
|
|
||||||
public constructor() {
|
public constructor() {
|
||||||
@@ -41,12 +45,14 @@ export default class PluginRunner extends BasePluginRunner {
|
|||||||
this.eventHandler = this.eventHandler.bind(this);
|
this.eventHandler = this.eventHandler.bind(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
private async eventHandler(eventHandlerId: string, args: any[]) {
|
private async eventHandler(eventHandlerId: string, args: any[]) {
|
||||||
const cb = this.eventHandlers_[eventHandlerId];
|
const cb = this.eventHandlers_[eventHandlerId];
|
||||||
return cb(...args);
|
return cb(...args);
|
||||||
}
|
}
|
||||||
|
|
||||||
private newSandboxProxy(pluginId: string, sandbox: Global) {
|
private newSandboxProxy(pluginId: string, sandbox: Global) {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
const target = async (path: string, args: any[]) => {
|
const target = async (path: string, args: any[]) => {
|
||||||
const callId = `${pluginId}::${path}::${uuid.createNano()}`;
|
const callId = `${pluginId}::${path}::${uuid.createNano()}`;
|
||||||
this.activeSandboxCalls_[callId] = true;
|
this.activeSandboxCalls_[callId] = true;
|
||||||
|
@@ -1,11 +1,12 @@
|
|||||||
import { _ } from '@joplin/lib/locale';
|
import { _ } from '@joplin/lib/locale';
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/ban-types -- Old code before rule was applied
|
// eslint-disable-next-line @typescript-eslint/ban-types, @typescript-eslint/no-explicit-any -- Old code before rule was applied, Old code before rule was applied
|
||||||
export default (cmd: any, stdout: Function, store: Function, gui: Function) => {
|
export default (cmd: any, stdout: Function, store: Function, gui: Function) => {
|
||||||
cmd.setStdout((text: string) => {
|
cmd.setStdout((text: string) => {
|
||||||
return stdout(text);
|
return stdout(text);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
cmd.setDispatcher((action: any) => {
|
cmd.setDispatcher((action: any) => {
|
||||||
if (store()) {
|
if (store()) {
|
||||||
return store().dispatch(action);
|
return store().dispatch(action);
|
||||||
@@ -14,6 +15,7 @@ export default (cmd: any, stdout: Function, store: Function, gui: Function) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
cmd.setPrompt(async (message: string, options: any) => {
|
cmd.setPrompt(async (message: string, options: any) => {
|
||||||
if (!options) options = {};
|
if (!options) options = {};
|
||||||
if (!options.type) options.type = 'boolean';
|
if (!options.type) options.type = 'boolean';
|
||||||
|
@@ -1,9 +1,9 @@
|
|||||||
const { app } = require('../app');
|
import app from '../app';
|
||||||
import Folder from '@joplin/lib/models/Folder';
|
import Folder from '@joplin/lib/models/Folder';
|
||||||
import BaseCommand from '../base-command';
|
import BaseCommand from '../base-command';
|
||||||
import setupCommand from '../setupCommand';
|
import setupCommand from '../setupCommand';
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/ban-types -- Old code before rule was applied
|
// eslint-disable-next-line @typescript-eslint/ban-types, @typescript-eslint/no-explicit-any -- Old code before rule was applied, Old code before rule was applied
|
||||||
export const setupCommandForTesting = (CommandClass: any, stdout: Function = null): BaseCommand => {
|
export const setupCommandForTesting = (CommandClass: any, stdout: Function = null): BaseCommand => {
|
||||||
const command = new CommandClass();
|
const command = new CommandClass();
|
||||||
setupCommand(command, stdout, null, null);
|
setupCommand(command, stdout, null, null);
|
||||||
|
@@ -1,3 +1,3 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -e
|
set -e
|
||||||
yarn run build && NODE_PATH=build node build/build-doc.js
|
yarn build && NODE_PATH=build node build/build-doc.js
|
@@ -1,3 +1,3 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -e
|
set -e
|
||||||
yarn run build && NODE_PATH="build/" node build/cli-integration-tests.js
|
yarn build && NODE_PATH="build/" node build/cli-integration-tests.js
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
# Start the server with:
|
# Start the server with:
|
||||||
#
|
#
|
||||||
# JOPLIN_IS_TESTING=1 yarn run start-dev
|
# JOPLIN_IS_TESTING=1 yarn start-dev
|
||||||
|
|
||||||
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
|
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
set -e
|
set -e
|
||||||
yarn run build && NODE_PATH="build/" node build/fuzzing.js
|
yarn build && NODE_PATH="build/" node build/fuzzing.js
|
@@ -35,19 +35,19 @@
|
|||||||
],
|
],
|
||||||
"owner": "Laurent Cozic"
|
"owner": "Laurent Cozic"
|
||||||
},
|
},
|
||||||
"version": "2.14.0",
|
"version": "3.0.0",
|
||||||
"bin": "./main.js",
|
"bin": "./main.js",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=10.0.0"
|
"node": ">=10.0.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@joplin/lib": "~2.14",
|
"@joplin/lib": "~3.0",
|
||||||
"@joplin/renderer": "~2.14",
|
"@joplin/renderer": "~3.0",
|
||||||
"@joplin/utils": "~2.14",
|
"@joplin/utils": "~3.0",
|
||||||
"aws-sdk": "2.1340.0",
|
"aws-sdk": "2.1340.0",
|
||||||
"chalk": "4.1.2",
|
"chalk": "4.1.2",
|
||||||
"compare-version": "0.1.2",
|
"compare-version": "0.1.2",
|
||||||
"fs-extra": "11.1.1",
|
"fs-extra": "11.2.0",
|
||||||
"html-entities": "1.4.0",
|
"html-entities": "1.4.0",
|
||||||
"image-type": "3.1.0",
|
"image-type": "3.1.0",
|
||||||
"keytar": "7.9.0",
|
"keytar": "7.9.0",
|
||||||
@@ -57,7 +57,7 @@
|
|||||||
"proper-lockfile": "4.1.2",
|
"proper-lockfile": "4.1.2",
|
||||||
"read-chunk": "2.1.0",
|
"read-chunk": "2.1.0",
|
||||||
"server-destroy": "1.0.1",
|
"server-destroy": "1.0.1",
|
||||||
"sharp": "0.33.0",
|
"sharp": "0.33.2",
|
||||||
"sprintf-js": "1.1.3",
|
"sprintf-js": "1.1.3",
|
||||||
"sqlite3": "5.1.6",
|
"sqlite3": "5.1.6",
|
||||||
"string-padding": "1.0.2",
|
"string-padding": "1.0.2",
|
||||||
@@ -70,10 +70,10 @@
|
|||||||
"yargs-parser": "21.1.1"
|
"yargs-parser": "21.1.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@joplin/tools": "~2.14",
|
"@joplin/tools": "~3.0",
|
||||||
"@types/fs-extra": "11.0.4",
|
"@types/fs-extra": "11.0.4",
|
||||||
"@types/jest": "29.5.8",
|
"@types/jest": "29.5.8",
|
||||||
"@types/node": "18.18.13",
|
"@types/node": "18.19.8",
|
||||||
"@types/proper-lockfile": "^4.1.2",
|
"@types/proper-lockfile": "^4.1.2",
|
||||||
"gulp": "4.0.2",
|
"gulp": "4.0.2",
|
||||||
"jest": "29.7.0",
|
"jest": "29.7.0",
|
||||||
|
@@ -22,6 +22,7 @@ describe('HtmlToMd', () => {
|
|||||||
|
|
||||||
// if (htmlFilename.indexOf('image_preserve_size') !== 0) continue;
|
// if (htmlFilename.indexOf('image_preserve_size') !== 0) continue;
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
const htmlToMdOptions: any = {};
|
const htmlToMdOptions: any = {};
|
||||||
|
|
||||||
if (htmlFilename === 'anchor_local.html') {
|
if (htmlFilename === 'anchor_local.html') {
|
||||||
@@ -40,6 +41,10 @@ describe('HtmlToMd', () => {
|
|||||||
htmlToMdOptions.preserveNestedTables = true;
|
htmlToMdOptions.preserveNestedTables = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (htmlFilename.indexOf('text_color') === 0) {
|
||||||
|
htmlToMdOptions.preserveColorStyles = true;
|
||||||
|
}
|
||||||
|
|
||||||
const html = await readFile(htmlPath, 'utf8');
|
const html = await readFile(htmlPath, 'utf8');
|
||||||
let expectedMd = await readFile(mdPath, 'utf8');
|
let expectedMd = await readFile(mdPath, 'utf8');
|
||||||
|
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
|
|
||||||
import MarkupToHtml, { MarkupLanguage, RenderResult } from '@joplin/renderer/MarkupToHtml';
|
import MarkupToHtml, { MarkupLanguage } from '@joplin/renderer/MarkupToHtml';
|
||||||
|
import { RenderResult } from '@joplin/renderer/types';
|
||||||
|
|
||||||
describe('MarkupToHtml', () => {
|
describe('MarkupToHtml', () => {
|
||||||
|
|
||||||
|
@@ -4,6 +4,7 @@ import { setupDatabaseAndSynchronizer, switchClient } from '@joplin/lib/testing/
|
|||||||
import shim from '@joplin/lib/shim';
|
import shim from '@joplin/lib/shim';
|
||||||
const { themeStyle } = require('@joplin/lib/theme');
|
const { themeStyle } = require('@joplin/lib/theme');
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
function newTestMdToHtml(options: any = null) {
|
function newTestMdToHtml(options: any = null) {
|
||||||
options = {
|
options = {
|
||||||
ResourceModel: {
|
ResourceModel: {
|
||||||
@@ -37,6 +38,7 @@ describe('MdToHtml', () => {
|
|||||||
|
|
||||||
// if (mdFilename !== 'sanitize_9.md') continue;
|
// if (mdFilename !== 'sanitize_9.md') continue;
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
const mdToHtmlOptions: any = {
|
const mdToHtmlOptions: any = {
|
||||||
bodyOnly: true,
|
bodyOnly: true,
|
||||||
};
|
};
|
||||||
@@ -86,6 +88,7 @@ describe('MdToHtml', () => {
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
it('should return enabled plugin assets', (async () => {
|
it('should return enabled plugin assets', (async () => {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
const pluginOptions: any = {};
|
const pluginOptions: any = {};
|
||||||
const pluginNames = MdToHtml.pluginNames();
|
const pluginNames = MdToHtml.pluginNames();
|
||||||
|
|
||||||
|
73
packages/app-cli/tests/enex_to_md/linked_notes.enex
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE en-export SYSTEM "http://xml.evernote.com/pub/evernote-export4.dtd">
|
||||||
|
<en-export export-date="20231224T151504Z" application="Evernote" version="10.68.2">
|
||||||
|
<note>
|
||||||
|
<title>Note 1</title>
|
||||||
|
<created>20160730T164129Z</created>
|
||||||
|
<updated>20231224T151443Z</updated>
|
||||||
|
<content>
|
||||||
|
<![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd"><en-note><div><a href="evernote:///view/5223870/s49/9cd5e810-fa03-429a-8194-ab847f2f1ab2/c99d9e01-ca35-4c75-ba63-f0c0ef97787d/">Note 2</a><a href="evernote:///view/5223870/s49/9cd5e810-fa03-429a-8194-ab847f2f1ab2/c99d9e01-ca35-4c75-ba63-f0c0ef97787d/">Note 3</a></div></en-note> ]]>
|
||||||
|
</content>
|
||||||
|
</note>
|
||||||
|
|
||||||
|
<note>
|
||||||
|
<title>Note 2</title>
|
||||||
|
<created>20160730T111759Z</created>
|
||||||
|
<updated>20160730T111807Z</updated>
|
||||||
|
<content>
|
||||||
|
<![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd"><en-note><div>Testing</div></en-note> ]]>
|
||||||
|
</content>
|
||||||
|
</note>
|
||||||
|
|
||||||
|
<note>
|
||||||
|
<title>Note 3</title>
|
||||||
|
<created>20160730T111759Z</created>
|
||||||
|
<updated>20160730T111807Z</updated>
|
||||||
|
<content>
|
||||||
|
<![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd"><en-note><div><a href="evernote:///view/5223870/s49/9cd5e810-fa03-429a-8194-ab847f2f1ab2/c99d9e01-ca35-4c75-ba63-f0c0ef97787d/">Ambiguous note</a></div></en-note> ]]>
|
||||||
|
</content>
|
||||||
|
</note>
|
||||||
|
|
||||||
|
<note>
|
||||||
|
<title>Note 4</title>
|
||||||
|
<created>20160730T111759Z</created>
|
||||||
|
<updated>20160730T111807Z</updated>
|
||||||
|
<content>
|
||||||
|
<![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd"><en-note><div><a href="https://joplinapp.org">Note 5</a></div></en-note> ]]>
|
||||||
|
</content>
|
||||||
|
</note>
|
||||||
|
|
||||||
|
<note>
|
||||||
|
<title>Note 5</title>
|
||||||
|
<created>20160730T111759Z</created>
|
||||||
|
<updated>20160730T111807Z</updated>
|
||||||
|
<content>
|
||||||
|
<![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd"><en-note><div></div></en-note> ]]>
|
||||||
|
</content>
|
||||||
|
</note>
|
||||||
|
|
||||||
|
<note>
|
||||||
|
<title>Ambiguous note</title>
|
||||||
|
<created>20160730T111759Z</created>
|
||||||
|
<updated>20160730T111807Z</updated>
|
||||||
|
<content>
|
||||||
|
<![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd"><en-note><div>Testing</div></en-note> ]]>
|
||||||
|
</content>
|
||||||
|
</note>
|
||||||
|
|
||||||
|
<note>
|
||||||
|
<title>Ambiguous note</title>
|
||||||
|
<created>20160730T111759Z</created>
|
||||||
|
<updated>20160730T111807Z</updated>
|
||||||
|
<content>
|
||||||
|
<![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd"><en-note><div>Testing</div></en-note> ]]>
|
||||||
|
</content>
|
||||||
|
</note>
|
||||||
|
</en-export>
|
@@ -1,4 +1,5 @@
|
|||||||
<table>
|
<table>
|
||||||
|
<div></div> <!-- INVALID! -->
|
||||||
<tr>
|
<tr>
|
||||||
<td>one</td>
|
<td>one</td>
|
||||||
<td>two</td>
|
<td>two</td>
|
||||||
|
@@ -0,0 +1,9 @@
|
|||||||
|
<p>
|
||||||
|
SVG image:
|
||||||
|
|
||||||
|
<img src="data:image/svg+xml;utf8,
|
||||||
|
<svg width="1700" height="1536" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="m0,0%20l100,1000%20l200,0%20z"/>
|
||||||
|
</svg>"/>
|
||||||
|
</p>
|
||||||
|
<p>PNG image: <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAR0lEQVQIW4XLMQoAIQwF0flpBEHwtOlUsPW6gZTushfYqd8IuHtvxhhI4pyD1lq3905EYGa01tB9m3N+IjNxd/S711oppfAAOjQiFPMurHkAAAAASUVORK5CYII="></p>
|
3
packages/app-cli/tests/html_to_md/image_utf8_data_url.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
SVG image: 
|
||||||
|
|
||||||
|
PNG image: 
|
@@ -1,10 +1,10 @@
|
|||||||
<body>
|
<body>
|
||||||
<table border="5px" bordercolor="#8707B0">
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Left side of the main table</td>
|
<td>Left side of the main table</td>
|
||||||
<td>
|
<td>
|
||||||
<table border="5px" bordercolor="#F35557">
|
<table>
|
||||||
<h4 align="center">Nested Table</h4>
|
<b>Nested Table</b>
|
||||||
<tr>
|
<tr>
|
||||||
<td>nested table C1</td>
|
<td>nested table C1</td>
|
||||||
<td>nested table C2</td>
|
<td>nested table C2</td>
|
||||||
|
@@ -1 +1 @@
|
|||||||
<table border="5px" bordercolor="#8707B0"><tbody><tr><td>Left side of the main table</td><td><h4 align="center">Nested Table</h4><table border="5px" bordercolor="#F35557"><tbody><tr><td>nested table C1</td><td>nested table C2</td></tr><tr><td>nested table</td><td>nested table</td></tr></tbody></table></td></tr></tbody></table>
|
<table><tbody><tr><td>Left side of the main table</td><td><b>Nested Table</b><table><tbody><tr><td>nested table C1</td><td>nested table C2</td></tr><tr><td>nested table</td><td>nested table</td></tr></tbody></table></td></tr></tbody></table>
|
15
packages/app-cli/tests/html_to_md/table_with_caption.html
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<table>
|
||||||
|
<caption>Caption</caption>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<th>Row 1, Column 1</th>
|
||||||
|
<th>Row 1, Column 2</th>
|
||||||
|
<th>Row 1, Column 3</th>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>Row 2, Column 1</th>
|
||||||
|
<td>Row 2, Column 2</td>
|
||||||
|
<td>Row 2, Column 3</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
6
packages/app-cli/tests/html_to_md/table_with_caption.md
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
Caption
|
||||||
|
|
||||||
|
| | | |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| Row 1, Column 1 | Row 1, Column 2 | Row 1, Column 3 |
|
||||||
|
| Row 2, Column 1 | Row 2, Column 2 | Row 2, Column 3 |
|
31
packages/app-cli/tests/html_to_md/table_with_code_3.html
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
<div id="rendered-md">
|
||||||
|
<table class="jop-noMdConv">
|
||||||
|
<thead class="jop-noMdConv">
|
||||||
|
<tr class="jop-noMdConv">
|
||||||
|
<th class="jop-noMdConv">Code</th>
|
||||||
|
<th class="jop-noMdConv">Description</th>
|
||||||
|
</tr>
|
||||||
|
<tr class="jop-noMdConv">
|
||||||
|
<td class="jop-noMdConv">
|
||||||
|
<pre class="jop-noMdConv"><code class="jop-noMdConv">const test = "hello";
|
||||||
|
|
||||||
|
// Another line
|
||||||
|
console.log('Test...');
|
||||||
|
|
||||||
|
// Blank lines
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Should not break things.</code></pre>
|
||||||
|
</td>
|
||||||
|
<td class="jop-noMdConv">abcda</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="jop-noMdConv">
|
||||||
|
<td class="jop-noMdConv">
|
||||||
|
<pre class="jop-noMdConv"><code class="jop-noMdConv">const test = "hello";</code></pre>
|
||||||
|
</td>
|
||||||
|
<td class="jop-noMdConv">abcd</td>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
</table>
|
||||||
|
</div>
|
10
packages/app-cli/tests/html_to_md/table_with_code_3.md
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<table class="jop-noMdConv"><thead class="jop-noMdConv"><tr class="jop-noMdConv"><th class="jop-noMdConv">Code</th><th class="jop-noMdConv">Description</th></tr><tr class="jop-noMdConv"><td class="jop-noMdConv"><pre class="jop-noMdConv"><code class="">const test = "hello";
|
||||||
|
<!-- -->
|
||||||
|
// Another line
|
||||||
|
console.log('Test...');
|
||||||
|
<!-- -->
|
||||||
|
// Blank lines
|
||||||
|
<!-- -->
|
||||||
|
<!-- -->
|
||||||
|
<!-- -->
|
||||||
|
// Should not break things.</code></pre></td><td class="jop-noMdConv">abcda</td></tr><tr class="jop-noMdConv"><td class="jop-noMdConv"><pre class="jop-noMdConv"><code class="">const test = "hello";</code></pre></td><td class="jop-noMdConv">abcd</td></tr></thead></table>
|
19
packages/app-cli/tests/html_to_md/table_with_colgroup.html
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<table>
|
||||||
|
<colgroup>
|
||||||
|
<col />
|
||||||
|
<col span="2" class="test" />
|
||||||
|
<col span="2" class="test2" />
|
||||||
|
</colgroup>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<th>Row 1, Column 1</th>
|
||||||
|
<th>Row 1, Column 2</th>
|
||||||
|
<th>Row 1, Column 3</th>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>Row 2, Column 1</th>
|
||||||
|
<td>Row 2, Column 2</td>
|
||||||
|
<td>Row 2, Column 3</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
4
packages/app-cli/tests/html_to_md/table_with_colgroup.md
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
| | | |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| Row 1, Column 1 | Row 1, Column 2 | Row 1, Column 3 |
|
||||||
|
| Row 2, Column 1 | Row 2, Column 2 | Row 2, Column 3 |
|
1
packages/app-cli/tests/html_to_md/text_color.html
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<p>Text <span style="color: #fff000;">Text</span></p>
|
1
packages/app-cli/tests/html_to_md/text_color.md
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Text <span style="color: #fff000;">Text</span>
|