mirror of
https://github.com/laurent22/joplin.git
synced 2024-12-24 10:27:10 +02:00
101 lines
2.6 KiB
TypeScript
101 lines
2.6 KiB
TypeScript
import type BaseSyncTarget from './BaseSyncTarget';
|
|
|
|
export interface SyncTargetInfo {
|
|
id: number;
|
|
name: string;
|
|
label: string;
|
|
supportsSelfHosted: boolean;
|
|
supportsConfigCheck: boolean;
|
|
supportsRecursiveLinkedNotes: boolean;
|
|
supportsShare: boolean;
|
|
description: string;
|
|
classRef: typeof BaseSyncTarget;
|
|
}
|
|
|
|
export default class SyncTargetRegistry {
|
|
|
|
private static reg_: Record<number, typeof BaseSyncTarget> = {};
|
|
|
|
private static get reg() {
|
|
return this.reg_;
|
|
}
|
|
|
|
public static classById(syncTargetId: number) {
|
|
const info = SyncTargetRegistry.reg[syncTargetId];
|
|
if (!info) throw new Error(`Invalid id: ${syncTargetId}`);
|
|
return info;
|
|
}
|
|
|
|
public static infoByName(name: string): SyncTargetInfo {
|
|
for (const [, SyncTargetClass] of Object.entries(this.reg)) {
|
|
if (SyncTargetClass.targetName() === name) {
|
|
const output: SyncTargetInfo = {
|
|
id: SyncTargetClass.id(),
|
|
name: SyncTargetClass.targetName(),
|
|
label: SyncTargetClass.label(),
|
|
classRef: SyncTargetClass,
|
|
description: SyncTargetClass.description(),
|
|
supportsSelfHosted: SyncTargetClass.supportsSelfHosted(),
|
|
supportsConfigCheck: SyncTargetClass.supportsConfigCheck(),
|
|
supportsRecursiveLinkedNotes: SyncTargetClass.supportsRecursiveLinkedNotes(),
|
|
supportsShare: SyncTargetClass.supportsShare(),
|
|
};
|
|
return output;
|
|
}
|
|
}
|
|
throw new Error(`Unknown name: ${name}`);
|
|
}
|
|
|
|
public static infoById(id: number): SyncTargetInfo {
|
|
return this.infoByName(this.idToName(id));
|
|
}
|
|
|
|
public static addClass(SyncTargetClass: typeof BaseSyncTarget) {
|
|
this.reg[SyncTargetClass.id()] = SyncTargetClass;
|
|
}
|
|
|
|
public static allIds() {
|
|
return Object.keys(this.reg);
|
|
}
|
|
|
|
public static nameToId(name: string) {
|
|
for (const n in this.reg) {
|
|
if (!this.reg.hasOwnProperty(n)) continue;
|
|
if (this.reg[n].targetName() === name) return this.reg[n].id();
|
|
}
|
|
throw new Error(`Name not found: ${name}. Was the sync target registered?`);
|
|
}
|
|
|
|
public static idToMetadata(id: number) {
|
|
return this.infoById(id);
|
|
}
|
|
|
|
public static idToName(id: number) {
|
|
return this.reg[id].targetName();
|
|
}
|
|
|
|
public static idAndLabelPlainObject(os: string) {
|
|
const output: Record<string, string> = {};
|
|
for (const n in this.reg) {
|
|
if (!this.reg.hasOwnProperty(n)) continue;
|
|
const info = this.infoById(this.reg[n].id());
|
|
if (info.classRef.unsupportedPlatforms().indexOf(os) >= 0) {
|
|
continue;
|
|
}
|
|
output[n] = info.label;
|
|
}
|
|
|
|
return output;
|
|
}
|
|
|
|
public static optionsOrder(): string[] {
|
|
return [
|
|
'0', // None
|
|
'10', // Joplin Cloud
|
|
'7', // Dropbox
|
|
'3', // OneDrive
|
|
];
|
|
}
|
|
|
|
}
|