You've already forked joplin
mirror of
https://github.com/laurent22/joplin.git
synced 2025-08-27 20:29:45 +02:00
Compare commits
444 Commits
android-v2
...
android-v3
Author | SHA1 | Date | |
---|---|---|---|
|
131ec9e913 | ||
|
e31ec031f4 | ||
|
431ce430a0 | ||
|
5cdc1e93b3 | ||
|
09216b8b59 | ||
|
1bb3632a70 | ||
|
03617eb8a7 | ||
|
034e568d26 | ||
|
a0faca0997 | ||
|
5268b5bf6b | ||
|
5b3f05f939 | ||
|
b1a669de01 | ||
|
a5f118bc26 | ||
|
10978781cd | ||
|
8bdec4c2b4 | ||
|
be58fced93 | ||
|
c5dfa4c055 | ||
|
74bc9b36aa | ||
|
993fbfb93f | ||
|
97b5276f81 | ||
|
c6c7de286a | ||
|
aec77b543c | ||
|
34b265475d | ||
|
4e95486c5c | ||
|
296b60800a | ||
|
332e19ce64 | ||
|
8984243020 | ||
|
65c47189f9 | ||
|
6aca77a0ae | ||
|
0670ad92d7 | ||
|
bce71a00e9 | ||
|
83b50aaa8e | ||
|
c7c4371902 | ||
|
4978a473a1 | ||
|
4d89d9f285 | ||
|
15770e9298 | ||
|
06797ec0ab | ||
|
b69bf84ab6 | ||
|
7ec02fc8d8 | ||
|
dd28c9f4d7 | ||
|
7fe98e9dc9 | ||
|
6358c39810 | ||
|
294cc4a440 | ||
|
ae1347bb7c | ||
|
b6d659baf2 | ||
|
5756e160da | ||
|
113c046de6 | ||
|
1ef4e574b7 | ||
|
eccc74cf72 | ||
|
a4137a83d8 | ||
|
ed9b4fb831 | ||
|
1d31f63947 | ||
|
74cda4e2ab | ||
|
39db5cd061 | ||
|
11d9e0a72f | ||
|
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 |
259
.eslintignore
259
.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
|
||||||
@@ -109,7 +109,10 @@ 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-mv.js
|
||||||
packages/app-cli/app/command-ren.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-rmbook.js
|
||||||
|
packages/app-cli/app/command-rmnote.test.js
|
||||||
packages/app-cli/app/command-rmnote.js
|
packages/app-cli/app/command-rmnote.js
|
||||||
packages/app-cli/app/command-set.js
|
packages/app-cli/app/command-set.js
|
||||||
packages/app-cli/app/command-settingschema.js
|
packages/app-cli/app/command-settingschema.js
|
||||||
@@ -117,6 +120,7 @@ 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-use.js
|
||||||
packages/app-cli/app/command-version.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
|
||||||
@@ -143,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
|
||||||
@@ -162,14 +167,13 @@ packages/app-desktop/gui/Button/Button.js
|
|||||||
packages/app-desktop/gui/ClipperConfigScreen.js
|
packages/app-desktop/gui/ClipperConfigScreen.js
|
||||||
packages/app-desktop/gui/ConfigScreen/ButtonBar.js
|
packages/app-desktop/gui/ConfigScreen/ButtonBar.js
|
||||||
packages/app-desktop/gui/ConfigScreen/ConfigScreen.js
|
packages/app-desktop/gui/ConfigScreen/ConfigScreen.js
|
||||||
|
packages/app-desktop/gui/ConfigScreen/FontSearch.js
|
||||||
packages/app-desktop/gui/ConfigScreen/Sidebar.js
|
packages/app-desktop/gui/ConfigScreen/Sidebar.js
|
||||||
packages/app-desktop/gui/ConfigScreen/controls/MissingPasswordHelpLink.js
|
packages/app-desktop/gui/ConfigScreen/controls/MissingPasswordHelpLink.js
|
||||||
packages/app-desktop/gui/ConfigScreen/controls/ToggleAdvancedSettingsButton.js
|
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
|
||||||
@@ -188,6 +192,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
|
||||||
@@ -217,10 +222,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
|
||||||
@@ -230,6 +238,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
|
||||||
@@ -247,26 +256,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/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
|
||||||
@@ -278,6 +291,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
|
||||||
@@ -309,9 +323,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
|
||||||
@@ -328,9 +340,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
|
||||||
@@ -345,6 +366,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
|
||||||
@@ -374,10 +396,26 @@ packages/app-desktop/gui/Root_UpgradeSyncTarget.js
|
|||||||
packages/app-desktop/gui/SearchBar/SearchBar.js
|
packages/app-desktop/gui/SearchBar/SearchBar.js
|
||||||
packages/app-desktop/gui/ShareFolderDialog/ShareFolderDialog.js
|
packages/app-desktop/gui/ShareFolderDialog/ShareFolderDialog.js
|
||||||
packages/app-desktop/gui/ShareNoteDialog.js
|
packages/app-desktop/gui/ShareNoteDialog.js
|
||||||
|
packages/app-desktop/gui/Sidebar/FolderAndTagList.js
|
||||||
packages/app-desktop/gui/Sidebar/Sidebar.js
|
packages/app-desktop/gui/Sidebar/Sidebar.js
|
||||||
packages/app-desktop/gui/Sidebar/commands/focusElementSideBar.js
|
packages/app-desktop/gui/Sidebar/commands/focusElementSideBar.js
|
||||||
packages/app-desktop/gui/Sidebar/commands/index.js
|
packages/app-desktop/gui/Sidebar/commands/index.js
|
||||||
|
packages/app-desktop/gui/Sidebar/hooks/useFocusHandler.js
|
||||||
|
packages/app-desktop/gui/Sidebar/hooks/useOnRenderItem.js
|
||||||
|
packages/app-desktop/gui/Sidebar/hooks/useOnSidebarKeyDownHandler.js
|
||||||
|
packages/app-desktop/gui/Sidebar/hooks/useSelectedSidebarIndex.js
|
||||||
|
packages/app-desktop/gui/Sidebar/hooks/useSidebarCommandHandler.js
|
||||||
|
packages/app-desktop/gui/Sidebar/hooks/useSidebarListData.js
|
||||||
|
packages/app-desktop/gui/Sidebar/listItemComponents/AllNotesItem.js
|
||||||
|
packages/app-desktop/gui/Sidebar/listItemComponents/EmptyExpandLink.js
|
||||||
|
packages/app-desktop/gui/Sidebar/listItemComponents/ExpandIcon.js
|
||||||
|
packages/app-desktop/gui/Sidebar/listItemComponents/ExpandLink.js
|
||||||
|
packages/app-desktop/gui/Sidebar/listItemComponents/FolderItem.js
|
||||||
|
packages/app-desktop/gui/Sidebar/listItemComponents/HeaderItem.js
|
||||||
|
packages/app-desktop/gui/Sidebar/listItemComponents/NoteCount.js
|
||||||
|
packages/app-desktop/gui/Sidebar/listItemComponents/TagItem.js
|
||||||
packages/app-desktop/gui/Sidebar/styles/index.js
|
packages/app-desktop/gui/Sidebar/styles/index.js
|
||||||
|
packages/app-desktop/gui/Sidebar/types.js
|
||||||
packages/app-desktop/gui/StatusScreen/StatusScreen.js
|
packages/app-desktop/gui/StatusScreen/StatusScreen.js
|
||||||
packages/app-desktop/gui/StyleSheets/StyleSheetContainer.js
|
packages/app-desktop/gui/StyleSheets/StyleSheetContainer.js
|
||||||
packages/app-desktop/gui/SyncWizard/Dialog.js
|
packages/app-desktop/gui/SyncWizard/Dialog.js
|
||||||
@@ -389,8 +427,10 @@ 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/useElementHeight.js
|
||||||
packages/app-desktop/gui/hooks/useImperativeHandlerDebugger.js
|
packages/app-desktop/gui/hooks/useImperativeHandlerDebugger.js
|
||||||
packages/app-desktop/gui/hooks/usePrevious.js
|
packages/app-desktop/gui/hooks/usePrevious.js
|
||||||
packages/app-desktop/gui/hooks/usePropsDebugger.js
|
packages/app-desktop/gui/hooks/usePropsDebugger.js
|
||||||
@@ -404,12 +444,15 @@ 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
|
||||||
packages/app-desktop/integration-tests/models/MainScreen.js
|
packages/app-desktop/integration-tests/models/MainScreen.js
|
||||||
packages/app-desktop/integration-tests/models/NoteEditorScreen.js
|
packages/app-desktop/integration-tests/models/NoteEditorScreen.js
|
||||||
packages/app-desktop/integration-tests/models/SettingsScreen.js
|
packages/app-desktop/integration-tests/models/SettingsScreen.js
|
||||||
|
packages/app-desktop/integration-tests/models/Sidebar.js
|
||||||
|
packages/app-desktop/integration-tests/sidebar.spec.js
|
||||||
packages/app-desktop/integration-tests/simpleBackup.spec.js
|
packages/app-desktop/integration-tests/simpleBackup.spec.js
|
||||||
packages/app-desktop/integration-tests/util/activateMainMenuItem.js
|
packages/app-desktop/integration-tests/util/activateMainMenuItem.js
|
||||||
packages/app-desktop/integration-tests/util/createStartupArgs.js
|
packages/app-desktop/integration-tests/util/createStartupArgs.js
|
||||||
@@ -437,7 +480,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
|
||||||
@@ -451,28 +493,46 @@ 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
|
||||||
packages/app-mobile/components/CustomButton.js
|
packages/app-mobile/components/CustomButton.js
|
||||||
|
packages/app-mobile/components/DismissibleDialog.js
|
||||||
packages/app-mobile/components/Dropdown.test.js
|
packages/app-mobile/components/Dropdown.test.js
|
||||||
packages/app-mobile/components/Dropdown.js
|
packages/app-mobile/components/Dropdown.js
|
||||||
packages/app-mobile/components/ExtendedWebView.js
|
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
|
||||||
@@ -494,17 +554,25 @@ packages/app-mobile/components/NoteEditor/MarkdownToolbar/buttons/useActionButto
|
|||||||
packages/app-mobile/components/NoteEditor/MarkdownToolbar/buttons/useHeaderButtons.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/useInlineFormattingButtons.js
|
||||||
packages/app-mobile/components/NoteEditor/MarkdownToolbar/buttons/useListButtons.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/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
|
||||||
@@ -515,15 +583,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
|
||||||
@@ -531,16 +604,60 @@ 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/PluginInfoButton.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
|
||||||
@@ -557,14 +674,30 @@ 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/getPackageInfo.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
|
||||||
@@ -574,6 +707,7 @@ 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
|
||||||
@@ -582,12 +716,20 @@ 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.test.js
|
||||||
packages/editor/CodeMirror/editorCommands/insertLineAfter.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.test.js
|
||||||
@@ -600,13 +742,17 @@ 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/CodeMirror/util/setupVim.js
|
||||||
@@ -632,6 +778,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
|
||||||
@@ -652,6 +799,7 @@ packages/lib/ObjectUtils.js
|
|||||||
packages/lib/PoorManIntervals.js
|
packages/lib/PoorManIntervals.js
|
||||||
packages/lib/RotatingLogs.test.js
|
packages/lib/RotatingLogs.test.js
|
||||||
packages/lib/RotatingLogs.js
|
packages/lib/RotatingLogs.js
|
||||||
|
packages/lib/SyncTargetFilesystem.js
|
||||||
packages/lib/SyncTargetJoplinCloud.js
|
packages/lib/SyncTargetJoplinCloud.js
|
||||||
packages/lib/SyncTargetJoplinServer.js
|
packages/lib/SyncTargetJoplinServer.js
|
||||||
packages/lib/SyncTargetNone.js
|
packages/lib/SyncTargetNone.js
|
||||||
@@ -670,20 +818,29 @@ packages/lib/commands/index.js
|
|||||||
packages/lib/commands/openMasterPasswordDialog.js
|
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/NoteList/getEmptyFolderMessage.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/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-local.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.test.js
|
||||||
@@ -696,6 +853,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
|
||||||
@@ -740,11 +898,17 @@ 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/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/resourceUtils.js
|
||||||
packages/lib/models/utils/types.js
|
packages/lib/models/utils/types.js
|
||||||
@@ -774,6 +938,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
|
||||||
@@ -800,6 +965,8 @@ 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/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
|
||||||
@@ -839,6 +1006,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
|
||||||
@@ -847,6 +1015,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
|
||||||
@@ -892,6 +1066,16 @@ 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/getPluginIssueReportUrl.test.js
|
||||||
|
packages/lib/services/plugins/utils/getPluginIssueReportUrl.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/getDefaultPlatforms.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
|
||||||
@@ -899,6 +1083,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
|
||||||
@@ -914,6 +1100,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
|
||||||
@@ -945,6 +1132,7 @@ packages/lib/services/search/gotoAnythingStyleQuery.js
|
|||||||
packages/lib/services/search/queryBuilder.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
|
||||||
@@ -982,8 +1170,22 @@ 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
|
||||||
@@ -999,9 +1201,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
|
||||||
@@ -1069,6 +1286,7 @@ 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/assetsToHeaders.js
|
||||||
@@ -1100,6 +1318,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
|
||||||
|
19
.eslintrc.js
19
.eslintrc.js
@@ -70,6 +70,10 @@ module.exports = {
|
|||||||
'no-var': ['error'],
|
'no-var': ['error'],
|
||||||
'no-new-func': ['error'],
|
'no-new-func': ['error'],
|
||||||
'import/prefer-default-export': ['error'],
|
'import/prefer-default-export': ['error'],
|
||||||
|
'prefer-promise-reject-errors': ['error', {
|
||||||
|
allowEmptyReject: true,
|
||||||
|
}],
|
||||||
|
'no-throw-literal': ['error'],
|
||||||
|
|
||||||
// This rule should not be enabled since it matters in what order
|
// This rule should not be enabled since it matters in what order
|
||||||
// imports are done, in particular in relation to the shim.setReact
|
// imports are done, in particular in relation to the shim.setReact
|
||||||
@@ -101,6 +105,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 +270,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
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
|
||||||
|
|
||||||
-->
|
-->
|
54
.github/scripts/run_ci.sh
vendored
54
.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
|
||||||
@@ -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
|
||||||
|
|
||||||
@@ -179,15 +177,13 @@ fi
|
|||||||
# 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 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
|
||||||
|
2
.github/workflows/build-android.yml
vendored
2
.github/workflows/build-android.yml
vendored
@@ -28,7 +28,7 @@ jobs:
|
|||||||
|
|
||||||
- uses: actions/checkout@v4
|
- 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'
|
||||||
|
6
.github/workflows/build-macos-m1.yml
vendored
6
.github/workflows/build-macos-m1.yml
vendored
@@ -20,8 +20,8 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
|
|
||||||
- uses: actions/checkout@v4
|
- 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'
|
||||||
|
|
||||||
|
2
.github/workflows/close-stale-issues.yml
vendored
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
|
||||||
|
9
.github/workflows/github-actions-main.yml
vendored
9
.github/workflows/github-actions-main.yml
vendored
@@ -82,8 +82,8 @@ jobs:
|
|||||||
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@v4
|
- 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"
|
||||||
|
|
||||||
@@ -182,7 +183,7 @@ jobs:
|
|||||||
|
|
||||||
- uses: actions/checkout@v4
|
- 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'
|
||||||
|
257
.gitignore
vendored
257
.gitignore
vendored
@@ -89,7 +89,10 @@ 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-mv.js
|
||||||
packages/app-cli/app/command-ren.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-rmbook.js
|
||||||
|
packages/app-cli/app/command-rmnote.test.js
|
||||||
packages/app-cli/app/command-rmnote.js
|
packages/app-cli/app/command-rmnote.js
|
||||||
packages/app-cli/app/command-set.js
|
packages/app-cli/app/command-set.js
|
||||||
packages/app-cli/app/command-settingschema.js
|
packages/app-cli/app/command-settingschema.js
|
||||||
@@ -97,6 +100,7 @@ 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-use.js
|
||||||
packages/app-cli/app/command-version.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
|
||||||
@@ -123,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
|
||||||
@@ -142,14 +147,13 @@ packages/app-desktop/gui/Button/Button.js
|
|||||||
packages/app-desktop/gui/ClipperConfigScreen.js
|
packages/app-desktop/gui/ClipperConfigScreen.js
|
||||||
packages/app-desktop/gui/ConfigScreen/ButtonBar.js
|
packages/app-desktop/gui/ConfigScreen/ButtonBar.js
|
||||||
packages/app-desktop/gui/ConfigScreen/ConfigScreen.js
|
packages/app-desktop/gui/ConfigScreen/ConfigScreen.js
|
||||||
|
packages/app-desktop/gui/ConfigScreen/FontSearch.js
|
||||||
packages/app-desktop/gui/ConfigScreen/Sidebar.js
|
packages/app-desktop/gui/ConfigScreen/Sidebar.js
|
||||||
packages/app-desktop/gui/ConfigScreen/controls/MissingPasswordHelpLink.js
|
packages/app-desktop/gui/ConfigScreen/controls/MissingPasswordHelpLink.js
|
||||||
packages/app-desktop/gui/ConfigScreen/controls/ToggleAdvancedSettingsButton.js
|
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
|
||||||
@@ -168,6 +172,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
|
||||||
@@ -197,10 +202,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
|
||||||
@@ -210,6 +218,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
|
||||||
@@ -227,26 +236,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/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
|
||||||
@@ -258,6 +271,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
|
||||||
@@ -289,9 +303,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
|
||||||
@@ -308,9 +320,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
|
||||||
@@ -325,6 +346,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
|
||||||
@@ -354,10 +376,26 @@ packages/app-desktop/gui/Root_UpgradeSyncTarget.js
|
|||||||
packages/app-desktop/gui/SearchBar/SearchBar.js
|
packages/app-desktop/gui/SearchBar/SearchBar.js
|
||||||
packages/app-desktop/gui/ShareFolderDialog/ShareFolderDialog.js
|
packages/app-desktop/gui/ShareFolderDialog/ShareFolderDialog.js
|
||||||
packages/app-desktop/gui/ShareNoteDialog.js
|
packages/app-desktop/gui/ShareNoteDialog.js
|
||||||
|
packages/app-desktop/gui/Sidebar/FolderAndTagList.js
|
||||||
packages/app-desktop/gui/Sidebar/Sidebar.js
|
packages/app-desktop/gui/Sidebar/Sidebar.js
|
||||||
packages/app-desktop/gui/Sidebar/commands/focusElementSideBar.js
|
packages/app-desktop/gui/Sidebar/commands/focusElementSideBar.js
|
||||||
packages/app-desktop/gui/Sidebar/commands/index.js
|
packages/app-desktop/gui/Sidebar/commands/index.js
|
||||||
|
packages/app-desktop/gui/Sidebar/hooks/useFocusHandler.js
|
||||||
|
packages/app-desktop/gui/Sidebar/hooks/useOnRenderItem.js
|
||||||
|
packages/app-desktop/gui/Sidebar/hooks/useOnSidebarKeyDownHandler.js
|
||||||
|
packages/app-desktop/gui/Sidebar/hooks/useSelectedSidebarIndex.js
|
||||||
|
packages/app-desktop/gui/Sidebar/hooks/useSidebarCommandHandler.js
|
||||||
|
packages/app-desktop/gui/Sidebar/hooks/useSidebarListData.js
|
||||||
|
packages/app-desktop/gui/Sidebar/listItemComponents/AllNotesItem.js
|
||||||
|
packages/app-desktop/gui/Sidebar/listItemComponents/EmptyExpandLink.js
|
||||||
|
packages/app-desktop/gui/Sidebar/listItemComponents/ExpandIcon.js
|
||||||
|
packages/app-desktop/gui/Sidebar/listItemComponents/ExpandLink.js
|
||||||
|
packages/app-desktop/gui/Sidebar/listItemComponents/FolderItem.js
|
||||||
|
packages/app-desktop/gui/Sidebar/listItemComponents/HeaderItem.js
|
||||||
|
packages/app-desktop/gui/Sidebar/listItemComponents/NoteCount.js
|
||||||
|
packages/app-desktop/gui/Sidebar/listItemComponents/TagItem.js
|
||||||
packages/app-desktop/gui/Sidebar/styles/index.js
|
packages/app-desktop/gui/Sidebar/styles/index.js
|
||||||
|
packages/app-desktop/gui/Sidebar/types.js
|
||||||
packages/app-desktop/gui/StatusScreen/StatusScreen.js
|
packages/app-desktop/gui/StatusScreen/StatusScreen.js
|
||||||
packages/app-desktop/gui/StyleSheets/StyleSheetContainer.js
|
packages/app-desktop/gui/StyleSheets/StyleSheetContainer.js
|
||||||
packages/app-desktop/gui/SyncWizard/Dialog.js
|
packages/app-desktop/gui/SyncWizard/Dialog.js
|
||||||
@@ -369,8 +407,10 @@ 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/useElementHeight.js
|
||||||
packages/app-desktop/gui/hooks/useImperativeHandlerDebugger.js
|
packages/app-desktop/gui/hooks/useImperativeHandlerDebugger.js
|
||||||
packages/app-desktop/gui/hooks/usePrevious.js
|
packages/app-desktop/gui/hooks/usePrevious.js
|
||||||
packages/app-desktop/gui/hooks/usePropsDebugger.js
|
packages/app-desktop/gui/hooks/usePropsDebugger.js
|
||||||
@@ -384,12 +424,15 @@ 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
|
||||||
packages/app-desktop/integration-tests/models/MainScreen.js
|
packages/app-desktop/integration-tests/models/MainScreen.js
|
||||||
packages/app-desktop/integration-tests/models/NoteEditorScreen.js
|
packages/app-desktop/integration-tests/models/NoteEditorScreen.js
|
||||||
packages/app-desktop/integration-tests/models/SettingsScreen.js
|
packages/app-desktop/integration-tests/models/SettingsScreen.js
|
||||||
|
packages/app-desktop/integration-tests/models/Sidebar.js
|
||||||
|
packages/app-desktop/integration-tests/sidebar.spec.js
|
||||||
packages/app-desktop/integration-tests/simpleBackup.spec.js
|
packages/app-desktop/integration-tests/simpleBackup.spec.js
|
||||||
packages/app-desktop/integration-tests/util/activateMainMenuItem.js
|
packages/app-desktop/integration-tests/util/activateMainMenuItem.js
|
||||||
packages/app-desktop/integration-tests/util/createStartupArgs.js
|
packages/app-desktop/integration-tests/util/createStartupArgs.js
|
||||||
@@ -417,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
|
||||||
@@ -431,28 +473,46 @@ 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
|
||||||
packages/app-mobile/components/CustomButton.js
|
packages/app-mobile/components/CustomButton.js
|
||||||
|
packages/app-mobile/components/DismissibleDialog.js
|
||||||
packages/app-mobile/components/Dropdown.test.js
|
packages/app-mobile/components/Dropdown.test.js
|
||||||
packages/app-mobile/components/Dropdown.js
|
packages/app-mobile/components/Dropdown.js
|
||||||
packages/app-mobile/components/ExtendedWebView.js
|
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
|
||||||
@@ -474,17 +534,25 @@ packages/app-mobile/components/NoteEditor/MarkdownToolbar/buttons/useActionButto
|
|||||||
packages/app-mobile/components/NoteEditor/MarkdownToolbar/buttons/useHeaderButtons.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/useInlineFormattingButtons.js
|
||||||
packages/app-mobile/components/NoteEditor/MarkdownToolbar/buttons/useListButtons.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/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
|
||||||
@@ -495,15 +563,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
|
||||||
@@ -511,16 +584,60 @@ 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/PluginInfoButton.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
|
||||||
@@ -537,14 +654,30 @@ 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/getPackageInfo.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
|
||||||
@@ -554,6 +687,7 @@ 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
|
||||||
@@ -562,12 +696,20 @@ 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.test.js
|
||||||
packages/editor/CodeMirror/editorCommands/insertLineAfter.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.test.js
|
||||||
@@ -580,13 +722,17 @@ 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/CodeMirror/util/setupVim.js
|
||||||
@@ -612,6 +758,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
|
||||||
@@ -632,6 +779,7 @@ packages/lib/ObjectUtils.js
|
|||||||
packages/lib/PoorManIntervals.js
|
packages/lib/PoorManIntervals.js
|
||||||
packages/lib/RotatingLogs.test.js
|
packages/lib/RotatingLogs.test.js
|
||||||
packages/lib/RotatingLogs.js
|
packages/lib/RotatingLogs.js
|
||||||
|
packages/lib/SyncTargetFilesystem.js
|
||||||
packages/lib/SyncTargetJoplinCloud.js
|
packages/lib/SyncTargetJoplinCloud.js
|
||||||
packages/lib/SyncTargetJoplinServer.js
|
packages/lib/SyncTargetJoplinServer.js
|
||||||
packages/lib/SyncTargetNone.js
|
packages/lib/SyncTargetNone.js
|
||||||
@@ -650,20 +798,29 @@ packages/lib/commands/index.js
|
|||||||
packages/lib/commands/openMasterPasswordDialog.js
|
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/NoteList/getEmptyFolderMessage.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/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-local.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.test.js
|
||||||
@@ -676,6 +833,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
|
||||||
@@ -720,11 +878,17 @@ 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/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/resourceUtils.js
|
||||||
packages/lib/models/utils/types.js
|
packages/lib/models/utils/types.js
|
||||||
@@ -754,6 +918,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
|
||||||
@@ -780,6 +945,8 @@ 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/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
|
||||||
@@ -819,6 +986,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
|
||||||
@@ -827,6 +995,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
|
||||||
@@ -872,6 +1046,16 @@ 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/getPluginIssueReportUrl.test.js
|
||||||
|
packages/lib/services/plugins/utils/getPluginIssueReportUrl.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/getDefaultPlatforms.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
|
||||||
@@ -879,6 +1063,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
|
||||||
@@ -894,6 +1080,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
|
||||||
@@ -925,6 +1112,7 @@ packages/lib/services/search/gotoAnythingStyleQuery.js
|
|||||||
packages/lib/services/search/queryBuilder.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
|
||||||
@@ -962,8 +1150,22 @@ 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
|
||||||
@@ -979,9 +1181,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
|
||||||
@@ -1049,6 +1266,7 @@ 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/assetsToHeaders.js
|
||||||
@@ -1080,6 +1298,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
|
||||||
|
33
.yarn/patches/husky-npm-3.1.0-5cc13e4e34.patch
Normal file
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;
|
||||||
|
}
|
||||||
|
});
|
BIN
Assets/WebsiteAssets/images/news/20240301-rte-colors.png
Normal file
BIN
Assets/WebsiteAssets/images/news/20240301-rte-colors.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 15 KiB |
BIN
Assets/WebsiteAssets/images/sponsors/BestKru.png
Normal file
BIN
Assets/WebsiteAssets/images/sponsors/BestKru.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 14 KiB |
@@ -1,4 +1,48 @@
|
|||||||
<?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>Sat, 27 Jan 2024 00:00:00 GMT</lastBuildDate><atom:link href="https://joplinapp.org/rss.xml" rel="self" type="application/rss+xml"/><pubDate>Sat, 27 Jan 2024 00:00:00 GMT</pubDate><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>
|
<?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>
|
<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>
|
<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>
|
<h2>Category<a name="category" href="#category" class="heading-anchor">🔗</a></h2>
|
||||||
@@ -353,15 +397,4 @@ sys 0m38.013s</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>
|
]]></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></channel></rss>
|
|
3
CONTRIBUTING
Normal file
3
CONTRIBUTING
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Contributing to Joplin
|
||||||
|
|
||||||
|
See the guide at https://github.com/laurent22/joplin/blob/dev/readme/dev/index.md
|
@@ -202,16 +202,28 @@ if command -v lsb_release &> /dev/null; then
|
|||||||
DISTVER=$(lsb_release -is) && DISTVER=$DISTVER$(lsb_release -rs)
|
DISTVER=$(lsb_release -is) && DISTVER=$DISTVER$(lsb_release -rs)
|
||||||
DISTCODENAME=$(lsb_release -cs)
|
DISTCODENAME=$(lsb_release -cs)
|
||||||
DISTMAJOR=$(lsb_release -rs|cut -d. -f1)
|
DISTMAJOR=$(lsb_release -rs|cut -d. -f1)
|
||||||
|
|
||||||
#-----------------------------------------------------
|
#-----------------------------------------------------
|
||||||
# Check for "The SUID sandbox helper binary was found, but is not configured correctly" problem.
|
# Check for "The SUID sandbox helper binary was found, but is not configured correctly" problem.
|
||||||
# It is present in Debian 1X. A (temporary) patch will be applied at .desktop file
|
# It is present in Debian 1X. A (temporary) patch will be applied at .desktop file
|
||||||
# Linux Mint 4 Debbie is based on Debian 10 and requires the same param handling.
|
# Linux Mint 4 Debbie is based on Debian 10 and requires the same param handling.
|
||||||
#
|
#
|
||||||
# This also works around Ubuntu 23.10+'s restrictions on unprivileged user namespaces. Electron
|
# TODO: Remove: This is likely no longer an issue. See https://issues.chromium.org/issues/40462640.
|
||||||
|
BAD_HELPER_BINARY=false
|
||||||
|
if [[ $DISTVER =~ Debian1. || ( "$DISTVER" = "Linuxmint4" && "$DISTCODENAME" = "debbie" ) || ( "$DISTVER" = "CentOS" && "$DISTMAJOR" =~ 6|7 ) ]]; then
|
||||||
|
BAD_HELPER_BINARY=true
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Work around Ubuntu 23.10+'s restrictions on unprivileged user namespaces. Electron
|
||||||
# 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 ) ]]; then
|
HAS_USERNS_RESTRICTIONS=false
|
||||||
|
if [[ "$DISTVER" =~ ^Ubuntu && $DISTMAJOR -ge 23 ]]; then
|
||||||
|
HAS_USERNS_RESTRICTIONS=true
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $HAS_USERNS_RESTRICTIONS = true || $BAD_HELPER_BINARY = true ]]; 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."
|
||||||
@@ -241,7 +253,7 @@ if [[ $DESKTOP =~ .*gnome.*|.*kde.*|.*xfce.*|.*mate.*|.*lxqt.*|.*unity.*|.*x-cin
|
|||||||
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=env APPIMAGELAUNCHER_DISABLE=TRUE ${HOME}/.joplin/Joplin.AppImage ${SANDBOXPARAM} %u
|
||||||
Icon=joplin
|
Icon=joplin
|
||||||
StartupWMClass=Joplin
|
StartupWMClass=Joplin
|
||||||
Type=Application
|
Type=Application
|
||||||
|
13
README.md
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://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://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
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ŽŻŹ",
|
|
||||||
"Ελλάδα",
|
|
||||||
"Ελληνικά",
|
|
||||||
"Κύπρος",
|
|
||||||
"Агентство",
|
|
||||||
"Антарктике",
|
|
||||||
"Беларусь",
|
|
||||||
"България",
|
|
||||||
"Гора",
|
|
||||||
"језик",
|
|
||||||
"Казахстан",
|
|
||||||
"Киргизия",
|
|
||||||
"Книги",
|
|
||||||
"Кыргызстан",
|
|
||||||
"Қазақстан",
|
|
||||||
"Македонија",
|
|
||||||
"Молдавия",
|
|
||||||
"Монгол",
|
|
||||||
"номер",
|
|
||||||
"рейтер",
|
|
||||||
"Рейтер",
|
|
||||||
"Россия",
|
|
||||||
"Русский",
|
|
||||||
"Северна",
|
|
||||||
"сообщило",
|
|
||||||
"СООБЩИЛО",
|
|
||||||
"Србија",
|
|
||||||
"српски",
|
|
||||||
"Україна",
|
|
||||||
"Црна",
|
|
||||||
"საქართველო",
|
|
||||||
"Հայաստան",
|
|
||||||
"ישראל",
|
|
||||||
"עיברית",
|
|
||||||
"إرتريا",
|
|
||||||
"اسلامي",
|
|
||||||
"اسلامی",
|
|
||||||
"افغانستان",
|
|
||||||
"الأُرْدُن",
|
|
||||||
"الإمارات",
|
|
||||||
"البحرين",
|
|
||||||
"الجزائر",
|
|
||||||
"السعودية",
|
|
||||||
"السودان",
|
|
||||||
"الصومال",
|
|
||||||
"العراق",
|
|
||||||
"العربيّة",
|
|
||||||
"ﺍﻟﻘﻤﺮي",
|
|
||||||
"الكويت",
|
|
||||||
"المتّحدة",
|
|
||||||
"المغرب",
|
|
||||||
"اليَمَن",
|
|
||||||
"ایران",
|
|
||||||
"پاکستان",
|
|
||||||
"تشاد",
|
|
||||||
"تونس",
|
|
||||||
"جمهوری",
|
|
||||||
"جيبوتي",
|
|
||||||
"دولة",
|
|
||||||
"دولتدولت",
|
|
||||||
"سلطنة",
|
|
||||||
"سوريا",
|
|
||||||
"عُمان",
|
|
||||||
"لبنان",
|
|
||||||
"ليبيا",
|
|
||||||
"موريتانيا",
|
|
||||||
"ⵍⵎⵖⵔⵉⴱ",
|
|
||||||
"ኢትዮጵያ",
|
|
||||||
"ኤርትራ",
|
|
||||||
"भारत",
|
|
||||||
"গণপ্রজাতন্ত্রী",
|
|
||||||
"লাদেশ",
|
|
||||||
"இலங்கை",
|
|
||||||
"ලංකා",
|
|
||||||
"คือค",
|
|
||||||
"คือคนไทย",
|
|
||||||
"ประเทศไทย",
|
|
||||||
"ປະຊາຊົນລາວ",
|
|
||||||
"မြန်မာ",
|
|
||||||
"កម្ពុជា"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
@@ -9,7 +9,7 @@
|
|||||||
#
|
#
|
||||||
# APP_BASE_URL: This is the base public URL where the service will be running.
|
# APP_BASE_URL: This is the base public URL where the service will be running.
|
||||||
# - If Joplin Server needs to be accessible over the internet, configure APP_BASE_URL as follows: https://example.com/joplin.
|
# - If Joplin Server needs to be accessible over the internet, configure APP_BASE_URL as follows: https://example.com/joplin.
|
||||||
# - If Joplin Server does not need to be accessible over the internet, set the the APP_BASE_URL to your server's hostname.
|
# - If Joplin Server does not need to be accessible over the internet, set the APP_BASE_URL to your server's hostname.
|
||||||
# For Example: http://[hostname]:22300. The base URL can include the port.
|
# For Example: http://[hostname]:22300. The base URL can include the port.
|
||||||
# APP_PORT: The local port on which the Docker container will listen.
|
# APP_PORT: The local port on which the Docker container will listen.
|
||||||
# - This would typically be mapped to port to 443 (TLS) with a reverse proxy.
|
# - This would typically be mapped to port to 443 (TLS) with a reverse proxy.
|
||||||
|
@@ -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 checkIgnoredFiles',
|
// lint-staged does not allow running concurrent tasks for the same extension, because multiple
|
||||||
// 'yarn checkLibPaths',
|
// tasks might modify the same files. This doesn't apply to us because only one task modifies
|
||||||
'yarn packageJsonLint',
|
// files (the linter task) while others only notify about errors. So to go around this we add
|
||||||
'yarn 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',
|
||||||
};
|
};
|
||||||
|
11
package.json
11
package.json
@@ -9,7 +9,7 @@
|
|||||||
"url": "git+https://github.com/laurent22/joplin.git"
|
"url": "git+https://github.com/laurent22/joplin.git"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=16"
|
"node": ">=18"
|
||||||
},
|
},
|
||||||
"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",
|
||||||
@@ -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",
|
||||||
@@ -65,7 +64,7 @@
|
|||||||
},
|
},
|
||||||
"husky": {
|
"husky": {
|
||||||
"hooks": {
|
"hooks": {
|
||||||
"pre-commit": "lint-staged"
|
"pre-commit": "yarn lint-staged"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@@ -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.2"
|
"nodemon": "3.0.3"
|
||||||
},
|
},
|
||||||
"packageManager": "yarn@3.6.4",
|
"packageManager": "yarn@3.6.4",
|
||||||
"resolutions": {
|
"resolutions": {
|
||||||
@@ -108,6 +107,8 @@
|
|||||||
"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@4.4.4": "patch:@react-native-community/slider@npm%3A4.4.4#./.yarn/patches/@react-native-community-slider-npm-4.4.4-d78e472f48.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,461 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
||||||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
||||||
return new (P || (P = Promise))(function (resolve, reject) {
|
|
||||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
||||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
||||||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
||||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
||||||
});
|
|
||||||
};
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
const BaseApplication_1 = require("@joplin/lib/BaseApplication");
|
|
||||||
const folders_screen_utils_js_1 = require("@joplin/lib/folders-screen-utils.js");
|
|
||||||
const ResourceService_1 = require("@joplin/lib/services/ResourceService");
|
|
||||||
const BaseModel_1 = require("@joplin/lib/BaseModel");
|
|
||||||
const Folder_1 = require("@joplin/lib/models/Folder");
|
|
||||||
const BaseItem_1 = require("@joplin/lib/models/BaseItem");
|
|
||||||
const Note_1 = require("@joplin/lib/models/Note");
|
|
||||||
const Tag_1 = require("@joplin/lib/models/Tag");
|
|
||||||
const Setting_1 = require("@joplin/lib/models/Setting");
|
|
||||||
const registry_js_1 = require("@joplin/lib/registry.js");
|
|
||||||
const path_utils_1 = require("@joplin/lib/path-utils");
|
|
||||||
const utils_1 = require("@joplin/utils");
|
|
||||||
const locale_1 = require("@joplin/lib/locale");
|
|
||||||
const fs_extra_1 = require("fs-extra");
|
|
||||||
const RevisionService_1 = require("@joplin/lib/services/RevisionService");
|
|
||||||
const shim_1 = require("@joplin/lib/shim");
|
|
||||||
const setupCommand_1 = require("./setupCommand");
|
|
||||||
const { cliUtils } = require('./cli-utils.js');
|
|
||||||
const Cache = require('@joplin/lib/Cache');
|
|
||||||
const { splitCommandBatch } = require('@joplin/lib/string-utils');
|
|
||||||
class Application extends BaseApplication_1.default {
|
|
||||||
constructor() {
|
|
||||||
super(...arguments);
|
|
||||||
this.commands_ = {};
|
|
||||||
this.commandMetadata_ = null;
|
|
||||||
this.activeCommand_ = null;
|
|
||||||
this.allCommandsLoaded_ = false;
|
|
||||||
this.gui_ = null;
|
|
||||||
this.cache_ = new Cache();
|
|
||||||
}
|
|
||||||
gui() {
|
|
||||||
return this.gui_;
|
|
||||||
}
|
|
||||||
commandStdoutMaxWidth() {
|
|
||||||
return this.gui().stdoutMaxWidth();
|
|
||||||
}
|
|
||||||
guessTypeAndLoadItem(pattern, options = null) {
|
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
|
||||||
let type = BaseModel_1.default.TYPE_NOTE;
|
|
||||||
if (pattern.indexOf('/') === 0) {
|
|
||||||
type = BaseModel_1.default.TYPE_FOLDER;
|
|
||||||
pattern = pattern.substr(1);
|
|
||||||
}
|
|
||||||
return this.loadItem(type, pattern, options);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
loadItem(type, pattern, options = null) {
|
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
|
||||||
const output = yield this.loadItems(type, pattern, options);
|
|
||||||
if (output.length > 1) {
|
|
||||||
// output.sort((a, b) => { return a.user_updated_time < b.user_updated_time ? +1 : -1; });
|
|
||||||
// let answers = { 0: _('[Cancel]') };
|
|
||||||
// for (let i = 0; i < output.length; i++) {
|
|
||||||
// answers[i + 1] = output[i].title;
|
|
||||||
// }
|
|
||||||
// Not really useful with new UI?
|
|
||||||
throw new Error((0, locale_1._)('More than one item match "%s". Please narrow down your query.', pattern));
|
|
||||||
// let msg = _('More than one item match "%s". Please select one:', pattern);
|
|
||||||
// const response = await cliUtils.promptMcq(msg, answers);
|
|
||||||
// if (!response) return null;
|
|
||||||
// return output[response - 1];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return output.length ? output[0] : null;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
loadItems(type, pattern, options = null) {
|
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
|
||||||
if (type === 'folderOrNote') {
|
|
||||||
const folders = yield this.loadItems(BaseModel_1.default.TYPE_FOLDER, pattern, options);
|
|
||||||
if (folders.length)
|
|
||||||
return folders;
|
|
||||||
return yield this.loadItems(BaseModel_1.default.TYPE_NOTE, pattern, options);
|
|
||||||
}
|
|
||||||
pattern = pattern ? pattern.toString() : '';
|
|
||||||
if (type === BaseModel_1.default.TYPE_FOLDER && (pattern === Folder_1.default.conflictFolderTitle() || pattern === Folder_1.default.conflictFolderId()))
|
|
||||||
return [Folder_1.default.conflictFolder()];
|
|
||||||
if (!options)
|
|
||||||
options = {};
|
|
||||||
const parent = options.parent ? options.parent : app().currentFolder();
|
|
||||||
const ItemClass = BaseItem_1.default.itemClass(type);
|
|
||||||
if (type === BaseModel_1.default.TYPE_NOTE && pattern.indexOf('*') >= 0) {
|
|
||||||
// Handle it as pattern
|
|
||||||
if (!parent)
|
|
||||||
throw new Error((0, locale_1._)('No notebook selected.'));
|
|
||||||
return yield Note_1.default.previews(parent.id, { titlePattern: pattern });
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Single item
|
|
||||||
let item = null;
|
|
||||||
if (type === BaseModel_1.default.TYPE_NOTE) {
|
|
||||||
if (!parent)
|
|
||||||
throw new Error((0, locale_1._)('No notebook has been specified.'));
|
|
||||||
item = yield ItemClass.loadFolderNoteByField(parent.id, 'title', pattern);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
item = yield ItemClass.loadByTitle(pattern);
|
|
||||||
}
|
|
||||||
if (item)
|
|
||||||
return [item];
|
|
||||||
item = yield ItemClass.load(pattern); // Load by id
|
|
||||||
if (item)
|
|
||||||
return [item];
|
|
||||||
if (pattern.length >= 2) {
|
|
||||||
return yield ItemClass.loadByPartialId(pattern);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return [];
|
|
||||||
});
|
|
||||||
}
|
|
||||||
setupCommand(cmd) {
|
|
||||||
return (0, setupCommand_1.default)(cmd, (t) => this.stdout(t), () => this.store(), () => this.gui());
|
|
||||||
}
|
|
||||||
stdout(text) {
|
|
||||||
return this.gui().stdout(text);
|
|
||||||
}
|
|
||||||
exit(code = 0) {
|
|
||||||
const _super = Object.create(null, {
|
|
||||||
exit: { get: () => super.exit }
|
|
||||||
});
|
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
|
||||||
const doExit = () => __awaiter(this, void 0, void 0, function* () {
|
|
||||||
this.gui().exit();
|
|
||||||
yield _super.exit.call(this, code);
|
|
||||||
});
|
|
||||||
// Give it a few seconds to cancel otherwise exit anyway
|
|
||||||
shim_1.default.setTimeout(() => __awaiter(this, void 0, void 0, function* () {
|
|
||||||
yield doExit();
|
|
||||||
}), 5000);
|
|
||||||
if (yield registry_js_1.reg.syncTarget().syncStarted()) {
|
|
||||||
this.stdout((0, locale_1._)('Cancelling background synchronisation... Please wait.'));
|
|
||||||
const sync = yield registry_js_1.reg.syncTarget().synchronizer();
|
|
||||||
yield sync.cancel();
|
|
||||||
}
|
|
||||||
yield doExit();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
commands(uiType = null) {
|
|
||||||
if (!this.allCommandsLoaded_) {
|
|
||||||
// eslint-disable-next-line github/array-foreach -- Old code before rule was applied
|
|
||||||
(0, fs_extra_1.readdirSync)(__dirname).forEach(path => {
|
|
||||||
if (path.indexOf('command-') !== 0)
|
|
||||||
return;
|
|
||||||
if (path.endsWith('.test.js'))
|
|
||||||
return;
|
|
||||||
const ext = (0, path_utils_1.fileExtension)(path);
|
|
||||||
if (ext !== 'js')
|
|
||||||
return;
|
|
||||||
const CommandClass = require(`./${path}`);
|
|
||||||
let cmd = new CommandClass();
|
|
||||||
if (!cmd.enabled())
|
|
||||||
return;
|
|
||||||
cmd = this.setupCommand(cmd);
|
|
||||||
this.commands_[cmd.name()] = cmd;
|
|
||||||
});
|
|
||||||
this.allCommandsLoaded_ = true;
|
|
||||||
}
|
|
||||||
if (uiType !== null) {
|
|
||||||
const temp = {};
|
|
||||||
for (const n in this.commands_) {
|
|
||||||
if (!this.commands_.hasOwnProperty(n))
|
|
||||||
continue;
|
|
||||||
const c = this.commands_[n];
|
|
||||||
if (!c.supportsUi(uiType))
|
|
||||||
continue;
|
|
||||||
temp[n] = c;
|
|
||||||
}
|
|
||||||
return temp;
|
|
||||||
}
|
|
||||||
return this.commands_;
|
|
||||||
}
|
|
||||||
commandNames() {
|
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
|
||||||
const metadata = yield this.commandMetadata();
|
|
||||||
const output = [];
|
|
||||||
for (const n in metadata) {
|
|
||||||
if (!metadata.hasOwnProperty(n))
|
|
||||||
continue;
|
|
||||||
output.push(n);
|
|
||||||
}
|
|
||||||
return output;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
commandMetadata() {
|
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
|
||||||
if (this.commandMetadata_)
|
|
||||||
return this.commandMetadata_;
|
|
||||||
let output = yield this.cache_.getItem('metadata');
|
|
||||||
if (output) {
|
|
||||||
this.commandMetadata_ = output;
|
|
||||||
return Object.assign({}, this.commandMetadata_);
|
|
||||||
}
|
|
||||||
const commands = this.commands();
|
|
||||||
output = {};
|
|
||||||
for (const n in commands) {
|
|
||||||
if (!commands.hasOwnProperty(n))
|
|
||||||
continue;
|
|
||||||
const cmd = commands[n];
|
|
||||||
output[n] = cmd.metadata();
|
|
||||||
}
|
|
||||||
yield this.cache_.setItem('metadata', output, 1000 * 60 * 60 * 24);
|
|
||||||
this.commandMetadata_ = output;
|
|
||||||
return Object.assign({}, this.commandMetadata_);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
hasGui() {
|
|
||||||
return this.gui() && !this.gui().isDummy();
|
|
||||||
}
|
|
||||||
findCommandByName(name) {
|
|
||||||
if (this.commands_[name])
|
|
||||||
return this.commands_[name];
|
|
||||||
let CommandClass = null;
|
|
||||||
try {
|
|
||||||
CommandClass = require(`${__dirname}/command-${name}.js`);
|
|
||||||
}
|
|
||||||
catch (error) {
|
|
||||||
if (error.message && error.message.indexOf('Cannot find module') >= 0) {
|
|
||||||
const e = new Error((0, locale_1._)('No such command: %s', name));
|
|
||||||
e.type = 'notFound';
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let cmd = new CommandClass();
|
|
||||||
cmd = this.setupCommand(cmd);
|
|
||||||
this.commands_[name] = cmd;
|
|
||||||
return this.commands_[name];
|
|
||||||
}
|
|
||||||
dummyGui() {
|
|
||||||
return {
|
|
||||||
isDummy: () => {
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
prompt: (initialText = '', promptString = '', options = null) => {
|
|
||||||
return cliUtils.prompt(initialText, promptString, options);
|
|
||||||
},
|
|
||||||
showConsole: () => { },
|
|
||||||
maximizeConsole: () => { },
|
|
||||||
stdout: (text) => {
|
|
||||||
// eslint-disable-next-line no-console
|
|
||||||
console.info(text);
|
|
||||||
},
|
|
||||||
fullScreen: () => { },
|
|
||||||
exit: () => { },
|
|
||||||
showModalOverlay: () => { },
|
|
||||||
hideModalOverlay: () => { },
|
|
||||||
stdoutMaxWidth: () => {
|
|
||||||
return 100;
|
|
||||||
},
|
|
||||||
forceRender: () => { },
|
|
||||||
termSaveState: () => { },
|
|
||||||
termRestoreState: () => { },
|
|
||||||
};
|
|
||||||
}
|
|
||||||
execCommand(argv) {
|
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
|
||||||
if (!argv.length)
|
|
||||||
return this.execCommand(['help']);
|
|
||||||
// reg.logger().debug('execCommand()', argv);
|
|
||||||
const commandName = argv[0];
|
|
||||||
this.activeCommand_ = this.findCommandByName(commandName);
|
|
||||||
let outException = null;
|
|
||||||
try {
|
|
||||||
if (this.gui().isDummy() && !this.activeCommand_.supportsUi('cli'))
|
|
||||||
throw new Error((0, locale_1._)('The command "%s" is only available in GUI mode', this.activeCommand_.name()));
|
|
||||||
const cmdArgs = cliUtils.makeCommandArgs(this.activeCommand_, argv);
|
|
||||||
yield this.activeCommand_.action(cmdArgs);
|
|
||||||
}
|
|
||||||
catch (error) {
|
|
||||||
outException = error;
|
|
||||||
}
|
|
||||||
this.activeCommand_ = null;
|
|
||||||
if (outException)
|
|
||||||
throw outException;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
currentCommand() {
|
|
||||||
return this.activeCommand_;
|
|
||||||
}
|
|
||||||
loadKeymaps() {
|
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
|
||||||
const defaultKeyMap = [
|
|
||||||
{ keys: [':'], type: 'function', command: 'enter_command_line_mode' },
|
|
||||||
{ keys: ['TAB'], type: 'function', command: 'focus_next' },
|
|
||||||
{ keys: ['SHIFT_TAB'], type: 'function', command: 'focus_previous' },
|
|
||||||
{ keys: ['UP'], type: 'function', command: 'move_up' },
|
|
||||||
{ keys: ['DOWN'], type: 'function', command: 'move_down' },
|
|
||||||
{ keys: ['PAGE_UP'], type: 'function', command: 'page_up' },
|
|
||||||
{ keys: ['PAGE_DOWN'], type: 'function', command: 'page_down' },
|
|
||||||
{ keys: ['ENTER'], type: 'function', command: 'activate' },
|
|
||||||
{ keys: ['DELETE', 'BACKSPACE'], type: 'function', command: 'delete' },
|
|
||||||
{ keys: ['n'], type: 'function', command: 'next_link' },
|
|
||||||
{ keys: ['b'], type: 'function', command: 'previous_link' },
|
|
||||||
{ keys: ['o'], type: 'function', command: 'open_link' },
|
|
||||||
{ keys: [' '], type: 'prompt', command: 'todo toggle $n' },
|
|
||||||
{ keys: ['tc'], type: 'function', command: 'toggle_console' },
|
|
||||||
{ keys: ['tm'], type: 'function', command: 'toggle_metadata' },
|
|
||||||
{ keys: ['ti'], type: 'function', command: 'toggle_ids' },
|
|
||||||
{ keys: ['/'], type: 'prompt', command: 'search ""', cursorPosition: -2 },
|
|
||||||
{ keys: ['mn'], type: 'prompt', command: 'mknote ""', cursorPosition: -2 },
|
|
||||||
{ keys: ['mt'], type: 'prompt', command: 'mktodo ""', cursorPosition: -2 },
|
|
||||||
{ keys: ['mb'], type: 'prompt', command: 'mkbook ""', cursorPosition: -2 },
|
|
||||||
{ keys: ['yn'], type: 'prompt', command: 'cp $n ""', cursorPosition: -2 },
|
|
||||||
{ keys: ['dn'], type: 'prompt', command: 'mv $n ""', cursorPosition: -2 },
|
|
||||||
];
|
|
||||||
// Filter the keymap item by command so that items in keymap.json can override
|
|
||||||
// the default ones.
|
|
||||||
const itemsByCommand = {};
|
|
||||||
for (let i = 0; i < defaultKeyMap.length; i++) {
|
|
||||||
itemsByCommand[defaultKeyMap[i].command] = defaultKeyMap[i];
|
|
||||||
}
|
|
||||||
const filePath = `${Setting_1.default.value('profileDir')}/keymap.json`;
|
|
||||||
if (yield (0, fs_extra_1.pathExists)(filePath)) {
|
|
||||||
try {
|
|
||||||
let configString = yield (0, fs_extra_1.readFile)(filePath, 'utf-8');
|
|
||||||
configString = configString.replace(/^\s*\/\/.*/, ''); // Strip off comments
|
|
||||||
const keymap = JSON.parse(configString);
|
|
||||||
for (let keymapIndex = 0; keymapIndex < keymap.length; keymapIndex++) {
|
|
||||||
const item = keymap[keymapIndex];
|
|
||||||
itemsByCommand[item.command] = item;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (error) {
|
|
||||||
let msg = error.message ? error.message : '';
|
|
||||||
msg = `Could not load keymap ${filePath}\n${msg}`;
|
|
||||||
error.message = msg;
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const output = [];
|
|
||||||
for (const n in itemsByCommand) {
|
|
||||||
if (!itemsByCommand.hasOwnProperty(n))
|
|
||||||
continue;
|
|
||||||
output.push(itemsByCommand[n]);
|
|
||||||
}
|
|
||||||
// Map reserved shortcuts to their equivalent key
|
|
||||||
// https://github.com/cronvel/terminal-kit/issues/101
|
|
||||||
for (let i = 0; i < output.length; i++) {
|
|
||||||
const newKeys = output[i].keys.map(k => {
|
|
||||||
k = k.replace(/CTRL_H/g, 'BACKSPACE');
|
|
||||||
k = k.replace(/CTRL_I/g, 'TAB');
|
|
||||||
k = k.replace(/CTRL_M/g, 'ENTER');
|
|
||||||
return k;
|
|
||||||
});
|
|
||||||
output[i].keys = newKeys;
|
|
||||||
}
|
|
||||||
return output;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
commandList(argv) {
|
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
|
||||||
if (argv.length && argv[0] === 'batch') {
|
|
||||||
const commands = [];
|
|
||||||
const commandLines = splitCommandBatch(yield (0, fs_extra_1.readFile)(argv[1], 'utf-8'));
|
|
||||||
for (const commandLine of commandLines) {
|
|
||||||
if (!commandLine.trim())
|
|
||||||
continue;
|
|
||||||
const splitted = (0, utils_1.splitCommandString)(commandLine.trim());
|
|
||||||
commands.push(splitted);
|
|
||||||
}
|
|
||||||
return commands;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return [argv];
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
// We need this special case here because by the time the `version` command
|
|
||||||
// runs, the keychain has already been setup.
|
|
||||||
checkIfKeychainEnabled(argv) {
|
|
||||||
return argv.indexOf('version') < 0;
|
|
||||||
}
|
|
||||||
start(argv) {
|
|
||||||
const _super = Object.create(null, {
|
|
||||||
start: { get: () => super.start }
|
|
||||||
});
|
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
|
||||||
const keychainEnabled = this.checkIfKeychainEnabled(argv);
|
|
||||||
argv = yield _super.start.call(this, argv, { keychainEnabled });
|
|
||||||
cliUtils.setStdout((object) => {
|
|
||||||
return this.stdout(object);
|
|
||||||
});
|
|
||||||
this.initRedux();
|
|
||||||
// If we have some arguments left at this point, it's a command
|
|
||||||
// so execute it.
|
|
||||||
if (argv.length) {
|
|
||||||
this.gui_ = this.dummyGui();
|
|
||||||
this.currentFolder_ = yield Folder_1.default.load(Setting_1.default.value('activeFolderId'));
|
|
||||||
yield this.applySettingsSideEffects();
|
|
||||||
try {
|
|
||||||
const commands = yield this.commandList(argv);
|
|
||||||
for (const command of commands) {
|
|
||||||
yield this.execCommand(command);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (error) {
|
|
||||||
if (this.showStackTraces_) {
|
|
||||||
console.error(error);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// eslint-disable-next-line no-console
|
|
||||||
console.info(error.message);
|
|
||||||
}
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
yield Setting_1.default.saveAll();
|
|
||||||
// Need to call exit() explicitly, otherwise Node wait for any timeout to complete
|
|
||||||
// https://stackoverflow.com/questions/18050095
|
|
||||||
process.exit(0);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Otherwise open the GUI
|
|
||||||
const keymap = yield this.loadKeymaps();
|
|
||||||
const AppGui = require('./app-gui.js');
|
|
||||||
this.gui_ = new AppGui(this, this.store(), keymap);
|
|
||||||
this.gui_.setLogger(this.logger());
|
|
||||||
yield this.gui_.start();
|
|
||||||
// Since the settings need to be loaded before the store is created, it will never
|
|
||||||
// receive the SETTING_UPDATE_ALL even, which mean state.settings will not be
|
|
||||||
// initialised. So we manually call dispatchUpdateAll() to force an update.
|
|
||||||
Setting_1.default.dispatchUpdateAll();
|
|
||||||
yield (0, folders_screen_utils_js_1.refreshFolders)((action) => this.store().dispatch(action));
|
|
||||||
const tags = yield Tag_1.default.allWithNotes();
|
|
||||||
ResourceService_1.default.runInBackground();
|
|
||||||
RevisionService_1.default.instance().runInBackground();
|
|
||||||
this.dispatch({
|
|
||||||
type: 'TAG_UPDATE_ALL',
|
|
||||||
items: tags,
|
|
||||||
});
|
|
||||||
this.store().dispatch({
|
|
||||||
type: 'FOLDER_SELECT',
|
|
||||||
id: Setting_1.default.value('activeFolderId'),
|
|
||||||
});
|
|
||||||
this.startRotatingLogMaintenance(Setting_1.default.value('profileDir'));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let application_ = null;
|
|
||||||
function app() {
|
|
||||||
if (application_)
|
|
||||||
return application_;
|
|
||||||
application_ = new Application();
|
|
||||||
return application_;
|
|
||||||
}
|
|
||||||
exports.default = app;
|
|
||||||
//# sourceMappingURL=app.js.map
|
|
@@ -22,10 +22,14 @@ const { splitCommandBatch } = require('@joplin/lib/string-utils');
|
|||||||
|
|
||||||
class Application extends BaseApplication {
|
class Application extends BaseApplication {
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
private commands_: Record<string, any> = {};
|
private commands_: Record<string, any> = {};
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
private commandMetadata_: any = null;
|
private commandMetadata_: any = null;
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
private activeCommand_: any = null;
|
private activeCommand_: any = null;
|
||||||
private allCommandsLoaded_ = false;
|
private allCommandsLoaded_ = false;
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
private gui_: any = null;
|
private gui_: any = null;
|
||||||
private cache_ = new Cache();
|
private cache_ = new Cache();
|
||||||
|
|
||||||
@@ -37,6 +41,7 @@ class Application extends BaseApplication {
|
|||||||
return this.gui().stdoutMaxWidth();
|
return this.gui().stdoutMaxWidth();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public async guessTypeAndLoadItem(pattern: string, options: any = null) {
|
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) {
|
||||||
@@ -46,6 +51,7 @@ class Application extends BaseApplication {
|
|||||||
return this.loadItem(type, pattern, options);
|
return this.loadItem(type, pattern, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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) {
|
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);
|
||||||
|
|
||||||
@@ -70,6 +76,7 @@ class Application extends BaseApplication {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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)[]> {
|
public async loadItems(type: ModelType | 'folderOrNote', pattern: string, options: any = null): Promise<(FolderEntity | NoteEntity)[]> {
|
||||||
if (type === 'folderOrNote') {
|
if (type === 'folderOrNote') {
|
||||||
const folders: FolderEntity[] = await this.loadItems(BaseModel.TYPE_FOLDER, pattern, options);
|
const folders: FolderEntity[] = await this.loadItems(BaseModel.TYPE_FOLDER, pattern, options);
|
||||||
@@ -95,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);
|
||||||
}
|
}
|
||||||
@@ -160,6 +167,7 @@ class Application extends BaseApplication {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (uiType !== null) {
|
if (uiType !== null) {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
const temp: Record<string, any> = {};
|
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;
|
||||||
@@ -219,6 +227,7 @@ 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) {
|
||||||
|
// 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));
|
const e: any = new Error(_('No such command: %s', name));
|
||||||
e.type = 'notFound';
|
e.type = 'notFound';
|
||||||
throw e;
|
throw e;
|
||||||
@@ -238,6 +247,7 @@ class Application extends BaseApplication {
|
|||||||
isDummy: () => {
|
isDummy: () => {
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
prompt: (initialText = '', promptString = '', options: any = null) => {
|
prompt: (initialText = '', promptString = '', options: any = null) => {
|
||||||
return cliUtils.prompt(initialText, promptString, options);
|
return cliUtils.prompt(initialText, promptString, options);
|
||||||
},
|
},
|
||||||
@@ -260,6 +270,7 @@ class Application extends BaseApplication {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public async execCommand(argv: string[]): Promise<any> {
|
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);
|
||||||
@@ -307,6 +318,7 @@ class Application extends BaseApplication {
|
|||||||
{ 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 },
|
||||||
@@ -389,6 +401,7 @@ class Application extends BaseApplication {
|
|||||||
|
|
||||||
argv = await super.start(argv, { keychainEnabled });
|
argv = await super.start(argv, { keychainEnabled });
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
cliUtils.setStdout((object: any) => {
|
cliUtils.setStdout((object: any) => {
|
||||||
return this.stdout(object);
|
return this.stdout(object);
|
||||||
});
|
});
|
||||||
@@ -438,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 refreshFolders((action: any) => this.store().dispatch(action));
|
// 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();
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
|
@@ -37,6 +37,7 @@ class Command extends BaseCommand {
|
|||||||
return markdownUtils.createMarkdownTable(headers, tableFields);
|
return markdownUtils.createMarkdownTable(headers, tableFields);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public override async action(args: any) {
|
public override async action(args: any) {
|
||||||
const models = [
|
const models = [
|
||||||
{
|
{
|
||||||
@@ -82,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('');
|
||||||
@@ -149,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('');
|
||||||
@@ -199,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('---- | -----');
|
||||||
@@ -400,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('');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@@ -13,6 +13,7 @@ class Command extends BaseCommand {
|
|||||||
return _('Attaches the given file to the note.');
|
return _('Attaches the given file to the note.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public override async action(args: any) {
|
public override async action(args: any) {
|
||||||
const title = args['note'];
|
const title = args['note'];
|
||||||
|
|
||||||
|
@@ -18,6 +18,7 @@ class Command extends BaseCommand {
|
|||||||
return [['-v, --verbose', _('Displays the complete information about note.')]];
|
return [['-v, --verbose', _('Displays the complete information about note.')]];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public override async action(args: any) {
|
public override async action(args: any) {
|
||||||
const title = args['note'];
|
const title = args['note'];
|
||||||
|
|
||||||
|
@@ -27,6 +27,7 @@ class Command extends BaseCommand {
|
|||||||
return new Promise<void>((resolve, reject) => {
|
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;
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
const chunks: any = [];
|
const chunks: any = [];
|
||||||
|
|
||||||
inputStream.on('readable', () => {
|
inputStream.on('readable', () => {
|
||||||
@@ -67,6 +68,7 @@ class Command extends BaseCommand {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public override async action(args: any) {
|
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;
|
||||||
@@ -91,6 +93,7 @@ class Command extends BaseCommand {
|
|||||||
keys.sort();
|
keys.sort();
|
||||||
|
|
||||||
if (isExport) {
|
if (isExport) {
|
||||||
|
// 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 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;
|
||||||
|
@@ -13,6 +13,7 @@ class Command extends BaseCommand {
|
|||||||
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.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public override async action(args: any) {
|
public override async action(args: any) {
|
||||||
let folder = null;
|
let folder = null;
|
||||||
if (args['notebook']) {
|
if (args['notebook']) {
|
||||||
|
@@ -15,6 +15,7 @@ class Command extends BaseCommand {
|
|||||||
return _('Marks a to-do as done.');
|
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) {
|
public static async handleAction(commandInstance: BaseCommand, args: any, isCompleted: boolean) {
|
||||||
const note: NoteEntity = await app().loadItem(BaseModel.TYPE_NOTE, args.note);
|
const note: NoteEntity = await app().loadItem(BaseModel.TYPE_NOTE, args.note);
|
||||||
commandInstance.encryptionCheck(note);
|
commandInstance.encryptionCheck(note);
|
||||||
@@ -31,6 +32,7 @@ class Command extends BaseCommand {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public override async action(args: any) {
|
public override async action(args: any) {
|
||||||
await Command.handleAction(this, args, true);
|
await Command.handleAction(this, args, true);
|
||||||
}
|
}
|
||||||
|
@@ -2,6 +2,7 @@ import BaseCommand from './base-command';
|
|||||||
import Folder from '@joplin/lib/models/Folder';
|
import Folder from '@joplin/lib/models/Folder';
|
||||||
import Note from '@joplin/lib/models/Note';
|
import Note from '@joplin/lib/models/Note';
|
||||||
import Tag from '@joplin/lib/models/Tag';
|
import Tag from '@joplin/lib/models/Tag';
|
||||||
|
import { FolderEntity, NoteEntity } from '@joplin/lib/services/database/types';
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
public override usage() {
|
public override usage() {
|
||||||
@@ -17,7 +18,7 @@ class Command extends BaseCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public override 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 });
|
||||||
|
@@ -17,6 +17,7 @@ class Command extends BaseCommand {
|
|||||||
return _('Edit note.');
|
return _('Edit note.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public override async action(args: any) {
|
public override async action(args: any) {
|
||||||
let tempFilePath: string|null = null;
|
let tempFilePath: string|null = null;
|
||||||
|
|
||||||
|
@@ -24,6 +24,7 @@ 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.')]];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public override async action(args: any) {
|
public override async action(args: any) {
|
||||||
const exportOptions: ExportOptions = {};
|
const exportOptions: ExportOptions = {};
|
||||||
exportOptions.path = args.path;
|
exportOptions.path = args.path;
|
||||||
@@ -35,10 +36,12 @@ 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));
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
exportOptions.sourceNoteIds = notes.map((n: any) => n.id);
|
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));
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
exportOptions.sourceFolderIds = folders.map((n: any) => n.id);
|
exportOptions.sourceFolderIds = folders.map((n: any) => n.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -13,6 +13,7 @@ class Command extends BaseCommand {
|
|||||||
return _('Displays a geolocation URL for the note.');
|
return _('Displays a geolocation URL for the note.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public override async action(args: any) {
|
public override async action(args: any) {
|
||||||
const title = args['note'];
|
const title = args['note'];
|
||||||
|
|
||||||
|
@@ -29,6 +29,7 @@ class Command extends BaseCommand {
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public override async action(args: any) {
|
public override async action(args: any) {
|
||||||
const stdoutWidth = app().commandStdoutMaxWidth();
|
const stdoutWidth = app().commandStdoutMaxWidth();
|
||||||
|
|
||||||
|
@@ -30,6 +30,7 @@ class Command extends BaseCommand {
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public override async action(args: any) {
|
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);
|
||||||
|
|
||||||
|
@@ -7,6 +7,7 @@ import Setting from '@joplin/lib/models/Setting';
|
|||||||
import Note from '@joplin/lib/models/Note';
|
import Note from '@joplin/lib/models/Note';
|
||||||
const { sprintf } = require('sprintf-js');
|
const { sprintf } = require('sprintf-js');
|
||||||
import time from '@joplin/lib/time';
|
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 {
|
||||||
@@ -33,11 +34,13 @@ class Command extends BaseCommand {
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public override async action(args: any) {
|
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;
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
const queryOptions: any = {};
|
const queryOptions: any = {};
|
||||||
if (options.limit) queryOptions.limit = options.limit;
|
if (options.limit) queryOptions.limit = options.limit;
|
||||||
if (options.sort) {
|
if (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(' ');
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
@@ -14,6 +14,7 @@ class Command extends BaseCommand {
|
|||||||
return _('Moves the given <item> to [notebook]');
|
return _('Moves the given <item> to [notebook]');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public override async action(args: any) {
|
public override async action(args: any) {
|
||||||
const pattern = args['item'];
|
const pattern = args['item'];
|
||||||
const destination = args['notebook'];
|
const destination = args['notebook'];
|
||||||
|
@@ -14,6 +14,7 @@ class Command extends BaseCommand {
|
|||||||
return _('Renames the given <item> (note or notebook) to <name>.');
|
return _('Renames the given <item> (note or notebook) to <name>.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public override async action(args: any) {
|
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
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;
|
81
packages/app-cli/app/command-rmbook.test.ts
Normal file
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();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
@@ -3,6 +3,7 @@ import app from './app';
|
|||||||
import { _ } from '@joplin/lib/locale';
|
import { _ } from '@joplin/lib/locale';
|
||||||
import Folder from '@joplin/lib/models/Folder';
|
import Folder from '@joplin/lib/models/Folder';
|
||||||
import BaseModel from '@joplin/lib/BaseModel';
|
import BaseModel from '@joplin/lib/BaseModel';
|
||||||
|
import { substrWithEllipsis } from '@joplin/lib/string-utils';
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
public override usage() {
|
public override usage() {
|
||||||
@@ -14,19 +15,32 @@ class Command extends BaseCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public override options() {
|
public override options() {
|
||||||
return [['-f, --force', _('Deletes the notebook without asking for confirmation.')]];
|
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) {
|
public override async action(args: any) {
|
||||||
const pattern = args['notebook'];
|
const pattern = args['notebook'];
|
||||||
const force = args.options && args.options.force === true;
|
const force = args.options && args.options.force === true;
|
||||||
|
|
||||||
const folder = await app().loadItem(BaseModel.TYPE_FOLDER, pattern);
|
const folder = await app().loadItem(BaseModel.TYPE_FOLDER, pattern);
|
||||||
if (!folder) throw new Error(_('Cannot find "%s".', 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' });
|
|
||||||
|
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;
|
if (!ok) return;
|
||||||
|
|
||||||
await Folder.delete(folder.id);
|
await Folder.delete(folder.id, { toTrash: !permanent, sourceDescription: 'rmbook command' });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
57
packages/app-cli/app/command-rmnote.test.ts
Normal file
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);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
@@ -2,7 +2,8 @@ import BaseCommand from './base-command';
|
|||||||
import app from './app';
|
import app from './app';
|
||||||
import { _ } from '@joplin/lib/locale';
|
import { _ } from '@joplin/lib/locale';
|
||||||
import Note from '@joplin/lib/models/Note';
|
import Note from '@joplin/lib/models/Note';
|
||||||
import BaseModel from '@joplin/lib/BaseModel';
|
import BaseModel, { DeleteOptions } from '@joplin/lib/BaseModel';
|
||||||
|
import { NoteEntity } from '@joplin/lib/services/database/types';
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
public override usage() {
|
public override usage() {
|
||||||
@@ -14,20 +15,41 @@ class Command extends BaseCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public override options() {
|
public override options() {
|
||||||
return [['-f, --force', _('Deletes the notes without asking for confirmation.')]];
|
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) {
|
public override async action(args: any) {
|
||||||
const pattern = args['note-pattern'];
|
const pattern = args['note-pattern'];
|
||||||
const force = args.options && args.options.force === true;
|
const force = args.options && args.options.force === true;
|
||||||
|
|
||||||
const notes = await app().loadItems(BaseModel.TYPE_NOTE, pattern);
|
const notes: NoteEntity[] = await app().loadItems(BaseModel.TYPE_NOTE, pattern);
|
||||||
if (!notes.length) throw new Error(_('Cannot find "%s".', 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' });
|
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;
|
if (!ok) return;
|
||||||
const ids = notes.map((n: any) => n.id);
|
|
||||||
await Note.batchDelete(ids);
|
const ids = notes.map(n => n.id);
|
||||||
|
const options: DeleteOptions = {
|
||||||
|
toTrash: !permanent,
|
||||||
|
sourceDescription: 'rmnote',
|
||||||
|
};
|
||||||
|
await Note.batchDelete(ids, options);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -22,6 +22,7 @@ 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(', '));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public override async action(args: any) {
|
public override async action(args: any) {
|
||||||
const title = args['note'];
|
const title = args['note'];
|
||||||
const propName = args['name'];
|
const propName = args['name'];
|
||||||
@@ -36,6 +37,7 @@ class Command extends BaseCommand {
|
|||||||
|
|
||||||
const timestamp = Date.now();
|
const timestamp = Date.now();
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
const newNote: any = {
|
const newNote: any = {
|
||||||
id: notes[i].id,
|
id: notes[i].id,
|
||||||
type_: notes[i].type_,
|
type_: notes[i].type_,
|
||||||
|
@@ -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;
|
||||||
|
@@ -14,12 +14,18 @@ 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(' '));
|
||||||
|
@@ -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' }));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -16,6 +16,7 @@ class Command extends BaseCommand {
|
|||||||
return ['cli'];
|
return ['cli'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
public override async action(args: any) {
|
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']));
|
||||||
|
@@ -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;
|
||||||
|
@@ -26,7 +26,7 @@ const sharp = require('sharp');
|
|||||||
const { shimInit } = require('@joplin/lib/shim-init-node.js');
|
const { shimInit } = require('@joplin/lib/shim-init-node.js');
|
||||||
const shim = require('@joplin/lib/shim').default;
|
const shim = require('@joplin/lib/shim').default;
|
||||||
const { _ } = require('@joplin/lib/locale');
|
const { _ } = require('@joplin/lib/locale');
|
||||||
const { FileApiDriverLocal } = require('@joplin/lib/file-api-driver-local');
|
const FileApiDriverLocal = require('@joplin/lib/file-api-driver-local').default;
|
||||||
const EncryptionService = require('@joplin/lib/services/e2ee/EncryptionService').default;
|
const EncryptionService = require('@joplin/lib/services/e2ee/EncryptionService').default;
|
||||||
const envFromArgs = require('@joplin/lib/envFromArgs');
|
const envFromArgs = require('@joplin/lib/envFromArgs');
|
||||||
const nodeSqlite = require('sqlite3');
|
const nodeSqlite = require('sqlite3');
|
||||||
|
@@ -5,17 +5,22 @@ import executeSandboxCall from '@joplin/lib/services/plugins/utils/executeSandbo
|
|||||||
import Global from '@joplin/lib/services/plugins/api/Global';
|
import Global from '@joplin/lib/services/plugins/api/Global';
|
||||||
import mapEventHandlersToIds, { EventHandlers } from '@joplin/lib/services/plugins/utils/mapEventHandlersToIds';
|
import mapEventHandlersToIds, { EventHandlers } from '@joplin/lib/services/plugins/utils/mapEventHandlersToIds';
|
||||||
import uuid from '@joplin/lib/uuid';
|
import uuid from '@joplin/lib/uuid';
|
||||||
|
import Joplin from '@joplin/lib/services/plugins/api/Joplin';
|
||||||
|
import { Console } from 'console';
|
||||||
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);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -30,10 +35,18 @@ function createConsoleWrapper(pluginId: string) {
|
|||||||
// For example, all plugin calls go through a proxy, however they could made directly since
|
// For example, all plugin calls go through a proxy, however they could made directly since
|
||||||
// the plugin script is running within the same process as the main app.
|
// the plugin script is running within the same process as the main app.
|
||||||
|
|
||||||
|
interface SandboxProxy {
|
||||||
|
joplin: Joplin;
|
||||||
|
console: typeof Console;
|
||||||
|
stop: ()=> void;
|
||||||
|
}
|
||||||
|
|
||||||
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 = {};
|
||||||
|
private sandboxProxies: Map<string, SandboxProxy> = new Map();
|
||||||
|
|
||||||
public constructor() {
|
public constructor() {
|
||||||
super();
|
super();
|
||||||
@@ -41,13 +54,21 @@ 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) {
|
||||||
|
let stopped = false;
|
||||||
|
|
||||||
|
// 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[]) => {
|
||||||
|
if (stopped) {
|
||||||
|
throw new Error(`Plugin with ID ${pluginId} has been stopped. Cannot execute sandbox call.`);
|
||||||
|
}
|
||||||
|
|
||||||
const callId = `${pluginId}::${path}::${uuid.createNano()}`;
|
const callId = `${pluginId}::${path}::${uuid.createNano()}`;
|
||||||
this.activeSandboxCalls_[callId] = true;
|
this.activeSandboxCalls_[callId] = true;
|
||||||
const promise = executeSandboxCall(pluginId, sandbox, `joplin.${path}`, mapEventHandlersToIds(args, this.eventHandlers_), this.eventHandler);
|
const promise = executeSandboxCall(pluginId, sandbox, `joplin.${path}`, mapEventHandlersToIds(args, this.eventHandlers_), this.eventHandler);
|
||||||
@@ -58,10 +79,15 @@ export default class PluginRunner extends BasePluginRunner {
|
|||||||
return promise;
|
return promise;
|
||||||
};
|
};
|
||||||
|
|
||||||
return {
|
const proxy = {
|
||||||
joplin: sandboxProxy(target),
|
joplin: sandboxProxy(target),
|
||||||
console: createConsoleWrapper(pluginId),
|
console: createConsoleWrapper(pluginId),
|
||||||
|
stop: () => {
|
||||||
|
stopped = true;
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
this.sandboxProxies.set(pluginId, proxy);
|
||||||
|
return proxy;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async run(plugin: Plugin, sandbox: Global): Promise<void> {
|
public async run(plugin: Plugin, sandbox: Global): Promise<void> {
|
||||||
@@ -84,6 +110,13 @@ export default class PluginRunner extends BasePluginRunner {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async stop(plugin: Plugin): Promise<void> {
|
||||||
|
// TODO: Node VM doesn't support stopping plugins without running them in a child process.
|
||||||
|
// For now, we stop the plugin by making interactions with the Joplin API throw Errors.
|
||||||
|
const proxy = this.sandboxProxies.get(plugin.id);
|
||||||
|
proxy?.stop();
|
||||||
|
}
|
||||||
|
|
||||||
public async waitForSandboxCalls(): Promise<void> {
|
public async waitForSandboxCalls(): Promise<void> {
|
||||||
const startTime = Date.now();
|
const startTime = Date.now();
|
||||||
// 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
|
||||||
|
@@ -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';
|
||||||
|
@@ -3,7 +3,7 @@ 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);
|
||||||
|
@@ -35,15 +35,15 @@
|
|||||||
],
|
],
|
||||||
"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",
|
||||||
@@ -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.1",
|
"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.19.6",
|
"@types/node": "18.19.10",
|
||||||
"@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') {
|
||||||
|
@@ -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();
|
||||||
|
|
||||||
|
@@ -7,9 +7,10 @@
|
|||||||
<updated>20231224T151443Z</updated>
|
<updated>20231224T151443Z</updated>
|
||||||
<content>
|
<content>
|
||||||
<![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<![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/" rel="noopener noreferrer" rev="en_rl_none">Note 2</a><a href="evernote:///view/5223870/s49/9cd5e810-fa03-429a-8194-ab847f2f1ab2/c99d9e01-ca35-4c75-ba63-f0c0ef97787d/" rel="noopener noreferrer" rev="en_rl_none">Note 3</a></div></en-note> ]]>
|
<!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>
|
</content>
|
||||||
</note>
|
</note>
|
||||||
|
|
||||||
<note>
|
<note>
|
||||||
<title>Note 2</title>
|
<title>Note 2</title>
|
||||||
<created>20160730T111759Z</created>
|
<created>20160730T111759Z</created>
|
||||||
@@ -19,15 +20,37 @@
|
|||||||
<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd"><en-note><div>Testing</div></en-note> ]]>
|
<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd"><en-note><div>Testing</div></en-note> ]]>
|
||||||
</content>
|
</content>
|
||||||
</note>
|
</note>
|
||||||
|
|
||||||
<note>
|
<note>
|
||||||
<title>Note 3</title>
|
<title>Note 3</title>
|
||||||
<created>20160730T111759Z</created>
|
<created>20160730T111759Z</created>
|
||||||
<updated>20160730T111807Z</updated>
|
<updated>20160730T111807Z</updated>
|
||||||
<content>
|
<content>
|
||||||
<![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<![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/" rel="noopener noreferrer" rev="en_rl_none">Ambiguous note</a></div></en-note> ]]>
|
<!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>
|
</content>
|
||||||
</note>
|
</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>
|
<note>
|
||||||
<title>Ambiguous note</title>
|
<title>Ambiguous note</title>
|
||||||
<created>20160730T111759Z</created>
|
<created>20160730T111759Z</created>
|
||||||
@@ -37,6 +60,7 @@
|
|||||||
<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd"><en-note><div>Testing</div></en-note> ]]>
|
<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd"><en-note><div>Testing</div></en-note> ]]>
|
||||||
</content>
|
</content>
|
||||||
</note>
|
</note>
|
||||||
|
|
||||||
<note>
|
<note>
|
||||||
<title>Ambiguous note</title>
|
<title>Ambiguous note</title>
|
||||||
<created>20160730T111759Z</created>
|
<created>20160730T111759Z</created>
|
||||||
|
24
packages/app-cli/tests/html_to_md/code_multiline_1.html
Normal file
24
packages/app-cli/tests/html_to_md/code_multiline_1.html
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<!-- this is from: https://flaviocopes.com/bubble-sort-javascript/ -->
|
||||||
|
<div><pre class="astro-code github-dark" style="background-color: rgb(36, 41, 46); color: rgb(225, 228, 232); overflow-x: auto; --darkreader-inline-bgcolor: #1d2125; --darkreader-inline-color: #d7d4cf; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;" tabindex="0" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code><span class="line"><span style="color: rgb(249, 117, 131); --darkreader-inline-color: #f96e7c;" data-darkreader-inline-color="">const</span><span style="color: rgb(179, 146, 240); --darkreader-inline-color: #ab86ee;" data-darkreader-inline-color=""> bubbleSort</span><span style="color: rgb(249, 117, 131); --darkreader-inline-color: #f96e7c;" data-darkreader-inline-color=""> =</span><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color=""> (</span><span style="color: rgb(255, 171, 112); --darkreader-inline-color: #ffa668;" data-darkreader-inline-color="">originalArray</span><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color="">) </span><span style="color: rgb(249, 117, 131); --darkreader-inline-color: #f96e7c;" data-darkreader-inline-color="">=></span><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color=""> {</span></span>
|
||||||
|
<span class="line"><span style="color: rgb(249, 117, 131); --darkreader-inline-color: #f96e7c;" data-darkreader-inline-color=""> let</span><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color=""> swapped </span><span style="color: rgb(249, 117, 131); --darkreader-inline-color: #f96e7c;" data-darkreader-inline-color="">=</span><span style="color: rgb(121, 184, 255); --darkreader-inline-color: #6ebdff;" data-darkreader-inline-color=""> false</span></span>
|
||||||
|
<span class="line"></span>
|
||||||
|
<span class="line"><span style="color: rgb(249, 117, 131); --darkreader-inline-color: #f96e7c;" data-darkreader-inline-color=""> const</span><span style="color: rgb(121, 184, 255); --darkreader-inline-color: #6ebdff;" data-darkreader-inline-color=""> a</span><span style="color: rgb(249, 117, 131); --darkreader-inline-color: #f96e7c;" data-darkreader-inline-color=""> =</span><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color=""> [</span><span style="color: rgb(249, 117, 131); --darkreader-inline-color: #f96e7c;" data-darkreader-inline-color="">...</span><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color="">originalArray]</span></span>
|
||||||
|
<span class="line"></span>
|
||||||
|
<span class="line"><span style="color: rgb(249, 117, 131); --darkreader-inline-color: #f96e7c;" data-darkreader-inline-color=""> for</span><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color=""> (</span><span style="color: rgb(249, 117, 131); --darkreader-inline-color: #f96e7c;" data-darkreader-inline-color="">let</span><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color=""> i </span><span style="color: rgb(249, 117, 131); --darkreader-inline-color: #f96e7c;" data-darkreader-inline-color="">=</span><span style="color: rgb(121, 184, 255); --darkreader-inline-color: #6ebdff;" data-darkreader-inline-color=""> 1</span><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color="">; i </span><span style="color: rgb(249, 117, 131); --darkreader-inline-color: #f96e7c;" data-darkreader-inline-color=""><</span><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color=""> a.</span><span style="color: rgb(121, 184, 255); --darkreader-inline-color: #6ebdff;" data-darkreader-inline-color="">length</span><span style="color: rgb(249, 117, 131); --darkreader-inline-color: #f96e7c;" data-darkreader-inline-color=""> -</span><span style="color: rgb(121, 184, 255); --darkreader-inline-color: #6ebdff;" data-darkreader-inline-color=""> 1</span><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color="">; i</span><span style="color: rgb(249, 117, 131); --darkreader-inline-color: #f96e7c;" data-darkreader-inline-color="">++</span><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color="">) {</span></span>
|
||||||
|
<span class="line"><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color=""> swapped </span><span style="color: rgb(249, 117, 131); --darkreader-inline-color: #f96e7c;" data-darkreader-inline-color="">=</span><span style="color: rgb(121, 184, 255); --darkreader-inline-color: #6ebdff;" data-darkreader-inline-color=""> false</span></span>
|
||||||
|
<span class="line"></span>
|
||||||
|
<span class="line"><span style="color: rgb(249, 117, 131); --darkreader-inline-color: #f96e7c;" data-darkreader-inline-color=""> for</span><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color=""> (</span><span style="color: rgb(249, 117, 131); --darkreader-inline-color: #f96e7c;" data-darkreader-inline-color="">let</span><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color=""> j </span><span style="color: rgb(249, 117, 131); --darkreader-inline-color: #f96e7c;" data-darkreader-inline-color="">=</span><span style="color: rgb(121, 184, 255); --darkreader-inline-color: #6ebdff;" data-darkreader-inline-color=""> 0</span><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color="">; j </span><span style="color: rgb(249, 117, 131); --darkreader-inline-color: #f96e7c;" data-darkreader-inline-color=""><</span><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color=""> a.</span><span style="color: rgb(121, 184, 255); --darkreader-inline-color: #6ebdff;" data-darkreader-inline-color="">length</span><span style="color: rgb(249, 117, 131); --darkreader-inline-color: #f96e7c;" data-darkreader-inline-color=""> -</span><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color=""> i; j</span><span style="color: rgb(249, 117, 131); --darkreader-inline-color: #f96e7c;" data-darkreader-inline-color="">++</span><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color="">) {</span></span>
|
||||||
|
<span class="line"><span style="color: rgb(249, 117, 131); --darkreader-inline-color: #f96e7c;" data-darkreader-inline-color=""> if</span><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color=""> (a[j </span><span style="color: rgb(249, 117, 131); --darkreader-inline-color: #f96e7c;" data-darkreader-inline-color="">+</span><span style="color: rgb(121, 184, 255); --darkreader-inline-color: #6ebdff;" data-darkreader-inline-color=""> 1</span><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color="">] </span><span style="color: rgb(249, 117, 131); --darkreader-inline-color: #f96e7c;" data-darkreader-inline-color=""><</span><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color=""> a[j]) {</span></span>
|
||||||
|
<span class="line"><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color=""> ;[a[j], a[j </span><span style="color: rgb(249, 117, 131); --darkreader-inline-color: #f96e7c;" data-darkreader-inline-color="">+</span><span style="color: rgb(121, 184, 255); --darkreader-inline-color: #6ebdff;" data-darkreader-inline-color=""> 1</span><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color="">]] </span><span style="color: rgb(249, 117, 131); --darkreader-inline-color: #f96e7c;" data-darkreader-inline-color="">=</span><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color=""> [a[j </span><span style="color: rgb(249, 117, 131); --darkreader-inline-color: #f96e7c;" data-darkreader-inline-color="">+</span><span style="color: rgb(121, 184, 255); --darkreader-inline-color: #6ebdff;" data-darkreader-inline-color=""> 1</span><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color="">], a[j]]</span></span>
|
||||||
|
<span class="line"><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color=""> swapped </span><span style="color: rgb(249, 117, 131); --darkreader-inline-color: #f96e7c;" data-darkreader-inline-color="">=</span><span style="color: rgb(121, 184, 255); --darkreader-inline-color: #6ebdff;" data-darkreader-inline-color=""> true</span></span>
|
||||||
|
<span class="line"><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color=""> }</span></span>
|
||||||
|
<span class="line"><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color=""> }</span></span>
|
||||||
|
<span class="line"></span>
|
||||||
|
<span class="line"><span style="color: rgb(249, 117, 131); --darkreader-inline-color: #f96e7c;" data-darkreader-inline-color=""> if</span><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color=""> (</span><span style="color: rgb(249, 117, 131); --darkreader-inline-color: #f96e7c;" data-darkreader-inline-color="">!</span><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color="">swapped) {</span></span>
|
||||||
|
<span class="line"><span style="color: rgb(249, 117, 131); --darkreader-inline-color: #f96e7c;" data-darkreader-inline-color=""> return</span><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color=""> a</span></span>
|
||||||
|
<span class="line"><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color=""> }</span></span>
|
||||||
|
<span class="line"><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color=""> }</span></span>
|
||||||
|
<span class="line"></span>
|
||||||
|
<span class="line"><span style="color: rgb(249, 117, 131); --darkreader-inline-color: #f96e7c;" data-darkreader-inline-color=""> return</span><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color=""> a</span></span>
|
||||||
|
<span class="line"><span style="color: rgb(225, 228, 232); --darkreader-inline-color: #d7d4cf;" data-darkreader-inline-color="">}</span></span></code></pre>
|
||||||
|
<p></p></div>
|
24
packages/app-cli/tests/html_to_md/code_multiline_1.md
Normal file
24
packages/app-cli/tests/html_to_md/code_multiline_1.md
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
```
|
||||||
|
const bubbleSort = (originalArray) => {
|
||||||
|
let swapped = false
|
||||||
|
|
||||||
|
const a = [...originalArray]
|
||||||
|
|
||||||
|
for (let i = 1; i < a.length - 1; i++) {
|
||||||
|
swapped = false
|
||||||
|
|
||||||
|
for (let j = 0; j < a.length - i; j++) {
|
||||||
|
if (a[j + 1] < a[j]) {
|
||||||
|
;[a[j], a[j + 1]] = [a[j + 1], a[j]]
|
||||||
|
swapped = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!swapped) {
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
```
|
21
packages/app-cli/tests/html_to_md/code_multiline_2.html
Normal file
21
packages/app-cli/tests/html_to_md/code_multiline_2.html
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
<!-- this is from: https://blog.csdn.net/qq_42025798/article/details/121727781 -->
|
||||||
|
<div><pre data-index="6" class="prettyprint set-code-show" style="font-family: "Source Code Pro", "DejaVu Sans Mono", "Ubuntu Mono", "Anonymous Pro", "Droid Sans Mono", Menlo, Monaco, Consolas, Inconsolata, Courier, monospace, "PingFang SC", "Microsoft YaHei", sans-serif;"><code class="prism language-java has-numbering" onclick="mdcp.copyCode(event)" style="position: unset;"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">User</span> <span class="token punctuation">{</span>
|
||||||
|
<span class="token keyword">private</span> <span class="token class-name">String</span> name<span class="token punctuation">;</span>
|
||||||
|
|
||||||
|
<span class="token keyword">public</span> <span class="token class-name">String</span> <span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
|
||||||
|
<span class="token keyword">return</span> name<span class="token punctuation">;</span>
|
||||||
|
<span class="token punctuation">}</span>
|
||||||
|
|
||||||
|
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">setName</span><span class="token punctuation">(</span><span class="token class-name">String</span> name<span class="token punctuation">)</span> <span class="token punctuation">{</span>
|
||||||
|
<span class="token keyword">this</span><span class="token punctuation">.</span>name <span class="token operator">=</span> name<span class="token punctuation">;</span>
|
||||||
|
<span class="token punctuation">}</span>
|
||||||
|
|
||||||
|
<span class="token annotation punctuation">@Override</span>
|
||||||
|
<span class="token keyword">public</span> <span class="token class-name">String</span> <span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
|
||||||
|
<span class="token keyword">return</span> <span class="token string">"User{"</span> <span class="token operator">+</span>
|
||||||
|
<span class="token string">"name='"</span> <span class="token operator">+</span> name <span class="token operator">+</span> <span class="token string">'\''</span> <span class="token operator">+</span>
|
||||||
|
<span class="token string">'}'</span><span class="token punctuation">;</span>
|
||||||
|
<span class="token punctuation">}</span>
|
||||||
|
<span class="token punctuation">}</span>
|
||||||
|
</code><ul class="pre-numbering" style=""><li style="color: rgb(153, 153, 153); --darkreader-inline-color: #a8a095;" data-darkreader-inline-color="">1</li><li style="color: rgb(153, 153, 153); --darkreader-inline-color: #a8a095;" data-darkreader-inline-color="">2</li><li style="color: rgb(153, 153, 153); --darkreader-inline-color: #a8a095;" data-darkreader-inline-color="">3</li><li style="color: rgb(153, 153, 153); --darkreader-inline-color: #a8a095;" data-darkreader-inline-color="">4</li><li style="color: rgb(153, 153, 153); --darkreader-inline-color: #a8a095;" data-darkreader-inline-color="">5</li><li style="color: rgb(153, 153, 153); --darkreader-inline-color: #a8a095;" data-darkreader-inline-color="">6</li><li style="color: rgb(153, 153, 153); --darkreader-inline-color: #a8a095;" data-darkreader-inline-color="">7</li><li style="color: rgb(153, 153, 153); --darkreader-inline-color: #a8a095;" data-darkreader-inline-color="">8</li><li style="color: rgb(153, 153, 153); --darkreader-inline-color: #a8a095;" data-darkreader-inline-color="">9</li><li style="color: rgb(153, 153, 153); --darkreader-inline-color: #a8a095;" data-darkreader-inline-color="">10</li><li style="color: rgb(153, 153, 153); --darkreader-inline-color: #a8a095;" data-darkreader-inline-color="">11</li><li style="color: rgb(153, 153, 153); --darkreader-inline-color: #a8a095;" data-darkreader-inline-color="">12</li><li style="color: rgb(153, 153, 153); --darkreader-inline-color: #a8a095;" data-darkreader-inline-color="">13</li><li style="color: rgb(153, 153, 153); --darkreader-inline-color: #a8a095;" data-darkreader-inline-color="">14</li><li style="color: rgb(153, 153, 153); --darkreader-inline-color: #a8a095;" data-darkreader-inline-color="">15</li><li style="color: rgb(153, 153, 153); --darkreader-inline-color: #a8a095;" data-darkreader-inline-color="">16</li><li style="color: rgb(153, 153, 153); --darkreader-inline-color: #a8a095;" data-darkreader-inline-color="">17</li><li style="color: rgb(153, 153, 153); --darkreader-inline-color: #a8a095;" data-darkreader-inline-color="">18</li></ul></pre>
|
||||||
|
<h4></h4></div>
|
20
packages/app-cli/tests/html_to_md/code_multiline_2.md
Normal file
20
packages/app-cli/tests/html_to_md/code_multiline_2.md
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
```
|
||||||
|
public class User {
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "User{" +
|
||||||
|
"name='" + name + '\'' +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
2
packages/app-cli/tests/html_to_md/code_multiline_3.html
Normal file
2
packages/app-cli/tests/html_to_md/code_multiline_3.html
Normal file
File diff suppressed because one or more lines are too long
16
packages/app-cli/tests/html_to_md/code_multiline_3.md
Normal file
16
packages/app-cli/tests/html_to_md/code_multiline_3.md
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
```typescript
|
||||||
|
// Import the Joplin API
|
||||||
|
import joplin from 'api';
|
||||||
|
|
||||||
|
// Register the plugin
|
||||||
|
joplin.plugins.register({
|
||||||
|
|
||||||
|
// Run initialisation code in the onStart event handler
|
||||||
|
// Note that due to the plugin multi-process architecture, you should
|
||||||
|
// always assume that all function calls and event handlers are async.
|
||||||
|
onStart: async function() {
|
||||||
|
console.info('TOC plugin started!');
|
||||||
|
},
|
||||||
|
|
||||||
|
});
|
||||||
|
```
|
2
packages/app-cli/tests/html_to_md/code_multiline_4.html
Normal file
2
packages/app-cli/tests/html_to_md/code_multiline_4.html
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
<!-- this is from: https://blog.csdn.net/ch5256865/article/details/52957360 -->
|
||||||
|
<pre data-index="0" class="set-code-show" name="code" style="font-family: Consolas, Inconsolata, Courier, monospace;"><code class="hljs language-javascript"><ol class="hljs-ln" style="width:100%"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">let</span> str = <span class="hljs-string">` hello world ! `</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">let</span> _trim = <span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> <span class="hljs-variable language_">this</span> == <span class="hljs-string">"number"</span>) <span class="hljs-keyword">new</span> <span class="hljs-title class_">Error</span>(<span class="hljs-string">"Invalid or unexpected token"</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> <span class="hljs-variable language_">this</span> !== <span class="hljs-string">"string"</span>)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Error</span>(<span class="hljs-string">"Cannot read property 'trim' of"</span> + <span class="hljs-variable language_">this</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">let</span> reg = <span class="hljs-regexp">/^\s*|\s*$/g</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">return</span> <span class="hljs-variable language_">this</span>.<span class="hljs-title function_">replace</span>(reg, <span class="hljs-string">""</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">};</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-title class_">String</span>.<span class="hljs-property"><span class="hljs-keyword">prototype</span></span>.<span class="hljs-property">_trim</span> = _trim;</div></div></li></ol></code></pre>
|
12
packages/app-cli/tests/html_to_md/code_multiline_4.md
Normal file
12
packages/app-cli/tests/html_to_md/code_multiline_4.md
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
```
|
||||||
|
let str = ` hello world ! `;
|
||||||
|
let _trim = function () {
|
||||||
|
if (typeof this == "number") new Error("Invalid or unexpected token");
|
||||||
|
if (typeof this !== "string")
|
||||||
|
new Error("Cannot read property 'trim' of" + this);
|
||||||
|
let reg = /^\s*|\s*$/g;
|
||||||
|
return this.replace(reg, "");
|
||||||
|
};
|
||||||
|
|
||||||
|
String.prototype._trim = _trim;
|
||||||
|
```
|
42
packages/app-cli/tests/html_to_md/code_multiline_5.html
Normal file
42
packages/app-cli/tests/html_to_md/code_multiline_5.html
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
<!-- this is from: https://www.slingacademy.com/article/python-aiohttp-how-to-download-files-using-streams/ -->
|
||||||
|
<div><pre class="wp-block-code prettyprinted" style="font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "liberation mono", "courier new", monospace;"><code class=" prettyprinted" style=""><span class="com"><span class="com"># SlingAcademy.com</span></span><span class="pln"><span class="pln">
|
||||||
|
</span></span><span class="com"><span class="com"># This code uses Python 3.11.4</span></span><span class="pln"><span class="pln">
|
||||||
|
|
||||||
|
</span></span><span class="kwd"><span class="kwd">import</span></span><span class="pln"><span class="pln"> asyncio
|
||||||
|
</span></span><span class="kwd"><span class="kwd">import</span></span><span class="pln"><span class="pln"> aiohttp
|
||||||
|
|
||||||
|
</span></span><span class="com"><span class="com"># This function downloads a file from a URL and saves it to a local file</span></span><span class="pln"><span class="pln">
|
||||||
|
</span></span><span class="com"><span class="com"># The function is asynchronous and can handle large files because it uses aiohttp streams</span></span><span class="pln"><span class="pln">
|
||||||
|
</span></span><span class="kwd"><span class="kwd">async</span></span><span class="pln"><span class="pln"> </span></span><span class="kwd"><span class="kwd">def</span></span><span class="pln"><span class="pln"> download_file</span></span><span class="pun"><span class="pun">(</span></span><span class="pln"><span class="pln">url</span></span><span class="pun"><span class="pun">,</span></span><span class="pln"><span class="pln"> filename</span></span><span class="pun"><span class="pun">):</span></span><span class="pln"><span class="pln">
|
||||||
|
</span></span><span class="kwd"><span class="kwd">async</span></span><span class="pln"><span class="pln"> </span></span><span class="kwd"><span class="kwd">with</span></span><span class="pln"><span class="pln"> aiohttp</span></span><span class="pun"><span class="pun">.</span></span><span class="typ"><span class="typ">ClientSession</span></span><span class="pun"><span class="pun">()</span></span><span class="pln"><span class="pln"> </span></span><span class="kwd"><span class="kwd">as</span></span><span class="pln"><span class="pln"> session</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln">
|
||||||
|
</span></span><span class="kwd"><span class="kwd">print</span></span><span class="pun"><span class="pun">(</span></span><span class="pln"><span class="pln">f</span></span><span class="str"><span class="str">"Starting download file from {url}"</span></span><span class="pun"><span class="pun">)</span></span><span class="pln"><span class="pln">
|
||||||
|
</span></span><span class="kwd"><span class="kwd">async</span></span><span class="pln"><span class="pln"> </span></span><span class="kwd"><span class="kwd">with</span></span><span class="pln"><span class="pln"> session</span></span><span class="pun"><span class="pun">.</span></span><span class="kwd"><span class="kwd">get</span></span><span class="pun"><span class="pun">(</span></span><span class="pln"><span class="pln">url</span></span><span class="pun"><span class="pun">)</span></span><span class="pln"><span class="pln"> </span></span><span class="kwd"><span class="kwd">as</span></span><span class="pln"><span class="pln"> response</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln">
|
||||||
|
</span></span><span class="kwd"><span class="kwd">assert</span></span><span class="pln"><span class="pln"> response</span></span><span class="pun"><span class="pun">.</span></span><span class="pln"><span class="pln">status </span></span><span class="pun"><span class="pun">==</span></span><span class="pln"><span class="pln"> </span></span><span class="lit"><span class="lit">200</span></span><span class="pln"><span class="pln">
|
||||||
|
</span></span><span class="kwd"><span class="kwd">with</span></span><span class="pln"><span class="pln"> open</span></span><span class="pun"><span class="pun">(</span></span><span class="pln"><span class="pln">filename</span></span><span class="pun"><span class="pun">,</span></span><span class="pln"><span class="pln"> </span></span><span class="str"><span class="str">"wb"</span></span><span class="pun"><span class="pun">)</span></span><span class="pln"><span class="pln"> </span></span><span class="kwd"><span class="kwd">as</span></span><span class="pln"><span class="pln"> f</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln">
|
||||||
|
</span></span><span class="kwd"><span class="kwd">while</span></span><span class="pln"><span class="pln"> </span></span><span class="kwd"><span class="kwd">True</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln">
|
||||||
|
chunk </span></span><span class="pun"><span class="pun">=</span></span><span class="pln"><span class="pln"> </span></span><span class="kwd"><span class="kwd">await</span></span><span class="pln"><span class="pln"> response</span></span><span class="pun"><span class="pun">.</span></span><span class="pln"><span class="pln">content</span></span><span class="pun"><span class="pun">.</span></span><span class="pln"><span class="pln">readany</span></span><span class="pun"><span class="pun">()</span></span><span class="pln"><span class="pln">
|
||||||
|
</span></span><span class="kwd"><span class="kwd">if</span></span><span class="pln"><span class="pln"> </span></span><span class="kwd"><span class="kwd">not</span></span><span class="pln"><span class="pln"> chunk</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln">
|
||||||
|
</span></span><span class="kwd"><span class="kwd">break</span></span><span class="pln"><span class="pln">
|
||||||
|
f</span></span><span class="pun"><span class="pun">.</span></span><span class="pln"><span class="pln">write</span></span><span class="pun"><span class="pun">(</span></span><span class="pln"><span class="pln">chunk</span></span><span class="pun"><span class="pun">)</span></span><span class="pln"><span class="pln">
|
||||||
|
</span></span><span class="kwd"><span class="kwd">print</span></span><span class="pun"><span class="pun">(</span></span><span class="pln"><span class="pln">f</span></span><span class="str"><span class="str">"Downloaded {filename} from {url}"</span></span><span class="pun"><span class="pun">)</span></span><span class="pln"><span class="pln">
|
||||||
|
|
||||||
|
|
||||||
|
</span></span><span class="com"><span class="com"># This function downloads two files at the same time</span></span><span class="pln"><span class="pln">
|
||||||
|
</span></span><span class="kwd"><span class="kwd">async</span></span><span class="pln"><span class="pln"> </span></span><span class="kwd"><span class="kwd">def</span></span><span class="pln"><span class="pln"> main</span></span><span class="pun"><span class="pun">():</span></span><span class="pln"><span class="pln">
|
||||||
|
</span></span><span class="kwd"><span class="kwd">await</span></span><span class="pln"><span class="pln"> asyncio</span></span><span class="pun"><span class="pun">.</span></span><span class="pln"><span class="pln">gather</span></span><span class="pun"><span class="pun">(</span></span><span class="pln"><span class="pln">
|
||||||
|
</span></span><span class="com"><span class="com"># download a CSV file</span></span><span class="pln"><span class="pln">
|
||||||
|
download_file</span></span><span class="pun"><span class="pun">(</span></span><span class="pln"><span class="pln">
|
||||||
|
</span></span><span class="str"><span class="str">"https://api.slingacademy.com/v1/sample-data/files/student-scores.csv"</span></span><span class="pun"><span class="pun">,</span></span><span class="pln"><span class="pln">
|
||||||
|
</span></span><span class="str"><span class="str">"test.csv"</span></span><span class="pun"><span class="pun">,</span></span><span class="pln"><span class="pln">
|
||||||
|
</span></span><span class="pun"><span class="pun">),</span></span><span class="pln"><span class="pln">
|
||||||
|
|
||||||
|
</span></span><span class="com"><span class="com"># download a PDF file</span></span><span class="pln"><span class="pln">
|
||||||
|
download_file</span></span><span class="pun"><span class="pun">(</span></span><span class="pln"><span class="pln">
|
||||||
|
</span></span><span class="str"><span class="str">"https://api.slingacademy.com/v1/sample-data/files/text-and-table.pdf"</span></span><span class="pun"><span class="pun">,</span></span><span class="pln"><span class="pln">
|
||||||
|
</span></span><span class="str"><span class="str">"test.pdf"</span></span><span class="pun"><span class="pun">,</span></span><span class="pln"><span class="pln">
|
||||||
|
</span></span><span class="pun"><span class="pun">),</span></span><span class="pln"><span class="pln">
|
||||||
|
</span></span><span class="pun"><span class="pun">)</span></span><span class="pln"><span class="pln">
|
||||||
|
|
||||||
|
</span></span><span class="com"><span class="com"># Run the main function</span></span><span class="pln"><span class="pln">
|
||||||
|
asyncio</span></span><span class="pun"><span class="pun">.</span></span><span class="pln"><span class="pln">run</span></span><span class="pun"><span class="pun">(</span></span><span class="pln"><span class="pln">main</span></span><span class="pun"><span class="pun">())</span></span></code></pre><span class="ezoic-autoinsert-video ezoic-mid_content"></span>
|
||||||
|
<p></p></div>
|
42
packages/app-cli/tests/html_to_md/code_multiline_5.md
Normal file
42
packages/app-cli/tests/html_to_md/code_multiline_5.md
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
```
|
||||||
|
# SlingAcademy.com
|
||||||
|
# This code uses Python 3.11.4
|
||||||
|
|
||||||
|
import asyncio
|
||||||
|
import aiohttp
|
||||||
|
|
||||||
|
# This function downloads a file from a URL and saves it to a local file
|
||||||
|
# The function is asynchronous and can handle large files because it uses aiohttp streams
|
||||||
|
async def download_file(url, filename):
|
||||||
|
async with aiohttp.ClientSession() as session:
|
||||||
|
print(f"Starting download file from {url}")
|
||||||
|
async with session.get(url) as response:
|
||||||
|
assert response.status == 200
|
||||||
|
with open(filename, "wb") as f:
|
||||||
|
while True:
|
||||||
|
chunk = await response.content.readany()
|
||||||
|
if not chunk:
|
||||||
|
break
|
||||||
|
f.write(chunk)
|
||||||
|
print(f"Downloaded {filename} from {url}")
|
||||||
|
|
||||||
|
|
||||||
|
# This function downloads two files at the same time
|
||||||
|
async def main():
|
||||||
|
await asyncio.gather(
|
||||||
|
# download a CSV file
|
||||||
|
download_file(
|
||||||
|
"https://api.slingacademy.com/v1/sample-data/files/student-scores.csv",
|
||||||
|
"test.csv",
|
||||||
|
),
|
||||||
|
|
||||||
|
# download a PDF file
|
||||||
|
download_file(
|
||||||
|
"https://api.slingacademy.com/v1/sample-data/files/text-and-table.pdf",
|
||||||
|
"test.pdf",
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
# Run the main function
|
||||||
|
asyncio.run(main())
|
||||||
|
```
|
15
packages/app-cli/tests/html_to_md/table_with_caption.html
Normal file
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
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 |
|
19
packages/app-cli/tests/html_to_md/table_with_colgroup.html
Normal file
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
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/md_to_html/sanitize_19.html
Normal file
1
packages/app-cli/tests/md_to_html/sanitize_19.html
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<div><span class="jop-noMdConv">This is a comment we would like to keep</div></form>
|
1
packages/app-cli/tests/md_to_html/sanitize_19.md
Normal file
1
packages/app-cli/tests/md_to_html/sanitize_19.md
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<form><span>This is a comment we would like to keep</span></form>
|
@@ -0,0 +1,20 @@
|
|||||||
|
<div class="joplin-table-wrapper">
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th></th>
|
||||||
|
<th></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>No</td>
|
||||||
|
<td>header</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>And no</td>
|
||||||
|
<td>surprises</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
@@ -0,0 +1,4 @@
|
|||||||
|
| | |
|
||||||
|
| --- | --- |
|
||||||
|
| No | header |
|
||||||
|
| And no | surprises |
|
@@ -0,0 +1,16 @@
|
|||||||
|
<div class="joplin-table-wrapper">
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th></th>
|
||||||
|
<th></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>Some paragraph<br class="jop-noMdConv"/><br class="jop-noMdConv"/>inside a table cell</td>
|
||||||
|
<td>Second column</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
@@ -0,0 +1,3 @@
|
|||||||
|
| | |
|
||||||
|
| --- | --- |
|
||||||
|
| Some paragraph<br><br>inside a table cell | Second column |
|
@@ -5,6 +5,7 @@ import shim from '@joplin/lib/shim';
|
|||||||
import Setting from '@joplin/lib/models/Setting';
|
import Setting from '@joplin/lib/models/Setting';
|
||||||
import { db, setupDatabaseAndSynchronizer, switchClient } from '@joplin/lib/testing/test-utils';
|
import { db, setupDatabaseAndSynchronizer, switchClient } from '@joplin/lib/testing/test-utils';
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
function describeIfCompatible(name: string, fn: any, elseFn: any) {
|
function describeIfCompatible(name: string, fn: any, elseFn: any) {
|
||||||
if (['win32', 'darwin'].includes(shim.platformName())) {
|
if (['win32', 'darwin'].includes(shim.platformName())) {
|
||||||
return describe(name, fn);
|
return describe(name, fn);
|
||||||
@@ -52,7 +53,7 @@ describeIfCompatible('services_KeychainService', () => {
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
it('should delete db settings if they have been saved in keychain', (async () => {
|
it('should delete db settings if they have been saved in keychain', (async () => {
|
||||||
// First save some secure settings and make sure it ends up in the databse
|
// First save some secure settings and make sure it ends up in the database
|
||||||
KeychainService.instance().enabled = false;
|
KeychainService.instance().enabled = false;
|
||||||
|
|
||||||
Setting.setValue('sync.5.password', 'password');
|
Setting.setValue('sync.5.password', 'password');
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
import PluginRunner from '../../../app/services/plugins/PluginRunner';
|
import PluginRunner from '../../../app/services/plugins/PluginRunner';
|
||||||
import PluginService, { PluginSettings } from '@joplin/lib/services/plugins/PluginService';
|
import PluginService, { PluginSettings, defaultPluginSetting } from '@joplin/lib/services/plugins/PluginService';
|
||||||
import { ContentScriptType } from '@joplin/lib/services/plugins/api/types';
|
import { ContentScriptType } from '@joplin/lib/services/plugins/api/types';
|
||||||
import MdToHtml from '@joplin/renderer/MdToHtml';
|
import MdToHtml from '@joplin/renderer/MdToHtml';
|
||||||
import shim from '@joplin/lib/shim';
|
import shim from '@joplin/lib/shim';
|
||||||
@@ -7,8 +7,9 @@ import Setting from '@joplin/lib/models/Setting';
|
|||||||
import * as fs from 'fs-extra';
|
import * as fs from 'fs-extra';
|
||||||
import Note from '@joplin/lib/models/Note';
|
import Note from '@joplin/lib/models/Note';
|
||||||
import Folder from '@joplin/lib/models/Folder';
|
import Folder from '@joplin/lib/models/Folder';
|
||||||
import { expectNotThrow, setupDatabaseAndSynchronizer, switchClient, expectThrow, createTempDir, supportDir } from '@joplin/lib/testing/test-utils';
|
import { expectNotThrow, setupDatabaseAndSynchronizer, switchClient, expectThrow, createTempDir, supportDir, mockMobilePlatform } from '@joplin/lib/testing/test-utils';
|
||||||
import { newPluginScript } from '../../testUtils';
|
import { newPluginScript } from '../../testUtils';
|
||||||
|
import { join } from 'path';
|
||||||
|
|
||||||
const testPluginDir = `${supportDir}/plugins`;
|
const testPluginDir = `${supportDir}/plugins`;
|
||||||
|
|
||||||
@@ -82,6 +83,7 @@ describe('services_PluginService', () => {
|
|||||||
|
|
||||||
const allFolders = await Folder.all();
|
const allFolders = await Folder.all();
|
||||||
expect(allFolders.length).toBe(2);
|
expect(allFolders.length).toBe(2);
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
expect(allFolders.map((f: any) => f.title).sort().join(', ')).toBe('multi - simple1, multi - simple2');
|
expect(allFolders.map((f: any) => f.title).sort().join(', ')).toBe('multi - simple1, multi - simple2');
|
||||||
}));
|
}));
|
||||||
|
|
||||||
@@ -262,6 +264,69 @@ describe('services_PluginService', () => {
|
|||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
it.each([
|
||||||
|
{
|
||||||
|
manifestPlatforms: ['desktop'],
|
||||||
|
isDesktop: true,
|
||||||
|
appVersion: '3.0.0',
|
||||||
|
shouldRun: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
manifestPlatforms: ['desktop'],
|
||||||
|
isDesktop: false,
|
||||||
|
appVersion: '3.0.6',
|
||||||
|
shouldRun: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
manifestPlatforms: ['desktop', 'mobile'],
|
||||||
|
isDesktop: false,
|
||||||
|
appVersion: '3.0.6',
|
||||||
|
shouldRun: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// Should default to desktop-only
|
||||||
|
manifestPlatforms: [],
|
||||||
|
isDesktop: false,
|
||||||
|
appVersion: '3.0.8',
|
||||||
|
shouldRun: false,
|
||||||
|
},
|
||||||
|
])('should enable and disable plugins depending on what platform(s) they support (case %#: %j)', async ({ manifestPlatforms, isDesktop, appVersion, shouldRun }) => {
|
||||||
|
const pluginScript = `
|
||||||
|
/* joplin-manifest:
|
||||||
|
{
|
||||||
|
"id": "org.joplinapp.plugins.PluginTest",
|
||||||
|
"manifest_version": 1,
|
||||||
|
"app_min_version": "1.0.0",
|
||||||
|
"platforms": ${JSON.stringify(manifestPlatforms)},
|
||||||
|
"name": "JS Bundle test",
|
||||||
|
"version": "1.0.0"
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
joplin.plugins.register({
|
||||||
|
onStart: async function() { },
|
||||||
|
});
|
||||||
|
`;
|
||||||
|
|
||||||
|
let resetPlatformMock = () => {};
|
||||||
|
if (!isDesktop) {
|
||||||
|
resetPlatformMock = mockMobilePlatform('android').reset;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const service = newPluginService(appVersion);
|
||||||
|
const plugin = await service.loadPluginFromJsBundle('', pluginScript);
|
||||||
|
|
||||||
|
if (shouldRun) {
|
||||||
|
await expect(service.runPlugin(plugin)).resolves.toBeUndefined();
|
||||||
|
} else {
|
||||||
|
await expect(service.runPlugin(plugin)).rejects.toThrow(/disabled/);
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
resetPlatformMock();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
it('should install a plugin', (async () => {
|
it('should install a plugin', (async () => {
|
||||||
const service = newPluginService();
|
const service = newPluginService();
|
||||||
const pluginPath = `${testPluginDir}/jpl_test/org.joplinapp.FirstJplPlugin.jpl`;
|
const pluginPath = `${testPluginDir}/jpl_test/org.joplinapp.FirstJplPlugin.jpl`;
|
||||||
@@ -333,4 +398,78 @@ describe('services_PluginService', () => {
|
|||||||
expect(newPluginSettings[pluginId1]).toBe(undefined);
|
expect(newPluginSettings[pluginId1]).toBe(undefined);
|
||||||
expect(newPluginSettings[pluginId2]).toBe(undefined);
|
expect(newPluginSettings[pluginId2]).toBe(undefined);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('re-running loadAndRunPlugins should reload plugins that have changed but keep unchanged plugins running', async () => {
|
||||||
|
const testDir = await createTempDir();
|
||||||
|
try {
|
||||||
|
const loadCounterNote = await Note.save({ title: 'Log of plugin loads' });
|
||||||
|
const readLoadCounterNote = async () => {
|
||||||
|
return (await Note.load(loadCounterNote.id)).body;
|
||||||
|
};
|
||||||
|
expect(await readLoadCounterNote()).toBe('');
|
||||||
|
|
||||||
|
const writePluginScript = async (version: string, id: string) => {
|
||||||
|
const script = `
|
||||||
|
/* joplin-manifest:
|
||||||
|
{
|
||||||
|
"id": ${JSON.stringify(id)},
|
||||||
|
"manifest_version": 1,
|
||||||
|
"app_min_version": "1.0.0",
|
||||||
|
"name": "JS Bundle test",
|
||||||
|
"version": ${JSON.stringify(version)}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
joplin.plugins.register({
|
||||||
|
onStart: async function() {
|
||||||
|
const noteId = ${JSON.stringify(loadCounterNote.id)};
|
||||||
|
const pluginId = ${JSON.stringify(id)};
|
||||||
|
const note = await joplin.data.get(['notes', noteId], { fields: ['body'] });
|
||||||
|
const newBody = note.body + '\\n' + pluginId;
|
||||||
|
await joplin.data.put(['notes', noteId], null, { body: newBody.trim() });
|
||||||
|
},
|
||||||
|
});
|
||||||
|
`;
|
||||||
|
await fs.writeFile(join(testDir, `${id}.bundle.js`), script);
|
||||||
|
};
|
||||||
|
|
||||||
|
const service = newPluginService();
|
||||||
|
const pluginId1 = 'org.joplinapp.testPlugin1';
|
||||||
|
await writePluginScript('0.0.1', pluginId1);
|
||||||
|
const pluginId2 = 'org.joplinapp.testPlugin2';
|
||||||
|
await writePluginScript('0.0.1', pluginId2);
|
||||||
|
|
||||||
|
let pluginSettings: PluginSettings = {
|
||||||
|
[pluginId1]: defaultPluginSetting(),
|
||||||
|
[pluginId2]: defaultPluginSetting(),
|
||||||
|
};
|
||||||
|
await service.loadAndRunPlugins(testDir, pluginSettings);
|
||||||
|
|
||||||
|
// Plugins should initially load once
|
||||||
|
expect(service.pluginIds).toHaveLength(2);
|
||||||
|
expect(service.pluginById(pluginId1).running).toBe(true);
|
||||||
|
expect(service.pluginById(pluginId2).running).toBe(true);
|
||||||
|
expect(await readLoadCounterNote()).toBe(`${pluginId1}\n${pluginId2}`);
|
||||||
|
|
||||||
|
// Updating just plugin 1 reload just plugin 1.
|
||||||
|
await writePluginScript('0.0.2', pluginId1);
|
||||||
|
await service.loadAndRunPlugins(testDir, pluginSettings);
|
||||||
|
|
||||||
|
expect(service.pluginById(pluginId1).running).toBe(true);
|
||||||
|
expect(service.pluginById(pluginId2).running).toBe(true);
|
||||||
|
expect(await readLoadCounterNote()).toBe(`${pluginId1}\n${pluginId2}\n${pluginId1}`);
|
||||||
|
|
||||||
|
// Disabling plugin 1 should not reload plugin 2
|
||||||
|
pluginSettings = { ...pluginSettings, [pluginId1]: { ...defaultPluginSetting(), enabled: false } };
|
||||||
|
await service.loadAndRunPlugins(testDir, pluginSettings);
|
||||||
|
|
||||||
|
expect(service.pluginById(pluginId1).running).toBe(false);
|
||||||
|
expect(service.pluginById(pluginId2).running).toBe(true);
|
||||||
|
expect(await readLoadCounterNote()).toBe(`${pluginId1}\n${pluginId2}\n${pluginId1}`);
|
||||||
|
|
||||||
|
await service.destroy();
|
||||||
|
} finally {
|
||||||
|
await fs.remove(testDir);
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@@ -1,9 +1,14 @@
|
|||||||
import RepositoryApi from '@joplin/lib/services/plugins/RepositoryApi';
|
import { AppType } from '@joplin/lib/models/Setting';
|
||||||
|
import RepositoryApi, { AppInfo, InstallMode } from '@joplin/lib/services/plugins/RepositoryApi';
|
||||||
import shim from '@joplin/lib/shim';
|
import shim from '@joplin/lib/shim';
|
||||||
import { setupDatabaseAndSynchronizer, switchClient, supportDir, createTempDir } from '@joplin/lib/testing/test-utils';
|
import { setupDatabaseAndSynchronizer, switchClient, supportDir, createTempDir } from '@joplin/lib/testing/test-utils';
|
||||||
|
import { remove } from 'fs-extra';
|
||||||
|
|
||||||
async function newRepoApi(): Promise<RepositoryApi> {
|
let tempDirs: string[] = [];
|
||||||
const repo = new RepositoryApi(`${supportDir}/pluginRepo`, await createTempDir());
|
async function newRepoApi(appInfo: AppInfo = { type: AppType.Desktop, version: '3.0.0' }): Promise<RepositoryApi> {
|
||||||
|
const tempDir = await createTempDir();
|
||||||
|
tempDirs.push(tempDir);
|
||||||
|
const repo = new RepositoryApi(`${supportDir}/pluginRepo`, tempDir, appInfo, InstallMode.Default);
|
||||||
await repo.initialize();
|
await repo.initialize();
|
||||||
return repo;
|
return repo;
|
||||||
}
|
}
|
||||||
@@ -14,6 +19,12 @@ describe('services_plugins_RepositoryApi', () => {
|
|||||||
await setupDatabaseAndSynchronizer(1);
|
await setupDatabaseAndSynchronizer(1);
|
||||||
await switchClient(1);
|
await switchClient(1);
|
||||||
});
|
});
|
||||||
|
afterEach(async () => {
|
||||||
|
for (const tempDir of tempDirs) {
|
||||||
|
await remove(tempDir);
|
||||||
|
}
|
||||||
|
tempDirs = [];
|
||||||
|
});
|
||||||
|
|
||||||
it('should get the manifests', (async () => {
|
it('should get the manifests', (async () => {
|
||||||
const api = await newRepoApi();
|
const api = await newRepoApi();
|
||||||
@@ -27,9 +38,10 @@ describe('services_plugins_RepositoryApi', () => {
|
|||||||
|
|
||||||
{
|
{
|
||||||
const results = await api.search('to');
|
const results = await api.search('to');
|
||||||
expect(results.length).toBe(2);
|
expect(results.length).toBe(3);
|
||||||
expect(!!results.find(m => m.id === 'joplin.plugin.ambrt.backlinksToNote')).toBe(true);
|
expect(!!results.find(m => m.id === 'joplin.plugin.ambrt.backlinksToNote')).toBe(true);
|
||||||
expect(!!results.find(m => m.id === 'org.joplinapp.plugins.ToggleSidebars')).toBe(true);
|
expect(!!results.find(m => m.id === 'org.joplinapp.plugins.ToggleSidebars')).toBe(true);
|
||||||
|
expect(!!results.find(m => m.id === 'org.joplinapp.plugins.AbcSheetMusic')).toBe(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -45,13 +57,14 @@ describe('services_plugins_RepositoryApi', () => {
|
|||||||
expect(await shim.fsDriver().exists(pluginPath)).toBe(true);
|
expect(await shim.fsDriver().exists(pluginPath)).toBe(true);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
it('should tell if a plugin can be updated', (async () => {
|
it.each([
|
||||||
const api = await newRepoApi();
|
{ id: 'org.joplinapp.plugins.ToggleSidebars', installedVersion: '1.0.0', appVersion: '3.0.0', shouldBeUpdatable: true },
|
||||||
|
{ id: 'org.joplinapp.plugins.ToggleSidebars', installedVersion: '1.0.0', appVersion: '1.0.0', shouldBeUpdatable: false },
|
||||||
expect(await api.pluginCanBeUpdated('org.joplinapp.plugins.ToggleSidebars', '1.0.0', '3.0.0')).toBe(true);
|
{ id: 'org.joplinapp.plugins.ToggleSidebars', installedVersion: '1.0.2', appVersion: '3.0.0', shouldBeUpdatable: false },
|
||||||
expect(await api.pluginCanBeUpdated('org.joplinapp.plugins.ToggleSidebars', '1.0.0', '1.0.0')).toBe(false);
|
{ id: 'does.not.exist', installedVersion: '1.0.0', appVersion: '3.0.0', shouldBeUpdatable: false },
|
||||||
expect(await api.pluginCanBeUpdated('org.joplinapp.plugins.ToggleSidebars', '1.0.2', '3.0.0')).toBe(false);
|
])('should tell if a plugin can be updated (case %#)', (async ({ id, installedVersion, appVersion, shouldBeUpdatable }) => {
|
||||||
expect(await api.pluginCanBeUpdated('does.not.exist', '1.0.0', '3.0.0')).toBe(false);
|
const api = await newRepoApi({ version: appVersion, type: AppType.Desktop });
|
||||||
|
expect(await api.pluginCanBeUpdated(id, installedVersion)).toBe(shouldBeUpdatable);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
});
|
});
|
||||||
|
@@ -2,6 +2,7 @@ import Setting from '@joplin/lib/models/Setting';
|
|||||||
import { waitForFolderCount, setupDatabaseAndSynchronizer, switchClient, afterEachCleanUp } from '@joplin/lib/testing/test-utils';
|
import { waitForFolderCount, setupDatabaseAndSynchronizer, switchClient, afterEachCleanUp } from '@joplin/lib/testing/test-utils';
|
||||||
import Folder from '@joplin/lib/models/Folder';
|
import Folder from '@joplin/lib/models/Folder';
|
||||||
import { newPluginScript, newPluginService } from '../../../testUtils';
|
import { newPluginScript, newPluginService } from '../../../testUtils';
|
||||||
|
import eventManager, { EventName } from '@joplin/lib/eventManager';
|
||||||
|
|
||||||
describe('JoplinSettings', () => {
|
describe('JoplinSettings', () => {
|
||||||
|
|
||||||
@@ -66,6 +67,38 @@ describe('JoplinSettings', () => {
|
|||||||
await service.destroy();
|
await service.destroy();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('should de-register settings change listeners when a plugin is unloaded', async () => {
|
||||||
|
const service = newPluginService();
|
||||||
|
|
||||||
|
const pluginScript = newPluginScript(`
|
||||||
|
joplin.plugins.register({
|
||||||
|
onStart: async function() {
|
||||||
|
await joplin.settings.registerSettings({
|
||||||
|
'test-setting': {
|
||||||
|
value: 1234,
|
||||||
|
type: 1,
|
||||||
|
public: false,
|
||||||
|
label: 'Test',
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Register 8 listeners to improve test reliability in the case
|
||||||
|
// where listeners are added/removed from other sources.
|
||||||
|
for (let i = 0; i < 8; i++) {
|
||||||
|
await joplin.settings.onChange((event) => { });
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
`);
|
||||||
|
|
||||||
|
const plugin = await service.loadPluginFromJsBundle('', pluginScript);
|
||||||
|
await service.runPlugin(plugin);
|
||||||
|
|
||||||
|
const listenerCounter = eventManager.listenerCounter_(EventName.SettingsChange);
|
||||||
|
plugin.onUnload();
|
||||||
|
expect(listenerCounter.getCountRemoved()).toBeGreaterThanOrEqual(8);
|
||||||
|
});
|
||||||
|
|
||||||
test('should allow registering multiple settings', async () => {
|
test('should allow registering multiple settings', async () => {
|
||||||
const service = newPluginService();
|
const service = newPluginService();
|
||||||
|
|
||||||
|
@@ -4,6 +4,7 @@ import Note from '@joplin/lib/models/Note';
|
|||||||
import Folder from '@joplin/lib/models/Folder';
|
import Folder from '@joplin/lib/models/Folder';
|
||||||
import ItemChange from '@joplin/lib/models/ItemChange';
|
import ItemChange from '@joplin/lib/models/ItemChange';
|
||||||
import { newPluginScript, newPluginService } from '../../../testUtils';
|
import { newPluginScript, newPluginService } from '../../../testUtils';
|
||||||
|
import eventManager, { EventName } from '@joplin/lib/eventManager';
|
||||||
|
|
||||||
describe('JoplinWorkspace', () => {
|
describe('JoplinWorkspace', () => {
|
||||||
|
|
||||||
@@ -17,6 +18,7 @@ describe('JoplinWorkspace', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
test('should listen to noteChange events', async () => {
|
test('should listen to noteChange events', async () => {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
const appState: Record<string, any> = {
|
const appState: Record<string, any> = {
|
||||||
selectedNoteIds: [],
|
selectedNoteIds: [],
|
||||||
};
|
};
|
||||||
@@ -49,6 +51,7 @@ describe('JoplinWorkspace', () => {
|
|||||||
|
|
||||||
const folder = (await Folder.all())[0];
|
const folder = (await Folder.all())[0];
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
const result: any = JSON.parse(folder.title);
|
const result: any = JSON.parse(folder.title);
|
||||||
|
|
||||||
expect(result.id).toBe(note.id);
|
expect(result.id).toBe(note.id);
|
||||||
@@ -79,4 +82,33 @@ describe('JoplinWorkspace', () => {
|
|||||||
expect(modFolder.title).toBe('changedtitle');
|
expect(modFolder.title).toBe('changedtitle');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('should remove event listeners when plugins are unloaded', async () => {
|
||||||
|
const service = newPluginService();
|
||||||
|
|
||||||
|
const pluginScript = newPluginScript(`
|
||||||
|
joplin.plugins.register({
|
||||||
|
onStart: async () => {
|
||||||
|
// Register each listener 8 times to improve test reliability -- it's possible
|
||||||
|
// for listeners for the same events to be added/removed by other sources.
|
||||||
|
for (let i = 0; i < 8; i++) {
|
||||||
|
await joplin.workspace.onNoteChange(async (event) => { });
|
||||||
|
await joplin.workspace.onResourceChange(async (event) => { });
|
||||||
|
await joplin.workspace.filterEditorContextMenu(async (event) => { });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
`);
|
||||||
|
const plugin = await service.loadPluginFromJsBundle('', pluginScript);
|
||||||
|
await service.runPlugin(plugin);
|
||||||
|
|
||||||
|
const itemChangeListenerCounter = eventManager.listenerCounter_(EventName.ItemChange);
|
||||||
|
const resourceChangeListenerCounter = eventManager.listenerCounter_(EventName.ResourceChange);
|
||||||
|
|
||||||
|
plugin.onUnload();
|
||||||
|
|
||||||
|
expect(itemChangeListenerCounter.getCountRemoved()).toBeGreaterThanOrEqual(8);
|
||||||
|
expect(resourceChangeListenerCounter.getCountRemoved()).toBeGreaterThanOrEqual(8);
|
||||||
|
|
||||||
|
await service.destroy();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@@ -4,8 +4,9 @@ import { checkThrow, setupDatabaseAndSynchronizer, supportDir, switchClient } fr
|
|||||||
import PluginService, { defaultPluginSetting, DefaultPluginsInfo } from '@joplin/lib/services/plugins/PluginService';
|
import PluginService, { defaultPluginSetting, DefaultPluginsInfo } from '@joplin/lib/services/plugins/PluginService';
|
||||||
import Setting from '@joplin/lib/models/Setting';
|
import Setting from '@joplin/lib/models/Setting';
|
||||||
|
|
||||||
|
const testDefaultPluginsDir = `${supportDir}/testDefaultPlugins`;
|
||||||
|
|
||||||
function newPluginService(appVersion = '1.4') {
|
function newPluginService(appVersion = '2.4') {
|
||||||
const runner = new PluginRunner();
|
const runner = new PluginRunner();
|
||||||
const service = new PluginService();
|
const service = new PluginService();
|
||||||
service.initialize(
|
service.initialize(
|
||||||
@@ -35,8 +36,7 @@ describe('defaultPluginsUtils', () => {
|
|||||||
await switchClient(1);
|
await switchClient(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should load default plugins when nor previously installed', (async () => {
|
it('should load default plugins when not previously installed', (async () => {
|
||||||
const testPluginDir = `${supportDir}/testDefaultPlugins`;
|
|
||||||
Setting.setValue('installedDefaultPlugins', []);
|
Setting.setValue('installedDefaultPlugins', []);
|
||||||
|
|
||||||
const service = newPluginService('2.1');
|
const service = newPluginService('2.1');
|
||||||
@@ -47,7 +47,9 @@ describe('defaultPluginsUtils', () => {
|
|||||||
expect(pluginSettings[pluginId]).toBeFalsy();
|
expect(pluginSettings[pluginId]).toBeFalsy();
|
||||||
}
|
}
|
||||||
|
|
||||||
const pluginPathsAndNewSettings = await getDefaultPluginPathsAndSettings(testPluginDir, defaultPluginsInfo, pluginSettings);
|
const pluginPathsAndNewSettings = await getDefaultPluginPathsAndSettings(
|
||||||
|
testDefaultPluginsDir, defaultPluginsInfo, pluginSettings, service,
|
||||||
|
);
|
||||||
|
|
||||||
for (const pluginId of pluginsId) {
|
for (const pluginId of pluginsId) {
|
||||||
expect(
|
expect(
|
||||||
@@ -57,7 +59,6 @@ describe('defaultPluginsUtils', () => {
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
it('should keep already created default plugins disabled with previous default plugins installed', (async () => {
|
it('should keep already created default plugins disabled with previous default plugins installed', (async () => {
|
||||||
const testPluginDir = `${supportDir}/testDefaultPlugins`;
|
|
||||||
Setting.setValue('installedDefaultPlugins', ['org.joplinapp.plugins.ToggleSidebars']);
|
Setting.setValue('installedDefaultPlugins', ['org.joplinapp.plugins.ToggleSidebars']);
|
||||||
Setting.setValue('plugins.states', {
|
Setting.setValue('plugins.states', {
|
||||||
'org.joplinapp.plugins.ToggleSidebars': { ...defaultPluginSetting(), enabled: false },
|
'org.joplinapp.plugins.ToggleSidebars': { ...defaultPluginSetting(), enabled: false },
|
||||||
@@ -66,7 +67,7 @@ describe('defaultPluginsUtils', () => {
|
|||||||
const service = newPluginService('2.1');
|
const service = newPluginService('2.1');
|
||||||
|
|
||||||
const pluginSettings = service.unserializePluginSettings(Setting.value('plugins.states'));
|
const pluginSettings = service.unserializePluginSettings(Setting.value('plugins.states'));
|
||||||
const pluginPathsAndNewSettings = await getDefaultPluginPathsAndSettings(testPluginDir, defaultPluginsInfo, pluginSettings);
|
const pluginPathsAndNewSettings = await getDefaultPluginPathsAndSettings(testDefaultPluginsDir, defaultPluginsInfo, pluginSettings, service);
|
||||||
|
|
||||||
// Should still be disabled
|
// Should still be disabled
|
||||||
expect(
|
expect(
|
||||||
@@ -171,6 +172,34 @@ describe('defaultPluginsUtils', () => {
|
|||||||
expect(Setting.value('plugin-io.github.jackgruber.backup.path')).toBe('initial-path');
|
expect(Setting.value('plugin-io.github.jackgruber.backup.path')).toBe('initial-path');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should support disabled-by-default plugins', async () => {
|
||||||
|
const service = newPluginService();
|
||||||
|
|
||||||
|
const plugin = await service.loadPluginFromJsBundle('', sampleJsBundlePlugin);
|
||||||
|
plugin.builtIn = false;
|
||||||
|
await service.runPlugin(plugin);
|
||||||
|
|
||||||
|
const defaultPluginsInfo: DefaultPluginsInfo = {
|
||||||
|
'joplin.plugin.ambrt.backlinksToNote': {
|
||||||
|
enabled: false,
|
||||||
|
},
|
||||||
|
'org.joplinapp.plugins.ToggleSidebars': {},
|
||||||
|
};
|
||||||
|
Setting.setValue('installedDefaultPlugins', []);
|
||||||
|
|
||||||
|
const { pluginSettings } = await getDefaultPluginPathsAndSettings(
|
||||||
|
testDefaultPluginsDir, defaultPluginsInfo, {}, service,
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(pluginSettings).toMatchObject({
|
||||||
|
'joplin.plugin.ambrt.backlinksToNote': {
|
||||||
|
enabled: false,
|
||||||
|
deleted: false,
|
||||||
|
},
|
||||||
|
'org.joplinapp.plugins.ToggleSidebars': defaultPluginSetting(),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
it('should not throw error on missing setting key', async () => {
|
it('should not throw error on missing setting key', async () => {
|
||||||
|
|
||||||
const service = newPluginService();
|
const service = newPluginService();
|
||||||
@@ -202,4 +231,34 @@ describe('defaultPluginsUtils', () => {
|
|||||||
await service.destroy();
|
await service.destroy();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Only returning not-yet-loaded plugins prevents non-default versions of built-in plugins
|
||||||
|
// from being overwritten by PluginService.
|
||||||
|
it('getDefaultPluginPathsAndSettings should return only plugins that haven\'t been loaded', async () => {
|
||||||
|
const service = newPluginService();
|
||||||
|
|
||||||
|
const testPluginId = 'org.joplinapp.plugins.ToggleSidebars';
|
||||||
|
const testPluginPath = `${supportDir}/pluginRepo/plugins/${testPluginId}/plugin.jpl`;
|
||||||
|
|
||||||
|
const pluginSettings = {
|
||||||
|
[testPluginId]: defaultPluginSetting(),
|
||||||
|
};
|
||||||
|
|
||||||
|
await service.loadAndRunPlugins([testPluginPath], pluginSettings, { devMode: false, builtIn: false });
|
||||||
|
|
||||||
|
// Should be running
|
||||||
|
expect(service.isPluginLoaded(testPluginId)).toBe(true);
|
||||||
|
|
||||||
|
const testDefaultPluginsInfo = {
|
||||||
|
[testPluginId]: {},
|
||||||
|
'joplin.plugin.ambrt.backlinksToNote': {},
|
||||||
|
};
|
||||||
|
|
||||||
|
const { pluginPaths } = await getDefaultPluginPathsAndSettings(
|
||||||
|
testDefaultPluginsDir, testDefaultPluginsInfo, pluginSettings, service,
|
||||||
|
);
|
||||||
|
|
||||||
|
// Should only return plugins that aren't loaded.
|
||||||
|
expect(pluginPaths).toHaveLength(1);
|
||||||
|
expect(pluginPaths[0]).toContain('joplin.plugin.ambrt.backlinksToNote');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@@ -11,11 +11,13 @@ describe('services_plugins_sandboxProxy', () => {
|
|||||||
it('should create a new sandbox proxy', (async () => {
|
it('should create a new sandbox proxy', (async () => {
|
||||||
interface Result {
|
interface Result {
|
||||||
path: string;
|
path: string;
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
args: any[];
|
args: any[];
|
||||||
}
|
}
|
||||||
|
|
||||||
const results: Result[] = [];
|
const results: Result[] = [];
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
const target: any = (path: string, args: any[]) => {
|
const target: any = (path: string, args: any[]) => {
|
||||||
results.push({ path, args });
|
results.push({ path, args });
|
||||||
};
|
};
|
||||||
@@ -34,11 +36,13 @@ describe('services_plugins_sandboxProxy', () => {
|
|||||||
it('should allow importing a namespace', (async () => {
|
it('should allow importing a namespace', (async () => {
|
||||||
interface Result {
|
interface Result {
|
||||||
path: string;
|
path: string;
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
args: any[];
|
args: any[];
|
||||||
}
|
}
|
||||||
|
|
||||||
const results: Result[] = [];
|
const results: Result[] = [];
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||||
const target: any = (path: string, args: any[]) => {
|
const target: any = (path: string, args: any[]) => {
|
||||||
results.push({ path, args });
|
results.push({ path, args });
|
||||||
};
|
};
|
||||||
|
@@ -16,6 +16,7 @@
|
|||||||
"manifest_version": 1,
|
"manifest_version": 1,
|
||||||
"id": "org.joplinapp.plugins.ToggleSidebars",
|
"id": "org.joplinapp.plugins.ToggleSidebars",
|
||||||
"app_min_version": "1.6",
|
"app_min_version": "1.6",
|
||||||
|
"platforms": ["desktop"],
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"name": "Note list and side bar toggle buttons",
|
"name": "Note list and side bar toggle buttons",
|
||||||
"description": "Adds buttons to toggle note list and sidebar",
|
"description": "Adds buttons to toggle note list and sidebar",
|
||||||
@@ -25,5 +26,43 @@
|
|||||||
"_publish_hash": "sha256:e0d833b7ef1bb8f02ee4cb861ef1989621358c45a5614911071302dc0527a3b4",
|
"_publish_hash": "sha256:e0d833b7ef1bb8f02ee4cb861ef1989621358c45a5614911071302dc0527a3b4",
|
||||||
"_publish_commit": "dev:1b5b2342fc25717b77ad9f1627c1a334e5bbae54",
|
"_publish_commit": "dev:1b5b2342fc25717b77ad9f1627c1a334e5bbae54",
|
||||||
"_npm_package_name": "@joplin/joplin-plugin-toggle-sidebars"
|
"_npm_package_name": "@joplin/joplin-plugin-toggle-sidebars"
|
||||||
|
},
|
||||||
|
"org.joplinapp.plugins.AbcSheetMusic": {
|
||||||
|
"manifest_version": 1,
|
||||||
|
"id": "org.joplinapp.plugins.AbcSheetMusic",
|
||||||
|
"app_min_version": "2.13.5",
|
||||||
|
"version": "1.0.5",
|
||||||
|
"name": "ABC Sheet Music Plugin",
|
||||||
|
"description": "Turns ABC text notation into sheet music",
|
||||||
|
"author": "Laurent Cozic",
|
||||||
|
"homepage_url": "https://github.com/joplin/plugin-abc-sheet-music",
|
||||||
|
"repository_url": "https://github.com/joplin/plugin-abc-sheet-music",
|
||||||
|
"category": "viewer",
|
||||||
|
"keywords": [
|
||||||
|
"sheet music",
|
||||||
|
"abc",
|
||||||
|
"notation"
|
||||||
|
],
|
||||||
|
"screenshots": [
|
||||||
|
{
|
||||||
|
"src": "images/PeacherineRag.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "images/Tablature.png"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"icons": {
|
||||||
|
"16": "images/icon-16.png",
|
||||||
|
"32": "images/icon-32.png",
|
||||||
|
"48": "images/icon-48.png",
|
||||||
|
"128": "images/icon-128.png"
|
||||||
|
},
|
||||||
|
"promo_tile": {
|
||||||
|
"src": "images/promo_tile.png"
|
||||||
|
},
|
||||||
|
"_publish_hash": "sha256:94a13d4833affbc949ba60174ab77419aa02b0777563a796f7480206b73a864b",
|
||||||
|
"_publish_commit": "master:2b128c7a21f010e9937a112e0cf1fb5c03f9ca75",
|
||||||
|
"_npm_package_name": "joplin-plugin-abc-sheet-music",
|
||||||
|
"_recommended": true
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -0,0 +1,37 @@
|
|||||||
|
{
|
||||||
|
"manifest_version": 1,
|
||||||
|
"id": "org.joplinapp.plugins.AbcSheetMusic",
|
||||||
|
"app_min_version": "2.13.5",
|
||||||
|
"version": "1.0.5",
|
||||||
|
"name": "ABC Sheet Music Plugin",
|
||||||
|
"description": "Turns ABC text notation into sheet music",
|
||||||
|
"author": "Laurent Cozic",
|
||||||
|
"homepage_url": "https://github.com/joplin/plugin-abc-sheet-music",
|
||||||
|
"repository_url": "https://github.com/joplin/plugin-abc-sheet-music",
|
||||||
|
"category": "viewer",
|
||||||
|
"keywords": [
|
||||||
|
"sheet music",
|
||||||
|
"abc",
|
||||||
|
"notation"
|
||||||
|
],
|
||||||
|
"screenshots": [
|
||||||
|
{
|
||||||
|
"src": "images/PeacherineRag.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "images/Tablature.png"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"icons": {
|
||||||
|
"16": "images/icon-16.png",
|
||||||
|
"32": "images/icon-32.png",
|
||||||
|
"48": "images/icon-48.png",
|
||||||
|
"128": "images/icon-128.png"
|
||||||
|
},
|
||||||
|
"promo_tile": {
|
||||||
|
"src": "images/promo_tile.png"
|
||||||
|
},
|
||||||
|
"_publish_hash": "sha256:94a13d4833affbc949ba60174ab77419aa02b0777563a796f7480206b73a864b",
|
||||||
|
"_publish_commit": "master:2b128c7a21f010e9937a112e0cf1fb5c03f9ca75",
|
||||||
|
"_npm_package_name": "joplin-plugin-abc-sheet-music"
|
||||||
|
}
|
Binary file not shown.
@@ -2,6 +2,7 @@
|
|||||||
"manifest_version": 1,
|
"manifest_version": 1,
|
||||||
"id": "org.joplinapp.plugins.ToggleSidebars",
|
"id": "org.joplinapp.plugins.ToggleSidebars",
|
||||||
"app_min_version": "1.6",
|
"app_min_version": "1.6",
|
||||||
|
"platforms": ["desktop"],
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"name": "Note list and side bar toggle buttons",
|
"name": "Note list and side bar toggle buttons",
|
||||||
"description": "Adds buttons to toggle note list and sidebar",
|
"description": "Adds buttons to toggle note list and sidebar",
|
||||||
|
3
packages/app-cli/tests/support/plugins/codemirror5-and-codemirror6/.gitignore
vendored
Normal file
3
packages/app-cli/tests/support/plugins/codemirror5-and-codemirror6/.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
dist/
|
||||||
|
node_modules/
|
||||||
|
publish/
|
@@ -0,0 +1,8 @@
|
|||||||
|
*.md
|
||||||
|
!README.md
|
||||||
|
/*.jpl
|
||||||
|
/api
|
||||||
|
/src
|
||||||
|
/dist
|
||||||
|
tsconfig.json
|
||||||
|
webpack.config.js
|
@@ -0,0 +1,78 @@
|
|||||||
|
# Plugin development
|
||||||
|
|
||||||
|
This documentation describes how to create a plugin, and how to work with the plugin builder framework and API.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
First, install [Yeoman](http://yeoman.io) and generator-joplin using [npm](https://www.npmjs.com/) (we assume you have pre-installed [node.js](https://nodejs.org/)).
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install -g yo@4.3.1
|
||||||
|
npm install -g generator-joplin
|
||||||
|
```
|
||||||
|
|
||||||
|
Then generate your new project:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yo --node-package-manager npm joplin
|
||||||
|
```
|
||||||
|
|
||||||
|
## Structure
|
||||||
|
|
||||||
|
The main two files you will want to look at are:
|
||||||
|
|
||||||
|
- `/src/index.ts`, which contains the entry point for the plugin source code.
|
||||||
|
- `/src/manifest.json`, which is the plugin manifest. It contains information such as the plugin a name, version, etc.
|
||||||
|
|
||||||
|
The file `/plugin.config.json` could also be useful if you intend to use [external scripts](#external-script-files), such as content scripts or webview scripts.
|
||||||
|
|
||||||
|
## Building the plugin
|
||||||
|
|
||||||
|
The plugin is built using Webpack, which creates the compiled code in `/dist`. A JPL archive will also be created at the root, which can use to distribute the plugin.
|
||||||
|
|
||||||
|
To build the plugin, simply run `npm run dist`.
|
||||||
|
|
||||||
|
The project is setup to use TypeScript, although you can change the configuration to use plain JavaScript.
|
||||||
|
|
||||||
|
## Updating the manifest version number
|
||||||
|
|
||||||
|
You can run `npm run updateVersion` to bump the patch part of the version number, so for example 1.0.3 will become 1.0.4. This script will update both the package.json and manifest.json version numbers so as to keep them in sync.
|
||||||
|
|
||||||
|
## Publishing the plugin
|
||||||
|
|
||||||
|
To publish the plugin, add it to npmjs.com by running `npm publish`. Later on, a script will pick up your plugin and add it automatically to the Joplin plugin repository as long as the package satisfies these conditions:
|
||||||
|
|
||||||
|
- In `package.json`, the name starts with "joplin-plugin-". For example, "joplin-plugin-toc".
|
||||||
|
- In `package.json`, the keywords include "joplin-plugin".
|
||||||
|
- In the `publish/` directory, there should be a .jpl and .json file (which are built by `npm run dist`)
|
||||||
|
|
||||||
|
In general all this is done automatically by the plugin generator, which will set the name and keywords of package.json, and will put the right files in the "publish" directory. But if something doesn't work and your plugin doesn't appear in the repository, double-check the above conditions.
|
||||||
|
|
||||||
|
## Updating the plugin framework
|
||||||
|
|
||||||
|
To update the plugin framework, run `npm run update`.
|
||||||
|
|
||||||
|
In general this command tries to do the right thing - in particular it's going to merge the changes in package.json and .gitignore instead of overwriting. It will also leave "/src" as well as README.md untouched.
|
||||||
|
|
||||||
|
The file that may cause problem is "webpack.config.js" because it's going to be overwritten. For that reason, if you want to change it, consider creating a separate JavaScript file and include it in webpack.config.js. That way, when you update, you only have to restore the line that include your file.
|
||||||
|
|
||||||
|
## External script files
|
||||||
|
|
||||||
|
By default, the compiler (webpack) is going to compile `src/index.ts` only (as well as any file it imports), and any other file will simply be copied to the plugin package. In some cases this is sufficient, however if you have [content scripts](https://joplinapp.org/api/references/plugin_api/classes/joplincontentscripts.html) or [webview scripts](https://joplinapp.org/api/references/plugin_api/classes/joplinviewspanels.html#addscript) you might want to compile them too, in particular in these two cases:
|
||||||
|
|
||||||
|
- The script is a TypeScript file - in which case it has to be compiled to JavaScript.
|
||||||
|
|
||||||
|
- The script requires modules you've added to package.json. In that case, the script, whether JS or TS, must be compiled so that the dependencies are bundled with the JPL file.
|
||||||
|
|
||||||
|
To get such an external script file to compile, you need to add it to the `extraScripts` array in `plugin.config.json`. The path you add should be relative to /src. For example, if you have a file in "/src/webviews/index.ts", the path should be set to "webviews/index.ts". Once compiled, the file will always be named with a .js extension. So you will get "webviews/index.js" in the plugin package, and that's the path you should use to reference the file.
|
||||||
|
|
||||||
|
## More information
|
||||||
|
|
||||||
|
- [Joplin Plugin API](https://joplinapp.org/api/references/plugin_api/classes/joplin.html)
|
||||||
|
- [Joplin Data API](https://joplinapp.org/help/api/references/rest_api)
|
||||||
|
- [Joplin Plugin Manifest](https://joplinapp.org/api/references/plugin_manifest/)
|
||||||
|
- Ask for help on the [forum](https://discourse.joplinapp.org/) or our [Discord channel](https://discord.gg/VSj7AFHvpq)
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
MIT © Laurent Cozic
|
@@ -0,0 +1,5 @@
|
|||||||
|
# Joplin Plugin
|
||||||
|
|
||||||
|
This is an example plugin that supports **both** CodeMirror5 and CodeMirror6.
|
||||||
|
|
||||||
|
See https://joplinapp.org/help/api/tutorials/cm6_plugin for the relevant tutorial.
|
14
packages/app-cli/tests/support/plugins/codemirror5-and-codemirror6/api/Global.d.ts
vendored
Normal file
14
packages/app-cli/tests/support/plugins/codemirror5-and-codemirror6/api/Global.d.ts
vendored
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import Plugin from '../Plugin';
|
||||||
|
import Joplin from './Joplin';
|
||||||
|
/**
|
||||||
|
* @ignore
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @ignore
|
||||||
|
*/
|
||||||
|
export default class Global {
|
||||||
|
private joplin_;
|
||||||
|
constructor(implementation: any, plugin: Plugin, store: any);
|
||||||
|
get joplin(): Joplin;
|
||||||
|
get process(): any;
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user