1
0
mirror of https://github.com/laurent22/joplin.git synced 2026-02-28 09:22:25 +02:00

Compare commits

..

8 Commits

Author SHA1 Message Date
Laurent Cozic
84a793270d move back to test 2021-05-21 15:15:48 +02:00
Laurent Cozic
5f8b73350d other tdsts 2021-05-21 15:09:08 +02:00
Laurent Cozic
a733cb0394 services 2021-05-21 13:44:57 +02:00
Laurent Cozic
7da4cb0d80 sync tests 2021-05-21 13:22:50 +02:00
Laurent Cozic
3233082b4c move more 2021-05-21 13:14:45 +02:00
Laurent Cozic
c782f5e981 move 2021-05-21 13:01:43 +02:00
Laurent Cozic
db51e2dd4b cli setup 2021-05-21 12:42:19 +02:00
Laurent Cozic
f00f3d7f04 test move 2021-05-21 12:33:33 +02:00
10 changed files with 159 additions and 131 deletions

View File

@@ -83,9 +83,6 @@ packages/app-cli/tests/MdToHtml.js.map
packages/app-cli/tests/MdToMd.d.ts
packages/app-cli/tests/MdToMd.js
packages/app-cli/tests/MdToMd.js.map
packages/app-cli/tests/services/keychain/KeychainService.d.ts
packages/app-cli/tests/services/keychain/KeychainService.js
packages/app-cli/tests/services/keychain/KeychainService.js.map
packages/app-cli/tests/services/plugins/PluginService.d.ts
packages/app-cli/tests/services/plugins/PluginService.js
packages/app-cli/tests/services/plugins/PluginService.js.map
@@ -1169,6 +1166,9 @@ packages/lib/services/keychain/KeychainServiceDriver.node.js.map
packages/lib/services/keychain/KeychainServiceDriverBase.d.ts
packages/lib/services/keychain/KeychainServiceDriverBase.js
packages/lib/services/keychain/KeychainServiceDriverBase.js.map
packages/lib/services/keychain/keychainService.test.d.ts
packages/lib/services/keychain/keychainService.test.js
packages/lib/services/keychain/keychainService.test.js.map
packages/lib/services/plugins/BasePluginRunner.d.ts
packages/lib/services/plugins/BasePluginRunner.js
packages/lib/services/plugins/BasePluginRunner.js.map

6
.gitignore vendored
View File

@@ -69,9 +69,6 @@ packages/app-cli/tests/MdToHtml.js.map
packages/app-cli/tests/MdToMd.d.ts
packages/app-cli/tests/MdToMd.js
packages/app-cli/tests/MdToMd.js.map
packages/app-cli/tests/services/keychain/KeychainService.d.ts
packages/app-cli/tests/services/keychain/KeychainService.js
packages/app-cli/tests/services/keychain/KeychainService.js.map
packages/app-cli/tests/services/plugins/PluginService.d.ts
packages/app-cli/tests/services/plugins/PluginService.js
packages/app-cli/tests/services/plugins/PluginService.js.map
@@ -1155,6 +1152,9 @@ packages/lib/services/keychain/KeychainServiceDriver.node.js.map
packages/lib/services/keychain/KeychainServiceDriverBase.d.ts
packages/lib/services/keychain/KeychainServiceDriverBase.js
packages/lib/services/keychain/KeychainServiceDriverBase.js.map
packages/lib/services/keychain/keychainService.test.d.ts
packages/lib/services/keychain/keychainService.test.js
packages/lib/services/keychain/keychainService.test.js.map
packages/lib/services/plugins/BasePluginRunner.d.ts
packages/lib/services/plugins/BasePluginRunner.js
packages/lib/services/plugins/BasePluginRunner.js.map

View File

@@ -1,6 +1,6 @@
{
"name": "@joplin/app-desktop",
"version": "2.0.2",
"version": "2.0.1",
"lockfileVersion": 1,
"requires": true,
"dependencies": {

View File

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

View File

@@ -3,11 +3,8 @@ import { _ } from './locale';
const { rtrimSlashes } = require('./path-utils.js');
import JoplinError from './JoplinError';
import { Env } from './models/Setting';
import Logger from './Logger';
const { stringify } = require('query-string');
const logger = Logger.create('JoplinServerApi');
interface Options {
baseUrl(): string;
username(): string;
@@ -136,78 +133,71 @@ export default class JoplinServerApi {
url += stringify(query);
}
try {
if (this.debugRequests_) {
logger.debug(this.requestToCurl_(url, fetchOptions));
}
let response: any = null;
let response: any = null;
if (options.source == 'file' && (method == 'POST' || method == 'PUT')) {
if (fetchOptions.path) {
const fileStat = await shim.fsDriver().stat(fetchOptions.path);
if (fileStat) fetchOptions.headers['Content-Length'] = `${fileStat.size}`;
}
response = await shim.uploadBlob(url, fetchOptions);
} else if (options.target == 'string') {
if (typeof body === 'string') fetchOptions.headers['Content-Length'] = `${shim.stringByteLength(body)}`;
response = await shim.fetch(url, fetchOptions);
} else {
// file
response = await shim.fetchBlob(url, fetchOptions);
}
const responseText = await response.text();
if (this.debugRequests_) {
logger.debug('Response', responseText);
}
// Creates an error object with as much data as possible as it will appear in the log, which will make debugging easier
const newError = (message: string, code: number = 0) => {
// Gives a shorter response for error messages. Useful for cases where a full HTML page is accidentally loaded instead of
// JSON. That way the error message will still show there's a problem but without filling up the log or screen.
const shortResponseText = (`${responseText}`).substr(0, 1024);
// return new JoplinError(`${method} ${path}: ${message} (${code}): ${shortResponseText}`, code);
return new JoplinError(message, code, `${method} ${path}: ${message} (${code}): ${shortResponseText}`);
};
let responseJson_: any = null;
const loadResponseJson = async () => {
if (!responseText) return null;
if (responseJson_) return responseJson_;
responseJson_ = JSON.parse(responseText);
if (!responseJson_) throw newError('Cannot parse JSON response', response.status);
return responseJson_;
};
if (!response.ok) {
if (options.target === 'file') throw newError('fetchBlob error', response.status);
let json = null;
try {
json = await loadResponseJson();
} catch (error) {
// Just send back the plain text in newErro()
}
if (json && json.error) {
throw newError(`${json.error}`, json.code ? json.code : response.status);
}
throw newError('Unknown error', response.status);
}
if (options.responseFormat === 'text') return responseText;
const output = await loadResponseJson();
return output;
} catch (error) {
if (error.code !== 404) {
logger.warn(this.requestToCurl_(url, fetchOptions));
logger.warn(error);
}
throw error;
if (this.debugRequests_) {
console.info('Joplin API Call', `${method} ${url}`, headers, options);
console.info(this.requestToCurl_(url, fetchOptions));
}
if (options.source == 'file' && (method == 'POST' || method == 'PUT')) {
if (fetchOptions.path) {
const fileStat = await shim.fsDriver().stat(fetchOptions.path);
if (fileStat) fetchOptions.headers['Content-Length'] = `${fileStat.size}`;
}
response = await shim.uploadBlob(url, fetchOptions);
} else if (options.target == 'string') {
if (typeof body === 'string') fetchOptions.headers['Content-Length'] = `${shim.stringByteLength(body)}`;
response = await shim.fetch(url, fetchOptions);
} else {
// file
response = await shim.fetchBlob(url, fetchOptions);
}
const responseText = await response.text();
if (this.debugRequests_) {
console.info('Joplin API Response', responseText);
}
// Creates an error object with as much data as possible as it will appear in the log, which will make debugging easier
const newError = (message: string, code: number = 0) => {
// Gives a shorter response for error messages. Useful for cases where a full HTML page is accidentally loaded instead of
// JSON. That way the error message will still show there's a problem but without filling up the log or screen.
const shortResponseText = (`${responseText}`).substr(0, 1024);
// return new JoplinError(`${method} ${path}: ${message} (${code}): ${shortResponseText}`, code);
return new JoplinError(message, code, `${method} ${path}: ${message} (${code}): ${shortResponseText}`);
};
let responseJson_: any = null;
const loadResponseJson = async () => {
if (!responseText) return null;
if (responseJson_) return responseJson_;
responseJson_ = JSON.parse(responseText);
if (!responseJson_) throw newError('Cannot parse JSON response', response.status);
return responseJson_;
};
if (!response.ok) {
if (options.target === 'file') throw newError('fetchBlob error', response.status);
let json = null;
try {
json = await loadResponseJson();
} catch (error) {
// Just send back the plain text in newErro()
}
if (json && json.error) {
throw newError(`${json.error}`, json.code ? json.code : response.status);
}
throw newError('Unknown error', response.status);
}
if (options.responseFormat === 'text') return responseText;
const output = await loadResponseJson();
return output;
}
}

View File

@@ -1,8 +1,17 @@
const { afterEachCleanUp } = require('./testing/test-utils.js');
const { shimInit } = require('./shim-init-node.js');
const shim = require('./shim').default;
const sharp = require('sharp');
shimInit(sharp, null);
let keytar;
try {
keytar = shim.platformSupportsKeyChain() ? require('keytar') : null;
} catch (error) {
console.error('Cannot load keytar - keychain support will be disabled', error);
keytar = null;
}
shimInit(sharp, keytar);
global.afterEach(async () => {
await afterEachCleanUp();

View File

@@ -4059,6 +4059,24 @@
"verror": "1.10.0"
}
},
"keytar": {
"version": "7.7.0",
"resolved": "https://registry.npmjs.org/keytar/-/keytar-7.7.0.tgz",
"integrity": "sha512-YEY9HWqThQc5q5xbXbRwsZTh2PJ36OSYRjSv3NN2xf5s5dpLTjEZnC2YikR29OaVybf9nQ0dJ/80i40RS97t/A==",
"dev": true,
"requires": {
"node-addon-api": "^3.0.0",
"prebuild-install": "^6.0.0"
},
"dependencies": {
"node-addon-api": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.0.tgz",
"integrity": "sha512-kcwSAWhPi4+QzAtsL2+2s/awvDo2GKLsvMCwNRxb5BUshteXU8U97NCyvQDsGKs/m0He9WcG4YWew/BnuLx++w==",
"dev": true
}
}
},
"kind-of": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",

View File

@@ -21,6 +21,7 @@
"@types/fs-extra": "^9.0.6",
"jest": "^26.6.3",
"sharp": "^0.26.2",
"keytar": "^7.0.0",
"typescript": "^4.0.5",
"clean-html": "^1.5.0"
},

View File

@@ -1,7 +1,8 @@
import KeychainService from '@joplin/lib/services/keychain/KeychainService';
import shim from '@joplin/lib/shim';
import Setting from '@joplin/lib/models/Setting';
import { db, setupDatabaseAndSynchronizer, switchClient } from '@joplin/lib/testing/test-utils';
import KeychainService from '../../services/keychain/KeychainService';
import shim from '../../shim';
import Setting from '../../models/Setting';
const { db, setupDatabaseAndSynchronizer, switchClient } = require('../../testing/test-utils.js');
function describeIfCompatible(name: string, fn: any, elseFn: any) {
if (['win32', 'darwin'].includes(shim.platformName())) {

View File

@@ -6,13 +6,13 @@ msgid ""
msgstr ""
"Project-Id-Version: Joplin-CLI 1.0.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: 南宫小骏 <jackytsu@vip.qq.com>\n"
"Language-Team: zh_CN <jackytsu.vip.qq.com>\n"
"Last-Translator: Yang Zhang <zyangmath@gmail.com>\n"
"Language-Team: zh_CN <yaozeye@yaozeye.onmicrosoft.com>\n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.4.3\n"
"X-Generator: Poedit 2.4.2\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: packages/app-desktop/bridge.js:106 packages/app-desktop/bridge.js:110
@@ -119,11 +119,11 @@ msgstr "下载"
#: packages/app-desktop/checkForUpdates.js:189
msgid "Skip this version"
msgstr "跳过该版本"
msgstr ""
#: packages/app-desktop/checkForUpdates.js:189
msgid "Full changelog"
msgstr "完整更新记录"
msgstr ""
#: packages/app-desktop/gui/NoteRevisionViewer.min.js:75
#, javascript-format
@@ -267,10 +267,12 @@ msgid "Retry"
msgstr "重试"
#: packages/app-desktop/gui/StatusScreen/StatusScreen.js:113
#, fuzzy
msgid "Advanced tools"
msgstr "高级工具"
msgstr "高级选项"
#: packages/app-desktop/gui/StatusScreen/StatusScreen.js:115
#, fuzzy
msgid "Export debug report"
msgstr "导出调试报告"
@@ -328,23 +330,23 @@ msgstr "复选框列表"
#: packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/utils/setupToolbarButtons.js:17
msgid "Highlight"
msgstr "突出显示"
msgstr ""
#: packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/utils/setupToolbarButtons.js:22
msgid "Strikethrough"
msgstr "删除线"
msgstr ""
#: packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/utils/setupToolbarButtons.js:27
msgid "Insert"
msgstr "插入"
msgstr ""
#: packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/utils/setupToolbarButtons.js:33
msgid "Superscript"
msgstr "上标"
msgstr ""
#: packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/utils/setupToolbarButtons.js:39
msgid "Subscript"
msgstr "订阅"
msgstr ""
#: packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.js:544
#: packages/app-mobile/components/screens/Note.js:1016
@@ -505,8 +507,9 @@ msgid "Delete line"
msgstr "删除行"
#: packages/app-desktop/gui/NoteEditor/commands/editorCommandDeclarations.js:92
#, fuzzy
msgid "Duplicate line"
msgstr "复制行"
msgstr "创建副本"
#: packages/app-desktop/gui/NoteEditor/commands/editorCommandDeclarations.js:96
msgid "Undo"
@@ -697,11 +700,11 @@ msgstr "保存"
msgid ""
"Safe mode is currently active. Note rendering and all plugins are "
"temporarily disabled."
msgstr "安全模式当前已被激活。笔记渲染和所有的插件被临时禁用。"
msgstr ""
#: packages/app-desktop/gui/MainScreen/MainScreen.js:438
msgid "Disable safe mode and restart"
msgstr "禁用安全模式并重启"
msgstr ""
#: packages/app-desktop/gui/MainScreen/MainScreen.js:442
msgid ""
@@ -743,15 +746,15 @@ msgstr "更多信息"
#: packages/app-desktop/gui/MainScreen/MainScreen.js:468
#, javascript-format
msgid "%s (%s) would like to share a notebook with you."
msgstr "%s (%s) 想要分享笔记本给你。"
msgstr ""
#: packages/app-desktop/gui/MainScreen/MainScreen.js:470
msgid "Accept"
msgstr "接受"
msgstr ""
#: packages/app-desktop/gui/MainScreen/MainScreen.js:472
msgid "Reject"
msgstr "拒绝"
msgstr ""
#: packages/app-desktop/gui/MainScreen/MainScreen.js:476
msgid "Some items cannot be synchronised."
@@ -791,11 +794,11 @@ msgstr "新建待办事项"
#: packages/app-desktop/gui/MainScreen/commands/toggleNoteList.js:18
msgid "Toggle note list"
msgstr "切换笔记列表"
msgstr "显示/隐藏笔记列表"
#: packages/app-desktop/gui/MainScreen/commands/toggleSideBar.js:18
msgid "Toggle sidebar"
msgstr "切换边栏"
msgstr "显示/隐藏边栏"
#: packages/app-desktop/gui/MainScreen/commands/editAlarm.js:20
#: packages/app-mobile/components/SelectDateTimeDialog.js:84
@@ -835,8 +838,9 @@ msgid "Toggle editors"
msgstr "切换编辑器"
#: packages/app-desktop/gui/MainScreen/commands/showShareFolderDialog.js:16
#, fuzzy
msgid "Share notebook..."
msgstr "分享笔记..."
msgstr "分享笔记..."
#: packages/app-desktop/gui/MainScreen/commands/toggleLayoutMoveMode.js:16
msgid "Change application layout"
@@ -913,7 +917,7 @@ msgstr "令牌已复制到剪贴板!"
#: packages/app-desktop/gui/ClipperConfigScreen.min.js:44
msgid "Are you sure you want to renew the authorisation token?"
msgstr "确定要更新授权令牌吗?"
msgstr ""
#: packages/app-desktop/gui/ClipperConfigScreen.min.js:84
msgid "The web clipper service is enabled and set to auto-start."
@@ -992,7 +996,7 @@ msgstr "该授权令牌仅用于允许第三方应用程序访问 Joplin。"
#: packages/app-desktop/gui/ClipperConfigScreen.min.js:222
msgid "Renew token"
msgstr "更新令牌"
msgstr ""
#: packages/app-desktop/gui/MenuBar.js:167
#, javascript-format
@@ -1171,7 +1175,7 @@ msgstr "以下笔记已被导入: %s"
#: packages/app-desktop/gui/utils/NoteListUtils.js:44
msgid "Duplicate"
msgstr "复制"
msgstr "创建副本"
#: packages/app-desktop/gui/utils/NoteListUtils.js:49
#, javascript-format
@@ -1464,12 +1468,13 @@ msgid "You do not have any installed plugin."
msgstr "您尚未安装任何插件。"
#: packages/app-desktop/gui/ConfigScreen/controls/plugins/PluginsStates.js:232
#, fuzzy
msgid "Could not connect to plugin repository"
msgstr "无法连接到插件库"
msgstr "无法安装插件:%s"
#: packages/app-desktop/gui/ConfigScreen/controls/plugins/PluginsStates.js:234
msgid "Try again"
msgstr "重试"
msgstr ""
#: packages/app-desktop/gui/ConfigScreen/controls/plugins/PluginsStates.js:242
msgid "Plugin tools"
@@ -1679,18 +1684,19 @@ msgid_plural "Copy Shareable Links"
msgstr[0] "复制分享链接"
#: packages/app-desktop/gui/ShareFolderDialog/ShareFolderDialog.js:138
#, fuzzy
msgid "Unshare"
msgstr "取消分享"
msgstr "分享"
#: packages/app-desktop/gui/ShareFolderDialog/ShareFolderDialog.js:180
msgid ""
"Delete this invitation? The recipient will no longer have access to this "
"shared notebook."
msgstr "删除这个邀请?接受者将无法再访问到这个共享的笔记本。"
msgstr ""
#: packages/app-desktop/gui/ShareFolderDialog/ShareFolderDialog.js:194
msgid "Add recipient:"
msgstr "添加接受者:"
msgstr ""
#: packages/app-desktop/gui/ShareFolderDialog/ShareFolderDialog.js:197
#: packages/app-mobile/components/NoteBodyViewer/hooks/useOnResourceLongPress.js:28
@@ -1700,41 +1706,45 @@ msgstr "分享"
#: packages/app-desktop/gui/ShareFolderDialog/ShareFolderDialog.js:206
msgid "Recipient has not yet accepted the invitation"
msgstr "接受者还没有接受邀请"
msgstr ""
#: packages/app-desktop/gui/ShareFolderDialog/ShareFolderDialog.js:207
msgid "Recipient has rejected the invitation"
msgstr "接受者拒绝了邀请"
msgstr ""
#: packages/app-desktop/gui/ShareFolderDialog/ShareFolderDialog.js:208
msgid "Recipient has accepted the invitation"
msgstr "接受者接受了邀请"
msgstr ""
#: packages/app-desktop/gui/ShareFolderDialog/ShareFolderDialog.js:218
msgid "Recipients:"
msgstr "接受者:"
msgstr ""
#: packages/app-desktop/gui/ShareFolderDialog/ShareFolderDialog.js:230
#, fuzzy
msgid "Synchronizing..."
msgstr "正在同步..."
#: packages/app-desktop/gui/ShareFolderDialog/ShareFolderDialog.js:231
#, fuzzy
msgid "Sharing notebook..."
msgstr "分享笔记..."
msgstr "分享笔记..."
#: packages/app-desktop/gui/ShareFolderDialog/ShareFolderDialog.js:241
msgid ""
"Unshare this notebook? The recipients will no longer have access to its "
"content."
msgstr "取消分享这个笔记本?接受者将无法再访问到它的内容。"
msgstr ""
#: packages/app-desktop/gui/ShareFolderDialog/ShareFolderDialog.js:251
#, fuzzy
msgid "Share Notebook"
msgstr "分享笔记"
msgstr "分享笔记"
#: packages/app-desktop/commands/toggleSafeMode.js:18
#, fuzzy
msgid "Toggle safe mode"
msgstr "切换安全模式"
msgstr "显示/隐藏边栏"
#: packages/app-desktop/commands/toggleExternalEditing.js:18
msgid "Toggle external editing"
@@ -1826,7 +1836,7 @@ msgstr "配置"
#: packages/app-mobile/components/side-menu-content.js:351
msgid "Mobile data - auto-sync disabled"
msgstr "手机数据自动同步被禁用"
msgstr ""
#: packages/app-mobile/components/note-list.js:97
msgid "You currently have no notebooks."
@@ -2339,8 +2349,9 @@ msgid "Joplin Server URL"
msgstr "Joplin 服务器 URL"
#: packages/lib/models/Setting.js:335
#, fuzzy
msgid "Joplin Server email"
msgstr "Joplin Server 邮箱"
msgstr "Joplin 服务器"
#: packages/lib/models/Setting.js:346
msgid "Joplin Server password"
@@ -2582,11 +2593,11 @@ msgid ""
"Used for most text in the markdown editor. If not found, a generic "
"proportional (variable width) font is used."
msgstr ""
"用于 markdown 编辑器中的大多数文本。如果没找到,会使用默认(非等宽)字体。"
#: packages/lib/models/Setting.js:726
#, fuzzy
msgid "Editor monospace font family"
msgstr "编辑器等宽字体族"
msgstr "编辑器字体族"
#: packages/lib/models/Setting.js:727
msgid ""
@@ -2594,8 +2605,6 @@ msgid ""
"tables, checkboxes, code). If not found, a generic monospace (fixed width) "
"font is used."
msgstr ""
"用于那些需要使用固定宽度的字体来清晰地布局文本的场景(例如:表格、多选框和代"
"码块)。如果没有找到,会使用默认(等宽)字体。"
#: packages/lib/models/Setting.js:748
msgid "Custom stylesheet for rendered Markdown"
@@ -2648,7 +2657,7 @@ msgstr "%d 小时"
#: packages/lib/models/Setting.js:817
msgid "Synchronise only over WiFi connection"
msgstr "只通过 WiFi 网络同步数据"
msgstr ""
#: packages/lib/models/Setting.js:824
msgid "Text editor command"
@@ -3725,7 +3734,7 @@ msgstr "将选定文件添加到笔记中。"
msgid ""
"Runs the commands contained in the text file. There should be one command "
"per line."
msgstr "执行文本文件中包含的命令。每个命令占一行。"
msgstr ""
#: packages/app-cli/app/command-version.js:11
msgid "Displays version information"