1
0
mirror of https://github.com/laurent22/joplin.git synced 2025-12-23 23:33:01 +02:00

Compare commits

..

29 Commits

Author SHA1 Message Date
Laurent Cozic
b519d55abf Merge branch 'dev' into table_editor 2022-06-14 00:43:23 +01:00
Laurent Cozic
c7697b65ca Add resourceService for debugging 2022-06-13 18:08:20 +01:00
Laurent Cozic
3bb00956fe Desktop: Fixes #6506: App can crash with certain combinations of plugins 2022-06-13 18:08:20 +01:00
Arda Kılıçdağı
e3695c6a80 Turkish translations updated (#6573) 2022-06-10 09:45:37 +01:00
Kenichi Kobayashi
40bc63e7ea Suppress redundant NoteEditor re-rendering by removing non-changing updates of state.selectedNoteTags (#6470) 2022-06-08 10:34:08 +01:00
Kenichi Kobayashi
c320d2364e Performance: suppresses redundant SideBar re-rendering on state.tags (#6451) 2022-06-08 10:33:53 +01:00
Kenichi Kobayashi
fb9e78d6c1 Desktop: Fixes #5178: Allow styling note list items using custom CSS (#6542) 2022-06-08 10:33:06 +01:00
Laurent Cozic
5a862443d8 Merge branch 'dev' into table_editor 2022-06-07 18:30:40 +01:00
alexmo1997
27ef917350 Desktop: Update to Electron 18 (#6496) 2022-06-07 18:23:16 +01:00
Kenichi Kobayashi
2dedede5c3 Removes unnecessary trivial dependencies that causes re-rendering (#6471) 2022-06-07 18:21:55 +01:00
Kenichi Kobayashi
443e049022 Performance: fixes false dependencies in MainScreen (#6444) 2022-06-07 18:09:50 +01:00
Xavi Ivars
b4c3ba249d Update ca.po (#6563) 2022-06-07 17:32:43 +01:00
Perkolator
46f146309d Doc: Added links to mobile changelogs in the about section. (#6562) 2022-06-07 17:32:23 +01:00
ScriptInfra
541203f919 Update README.md (#6560) 2022-06-07 17:31:17 +01:00
ScriptInfra
8495045ada Update README.md (#6559) 2022-06-07 17:30:53 +01:00
ScriptInfra
64c3784a8b Update README.md (#6558)
Added a space between "word `office`".
2022-06-07 17:30:35 +01:00
Joplin Bot
ff897236f7 Doc: Auto-update documentation
Auto-updated using release-website.sh
2022-06-06 18:16:48 +00:00
Laurent Cozic
53206d5488 Clipper release v2.8.1 2022-06-06 16:13:54 +01:00
Laurent Cozic
1eeefb942d Fix clipper build 2022-06-06 16:13:03 +01:00
Laurent Cozic
87296a616a Fix clipper build 2022-06-06 16:10:21 +01:00
Laurent Cozic
6c0f3c3578 Tools: Better joplinbot message 2022-06-06 16:07:47 +01:00
Laurent Cozic
c1fb9fb3f5 iOS 12.8.1 2022-06-06 16:06:09 +01:00
Joplin Bot
466a534fcd Doc: Updated Markdown files
Auto-updated using release-website.sh
2022-06-06 12:23:06 +00:00
Laurent
30e191663d Merge branch 'dev' into table_editor 2022-04-17 12:42:46 +01:00
Laurent
70cd2395fb Merge branch 'dev' into table_editor 2022-04-12 23:31:35 +01:00
Laurent
2f1b6fbee1 Merge branch 'dev' into table_editor 2022-04-12 15:25:01 +01:00
Laurent
8c0d4a0f71 Merge branch 'dev' into table_editor 2022-04-11 20:04:24 +01:00
Laurent
bc08c6dcc3 Merge branch 'dev' into table_editor 2022-04-05 19:17:37 +01:00
Laurent Cozic
a06365039d table editor init 2022-03-07 17:17:41 +00:00
33 changed files with 707 additions and 251 deletions

View File

@@ -421,6 +421,9 @@ packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/styles/index.js.map
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/index.d.ts
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/index.js
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/index.js.map
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/tables.d.ts
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/tables.js
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/tables.js.map
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/types.d.ts
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/types.js
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/types.js.map
@@ -688,6 +691,9 @@ packages/app-desktop/gui/StyleSheets/StyleSheetContainer.js.map
packages/app-desktop/gui/SyncWizard/Dialog.d.ts
packages/app-desktop/gui/SyncWizard/Dialog.js
packages/app-desktop/gui/SyncWizard/Dialog.js.map
packages/app-desktop/gui/TableEditorDialog/Dialog.d.ts
packages/app-desktop/gui/TableEditorDialog/Dialog.js
packages/app-desktop/gui/TableEditorDialog/Dialog.js.map
packages/app-desktop/gui/TagList.d.ts
packages/app-desktop/gui/TagList.js
packages/app-desktop/gui/TagList.js.map

6
.gitignore vendored
View File

@@ -411,6 +411,9 @@ packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/styles/index.js.map
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/index.d.ts
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/index.js
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/index.js.map
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/tables.d.ts
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/tables.js
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/tables.js.map
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/types.d.ts
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/types.js
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/types.js.map
@@ -678,6 +681,9 @@ packages/app-desktop/gui/StyleSheets/StyleSheetContainer.js.map
packages/app-desktop/gui/SyncWizard/Dialog.d.ts
packages/app-desktop/gui/SyncWizard/Dialog.js
packages/app-desktop/gui/SyncWizard/Dialog.js.map
packages/app-desktop/gui/TableEditorDialog/Dialog.d.ts
packages/app-desktop/gui/TableEditorDialog/Dialog.js
packages/app-desktop/gui/TableEditorDialog/Dialog.js.map
packages/app-desktop/gui/TagList.d.ts
packages/app-desktop/gui/TagList.js
packages/app-desktop/gui/TagList.js.map

View File

@@ -1,4 +1,20 @@
<?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>Sun, 22 May 2022 00:00:00 GMT</lastBuildDate><atom:link href="https://joplinapp.org/rss.xml" rel="self" type="application/rss+xml"/><pubDate>Sun, 22 May 2022 00:00:00 GMT</pubDate><item><title><![CDATA[Joplin received 6 Contributor Projects for GSoC 2022!]]></title><description><![CDATA[<p>We are glad to announce that Google allocated us six projects this year for Google Summer of Code! So this is six contributors who will be working on various parts of the apps, both desktop and mobile, over the summer.</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>Mon, 06 Jun 2022 00:00:00 GMT</lastBuildDate><atom:link href="https://joplinapp.org/rss.xml" rel="self" type="application/rss+xml"/><pubDate>Mon, 06 Jun 2022 00:00:00 GMT</pubDate><item><title><![CDATA[Joplin 2.8 is available!]]></title><description><![CDATA[<p>As always a lot of changes and new features in this new version available on both desktop and mobile.</p>
<h1>Multiple profile support<a name="multiple-profile-support" href="#multiple-profile-support" class="heading-anchor">🔗</a></h1>
<p>Perhaps the most visible change in this version is the support for multiple profiles. You can now create as many application profile as you wish, each with their own settings, and easily switch from one to another. The main use case is to support for example a &quot;work&quot; profile and a &quot;personal&quot; profile, to allow you to keep things independent, and each profile can sync with a different sync target.</p>
<p>To create a new profile, open <strong>File &gt; Switch profile</strong> and select <strong>Create new profile</strong>, enter the profile name and press OK. The app will automatically switch to this new profile, which you can now configure.</p>
<p>To switch back to the previous profile, again open <strong>File &gt; Switch profile</strong> and select <strong>Default</strong>.</p>
<p>Note that profiles all share certain settings, such as language, font size, theme, etc. This is done so that you don't have reconfigure every details when switching profiles. Other settings such as sync configuration is per profile.</p>
<p>The feature is available on desktop only for now, and should be ported to mobile relatively soon.</p>
<h1>Save Mermaid graph as PNG/SVG<a name="save-mermaid-graph-as-png-svg" href="#save-mermaid-graph-as-png-svg" class="heading-anchor">🔗</a></h1>
<p>This convenient feature allows exporting a Mermaid graph as a PNG or SVG image, or allows copying the image as a DataUrl, which can then be pasted in any compatible text editor. Thanks Asrient for implementing this!</p>
<p><img src="https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/news/20220606-mermaid-as-png.png" alt=""></p>
<h1>Publish a mini-website using Joplin Cloud<a name="publish-a-mini-website-using-joplin-cloud" href="#publish-a-mini-website-using-joplin-cloud" class="heading-anchor">🔗</a></h1>
<p>Joplin Cloud now supports publishing a note &quot;recursively&quot;, which means the notes and all the notes it is linked to. This allows easily publishing a simple website made of multiples and images.</p>
<p>To make use of this feature, simply select <strong>Also publish linked notes</strong> when publishing a note.</p>
<p><img src="https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/news/20220606-publish-website.png" alt=""></p>
<h1>And more!<a name="and-more" href="#and-more" class="heading-anchor">🔗</a></h1>
<p>In total there are 38 changes to improve the app reliability, security and usability. Full changelog is at <a href="https://joplinapp.org/changelog/">https://joplinapp.org/changelog/</a></p>
]]></description><link>https://joplinapp.org/news/20220606-release-2-8/</link><guid isPermaLink="false">20220606-release-2-8</guid><pubDate>Mon, 06 Jun 2022 00:00:00 GMT</pubDate><twitter-text></twitter-text></item><item><title><![CDATA[Joplin received 6 Contributor Projects for GSoC 2022!]]></title><description><![CDATA[<p>We are glad to announce that Google allocated us six projects this year for Google Summer of Code! So this is six contributors who will be working on various parts of the apps, both desktop and mobile, over the summer.</p>
<p>Over the next few weeks, till 13 June, will be the Community Bonding Period during which GSoC contributors get to know mentors, read documentation, and get up to speed to begin working on their projects.</p>
<p>Here's the full list of projects, contributors and mentors.</p>
<table class="table">
@@ -242,38 +258,4 @@
<p>So far I have &quot;Your notes, anywhere you are&quot; but I'm not certain that's particularly inspiring. Any other idea about what tagline could be used?</p>
]]></description><link>https://joplinapp.org/news/20210705-094247/</link><guid isPermaLink="false">20210705-094247</guid><pubDate>Mon, 05 Jul 2021 09:42:47 GMT</pubDate><twitter-text></twitter-text></item><item><title><![CDATA[Poll: What's the size of your note collection?]]></title><description><![CDATA[<p>Poll is on the forum:</p>
<p><a href="https://discourse.joplinapp.org/t/poll-whats-the-size-of-your-note-collection/18191">https://discourse.joplinapp.org/t/poll-whats-the-size-of-your-note-collection/18191</a></p>
]]></description><link>https://joplinapp.org/news/20210624-171844/</link><guid isPermaLink="false">20210624-171844</guid><pubDate>Thu, 24 Jun 2021 17:18:44 GMT</pubDate><twitter-text></twitter-text></item><item><title><![CDATA[Share notebooks and collaborate on them using Joplin Server 2.0]]></title><description><![CDATA[<p>Since a few versions Joplin Server includes a way to share notebooks between users and collaborate on them - i.e. any participant can view or modify notes in the shared notebook. It's been present since version 2.x and the feature is getting close to be stable.</p>
<p><strong>How does it work?</strong></p>
<p>When connected to Joplin Server (or the upcoming Joplin Cloud service), a new &quot;Share notebook&quot; menu item is available when right-clicking on a notebook.</p>
<p><img src="https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/news/20210621-104753_0.png" alt=""></p>
<p>Click on it, and it will display a new dialog where you can add any number of recipients. Those recipients also need to be on the same Joplin Server instance. From this dialog you can also remove a recipient or unshare the whole notebook, in which case it will be removed from everybody's note collection, except yours.</p>
<p><img src="https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/news/20210621-104753_1.png" alt=""></p>
<p>Once this is done, the recipient(s) will receive a notification in Joplin the next time they synchronise their data:</p>
<p><img src="https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/news/20210621-104753_2.png" alt=""></p>
<p>Then, finally, once the invitation is accepted, Joplin will download all the shared notebooks and notes. A shared notebook is denoted by the usual Share icon. Now the invited user can read or modify the shared notes, add attachments, etc. and the changes will be visible to everyone with access to the notebook.</p>
<p><img src="https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/news/20210621-104753_3.png" alt=""></p>
<p><strong>What's the availability of the notebook sharing feature?</strong></p>
<p>The notebook sharing feature is available on Joplin Server and Joplin Cloud.</p>
<p>On desktop, you can share notebooks and of course view or modify any notebook that has been shared with you.</p>
<p>On mobile and CLI, you cannot currently share notebooks, but you can view or modify any notebook that has been shared with you.</p>
<p><strong>If I share a notebook with someone, what access do they have?</strong></p>
<p>Currently they have full access to the data, including reading, writing and deleting notebooks or notes. In a future version, access control might be implemented. For example, to only give read-only access to the shared notebook.</p>
<p><strong>What can actually be shared?</strong></p>
<p>All the sub-notebooks, notes and resources within the shared notebook are shared.</p>
<p><strong>Does it work with End-To-End-Encryption?</strong></p>
<p>Yes and no. It is possible to use the share notebook feature even with E2EE enabled, however any shared notebook or note will not be encrypted, otherwise you would have had to give your master key password to the people you share with, which you'd probably not want to do.</p>
<p>In a future version, this might be supported. For example by automatically creating a new master key for the shared notebook. You would then provide the recipients with that master key password.</p>
<p><strong>What can it be used for?</strong></p>
<p>Some ideas:</p>
<ul>
<li>
<p>Plan a trip with friends or within a small organisation. For example, the notes could contain the maps, hotel and flight reservations, etc. or any document or note relevant to the trip. And all participants would have access to them.</p>
</li>
<li>
<p>Work on a project with colleagues. Everybody can access various work-related documents, add to them, modify them, etc. That could serve as a knowledge base for a project.</p>
</li>
<li>
<p>Another possible use, which has been requested many times, is to support multiple profiles. You could create a main profile that have access to all notes, and in there create a Work and Personal notebook. Then you would create a separate account for work. You can then share your Work notebook with that other account. That way the work account will only have access to the Work notebooks. You can use this technique in various ways to split your notebooks between multiple accounts and ensure strict separation between datasets.</p>
</li>
</ul>
]]></description><link>https://joplinapp.org/news/20210621-104753/</link><guid isPermaLink="false">20210621-104753</guid><pubDate>Mon, 21 Jun 2021 10:47:53 GMT</pubDate><twitter-text></twitter-text></item></channel></rss>
]]></description><link>https://joplinapp.org/news/20210624-171844/</link><guid isPermaLink="false">20210624-171844</guid><pubDate>Thu, 24 Jun 2021 17:18:44 GMT</pubDate><twitter-text></twitter-text></item></channel></rss>

View File

@@ -28,11 +28,11 @@ Three types of applications are available: for **desktop** (Windows, macOS and L
Operating System | Download
---|---
Windows (32 and 64-bit) | <a href='https://github.com/laurent22/joplin/releases/download/v2.7.15/Joplin-Setup-2.7.15.exe'><img alt='Get it on Windows' width="134px" src='https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/BadgeWindows.png'/></a>
macOS | <a href='https://github.com/laurent22/joplin/releases/download/v2.7.15/Joplin-2.7.15.dmg'><img alt='Get it on macOS' width="134px" src='https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/BadgeMacOS.png'/></a>
Linux | <a href='https://github.com/laurent22/joplin/releases/download/v2.7.15/Joplin-2.7.15.AppImage'><img alt='Get it on Linux' width="134px" src='https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/BadgeLinux.png'/></a>
Windows (32 and 64-bit) | <a href='https://github.com/laurent22/joplin/releases/download/v2.8.8/Joplin-Setup-2.8.8.exe'><img alt='Get it on Windows' width="134px" src='https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/BadgeWindows.png'/></a>
macOS | <a href='https://github.com/laurent22/joplin/releases/download/v2.8.8/Joplin-2.8.8.dmg'><img alt='Get it on macOS' width="134px" src='https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/BadgeMacOS.png'/></a>
Linux | <a href='https://github.com/laurent22/joplin/releases/download/v2.8.8/Joplin-2.8.8.AppImage'><img alt='Get it on Linux' width="134px" src='https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/BadgeLinux.png'/></a>
**On Windows**, you may also use the <a href='https://github.com/laurent22/joplin/releases/download/v2.7.15/JoplinPortable.exe'>Portable version</a>. The [portable application](https://en.wikipedia.org/wiki/Portable_application) allows installing the software on a portable device such as a USB key. Simply copy the file JoplinPortable.exe in any directory on that USB key ; the application will then create a directory called "JoplinProfile" next to the executable file.
**On Windows**, you may also use the <a href='https://github.com/laurent22/joplin/releases/download/v2.8.8/JoplinPortable.exe'>Portable version</a>. The [portable application](https://en.wikipedia.org/wiki/Portable_application) allows installing the software on a portable device such as a USB key. Simply copy the file JoplinPortable.exe in any directory on that USB key ; the application will then create a directory called "JoplinProfile" next to the executable file.
**On Linux**, the recommended way is to use the following installation script as it will handle the desktop icon too:
@@ -42,7 +42,7 @@ Linux | <a href='https://github.com/laurent22/joplin/releases/download/v2.7.15/J
Operating System | Download | Alt. Download
---|---|---
Android | <a href='https://play.google.com/store/apps/details?id=net.cozic.joplin&utm_source=GitHub&utm_campaign=README&pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1'><img alt='Get it on Google Play' height="40px" src='https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/BadgeAndroid.png'/></a> | or download the APK file: [64-bit](https://github.com/laurent22/joplin-android/releases/download/android-v2.7.2/joplin-v2.7.2.apk) [32-bit](https://github.com/laurent22/joplin-android/releases/download/android-v2.7.2/joplin-v2.7.2-32bit.apk)
Android | <a href='https://play.google.com/store/apps/details?id=net.cozic.joplin&utm_source=GitHub&utm_campaign=README&pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1'><img alt='Get it on Google Play' height="40px" src='https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/BadgeAndroid.png'/></a> | or download the APK file: [64-bit](https://github.com/laurent22/joplin-android/releases/download/android-v2.8.1/joplin-v2.8.1.apk) [32-bit](https://github.com/laurent22/joplin-android/releases/download/android-v2.8.1/joplin-v2.8.1-32bit.apk)
iOS | <a href='https://itunes.apple.com/us/app/joplin/id1315599797'><img alt='Get it on the App Store' height="40px" src='https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/BadgeIOS.png'/></a> | -
## Terminal application
@@ -153,6 +153,8 @@ A community maintained list of these distributions can be found here: [Unofficia
- About
- [Changelog (Desktop App)](https://github.com/laurent22/joplin/blob/dev/readme/changelog.md)
- [Changelog (Android)](https://github.com/laurent22/joplin/blob/dev/readme/changelog_android.md)
- [Changelog (iOS)](https://github.com/laurent22/joplin/blob/dev/readme/changelog_ios.md)
- [Changelog (CLI App)](https://github.com/laurent22/joplin/blob/dev/readme/changelog_cli.md)
- [Changelog (Server)](https://github.com/laurent22/joplin/blob/dev/readme/changelog_server.md)
- [Stats](https://github.com/laurent22/joplin/blob/dev/readme/stats.md)
@@ -185,6 +187,7 @@ A community maintained list of these distributions can be found here: [Unofficia
- Custom CSS support for customisation of both the rendered markdown and overall user interface.
- Customisable layout allows toggling, movement and sizing of various elements.
- Keyboard shortcuts are editable and allow binding of most Joplin commands with export/import functionality.
- Multiple profile support.
# Importing
@@ -450,7 +453,7 @@ You can also use search filters to further restrict the search.
| Operator | Description | Example |
| --- | --- | --- |
|**-**|If placed before a text term, it excludes the notes that contain that term. You can also place it before a filter to negate it. |`-spam` searches for all notes without the word `spam`.<br>`office -trash` searches for all notes with the word`office` and without the word `trash`.|
|**-**|If placed before a text term, it excludes the notes that contain that term. You can also place it before a filter to negate it. |`-spam` searches for all notes without the word `spam`.<br>`office -trash` searches for all notes with the word `office` and without the word `trash`.|
|**any:**|Return notes that satisfy any/all of the required conditions. `any:0` is the default, which means all conditions must be satisfied.|`any:1 cat dog` will return notes that have the word `cat` or `dog`.<br>`any:0 cat dog` will return notes with both the words `cat` and `dog`. |
| **title:** <br> **body:**|Restrict your search to just the title or the body field.|`title:"hello world"` searches for notes whose title contains `hello` and `world`.<br>`title:hello -body:world` searches for notes whose title contains `hello` and body does not contain `world`.
| **tag:** |Restrict the search to the notes with the specified tags.|`tag:office` searches for all notes having tag office.<br>`tag:office tag:important` searches for all notes having both office and important tags.<br>`tag:office -tag:spam` searches for notes having tag `office` which do not have tag `spam`.<br>`any:1 tag:office tag:spam` searches for notes having tag `office` or tag `spam`.<br>`tag:be*ful` does a search with wildcards.<br>`tag:*` returns all notes with tags.<br>`-tag:*` returns all notes without tags.|
@@ -482,6 +485,16 @@ Notes are sorted by "relevance". Currently it means the notes that contain the r
In the desktop application, press <kbd>Ctrl+P</kbd> or <kbd>Cmd+P</kbd> and type a note title or part of its content to jump to it. Or type <kbd>#</kbd> followed by a tag name, or <kbd>@</kbd> followed by a notebook name.
# Multiple profile support
To create a new profile, open File > Switch profile and select Create new profile, enter the profile name and press OK. The app will automatically switch to this new profile, which you can now configure.
To switch back to the previous profile, again open File > Switch profile and select Default.
Note that profiles all share certain settings, such as language, font size, theme, etc. This is done so that you don't have reconfigure every details when switching profiles. Other settings such as sync configuration is per profile.
The feature is available on desktop only for now, and should be ported to mobile relatively soon.
# Donations
Donations to Joplin support the development of the project. Developing quality applications mostly takes time, but there are also some expenses, such as digital certificates to sign the applications, app store fees, hosting, etc. Most of all, your donation will make it possible to keep up the current development standard.

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 2,
"name": "Joplin Web Clipper [DEV]",
"version": "2.8.0",
"version": "2.8.1",
"description": "Capture and save web pages and screenshots from your browser to Joplin.",
"homepage_url": "https://joplinapp.org",
"content_security_policy": "script-src 'self'; object-src 'self'",

View File

@@ -538,6 +538,7 @@ class Application extends BaseApplication {
pluginService: PluginService.instance(),
bridge: bridge(),
debug: new DebugService(reg.db()),
resourceService: ResourceService.instance(),
};
}

View File

@@ -70,7 +70,6 @@ interface Props {
showNeedUpgradingMasterKeyMessage: boolean;
showShouldReencryptMessage: boolean;
showInstallTemplatesPlugin: boolean;
focusedField: string;
themeId: number;
settingEditorCodeView: boolean;
pluginsLegacy: any;
@@ -698,7 +697,6 @@ class MainScreenComponent extends React.Component<Props, State> {
key={key}
resizableLayoutEventEmitter={eventEmitter}
visible={event.visible}
focusedField={this.props.focusedField}
size={event.size}
themeId={this.props.themeId}
/>;
@@ -861,23 +859,18 @@ const mapStateToProps = (state: AppState) => {
return {
themeId: state.settings.theme,
settingEditorCodeView: state.settings['editor.codeView'],
folders: state.folders,
notes: state.notes,
hasDisabledSyncItems: state.hasDisabledSyncItems,
hasDisabledEncryptionItems: state.hasDisabledEncryptionItems,
showMissingMasterKeyMessage: showMissingMasterKeyMessage(syncInfo, state.notLoadedMasterKeys),
showNeedUpgradingMasterKeyMessage: !!EncryptionService.instance().masterKeysThatNeedUpgrading(syncInfo.masterKeys).length,
showShouldReencryptMessage: state.settings['encryption.shouldReencrypt'] >= Setting.SHOULD_REENCRYPT_YES,
shouldUpgradeSyncTarget: state.settings['sync.upgradeState'] === Setting.SYNC_UPGRADE_STATE_SHOULD_DO,
selectedFolderId: state.selectedFolderId,
selectedNoteId: state.selectedNoteIds.length === 1 ? state.selectedNoteIds[0] : null,
pluginsLegacy: state.pluginsLegacy,
plugins: state.pluginService.plugins,
pluginHtmlContents: state.pluginService.pluginHtmlContents,
customCss: state.customCss,
editorNoteStatuses: state.editorNoteStatuses,
hasNotesBeingSaved: stateUtils.hasNotesBeingSaved(state),
focusedField: state.focusedField,
layoutMoveMode: state.layoutMoveMode,
mainLayout: state.mainLayout,
startupPluginsLoaded: state.startupPluginsLoaded,

View File

@@ -38,6 +38,7 @@ import ErrorBoundary from '../../../ErrorBoundary';
import { MarkupToHtmlOptions } from '../../utils/useMarkupToHtml';
import eventManager from '@joplin/lib/eventManager';
import { EditContextMenuFilterObject } from '@joplin/lib/services/plugins/api/JoplinWorkspace';
import { checkTableIsUnderCursor, readTableAroundCursor } from './utils/tables';
const menuUtils = new MenuUtils(CommandService.instance());
@@ -259,7 +260,7 @@ function CodeMirror(props: NoteBodyEditorProps, ref: any) {
return commandOutput;
},
};
}, [props.content, props.visiblePanes, addListItem, wrapSelectionWithStrings, setEditorPercentScroll, setViewerPercentScroll, resetScroll, renderedBody]);
}, [props.content, props.visiblePanes, addListItem, wrapSelectionWithStrings, setEditorPercentScroll, setViewerPercentScroll, resetScroll]);
const onEditorPaste = useCallback(async (event: any = null) => {
const resourceMds = await handlePasteEvent(event);
@@ -672,7 +673,7 @@ function CodeMirror(props: NoteBodyEditorProps, ref: any) {
// props.content has been updated).
const textChanged = props.searchMarkers.keywords.length > 0 && (props.content !== previousContent || renderedBody !== previousRenderedBody);
if (props.searchMarkers !== previousSearchMarkers || textChanged) {
if (webviewRef.current?.wrappedInstance && (props.searchMarkers !== previousSearchMarkers || textChanged)) {
webviewRef.current.wrappedInstance.send('setMarkers', props.searchMarkers.keywords, props.searchMarkers.options);
if (editorRef.current) {
@@ -753,7 +754,14 @@ function CodeMirror(props: NoteBodyEditorProps, ref: any) {
const menu = new Menu();
const hasSelectedText = editorRef.current && !!editorRef.current.getSelection() ;
const cm = editorRef.current;
const hasSelectedText = cm && !!cm.getSelection() ;
const tableIsUnderCursor = checkTableIsUnderCursor(cm);
let tableUnderCursor: string = null;
if (tableIsUnderCursor) tableUnderCursor = readTableAroundCursor(cm);
menu.append(
new MenuItem({
@@ -785,6 +793,27 @@ function CodeMirror(props: NoteBodyEditorProps, ref: any) {
})
);
if (tableUnderCursor) {
menu.append(
new MenuItem({ type: 'separator' })
);
menu.append(
new MenuItem({
label: _('Edit table...'),
click: async () => {
props.dispatch({
type: 'DIALOG_OPEN',
name: 'tableEditor',
props: {
markdownTable: tableUnderCursor,
},
});
},
})
);
}
const spellCheckerMenuItems = SpellCheckerService.instance().contextMenuItems(params.misspelledWord, params.dictionarySuggestions);
for (const item of spellCheckerMenuItems) {

View File

@@ -0,0 +1,48 @@
function findElementWithClass(element: any, className: string): any {
if (element.classList && element.classList.contains(className)) return element;
for (const child of element.childNodes) {
const hasClass = findElementWithClass(child, className);
if (hasClass) return hasClass;
}
return null;
}
export const checkTableIsUnderCursor = (cm: any) => {
if (!cm) return false;
const coords = cm.cursorCoords(cm.getCursor());
const element = document.elementFromPoint(coords.left, coords.top);
if (!element) return false;
return !!findElementWithClass(element, 'cm-jn-table-item');
};
export const readTableAroundCursor = (cm: any) => {
const idxAtCursor = cm.doc.getCursor().line;
const lineCount = cm.lineCount();
const lines: string[] = [];
for (let i = idxAtCursor - 1; i >= 0; i--) {
const line: string = cm.doc.getLine(i);
if (line.startsWith('|')) {
lines.splice(0, 0, line);
} else {
break;
}
}
lines.push(cm.doc.getLine(idxAtCursor));
for (let i = idxAtCursor + 1; i < lineCount; i++) {
const line: string = cm.doc.getLine(i);
if (line.startsWith('|')) {
lines.push(line);
} else {
break;
}
}
return lines.join('\n');
};

View File

@@ -165,6 +165,7 @@ export default function useJoplinMode(CodeMirror: any) {
}
if (isMonospace) { token = `${token} jn-monospace`; }
if (state.inTable) { token = `${token} jn-table-item`; }
// //////// End Monospace //////////
return token;

View File

@@ -585,7 +585,6 @@ const mapStateToProps = (state: AppState) => {
return {
noteId: noteId,
notes: state.notes,
folders: state.folders,
selectedNoteIds: state.selectedNoteIds,
selectedFolderId: state.selectedFolderId,
isProvisional: state.provisionalNoteIds.includes(noteId),

View File

@@ -27,7 +27,6 @@ export interface NoteEditorProps {
editorNoteStatuses: any;
syncStarted: boolean;
bodyEditor: string;
folders: any[];
notesParentType: string;
selectedNoteTags: any[];
lastEditorScrollPercents: any;

View File

@@ -55,7 +55,7 @@ const NoteListComponent = (props: Props) => {
};
}, []);
const itemHeight = 34;
const [itemHeight, setItemHeight] = useState(34);
const focusItemIID_ = useRef<any>(null);
const noteListRef = useRef(null);
@@ -453,6 +453,16 @@ const NoteListComponent = (props: Props) => {
};
}, []);
useEffect(() => {
// When a note list item is styled by userchrome.css, its height is reflected.
// Ref. https://github.com/laurent22/joplin/pull/6542
const noteItem = Object.values<any>(itemAnchorRefs_.current)[0]?.current;
const actualItemHeight = noteItem?.getHeight() ?? 0;
if (actualItemHeight >= 8) { // To avoid generating too many narrow items
setItemHeight(actualItemHeight);
}
});
const renderEmptyList = () => {
if (props.notes.length) return null;

View File

@@ -167,6 +167,7 @@ function NoteListControls(props: Props) {
const mapStateToProps = (state: AppState) => {
return {
showNewNoteButtons: state.focusedField !== 'globalSearch',
sortOrderButtonsVisible: state.settings['notes.sortOrder.buttonsVisible'],
sortOrderField: state.settings['notes.sortOrder.field'],
sortOrderReverse: state.settings['notes.sortOrder.reverse'],

View File

@@ -73,6 +73,7 @@ function NoteListItem(props: NoteListItemProps, ref: any) {
focus: function() {
if (anchorRef.current) anchorRef.current.focus();
},
getHeight: () => anchorRef.current?.clientHeight,
};
});

View File

@@ -10,7 +10,6 @@ interface Props {
resizableLayoutEventEmitter: any;
size: Size;
visible: boolean;
focusedField: string;
themeId: number;
}
@@ -34,7 +33,7 @@ export default function NoteListWrapper(props: Props) {
return (
<StyledRoot>
<NoteListControls showNewNoteButtons={props.focusedField !== 'globalSearch'} height={controlHeight} />
<NoteListControls height={controlHeight} />
<NoteList resizableLayoutEventEmitter={props.resizableLayoutEventEmitter} size={noteListSize} visible={props.visible}/>
</StyledRoot>
);

View File

@@ -22,6 +22,7 @@ import Dialog from './Dialog';
import SyncWizardDialog from './SyncWizard/Dialog';
import MasterPasswordDialog from './MasterPasswordDialog/Dialog';
import EditFolderDialog from './EditFolderDialog/Dialog';
import TableEditorDialog from './TableEditorDialog/Dialog';
import StyleSheetContainer from './StyleSheets/StyleSheetContainer';
const { ImportScreen } = require('./ImportScreen.min.js');
const { ResourceScreen } = require('./ResourceScreen.js');
@@ -38,6 +39,7 @@ interface Props {
zoomFactor: number;
needApiAuth: boolean;
dialogs: AppStateDialog[];
dialogContentMaxSize: Size;
}
interface ModalDialogProps {
@@ -51,6 +53,7 @@ interface RegisteredDialogProps {
themeId: number;
key: string;
dispatch: Function;
dialogContentMaxSize: Size;
}
interface RegisteredDialog {
@@ -60,19 +63,25 @@ interface RegisteredDialog {
const registeredDialogs: Record<string, RegisteredDialog> = {
syncWizard: {
render: (props: RegisteredDialogProps, customProps: any) => {
return <SyncWizardDialog key={props.key} dispatch={props.dispatch} themeId={props.themeId} {...customProps}/>;
return <SyncWizardDialog key={props.key} dispatch={props.dispatch} dialogContentMaxSize={props.dialogContentMaxSize} themeId={props.themeId} {...customProps}/>;
},
},
masterPassword: {
render: (props: RegisteredDialogProps, customProps: any) => {
return <MasterPasswordDialog key={props.key} dispatch={props.dispatch} themeId={props.themeId} {...customProps}/>;
return <MasterPasswordDialog key={props.key} dispatch={props.dispatch} dialogContentMaxSize={props.dialogContentMaxSize} themeId={props.themeId} {...customProps}/>;
},
},
editFolder: {
render: (props: RegisteredDialogProps, customProps: any) => {
return <EditFolderDialog key={props.key} dispatch={props.dispatch} themeId={props.themeId} {...customProps}/>;
return <EditFolderDialog key={props.key} dispatch={props.dispatch} dialogContentMaxSize={props.dialogContentMaxSize} themeId={props.themeId} {...customProps}/>;
},
},
tableEditor: {
render: (props: RegisteredDialogProps, customProps: any) => {
return <TableEditorDialog key={props.key} dispatch={props.dispatch} dialogContentMaxSize={props.dialogContentMaxSize} themeId={props.themeId} {...customProps}/>;
},
},
};
@@ -195,10 +204,12 @@ class RootComponent extends React.Component<Props, any> {
for (const dialog of props.dialogs) {
const md = registeredDialogs[dialog.name];
if (!md) throw new Error(`Unknown dialog: ${dialog.name}`);
output.push(md.render({
key: dialog.name,
themeId: props.themeId,
dispatch: props.dispatch,
dialogContentMaxSize: props.dialogContentMaxSize,
}, dialog.props));
}
return output;
@@ -245,6 +256,11 @@ const mapStateToProps = (state: AppState) => {
themeId: state.settings.theme,
needApiAuth: state.needApiAuth,
dialogs: state.dialogs,
dialogContentMaxSize: {
// Minus padding, margins and dialog header and button bar.
width: state.windowContentSize.width - 36 * 2,
height: state.windowContentSize.height - 36 * 2 - 28 - 30 - 20,
},
profileConfigCurrentProfileId: state.profileConfig.currentProfileId,
};
};

View File

@@ -0,0 +1,101 @@
import * as React from 'react';
import { useCallback, useEffect } from 'react';
import { _ } from '@joplin/lib/locale';
import DialogButtonRow, { ClickEvent } from '../DialogButtonRow';
import Dialog from '../Dialog';
import DialogTitle from '../DialogTitle';
import { parseMarkdownTable } from '../../../lib/markdownUtils';
import { Size } from '../ResizableLayout/utils/types';
interface Props {
themeId: number;
dispatch: Function;
markdownTable: string;
dialogContentMaxSize: Size;
}
const markdownTableToObject = (markdownTable: string): any => {
const table = parseMarkdownTable(markdownTable);
return {
columns: table.headers.map(h => {
return {
title: h.label,
field: h.name,
hozAlign: h.justify,
editor: 'input',
};
}),
data: table.rows.map(row => {
return {
...row,
};
}),
};
};
export default function(props: Props) {
const elementId = `tabulator_${Math.floor(Math.random() * 1000000)}`;
const onClose = useCallback(() => {
props.dispatch({
type: 'DIALOG_CLOSE',
name: 'tableEditor',
});
}, [props.dispatch]);
const onButtonRowClick = useCallback(async (event: ClickEvent) => {
if (event.buttonName === 'cancel') {
onClose();
return;
}
if (event.buttonName === 'ok') {
return;
}
}, [onClose]);
useEffect(() => {
const table = markdownTableToObject(props.markdownTable);
const Tabulator = (window as any).Tabulator;
// TODO: probably doesn't need to be called every time
// TODO: Load CSS/JS dynamically?
// TODO: Clean up on exit
Tabulator.extendModule('edit', 'editors', {});
new Tabulator(`#${elementId}`, {
...table,
height: props.dialogContentMaxSize.height,
});
}, []);
function renderContent() {
return (
<div className="dialog-content">
<div id={elementId}></div>
</div>
);
}
function renderDialogWrapper() {
return (
<div className="dialog-root">
<DialogTitle title={_('Edit table')}/>
{renderContent()}
<DialogButtonRow
themeId={props.themeId}
onClick={onButtonRowClick}
okButtonLabel={_('Save')}
/>
</div>
);
}
return (
<Dialog onClose={onClose} renderContent={renderDialogWrapper}/>
);
}

View File

@@ -7,6 +7,10 @@
uses 'eval'.
<meta http-equiv="Content-Security-Policy" content="default-src 'self' 'unsafe-inline' 'unsafe-eval'">
-->
<!--
To add files below, then need to be in the "vendor" directory. To make this happen, use copyApplicationAssets.js
-->
<title>Joplin</title>
<link rel="stylesheet" href="style.min.css">
<link rel="stylesheet" href="style/icons/style.css">
@@ -15,6 +19,9 @@
<link rel="stylesheet" href="vendor/lib/smalltalk/css/smalltalk.css">
<link rel="stylesheet" href="vendor/lib/roboto-fontface/css/roboto/roboto-fontface.css">
<link rel="stylesheet" href="vendor/lib/codemirror/lib/codemirror.css">
<link rel="stylesheet" href="vendor/lib/tabulator-tables/dist/css/tabulator.min.css">
<script type="text/javascript" src="vendor/lib/tabulator-tables/dist/js/tabulator.min.js"></script>
<style>
.smalltalk {

View File

@@ -116,10 +116,10 @@
"app-builder-bin": "^1.9.11",
"babel-cli": "^6.26.0",
"babel-preset-react": "^6.24.1",
"electron": "14.1.0",
"electron-builder": "^22.11.7",
"electron-notarize": "^1.0.0",
"electron-rebuild": "^3.2.3",
"electron": "18.2.0",
"electron-builder": "^23.0.3",
"electron-notarize": "^1.2.1",
"electron-rebuild": "^3.2.7",
"glob": "^7.1.6",
"gulp": "^4.0.2",
"jest": "^26.6.3",
@@ -174,6 +174,7 @@
"styled-components": "5.1.1",
"styled-system": "5.1.5",
"taboverride": "^4.0.3",
"tabulator-tables": "^5.1.4",
"tinymce": "^5.2.0"
}
}

View File

@@ -83,6 +83,8 @@ async function main() {
'codemirror/addon/dialog/dialog.css',
'@joeattardi/emoji-button/dist/index.js',
'mark.js/dist/mark.min.js',
'tabulator-tables/dist/css/tabulator.min.css',
'tabulator-tables/dist/js/tabulator.min.js',
{
src: resolve(__dirname, '../../lib/services/plugins/sandboxProxy.js'),
dest: `${buildLibDir}/@joplin/lib/services/plugins/sandboxProxy.js`,

View File

@@ -1,4 +1,4 @@
import markdownUtils from './markdownUtils';
import markdownUtils, { parseMarkdownTable } from './markdownUtils';
describe('Should detect list items', () => {
test('should detect `- lorem ipsum` as list item ', () => {
@@ -91,4 +91,51 @@ describe('Should detect list items', () => {
expect(markdownUtils.isEmptyListItem('+ [x]')).toBe(false);
});
test('should parse a Markdown table', () => {
const table = parseMarkdownTable(`
| Name | Town | Comment |
|----------:|:-------:|----|
| John | London | None |
| Paul | Liverpool | **test bold** |
| Ringo | Sheffield | <a href="#">link</a> ![](https://image.com/img.png) |
`.trim().split('\n').map(l => l.trim()).join('\n'));
expect(table).toEqual({
'headers': [
{
'label': 'Name',
'name': 'c0',
'justify': 'right',
},
{
'label': 'Town',
'name': 'c1',
'justify': 'center',
},
{
'label': 'Comment',
'name': 'c2',
'justify': 'left',
},
],
'rows': [
{
'c0': 'John',
'c1': 'London',
'c2': 'None',
},
{
'c0': 'Paul',
'c1': 'Liverpool',
'c2': '**test bold**',
},
{
'c0': 'Ringo',
'c1': 'Sheffield',
'c2': '<a href="#">link</a> ![](https://image.com/img.png)',
},
],
});
});
});

View File

@@ -10,7 +10,7 @@ const emptyListRegex = /^(\s*)([*+-] \[[x ]\]|[*+-]|(\d+)[.)])(\s+)$/;
export enum MarkdownTableJustify {
Left = 'left',
Center = 'center',
Right = 'right,',
Right = 'right',
}
export interface MarkdownTableHeader {
@@ -25,6 +25,11 @@ export interface MarkdownTableRow {
[key: string]: string;
}
export interface MarkdownTable {
headers: MarkdownTableHeader[];
rows: MarkdownTableRow[];
}
const markdownUtils = {
// Titles for markdown links only need escaping for [ and ]
escapeTitleText(text: string) {
@@ -206,4 +211,95 @@ const markdownUtils = {
},
};
export const parseMarkdownTable = (tableMarkdown: string): MarkdownTable => {
interface Token {
type: string;
content: string;
attrGet: (name: string)=> string;
}
const getJustifyFromStyle = (token: Token): MarkdownTableJustify => {
const style = token.attrGet('style');
if (!style) return MarkdownTableJustify.Left;
if (style.includes('text-align:right')) return MarkdownTableJustify.Right;
if (style.includes('text-align:left')) return MarkdownTableJustify.Left;
if (style.includes('text-align:center')) return MarkdownTableJustify.Center;
return MarkdownTableJustify.Left;
};
const env = {};
const markdownIt = new MarkdownIt();
const tokens: Token[] = markdownIt.parse(tableMarkdown, env);
const headers: MarkdownTableHeader[] = [];
const rows: MarkdownTableRow[] = [];
let state = 'start';
let headerIndex = 0;
let rowIndex = -1;
for (const token of tokens) {
if (state === 'start') {
if (token.type !== 'table_open') {
throw new Error('Expected table_open token');
} else {
state = 'open';
}
continue;
}
if (token.type === 'thead_open') {
state = 'header';
continue;
}
if (state === 'header') {
if (token.type === 'th_open') {
headers.push({
label: '',
name: `c${headerIndex}`,
justify: getJustifyFromStyle(token),
});
}
if (token.type === 'inline') {
headers[headerIndex].label += token.content;
}
if (token.type === 'th_close') {
headerIndex++;
}
if (token.type === 'thead_close') {
state = 'content';
}
continue;
}
if (state === 'content') {
if (token.type === 'tr_open') {
state = 'row';
rows.push({});
rowIndex++;
headerIndex = 0;
}
continue;
}
if (state === 'row') {
if (token.type === 'inline') {
rows[rowIndex][`c${headerIndex}`] = token.content;
headerIndex++;
}
if (token.type === 'tr_close') {
state = 'content';
}
continue;
}
}
return { headers, rows };
};
export default markdownUtils;

View File

@@ -610,4 +610,26 @@ describe('reducer', function() {
expect(state.selectedNoteIds).toBe(expected);
}
});
// tests for TAG_UPDATE_ALL about PR #6451
it('should not change tags when a new value is deep equal to the old value', async () => {
const tags = await createNTestTags(6);
const oldTags = tags.slice(0, 5);
{
// Case 1. The input which is deep equal to the current state.tags doesn't change state.tags.
const oldState = initTestState(null, null, null, null, oldTags, [2]);
const newTags = oldTags.slice();
// test action
const newState = reducer(oldState, { type: 'TAG_UPDATE_ALL', items: newTags });
expect(newState.tags).toBe(oldState.tags);
}
{
// Case 2. A different input changes state.tags.
const oldState = initTestState(null, null, null, null, oldTags, [2]);
const newTags = oldTags.slice().splice(3, 1, tags[5]);
// test action
const newState = reducer(oldState, { type: 'TAG_UPDATE_ALL', items: newTags });
expect(newState.tags).not.toBe(oldState.tags);
}
});
});

View File

@@ -1,4 +1,4 @@
import produce, { Draft } from 'immer';
import produce, { Draft, original } from 'immer';
import pluginServiceReducer, { stateRootKey as pluginServiceStateRootKey, defaultState as pluginServiceDefaultState, State as PluginServiceState } from './services/plugins/reducer';
import shareServiceReducer, { stateRootKey as shareServiceStateRootKey, defaultState as shareServiceDefaultState, State as ShareServiceState } from './services/share/reducer';
import Note from './models/Note';
@@ -7,6 +7,7 @@ import BaseModel from './BaseModel';
import { Store } from 'redux';
import { ProfileConfig } from './services/profileConfig/types';
import * as ArrayUtils from './ArrayUtils';
const fastDeepEqual = require('fast-deep-equal');
const { ALL_NOTES_FILTER_ID } = require('./reserved-ids');
const { createSelectorCreator, defaultMemoize } = require('reselect');
const { createCachedSelector } = require('re-reselect');
@@ -924,7 +925,9 @@ const reducer = produce((draft: Draft<State> = defaultState, action: any) => {
break;
case 'TAG_UPDATE_ALL':
draft.tags = action.items;
if (!fastDeepEqual(original(draft.tags), action.items)) {
draft.tags = action.items;
}
break;
case 'TAG_SELECT':
@@ -1122,7 +1125,9 @@ const reducer = produce((draft: Draft<State> = defaultState, action: any) => {
break;
case 'SET_NOTE_TAGS':
draft.selectedNoteTags = action.items;
if (!fastDeepEqual(original(draft.selectedNoteTags), action.items)) {
draft.selectedNoteTags = action.items;
}
break;
case 'PLUGINLEGACY_DIALOG_SET':

View File

@@ -5,7 +5,7 @@
# Translators:
# Josep Maria Planell <planell.josep@gmail.com>, 2019
# Joan Montané <jmontane@softcatala.org>, 2019
# Xavi Ivars <xavi.ivars@gmail.com>, 2021
# Xavi Ivars <xavi.ivars@gmail.com>, 2021-2022
#
msgid ""
msgstr ""
@@ -302,9 +302,8 @@ msgid "Also displays unset and hidden config variables."
msgstr "També mostra variables de configuració ocultes o sense definir."
#: packages/app-desktop/gui/ShareNoteDialog.tsx:203
#, fuzzy
msgid "Also publish linked notes"
msgstr "Deixa de publicar la nota"
msgstr "Publica també les notes enllaçades"
#: packages/lib/models/Setting.ts:713
msgid "Always"
@@ -870,18 +869,16 @@ msgstr ""
"s'està avortant. Torneu a provar quan tingueu connexió a Internet."
#: packages/app-desktop/gui/PromptDialog.min.js:235
#, fuzzy
msgid "Create"
msgstr "Creació"
msgstr "Crea"
#: packages/app-mobile/components/note-list.js:101
msgid "Create a notebook"
msgstr "Crea un bloc de notes nou"
#: packages/app-desktop/gui/MainScreen/commands/addProfile.ts:9
#, fuzzy
msgid "Create new profile..."
msgstr "Crea una nota nova."
msgstr "Crea un perfil nou..."
#: packages/app-desktop/gui/EditFolderDialog/Dialog.tsx:161
msgid "Create notebook"
@@ -1330,7 +1327,7 @@ msgstr "Edita el bloc de notes"
#: packages/app-desktop/commands/editProfileConfig.ts:9
msgid "Edit profile configuration..."
msgstr ""
msgstr "Edita la configuració del perfil"
#: packages/app-desktop/gui/NoteContentPropertiesDialog.tsx:138
#: packages/lib/models/Setting.ts:876 packages/lib/models/Setting.ts:877
@@ -1360,9 +1357,8 @@ msgstr "Lletra d'amplada fixa de l'editor"
#: packages/app-desktop/gui/NoteEditor/editorCommandDeclarations.ts:100
#: packages/app-desktop/gui/NoteEditor/editorCommandDeclarations.ts:96
#, fuzzy
msgid "Editor: %s"
msgstr "Editor"
msgstr "Editor: %s"
#: packages/app-cli/app/command-ls.js:31
msgid "Either \"text\" or \"json\""
@@ -1677,9 +1673,8 @@ msgid "File system"
msgstr "Sistema de fitxers"
#: packages/app-mobile/components/screens/NoteTagsDialog.js:190
#, fuzzy
msgid "Filter tags"
msgstr "Etiquetes noves:"
msgstr "Filtra les etiquetes"
#: packages/app-desktop/gui/ExtensionBadge.min.js:10
msgid "Firefox Extension"
@@ -2806,6 +2801,8 @@ msgid ""
"Please click on \"%s\" to proceed, or set the passwords in the \"%s\" list "
"below."
msgstr ""
"Feu clic a \"%s\" per a continuar, o definiu les contrasenyes a la llista "
"\"%s\" inferior."
#: packages/lib/components/EncryptionConfigScreen/utils.ts:65
msgid ""
@@ -2965,9 +2962,8 @@ msgid "Profile"
msgstr "Perfil"
#: packages/app-desktop/gui/MainScreen/commands/addProfile.ts:17
#, fuzzy
msgid "Profile name:"
msgstr "Perfil"
msgstr "Nom del perfil:"
#: packages/lib/versionInfo.ts:26
msgid "Profile Version: %s"
@@ -3195,9 +3191,8 @@ msgstr "Desa l'alarma"
#: packages/app-desktop/gui/NoteEditor/utils/contextMenu.ts:100
#: packages/app-desktop/gui/NoteEditor/utils/contextMenu.ts:93
#, fuzzy
msgid "Save as %s"
msgstr "Anomena i desa..."
msgstr "Desa-ho com a %s"
#: packages/app-desktop/gui/NoteEditor/utils/contextMenu.ts:80
msgid "Save as..."
@@ -3565,9 +3560,8 @@ msgid "Switch between note and to-do type"
msgstr "Alterna entre el tipus nota i tasques pendents"
#: packages/app-desktop/gui/MenuBar.tsx:437
#, fuzzy
msgid "Switch profile"
msgstr "Exporta el perfil"
msgstr "Canvia el perfil"
#: packages/app-desktop/gui/utils/NoteListUtils.ts:105
msgid "Switch to note type"
@@ -3576,9 +3570,8 @@ msgstr "Canvia el tipus a nota"
#: packages/app-desktop/commands/switchProfile1.ts:7
#: packages/app-desktop/commands/switchProfile2.ts:7
#: packages/app-desktop/commands/switchProfile3.ts:7
#, fuzzy
msgid "Switch to profile %d"
msgstr "Canvia el tipus a nota"
msgstr "Canvia al perfil %d"
#: packages/app-desktop/gui/utils/NoteListUtils.ts:114
msgid "Switch to to-do type"
@@ -3677,7 +3670,7 @@ msgstr "Tabloide"
#: packages/app-mobile/components/screens/NoteTagsDialog.js:179
msgid "tag1, tag2, ..."
msgstr ""
msgstr "etiqueta1, etiqueta2, ..."
#: packages/app-cli/app/command-import.js:52
#: packages/app-desktop/gui/ImportScreen.min.js:73
@@ -3719,8 +3712,9 @@ msgstr ""
#: packages/app-desktop/app.ts:332
msgid ""
"The application did not close properly. Would you like to start in safe mode?"
msgstr ""
"The application did not close properly. Would you like to start in safe "
"mode?"
msgstr "L'aplicació no s'ha tancat correctament. Voleu iniciar en mode segur?"
#: packages/lib/onedrive-api-node-utils.js:86
msgid ""
@@ -4576,9 +4570,8 @@ msgid "Your data is going to be re-encrypted and synced again."
msgstr "Les vostres dades es tornaran a xifrar i sincronitzar."
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:271
#, fuzzy
msgid "Your password is needed to decrypt some of your data."
msgstr "La contrasenya mestra és necessària per a desxifrar algunes dades."
msgstr "Fa falta la contrasenya per a desxifrar part de les dades."
#: packages/app-cli/app/command-sync.ts:242
msgid ""

View File

@@ -7,6 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Türkçe\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"Last-Translator: Arda Kılıçdağı <arda@kilicdagi.com>\n"
"Language-Team: Turkish (Turkey)\n"
"Language: tr_TR\n"
@@ -14,7 +16,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 3.0.1\n"
"X-Generator: Poedit 3.1\n"
#: packages/app-mobile/components/screens/ConfigScreen.tsx:560
msgid "- Camera: to allow taking a picture and attaching it to a note."
@@ -298,9 +300,8 @@ msgstr ""
"Ayrıca ayarlanmamış ve gizlenmiş yapılandırma değişkenlerini de görüntüler."
#: packages/app-desktop/gui/ShareNoteDialog.tsx:203
#, fuzzy
msgid "Also publish linked notes"
msgstr "Notu paylaşmayı bırak"
msgstr "Ayrıca linklenmiş notları paylaş"
#: packages/lib/models/Setting.ts:713
msgid "Always"
@@ -402,7 +403,7 @@ msgstr "Otomatik"
#: packages/server/src/services/TaskService.ts:39
msgid "Auto-add disabled accounts for deletion"
msgstr ""
msgstr "Silmek için devre dışı bırakılmış hesapları otomatik olarak ekle"
#: packages/lib/models/Setting.ts:912
msgid "Auto-pair braces, parenthesis, quotations, etc."
@@ -715,7 +716,7 @@ msgstr "Tamamlandı: %s (%s)"
#: packages/server/src/services/TaskService.ts:37
msgid "Compress old changes"
msgstr ""
msgstr "Eski değişiklikleri sıkıştır"
#: packages/app-mobile/components/screens/ConfigScreen.tsx:632
#: packages/app-mobile/components/side-menu-content.js:332
@@ -867,18 +868,16 @@ msgstr ""
"ediliyor. Lütfen internet bağlantınız varken bu işlemi yeniden deneyin."
#: packages/app-desktop/gui/PromptDialog.min.js:235
#, fuzzy
msgid "Create"
msgstr "Oluşturuldu"
msgstr "Oluştur"
#: packages/app-mobile/components/note-list.js:101
msgid "Create a notebook"
msgstr "Yeni bir not defteri oluşturur"
#: packages/app-desktop/gui/MainScreen/commands/addProfile.ts:9
#, fuzzy
msgid "Create new profile..."
msgstr "Yeni bir not oluşturur."
msgstr "Yeni bir profil oluşturur..."
#: packages/app-desktop/gui/EditFolderDialog/Dialog.tsx:161
msgid "Create notebook"
@@ -1035,14 +1034,12 @@ msgid "Delete attachment \"%s\"?"
msgstr "\"%s\" eki silinsin mi?"
#: packages/server/src/services/TaskService.ts:36
#, fuzzy
msgid "Delete expired sessions"
msgstr "Matematik ifadelerini etkinleştir"
msgstr "Süresi geçmiş oturumları sil"
#: packages/server/src/services/TaskService.ts:31
#, fuzzy
msgid "Delete expired tokens"
msgstr "Bu %d not silinsin mi?"
msgstr "Süresi geçmiş jetonları sil"
#: packages/app-desktop/gui/NoteEditor/editorCommandDeclarations.ts:88
msgid "Delete line"
@@ -1325,7 +1322,7 @@ msgstr "Not defterini düzenle"
#: packages/app-desktop/commands/editProfileConfig.ts:9
msgid "Edit profile configuration..."
msgstr ""
msgstr "Profil ayarlarını düzenle…"
#: packages/app-desktop/gui/NoteContentPropertiesDialog.tsx:138
#: packages/lib/models/Setting.ts:876 packages/lib/models/Setting.ts:877
@@ -1355,9 +1352,8 @@ msgstr "Metin düzenleyici monospace (sabit genişlikteki) yazı tipi"
#: packages/app-desktop/gui/NoteEditor/editorCommandDeclarations.ts:100
#: packages/app-desktop/gui/NoteEditor/editorCommandDeclarations.ts:96
#, fuzzy
msgid "Editor: %s"
msgstr "Düzenleyici"
msgstr "Düzenleyici: %s"
#: packages/app-cli/app/command-ls.js:31
msgid "Either \"text\" or \"json\""
@@ -1370,12 +1366,12 @@ msgstr "Emacs"
#: packages/app-desktop/gui/SyncWizard/Dialog.tsx:236
#: packages/server/src/routes/admin/emails.ts:128
msgid "Email"
msgstr ""
msgstr "E-posta"
#: packages/server/src/routes/admin/emails.ts:112
#: packages/server/src/services/MustacheService.ts:127
msgid "Emails"
msgstr ""
msgstr "E-posta"
#: packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/CodeMirror.tsx:194
msgid "emphasised text"
@@ -1672,9 +1668,8 @@ msgid "File system"
msgstr "Dosya sistemi"
#: packages/app-mobile/components/screens/NoteTagsDialog.js:190
#, fuzzy
msgid "Filter tags"
msgstr "Yeni etiketler:"
msgstr "Etikerleri filtrele"
#: packages/app-desktop/gui/ExtensionBadge.min.js:10
msgid "Firefox Extension"
@@ -1872,7 +1867,7 @@ msgstr "TLS sertifikası hatalarını yoksay"
#: packages/app-desktop/gui/EditFolderDialog/Dialog.tsx:102
msgid "Images"
msgstr ""
msgstr "Resim"
#: packages/app-desktop/gui/KeymapConfig/KeymapConfigScreen.tsx:170
#: packages/app-desktop/gui/MenuBar.tsx:536
@@ -2201,7 +2196,7 @@ msgstr "Düzen butonu sıralaması"
#: packages/app-desktop/gui/MainScreen/commands/leaveSharedFolder.ts:10
msgid "Leave notebook..."
msgstr "Not defterinden ayrıl"
msgstr "Not defterinden ayrıl..."
#: packages/lib/models/Setting.ts:1307
msgid "Legal"
@@ -2739,9 +2734,8 @@ msgid "Or create an account."
msgstr "Ya da yeni bir hesap oluştur."
#: packages/app-desktop/gui/MenuBar.tsx:400
#, fuzzy
msgid "Other applications..."
msgstr "Uygulamadan çıkar."
msgstr "Diğer uygulamalar..."
#: packages/app-cli/app/command-import.js:27
msgid "Output format: %s"
@@ -2802,6 +2796,8 @@ msgid ""
"Please click on \"%s\" to proceed, or set the passwords in the \"%s\" list "
"below."
msgstr ""
"Devam etmek için lütfen \"%s\" butonuna basın, ya da aşağıdaki \"%s\" "
"listesinden parola belirleyin."
#: packages/lib/components/EncryptionConfigScreen/utils.ts:65
msgid ""
@@ -2945,25 +2941,23 @@ msgstr "Gizlilik Politikası"
#: packages/server/src/services/TaskService.ts:35
msgid "Process failed payment subscriptions"
msgstr ""
msgstr "Ödeme hatası almış abonelikleri işle"
#: packages/server/src/services/TaskService.ts:33
msgid "Process oversized accounts"
msgstr ""
msgstr "Fazla büyük, şişmiş hesapları işle"
#: packages/server/src/services/TaskService.ts:38
#, fuzzy
msgid "Process user deletions"
msgstr "Kullancı silmeleri"
msgstr "Kullancı silmelerini yönet"
#: packages/server/src/routes/admin/users.ts:168
msgid "Profile"
msgstr "Profil"
#: packages/app-desktop/gui/MainScreen/commands/addProfile.ts:17
#, fuzzy
msgid "Profile name:"
msgstr "Profil"
msgstr "Profil adı:"
#: packages/lib/versionInfo.ts:26
msgid "Profile Version: %s"
@@ -3191,9 +3185,8 @@ msgstr "Alarm kurun"
#: packages/app-desktop/gui/NoteEditor/utils/contextMenu.ts:100
#: packages/app-desktop/gui/NoteEditor/utils/contextMenu.ts:93
#, fuzzy
msgid "Save as %s"
msgstr "Farklı kaydet..."
msgstr "\"%s\" olarak farklı kaydet"
#: packages/app-desktop/gui/NoteEditor/utils/contextMenu.ts:80
msgid "Save as..."
@@ -3250,14 +3243,12 @@ msgid "Select all"
msgstr "Tümünü seç"
#: packages/app-desktop/gui/EditFolderDialog/Dialog.tsx:140
#, fuzzy
msgid "Select emoji..."
msgstr "Tarih seç"
msgstr "Emoji seç..."
#: packages/app-desktop/gui/EditFolderDialog/Dialog.tsx:144
#, fuzzy
msgid "Select file..."
msgstr "Tümünü seç"
msgstr "Dosya seç..."
#: packages/app-cli/app/command-server.js:38
msgid "Server is already running on port %d"
@@ -3565,9 +3556,8 @@ msgid "Switch between note and to-do type"
msgstr "Not ve yapılacaklar tipi arasında değişim yap"
#: packages/app-desktop/gui/MenuBar.tsx:437
#, fuzzy
msgid "Switch profile"
msgstr "Profili dışarı aktar"
msgstr "Profili değiştir"
#: packages/app-desktop/gui/utils/NoteListUtils.ts:105
msgid "Switch to note type"
@@ -3576,9 +3566,8 @@ msgstr "Not tipine dönüştür"
#: packages/app-desktop/commands/switchProfile1.ts:7
#: packages/app-desktop/commands/switchProfile2.ts:7
#: packages/app-desktop/commands/switchProfile3.ts:7
#, fuzzy
msgid "Switch to profile %d"
msgstr "Not tipine dönüştür"
msgstr "%d profiline geç"
#: packages/app-desktop/gui/utils/NoteListUtils.ts:114
msgid "Switch to to-do type"
@@ -3677,7 +3666,7 @@ msgstr "Tablo"
#: packages/app-mobile/components/screens/NoteTagsDialog.js:179
msgid "tag1, tag2, ..."
msgstr ""
msgstr "etiket1, etiket2, ..."
#: packages/app-cli/app/command-import.js:52
#: packages/app-desktop/gui/ImportScreen.min.js:73
@@ -3721,7 +3710,7 @@ msgstr ""
#: packages/app-desktop/app.ts:332
msgid ""
"The application did not close properly. Would you like to start in safe mode?"
msgstr ""
msgstr "Uygulama düzgün kapanmadı. Güvenli modda başlatmak ister misiniz?"
#: packages/lib/onedrive-api-node-utils.js:86
msgid ""
@@ -3889,7 +3878,7 @@ msgstr ""
msgid "The sync target needs to be upgraded. Press this banner to proceed."
msgstr ""
"Senkronizasyon hedefinin güncellenmesi gerekmekte. Devam etmek için bu "
"butona basın"
"butona basın."
#: packages/lib/models/Tag.ts:204
msgid "The tag \"%s\" already exists. Please choose a different name."
@@ -4105,7 +4094,7 @@ msgstr ""
#: packages/lib/components/EncryptionConfigScreen/utils.ts:54
msgid "To continue, please enter your master password below."
msgstr "Devam etmek için lütfen aşağıya ana parolanızı girin"
msgstr "Devam etmek için lütfen aşağıya ana parolanızı girin."
#: packages/app-cli/app/app-gui.js:452
msgid "To delete a tag, untag the associated notes."
@@ -4305,9 +4294,8 @@ msgid "Update profile"
msgstr "Profili güncelle"
#: packages/server/src/services/TaskService.ts:32
#, fuzzy
msgid "Update total sizes"
msgstr "Güncellenen yerel öğeler: %d."
msgstr "Toplam ebatı güncelle"
#: packages/app-desktop/gui/ConfigScreen/controls/plugins/PluginBox.tsx:208
#: packages/app-desktop/gui/ConfigScreen/controls/plugins/PluginBox.tsx:209
@@ -4571,10 +4559,9 @@ msgid "Your data is going to be re-encrypted and synced again."
msgstr "Veriniz yeniden şifrelenecek ve senkron edilecek."
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:271
#, fuzzy
msgid "Your password is needed to decrypt some of your data."
msgstr ""
"Verilerinizin bir kısmının şifrelemesinin çözülmesi için ana parolanız "
"Verilerinizin bir kısmının şifrelemesinin çözülmesi için parolanız "
"gerekmektedir."
#: packages/app-cli/app/command-sync.ts:242

View File

@@ -118,7 +118,7 @@ async function checkSourceZip(sourceZip, compiledZip) {
console.info(await execCommand(`cp "${sourceZip}" .`));
console.info(await execCommand(`unzip "${sourceZip}"`));
process.chdir(`${sourceDir}/Clipper-source/popup`);
console.info(await execCommand('yarn install'));
console.info(await execCommand('npm install'));
process.chdir(compiledDir);
console.info(await execCommand(`cp "${compiledZip}" .`));
@@ -143,7 +143,7 @@ async function main() {
// installed by CRA and 6.1.0 by us. It doesn't affect anything though, and the behaviour of the preflight
// check is buggy so we can ignore it.
console.info(await execCommand(`rm -rf ${clipperDir}/popup/build`));
console.info(await execCommand('yarn run build'));
console.info(await execCommand('npm run build'));
const dists = {
chrome: {

View File

@@ -48,7 +48,7 @@ yarn run updateNews $DISCOURSE_API_KEY $DISCOURSE_USERNAME
git add -A
git commit -m "Doc: Updated Markdown files
git commit -m "Doc: Auto-update documentation
Auto-updated using $SCRIPT_NAME" || true

View File

@@ -1,6 +1,6 @@
# Joplin changelog
## [v2.8.8](https://github.com/laurent22/joplin/releases/tag/v2.8.8) (Pre-release) - 2022-05-17T14:48:06Z
## [v2.8.8](https://github.com/laurent22/joplin/releases/tag/v2.8.8) - 2022-05-17T14:48:06Z
- Improved: Remove plugin backoff handler for now ([7ec3a7b](https://github.com/laurent22/joplin/commit/7ec3a7b))
- Fixed: Dropbox login button is not visible in dark mode ([#6513](https://github.com/laurent22/joplin/issues/6513)) ([#6503](https://github.com/laurent22/joplin/issues/6503) by [@Retrove](https://github.com/Retrove))

View File

@@ -10,7 +10,7 @@ Your download of <span class="downloaded-filename">Joplin</span> is in progress.
Access your notes on Windows, macOS or Linux.
<!-- DESKTOP-DOWNLOAD-LINKS --><a href='https://github.com/laurent22/joplin/releases/download/v2.7.15/Joplin-Setup-2.7.15.exe'><img alt='Get it on Windows' width="134px" src='https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/BadgeWindows.png'/></a> <a href='https://github.com/laurent22/joplin/releases/download/v2.7.15/Joplin-2.7.15.dmg'><img alt='Get it on macOS' width="134px" src='https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/BadgeMacOS.png'/></a> <a href='https://github.com/laurent22/joplin/releases/download/v2.7.15/Joplin-2.7.15.AppImage'><img alt='Get it on Linux' width="134px" src='https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/BadgeLinux.png'/></a><!-- DESKTOP-DOWNLOAD-LINKS -->
<!-- DESKTOP-DOWNLOAD-LINKS --><a href='https://github.com/laurent22/joplin/releases/download/v2.8.8/Joplin-Setup-2.8.8.exe'><img alt='Get it on Windows' width="134px" src='https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/BadgeWindows.png'/></a> <a href='https://github.com/laurent22/joplin/releases/download/v2.8.8/Joplin-2.8.8.dmg'><img alt='Get it on macOS' width="134px" src='https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/BadgeMacOS.png'/></a> <a href='https://github.com/laurent22/joplin/releases/download/v2.8.8/Joplin-2.8.8.AppImage'><img alt='Get it on Linux' width="134px" src='https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/BadgeLinux.png'/></a><!-- DESKTOP-DOWNLOAD-LINKS -->
</div>

View File

@@ -1,3 +1,7 @@
---
forum_url: https://discourse.joplinapp.org/t/25943
---
# Joplin 2.8 is available!
As always a lot of changes and new features in this new version available on both desktop and mobile.

293
yarn.lock
View File

@@ -2638,9 +2638,9 @@ __metadata:
languageName: node
linkType: hard
"@electron/get@npm:^1.0.1":
version: 1.13.1
resolution: "@electron/get@npm:1.13.1"
"@electron/get@npm:^1.13.0":
version: 1.14.1
resolution: "@electron/get@npm:1.14.1"
dependencies:
debug: ^4.1.1
env-paths: ^2.2.0
@@ -2656,7 +2656,7 @@ __metadata:
optional: true
global-tunnel-ng:
optional: true
checksum: ea9863b73e8aedefb19cfe9b849c585b8bda29e11b90189b115680da4e9ab0167405efe63e5d141da2d13cde24eacacfde62f730f2730d047e58819fe69352f8
checksum: 21fec5e82bbee8f9fa183b46e05675b137c3130c7999d3b2b34a0047d1a06ec3c76347b9bbdb9911ba9b2123697804e360a15dda9db614c0226d5d4dcc4d6d15
languageName: node
linkType: hard
@@ -2669,16 +2669,18 @@ __metadata:
languageName: node
linkType: hard
"@electron/universal@npm:1.0.5":
version: 1.0.5
resolution: "@electron/universal@npm:1.0.5"
"@electron/universal@npm:1.2.1":
version: 1.2.1
resolution: "@electron/universal@npm:1.2.1"
dependencies:
"@malept/cross-spawn-promise": ^1.1.0
asar: ^3.0.3
asar: ^3.1.0
debug: ^4.3.1
dir-compare: ^2.4.0
fs-extra: ^9.0.1
checksum: 64eae3bbbfa422f28dbc1e92d12d954059cec7dac9ecc3ecad2c7895bb6cd10d30e8b3848092bfba8815bc71b60393a42f792751e50b9b5f643d6f1d03826b86
minimatch: ^3.0.4
plist: ^3.0.4
checksum: 9a7d98cf2b8414ff0274384fef1b72b5a545a0feb7ce03163d2e2ee1b13e4f7064dfe7147cdd652708a1314d1b5e68acdd907847a1747866ec8d2d3e757ec1f7
languageName: node
linkType: hard
@@ -3257,10 +3259,10 @@ __metadata:
compare-versions: ^3.2.1
countable: ^3.0.1
debounce: ^1.2.0
electron: 14.1.0
electron-builder: ^22.11.7
electron-notarize: ^1.0.0
electron-rebuild: ^3.2.3
electron: 18.2.0
electron-builder: ^23.0.3
electron-notarize: ^1.2.1
electron-rebuild: ^3.2.7
electron-window-state: ^4.1.1
formatcoords: ^1.1.3
fs-extra: 10.0.0
@@ -3296,6 +3298,7 @@ __metadata:
styled-components: 5.1.1
styled-system: 5.1.5
taboverride: ^4.0.3
tabulator-tables: ^5.1.4
tinymce: ^5.2.0
typescript: 4.0.5
dependenciesMeta:
@@ -5815,13 +5818,20 @@ __metadata:
languageName: node
linkType: hard
"@types/node@npm:^14.14.6, @types/node@npm:^14.6.2":
"@types/node@npm:^14.14.6":
version: 14.18.0
resolution: "@types/node@npm:14.18.0"
checksum: b120c26fe5f30bc358e861db8d7e401e419d14bd9dd25c022f3c2ea8b0b429d4c9efd77ad5d6d2a8bde61702a6786fb74d409f1b2cbb61c79133e2a65aab4fb1
languageName: node
linkType: hard
"@types/node@npm:^16.11.26":
version: 16.11.33
resolution: "@types/node@npm:16.11.33"
checksum: 5c86d3f1e3b996607b41405d368d2e19d410eee0054595cef73d230368a609a2863926e75ad19f5091f0fd742cd018b667d54c51292018dd8020a202a5b29fa9
languageName: node
linkType: hard
"@types/nodemailer@npm:^6.4.1":
version: 6.4.4
resolution: "@types/nodemailer@npm:6.4.4"
@@ -6944,10 +6954,10 @@ __metadata:
languageName: node
linkType: hard
"app-builder-bin@npm:3.7.1":
version: 3.7.1
resolution: "app-builder-bin@npm:3.7.1"
checksum: aae6152d7e7e6eabe35e5430f8b4733cc713bd3f80fdb861c5b675ebc8951aa26b520821d27c5ee31f05e850cdfd9b923b58064307f1ae583fb4e7434d380209
"app-builder-bin@npm:4.0.0":
version: 4.0.0
resolution: "app-builder-bin@npm:4.0.0"
checksum: c3c8fd85c371b7a396c1bb1160ab2e3231ba4309abea5b36a5b366e42511e347c65a33ff50d56f4960b337833d539c263137b0ba131e2fa268c32edeb6c9f683
languageName: node
linkType: hard
@@ -6958,36 +6968,37 @@ __metadata:
languageName: node
linkType: hard
"app-builder-lib@npm:22.14.10":
version: 22.14.10
resolution: "app-builder-lib@npm:22.14.10"
"app-builder-lib@npm:23.0.8":
version: 23.0.8
resolution: "app-builder-lib@npm:23.0.8"
dependencies:
7zip-bin: ~5.1.1
"@develar/schema-utils": ~2.6.5
"@electron/universal": 1.0.5
"@electron/universal": 1.2.1
"@malept/flatpak-bundler": ^0.4.0
async-exit-hook: ^2.0.1
bluebird-lst: ^1.0.9
builder-util: 22.14.7
builder-util-runtime: 8.9.2
builder-util: 23.0.8
builder-util-runtime: 9.0.2
chromium-pickle-js: ^0.2.0
debug: ^4.3.2
ejs: ^3.1.6
electron-osx-sign: ^0.5.0
electron-publish: 22.14.7
debug: ^4.3.4
ejs: ^3.1.7
electron-osx-sign: ^0.6.0
electron-publish: 23.0.8
form-data: ^4.0.0
fs-extra: ^10.0.0
hosted-git-info: ^4.0.2
fs-extra: ^10.1.0
hosted-git-info: ^4.1.0
is-ci: ^3.0.0
isbinaryfile: ^4.0.8
isbinaryfile: ^4.0.10
js-yaml: ^4.1.0
lazy-val: ^1.0.5
minimatch: ^3.0.4
minimatch: ^3.1.2
read-config-file: 6.2.0
sanitize-filename: ^1.6.3
semver: ^7.3.5
semver: ^7.3.7
tar: ^6.1.11
temp-file: ^3.4.0
checksum: 8e5021dab87b78cc52188cba15cb19bb28abf39e4d80c6c8f2fc0df69938d1a379b4c27d7229921d83a9c87f136115b7e8d8cd91676ed9711704c68533c85153
checksum: c1f72f86ffa0f69ef91e43ba9792e0b3f90d844ac620dbc64a320e067a172b8b55b276fe3d2174e177ee347fe4cba9bfc12e830792be91893f414bea7fead6a7
languageName: node
linkType: hard
@@ -7369,7 +7380,7 @@ __metadata:
languageName: node
linkType: hard
"asar@npm:^3.0.3":
"asar@npm:^3.1.0":
version: 3.1.0
resolution: "asar@npm:3.1.0"
dependencies:
@@ -7553,6 +7564,13 @@ __metadata:
languageName: node
linkType: hard
"async@npm:^3.2.3":
version: 3.2.3
resolution: "async@npm:3.2.3"
checksum: c4bee57ab2249af3dc83ca3ef9acfa8e822c0d5e5aa41bae3eaf7f673648343cd64ecd7d26091ffd357f3f044428b17b5f00098494b6cf8b6b3e9681f0636ca1
languageName: node
linkType: hard
"asynckit@npm:^0.4.0":
version: 0.4.0
resolution: "asynckit@npm:0.4.0"
@@ -8761,29 +8779,29 @@ __metadata:
languageName: node
linkType: hard
"builder-util-runtime@npm:8.9.2":
version: 8.9.2
resolution: "builder-util-runtime@npm:8.9.2"
"builder-util-runtime@npm:9.0.2":
version: 9.0.2
resolution: "builder-util-runtime@npm:9.0.2"
dependencies:
debug: ^4.3.2
debug: ^4.3.4
sax: ^1.2.4
checksum: 35adcd6162e2ed16635ff7b7ecc353e400dcbbb3e7cd01823bfefc7256cefca8c820f62d15a0f7dbee1c7495a5f1fba4e0e238857a79b48d5f6bd35064f27208
checksum: 867768865f55ed0f326f542fd0cfb10bb3619a952ef691bf9896b5dc84271639d177cf8c1ec28aba36d467743ba77886573c6c8bb7af90740e7ea18f81ef5daf
languageName: node
linkType: hard
"builder-util@npm:22.14.7":
version: 22.14.7
resolution: "builder-util@npm:22.14.7"
"builder-util@npm:23.0.8":
version: 23.0.8
resolution: "builder-util@npm:23.0.8"
dependencies:
7zip-bin: ~5.1.1
"@types/debug": ^4.1.6
"@types/fs-extra": ^9.0.11
app-builder-bin: 3.7.1
app-builder-bin: 4.0.0
bluebird-lst: ^1.0.9
builder-util-runtime: 8.9.2
builder-util-runtime: 9.0.2
chalk: ^4.1.1
cross-spawn: ^7.0.3
debug: ^4.3.2
debug: ^4.3.4
fs-extra: ^10.0.0
http-proxy-agent: ^5.0.0
https-proxy-agent: ^5.0.0
@@ -8792,7 +8810,7 @@ __metadata:
source-map-support: ^0.5.19
stat-mode: ^1.0.0
temp-file: ^3.4.0
checksum: 4f850a8d1bbf12823b6ca712aeaf99474a4799107b92f3aad64910935fe5b01ca1c6cc29e0c2344a03249ba88f654be3bd6775c2ef634977de44510dd36bb37d
checksum: 926c09a3962f56aad5483be1258c49ed4935c90ec4ea7c342e5998fbb5652cbee0e18a047e0c644786a63c9b4cecfa6de1e64b1c49fb2961109c892c11941b0e
languageName: node
linkType: hard
@@ -9252,7 +9270,7 @@ __metadata:
languageName: node
linkType: hard
"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2":
"chalk@npm:^4.0.0, chalk@npm:^4.0.2, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2":
version: 4.1.2
resolution: "chalk@npm:4.1.2"
dependencies:
@@ -9873,7 +9891,7 @@ __metadata:
languageName: node
linkType: hard
"colors@npm:^1.1.2, colors@npm:^1.3.3, colors@npm:^1.4.0":
"colors@npm:^1.1.2, colors@npm:^1.4.0":
version: 1.4.0
resolution: "colors@npm:1.4.0"
checksum: 98aa2c2418ad87dedf25d781be69dc5fc5908e279d9d30c34d8b702e586a0474605b3a189511482b9d5ed0d20c867515d22749537f7bc546256c6014f3ebdcec
@@ -11695,7 +11713,7 @@ __metadata:
languageName: node
linkType: hard
"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.0.1, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2":
"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.0.1, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1":
version: 4.3.3
resolution: "debug@npm:4.3.3"
dependencies:
@@ -11740,6 +11758,18 @@ __metadata:
languageName: node
linkType: hard
"debug@npm:^4.3.4":
version: 4.3.4
resolution: "debug@npm:4.3.4"
dependencies:
ms: 2.1.2
peerDependenciesMeta:
supports-color:
optional: true
checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708
languageName: node
linkType: hard
"debuglog@npm:^1.0.1":
version: 1.0.1
resolution: "debuglog@npm:1.0.1"
@@ -12380,27 +12410,27 @@ __metadata:
languageName: node
linkType: hard
"dmg-builder@npm:22.14.10":
version: 22.14.10
resolution: "dmg-builder@npm:22.14.10"
"dmg-builder@npm:23.0.8":
version: 23.0.8
resolution: "dmg-builder@npm:23.0.8"
dependencies:
app-builder-lib: 22.14.10
builder-util: 22.14.7
builder-util-runtime: 8.9.2
dmg-license: ^1.0.9
app-builder-lib: 23.0.8
builder-util: 23.0.8
builder-util-runtime: 9.0.2
dmg-license: ^1.0.11
fs-extra: ^10.0.0
iconv-lite: ^0.6.2
js-yaml: ^4.1.0
dependenciesMeta:
dmg-license:
optional: true
checksum: f48280f7a14791d94378f8d9b00f19705cafb3d26d1a86a6c2fd698f2ad25cb887b4f437f883f5df62406754bdcdf1203e7199baaf8ae606d7b570c285fbfb2d
checksum: 8a36e199e1739cc9b3a242136e6ffb6cd7971417c2a14866097b4b348fab0ae5b96509ca946bb5e22e1359590d7c7b93b7cbff0997cbd1c3a6c8cc5bec1d17a6
languageName: node
linkType: hard
"dmg-license@npm:^1.0.9":
version: 1.0.10
resolution: "dmg-license@npm:1.0.10"
"dmg-license@npm:^1.0.11":
version: 1.0.11
resolution: "dmg-license@npm:1.0.11"
dependencies:
"@types/plist": ^3.0.1
"@types/verror": ^1.10.3
@@ -12737,7 +12767,7 @@ __metadata:
languageName: node
linkType: hard
"ejs@npm:^3.1.5, ejs@npm:^3.1.6":
"ejs@npm:^3.1.5":
version: 3.1.6
resolution: "ejs@npm:3.1.6"
dependencies:
@@ -12748,16 +12778,27 @@ __metadata:
languageName: node
linkType: hard
"electron-builder@npm:^22.11.7":
version: 22.14.10
resolution: "electron-builder@npm:22.14.10"
"ejs@npm:^3.1.7":
version: 3.1.7
resolution: "ejs@npm:3.1.7"
dependencies:
jake: ^10.8.5
bin:
ejs: bin/cli.js
checksum: fe40764af39955ce8f8b116716fc8b911959946698edb49ecab85df597746c07aa65d5b74ead28a1e2ffa75b0f92d9bedd752f1c29437da6137b3518271e988c
languageName: node
linkType: hard
"electron-builder@npm:^23.0.3":
version: 23.0.8
resolution: "electron-builder@npm:23.0.8"
dependencies:
"@types/yargs": ^17.0.1
app-builder-lib: 22.14.10
builder-util: 22.14.7
builder-util-runtime: 8.9.2
app-builder-lib: 23.0.8
builder-util: 23.0.8
builder-util-runtime: 9.0.2
chalk: ^4.1.1
dmg-builder: 22.14.10
dmg-builder: 23.0.8
fs-extra: ^10.0.0
is-ci: ^3.0.0
lazy-val: ^1.0.5
@@ -12767,23 +12808,23 @@ __metadata:
bin:
electron-builder: cli.js
install-app-deps: install-app-deps.js
checksum: 353cbeb2e5f1d670d7315b2ba4b1ada5c03b553641fb4ce0c06c3e7443ca037536bdbf07c18951b8a899ff7c59b5ebcc6cbdad9e9789f6eddef2703b8b1d83ad
checksum: 56da948ce639b3a24b7a746bb9598bcabffb948d0494cc410b927d5e623a6b16e3ea1a9ef567b4c8a3f121b44e90200defde2289e8ef7f5942e0946a43e9ffae
languageName: node
linkType: hard
"electron-notarize@npm:^1.0.0":
version: 1.1.1
resolution: "electron-notarize@npm:1.1.1"
"electron-notarize@npm:^1.2.1":
version: 1.2.1
resolution: "electron-notarize@npm:1.2.1"
dependencies:
debug: ^4.1.1
fs-extra: ^9.0.1
checksum: c1f822761277c817c3b7b5ed1ef2a2aabf70733f79e670b2f0b5bac31b9d63fb9ef4d9fae2051192727d811c6b6007de846e39844ab51d13986c1771d5d04d28
checksum: d109136a855b31020cb833a51dcf5a3aa6c0ee5b95ca8f6aa5d6296a299aa8fe46bb15cc2fa9189ab97da8c4402c675af7c592c46d7940f0e2662c59a9e499fd
languageName: node
linkType: hard
"electron-osx-sign@npm:^0.5.0":
version: 0.5.0
resolution: "electron-osx-sign@npm:0.5.0"
"electron-osx-sign@npm:^0.6.0":
version: 0.6.0
resolution: "electron-osx-sign@npm:0.6.0"
dependencies:
bluebird: ^3.5.0
compare-version: ^0.1.2
@@ -12794,36 +12835,36 @@ __metadata:
bin:
electron-osx-flat: bin/electron-osx-flat.js
electron-osx-sign: bin/electron-osx-sign.js
checksum: ca1e55d8cb0987b78bfaf197860e73f7e6266cb219f3d6fd32f25665a8393efb284115db9e2246b42f75cdf6163c148060aff8a02960f4f810c6502d6f7d447c
checksum: b688f9efb013670b4226cff7c38101e7b1384ea44e1ab203259995f1eefc019c63aa18e936217a76d33b5a5a452b987ab3d86a56a961294582ce42acbb950de6
languageName: node
linkType: hard
"electron-publish@npm:22.14.7":
version: 22.14.7
resolution: "electron-publish@npm:22.14.7"
"electron-publish@npm:23.0.8":
version: 23.0.8
resolution: "electron-publish@npm:23.0.8"
dependencies:
"@types/fs-extra": ^9.0.11
builder-util: 22.14.7
builder-util-runtime: 8.9.2
builder-util: 23.0.8
builder-util-runtime: 9.0.2
chalk: ^4.1.1
fs-extra: ^10.0.0
lazy-val: ^1.0.5
mime: ^2.5.2
checksum: a1584c23dc34e4c19f0a7418706715b0e39caf6516195cd6426bdbf432164a4af5993851b7c0a4eda72883ba0b24ab711483772fa85fc97b88de93d817c90f0c
checksum: 511ea2a71aa48e6990c2fb8b38684c31e7026f6dd82eebeacf9822e13160474382a91233a280e92e160717f250ebcc81be92f61b92bb231d815d99e52300ba16
languageName: node
linkType: hard
"electron-rebuild@npm:^3.2.3":
version: 3.2.5
resolution: "electron-rebuild@npm:3.2.5"
"electron-rebuild@npm:^3.2.7":
version: 3.2.7
resolution: "electron-rebuild@npm:3.2.7"
dependencies:
"@malept/cross-spawn-promise": ^2.0.0
colors: ^1.3.3
chalk: ^4.0.0
debug: ^4.1.1
detect-libc: ^1.0.3
fs-extra: ^10.0.0
got: ^11.7.0
lzma-native: ^8.0.1
lzma-native: ^8.0.5
node-abi: ^3.0.0
node-api-version: ^0.1.4
node-gyp: ^8.4.0
@@ -12833,7 +12874,7 @@ __metadata:
yargs: ^17.0.1
bin:
electron-rebuild: lib/src/cli.js
checksum: 544ec1f1297c88166a1bcb34173f8144f7de147c10be62cbb3e4503cfe67cd562870c0d8713257a5b6433e0ac5f97d465621c85c92dce3378d597db0dff244ed
checksum: cb466366910d020c4e6d36a42f87dfd616e5dbf4c2636244575873400be2ec2b76ab916c73f441fdcf90baa17afec8cb45a4ff42c7e0291aa0b7a7fca91d5ad2
languageName: node
linkType: hard
@@ -12862,16 +12903,16 @@ __metadata:
languageName: node
linkType: hard
"electron@npm:14.1.0":
version: 14.1.0
resolution: "electron@npm:14.1.0"
"electron@npm:18.2.0":
version: 18.2.0
resolution: "electron@npm:18.2.0"
dependencies:
"@electron/get": ^1.0.1
"@types/node": ^14.6.2
"@electron/get": ^1.13.0
"@types/node": ^16.11.26
extract-zip: ^1.0.3
bin:
electron: cli.js
checksum: 8b17f8cabba2b6842e71e11a8889f366712f32219d35c49f093d69939ff78c22b0e0870ec1a4ab851270015e43f00f9d759b0283998fd2d3065c8c20eca8b597
checksum: 242169d6e22854248e427326a03910b96311333d5dd57aa0e4cd9cef733aa8c2e893b16269c32514ad325468cdc08c41736d6f1f6791770cad236652fe06662c
languageName: node
linkType: hard
@@ -16601,7 +16642,7 @@ __metadata:
languageName: node
linkType: hard
"hosted-git-info@npm:^4.0.1, hosted-git-info@npm:^4.0.2":
"hosted-git-info@npm:^4.0.1":
version: 4.0.2
resolution: "hosted-git-info@npm:4.0.2"
dependencies:
@@ -16610,6 +16651,15 @@ __metadata:
languageName: node
linkType: hard
"hosted-git-info@npm:^4.1.0":
version: 4.1.0
resolution: "hosted-git-info@npm:4.1.0"
dependencies:
lru-cache: ^6.0.0
checksum: c3f87b3c2f7eb8c2748c8f49c0c2517c9a95f35d26f4bf54b2a8cba05d2e668f3753548b6ea366b18ec8dadb4e12066e19fa382a01496b0ffa0497eb23cbe461
languageName: node
linkType: hard
"html-encoding-sniffer@npm:^1.0.2":
version: 1.0.2
resolution: "html-encoding-sniffer@npm:1.0.2"
@@ -18280,13 +18330,20 @@ __metadata:
languageName: node
linkType: hard
"isbinaryfile@npm:^4.0.0, isbinaryfile@npm:^4.0.8":
"isbinaryfile@npm:^4.0.0":
version: 4.0.8
resolution: "isbinaryfile@npm:4.0.8"
checksum: 606e3bb648d1a0dee23459d1d937bb2560e66a5281ec7c9ff50e585402d73321ac268d0f34cb7393125b3ebc4c7962d39e50a01cdb8904b52fce08b7ccd2bf9f
languageName: node
linkType: hard
"isbinaryfile@npm:^4.0.10":
version: 4.0.10
resolution: "isbinaryfile@npm:4.0.10"
checksum: a6b28db7e23ac7a77d3707567cac81356ea18bd602a4f21f424f862a31d0e7ab4f250759c98a559ece35ffe4d99f0d339f1ab884ffa9795172f632ab8f88e686
languageName: node
linkType: hard
"isexe@npm:^2.0.0":
version: 2.0.0
resolution: "isexe@npm:2.0.0"
@@ -18491,6 +18548,20 @@ __metadata:
languageName: node
linkType: hard
"jake@npm:^10.8.5":
version: 10.8.5
resolution: "jake@npm:10.8.5"
dependencies:
async: ^3.2.3
chalk: ^4.0.2
filelist: ^1.0.1
minimatch: ^3.0.4
bin:
jake: ./bin/cli.js
checksum: 56c913ecf5a8d74325d0af9bc17a233bad50977438d44864d925bb6c45c946e0fee8c4c1f5fe2225471ef40df5222e943047982717ebff0d624770564d3c46ba
languageName: node
linkType: hard
"jest-changed-files@npm:^26.6.2":
version: 26.6.2
resolution: "jest-changed-files@npm:26.6.2"
@@ -20586,9 +20657,9 @@ __metadata:
languageName: node
linkType: hard
"lzma-native@npm:^8.0.1":
version: 8.0.1
resolution: "lzma-native@npm:8.0.1"
"lzma-native@npm:^8.0.5":
version: 8.0.6
resolution: "lzma-native@npm:8.0.6"
dependencies:
node-addon-api: ^3.1.0
node-gyp: latest
@@ -20596,7 +20667,7 @@ __metadata:
readable-stream: ^3.6.0
bin:
lzmajs: bin/lzmajs
checksum: abf2c527101060ab450d49c28693226ab175aeb2b56d976fb4ce49985ddba1e8251bd0e5af13fa225dac80faa805b71f0bba984c0ac1f7db5fbbc65e9f8d7b62
checksum: cbe782fd53309163a9362d0b5a960051936268a891779d26fdfe42085ce7fa309dc96e91414fe64ddd2bde2e2c25fc18e1d89aa6a2691557dd89b6582840a979
languageName: node
linkType: hard
@@ -21771,6 +21842,15 @@ __metadata:
languageName: node
linkType: hard
"minimatch@npm:^3.1.2":
version: 3.1.2
resolution: "minimatch@npm:3.1.2"
dependencies:
brace-expansion: ^1.1.7
checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a
languageName: node
linkType: hard
"minimatch@npm:^5.0.1":
version: 5.0.1
resolution: "minimatch@npm:5.0.1"
@@ -29017,6 +29097,13 @@ __metadata:
languageName: node
linkType: hard
"tabulator-tables@npm:^5.1.4":
version: 5.1.4
resolution: "tabulator-tables@npm:5.1.4"
checksum: f77f9e975502253ec945d66d5d2f1fb615743824a05c6e8b67013c8f53976edb3c734ef1286c24253d85dd3990e596e3f04ecc1fbd0682541b5ed1a5a6c0d762
languageName: node
linkType: hard
"taketalk@npm:^1.0.0":
version: 1.0.0
resolution: "taketalk@npm:1.0.0"
@@ -29184,7 +29271,7 @@ __metadata:
languageName: node
linkType: hard
"tar@npm:^6.0.2, tar@npm:^6.0.5, tar@npm:^6.1.2":
"tar@npm:^6.0.2, tar@npm:^6.0.5, tar@npm:^6.1.11, tar@npm:^6.1.2":
version: 6.1.11
resolution: "tar@npm:6.1.11"
dependencies: