1
0
mirror of https://github.com/laurent22/joplin.git synced 2025-08-24 20:19:10 +02:00

Compare commits

...

4 Commits

Author SHA1 Message Date
Laurent Cozic
4f5e52c363 update 2023-05-08 14:59:27 +01:00
Laurent Cozic
4e7087b350 Merge branch 'dev' into webpack_electron 2023-05-08 14:06:29 +01:00
Laurent Cozic
59e7c4933d Merge branch 'dev' into webpack_electron 2023-05-04 21:14:22 +01:00
Laurent Cozic
621f83d3ce init 2023-04-26 22:53:31 +01:00
32 changed files with 398 additions and 158 deletions

View File

@@ -259,6 +259,7 @@ packages/app-desktop/gui/NoteEditor/utils/useWindowCommandHandler.js
packages/app-desktop/gui/NoteList/NoteList.js
packages/app-desktop/gui/NoteList/commands/focusElementNoteList.js
packages/app-desktop/gui/NoteList/commands/index.js
packages/app-desktop/gui/NoteList/itemAnchorRef.js
packages/app-desktop/gui/NoteList/types.js
packages/app-desktop/gui/NoteListControls/NoteListControls.js
packages/app-desktop/gui/NoteListControls/commands/focusSearch.js
@@ -311,6 +312,7 @@ packages/app-desktop/gui/TagItem.js
packages/app-desktop/gui/TagList.js
packages/app-desktop/gui/ToggleEditorsButton/ToggleEditorsButton.js
packages/app-desktop/gui/ToggleEditorsButton/styles/index.js
packages/app-desktop/gui/ToggleEditorsButton/types.js
packages/app-desktop/gui/ToolbarBase.js
packages/app-desktop/gui/ToolbarButton/ToolbarButton.js
packages/app-desktop/gui/ToolbarButton/styles/index.js
@@ -549,6 +551,7 @@ packages/lib/models/SmartFilter.js
packages/lib/models/Tag.js
packages/lib/models/dateTimeFormats.test.js
packages/lib/models/settings/FileHandler.js
packages/lib/models/settings/types.js
packages/lib/models/utils/itemCanBeEncrypted.js
packages/lib/models/utils/paginatedFeed.js
packages/lib/models/utils/paginationToSql.js
@@ -683,8 +686,6 @@ packages/lib/services/plugins/utils/validatePluginVersion.test.js
packages/lib/services/profileConfig/index.js
packages/lib/services/profileConfig/index.test.js
packages/lib/services/profileConfig/initProfile.js
packages/lib/services/profileConfig/mergeGlobalAndLocalSettings.js
packages/lib/services/profileConfig/splitGlobalAndLocalSettings.js
packages/lib/services/profileConfig/types.js
packages/lib/services/rest/Api.js
packages/lib/services/rest/Api.test.js

5
.gitignore vendored
View File

@@ -245,6 +245,7 @@ packages/app-desktop/gui/NoteEditor/utils/useWindowCommandHandler.js
packages/app-desktop/gui/NoteList/NoteList.js
packages/app-desktop/gui/NoteList/commands/focusElementNoteList.js
packages/app-desktop/gui/NoteList/commands/index.js
packages/app-desktop/gui/NoteList/itemAnchorRef.js
packages/app-desktop/gui/NoteList/types.js
packages/app-desktop/gui/NoteListControls/NoteListControls.js
packages/app-desktop/gui/NoteListControls/commands/focusSearch.js
@@ -297,6 +298,7 @@ packages/app-desktop/gui/TagItem.js
packages/app-desktop/gui/TagList.js
packages/app-desktop/gui/ToggleEditorsButton/ToggleEditorsButton.js
packages/app-desktop/gui/ToggleEditorsButton/styles/index.js
packages/app-desktop/gui/ToggleEditorsButton/types.js
packages/app-desktop/gui/ToolbarBase.js
packages/app-desktop/gui/ToolbarButton/ToolbarButton.js
packages/app-desktop/gui/ToolbarButton/styles/index.js
@@ -535,6 +537,7 @@ packages/lib/models/SmartFilter.js
packages/lib/models/Tag.js
packages/lib/models/dateTimeFormats.test.js
packages/lib/models/settings/FileHandler.js
packages/lib/models/settings/types.js
packages/lib/models/utils/itemCanBeEncrypted.js
packages/lib/models/utils/paginatedFeed.js
packages/lib/models/utils/paginationToSql.js
@@ -669,8 +672,6 @@ packages/lib/services/plugins/utils/validatePluginVersion.test.js
packages/lib/services/profileConfig/index.js
packages/lib/services/profileConfig/index.test.js
packages/lib/services/profileConfig/initProfile.js
packages/lib/services/profileConfig/mergeGlobalAndLocalSettings.js
packages/lib/services/profileConfig/splitGlobalAndLocalSettings.js
packages/lib/services/profileConfig/types.js
packages/lib/services/rest/Api.js
packages/lib/services/rest/Api.test.js

View File

@@ -1,4 +1,5 @@
import Setting, { SettingStorage } from '@joplin/lib/models/Setting';
import { schemaUrl } from '@joplin/lib/models/settings/types';
import { SettingItemType } from '@joplin/lib/services/plugins/api/types';
import shim from '@joplin/lib/shim';
@@ -38,7 +39,7 @@ class Command extends BaseCommand {
public async action(args: any) {
const schema: Record<string, any> = {
title: 'JSON schema for Joplin setting files',
'$id': Setting.schemaUrl,
'$id': schemaUrl,
'$schema': 'https://json-schema.org/draft-07/schema#',
type: 'object',
properties: {},

View File

@@ -14,3 +14,5 @@ style.min.css
build/lib/
vendor/*
!vendor/loadEmojiLib.js
main-html.bundle.js
main.js

View File

@@ -84,35 +84,35 @@ export class Bridge {
// Perhaps the easiest would be to patch electron-context-menu to
// support the renderer process again. Or possibly revert to an old
// version of electron-context-menu.
public setupContextMenu(_spellCheckerMenuItemsHandler: Function) {
require('electron-context-menu')({
allWindows: [this.window()],
// public setupContextMenu(_spellCheckerMenuItemsHandler: Function) {
// require('electron-context-menu')({
// allWindows: [this.window()],
electronApp: this.electronApp(),
// electronApp: this.electronApp(),
shouldShowMenu: (_event: any, params: any) => {
// params.inputFieldType === 'none' when right-clicking the text
// editor. This is a bit of a hack to detect it because in this
// case we don't want to use the built-in context menu but a
// custom one.
return params.isEditable && params.inputFieldType !== 'none';
},
// shouldShowMenu: (_event: any, params: any) => {
// // params.inputFieldType === 'none' when right-clicking the text
// // editor. This is a bit of a hack to detect it because in this
// // case we don't want to use the built-in context menu but a
// // custom one.
// return params.isEditable && params.inputFieldType !== 'none';
// },
// menu: (actions: any, props: any) => {
// const items = spellCheckerMenuItemsHandler(props.misspelledWord, props.dictionarySuggestions);
// const spellCheckerMenuItems = items.map((item: any) => new MenuItem(item)); //SpellCheckerService.instance().contextMenuItems(props.misspelledWord, props.dictionarySuggestions).map((item: any) => new MenuItem(item));
// // menu: (actions: any, props: any) => {
// // const items = spellCheckerMenuItemsHandler(props.misspelledWord, props.dictionarySuggestions);
// // const spellCheckerMenuItems = items.map((item: any) => new MenuItem(item)); //SpellCheckerService.instance().contextMenuItems(props.misspelledWord, props.dictionarySuggestions).map((item: any) => new MenuItem(item));
// const output = [
// actions.cut(),
// actions.copy(),
// actions.paste(),
// ...spellCheckerMenuItems,
// ];
// // const output = [
// // actions.cut(),
// // actions.copy(),
// // actions.paste(),
// // ...spellCheckerMenuItems,
// // ];
// return output;
// },
});
}
// // return output;
// // },
// });
// }
public window() {
return this.electronWrapper_.window();

View File

@@ -32,52 +32,84 @@ import Setting from '@joplin/lib/models/Setting';
// import eventManager from '@joplin/lib/eventManager';
import { reg } from '@joplin/lib/registry';
// import { reg } from '@joplin/lib/registry';
// Based on http://pypl.github.io/PYPL.html
const topLanguages = [
'python',
'clike',
'javascript',
'jsx',
'php',
'r',
'swift',
'go',
'vb',
'vbscript',
'ruby',
'rust',
'dart',
'lua',
'groovy',
'perl',
'cobol',
'julia',
'haskell',
'pascal',
'css',
require('codemirror/mode/python/python');
require('codemirror/mode/clike/clike');
require('codemirror/mode/javascript/javascript');
require('codemirror/mode/jsx/jsx');
require('codemirror/mode/php/php');
require('codemirror/mode/r/r');
require('codemirror/mode/swift/swift');
require('codemirror/mode/go/go');
require('codemirror/mode/vb/vb');
require('codemirror/mode/vbscript/vbscript');
require('codemirror/mode/ruby/ruby');
require('codemirror/mode/rust/rust');
require('codemirror/mode/dart/dart');
require('codemirror/mode/lua/lua');
require('codemirror/mode/groovy/groovy');
require('codemirror/mode/perl/perl');
require('codemirror/mode/cobol/cobol');
require('codemirror/mode/julia/julia');
require('codemirror/mode/haskell/haskell');
require('codemirror/mode/pascal/pascal');
require('codemirror/mode/css/css');
// Additional languages, not in the PYPL list
'xml', // For HTML too
'markdown',
'yaml',
'shell',
'dockerfile',
'diff',
'erlang',
'sql',
];
// Load Top Modes
for (let i = 0; i < topLanguages.length; i++) {
const mode = topLanguages[i];
// Additional languages, not in the PYPL list
require('codemirror/mode/xml/xml'); // For HTML too
require('codemirror/mode/markdown/markdown');
require('codemirror/mode/yaml/yaml');
require('codemirror/mode/shell/shell');
require('codemirror/mode/dockerfile/dockerfile');
require('codemirror/mode/diff/diff');
require('codemirror/mode/erlang/erlang');
require('codemirror/mode/sql/sql');
if (CodeMirror.modeInfo.find((m: any) => m.mode === mode)) {
require(`codemirror/mode/${mode}/${mode}`);
} else {
reg.logger().error('Cannot find CodeMirror mode: ', mode);
}
}
// // Based on http://pypl.github.io/PYPL.html
// const topLanguages = [
// 'python',
// 'clike',
// 'javascript',
// 'jsx',
// 'php',
// 'r',
// 'swift',
// 'go',
// 'vb',
// 'vbscript',
// 'ruby',
// 'rust',
// 'dart',
// 'lua',
// 'groovy',
// 'perl',
// 'cobol',
// 'julia',
// 'haskell',
// 'pascal',
// 'css',
// // Additional languages, not in the PYPL list
// 'xml', // For HTML too
// 'markdown',
// 'yaml',
// 'shell',
// 'dockerfile',
// 'diff',
// 'erlang',
// 'sql',
// ];
// // Load Top Modes
// for (let i = 0; i < topLanguages.length; i++) {
// const mode = topLanguages[i];
// if (CodeMirror.modeInfo.find((m: any) => m.mode === mode)) {
// require(`codemirror/mode/${mode}/${mode}`);
// } else {
// reg.logger().error('Cannot find CodeMirror mode: ', mode);
// }
// }
export interface EditorProps {
value: string;

View File

@@ -6,7 +6,8 @@ import useScroll from './utils/useScroll';
import styles_ from './styles';
import CommandService from '@joplin/lib/services/CommandService';
import { ToolbarButtonInfo } from '@joplin/lib/services/commands/ToolbarButtonUtils';
import ToggleEditorsButton, { Value as ToggleEditorsButtonValue } from '../../../ToggleEditorsButton/ToggleEditorsButton';
import ToggleEditorsButton from '../../../ToggleEditorsButton/ToggleEditorsButton';
import { Value as ToggleEditorsButtonValue } from '../../../ToggleEditorsButton/types';
import ToolbarButton from '../../../../gui/ToolbarButton/ToolbarButton';
import usePluginServiceRegistration from '../../utils/usePluginServiceRegistration';
import { utils as pluginUtils } from '@joplin/lib/services/plugins/reducer';

View File

@@ -19,6 +19,7 @@ import Note from '@joplin/lib/models/Note';
import Folder from '@joplin/lib/models/Folder';
import { Props } from './types';
import usePrevious from '../hooks/usePrevious';
import itemAnchorRef, { itemAnchorRefs_ } from './itemAnchorRef';
const commands = [
require('./commands/focusElementNoteList'),
@@ -31,15 +32,6 @@ const StyledRoot = styled.div`
border-right: 1px solid ${(props: any) => props.theme.dividerColor};
`;
const itemAnchorRefs_: any = {
current: {},
};
export const itemAnchorRef = (itemId: string) => {
if (itemAnchorRefs_.current[itemId] && itemAnchorRefs_.current[itemId].current) return itemAnchorRefs_.current[itemId].current;
return null;
};
const NoteListComponent = (props: Props) => {
const [dragOverTargetNoteIndex, setDragOverTargetNoteIndex] = useState(null);
const [width, setWidth] = useState(0);

View File

@@ -1,7 +1,7 @@
import { CommandRuntime, CommandDeclaration, CommandContext } from '@joplin/lib/services/CommandService';
import { _ } from '@joplin/lib/locale';
import { stateUtils } from '@joplin/lib/reducer';
import { itemAnchorRef } from '../NoteList';
import itemAnchorRef from '../itemAnchorRef';
export const declaration: CommandDeclaration = {
name: 'focusElementNoteList',

View File

@@ -0,0 +1,8 @@
export const itemAnchorRefs_: any = {
current: {},
};
export default (itemId: string) => {
if (itemAnchorRefs_.current[itemId] && itemAnchorRefs_.current[itemId].current) return itemAnchorRefs_.current[itemId].current;
return null;
};

View File

@@ -37,5 +37,5 @@ export default function(props: Props): any {
};
}, [styleSheetContent]);
return <div style={{ display: 'none' }}></div>;
return null; // <div style={{ display: 'none' }}></div>;
}

View File

@@ -1,17 +1,6 @@
import * as React from 'react';
import styles_ from './styles';
import { ToolbarButtonInfo } from '@joplin/lib/services/commands/ToolbarButtonUtils';
export enum Value {
Markdown = 'markdown',
RichText = 'richText',
}
export interface Props {
themeId: number;
value: Value;
toolbarButtonInfo: ToolbarButtonInfo;
}
import { Props } from './types';
export default function ToggleEditorsButton(props: Props) {
const style = styles_(props);

View File

@@ -1,4 +1,4 @@
import { Props, Value } from '../ToggleEditorsButton';
import { Props, Value } from '../types';
const { buildStyle } = require('@joplin/lib/theme');
export default function styles(props: Props) {

View File

@@ -0,0 +1,12 @@
import { ToolbarButtonInfo } from '@joplin/lib/services/commands/ToolbarButtonUtils';
export enum Value {
Markdown = 'markdown',
RichText = 'richText',
}
export interface Props {
themeId: number;
value: Value;
toolbarButtonInfo: ToolbarButtonInfo;
}

View File

@@ -1,6 +1,7 @@
import * as React from 'react';
import ToolbarButton from './ToolbarButton/ToolbarButton';
import ToggleEditorsButton, { Value } from './ToggleEditorsButton/ToggleEditorsButton';
import ToggleEditorsButton from './ToggleEditorsButton/ToggleEditorsButton';
import { Value } from './ToggleEditorsButton/types';
import ToolbarSpace from './ToolbarSpace';
const { connect } = require('react-redux');
const { themeStyle } = require('@joplin/lib/theme');

View File

@@ -42,7 +42,7 @@
</head>
<body>
<div id="react-root"></div>
<script src="main-html.js"></script>
<script src="main-html.bundle.js"></script>
<style>
/* Disable dragging of links (which are often buttons) */
a:not([draggable=true]), img:not([draggable=true]) {

View File

@@ -3,12 +3,15 @@
// Disable React message in console "Download the React DevTools for a better development experience"
// https://stackoverflow.com/questions/42196819/disable-hide-download-the-react-devtools#42196820
// eslint-disable-next-line no-undef
__REACT_DEVTOOLS_GLOBAL_HOOK__ = {
supportsFiber: true,
inject: function() {},
onCommitFiberRoot: function() {},
onCommitFiberUnmount: function() {},
};
if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined') {
// eslint-disable-next-line no-undef
__REACT_DEVTOOLS_GLOBAL_HOOK__ = {
supportsFiber: true,
inject: function() {},
onCommitFiberRoot: function() {},
onCommitFiberUnmount: function() {},
};
}
const app = require('./app').default;
const Folder = require('@joplin/lib/models/Folder').default;

View File

@@ -6,6 +6,8 @@
"private": true,
"scripts": {
"dist": "yarn run electronRebuild && npx electron-builder",
"pack-html": "rollup --config rollup-main-html.config.js",
"pack-main": "rollup --config rollup-main.config.js",
"build": "gulp build",
"postinstall": "yarn run build",
"electronBuilder": "gulp electronBuilder",
@@ -36,6 +38,9 @@
"build/images/**",
"build/defaultPlugins/**"
],
"files": [
"!node_modules/**/*"
],
"afterAllArtifactBuild": "./generateSha512.js",
"asar": true,
"asarUnpack": "./node_modules/node-notifier/vendor/**",
@@ -109,6 +114,9 @@
"homepage": "https://github.com/laurent22/joplin#readme",
"devDependencies": {
"@joplin/tools": "~2.11",
"@rollup/plugin-commonjs": "24.1.0",
"@rollup/plugin-json": "6.0.0",
"@rollup/plugin-node-resolve": "15.0.2",
"@testing-library/react-hooks": "8.0.1",
"@types/jest": "29.2.6",
"@types/node": "18.11.18",
@@ -126,6 +134,7 @@
"js-sha512": "0.8.0",
"nan": "2.17.0",
"react-test-renderer": "18.2.0",
"rollup": "3.21.0",
"typescript": "4.9.4"
},
"optionalDependencies": {

View File

@@ -0,0 +1,24 @@
const commonjs = require('@rollup/plugin-commonjs');
const nodeResolve = require('@rollup/plugin-node-resolve');
const pluginJson = require('@rollup/plugin-json');
module.exports = {
input: 'main-html.js',
output: {
file: 'main-html.bundle.js',
format: 'cjs',
},
plugins: [
nodeResolve(),
pluginJson(),
commonjs({
dynamicRequireTargets: [
'codemirror/mode/python/python',
],
}),
],
external: [
'keytar',
'fsevents',
],
};

View File

@@ -0,0 +1,16 @@
const commonjs = require('@rollup/plugin-commonjs');
const nodeResolve = require('@rollup/plugin-node-resolve');
const pluginJson = require('@rollup/plugin-json');
module.exports = {
input: 'main.source.js',
output: {
file: 'main.js',
format: 'cjs',
},
plugins: [
nodeResolve(),
pluginJson(),
commonjs(),
],
};

View File

@@ -9,11 +9,12 @@ import { masterKeyEnabled, setMasterKeyEnabled } from '../../services/synchroniz
import MasterKey from '../../models/MasterKey';
import { reg } from '../../registry';
import Setting from '../../models/Setting';
const { useCallback, useEffect, useState } = shim.react();
type PasswordChecks = Record<string, boolean>;
export const useStats = () => {
const { useEffect, useState } = shim.react();
const [stats, setStats] = useState<EncryptedItemsStats>({ encrypted: null, total: null });
const [statsUpdateTime, setStatsUpdateTime] = useState<number>(0);
@@ -75,6 +76,7 @@ export const dontReencryptData = () => {
};
export const useToggleShowDisabledMasterKeys = () => {
const { useState } = shim.react();
const [showDisabledMasterKeys, setShowDisabledMasterKeys] = useState<boolean>(false);
const toggleShowDisabledMasterKeys = () => {
@@ -109,6 +111,8 @@ export const onMasterPasswordSave = (masterPasswordInput: string) => {
};
export const useInputMasterPassword = (masterKeys: MasterKeyEntity[], activeMasterKeyId: string) => {
const { useCallback, useState } = shim.react();
const [inputMasterPassword, setInputMasterPassword] = useState<string>('');
const onMasterPasswordSave = useCallback(async () => {
@@ -128,6 +132,8 @@ export const useInputMasterPassword = (masterKeys: MasterKeyEntity[], activeMast
};
export const useInputPasswords = (propsPasswords: Record<string, string>) => {
const { useCallback, useEffect, useState } = shim.react();
const [inputPasswords, setInputPasswords] = useState<Record<string, string>>(propsPasswords);
useEffect(() => {
@@ -147,6 +153,8 @@ export const useInputPasswords = (propsPasswords: Record<string, string>) => {
};
export const usePasswordChecker = (masterKeys: MasterKeyEntity[], activeMasterKeyId: string, masterPassword: string, passwords: Record<string, string>) => {
const { useState } = shim.react();
const [passwordChecks, setPasswordChecks] = useState<PasswordChecks>({});
// "masterPasswordKeys" are the master key that can be decrypted with the

View File

@@ -1,5 +1,4 @@
import shim from '../shim';
const { useEffect } = shim.react();
export interface AsyncEffectEvent {
cancelled: boolean;
@@ -8,6 +7,8 @@ export interface AsyncEffectEvent {
export type EffectFunction = (event: AsyncEffectEvent)=> Promise<void>;
export default function(effect: EffectFunction, dependencies: any[]) {
const { useEffect } = shim.react();
useEffect(() => {
const event: AsyncEffectEvent = { cancelled: false };
void effect(event);

View File

@@ -1,5 +1,4 @@
import shim from '../shim';
const { useCallback, useEffect, useState } = shim.react();
import useEventListener from './useEventListener';
interface Size {
@@ -8,6 +7,8 @@ interface Size {
}
function useElementSize(elementRef: any): Size {
const { useCallback, useEffect, useState } = shim.react();
const [size, setSize] = useState({
width: 0,
height: 0,

View File

@@ -1,11 +1,12 @@
import shim from '../shim';
const { useEffect, useRef } = shim.react();
function useEventListener(
eventName: any,
handler: any,
element?: any
) {
const { useEffect, useRef } = shim.react();
// Create a ref that stores handler
const savedHandler = useRef();

View File

@@ -7,8 +7,6 @@ import SyncTargetRegistry from '../SyncTargetRegistry';
import time from '../time';
import FileHandler, { SettingValues } from './settings/FileHandler';
import Logger from '../Logger';
import mergeGlobalAndLocalSettings from '../services/profileConfig/mergeGlobalAndLocalSettings';
import splitGlobalAndLocalSettings from '../services/profileConfig/splitGlobalAndLocalSettings';
const { sprintf } = require('sprintf-js');
const ObjectUtils = require('../ObjectUtils');
const { toTitleCase } = require('../string-utils.js');
@@ -16,6 +14,44 @@ const { rtrimSlashes, toSystemSlashes } = require('../path-utils');
const logger = Logger.create('models/Setting');
const mergeGlobalAndLocalSettings = (rootSettings: Record<string, any>, subProfileSettings: Record<string, any>) => {
const output: Record<string, any> = { ...subProfileSettings };
for (const k of Object.keys(output)) {
const md = Setting.settingMetadata(k);
if (md.isGlobal) {
delete output[k];
if (k in rootSettings) output[k] = rootSettings[k];
}
}
for (const k of Object.keys(rootSettings)) {
const md = Setting.settingMetadata(k);
if (md.isGlobal) {
output[k] = rootSettings[k];
}
}
return output;
};
const splitGlobalAndLocalSettings = (settings: SettingValues) => {
const globalSettings: SettingValues = {};
const localSettings: SettingValues = {};
for (const [k, v] of Object.entries(settings)) {
const md = Setting.settingMetadata(k);
if (md.isGlobal) {
globalSettings[k] = v;
} else {
localSettings[k] = v;
}
}
return { globalSettings, localSettings };
};
export enum SettingItemType {
Int = 1,
String = 2,
@@ -219,8 +255,6 @@ const userSettingMigration: UserSettingMigration[] = [
class Setting extends BaseModel {
public static schemaUrl = 'https://joplinapp.org/schema/settings.json';
// For backward compatibility
public static TYPE_INT = SettingItemType.Int;
public static TYPE_STRING = SettingItemType.String;

View File

@@ -1,6 +1,6 @@
import Logger from '../../Logger';
import shim from '../../shim';
import Setting from '../Setting';
import { schemaUrl } from './types';
const logger = Logger.create('Settings');
@@ -41,7 +41,7 @@ export default class FileHandler {
public async save(values: SettingValues) {
const json = `${JSON.stringify({
'$schema': Setting.schemaUrl,
'$schema': schemaUrl,
...values,
}, null, '\t')}\n`;

View File

@@ -0,0 +1,2 @@
// eslint-disable-next-line import/prefer-default-export
export const schemaUrl = 'https://joplinapp.org/schema/settings.json';

View File

@@ -1,22 +0,0 @@
import Setting from '../../models/Setting';
export default (rootSettings: Record<string, any>, subProfileSettings: Record<string, any>) => {
const output: Record<string, any> = { ...subProfileSettings };
for (const k of Object.keys(output)) {
const md = Setting.settingMetadata(k);
if (md.isGlobal) {
delete output[k];
if (k in rootSettings) output[k] = rootSettings[k];
}
}
for (const k of Object.keys(rootSettings)) {
const md = Setting.settingMetadata(k);
if (md.isGlobal) {
output[k] = rootSettings[k];
}
}
return output;
};

View File

@@ -1,19 +0,0 @@
import Setting from '../../models/Setting';
import { SettingValues } from '../../models/settings/FileHandler';
export default (settings: SettingValues) => {
const globalSettings: SettingValues = {};
const localSettings: SettingValues = {};
for (const [k, v] of Object.entries(settings)) {
const md = Setting.settingMetadata(k);
if (md.isGlobal) {
globalSettings[k] = v;
} else {
localSettings[k] = v;
}
}
return { globalSettings, localSettings };
};

View File

@@ -3,7 +3,6 @@ import MigrationHandler from '../MigrationHandler';
import Setting from '../../../models/Setting';
import { reg } from '../../../registry';
import { appTypeToLockType } from '../LockHandler';
const { useEffect, useState } = shim.react();
export interface SyncTargetUpgradeResult {
done: boolean;
@@ -11,6 +10,8 @@ export interface SyncTargetUpgradeResult {
}
export default function useSyncTargetUpgrade(): SyncTargetUpgradeResult {
const { useEffect, useState } = shim.react();
const [upgradeResult, setUpgradeResult] = useState({
done: false,
error: null,

143
yarn.lock
View File

@@ -6253,6 +6253,9 @@ __metadata:
"@joplin/lib": ~2.11
"@joplin/renderer": ~2.11
"@joplin/tools": ~2.11
"@rollup/plugin-commonjs": 24.1.0
"@rollup/plugin-json": 6.0.0
"@rollup/plugin-node-resolve": 15.0.2
"@testing-library/react-hooks": 8.0.1
"@types/jest": 29.2.6
"@types/node": 18.11.18
@@ -6300,6 +6303,7 @@ __metadata:
redux: 4.2.1
reselect: 4.1.8
roboto-fontface: 0.10.0
rollup: 3.21.0
smalltalk: 2.5.1
sqlite3: 5.1.6
styled-components: 5.3.9
@@ -6912,6 +6916,13 @@ __metadata:
languageName: node
linkType: hard
"@jridgewell/sourcemap-codec@npm:^1.4.13":
version: 1.4.15
resolution: "@jridgewell/sourcemap-codec@npm:1.4.15"
checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8
languageName: node
linkType: hard
"@jridgewell/trace-mapping@npm:0.3.9":
version: 0.3.9
resolution: "@jridgewell/trace-mapping@npm:0.3.9"
@@ -8799,6 +8810,74 @@ __metadata:
languageName: node
linkType: hard
"@rollup/plugin-commonjs@npm:24.1.0":
version: 24.1.0
resolution: "@rollup/plugin-commonjs@npm:24.1.0"
dependencies:
"@rollup/pluginutils": ^5.0.1
commondir: ^1.0.1
estree-walker: ^2.0.2
glob: ^8.0.3
is-reference: 1.2.1
magic-string: ^0.27.0
peerDependencies:
rollup: ^2.68.0||^3.0.0
peerDependenciesMeta:
rollup:
optional: true
checksum: 42faafc9bc8e04d75c86bb50d693ebb9c5eee19bf9ab3c09780b872547d12ff5ea85cfec7da75f5176d0aa4b5233101f667f44b85b331450a7bb14c95180852e
languageName: node
linkType: hard
"@rollup/plugin-json@npm:6.0.0":
version: 6.0.0
resolution: "@rollup/plugin-json@npm:6.0.0"
dependencies:
"@rollup/pluginutils": ^5.0.1
peerDependencies:
rollup: ^1.20.0||^2.0.0||^3.0.0
peerDependenciesMeta:
rollup:
optional: true
checksum: 77cfc941edaf77a5307977704ffaba706d83bea66f265b2b68f14be2a0af6d08b0fb1b04fdd773146c84cc70938ff64b00ae946808fd6ac057058af824d78128
languageName: node
linkType: hard
"@rollup/plugin-node-resolve@npm:15.0.2":
version: 15.0.2
resolution: "@rollup/plugin-node-resolve@npm:15.0.2"
dependencies:
"@rollup/pluginutils": ^5.0.1
"@types/resolve": 1.20.2
deepmerge: ^4.2.2
is-builtin-module: ^3.2.1
is-module: ^1.0.0
resolve: ^1.22.1
peerDependencies:
rollup: ^2.78.0||^3.0.0
peerDependenciesMeta:
rollup:
optional: true
checksum: 328eafee06ff967a36441b55e77fbd0d4f599d256e5d1977800ee71915846c46bc1b6185df35c7b512ad2b4023b05b65a332be77b8b00b9d8a20f87d056b8166
languageName: node
linkType: hard
"@rollup/pluginutils@npm:^5.0.1":
version: 5.0.2
resolution: "@rollup/pluginutils@npm:5.0.2"
dependencies:
"@types/estree": ^1.0.0
estree-walker: ^2.0.2
picomatch: ^2.3.1
peerDependencies:
rollup: ^1.20.0||^2.0.0||^3.0.0
peerDependenciesMeta:
rollup:
optional: true
checksum: edea15e543bebc7dcac3b0ac8bc7b8e8e6dbd46e2864dbe5dd28072de1fbd5b0e10d545a610c0edaa178e8a7ac432e2a2a52e547ece1308471412caba47db8ce
languageName: node
linkType: hard
"@seiyab/eslint-plugin-react-hooks@npm:4.5.1-beta.0":
version: 4.5.1-beta.0
resolution: "@seiyab/eslint-plugin-react-hooks@npm:4.5.1-beta.0"
@@ -9274,6 +9353,13 @@ __metadata:
languageName: node
linkType: hard
"@types/estree@npm:^1.0.0":
version: 1.0.1
resolution: "@types/estree@npm:1.0.1"
checksum: e9aa175eacb797216fafce4d41e8202c7a75555bc55232dee0f9903d7171f8f19f0ae7d5191bb1a88cb90e65468be508c0df850a9fb81b4433b293a5a749899d
languageName: node
linkType: hard
"@types/express-serve-static-core@npm:^4.17.18":
version: 4.17.26
resolution: "@types/express-serve-static-core@npm:4.17.26"
@@ -9880,6 +9966,13 @@ __metadata:
languageName: node
linkType: hard
"@types/resolve@npm:1.20.2":
version: 1.20.2
resolution: "@types/resolve@npm:1.20.2"
checksum: 61c2cad2499ffc8eab36e3b773945d337d848d3ac6b7b0a87c805ba814bc838ef2f262fc0f109bfd8d2e0898ff8bd80ad1025f9ff64f1f71d3d4294c9f14e5f6
languageName: node
linkType: hard
"@types/responselike@npm:*, @types/responselike@npm:^1.0.0":
version: 1.0.0
resolution: "@types/responselike@npm:1.0.0"
@@ -12898,7 +12991,7 @@ __metadata:
languageName: node
linkType: hard
"builtin-modules@npm:3.3.0":
"builtin-modules@npm:3.3.0, builtin-modules@npm:^3.3.0":
version: 3.3.0
resolution: "builtin-modules@npm:3.3.0"
checksum: db021755d7ed8be048f25668fe2117620861ef6703ea2c65ed2779c9e3636d5c3b82325bd912244293959ff3ae303afa3471f6a15bf5060c103e4cc3a839749d
@@ -18498,6 +18591,13 @@ __metadata:
languageName: node
linkType: hard
"estree-walker@npm:^2.0.2":
version: 2.0.2
resolution: "estree-walker@npm:2.0.2"
checksum: 6151e6f9828abe2259e57f5fd3761335bb0d2ebd76dc1a01048ccee22fabcfef3c0859300f6d83ff0d1927849368775ec5a6d265dde2f6de5a1be1721cd94efc
languageName: node
linkType: hard
"esutils@npm:^2.0.2":
version: 2.0.3
resolution: "esutils@npm:2.0.3"
@@ -22164,6 +22264,15 @@ __metadata:
languageName: node
linkType: hard
"is-builtin-module@npm:^3.2.1":
version: 3.2.1
resolution: "is-builtin-module@npm:3.2.1"
dependencies:
builtin-modules: ^3.3.0
checksum: e8f0ffc19a98240bda9c7ada84d846486365af88d14616e737d280d378695c8c448a621dcafc8332dbf0fcd0a17b0763b845400709963fa9151ddffece90ae88
languageName: node
linkType: hard
"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.4":
version: 1.2.4
resolution: "is-callable@npm:1.2.4"
@@ -22602,6 +22711,15 @@ __metadata:
languageName: node
linkType: hard
"is-reference@npm:1.2.1":
version: 1.2.1
resolution: "is-reference@npm:1.2.1"
dependencies:
"@types/estree": "*"
checksum: e7b48149f8abda2c10849ea51965904d6a714193d68942ad74e30522231045acf06cbfae5a4be2702fede5d232e61bf50b3183acdc056e6e3afe07fcf4f4b2bc
languageName: node
linkType: hard
"is-regex@npm:^1.0.4, is-regex@npm:^1.1.4, is-regex@npm:~1.1.3":
version: 1.1.4
resolution: "is-regex@npm:1.1.4"
@@ -26000,6 +26118,15 @@ __metadata:
languageName: node
linkType: hard
"magic-string@npm:^0.27.0":
version: 0.27.0
resolution: "magic-string@npm:0.27.0"
dependencies:
"@jridgewell/sourcemap-codec": ^1.4.13
checksum: 273faaa50baadb7a2df6e442eac34ad611304fc08fe16e24fe2e472fd944bfcb73ffb50d2dc972dc04e92784222002af46868cb9698b1be181c81830fd95a13e
languageName: node
linkType: hard
"magicli@npm:0.0.5":
version: 0.0.5
resolution: "magicli@npm:0.0.5"
@@ -33263,6 +33390,20 @@ __metadata:
languageName: node
linkType: hard
"rollup@npm:3.21.0":
version: 3.21.0
resolution: "rollup@npm:3.21.0"
dependencies:
fsevents: ~2.3.2
dependenciesMeta:
fsevents:
optional: true
bin:
rollup: dist/bin/rollup
checksum: f3294d712147c0975c59ff81b3010dc08d07743cdad72fbe12879044b3e467139b3c2aeec85768656c4f7ec6a7b3d19354a78fc2050044bf8e90a499e145e31e
languageName: node
linkType: hard
"root@workspace:.":
version: 0.0.0-use.local
resolution: "root@workspace:."