@lacrous/omnicloud 0.2.11 → 0.2.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +28 -17
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +28 -17
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
- package/server/index.js +29 -18
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lacrous/omnicloud",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.13",
|
|
4
4
|
"description": "SDK and core building blocks for OmniCloud — self-hosted cloud storage powered by your Telegram account.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -48,9 +48,9 @@
|
|
|
48
48
|
"prisma": "^6.2.0"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
|
-
"@omnicloud/core": "0.2.
|
|
52
|
-
"@omnicloud/shared": "0.2.
|
|
53
|
-
"@omnicloud/telegram": "0.2.
|
|
51
|
+
"@omnicloud/core": "0.2.13",
|
|
52
|
+
"@omnicloud/shared": "0.2.13",
|
|
53
|
+
"@omnicloud/telegram": "0.2.13",
|
|
54
54
|
"@types/node": "^22.10.0",
|
|
55
55
|
"esbuild": "0.25.12",
|
|
56
56
|
"tsup": "^8.3.0",
|
package/server/index.js
CHANGED
|
@@ -1073,7 +1073,7 @@ var noopActivityRecorder = {
|
|
|
1073
1073
|
// ../core/src/utils/filename.ts
|
|
1074
1074
|
function sanitizeFileName(name) {
|
|
1075
1075
|
const base = name.split(/[/\\]/).pop() ?? name;
|
|
1076
|
-
const cleaned = base.replace(/[\u0000-\u001f\u007f]/g, "").replace(/[<>:"|?*]/g, "_").trim();
|
|
1076
|
+
const cleaned = base.replace(/[\u0000-\u001f\u007f-\u009f]/g, "").replace(/[\u200B-\u200F\u202A-\u202E\u2066-\u2069\uFEFF]/g, "").replace(/[<>:"|?*]/g, "_").trim();
|
|
1077
1077
|
if (!cleaned || cleaned === "." || cleaned === "..") return "";
|
|
1078
1078
|
return cleaned.slice(0, 255);
|
|
1079
1079
|
}
|
|
@@ -1593,6 +1593,23 @@ var FileService = class {
|
|
|
1593
1593
|
}
|
|
1594
1594
|
};
|
|
1595
1595
|
|
|
1596
|
+
// ../core/src/utils/folder-order.ts
|
|
1597
|
+
function deepestFirst(folderIds, folders) {
|
|
1598
|
+
const byId = new Map(folders.map((folder) => [folder.id, folder]));
|
|
1599
|
+
const depthOf = (id) => {
|
|
1600
|
+
let depth = 0;
|
|
1601
|
+
const seen = /* @__PURE__ */ new Set();
|
|
1602
|
+
let cursor = byId.get(id)?.parentId ?? null;
|
|
1603
|
+
while (cursor !== null && !seen.has(cursor)) {
|
|
1604
|
+
seen.add(cursor);
|
|
1605
|
+
depth += 1;
|
|
1606
|
+
cursor = byId.get(cursor)?.parentId ?? null;
|
|
1607
|
+
}
|
|
1608
|
+
return depth;
|
|
1609
|
+
};
|
|
1610
|
+
return [...folderIds].sort((a, b) => depthOf(b) - depthOf(a));
|
|
1611
|
+
}
|
|
1612
|
+
|
|
1596
1613
|
// ../core/src/services/folder-service.ts
|
|
1597
1614
|
var FolderService = class {
|
|
1598
1615
|
constructor(folders, files, engineFor, activity = noopActivityRecorder) {
|
|
@@ -1795,7 +1812,10 @@ var FolderService = class {
|
|
|
1795
1812
|
const remainingFolderIds = new Set(
|
|
1796
1813
|
affected.filter((file) => !removedFileIds.includes(file.id)).map((file) => file.folderId)
|
|
1797
1814
|
);
|
|
1798
|
-
const deletable =
|
|
1815
|
+
const deletable = deepestFirst(
|
|
1816
|
+
folderIds.filter((folderId) => !remainingFolderIds.has(folderId)),
|
|
1817
|
+
subtree
|
|
1818
|
+
);
|
|
1799
1819
|
if (deletable.length > 0) {
|
|
1800
1820
|
await this.folders.deleteMany(deletable);
|
|
1801
1821
|
}
|
|
@@ -1969,22 +1989,13 @@ var TrashService = class {
|
|
|
1969
1989
|
}
|
|
1970
1990
|
const allFolders = await this.folders.listByUser(userId);
|
|
1971
1991
|
const trashedFolders = allFolders.filter((folder) => folder.deletedAt !== null);
|
|
1972
|
-
const
|
|
1973
|
-
|
|
1974
|
-
|
|
1975
|
-
|
|
1976
|
-
while (cursor !== null && !seen.has(cursor)) {
|
|
1977
|
-
seen.add(cursor);
|
|
1978
|
-
const parent = allFolders.find((candidate) => candidate.id === cursor);
|
|
1979
|
-
if (!parent) break;
|
|
1980
|
-
level += 1;
|
|
1981
|
-
cursor = parent.parentId;
|
|
1982
|
-
}
|
|
1983
|
-
return level;
|
|
1984
|
-
};
|
|
1985
|
-
trashedFolders.sort((a, b) => depth(a) - depth(b));
|
|
1992
|
+
const orderedIds = deepestFirst(
|
|
1993
|
+
trashedFolders.map((folder) => folder.id),
|
|
1994
|
+
allFolders
|
|
1995
|
+
);
|
|
1986
1996
|
let deletedFolders = 0;
|
|
1987
|
-
for (const
|
|
1997
|
+
for (const folderId of orderedIds) {
|
|
1998
|
+
const folder = trashedFolders.find((candidate) => candidate.id === folderId);
|
|
1988
1999
|
const stillHasFiles = await this.files.query(
|
|
1989
2000
|
userId,
|
|
1990
2001
|
{ folderId: folder.id, trashed: true },
|
|
@@ -4972,7 +4983,7 @@ function encryptionCheck(configured) {
|
|
|
4972
4983
|
}
|
|
4973
4984
|
|
|
4974
4985
|
// ../../apps/api/src/routes/storage.ts
|
|
4975
|
-
var VERSION = "0.2.
|
|
4986
|
+
var VERSION = "0.2.13";
|
|
4976
4987
|
function registerStorageRoutes(app2, container2) {
|
|
4977
4988
|
app2.get("/api/health", async () => {
|
|
4978
4989
|
const database = await probeDatabase(container2);
|