@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.js CHANGED
@@ -1409,7 +1409,7 @@ var noopActivityRecorder = {
1409
1409
  // ../core/src/utils/filename.ts
1410
1410
  function sanitizeFileName(name) {
1411
1411
  const base = name.split(/[/\\]/).pop() ?? name;
1412
- const cleaned = base.replace(/[\u0000-\u001f\u007f]/g, "").replace(/[<>:"|?*]/g, "_").trim();
1412
+ const cleaned = base.replace(/[\u0000-\u001f\u007f-\u009f]/g, "").replace(/[\u200B-\u200F\u202A-\u202E\u2066-\u2069\uFEFF]/g, "").replace(/[<>:"|?*]/g, "_").trim();
1413
1413
  if (!cleaned || cleaned === "." || cleaned === "..") return "";
1414
1414
  return cleaned.slice(0, 255);
1415
1415
  }
@@ -1935,6 +1935,23 @@ var FileService = class {
1935
1935
  }
1936
1936
  };
1937
1937
 
1938
+ // ../core/src/utils/folder-order.ts
1939
+ function deepestFirst(folderIds, folders) {
1940
+ const byId = new Map(folders.map((folder) => [folder.id, folder]));
1941
+ const depthOf = (id) => {
1942
+ let depth = 0;
1943
+ const seen = /* @__PURE__ */ new Set();
1944
+ let cursor = byId.get(id)?.parentId ?? null;
1945
+ while (cursor !== null && !seen.has(cursor)) {
1946
+ seen.add(cursor);
1947
+ depth += 1;
1948
+ cursor = byId.get(cursor)?.parentId ?? null;
1949
+ }
1950
+ return depth;
1951
+ };
1952
+ return [...folderIds].sort((a, b) => depthOf(b) - depthOf(a));
1953
+ }
1954
+
1938
1955
  // ../core/src/services/folder-service.ts
1939
1956
  var FolderService = class {
1940
1957
  constructor(folders, files, engineFor, activity = noopActivityRecorder) {
@@ -2141,7 +2158,10 @@ var FolderService = class {
2141
2158
  const remainingFolderIds = new Set(
2142
2159
  affected.filter((file) => !removedFileIds.includes(file.id)).map((file) => file.folderId)
2143
2160
  );
2144
- const deletable = folderIds.filter((folderId) => !remainingFolderIds.has(folderId));
2161
+ const deletable = deepestFirst(
2162
+ folderIds.filter((folderId) => !remainingFolderIds.has(folderId)),
2163
+ subtree
2164
+ );
2145
2165
  if (deletable.length > 0) {
2146
2166
  await this.folders.deleteMany(deletable);
2147
2167
  }
@@ -2322,22 +2342,13 @@ var TrashService = class {
2322
2342
  }
2323
2343
  const allFolders = await this.folders.listByUser(userId);
2324
2344
  const trashedFolders = allFolders.filter((folder) => folder.deletedAt !== null);
2325
- const depth = (folder) => {
2326
- let level = 0;
2327
- let cursor = folder.parentId;
2328
- const seen = /* @__PURE__ */ new Set();
2329
- while (cursor !== null && !seen.has(cursor)) {
2330
- seen.add(cursor);
2331
- const parent = allFolders.find((candidate) => candidate.id === cursor);
2332
- if (!parent) break;
2333
- level += 1;
2334
- cursor = parent.parentId;
2335
- }
2336
- return level;
2337
- };
2338
- trashedFolders.sort((a, b) => depth(a) - depth(b));
2345
+ const orderedIds = deepestFirst(
2346
+ trashedFolders.map((folder) => folder.id),
2347
+ allFolders
2348
+ );
2339
2349
  let deletedFolders = 0;
2340
- for (const folder of trashedFolders) {
2350
+ for (const folderId of orderedIds) {
2351
+ const folder = trashedFolders.find((candidate) => candidate.id === folderId);
2341
2352
  const stillHasFiles = await this.files.query(
2342
2353
  userId,
2343
2354
  { folderId: folder.id, trashed: true },