more tweaks

This commit is contained in:
vorotamoroz
2026-06-19 06:28:34 +01:00
parent 21f47cf48d
commit b2c6916ac7
32 changed files with 179 additions and 72 deletions
+3 -3
View File
@@ -26,7 +26,7 @@ type BaseRule<TType extends string, TValue> = {
valueDisplayFunc?: (settings: Partial<ObsidianLiveSyncSettings>) => string; valueDisplayFunc?: (settings: Partial<ObsidianLiveSyncSettings>) => string;
obsoleteValues?: TValue[]; obsoleteValues?: TValue[];
}; };
type NumberRuleExact = BaseRule<"number", number> & {}; type NumberRuleExact = BaseRule<"number", number> & {}; // eslint-disable-line @typescript-eslint/no-empty-object-type, @typescript-eslint/ban-types -- Empty object type
type NumberRuleRange = BaseRule<"number", number> & { type NumberRuleRange = BaseRule<"number", number> & {
min?: number; min?: number;
max?: number; max?: number;
@@ -37,8 +37,8 @@ type StringRangeRule = BaseRule<"string", string> & {
maxLength?: number; maxLength?: number;
regexp?: string; regexp?: string;
}; };
type StringRule = BaseRule<"string", string> & {}; type StringRule = BaseRule<"string", string> & {}; // eslint-disable-line @typescript-eslint/no-empty-object-type, @typescript-eslint/ban-types -- Empty object type
type BooleanRule = BaseRule<"boolean", boolean> & {}; type BooleanRule = BaseRule<"boolean", boolean> & {}; // eslint-disable-line @typescript-eslint/no-empty-object-type, @typescript-eslint/ban-types -- Empty object type
export type RuleForType<T> = T extends number ? NumberRuleExact | NumberRuleRange : T extends string ? StringRule | StringRangeRule : T extends boolean ? BooleanRule : never; export type RuleForType<T> = T extends number ? NumberRuleExact | NumberRuleRange : T extends string ? StringRule | StringRangeRule : T extends boolean ? BooleanRule : never;
type DoctorCheckSettings = Omit<Partial<ObsidianLiveSyncSettings>, "remoteConfigurations" | "pluginSyncExtendedSetting">; type DoctorCheckSettings = Omit<Partial<ObsidianLiveSyncSettings>, "remoteConfigurations" | "pluginSyncExtendedSetting">;
export type DoctorRegulation = { export type DoctorRegulation = {
+1 -1
View File
@@ -891,7 +891,7 @@ export interface RemoteConfigurations {
*/ */
P2P_ActiveRemoteConfigurationId: string; P2P_ActiveRemoteConfigurationId: string;
} }
interface ObsidianLiveSyncSettings_PluginSetting extends SyncMethodSettings, UISettings, FileHandlingSettings, MergeBehaviourSettings, EncryptedUserSettings, PeriodicReplicationSettings, InternalFileSettings, PluginSyncSettings, ModeSettings, ExtraTweakSettings, BetaTweakSettings, ObsoleteSettings, DebugModeSettings, SettingSyncSettings, SafetyValveSettings, DataOnSettings, RemoteConfigurations { interface ObsidianLiveSyncSettings_PluginSetting extends SyncMethodSettings, UISettings, FileHandlingSettings, MergeBehaviourSettings, EncryptedUserSettings, PeriodicReplicationSettings, InternalFileSettings, PluginSyncSettings, ModeSettings, ExtraTweakSettings, BetaTweakSettings, ObsoleteSettings, DebugModeSettings, SettingSyncSettings, SafetyValveSettings, DataOnSettings, RemoteConfigurations { // eslint-disable-line @typescript-eslint/no-empty-object-type, @typescript-eslint/no-empty-interface -- Empty interface
} }
export type RemoteDBSettings = CouchDBConnection & BucketSyncSetting & RemoteTypeSettings & EncryptionSettings & ChunkSettings & EdenSettings & DataOnRemoteDBSettings & ObsoleteRemoteDBSettings & OnDemandChunkSettings & BetaRemoteDBSettings & ReplicationSetting & RemoteDBTweakSettings & FileHandlingSettings & ProcessingBehaviourSettings & OptionalAndNotExposedRemoteDBSettings & CrossPlatformInteroperabilitySettings & ConflictHandlingSettings & EdgeCaseHandlingSettings & DeletedFileMetadataSettings & P2PSyncSetting & RemoteConfigurations; export type RemoteDBSettings = CouchDBConnection & BucketSyncSetting & RemoteTypeSettings & EncryptionSettings & ChunkSettings & EdenSettings & DataOnRemoteDBSettings & ObsoleteRemoteDBSettings & OnDemandChunkSettings & BetaRemoteDBSettings & ReplicationSetting & RemoteDBTweakSettings & FileHandlingSettings & ProcessingBehaviourSettings & OptionalAndNotExposedRemoteDBSettings & CrossPlatformInteroperabilitySettings & ConflictHandlingSettings & EdgeCaseHandlingSettings & DeletedFileMetadataSettings & P2PSyncSetting & RemoteConfigurations;
export type ObsidianLiveSyncSettings = ObsidianLiveSyncSettings_PluginSetting & RemoteDBSettings & LocalDBSettings; export type ObsidianLiveSyncSettings = ObsidianLiveSyncSettings_PluginSetting & RemoteDBSettings & LocalDBSettings;
+1 -1
View File
@@ -6,4 +6,4 @@ export type CustomRegExpSourceList<D extends string = ","> = TaggedType<string,
export type ParsedCustomRegExp = [isInverted: boolean, pattern: string]; export type ParsedCustomRegExp = [isInverted: boolean, pattern: string];
export type Prettify<T> = { export type Prettify<T> = {
[K in keyof T]: T[K]; [K in keyof T]: T[K];
} & {}; } & {}; // eslint-disable-line @typescript-eslint/no-empty-object-type, @typescript-eslint/ban-types -- Empty object type
+3 -3
View File
@@ -27,11 +27,11 @@ export declare const Parallels: (ps?: Set<Promise<unknown>>) => {
export declare function allSettledWithConcurrencyLimit<T>(processes: Promise<T>[], limit: number): Promise<void>; export declare function allSettledWithConcurrencyLimit<T>(processes: Promise<T>[], limit: number): Promise<void>;
export declare function getDocData(doc: string | string[]): string; export declare function getDocData(doc: string | string[]): string;
export declare function getDocDataAsArray(doc: string | string[]): string[]; export declare function getDocDataAsArray(doc: string | string[]): string[];
export declare function getDocDataAsArrayBuffer(doc: string | string[] | ArrayBuffer): Uint8Array<ArrayBuffer>; export declare function getDocDataAsArrayBuffer(doc: string | string[] | ArrayBuffer): Uint8Array;
export declare function isTextBlob(blob: Blob): boolean; export declare function isTextBlob(blob: Blob): boolean;
export declare function createTextBlob(data: string | string[]): Blob; export declare function createTextBlob(data: string | string[]): Blob;
export declare function createBinaryBlob(data: Uint8Array<ArrayBuffer> | ArrayBuffer): Blob; export declare function createBinaryBlob(data: Uint8Array | ArrayBuffer): Blob;
export declare function createBlob(data: string | string[] | Uint8Array<ArrayBuffer> | ArrayBuffer | Blob): Blob; export declare function createBlob(data: string | string[] | Uint8Array | ArrayBuffer | Blob): Blob;
export declare function isTextDocument(doc: LoadedEntry): boolean; export declare function isTextDocument(doc: LoadedEntry): boolean;
export declare function readAsBlob(doc: LoadedEntry): Blob; export declare function readAsBlob(doc: LoadedEntry): Blob;
export declare function readContent(doc: LoadedEntry): string | ArrayBuffer; export declare function readContent(doc: LoadedEntry): string | ArrayBuffer;
+1 -1
View File
@@ -25,7 +25,7 @@ export declare class EntryManager {
setting: ISettingService; setting: ISettingService;
path: IPathService; path: IPathService;
}; };
serviceModules: {}; serviceModules: {}; // eslint-disable-line @typescript-eslint/no-empty-object-type, @typescript-eslint/ban-types -- Empty object type
}; };
get isOnDemandChunkEnabled(): boolean; get isOnDemandChunkEnabled(): boolean;
isTargetFile(filenameSrc: string): boolean; isTargetFile(filenameSrc: string): boolean;
+3 -3
View File
@@ -2,11 +2,11 @@
import * as fflate from "fflate"; import * as fflate from "fflate";
import type { EntryDoc } from "@lib/common/types"; import type { EntryDoc } from "@lib/common/types";
export declare function _compressText(text: string): Promise<string>; export declare function _compressText(text: string): Promise<string>;
export declare const wrappedInflate: (data: Uint8Array<ArrayBuffer>, opts: fflate.AsyncInflateOptions) => Promise<Uint8Array<ArrayBuffer>>; export declare const wrappedInflate: (data: Uint8Array, opts: fflate.AsyncInflateOptions) => Promise<Uint8Array>;
export declare const wrappedDeflate: (data: Uint8Array<ArrayBuffer>, opts: fflate.AsyncDeflateOptions) => Promise<Uint8Array<ArrayBuffer>>; export declare const wrappedDeflate: (data: Uint8Array, opts: fflate.AsyncDeflateOptions) => Promise<Uint8Array>;
export declare function _decompressText(compressed: string, _useUTF16?: boolean): Promise<string>; export declare function _decompressText(compressed: string, _useUTF16?: boolean): Promise<string>;
export declare function compressDoc(doc: EntryDoc): Promise<import("@lib/common/types").NoteEntry | import("@lib/common/types").NewEntry | import("@lib/common/types").PlainEntry | import("@lib/common/types").EntryLeaf | import("@lib/common/types").EntryChunkPack | import("@lib/common/types").EntryVersionInfo | import("@lib/common/types").EntryMilestoneInfo | import("@lib/common/types").EntryNodeInfo>; export declare function compressDoc(doc: EntryDoc): Promise<import("@lib/common/types").NoteEntry | import("@lib/common/types").NewEntry | import("@lib/common/types").PlainEntry | import("@lib/common/types").EntryLeaf | import("@lib/common/types").EntryChunkPack | import("@lib/common/types").EntryVersionInfo | import("@lib/common/types").EntryMilestoneInfo | import("@lib/common/types").EntryNodeInfo>;
export declare function decompressDoc(doc: EntryDoc): Promise<import("@lib/common/types").NoteEntry | import("@lib/common/types").NewEntry | import("@lib/common/types").PlainEntry | import("@lib/common/types").EntryLeaf | import("@lib/common/types").EntryChunkPack | import("@lib/common/types").EntryVersionInfo | import("@lib/common/types").EntryMilestoneInfo | import("@lib/common/types").EntryNodeInfo>; export declare function decompressDoc(doc: EntryDoc): Promise<import("@lib/common/types").NoteEntry | import("@lib/common/types").NewEntry | import("@lib/common/types").PlainEntry | import("@lib/common/types").EntryLeaf | import("@lib/common/types").EntryChunkPack | import("@lib/common/types").EntryVersionInfo | import("@lib/common/types").EntryMilestoneInfo | import("@lib/common/types").EntryNodeInfo>;
export declare function wrapFflateFunc<T, U>(func: (data: T, opts: U, cb: fflate.FlateCallback) => unknown): (data: T, opts: U) => Promise<Uint8Array<ArrayBuffer>>; export declare function wrapFflateFunc<T, U>(func: (data: T, opts: U, cb: fflate.FlateCallback) => unknown): (data: T, opts: U) => Promise<Uint8Array>;
export declare const replicationFilter: (db: PouchDB.Database<EntryDoc>, compress: boolean) => void; export declare const replicationFilter: (db: PouchDB.Database<EntryDoc>, compress: boolean) => void;
export declare const MARK_SHIFT_COMPRESSED = "\u000ELZ\u001D"; export declare const MARK_SHIFT_COMPRESSED = "\u000ELZ\u001D";
+2 -2
View File
@@ -7,11 +7,11 @@ export declare const encryptHKDF: typeof encryptHKDFWorker;
export declare const decryptHKDF: typeof decryptHKDFWorker; export declare const decryptHKDF: typeof decryptHKDFWorker;
export declare let preprocessOutgoing: (doc: AnyEntry | EntryLeaf) => Promise<AnyEntry | EntryLeaf>; export declare let preprocessOutgoing: (doc: AnyEntry | EntryLeaf) => Promise<AnyEntry | EntryLeaf>;
export declare let preprocessIncoming: (doc: EntryDoc) => Promise<EntryDoc>; export declare let preprocessIncoming: (doc: EntryDoc) => Promise<EntryDoc>;
export declare function getConfiguredFunctionsForEncryption(passphrase: string, useDynamicIterationCount: boolean, migrationDecrypt: boolean, getPBKDF2Salt: () => Promise<Uint8Array<ArrayBuffer>>, algorithm: E2EEAlgorithm): { export declare function getConfiguredFunctionsForEncryption(passphrase: string, useDynamicIterationCount: boolean, migrationDecrypt: boolean, getPBKDF2Salt: () => Promise<Uint8Array>, algorithm: E2EEAlgorithm): {
incoming: (doc: AnyEntry | EntryLeaf) => Promise<AnyEntry | EntryLeaf>; incoming: (doc: AnyEntry | EntryLeaf) => Promise<AnyEntry | EntryLeaf>;
outgoing: (doc: EntryDoc) => Promise<AnyEntry | EntryLeaf>; outgoing: (doc: EntryDoc) => Promise<AnyEntry | EntryLeaf>;
}; };
export declare const enableEncryption: (db: PouchDB.Database<EntryDoc>, passphrase: string, useDynamicIterationCount: boolean, migrationDecrypt: boolean, getPBKDF2Salt: () => Promise<Uint8Array<ArrayBuffer>>, algorithm: E2EEAlgorithm) => void; export declare const enableEncryption: (db: PouchDB.Database<EntryDoc>, passphrase: string, useDynamicIterationCount: boolean, migrationDecrypt: boolean, getPBKDF2Salt: () => Promise<Uint8Array>, algorithm: E2EEAlgorithm) => void;
export declare function disableEncryption(): void; export declare function disableEncryption(): void;
export declare const EDEN_ENCRYPTED_KEY: DocumentID; export declare const EDEN_ENCRYPTED_KEY: DocumentID;
export declare const EDEN_ENCRYPTED_KEY_HKDF: DocumentID; export declare const EDEN_ENCRYPTED_KEY_HKDF: DocumentID;
@@ -39,7 +39,7 @@ export declare abstract class LiveSyncAbstractReplicator {
get rawDatabase(): PouchDB.Database<EntryDoc>; get rawDatabase(): PouchDB.Database<EntryDoc>;
get currentSettings(): import("@lib/common/types.ts").ObsidianLiveSyncSettings; get currentSettings(): import("@lib/common/types.ts").ObsidianLiveSyncSettings;
sendChunks(setting: RemoteDBSettings, remoteDB: PouchDB.Database<EntryDoc> | undefined, showResult: boolean, fromSeq?: number | string): Promise<boolean>; sendChunks(setting: RemoteDBSettings, remoteDB: PouchDB.Database<EntryDoc> | undefined, showResult: boolean, fromSeq?: number | string): Promise<boolean>;
abstract getReplicationPBKDF2Salt(setting: RemoteDBSettings, refresh?: boolean): Promise<Uint8Array<ArrayBuffer>>; abstract getReplicationPBKDF2Salt(setting: RemoteDBSettings, refresh?: boolean): Promise<Uint8Array>;
ensurePBKDF2Salt(setting: RemoteDBSettings, showMessage?: boolean, useCache?: boolean): Promise<boolean>; ensurePBKDF2Salt(setting: RemoteDBSettings, showMessage?: boolean, useCache?: boolean): Promise<boolean>;
env: LiveSyncReplicatorEnv; env: LiveSyncReplicatorEnv;
initializeDatabaseForReplication(): Promise<boolean>; initializeDatabaseForReplication(): Promise<boolean>;
+1 -1
View File
@@ -21,7 +21,7 @@ type CreateSyncParamsHanderOptions = {
}; };
export type SyncParamsHandler = { export type SyncParamsHandler = {
fetch: (refresh?: boolean) => Promise<SyncParameters | false>; fetch: (refresh?: boolean) => Promise<SyncParameters | false>;
getPBKDF2Salt: (refresh?: boolean) => Promise<Uint8Array<ArrayBuffer>>; getPBKDF2Salt: (refresh?: boolean) => Promise<Uint8Array>;
}; };
export declare function createSyncParamsHanderForServer(key: string, options: CreateSyncParamsHanderOptions): SyncParamsHandler; export declare function createSyncParamsHanderForServer(key: string, options: CreateSyncParamsHanderOptions): SyncParamsHandler;
export declare function clearHandlers(): void; export declare function clearHandlers(): void;
@@ -12,7 +12,7 @@ export declare class LiveSyncCouchDBReplicator extends LiveSyncAbstractReplicato
getInitialSyncParameters(setting: RemoteDBSettings): Promise<SyncParameters>; getInitialSyncParameters(setting: RemoteDBSettings): Promise<SyncParameters>;
getSyncParameters(setting: RemoteDBSettings): Promise<SyncParameters>; getSyncParameters(setting: RemoteDBSettings): Promise<SyncParameters>;
putSyncParameters(setting: RemoteDBSettings, params: SyncParameters): Promise<boolean>; putSyncParameters(setting: RemoteDBSettings, params: SyncParameters): Promise<boolean>;
getReplicationPBKDF2Salt(setting: RemoteDBSettings, refresh?: boolean): Promise<Uint8Array<ArrayBuffer>>; getReplicationPBKDF2Salt(setting: RemoteDBSettings, refresh?: boolean): Promise<Uint8Array>;
migrate(from: number, to: number): Promise<boolean>; migrate(from: number, to: number): Promise<boolean>;
terminateSync(): void; terminateSync(): void;
openReplication(setting: RemoteDBSettings, keepAlive: boolean, showResult: boolean, ignoreCleanLock: boolean): Promise<boolean | undefined>; openReplication(setting: RemoteDBSettings, keepAlive: boolean, showResult: boolean, ignoreCleanLock: boolean): Promise<boolean | undefined>;
@@ -60,12 +60,12 @@ export declare abstract class JournalSyncAbstract {
abstract listFiles(from: string, limit?: number): Promise<string[]>; abstract listFiles(from: string, limit?: number): Promise<string[]>;
abstract isAvailable(): Promise<boolean>; abstract isAvailable(): Promise<boolean>;
getRemoteKey(): string; getRemoteKey(): string;
getReplicationPBKDF2Salt(refresh?: boolean): Promise<Uint8Array<ArrayBuffer>>; getReplicationPBKDF2Salt(refresh?: boolean): Promise<Uint8Array>;
isEncryptionPrevented(fileName: string): boolean; isEncryptionPrevented(fileName: string): boolean;
private decryptDataV2; private decryptDataV2;
private decryptDataV1; private decryptDataV1;
decryptDownloaded(key: string, encrypted: Uint8Array<ArrayBuffer>, set: RemoteDBSettings): Promise<Uint8Array<ArrayBuffer>>; decryptDownloaded(key: string, encrypted: Uint8Array, set: RemoteDBSettings): Promise<Uint8Array>;
encryptForUpload(key: string, data: Uint8Array<ArrayBuffer>, set: RemoteDBSettings): Promise<Uint8Array<ArrayBuffer>>; encryptForUpload(key: string, data: Uint8Array, set: RemoteDBSettings): Promise<Uint8Array>;
_createJournalPack(override?: number | string): Promise<{ _createJournalPack(override?: number | string): Promise<{
changes: (EntryDoc & PouchDB.Core.GetMeta)[]; changes: (EntryDoc & PouchDB.Core.GetMeta)[];
hasNext: boolean; hasNext: boolean;
@@ -12,7 +12,7 @@ export declare class LiveSyncJournalReplicator extends LiveSyncAbstractReplicato
get client(): JournalSyncMinio; get client(): JournalSyncMinio;
get simpleStore(): SimpleStore<CheckPointInfo>; get simpleStore(): SimpleStore<CheckPointInfo>;
_client: JournalSyncMinio; _client: JournalSyncMinio;
getReplicationPBKDF2Salt(setting: RemoteDBSettings, refresh?: boolean): Promise<Uint8Array<ArrayBuffer>>; getReplicationPBKDF2Salt(setting: RemoteDBSettings, refresh?: boolean): Promise<Uint8Array>;
setupJournalSyncClient(): JournalSyncMinio; setupJournalSyncClient(): JournalSyncMinio;
ensureBucketIsCompatible(deviceNodeID: string, currentVersionRange: ChunkVersionRange): Promise<ENSURE_DB_RESULT>; ensureBucketIsCompatible(deviceNodeID: string, currentVersionRange: ChunkVersionRange): Promise<ENSURE_DB_RESULT>;
constructor(env: LiveSyncJournalReplicatorEnv); constructor(env: LiveSyncJournalReplicatorEnv);
@@ -1,4 +1,4 @@
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 6de1db1 // REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 6de1db1
import type { LiveSyncReplicatorEnv } from "@lib/replication/LiveSyncAbstractReplicator"; import type { LiveSyncReplicatorEnv } from "@lib/replication/LiveSyncAbstractReplicator";
export interface LiveSyncJournalReplicatorEnv extends LiveSyncReplicatorEnv { export interface LiveSyncJournalReplicatorEnv extends LiveSyncReplicatorEnv { // eslint-disable-line @typescript-eslint/no-empty-object-type, @typescript-eslint/no-empty-interface -- Empty interface
} }
@@ -23,7 +23,7 @@ export declare class LiveSyncTrysteroReplicator extends LiveSyncAbstractReplicat
get rawReplicator(): TrysteroReplicator | undefined; get rawReplicator(): TrysteroReplicator | undefined;
get rawHost(): P2PHost | undefined; get rawHost(): P2PHost | undefined;
get isChunkSendingSupported(): boolean; get isChunkSendingSupported(): boolean;
getReplicationPBKDF2Salt(_setting: RemoteDBSettings, _refresh?: boolean): Promise<Uint8Array<ArrayBuffer>>; getReplicationPBKDF2Salt(_setting: RemoteDBSettings, _refresh?: boolean): Promise<Uint8Array>;
terminateSync(): void; terminateSync(): void;
private _buildEnv; private _buildEnv;
open(): Promise<void>; open(): Promise<void>;
@@ -57,7 +57,7 @@ export type AllReplicationClientStatus = {
export declare class TrysteroReplicator { export declare class TrysteroReplicator {
_env: ReplicatorHostEnv; _env: ReplicatorHostEnv;
server?: P2PHost; server?: P2PHost;
replicationStatus(): {}; replicationStatus(): {}; // eslint-disable-line @typescript-eslint/no-empty-object-type, @typescript-eslint/ban-types -- Empty object type
get settings(): import("@lib/common/types").P2PSyncSetting; get settings(): import("@lib/common/types").P2PSyncSetting;
get db(): PouchDB.Database<EntryDoc>; get db(): PouchDB.Database<EntryDoc>;
get deviceName(): string; get deviceName(): string;
+10 -1
View File
@@ -1,5 +1,4 @@
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 6de1db1 // REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 6de1db1
import EventEmitter from "events";
import type { RpcSession } from "@lib/rpc/RpcSession"; import type { RpcSession } from "@lib/rpc/RpcSession";
/** /**
* A PouchDB-compatible proxy that forwards all database operations to a remote * A PouchDB-compatible proxy that forwards all database operations to a remote
@@ -74,3 +73,13 @@ export declare class RpcPouchDBProxy extends EventEmitter {
revsDiff(diff: PouchDB.Core.RevisionDiffOptions): Promise<PouchDB.Core.RevisionDiffResponse>; revsDiff(diff: PouchDB.Core.RevisionDiffOptions): Promise<PouchDB.Core.RevisionDiffResponse>;
allDocs<T extends object>(opts?: PouchDB.Core.AllDocsOptions): Promise<PouchDB.Core.AllDocsResponse<T>>; allDocs<T extends object>(opts?: PouchDB.Core.AllDocsOptions): Promise<PouchDB.Core.AllDocsResponse<T>>;
} }
class EventEmitter {
on(event: string | symbol, listener: (...args: any[]) => void): this; // eslint-disable-line @typescript-eslint/no-explicit-any -- Only type declaration
once(event: string | symbol, listener: (...args: any[]) => void): this; // eslint-disable-line @typescript-eslint/no-explicit-any -- Only type declaration
off(event: string | symbol, listener: (...args: any[]) => void): this; // eslint-disable-line @typescript-eslint/no-explicit-any -- Only type declaration
emit(event: string | symbol, ...args: any[]): boolean; // eslint-disable-line @typescript-eslint/no-explicit-any -- Only type declaration
addListener(event: string | symbol, listener: (...args: any[]) => void): this; // eslint-disable-line @typescript-eslint/no-explicit-any -- Only type declaration
removeListener(event: string | symbol, listener: (...args: any[]) => void): this; // eslint-disable-line @typescript-eslint/no-explicit-any -- Only type declaration
removeAllListeners(event: string | symbol): this;
}
+4 -4
View File
@@ -5,7 +5,7 @@ import type { IAPIService, IPathService, ISettingService, IVaultService } from "
import { createInstanceLogFunction } from "@lib/services/lib/logUtils.ts"; import { createInstanceLogFunction } from "@lib/services/lib/logUtils.ts";
import type { FileWithFileStat } from "@lib/common/models/fileaccess.type"; import type { FileWithFileStat } from "@lib/common/models/fileaccess.type";
import type { IFileSystemAdapter } from "./adapters"; import type { IFileSystemAdapter } from "./adapters";
export declare function toArrayBuffer(arr: Uint8Array<ArrayBuffer> | ArrayBuffer | DataView<ArrayBuffer>): ArrayBuffer; export declare function toArrayBuffer(arr: Uint8Array | ArrayBuffer | DataView): ArrayBuffer;
export interface FileAccessBaseDependencies { export interface FileAccessBaseDependencies {
vaultService: IVaultService; vaultService: IVaultService;
storageAccessManager: IStorageAccessManager; storageAccessManager: IStorageAccessManager;
@@ -59,7 +59,7 @@ export declare class FileAccessBase<TAdapter extends IFileSystemAdapter<any, any
adapterRead(file: ExtractFile<TAdapter> | string): Promise<string>; adapterRead(file: ExtractFile<TAdapter> | string): Promise<string>;
adapterReadBinary(file: ExtractFile<TAdapter> | string): Promise<ArrayBuffer>; adapterReadBinary(file: ExtractFile<TAdapter> | string): Promise<ArrayBuffer>;
adapterReadAuto(file: ExtractFile<TAdapter> | string): Promise<string | ArrayBuffer>; adapterReadAuto(file: ExtractFile<TAdapter> | string): Promise<string | ArrayBuffer>;
adapterWrite(file: ExtractFile<TAdapter> | string, data: string | ArrayBuffer | Uint8Array<ArrayBuffer>, options?: UXDataWriteOptions): Promise<void>; adapterWrite(file: ExtractFile<TAdapter> | string, data: string | ArrayBuffer | Uint8Array, options?: UXDataWriteOptions): Promise<void>;
adapterList(basePath: string): Promise<{ adapterList(basePath: string): Promise<{
files: string[]; files: string[];
folders: string[]; folders: string[];
@@ -68,8 +68,8 @@ export declare class FileAccessBase<TAdapter extends IFileSystemAdapter<any, any
vaultRead(file: ExtractFile<TAdapter>): Promise<string>; vaultRead(file: ExtractFile<TAdapter>): Promise<string>;
vaultReadBinary(file: ExtractFile<TAdapter>): Promise<ArrayBuffer>; vaultReadBinary(file: ExtractFile<TAdapter>): Promise<ArrayBuffer>;
vaultReadAuto(file: ExtractFile<TAdapter>): Promise<string | ArrayBuffer>; vaultReadAuto(file: ExtractFile<TAdapter>): Promise<string | ArrayBuffer>;
vaultModify(file: ExtractFile<TAdapter>, data: string | ArrayBuffer | Uint8Array<ArrayBuffer>, options?: UXDataWriteOptions): Promise<boolean>; vaultModify(file: ExtractFile<TAdapter>, data: string | ArrayBuffer | Uint8Array, options?: UXDataWriteOptions): Promise<boolean>;
vaultCreate(path: string, data: string | ArrayBuffer | Uint8Array<ArrayBuffer>, options?: UXDataWriteOptions): Promise<ExtractFile<TAdapter>>; vaultCreate(path: string, data: string | ArrayBuffer | Uint8Array, options?: UXDataWriteOptions): Promise<ExtractFile<TAdapter>>;
trigger(name: string, ...data: unknown[]): void; trigger(name: string, ...data: unknown[]): void;
reconcileInternalFile(path: string): Promise<void>; reconcileInternalFile(path: string): Promise<void>;
/** /**
+1 -1
View File
@@ -126,7 +126,7 @@ export interface IReplicationService {
markResolved(): Promise<void>; markResolved(): Promise<void>;
} }
export interface IRemoteService { export interface IRemoteService {
connect(uri: string, auth: CouchDBCredentials, disableRequestURI: boolean, passphrase: string | false, useDynamicIterationCount: boolean, performSetup: boolean, skipInfo: boolean, compression: boolean, customHeaders: Record<string, string>, useRequestAPI: boolean, getPBKDF2Salt: () => Promise<Uint8Array<ArrayBuffer>>): Promise<string | { connect(uri: string, auth: CouchDBCredentials, disableRequestURI: boolean, passphrase: string | false, useDynamicIterationCount: boolean, performSetup: boolean, skipInfo: boolean, compression: boolean, customHeaders: Record<string, string>, useRequestAPI: boolean, getPBKDF2Salt: () => Promise<Uint8Array>): Promise<string | {
db: PouchDB.Database<EntryDoc>; db: PouchDB.Database<EntryDoc>;
info: PouchDB.Core.DatabaseInfo; info: PouchDB.Core.DatabaseInfo;
}>; }>;
+1 -1
View File
@@ -50,7 +50,7 @@ export declare abstract class RemoteService<T extends ServiceContext = ServiceCo
showError(msg: string, max_log_level?: LOG_LEVEL): void; showError(msg: string, max_log_level?: LOG_LEVEL): void;
clearErrors(): void; clearErrors(): void;
performFetch(req: string | Request, opts?: RequestInit, fetchMethod?: FetchMethod): Promise<Response>; performFetch(req: string | Request, opts?: RequestInit, fetchMethod?: FetchMethod): Promise<Response>;
connect(uri: string, auth: CouchDBCredentials, disableRequestURI: boolean, passphrase: string | false, useDynamicIterationCount: boolean, performSetup: boolean, skipInfo: boolean, compression: boolean, customHeaders: Record<string, string>, useRequestAPI: boolean, getPBKDF2Salt: () => Promise<Uint8Array<ArrayBuffer>>): Promise<string | { connect(uri: string, auth: CouchDBCredentials, disableRequestURI: boolean, passphrase: string | false, useDynamicIterationCount: boolean, performSetup: boolean, skipInfo: boolean, compression: boolean, customHeaders: Record<string, string>, useRequestAPI: boolean, getPBKDF2Salt: () => Promise<Uint8Array>): Promise<string | {
db: PouchDB.Database<EntryDoc>; db: PouchDB.Database<EntryDoc>;
info: PouchDB.Core.DatabaseInfo; info: PouchDB.Core.DatabaseInfo;
}>; }>;
+3 -3
View File
@@ -60,7 +60,7 @@ export interface DispatcherHandler<T extends unknown[], U> {
/** /**
* An interface for dispatch handlers that can add and remove handler functions. * An interface for dispatch handlers that can add and remove handler functions.
*/ */
export interface DispatchHandler<T extends unknown[], U> extends DispatcherHandler<T, U>, MultiRegisterHandler<T, U> { export interface DispatchHandler<T extends unknown[], U> extends DispatcherHandler<T, U>, MultiRegisterHandler<T, U> { // eslint-disable-line @typescript-eslint/no-empty-object-type, @typescript-eslint/no-empty-interface -- Empty interface
} }
/** /**
* A binder that allows assigning and invoking a single handler function. * A binder that allows assigning and invoking a single handler function.
@@ -312,9 +312,9 @@ export interface BooleanMultipleHandlerFunction<TFunc extends (...args: any[]) =
*/ */
removeHandler: (callback: TFunc) => void; removeHandler: (callback: TFunc) => void;
} }
export interface MultiBinderInstance<T extends unknown[], U> extends InvokableHandler<T, U>, MultiRegisterHandler<T, U> { export interface MultiBinderInstance<T extends unknown[], U> extends InvokableHandler<T, U>, MultiRegisterHandler<T, U> { // eslint-disable-line @typescript-eslint/no-empty-object-type, @typescript-eslint/no-empty-interface -- Empty interface
} }
export interface BooleanMultiBinderInstance<T extends unknown[]> extends InvokableBooleanHandler<T>, MultiRegisterHandler<T, boolean> { export interface BooleanMultiBinderInstance<T extends unknown[]> extends InvokableBooleanHandler<T>, MultiRegisterHandler<T, boolean> { // eslint-disable-line @typescript-eslint/no-empty-object-type, @typescript-eslint/no-empty-interface -- Empty interface
} }
export declare function allFunction<TFunc extends (...args: any[]) => Promise<boolean>>(name?: string): BooleanMultipleHandlerFunction<TFunc>; // eslint-disable-line @typescript-eslint/no-explicit-any -- Only type declaration export declare function allFunction<TFunc extends (...args: any[]) => Promise<boolean>>(name?: string): BooleanMultipleHandlerFunction<TFunc>; // eslint-disable-line @typescript-eslint/no-explicit-any -- Only type declaration
export declare function bailFirstFailureFunction<TFunc extends (...args: any[]) => Promise<boolean>>(name?: string): BooleanMultipleHandlerFunction<TFunc>; // eslint-disable-line @typescript-eslint/no-explicit-any -- Only type declaration export declare function bailFirstFailureFunction<TFunc extends (...args: any[]) => Promise<boolean>>(name?: string): BooleanMultipleHandlerFunction<TFunc>; // eslint-disable-line @typescript-eslint/no-explicit-any -- Only type declaration
+1 -1
View File
@@ -1,7 +1,7 @@
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 6de1db1 // REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 6de1db1
import { arrayBufferToBase64, base64ToArrayBuffer, base64ToArrayBufferInternalBrowser, readString, writeString, tryConvertBase64ToArrayBuffer } from "octagonal-wheels/binary"; import { arrayBufferToBase64, base64ToArrayBuffer, base64ToArrayBufferInternalBrowser, readString, writeString, tryConvertBase64ToArrayBuffer } from "octagonal-wheels/binary";
export { arrayBufferToBase64, base64ToArrayBuffer, base64ToArrayBufferInternalBrowser, readString, writeString, tryConvertBase64ToArrayBuffer, }; export { arrayBufferToBase64, base64ToArrayBuffer, base64ToArrayBufferInternalBrowser, readString, writeString, tryConvertBase64ToArrayBuffer, };
export declare function arrayBufferToBase64Single(buffer: Uint8Array<ArrayBuffer> | ArrayBuffer): Promise<string>; export declare function arrayBufferToBase64Single(buffer: Uint8Array | ArrayBuffer): Promise<string>;
export { uint8ArrayToHexString, hexStringToUint8Array } from "octagonal-wheels/binary/hex"; export { uint8ArrayToHexString, hexStringToUint8Array } from "octagonal-wheels/binary/hex";
export { encodeBinaryEach, decodeToArrayBuffer } from "octagonal-wheels/binary/encodedUTF16"; export { encodeBinaryEach, decodeToArrayBuffer } from "octagonal-wheels/binary/encodedUTF16";
export { decodeBinary, encodeBinary } from "octagonal-wheels/binary"; export { decodeBinary, encodeBinary } from "octagonal-wheels/binary";
+2 -2
View File
@@ -11,8 +11,8 @@ export declare function splitPieces2WorkerV2(dataSrc: Blob, pieceSize: number, p
export declare function splitPieces2WorkerRabinKarp(dataSrc: Blob, pieceSize: number, plainSplit: boolean, minimumChunkSize: number, filename?: string, useSegmenter?: boolean): () => AsyncGenerator<string, void, unknown>; export declare function splitPieces2WorkerRabinKarp(dataSrc: Blob, pieceSize: number, plainSplit: boolean, minimumChunkSize: number, filename?: string, useSegmenter?: boolean): () => AsyncGenerator<string, void, unknown>;
export declare function encryptWorker(input: string, passphrase: string, autoCalculateIterations: boolean): Promise<string>; export declare function encryptWorker(input: string, passphrase: string, autoCalculateIterations: boolean): Promise<string>;
export declare function decryptWorker(input: string, passphrase: string, autoCalculateIterations: boolean): Promise<string>; export declare function decryptWorker(input: string, passphrase: string, autoCalculateIterations: boolean): Promise<string>;
export declare function encryptHKDFWorker(input: string, passphrase: string, pbkdf2Salt: Uint8Array<ArrayBuffer>): Promise<string>; export declare function encryptHKDFWorker(input: string, passphrase: string, pbkdf2Salt: Uint8Array): Promise<string>;
export declare function decryptHKDFWorker(input: string, passphrase: string, pbkdf2Salt: Uint8Array<ArrayBuffer>): Promise<string>; export declare function decryptHKDFWorker(input: string, passphrase: string, pbkdf2Salt: Uint8Array): Promise<string>;
export declare const tasks: Map<number, ProcessItem>; export declare const tasks: Map<number, ProcessItem>;
/** /**
* Remove a completed (or aborted) task from both the tasks map and its worker's taskKeys set. * Remove a completed (or aborted) task from both the tasks map and its worker's taskKeys set.
+2 -2
View File
@@ -31,8 +31,8 @@ export declare function splitPieces2WorkerV2(dataSrc: Blob, pieceSize: number, p
export declare function splitPieces2WorkerRabinKarp(dataSrc: Blob, pieceSize: number, plainSplit: boolean, minimumChunkSize: number, filename?: string, useSegmenter?: boolean): () => AsyncGenerator<string, void, unknown>; export declare function splitPieces2WorkerRabinKarp(dataSrc: Blob, pieceSize: number, plainSplit: boolean, minimumChunkSize: number, filename?: string, useSegmenter?: boolean): () => AsyncGenerator<string, void, unknown>;
export declare function encryptWorker(input: string, passphrase: string, autoCalculateIterations: boolean): Promise<string>; export declare function encryptWorker(input: string, passphrase: string, autoCalculateIterations: boolean): Promise<string>;
export declare function decryptWorker(input: string, passphrase: string, autoCalculateIterations: boolean): Promise<string>; export declare function decryptWorker(input: string, passphrase: string, autoCalculateIterations: boolean): Promise<string>;
export declare function encryptHKDFWorker(input: string, passphrase: string, pbkdf2Salt: Uint8Array<ArrayBuffer>): Promise<string>; export declare function encryptHKDFWorker(input: string, passphrase: string, pbkdf2Salt: Uint8Array): Promise<string>;
export declare function decryptHKDFWorker(input: string, passphrase: string, pbkdf2Salt: Uint8Array<ArrayBuffer>): Promise<string>; export declare function decryptHKDFWorker(input: string, passphrase: string, pbkdf2Salt: Uint8Array): Promise<string>;
export declare function startWorker(data: Omit<EncryptHKDFArguments, "key">): EncryptHKDFProcessItem; export declare function startWorker(data: Omit<EncryptHKDFArguments, "key">): EncryptHKDFProcessItem;
export declare function startWorker(data: Omit<EncryptArguments, "key">): EncryptProcessItem; export declare function startWorker(data: Omit<EncryptArguments, "key">): EncryptProcessItem;
export declare function startWorker(data: Omit<SplitArguments, "key">): SplitProcessItem; export declare function startWorker(data: Omit<SplitArguments, "key">): SplitProcessItem;
+1 -1
View File
@@ -12,7 +12,7 @@ export type EncryptHKDFArguments = {
type: "encryptHKDF" | "decryptHKDF"; type: "encryptHKDF" | "decryptHKDF";
input: string; input: string;
passphrase: string; passphrase: string;
pbkdf2Salt: Uint8Array<ArrayBuffer>; pbkdf2Salt: Uint8Array;
}; };
export type SplitArguments = { export type SplitArguments = {
key: number; key: number;
@@ -39,7 +39,7 @@ export declare class DocumentHistoryModal extends Modal {
loadRevs(initialRev?: string): Promise<void>; loadRevs(initialRev?: string): Promise<void>;
BlobURLs: Map<string, string>; BlobURLs: Map<string, string>;
revokeURL(key: string): void; revokeURL(key: string): void;
generateBlobURL(key: string, data: Uint8Array<ArrayBuffer>): string; generateBlobURL(key: string, data: Uint8Array): string;
prepareContentView(usePreformatted?: boolean): void; prepareContentView(usePreformatted?: boolean): void;
appendTextDiff(diff: [number, string][]): void; appendTextDiff(diff: [number, string][]): void;
appendSearchHighlightedText(container: HTMLElement, text: string): void; appendSearchHighlightedText(container: HTMLElement, text: string): void;
+1 -1
View File
@@ -20,7 +20,7 @@ export declare const enum UserMode {
/** /**
* Update User Mode - for users who are updating configuration. May be `existing-user` as well, but possibly they want to treat it differently. * Update User Mode - for users who are updating configuration. May be `existing-user` as well, but possibly they want to treat it differently.
*/ */
Update = "unknown" Update = "unknown" // eslint-disable-line @typescript-eslint/no-duplicate-enum-values -- Duplicate enum value
} }
/** /**
* Setup Manager to handle onboarding and configuration setup * Setup Manager to handle onboarding and configuration setup
+2 -2
View File
@@ -4,9 +4,9 @@ import * as polyfill from "werift";
import { main } from "./main"; import { main } from "./main";
const rtcPolyfillCtor = (polyfill as any).RTCPeerConnection; const rtcPolyfillCtor = (polyfill as any).RTCPeerConnection;
if (typeof (globalThis as any).RTCPeerConnection === "undefined" && typeof rtcPolyfillCtor === "function") { if (typeof (global as any).RTCPeerConnection === "undefined" && typeof rtcPolyfillCtor === "function") {
// Fill only the standard WebRTC global in Node CLI runtime. // Fill only the standard WebRTC global in Node CLI runtime.
(globalThis as any).RTCPeerConnection = rtcPolyfillCtor; (global as any).RTCPeerConnection = rtcPolyfillCtor;
} }
main().catch((error) => { main().catch((error) => {
+2 -2
View File
@@ -83,8 +83,8 @@ function createNodeLocalStorageShim(): LocalStorageShape {
} }
export function ensureGlobalNodeLocalStorage() { export function ensureGlobalNodeLocalStorage() {
if (!("localStorage" in globalThis) || typeof (globalThis as any).localStorage?.getItem !== "function") { if (!("localStorage" in global) || typeof (global as any).localStorage?.getItem !== "function") {
(globalThis as any).localStorage = createNodeLocalStorageShim(); (global as any).localStorage = createNodeLocalStorageShim();
} }
} }
+1 -1
View File
@@ -24,7 +24,7 @@
/* Path mapping */ /* Path mapping */
"paths": { "paths": {
"@/*": ["../../*"], "@/*": ["../../*"],
"@lib/*": ["../../lib/src/*"] "@lib/*": ["../../lib/src/*", "../../../_types/src/lib/src/*"]
} }
}, },
"include": ["*.ts", "**/*.ts", "**/*.tsx"], "include": ["*.ts", "**/*.ts", "**/*.tsx"],
+1 -1
View File
@@ -24,7 +24,7 @@
// "baseUrl": ".", // "baseUrl": ".",
"paths": { "paths": {
"@/*": ["../../*"], "@/*": ["../../*"],
"@lib/*": ["../../lib/src/*"] "@lib/*": ["../../lib/src/*", "../../../_types/src/lib/src/*"]
} }
}, },
"include": ["*.ts", "**/*.ts", "**/*.tsx", "**/*.svelte"], "include": ["*.ts", "**/*.ts", "**/*.tsx", "**/*.svelte"],
+1 -1
View File
@@ -19,7 +19,7 @@
"moduleDetection": "force", "moduleDetection": "force",
"paths": { "paths": {
"@/*": ["../../*"], "@/*": ["../../*"],
"@lib/*": ["../../lib/src/*"] "@lib/*": ["../../lib/src/*", "../../../_types/src/lib/src/*"]
} }
}, },
"include": ["src/**/*.ts", "src/**/*.js", "src/**/*.svelte"], "include": ["src/**/*.ts", "src/**/*.js", "src/**/*.svelte"],
+121 -23
View File
@@ -1,43 +1,141 @@
import { Project, SyntaxKind } from "npm:ts-morph"; import { Project, SyntaxKind } from "npm:ts-morph";
function processFile(filePath: string,origin: string, repoHash: string): string { function processFile(filePath: string, origin: string, repoHash: string): string {
const project = new Project(); const project = new Project();
const sourceFile = project.addSourceFileAtPath(filePath); const sourceFile = project.addSourceFileAtPath(filePath);
// 0. insert a commit hash comment at the top of the file
sourceFile.insertText(0, `// REPO: ${origin} Commit hash: ${repoHash}\n`);
// 1. Collect all 'any' type nodes in the file
const anyTypeNodes = sourceFile.getDescendantsOfKind(SyntaxKind.AnyKeyword);
const sourceText = sourceFile.getFullText();
const lineBreak = sourceText.includes("\r\n") ? "\r\n" : "\n";
const lines = sourceText.split(/\r?\n/);
const targetLines = new Set<number>();
let updated = false; let updated = false;
// 2. Collect the line numbers that contain 'any' // 0. insert a commit hash comment at the top of the file
anyTypeNodes.forEach((anyNode: any) => { sourceFile.insertText(0, `// REPO: ${origin} Commit hash: ${repoHash}\n`);
const { line } = sourceFile.getLineAndColumnAtPos(anyNode.getStart()); updated = true;
targetLines.add(line - 1);
// 1. Replacements for Uint8Array<ArrayBuffer> and DataView<ArrayBuffer>
let sourceText = sourceFile.getFullText();
if (sourceText.includes("Uint8Array<ArrayBuffer>") || sourceText.includes("DataView<ArrayBuffer>")) {
sourceText = sourceText.replace(/Uint8Array<ArrayBuffer>/g, "Uint8Array");
sourceText = sourceText.replace(/DataView<ArrayBuffer>/g, "DataView");
sourceFile.replaceWithText(sourceText);
updated = true;
}
// 2. Remove EventEmitter import from "events" and declare class EventEmitter inline
const imports = sourceFile.getImportDeclarations();
imports.forEach((importDecl) => {
if (importDecl.getModuleSpecifierValue() === "events") {
const defaultImport = importDecl.getDefaultImport();
if (defaultImport && defaultImport.getText() === "EventEmitter") {
importDecl.remove();
sourceFile.addClass({
name: "EventEmitter",
isExported: false,
methods: [
{ name: "on", parameters: [{ name: "event", type: "string | symbol" }, { name: "listener", type: "(...args: any[]) => void" }], returnType: "this" },
{ name: "once", parameters: [{ name: "event", type: "string | symbol" }, { name: "listener", type: "(...args: any[]) => void" }], returnType: "this" },
{ name: "off", parameters: [{ name: "event", type: "string | symbol" }, { name: "listener", type: "(...args: any[]) => void" }], returnType: "this" },
{ name: "emit", parameters: [{ name: "event", type: "string | symbol" }, { name: "args", isRestParameter: true, type: "any[]" }], returnType: "boolean" },
{ name: "addListener", parameters: [{ name: "event", type: "string | symbol" }, { name: "listener", type: "(...args: any[]) => void" }], returnType: "this" },
{ name: "removeListener", parameters: [{ name: "event", type: "string | symbol" }, { name: "listener", type: "(...args: any[]) => void" }], returnType: "this" },
{ name: "removeAllListeners", parameters: [{ name: "event", isOptional: true, type: "string | symbol" }], returnType: "this" },
]
});
updated = true;
}
}
}); });
// 3. Add an inline disable only to lines that contain 'any' // 3. Collect targets for inline disable comments
for (const lineIndex of targetLines) { const targetAnyLines = new Set<number>();
const targetEmptyObjectLines = new Set<number>();
const targetEmptyInterfaceLines = new Set<number>();
const targetDuplicateEnumLines = new Set<number>();
// 3.1. 'any' type nodes
const anyTypeNodes = sourceFile.getDescendantsOfKind(SyntaxKind.AnyKeyword);
anyTypeNodes.forEach((anyNode: any) => {
const { line } = sourceFile.getLineAndColumnAtPos(anyNode.getStart());
targetAnyLines.add(line - 1);
});
// 3.2. Empty object type literals {}
const typeLiterals = sourceFile.getDescendantsOfKind(SyntaxKind.TypeLiteral);
typeLiterals.forEach((node) => {
if (node.getMembers().length === 0) {
const { line } = sourceFile.getLineAndColumnAtPos(node.getStart());
targetEmptyObjectLines.add(line - 1);
}
});
// 3.3. Empty interfaces
const interfaces = sourceFile.getInterfaces();
interfaces.forEach((node) => {
if (node.getMembers().length === 0) {
const { line } = sourceFile.getLineAndColumnAtPos(node.getStart());
targetEmptyInterfaceLines.add(line - 1);
}
});
// 3.4. Duplicate enum member values
const enums = sourceFile.getEnums();
enums.forEach((enumDecl) => {
const values = new Set<string>();
enumDecl.getMembers().forEach((member) => {
const initValue = member.getInitializer()?.getText();
if (initValue) {
if (values.has(initValue)) {
const { line } = sourceFile.getLineAndColumnAtPos(member.getStart());
targetDuplicateEnumLines.add(line - 1);
} else {
values.add(initValue);
}
}
});
});
// 4. Inject ignore comments line by line
const finalSourceText = sourceFile.getFullText();
const lineBreak = finalSourceText.includes("\r\n") ? "\r\n" : "\n";
const lines = finalSourceText.split(/\r?\n/);
// 4.1. Add inline disable to lines that contain 'any'
for (const lineIndex of targetAnyLines) {
const line = lines[lineIndex]; const line = lines[lineIndex];
if (!line) { if (!line) continue;
continue; if (line.includes("eslint-disable-line @typescript-eslint/no-explicit-any")) continue;
}
if (line.includes("eslint-disable-line @typescript-eslint/no-explicit-any")) {
continue;
}
lines[lineIndex] = `${line} // eslint-disable-line @typescript-eslint/no-explicit-any -- Only type declaration`; lines[lineIndex] = `${line} // eslint-disable-line @typescript-eslint/no-explicit-any -- Only type declaration`;
updated = true; updated = true;
} }
// 4.2. Add inline disable to lines that contain empty object {}
for (const lineIndex of targetEmptyObjectLines) {
const line = lines[lineIndex];
if (!line) continue;
if (line.includes("eslint-disable-line") || line.includes("eslint-disable-next-line")) continue;
lines[lineIndex] = `${line} // eslint-disable-line @typescript-eslint/no-empty-object-type, @typescript-eslint/ban-types -- Empty object type`;
updated = true;
}
// 4.3. Add inline disable to lines that contain empty interface
for (const lineIndex of targetEmptyInterfaceLines) {
const line = lines[lineIndex];
if (!line) continue;
if (line.includes("eslint-disable-line") || line.includes("eslint-disable-next-line")) continue;
lines[lineIndex] = `${line} // eslint-disable-line @typescript-eslint/no-empty-object-type, @typescript-eslint/no-empty-interface -- Empty interface`;
updated = true;
}
// 4.4. Add inline disable to lines with duplicate enums
for (const lineIndex of targetDuplicateEnumLines) {
const line = lines[lineIndex];
if (!line) continue;
if (line.includes("eslint-disable-line") || line.includes("eslint-disable-next-line")) continue;
lines[lineIndex] = `${line} // eslint-disable-line @typescript-eslint/no-duplicate-enum-values -- Duplicate enum value`;
updated = true;
}
const updatedSourceText = lines.join(lineBreak); const updatedSourceText = lines.join(lineBreak);
if (updated) { if (updated) {
console.log(`Processed file: ${filePath}`); console.log(`Processed file: ${filePath}`);
} }
// Output the result
return updatedSourceText; return updatedSourceText;
} }