Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion manifest.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"id": "sync-engine",
"name": "Sync Engine",
"version": "3.0.4",
"version": "3.0.5",
"minAppVersion": "1.12.3",
"authorUrl": "https://hesprs.github.io",
"description": "The next-generation syncing plugin: Fast · Free · Extend with Modules. Supports WebDAV and S3.",
Expand Down
12 changes: 6 additions & 6 deletions modules.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,29 +29,29 @@
{
"id": "i18n-zh",
"name": "I18n 简体中文",
"version": "0.0.10",
"version": "0.0.11",
"description": "Simplified Chinese UI language pack. / 简体中文介面语言包。",
"icon": "languages",
"main": "https://sync.consensia.cc/modules/i18n-zh.js",
"minPluginVersion": "3.0.3"
"minPluginVersion": "3.0.5"
},
{
"id": "i18n-zh-TW",
"name": "I18n 繁體中文",
"version": "0.0.2",
"version": "0.0.3",
"description": "Traditional Chinese UI language pack. / 繁體中文介面語言包。",
"icon": "languages",
"main": "https://sync.consensia.cc/modules/i18n-zh-TW.js",
"minPluginVersion": "3.0.3"
"minPluginVersion": "3.0.5"
},
{
"id": "i18n-ru",
"name": "I18n Русский",
"version": "0.0.2",
"version": "0.0.3",
"description": "Russian UI language pack. / Пакет русского интерфейса.",
"icon": "languages",
"main": "https://sync.consensia.cc/modules/i18n-ru.js",
"minPluginVersion": "3.0.3"
"minPluginVersion": "3.0.5"
},
{
"id": "smart-merge",
Expand Down
8 changes: 4 additions & 4 deletions packages/i18n/src/ru/translations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,6 @@ const ru: Translations = {
development: 'Разработка',
diffMatchPatch: 'Объединить',
disableModule: 'Отключить модуль',
disabled: 'Отключено',
done: 'Готово',
download: 'Скачать',
downloadModule: 'Скачать модуль',
Expand All @@ -114,13 +113,14 @@ const ru: Translations = {
editSources: 'Редактировать источники',
enable: 'Включить',
enableModule: 'Включить модуль',
enabled: 'Включено',
exclusionRules: 'Правила исключения',
exclusionRulesDescription:
'Файлы и папки, соответствующие этим glob-шаблонам, не будут синхронизироваться. Не забудьте указать расширения файлов (например, .md), если хотите исключить файлы.',
executing: 'Выполняется',
export: 'Экспорт',
exportLogsDescription: 'Экспортировать логи плагина в файл внутри хранилища.',
exportLogsDescription:
'Экспортировать логи плагина в файл внутри хранилища. Укажите папку для экспорта логов в поле ниже.',
exportLogsDirectoryPlaceholder: 'Укажите папку для экспорта логов',
exportLogsFailed: 'Не удалось экспортировать логи',
exportLogsToFile: 'Экспортировать логи в файл',
failed: 'Ошибка',
Expand Down Expand Up @@ -204,10 +204,10 @@ const ru: Translations = {
noMatchingModulesFound: 'Подходящие модули не найдены.',
noModulesAvailable: 'Нет доступных модулей.',
none: 'Нет',
notInstalled: 'Не установлено',
noticeStatusOnMobile: 'Уведомления о статусе на мобильных устройствах',
noticeStatusOnMobileDescription:
'Отображать всплывающее уведомление на мобильных устройствах во время синхронизации. Заменяет строку состояния, используемую на ПК.',
official: 'Официальный',
omittedInvalidEntry: 'Пропущено недействительных записей: {{count}}.',
openPanel: 'Открыть панель',
realtimeSync: 'Синхронизация в реальном времени',
Expand Down
7 changes: 3 additions & 4 deletions packages/i18n/src/zh-TW/translations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,6 @@ const zhTW: Translations = {
development: '開發者選項',
diffMatchPatch: '文字合併',
disableModule: '停用模組',
disabled: '已停用',
done: '完成',
download: '下載',
downloadModule: '下載模組',
Expand All @@ -112,13 +111,13 @@ const zhTW: Translations = {
editSources: '編輯來源',
enable: '啟用',
enableModule: '啟用模組',
enabled: '已啟用',
exclusionRules: '排除規則',
exclusionRulesDescription:
'符合這些 Glob 萬用字元模式的檔案或資料夾將不會進行同步。若要排除特定檔案,請記得加上副檔名(例如 .md)。',
executing: '執行中',
export: '匯出',
exportLogsDescription: '將外掛程式紀錄匯出至儲存庫中的檔案。',
exportLogsDescription: '將外掛程式紀錄匯出至儲存庫中的檔案。請在欄位中設定紀錄匯出目錄。',
exportLogsDirectoryPlaceholder: '設定紀錄匯出的目標目錄',
exportLogsFailed: '匯出紀錄失敗',
exportLogsToFile: '匯出紀錄至檔案',
failed: '失敗',
Expand Down Expand Up @@ -198,9 +197,9 @@ const zhTW: Translations = {
noMatchingModulesFound: '未找到符合條件的模組。',
noModulesAvailable: '無可用模組。',
none: '無',
notInstalled: '未安裝',
noticeStatusOnMobile: '行動裝置同步狀態通知',
noticeStatusOnMobileDescription: '同步進行時於行動裝置上顯示通知訊息(取代桌面版的狀態列)。',
official: '官方',
omittedInvalidEntry: '已忽略 {{count}} 項無效條目。',
openPanel: '開啟面板',
realtimeSync: '即時同步',
Expand Down
7 changes: 3 additions & 4 deletions packages/i18n/src/zh/translations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,6 @@ const zh: Translations = {
development: '开发',
diffMatchPatch: '合并',
disableModule: '禁用模块',
disabled: '已禁用',
done: '完成',
download: '下载',
downloadModule: '下载模块',
Expand All @@ -100,13 +99,13 @@ const zh: Translations = {
editSources: '编辑源',
enable: '启用',
enableModule: '启用模块',
enabled: '已启用',
exclusionRules: '排除规则',
exclusionRulesDescription:
'匹配这些 Glob 模式的文件 / 文件夹将不会被同步。如果您想排除文件,请记得添加文件扩展名(例如 .md)。',
executing: '正在执行',
export: '导出',
exportLogsDescription: '将插件日志导出到库中的文件中。',
exportLogsDescription: '将插件日志导出到仓库中的文件。请在输入框中设置日志导出目录。',
exportLogsDirectoryPlaceholder: '设置日志导出的目录',
exportLogsFailed: '导出日志失败',
exportLogsToFile: '导出日志到文件',
failed: '失败',
Expand Down Expand Up @@ -185,10 +184,10 @@ const zh: Translations = {
noMatchingModulesFound: '未找到匹配的模块。',
noModulesAvailable: '没有可用模块。',
none: '无',
notInstalled: '未安装',
noticeStatusOnMobile: '移动端同步状态提示',
noticeStatusOnMobileDescription:
'同步进行时在移动设备上显示通知提示。在桌面端则会替换状态栏显示。',
official: '官方',
omittedInvalidEntry: '已忽略 {{count}} 条无效条目。',
openPanel: '打开面板',
realtimeSync: '实时同步',
Expand Down
6 changes: 6 additions & 0 deletions packages/plugin/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@

All notable changes to this project will be documented in this file.

## Sync Engine v3.0.5 - 2026-08-12

- Fixed the bug that non-root hidden files and folders cannot be discovered in syncing by @pedrovillalobos.
- Improved module card display and adjusted panel size on mobile by @hesprs.
- Made log export directory configurable by @hesprs.

## Sync Engine v3.0.4 - 2026-08-10

- Fixed the bug that "Rename and keep both" conflict resolution strategy duplicates content locally instead of propagate over remote.
Expand Down
2 changes: 1 addition & 1 deletion packages/plugin/dist/dev.spec.d.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Ct as FolderStat, St as FileStat, f as Request, p as RequestParam, ut as Fs, vt as RootFs, xt as Binary, yt as WrappedFs } from "./index-zKP375wq.spec.js";
import { Ct as FolderStat, St as FileStat, f as Request, p as RequestParam, ut as Fs, vt as RootFs, xt as Binary, yt as WrappedFs } from "./index-Ddt5UAXp.spec.js";
//#region src/sdk/debug-wrapper.d.ts
declare function debugWrapper(original: Fs, log: (content: string) => void): WrappedFs;
//#endregion
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -545,6 +545,7 @@ declare class Observability {
private readonly progressText;
readonly settings: {
noticeStatusOnMobile: boolean;
exportLogsDirectory: string;
};
readonly i18n: {
startSync: string;
Expand Down Expand Up @@ -802,6 +803,7 @@ type DevelopmentSettingTranslations = {
clearRecordsDescription: string;
export: string;
exportLogsDescription: string;
exportLogsDirectoryPlaceholder: string;
exportLogsToFile: string;
};
//#endregion
Expand Down Expand Up @@ -948,20 +950,18 @@ declare class Bootstrap {
//#region src/components/module-management/index.d.ts
type ModuleManagementTranslations = {
disableModule: string;
disabled: string;
downloadModule: string;
enableModule: string;
enabled: string;
installed: string;
loadingModules: string;
noInstalledModulesFound: string;
noMatchingModulesFound: string;
noModulesAvailable: string;
notInstalled: string;
updateAvailable: string;
updateModule: string;
deleteModule: string;
editModuleInformation: string;
official: string;
};
//#endregion
//#region src/components/SourceEditorModal.d.ts
Expand Down
2 changes: 1 addition & 1 deletion packages/plugin/dist/index.spec.d.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
import { $ as TranslationResource, A as SyncTerminateReason, B as MoveRemote, C as SelectFromContext, Ct as FolderStat, D as writeWithValue, Dt as RecordStatsMap, E as readWithSize, Et as RecordStat, F as Upload, G as BaseTask, H as Download, I as ResolveConflict, J as TaskNames, K as ConflictResolver, L as RemoveRemote, M as Decider, N as DeciderInput, O as prefixWrapper, Ot as Stat, P as TaskFactory, Q as Translate, R as RemoveRecord, S as ModuleMeta, St as FileStat, T as pipe, Tt as Progress, U as CreateRemoteDir, V as MoveLocal, W as AddRecord, X as Fragment, Y as RecordStore, Z as ObsidianLanguageCode, _ as Events, _t as OutputAtom, a as FsWrapperEntry, at as StoreOperations, b as ExistingMemoryDB, bt as WriteAtom, c as RemoteFsEntry, ct as CustomAtom, d as RemoteRequestMiddlewareEntry, dt as InputAtom, et as Dispatch, f as Request, ft as ListReporter, g as Context, gt as OptimizerOutput, h as SettingEntry, ht as OptimizerInput, i as DeciderEntry, it as StoreAsync, j as CreateLocalDir, k as setNeedMigration, kt as StatsMap, l as RemoteLister, lt as DeleteAtom, m as RequestResponse, mt as MoveAtom, n as CheckConnectionResult, nt as DatabaseAsync, o as LocalRequestMiddlewareEntry, ot as StoreSync, p as RequestParam, pt as MkdirAtom, q as ConflictResolverPayload, r as ConflictResolverEntry, rt as DatabaseSync, s as OptimizerEntry, st as BatchOptimizer, t as VaultRequest, tt as On, u as RemoteListerEntry, ut as Fs, v as Settings, vt as RootFs, w as digOriginal, wt as MaybePromise, x as AugmentedModuleMeta, xt as Binary, y as Translations, yt as WrappedFs, z as RemoveLocal } from "./index-zKP375wq.spec.js";
import { $ as TranslationResource, A as SyncTerminateReason, B as MoveRemote, C as SelectFromContext, Ct as FolderStat, D as writeWithValue, Dt as RecordStatsMap, E as readWithSize, Et as RecordStat, F as Upload, G as BaseTask, H as Download, I as ResolveConflict, J as TaskNames, K as ConflictResolver, L as RemoveRemote, M as Decider, N as DeciderInput, O as prefixWrapper, Ot as Stat, P as TaskFactory, Q as Translate, R as RemoveRecord, S as ModuleMeta, St as FileStat, T as pipe, Tt as Progress, U as CreateRemoteDir, V as MoveLocal, W as AddRecord, X as Fragment, Y as RecordStore, Z as ObsidianLanguageCode, _ as Events, _t as OutputAtom, a as FsWrapperEntry, at as StoreOperations, b as ExistingMemoryDB, bt as WriteAtom, c as RemoteFsEntry, ct as CustomAtom, d as RemoteRequestMiddlewareEntry, dt as InputAtom, et as Dispatch, f as Request, ft as ListReporter, g as Context, gt as OptimizerOutput, h as SettingEntry, ht as OptimizerInput, i as DeciderEntry, it as StoreAsync, j as CreateLocalDir, k as setNeedMigration, kt as StatsMap, l as RemoteLister, lt as DeleteAtom, m as RequestResponse, mt as MoveAtom, n as CheckConnectionResult, nt as DatabaseAsync, o as LocalRequestMiddlewareEntry, ot as StoreSync, p as RequestParam, pt as MkdirAtom, q as ConflictResolverPayload, r as ConflictResolverEntry, rt as DatabaseSync, s as OptimizerEntry, st as BatchOptimizer, t as VaultRequest, tt as On, u as RemoteListerEntry, ut as Fs, v as Settings, vt as RootFs, w as digOriginal, wt as MaybePromise, x as AugmentedModuleMeta, xt as Binary, y as Translations, yt as WrappedFs, z as RemoveLocal } from "./index-Ddt5UAXp.spec.js";
export { type AddRecord, type AugmentedModuleMeta, type BaseTask, type BatchOptimizer, type Binary, type CheckConnectionResult, type ConflictResolver, type ConflictResolverEntry, type ConflictResolverPayload, type Context, type CreateLocalDir, type CreateRemoteDir, type CustomAtom, type DatabaseAsync, type DatabaseSync, type Decider, type DeciderEntry, type DeciderInput, type DeleteAtom, type Dispatch, type Download, type Events, type ExistingMemoryDB, type FileStat, type FolderStat, type Fragment, type Fs, type FsWrapperEntry, type InputAtom, type ListReporter, type LocalRequestMiddlewareEntry, type MaybePromise, type MkdirAtom, type ModuleMeta, type MoveAtom, type MoveLocal, type MoveRemote, type ObsidianLanguageCode, type On, type OptimizerEntry, type OptimizerInput, type OptimizerOutput, type OutputAtom, type Progress, type RecordStat, type RecordStatsMap, type RecordStore, type RemoteFsEntry, type RemoteLister, type RemoteListerEntry, type RemoteRequestMiddlewareEntry, type RemoveLocal, type RemoveRecord, type RemoveRemote, type Request, type RequestParam, type RequestResponse, type ResolveConflict, type RootFs, SelectFromContext, type SettingEntry, type Settings, type Stat, type StatsMap, type StoreAsync, type StoreOperations, type StoreSync, type SyncTerminateReason, type TaskFactory, type TaskNames, type Translate, type TranslationResource, type Translations, type Upload, type VaultRequest, type WrappedFs, type WriteAtom, digOriginal, pipe, prefixWrapper, readWithSize, setNeedMigration, writeWithValue };
2 changes: 1 addition & 1 deletion packages/plugin/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@hesprs/sync-engine-sdk",
"version": "3.0.4",
"version": "3.0.5",
"description": "Official SDK for developing modules targeting Sync Engine, the extensible Obsidian syncing plugin.",
"keywords": [
"obsidian-plugin",
Expand Down
19 changes: 7 additions & 12 deletions packages/plugin/src/components/module-management/Card.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { Show, createEffect } from 'solid-js';
import { compare } from 'verkit';
import type { AugmentedModuleMeta } from '@/modules/Extensibility';
import type { MaybePromise } from '@/types';
import { OFFICIAL_SOURCE } from '@/modules/Extensibility';
import type { ModuleManagementContext, PendingAction } from './index';
import ModuleEditorModal from '../ModuleEditorModal';

Expand Down Expand Up @@ -36,7 +37,7 @@ export default function Card(props: {
};

return (
<div class="flex min-h-40 flex-col gap-3 rounded-md border border-[--background-modifier-border] px-4 py-3 bg-[--background-primary-alt]">
<div class="sync-engine-card flex min-h-40 flex-col gap-3 rounded-[--radius-s] border border-[--background-modifier-border] px-4 py-3 bg-[--background-primary-alt]">
<div class="flex items-start justify-between gap-3">
<div class="flex min-w-0 text-base font-semibold text-[--text-normal] break-words">
<span
Expand All @@ -50,20 +51,14 @@ export default function Card(props: {

<div class="flex flex-1 flex-col gap-2">
<div class="flex flex-wrap gap-2 text-xs text-[--text-muted]">
<span>
{isInstalled()
? props.ctx.translate('installed')
: props.ctx.translate('notInstalled')}
</span>
<Show when={props.module.source === OFFICIAL_SOURCE}>
<span class="flair prominent">{props.ctx.translate('official')}</span>
</Show>
<Show when={isInstalled()}>
<span>
{props.isLoaded
? props.ctx.translate('enabled')
: props.ctx.translate('disabled')}
</span>
<span class="flair">{props.ctx.translate('installed')}</span>
</Show>
<Show when={hasUpdate()}>
<span>{props.ctx.translate('updateAvailable')}</span>
<span class="flair">{props.ctx.translate('updateAvailable')}</span>
</Show>
</div>
<div class="flex-1 text-sm text-[--text-muted] break-words">
Expand Down
4 changes: 1 addition & 3 deletions packages/plugin/src/components/module-management/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,20 +9,18 @@ export type PendingAction = 'delete' | 'disable' | 'download' | 'enable' | 'edit

export type ModuleManagementTranslations = {
disableModule: string;
disabled: string;
downloadModule: string;
enableModule: string;
enabled: string;
installed: string;
loadingModules: string;
noInstalledModulesFound: string;
noMatchingModulesFound: string;
noModulesAvailable: string;
notInstalled: string;
updateAvailable: string;
updateModule: string;
deleteModule: string;
editModuleInformation: string;
official: string;
};

export type ModuleManagementHooks = {
Expand Down
8 changes: 4 additions & 4 deletions packages/plugin/src/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,6 @@ const en: Translations = {
development: 'Development',
diffMatchPatch: 'Merge',
disableModule: 'Disable module',
disabled: 'Disabled',
done: 'Done',
download: 'Download',
downloadModule: 'Download module',
Expand All @@ -114,13 +113,14 @@ const en: Translations = {
editSources: 'Edit sources',
enable: 'Enable',
enableModule: 'Enable module',
enabled: 'Enabled',
exclusionRules: 'Exclusion rules',
exclusionRulesDescription:
'Files / folders matching these glob patterns will not be synced. Please remember to add file extensions (for example, .md) if you want to exclude files.',
executing: 'Executing',
export: 'Export',
exportLogsDescription: 'Export plugin logs to a file in the vault.',
exportLogsDescription:
'Export plugin logs to a file in the vault. Set the log export directory in the field.',
exportLogsDirectoryPlaceholder: 'Set the directory to export logs to',
exportLogsFailed: 'Failed to export logs',
exportLogsToFile: 'Export logs to file',
failed: 'Failed',
Expand Down Expand Up @@ -204,10 +204,10 @@ const en: Translations = {
noMatchingModulesFound: 'No matching modules found.',
noModulesAvailable: 'No modules available.',
none: 'None',
notInstalled: 'Not installed',
noticeStatusOnMobile: 'Notice sync status on mobile',
noticeStatusOnMobileDescription:
'Display a notice on mobile devices when synchronization is in progress. Replaces the status bar on desktop.',
official: 'Official',
omittedInvalidEntry: 'Omitted {{count}} invalid entry(s).',
openPanel: 'Open panel',
realtimeSync: 'Realtime sync',
Expand Down
21 changes: 21 additions & 0 deletions packages/plugin/src/global.css
Original file line number Diff line number Diff line change
Expand Up @@ -56,3 +56,24 @@ input[type='checkbox']:indeterminate {
flex-direction: column;
}
}

.sync-engine-large-modal {
width: var(--modal-width);
height: var(--modal-height);
max-width: var(--modal-max-width);
max-height: var(--modal-max-height);
}

.is-phone .sync-engine-large-modal {
height: 100%;
margin-top: auto;
}

.sync-engine-card .flair {
margin: 0;
}

.sync-engine-card .flair.prominent {
--flair-background: var(--color-accent);
--flair-color: var(--text-on-accent);
}
Loading
Loading