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

Compare commits

...

25 Commits

Author SHA1 Message Date
Laurent Cozic
f25db9bbd7 Android 3.4.7 2025-09-09 09:14:11 +01:00
Laurent Cozic
44ac261304 Desktop release v3.4.11 2025-09-09 09:05:11 +01:00
Henry Heino
3a9f57e13f Cli: Fixes #13086: Fix "use" command when not in TUI mode (#13091) 2025-09-08 10:56:08 +01:00
Henry Heino
b72c48c693 Mobile, Desktop: Fixes #13103: Fix error when saving in-editor rendering-related settings (#13105) 2025-09-08 10:56:01 +01:00
Henry Heino
f1e42f3bac iOS: Fixes #13111: Fix "scan notebook" tool on iOS (#13114) 2025-09-08 10:55:48 +01:00
Henry Heino
93c908286d Mobile: Plugins: Fix renderer plugins that use the settingValue API (#13131) 2025-09-08 10:55:42 +01:00
Henry Heino
4eb8777ed0 Mobile: Fix light bar shown above header in dark mode (#13132) 2025-09-08 10:55:15 +01:00
Laurent Cozic
e884da8312 Android 3.4.6 2025-09-01 14:48:38 +02:00
Laurent Cozic
85585d16d2 Desktop release v3.4.10 2025-09-01 13:50:43 +02:00
Henry Heino
6482ab5a4e Mobile: Plugin API: Fix compatibility with certain plugins targetting the desktop app (#13077) 2025-08-29 23:28:45 +02:00
Henry Heino
ec74abe754 Mobile: Plugin API: Fix certain renderer plugins fail to load (#13078) 2025-08-29 23:28:39 +02:00
Henry Heino
859bc8d88e Mobile: Plugins: Fix plugin panel buttons are offscreen on recent versions of Android (#13080) 2025-08-29 23:28:22 +02:00
Henry Heino
3e9bb914e5 Android: Fixes #13015: Fix "edit profile" button is partially offscreen (#13084) 2025-08-29 23:27:51 +02:00
Henry Heino
f75e911a4e Docs: Update the privacy policy (#13087) 2025-08-29 23:27:44 +02:00
Henry Heino
6390ef43ed Desktop: Clarify handwritten text transcription setting (#13073)
Co-authored-by: Laurent Cozic <laurent22@users.noreply.github.com>
2025-08-28 09:20:55 +03:00
Henry Heino
0d1d50768b Android: Fix shadow shown above the screen header (#13074) 2025-08-28 09:04:10 +03:00
Laurent Cozic
cba5cf660b Desktop release v3.4.9 2025-08-27 22:09:47 +03:00
Laurent Cozic
0024722c79 Desktop: Clarified that handwritten transcription may not always work 2025-08-27 22:09:26 +03:00
Henry Heino
b179509dd3 Desktop: Fixes #12855: Legacy editor: Fix plugin support (#13066) 2025-08-27 22:02:09 +03:00
Laurent Cozic
ac289c5198 Desktop: Clarified that handwritten transcription may not always work 2025-08-27 17:22:06 +03:00
Laurent Cozic
62faa48aac lock files 2025-08-27 10:15:15 +03:00
Laurent Cozic
5daa7a1f4c Chore: By default, create new releases as pre-releases when publishing desktop app 2025-08-27 09:54:06 +03:00
Laurent Cozic
32be071601 CLI v3.4.1 2025-08-27 09:50:10 +03:00
Laurent Cozic
0dc63dd306 Lock file 2025-08-27 09:47:17 +03:00
Laurent Cozic
78ed58187a Releasing sub-packages 2025-08-27 09:46:45 +03:00
37 changed files with 271 additions and 141 deletions

View File

@@ -417,8 +417,10 @@ class Application extends BaseApplication {
if (argv.length) {
this.gui_ = this.dummyGui();
const initialFolder = await Folder.load(Setting.value('activeFolderId'));
await this.switchCurrentFolder(initialFolder);
await this.applySettingsSideEffects();
await this.refreshCurrentFolder();
try {
await this.execCommand(argv);
} catch (error) {

View File

@@ -35,7 +35,7 @@
],
"owner": "Laurent Cozic"
},
"version": "3.4.0",
"version": "3.4.1",
"bin": "./main.js",
"engines": {
"node": ">=10.0.0"

View File

@@ -67,6 +67,11 @@ import 'codemirror/mode/diff/diff';
import 'codemirror/mode/erlang/erlang';
import 'codemirror/mode/sql/sql';
interface ExtendedWindow {
CodeMirror?: unknown;
}
declare const window: ExtendedWindow;
export interface EditorProps {
value: string;
@@ -100,6 +105,14 @@ function Editor(props: EditorProps, ref: any) {
const editorParent = useRef(null);
const lastEditTime = useRef(NaN);
useEffect(() => {
window.CodeMirror = CodeMirror;
return () => {
window.CodeMirror = undefined;
};
}, []);
// Codemirror plugins add new commands to codemirror (or change it's behavior)
// This command adds the smartListIndent function which will be bound to tab
useListIdent(CodeMirror);

View File

@@ -1,5 +1,6 @@
import { useEffect, useState } from 'react';
import { PluginStates } from '@joplin/lib/services/plugins/reducer';
import bridge from '../../../../../../services/bridge';
import { contentScriptsToCodeMirrorPlugin } from '@joplin/lib/services/plugins/utils/loadContentScripts';
import { extname } from 'path';
import shim from '@joplin/lib/shim';
@@ -7,6 +8,18 @@ import uuid from '@joplin/lib/uuid';
import { reg } from '@joplin/lib/registry';
const addPluginDependency = (path: string) => {
const id = `content-script-${encodeURIComponent(path)}`;
if (document.getElementById(id)) {
return;
}
const element = document.createElement('script');
element.setAttribute('id', id);
element.setAttribute('src', path);
document.head.appendChild(element);
};
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
export default function useExternalPlugins(CodeMirror: any, plugins: PluginStates) {
const [options, setOptions] = useState({});
@@ -23,7 +36,14 @@ export default function useExternalPlugins(CodeMirror: any, plugins: PluginState
if (mod.codeMirrorResources) {
for (const asset of mod.codeMirrorResources) {
try {
require(`codemirror/${asset}`);
let assetPath = shim.fsDriver().resolveRelativePathWithinDir(`${bridge().vendorDir()}/lib/codemirror/`, asset);
// Compatibility with old versions of Joplin, where the file extension was automatically added by require().
if (extname(assetPath) === '') {
assetPath += '.js';
}
addPluginDependency(assetPath);
} catch (error) {
error.message = `${asset} is not a valid CodeMirror asset, keymap or mode. You can find a list of valid assets here: https://codemirror.net/doc/manual.html#addons`;
throw error;

View File

@@ -1,6 +1,6 @@
{
"name": "@joplin/app-desktop",
"version": "3.4.8",
"version": "3.4.11",
"description": "Joplin for Desktop",
"main": "main.bundle.js",
"private": true,

View File

@@ -82,7 +82,7 @@ async function main() {
const files = [
'@fortawesome/fontawesome-free/css/all.min.css',
'@joeattardi/emoji-button/dist/index.js',
'codemirror/addon/dialog/dialog.css',
'codemirror/addon/',
'codemirror/lib/codemirror.css',
'mark.js/dist/mark.min.js',
'roboto-fontface/css/roboto/roboto-fontface.css',

View File

@@ -89,8 +89,8 @@ android {
applicationId "net.cozic.joplin"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 2097778
versionName "3.4.5"
versionCode 2097780
versionName "3.4.7"
ndk {
abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
}

View File

@@ -54,6 +54,14 @@ const Camera = (props: Props, ref: ForwardedRef<CameraRef>) => {
logger.error(message);
}, []);
const isReadyRef = useRef(false);
const onCameraReady = useCallback(() => {
if (isReadyRef.current) return; // Already emitted
isReadyRef.current = true;
props.onCameraReady();
}, [props.onCameraReady]);
useAsyncEffect(async (event) => {
// iOS issue workaround: Since upgrading to Expo SDK 52, closing and reopening the camera on iOS
// never emits onCameraReady. As a workaround, call .resumePreview and wait for it to resolve,
@@ -63,16 +71,16 @@ const Camera = (props: Props, ref: ForwardedRef<CameraRef>) => {
// Instead, wait for the preview to start using resumePreview:
await camera.resumePreview();
if (event.cancelled) return;
props.onCameraReady();
onCameraReady();
}
}, [camera, props.onCameraReady]);
}, [camera, onCameraReady]);
return hasPermission?.granted ? <CameraView
ref={setCamera}
style={props.style}
facing={props.cameraType === CameraDirection.Front ? 'front' : 'back'}
ratio={props.ratio as CameraRatio}
onCameraReady={Platform.OS === 'android' ? props.onCameraReady : undefined}
onCameraReady={onCameraReady}
onMountError={onMountError}
animateShutter={false}
barcodeScannerSettings={barcodeScannerSettings}

View File

@@ -27,11 +27,23 @@ export interface ModalElementProps extends ModalProps {
const useStyles = (hasScrollView: boolean, backgroundColor: string|undefined) => {
const safeAreaPadding = useSafeAreaPadding();
return useMemo(() => {
// On Android, the top-level container seems to need to be absolutely positioned
// to prevent it from being larger than the screen size:
const absoluteFill = {
position: 'absolute',
top: 0,
left: 0,
right: 0,
bottom: 0,
} satisfies ViewStyle;
return StyleSheet.create({
modalBackground: {
...safeAreaPadding,
flexGrow: 1,
flexShrink: 1,
...(hasScrollView ? {
flexGrow: 1,
flexShrink: 1,
} : absoluteFill),
// When hasScrollView, the modal background is wrapped in a ScrollView. In this case, it's
// possible to scroll content outside the background into view. To prevent the edge of the
@@ -40,6 +52,7 @@ const useStyles = (hasScrollView: boolean, backgroundColor: string|undefined) =>
backgroundColor: hasScrollView ? null : backgroundColor,
},
keyboardAvoidingView: {
...absoluteFill,
flex: 1,
},
modalScrollView: {

View File

@@ -11,7 +11,7 @@ import { saveProfileConfig, switchProfile } from '../../services/profiles';
import { themeStyle } from '../global-style';
import shim from '@joplin/lib/shim';
import { DialogContext } from '../DialogManager';
import { FAB, List, Portal } from 'react-native-paper';
import { FAB, List } from 'react-native-paper';
import { TextStyle } from 'react-native';
import useOnLongPressProps from '../../utils/hooks/useOnLongPressProps';
import { Dispatch } from 'redux';
@@ -206,19 +206,17 @@ export default (props: Props) => {
extraData={extraListItemData}
/>
</View>
<Portal>
<FAB
icon="plus"
accessibilityLabel={_('New profile')}
style={style.fab}
onPress={() => {
props.dispatch({
type: 'NAV_GO',
routeName: 'ProfileEditor',
});
}}
/>
</Portal>
<FAB
icon="plus"
accessibilityLabel={_('New profile')}
style={style.fab}
onPress={() => {
props.dispatch({
type: 'NAV_GO',
routeName: 'ProfileEditor',
});
}}
/>
</View>
);
};

View File

@@ -101,12 +101,24 @@ class ScreenHeaderComponent extends PureComponent<ScreenHeaderProps, ScreenHeade
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
const styleObject: any = {
container: {
outerContainer: {
flexDirection: 'column',
},
innerContainer: {
flexDirection: 'row',
alignItems: 'center',
backgroundColor: theme.backgroundColor2,
shadowColor: '#000000',
elevation: 5,
},
// A small border above the header: Covers the part of the shadow that would otherwise
// be shown above the header on Android.
aboveHeader: {
backgroundColor: theme.backgroundColor2,
paddingBottom: 6,
marginTop: -6,
zIndex: 2,
},
sideMenuButton: {
flex: 1,
alignItems: 'center',
@@ -678,8 +690,9 @@ class ScreenHeaderComponent extends PureComponent<ScreenHeaderProps, ScreenHeade
);
return (
<View style={this.styles().container}>
<View style={{ flexDirection: 'row', alignItems: 'center' }}>
<View style={this.styles().outerContainer}>
<View style={this.styles().aboveHeader}/>
<View style={this.styles().innerContainer}>
{sideMenuComp}
{backButtonComp}
{renderUndoButton()}

View File

@@ -17,6 +17,7 @@ import Resource from '@joplin/lib/models/Resource';
import { ResourceInfos } from '@joplin/renderer/types';
import useContentScripts from './utils/useContentScripts';
import uuid from '@joplin/lib/uuid';
import AsyncActionQueue from '@joplin/lib/AsyncActionQueue';
const logger = Logger.create('renderer/useWebViewSetup');
@@ -149,6 +150,8 @@ const useWebViewSetup = (props: Props): SetUpResult<RendererControl> => {
void messenger.remoteApi.renderer.setExtraContentScriptsAndRerender(contentScripts);
}, [messenger, contentScripts]);
const onRerenderRequestRef = useRef(()=>{});
const rendererControl = useMemo((): RendererControl => {
const renderer = messenger.remoteApi.renderer;
@@ -185,7 +188,7 @@ const useWebViewSetup = (props: Props): SetUpResult<RendererControl> => {
};
let settingsChanged = false;
const settings: RenderSettings = {
const getSettings = (): RenderSettings => ({
...options,
codeTheme: theme.codeThemeCss,
// We .stringify the theme to avoid a JSON serialization error involving
@@ -201,6 +204,7 @@ const useWebViewSetup = (props: Props): SetUpResult<RendererControl> => {
const key = `${pluginId}.${settingKey}`;
if (!pluginSettingKeysRef.current.has(key)) {
pluginSettingKeysRef.current.add(key);
onRerenderRequestRef.current();
settingsChanged = true;
}
},
@@ -220,12 +224,12 @@ const useWebViewSetup = (props: Props): SetUpResult<RendererControl> => {
return shim.fsDriver().fileAtPath(resolvedPath);
},
removeUnusedPluginAssets: options.removeUnusedPluginAssets,
};
});
await transferResources(options.resources);
return {
settings,
getSettings,
getSettingsChanged() {
return settingsChanged;
},
@@ -234,23 +238,28 @@ const useWebViewSetup = (props: Props): SetUpResult<RendererControl> => {
return {
rerenderToBody: async (markup, options, cancelEvent) => {
const { settings, getSettingsChanged } = await prepareRenderer(options);
const { getSettings } = await prepareRenderer(options);
if (cancelEvent?.cancelled) return null;
const output = await renderer.rerenderToBody(markup, settings);
if (cancelEvent?.cancelled) return null;
const render = async () => {
if (cancelEvent?.cancelled) return;
if (getSettingsChanged()) {
return await renderer.rerenderToBody(markup, settings);
}
return output;
await renderer.rerenderToBody(markup, getSettings());
};
const queue = new AsyncActionQueue();
onRerenderRequestRef.current = async () => {
queue.push(render);
};
return await render();
},
render: async (markup, options) => {
const { settings, getSettingsChanged } = await prepareRenderer(options);
const output = await renderer.render(markup, settings);
const { getSettings, getSettingsChanged } = await prepareRenderer(options);
const output = await renderer.render(markup, getSettings());
if (getSettingsChanged()) {
return await renderer.render(markup, settings);
return await renderer.render(markup, getSettings());
}
return output;
},

View File

@@ -363,6 +363,7 @@
"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/React-Core_privacy.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/React-cxxreact/React-cxxreact_privacy.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/boost/boost_privacy.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/glog/glog_privacy.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/react-native-image-picker/RNImagePickerPrivacyInfo.bundle",
);
name = "[CP] Copy Pods Resources";
@@ -394,6 +395,7 @@
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-Core_privacy.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-cxxreact_privacy.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/boost_privacy.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/glog_privacy.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNImagePickerPrivacyInfo.bundle",
);
runOnlyForDeploymentPostprocessing = 0;

View File

@@ -1514,7 +1514,7 @@ PODS:
- Yoga
- react-native-rsa-native (2.0.5):
- React
- react-native-saf-x (3.4.0):
- react-native-saf-x (3.4.1):
- React-Core
- react-native-safe-area-context (5.4.1):
- React-Core
@@ -2285,7 +2285,7 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS:
boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90
DoubleConversion: 76ab83afb40bddeeee456813d9c04f67f78771b5
DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb
EXAV: ae28256069c4cdde93d185c007d8f68d92902c2e
EXConstants: 98bcf0f22b820f9b28f9fee55ff2daededadd2f8
Expo: 4b1c6de7c441e1caa1918671ae0aa34d51f019a5
@@ -2298,7 +2298,7 @@ SPEC CHECKSUMS:
fast_float: 06eeec4fe712a76acc9376682e4808b05ce978b6
FBLazyVector: 84b955f7b4da8b895faf5946f73748267347c975
fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd
glog: c5d68082e772fa1c511173d6b30a9de2c05a69a2
glog: 5683914934d5b6e4240e497e0f4a3b42d1854183
hermes-engine: 314be5250afa5692b57b4dd1705959e1973a8ebe
JoplinCommonShareExtension: a8b60b02704d85a7305627912c0240e94af78db7
JoplinRNShareExtension: e158a4b53ee0aa9cd3037a16221dc8adbd6f7860
@@ -2343,7 +2343,7 @@ SPEC CHECKSUMS:
react-native-netinfo: cec9c4e86083cb5b6aba0e0711f563e2fbbff187
react-native-quick-crypto: 988d8d57cd720dbe218272b60775a8e0210d0b80
react-native-rsa-native: a7931cdda1f73a8576a46d7f431378c5550f0c38
react-native-saf-x: 24ebe9aa153f82ec6726de459ae77508d68d5599
react-native-saf-x: 3f8b52fb8160d7322161dec02a564271cc8f4138
react-native-safe-area-context: dde2052b903c11d677c320b599c3244021c34ce8
react-native-sqlite-storage: 0c84826214baaa498796c7e46a5ccc9a82e114ed
react-native-version-info: f0b04e16111c4016749235ff6d9a757039189141

View File

@@ -7,11 +7,17 @@ import libStateToWhenClauseContext, { WhenClauseContextOptions } from '@joplin/l
import { AppState } from '../../utils/types';
const stateToWhenClauseContext = (state: AppState, options: WhenClauseContextOptions = null) => {
const markdownEditorVisible = state.noteEditorVisible && state.settings['editor.codeView'];
const richTextEditorVisible = state.noteEditorVisible && !state.settings['editor.codeView'];
return {
...libStateToWhenClauseContext(state, options),
keyboardVisible: state.keyboardVisible,
markdownEditorVisible: state.noteEditorVisible && state.settings['editor.codeView'],
richTextEditorVisible: state.noteEditorVisible && !state.settings['editor.codeView'],
// Provide both markdownEditorPaneVisible and markdownEditorVisible for compatibility
// with the desktop app.
markdownEditorPaneVisible: markdownEditorVisible,
markdownEditorVisible: markdownEditorVisible,
richTextEditorVisible: richTextEditorVisible,
};
};

View File

@@ -1,7 +1,7 @@
{
"name": "@joplin/fork-htmlparser2",
"description": "Fast & forgiving HTML/XML/RSS parser",
"version": "4.1.58",
"version": "4.1.59",
"author": "Felix Boehm <me@feedic.com>",
"publishConfig": {
"access": "public"

View File

@@ -2,7 +2,7 @@
"name": "@joplin/fork-sax",
"description": "An evented streaming XML parser in JavaScript",
"author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
"version": "1.2.62",
"version": "1.2.63",
"main": "lib/sax.js",
"publishConfig": {
"access": "public"

View File

@@ -1,6 +1,6 @@
{
"name": "@joplin/fork-uslug",
"version": "2.0.1",
"version": "2.0.2",
"description": "A permissive slug generator that works with unicode.",
"author": "Jeremy Selier <jerem.selier@gmail.com>",
"publishConfig": {

View File

@@ -1,6 +1,6 @@
{
"name": "@joplin/htmlpack",
"version": "3.4.0",
"version": "3.4.1",
"description": "Pack an HTML file and all its linked resources into a single HTML file",
"main": "dist/index.js",
"types": "index.ts",
@@ -26,7 +26,7 @@
"license": "MIT",
"dependencies": {
"@adobe/css-tools": "4.4.3",
"@joplin/fork-htmlparser2": "^4.1.58",
"@joplin/fork-htmlparser2": "^4.1.59",
"datauri": "4.1.0",
"fs-extra": "11.2.0",
"html-entities": "1.4.0"

View File

@@ -522,6 +522,13 @@ describe('models/Setting', () => {
expect(Setting.value('revisionService.ttlDays')).toBe(1);
});
test('should not fail to save settings that can conflict with uninstalled plugin settings', async () => {
Setting.setValue('editor.imageRendering', true);
expect(Setting.value('editor.imageRendering')).toBe(true);
Setting.setValue('editor.imageRendering', false);
expect(Setting.value('editor.imageRendering')).toBe(false);
});
test('should adjust settings to avoid conflicts', async () => {
const testSettingId = 'plugin-plugin.calebjohn.rich-markdown.inlineImages';
await Setting.registerSetting(testSettingId, {

View File

@@ -808,15 +808,20 @@ class Setting extends BaseModel {
this.scheduleChangeEvent();
};
const setValueInternalIfExists = <Key extends string> (key: Key, value: SettingValueType<Key>) => {
if (!this.keyExists(key)) return;
setValueInternal(key, value);
};
setValueInternal(key, value);
// Prevent conflicts. Use setValueInternal to avoid infinite recursion in the case
// where conflictingSettings has invalid data.
for (const conflict of conflictingSettings) {
if (conflict.key1 === key && conflict.value1 === value) {
setValueInternal(conflict.key2, conflict.alternate2);
setValueInternalIfExists(conflict.key2, conflict.alternate2);
} else if (conflict.key2 === key && conflict.value2 === value) {
setValueInternal(conflict.key1, conflict.alternate1);
setValueInternalIfExists(conflict.key1, conflict.alternate1);
}
}
}

View File

@@ -557,13 +557,15 @@ const builtInMetadata = (Setting: typeof SettingType) => {
},
'ocr.handwrittenTextDriverEnabled': {
value: true,
value: false,
type: SettingItemType.Bool,
public: true,
appTypes: [AppType.Desktop],
label: () => _('Enable handwritten transcription'),
description: () => 'Allows selecting specific attachments for higher-quality on-server OCR. When enabled, the right-click menu for an attachment includes an option to send an attachment to Joplin Cloud/Server for off-device processing.\n\nExperimental! It may not work at all. Requires Joplin Server or Cloud.',
storage: SettingStorage.File,
isGlobal: true,
advanced: true,
},
'ocr.languageDataPath': {

View File

@@ -1,6 +1,6 @@
{
"name": "@joplin/lib",
"version": "3.4.0",
"version": "3.4.1",
"description": "Joplin Core library",
"author": "Laurent Cozic",
"homepage": "",
@@ -44,15 +44,15 @@
"@adobe/css-tools": "4.4.3",
"@aws-sdk/client-s3": "3.296.0",
"@aws-sdk/s3-request-presigner": "3.296.0",
"@joplin/fork-htmlparser2": "^4.1.58",
"@joplin/fork-sax": "^1.2.62",
"@joplin/fork-uslug": "^2.0.1",
"@joplin/htmlpack": "~3.4",
"@joplin/onenote-converter": "~3.4",
"@joplin/renderer": "~3.4",
"@joplin/turndown": "^4.0.80",
"@joplin/turndown-plugin-gfm": "^1.0.62",
"@joplin/utils": "~3.4",
"@joplin/fork-htmlparser2": "^4.1.59",
"@joplin/fork-sax": "^1.2.63",
"@joplin/fork-uslug": "^2.0.2",
"@joplin/htmlpack": "^3.4.1",
"@joplin/onenote-converter": "^3.4.1",
"@joplin/renderer": "^3.4.1",
"@joplin/turndown": "^4.0.81",
"@joplin/turndown-plugin-gfm": "^1.0.63",
"@joplin/utils": "^3.4.1",
"@types/nanoid": "3.0.0",
"adm-zip": "0.5.16",
"async-mutex": "0.5.0",

View File

@@ -4,7 +4,7 @@
"access": "public"
},
"description": "Used to import a OneNote archive into Joplin",
"version": "3.4.0",
"version": "3.4.1",
"license": "AGPL-3.0-or-later",
"repository": "https://github.com/laurent22/joplin/tree/dev/packages/onenote-converter",
"main": "./pkg/onenote_converter.js",

View File

@@ -1,6 +1,6 @@
{
"name": "@joplin/plugin-repo-cli",
"version": "3.4.0",
"version": "3.4.1",
"description": "",
"main": "index.js",
"bin": "./dist/index.js",
@@ -18,9 +18,9 @@
"author": "",
"license": "AGPL-3.0-or-later",
"dependencies": {
"@joplin/lib": "~3.4",
"@joplin/tools": "~3.4",
"@joplin/utils": "~3.4",
"@joplin/lib": "^3.4.1",
"@joplin/tools": "^3.4.1",
"@joplin/utils": "^3.4.1",
"fs-extra": "11.2.0",
"gh-release-assets": "2.0.1",
"node-fetch": "2.6.7",

View File

@@ -1,6 +1,6 @@
{
"name": "@joplin/react-native-saf-x",
"version": "3.4.0",
"version": "3.4.1",
"description": "a module to help work with scoped storages on android easily",
"main": "src/index",
"react-native": "src/index",

View File

@@ -1,6 +1,6 @@
{
"name": "@joplin/renderer",
"version": "3.4.0",
"version": "3.4.1",
"description": "The Joplin note renderer, used the mobile and desktop application",
"repository": "https://github.com/laurent22/joplin/tree/dev/packages/renderer",
"main": "index.js",
@@ -30,9 +30,9 @@
"typescript": "5.8.2"
},
"dependencies": {
"@joplin/fork-htmlparser2": "^4.1.58",
"@joplin/fork-uslug": "^2.0.1",
"@joplin/utils": "~3.4",
"@joplin/fork-htmlparser2": "^4.1.59",
"@joplin/fork-uslug": "^2.0.2",
"@joplin/utils": "^3.4.1",
"font-awesome-filetypes": "2.1.0",
"fs-extra": "11.2.0",
"highlight.js": "11.11.1",

View File

@@ -1,6 +1,6 @@
{
"name": "@joplin/tools",
"version": "3.4.0",
"version": "3.4.1",
"description": "Various tools for Joplin",
"main": "index.js",
"author": "Laurent Cozic",
@@ -21,9 +21,9 @@
},
"license": "AGPL-3.0-or-later",
"dependencies": {
"@joplin/lib": "~3.4",
"@joplin/renderer": "~3.4",
"@joplin/utils": "~3.4",
"@joplin/lib": "^3.4.1",
"@joplin/renderer": "^3.4.1",
"@joplin/utils": "^3.4.1",
"compare-versions": "6.1.1",
"dayjs": "1.11.13",
"execa": "4.1.0",
@@ -45,7 +45,7 @@
},
"devDependencies": {
"@docusaurus/plugin-sitemap": "2.4.3",
"@joplin/fork-htmlparser2": "^4.1.58",
"@joplin/fork-htmlparser2": "^4.1.59",
"@rmp135/sql-ts": "1.18.1",
"@types/fs-extra": "11.0.4",
"@types/jest": "29.5.14",

View File

@@ -6,8 +6,6 @@ const appDir = `${rootDir}/packages/app-desktop`;
async function main() {
await gitPullTry(false);
const argv = require('yargs').argv;
process.chdir(appDir);
console.info(`Running from: ${process.cwd()}`);
@@ -23,7 +21,7 @@ async function main() {
await execCommand('git push');
await execCommand('git push --tags');
const releaseOptions = { isDraft: true, isPreRelease: !!argv.beta };
const releaseOptions = { isDraft: true, isPreRelease: true };
console.info('Release options: ', releaseOptions);

View File

@@ -4,7 +4,7 @@
"publishConfig": {
"access": "public"
},
"version": "1.0.62",
"version": "1.0.63",
"author": "Dom Christie",
"main": "lib/turndown-plugin-gfm.cjs.js",
"devDependencies": {

View File

@@ -1,7 +1,7 @@
{
"name": "@joplin/turndown",
"description": "A library that converts HTML to Markdown",
"version": "4.0.80",
"version": "4.0.81",
"author": "Dom Christie",
"main": "lib/turndown.cjs.js",
"publishConfig": {

View File

@@ -1,6 +1,6 @@
{
"name": "@joplin/utils",
"version": "3.4.0",
"version": "3.4.1",
"description": "Utilities for Joplin",
"repository": "https://github.com/laurent22/joplin/tree/dev/packages/utils",
"exports": {
@@ -34,7 +34,7 @@
"author": "",
"license": "AGPL-3.0-or-later",
"dependencies": {
"@joplin/fork-htmlparser2": "^4.1.58",
"@joplin/fork-htmlparser2": "^4.1.59",
"async-mutex": "0.5.0",
"dayjs": "1.11.13",
"execa": "5.1.1",

View File

@@ -1,5 +1,19 @@
# Joplin Android Changelog
## [android-v3.4.7](https://github.com/laurent22/joplin/releases/tag/android-v3.4.7) (Pre-release) - 2025-09-09T08:09:54Z
- Fixed: Fix error when saving in-editor rendering-related settings (#13105) (#13103 by [@personalizedrefrigerator](https://github.com/personalizedrefrigerator))
- Fixed: Fix light bar shown above header in dark mode (#13132 by [@personalizedrefrigerator](https://github.com/personalizedrefrigerator))
- Fixed: Plugins: Fix renderer plugins that use the `settingValue` API (#13131 by [@personalizedrefrigerator](https://github.com/personalizedrefrigerator))
## [android-v3.4.6](https://github.com/laurent22/joplin/releases/tag/android-v3.4.6) (Pre-release) - 2025-09-01T12:02:41Z
- Fixed: Fix "edit profile" button is partially off-screen (#13084) (#13015 by [@personalizedrefrigerator](https://github.com/personalizedrefrigerator))
- Fixed: Fix shadow shown above the screen header (#13074 by [@personalizedrefrigerator](https://github.com/personalizedrefrigerator))
- Fixed: Plugin API: Fix certain renderer plugins fail to load (#13078 by [@personalizedrefrigerator](https://github.com/personalizedrefrigerator))
- Fixed: Plugin API: Fix compatibility with certain plugins targetting the desktop app (#13077 by [@personalizedrefrigerator](https://github.com/personalizedrefrigerator))
- Fixed: Plugins: Fix plugin panel buttons are off-screen on recent versions of Android (#13080 by [@personalizedrefrigerator](https://github.com/personalizedrefrigerator))
## [android-v3.4.5](https://github.com/laurent22/joplin/releases/tag/android-v3.4.5) (Pre-release) - 2025-08-27T06:27:53Z
- New: Add a "highlight active line" setting (#12967 by [@personalizedrefrigerator](https://github.com/personalizedrefrigerator))

View File

@@ -1,5 +1,24 @@
# Joplin Terminal App Changelog
## [cli-v3.4.1](https://github.com/laurent22/joplin/releases/tag/cli-v3.4.1) - 2025-08-27T06:48:52Z
- New: Add Joplin Server SAML support (#11865 by [@ttcchhmm](https://github.com/ttcchhmm))
- New: Add collapsible notebooks functionality (#12718 by [@miguelammatos](https://github.com/miguelammatos))
- New: Add commands for publishing and unpublishing notes with Joplin Server (#13060 by [@personalizedrefrigerator](https://github.com/personalizedrefrigerator))
- Improved: Add information about failing tests of OneNote importer inside test names (#12159) (#12157 by [@pedr](https://github.com/pedr))
- Improved: Falls back to filename for the title when importing Markdown files with FrontMatter (#12698 by [@khemarato](https://github.com/khemarato))
- Improved: If no notebook is provided when importing a file, use the default one (30000c3)
- Improved: Refresh shares when running the sync command (#12667 by [@personalizedrefrigerator](https://github.com/personalizedrefrigerator))
- Improved: Set new encryption methods as default (#12229 by Self Not Found)
- Improved: Support managing shared notebooks (#12637 by [@personalizedrefrigerator](https://github.com/personalizedrefrigerator))
- Improved: Update translations (9f649c9 by Helmut K. C. Tessarek)
- Improved: Updated packages @adobe/css-tools (v4.4.3), @rollup/plugin-commonjs (v28.0.3), @rollup/plugin-node-resolve (v16.0.1), @rollup/plugin-replace (v6.0.2), dayjs (v1.11.13), domutils (v3.2.2), form-data (v4.0.2), glob (v11.0.2), highlight.js (v11.11.1), jsdom (v26.1.0), katex (v0.16.22), license-checker-rseidelsohn (v4.4.2), mermaid (v11.6.0), nanoid (v3.3.9), node (v18.20.7), react, sass (v1.87.0), sharp (v0.34.2), standard (v17.1.2), style-to-js (v1.1.16), terminal-kit (v3.1.2), tesseract.js (v5.1.1), uuid (v11.1.0)
- Fixed: Fix Yinxiang HTML imported notes being enclosed by a open anchor tag (#12395) (#12363 by [@pedr](https://github.com/pedr))
- Fixed: Fix data API failure when including both conflicts and deleted notes in results (#12650 by [@personalizedrefrigerator](https://github.com/personalizedrefrigerator))
- Fixed: Fix unshare action requires two syncs to be reflected locally (#12999) (#12648 by [@personalizedrefrigerator](https://github.com/personalizedrefrigerator))
- Fixed: Moving sub-notebook of shared notebook should unshare it (#12647) (#12089)
- Fixed: Shared folders: Fix moving shared subfolder to top-level briefly marks it as a top-level share (#12964 by [@personalizedrefrigerator](https://github.com/personalizedrefrigerator))
## [cli-v3.3.1](https://github.com/laurent22/joplin/releases/tag/cli-v3.3.1) - 2025-05-01T21:18:35Z
- New: Add plural forms for notes, users, hours, minutes, days (#12171 by [@SilverGreen93](https://github.com/SilverGreen93))

View File

@@ -13,9 +13,9 @@ In order to provide certain features, Joplin may need to connect to third-party
| Spellchecker dictionary | On Linux and Windows, the desktop application downloads the spellchecker dictionary from `redirector.gvt1.com`. | Enabled | Yes <sup>(2)</sup> |
| Plugin repository | The desktop application downloads the list of available plugins from the [official GitHub repository](https://github.com/joplin/plugins). If this repository is not accessible (eg. in China) the app will try to get the plugin list from [various mirrors](https://github.com/laurent22/joplin/blob/8ac6017c02017b6efd59f5fcab7e0b07f8d44164/packages/lib/services/plugins/RepositoryApi.ts#L22), in which case the plugin screen [works slightly differently](https://github.com/laurent22/joplin/issues/5161#issuecomment-925226975). | Enabled | No
| Voice typing | If you use the voice typing feature on Android, the application will download the language files from https://github.com/joplin/voice-typing-models/ or https://alphacephei.com/vosk/models. | Disabled | Yes
| OCR | If you have enabled optical character recognition on desktop, the application will download the language files from https://cdn.jsdelivr.net/npm/@tesseract.js-data/. | Disabled | Yes
| OCR | If optical character recognition is enabled on desktop, the application will download the language files from https://cdn.jsdelivr.net/npm/@tesseract.js-data/. | Enabled | Yes
| Crash reports | If you have enabled crash auto-upload, the application will upload the report to Sentry when a crash happens. When Sentry is initialised it will also connect to `sentry.io`. | Disabled | Yes
| Handwriting recognition | This option allows the user to send images to Joplin Server/Cloud to be transcribed, only images selected with the 'Recognize handwritten image' are affected. | Enabled | Yes
| Handwriting recognition | If the 'handwriting recognition' setting is enabled, users can send images to Joplin Server/Cloud to be transcribed. Only images selected with the 'Recognize handwritten image' are affected. | Disabled | Yes
<sup>(1) https://github.com/laurent22/joplin/issues/5705</sup><br/>
<sup>(2) If the spellchecker is disabled, [it will not download the dictionary](https://discourse.joplinapp.org/t/new-version-of-joplin-contacting-google-servers-on-startup/23000/40?u=laurent).</sup>

View File

@@ -2,19 +2,20 @@
The Joplin applications, including the Android, iOS, Windows, macOS and Linux applications, do not send any data to any service without your authorisation. Any data that Joplin saves, such as notes or images, are saved to your own device and you are free to delete this data at any time.
If you choose to synchronise with a third-party, such as OneDrive or Dropbox, the notes will be sent to that account, in which case the third-party privacy policy applies.
In order to provide certain features, Joplin may need to connect to third-party services. You can disable most of these features in the application settings:
| Feature | Description | Default | Can be disabled |
| -------- | ------------- | -------- | --- |
| Auto-update | Joplin periodically connects to GitHub to check for new releases. | Enabled | Yes |
| Geo-location | Joplin saves geo-location information in note properties when you create a note. | Enabled | Yes |
| Auto-update | Joplin periodically connects to `objects.joplinusercontent.com` to check for new releases. | Enabled | Yes |
| Geo-location | Joplin saves geo-location information in note properties when you create a note. For that it will connect to either `ipwho.is` or `geoplugin.net` | Enabled | Yes |
| Synchronisation | Joplin supports synchronisation of your notes across multiple devices. If you choose to synchronise with a third-party, such as OneDrive, the notes will be sent to your OneDrive account, in which case the third-party privacy policy applies. | Disabled | Yes |
| Wifi connection check | On mobile, Joplin checks for Wifi connectivity to give the option to synchronise data only when Wifi is enabled. | Enabled | No <sup>(1)</sup> |
| Spellchecker dictionary | On Linux and Windows, the desktop application downloads the spellchecker dictionary from `redirector.gvt1.com`. | Enabled | Yes <sup>(2)</sup> |
| Plugin repository | The desktop application downloads the list of available plugins from the [official GitHub repository](https://github.com/joplin/plugins). If this repository is not accessible (eg. in China) the app will try to get the plugin list from [various mirrors](https://github.com/laurent22/joplin/blob/8ac6017c02017b6efd59f5fcab7e0b07f8d44164/packages/lib/services/plugins/RepositoryApi.ts#L22), in which case the plugin screen [works slightly differently](https://github.com/laurent22/joplin/issues/5161#issuecomment-925226975). | Enabled | No
| Voice typing | If you use the voice typing feature on Android, the application will download the language files from https://github.com/joplin/voice-typing-models/ or https://alphacephei.com/vosk/models. | Disabled | Yes
| OCR | If optical character recognition is enabled on desktop, the application will download the language files from https://cdn.jsdelivr.net/npm/@tesseract.js-data/. | Enabled | Yes
| Crash reports | If you have enabled crash auto-upload, the application will upload the report to Sentry when a crash happens. When Sentry is initialised it will also connect to `sentry.io`. | Disabled | Yes
| Handwriting recognition | If the 'handwriting recognition' setting is enabled, users can send images to Joplin Server/Cloud to be transcribed. Only images selected with the 'Recognize handwritten image' are affected. | Disabled | Yes
<sup>(1) https://github.com/laurent22/joplin/issues/5705</sup><br/>
<sup>(2) If the spellchecker is disabled, [it will not download the dictionary](https://discourse.joplinapp.org/t/new-version-of-joplin-contacting-google-servers-on-startup/23000/40?u=laurent).</sup>

View File

@@ -9424,7 +9424,7 @@ __metadata:
languageName: unknown
linkType: soft
"@joplin/fork-htmlparser2@npm:^4.1.58, @joplin/fork-htmlparser2@workspace:packages/fork-htmlparser2":
"@joplin/fork-htmlparser2@npm:^4.1.59, @joplin/fork-htmlparser2@workspace:packages/fork-htmlparser2":
version: 0.0.0-use.local
resolution: "@joplin/fork-htmlparser2@workspace:packages/fork-htmlparser2"
dependencies:
@@ -9445,7 +9445,7 @@ __metadata:
languageName: unknown
linkType: soft
"@joplin/fork-sax@npm:^1.2.62, @joplin/fork-sax@workspace:packages/fork-sax":
"@joplin/fork-sax@npm:^1.2.63, @joplin/fork-sax@workspace:packages/fork-sax":
version: 0.0.0-use.local
resolution: "@joplin/fork-sax@workspace:packages/fork-sax"
dependencies:
@@ -9454,7 +9454,7 @@ __metadata:
languageName: unknown
linkType: soft
"@joplin/fork-uslug@npm:^2.0.0, @joplin/fork-uslug@npm:^2.0.1, @joplin/fork-uslug@workspace:packages/fork-uslug":
"@joplin/fork-uslug@npm:^2.0.0, @joplin/fork-uslug@npm:^2.0.2, @joplin/fork-uslug@workspace:packages/fork-uslug":
version: 0.0.0-use.local
resolution: "@joplin/fork-uslug@workspace:packages/fork-uslug"
dependencies:
@@ -9466,12 +9466,12 @@ __metadata:
languageName: unknown
linkType: soft
"@joplin/htmlpack@npm:~3.4, @joplin/htmlpack@workspace:packages/htmlpack":
"@joplin/htmlpack@npm:^3.4.1, @joplin/htmlpack@workspace:packages/htmlpack":
version: 0.0.0-use.local
resolution: "@joplin/htmlpack@workspace:packages/htmlpack"
dependencies:
"@adobe/css-tools": "npm:4.4.3"
"@joplin/fork-htmlparser2": "npm:^4.1.58"
"@joplin/fork-htmlparser2": "npm:^4.1.59"
"@types/fs-extra": "npm:11.0.4"
"@types/jest": "npm:29.5.14"
datauri: "npm:4.1.0"
@@ -9482,22 +9482,22 @@ __metadata:
languageName: unknown
linkType: soft
"@joplin/lib@npm:~3.4, @joplin/lib@workspace:packages/lib":
"@joplin/lib@npm:^3.4.1, @joplin/lib@npm:~3.4, @joplin/lib@workspace:packages/lib":
version: 0.0.0-use.local
resolution: "@joplin/lib@workspace:packages/lib"
dependencies:
"@adobe/css-tools": "npm:4.4.3"
"@aws-sdk/client-s3": "npm:3.296.0"
"@aws-sdk/s3-request-presigner": "npm:3.296.0"
"@joplin/fork-htmlparser2": "npm:^4.1.58"
"@joplin/fork-sax": "npm:^1.2.62"
"@joplin/fork-uslug": "npm:^2.0.1"
"@joplin/htmlpack": "npm:~3.4"
"@joplin/onenote-converter": "npm:~3.4"
"@joplin/renderer": "npm:~3.4"
"@joplin/turndown": "npm:^4.0.80"
"@joplin/turndown-plugin-gfm": "npm:^1.0.62"
"@joplin/utils": "npm:~3.4"
"@joplin/fork-htmlparser2": "npm:^4.1.59"
"@joplin/fork-sax": "npm:^1.2.63"
"@joplin/fork-uslug": "npm:^2.0.2"
"@joplin/htmlpack": "npm:^3.4.1"
"@joplin/onenote-converter": "npm:^3.4.1"
"@joplin/renderer": "npm:^3.4.1"
"@joplin/turndown": "npm:^4.0.81"
"@joplin/turndown-plugin-gfm": "npm:^1.0.63"
"@joplin/utils": "npm:^3.4.1"
"@testing-library/react-hooks": "npm:8.0.1"
"@types/adm-zip": "npm:0.5.7"
"@types/fs-extra": "npm:11.0.4"
@@ -9575,7 +9575,7 @@ __metadata:
languageName: unknown
linkType: soft
"@joplin/onenote-converter@npm:~3.4, @joplin/onenote-converter@workspace:packages/onenote-converter":
"@joplin/onenote-converter@npm:^3.4.1, @joplin/onenote-converter@npm:~3.4, @joplin/onenote-converter@workspace:packages/onenote-converter":
version: 0.0.0-use.local
resolution: "@joplin/onenote-converter@workspace:packages/onenote-converter"
dependencies:
@@ -9619,9 +9619,9 @@ __metadata:
version: 0.0.0-use.local
resolution: "@joplin/plugin-repo-cli@workspace:packages/plugin-repo-cli"
dependencies:
"@joplin/lib": "npm:~3.4"
"@joplin/tools": "npm:~3.4"
"@joplin/utils": "npm:~3.4"
"@joplin/lib": "npm:^3.4.1"
"@joplin/tools": "npm:^3.4.1"
"@joplin/utils": "npm:^3.4.1"
"@types/fs-extra": "npm:11.0.4"
"@types/jest": "npm:29.5.14"
"@types/node": "npm:18.19.103"
@@ -9670,13 +9670,13 @@ __metadata:
languageName: unknown
linkType: soft
"@joplin/renderer@npm:~3.4, @joplin/renderer@workspace:packages/renderer":
"@joplin/renderer@npm:^3.4.1, @joplin/renderer@npm:~3.4, @joplin/renderer@workspace:packages/renderer":
version: 0.0.0-use.local
resolution: "@joplin/renderer@workspace:packages/renderer"
dependencies:
"@joplin/fork-htmlparser2": "npm:^4.1.58"
"@joplin/fork-uslug": "npm:^2.0.1"
"@joplin/utils": "npm:~3.4"
"@joplin/fork-htmlparser2": "npm:^4.1.59"
"@joplin/fork-uslug": "npm:^2.0.2"
"@joplin/utils": "npm:^3.4.1"
"@types/jest": "npm:29.5.14"
"@types/markdown-it": "npm:13.0.9"
"@types/node": "npm:18.19.103"
@@ -9775,15 +9775,15 @@ __metadata:
languageName: unknown
linkType: soft
"@joplin/tools@npm:~3.4, @joplin/tools@workspace:packages/tools":
"@joplin/tools@npm:^3.4.1, @joplin/tools@npm:~3.4, @joplin/tools@workspace:packages/tools":
version: 0.0.0-use.local
resolution: "@joplin/tools@workspace:packages/tools"
dependencies:
"@docusaurus/plugin-sitemap": "npm:2.4.3"
"@joplin/fork-htmlparser2": "npm:^4.1.58"
"@joplin/lib": "npm:~3.4"
"@joplin/renderer": "npm:~3.4"
"@joplin/utils": "npm:~3.4"
"@joplin/fork-htmlparser2": "npm:^4.1.59"
"@joplin/lib": "npm:^3.4.1"
"@joplin/renderer": "npm:^3.4.1"
"@joplin/utils": "npm:^3.4.1"
"@rmp135/sql-ts": "npm:1.18.1"
"@types/fs-extra": "npm:11.0.4"
"@types/jest": "npm:29.5.14"
@@ -9852,7 +9852,7 @@ __metadata:
languageName: unknown
linkType: soft
"@joplin/turndown-plugin-gfm@npm:^1.0.62, @joplin/turndown-plugin-gfm@npm:~1.0.62, @joplin/turndown-plugin-gfm@workspace:packages/turndown-plugin-gfm":
"@joplin/turndown-plugin-gfm@npm:^1.0.63, @joplin/turndown-plugin-gfm@npm:~1.0.62, @joplin/turndown-plugin-gfm@workspace:packages/turndown-plugin-gfm":
version: 0.0.0-use.local
resolution: "@joplin/turndown-plugin-gfm@workspace:packages/turndown-plugin-gfm"
dependencies:
@@ -9864,7 +9864,7 @@ __metadata:
languageName: unknown
linkType: soft
"@joplin/turndown@npm:^4.0.80, @joplin/turndown@npm:~4.0.80, @joplin/turndown@workspace:packages/turndown":
"@joplin/turndown@npm:^4.0.81, @joplin/turndown@npm:~4.0.80, @joplin/turndown@workspace:packages/turndown":
version: 0.0.0-use.local
resolution: "@joplin/turndown@workspace:packages/turndown"
dependencies:
@@ -9881,26 +9881,11 @@ __metadata:
languageName: unknown
linkType: soft
"@joplin/utils@npm:~2.12":
version: 2.12.1
resolution: "@joplin/utils@npm:2.12.1"
dependencies:
async-mutex: "npm:0.4.0"
execa: "npm:5.1.1"
fs-extra: "npm:11.1.1"
glob: "npm:10.3.3"
moment: "npm:2.29.4"
node-fetch: "npm:2.6.7"
sprintf-js: "npm:1.1.2"
checksum: 10/7ac4e8a82551ca78fe0e23081a05bfd1b38fa7a353fc037224144fa40c4825924ada8a5026c0bb4e5959de6d28173829a7e2e8dcd6e774d09d852a94c158bdbf
languageName: node
linkType: hard
"@joplin/utils@npm:~3.4, @joplin/utils@workspace:packages/utils":
"@joplin/utils@npm:^3.4.1, @joplin/utils@npm:~3.4, @joplin/utils@workspace:packages/utils":
version: 0.0.0-use.local
resolution: "@joplin/utils@workspace:packages/utils"
dependencies:
"@joplin/fork-htmlparser2": "npm:^4.1.58"
"@joplin/fork-htmlparser2": "npm:^4.1.59"
"@types/fs-extra": "npm:11.0.4"
"@types/jest": "npm:29.5.14"
"@types/markdown-it": "npm:13.0.9"
@@ -9922,6 +9907,21 @@ __metadata:
languageName: unknown
linkType: soft
"@joplin/utils@npm:~2.12":
version: 2.12.1
resolution: "@joplin/utils@npm:2.12.1"
dependencies:
async-mutex: "npm:0.4.0"
execa: "npm:5.1.1"
fs-extra: "npm:11.1.1"
glob: "npm:10.3.3"
moment: "npm:2.29.4"
node-fetch: "npm:2.6.7"
sprintf-js: "npm:1.1.2"
checksum: 10/7ac4e8a82551ca78fe0e23081a05bfd1b38fa7a353fc037224144fa40c4825924ada8a5026c0bb4e5959de6d28173829a7e2e8dcd6e774d09d852a94c158bdbf
languageName: node
linkType: hard
"@jridgewell/gen-mapping@npm:^0.3.0":
version: 0.3.3
resolution: "@jridgewell/gen-mapping@npm:0.3.3"