Reduce Community lint type-safety warnings

This commit is contained in:
vorotamoroz
2026-07-20 18:08:09 +00:00
parent 2cf535332b
commit 104eeadb4b
29 changed files with 664 additions and 318 deletions
+64 -37
View File
@@ -8,11 +8,8 @@ import LevelDBAdapter from "pouchdb-adapter-leveldb";
import find from "pouchdb-find";
import transform from "transform-pouch";
//@ts-ignore
import { findPathToLeaf } from "pouchdb-merge";
//@ts-ignore
import { findPathToLeaf, type RevisionTreeNode } from "pouchdb-merge";
import { adapterFun } from "pouchdb-utils";
//@ts-ignore
import { createError, MISSING_DOC, UNKNOWN_ERROR } from "pouchdb-errors";
import { mapAllTasksWithConcurrencyLimit, unwrapTaskResult } from "octagonal-wheels/concurrency/task";
@@ -28,8 +25,32 @@ type PurgeLogDocument = {
purgeSeq: number;
purges: Array<{ docId: string; rev: string; purgeSeq: number }>;
};
type PurgeMultiResultMap = Record<string, unknown>;
function appendPurgeSeqs(db: PouchDB.Database, docs: PurgeMultiParam[]) {
interface PouchDBPrivateDatabase extends PouchDB.Database {
adapter: string;
purged_infos_limit: number;
_getRevisionTree(
documentId: string,
callback: (error: Error | undefined, revisions?: RevisionTreeNode[]) => void
): void;
_purge(
documentId: string,
revisionPath: string[],
callback: (error: Error | undefined, result?: PurgeMultiResult) => void
): void;
purgeMulti(documents: PurgeMultiParam[]): Promise<PurgeMultiResultMap>;
}
function isRecord(value: unknown): value is Record<string, unknown> {
return typeof value === "object" && value !== null;
}
function isSuccessfulPurge(value: unknown): value is PurgeMultiResult {
return isRecord(value) && value.ok === true;
}
function appendPurgeSeqs(db: PouchDBPrivateDatabase, docs: PurgeMultiParam[]) {
return db
.get<PurgeLogDocument>("_local/purges")
.then(function (doc) {
@@ -40,18 +61,16 @@ function appendPurgeSeqs(db: PouchDB.Database, docs: PurgeMultiParam[]) {
rev: rev$$1,
purgeSeq,
});
//@ts-ignore : missing type def
if (doc.purges.length > db.purged_infos_limit) {
//@ts-ignore : missing type def
doc.purges.splice(0, doc.purges.length - db.purged_infos_limit);
}
doc.purgeSeq = purgeSeq;
}
return doc;
})
.catch(function (err) {
if (err.status !== 404) {
throw err;
.catch(function (error: unknown) {
if (!isRecord(error) || error.status !== 404) {
throw error;
}
return {
_id: "_local/purges",
@@ -71,68 +90,76 @@ function appendPurgeSeqs(db: PouchDB.Database, docs: PurgeMultiParam[]) {
/**
* purge multiple documents at once.
*/
PouchDB.prototype.purgeMulti = adapterFun(
const pouchDBPrototype = (PouchDB as typeof PouchDB & { prototype: PouchDBPrivateDatabase }).prototype;
pouchDBPrototype.purgeMulti = adapterFun<PouchDBPrivateDatabase, [documents: PurgeMultiParam[]], PurgeMultiResultMap>(
"_purgeMulti",
function (
this: PouchDBPrivateDatabase,
docs: PurgeMultiParam[],
callback: (
error: Error,
result?: {
[x: string]: PurgeMultiResult | Error;
}
) => void
callback: (error?: Error, result?: PurgeMultiResultMap) => void
) {
//@ts-ignore
if (typeof this._purge === "undefined") {
return callback(
//@ts-ignore: this ts-ignore might be hiding a `this` bug where we don't have "this" conext.
createError(UNKNOWN_ERROR, "Purge is not implemented in the " + this.adapter + " adapter.")
);
}
//@ts-ignore
// eslint-disable-next-line @typescript-eslint/no-this-alias -- The adapter task callbacks must retain this PouchDB instance.
const self = this;
const tasks = docs.map(
(param) => () =>
new Promise<[PurgeMultiParam, PurgeMultiResult | Error]>((res, rej) => {
new Promise<[PurgeMultiParam, unknown]>((res) => {
const [docId, rev$$1] = param;
self._getRevisionTree(docId, (error: Error, revs: string[]) => {
self._getRevisionTree(docId, (error, revs) => {
if (error) {
return res([param, error]);
}
if (!revs) {
return res([param, createError(MISSING_DOC)]);
}
let path;
let path: string[];
try {
path = findPathToLeaf(revs, rev$$1);
} catch (error) {
//@ts-ignore
return res([param, error.message || error]);
} catch (caught: unknown) {
const failure = caught instanceof Error && caught.message ? caught.message : caught;
return res([param, failure]);
}
self._purge(docId, path, (error: Error, result: PurgeMultiResult) => {
self._purge(docId, path, (error, result) => {
if (error) {
return res([param, error]);
} else {
return res([param, result]);
}
return res([param, result]);
});
});
})
);
(async () => {
const ret = await mapAllTasksWithConcurrencyLimit(1, tasks);
const retAll = ret.map((e) => unwrapTaskResult(e)) as [PurgeMultiParam, PurgeMultiResult | Error][];
await appendPurgeSeqs(
self,
retAll.filter((e) => "ok" in e[1]).map((e) => e[0])
);
const result = Object.fromEntries(retAll.map((e) => [e[0][0], e[1]]));
const retAll: Array<[PurgeMultiParam, unknown]> = [];
for (const entry of ret) {
const outcome = unwrapTaskResult(entry);
if (outcome instanceof Error) {
throw outcome;
}
retAll.push(outcome);
}
const successfullyPurged: PurgeMultiParam[] = [];
const resultEntries: Array<[string, unknown]> = [];
for (const [document, outcome] of retAll) {
if (isSuccessfulPurge(outcome)) {
successfullyPurged.push(document);
}
resultEntries.push([document[0], outcome]);
}
await appendPurgeSeqs(self, successfullyPurged);
const result: PurgeMultiResultMap = Object.fromEntries(resultEntries);
return result;
})()
//@ts-ignore
.then((result) => callback(undefined, result))
.catch((error) => callback(error));
.catch((caught: unknown) => {
const error = caught instanceof Error ? caught : new Error(String(caught));
callback(error);
});
}
);