From b07e24489bb388bfcfcb6987bc5789b0cdbc31ec Mon Sep 17 00:00:00 2001 From: antonymarion Date: Wed, 15 Apr 2026 21:20:56 +0200 Subject: [PATCH 1/2] fix(filesystem): sort readdir results chronologically --- .../plugins/filesystem/FilesystemMethodResults.kt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/android/src/main/kotlin/com/capacitorjs/plugins/filesystem/FilesystemMethodResults.kt b/android/src/main/kotlin/com/capacitorjs/plugins/filesystem/FilesystemMethodResults.kt index b2c0c6a..dc3e7fc 100644 --- a/android/src/main/kotlin/com/capacitorjs/plugins/filesystem/FilesystemMethodResults.kt +++ b/android/src/main/kotlin/com/capacitorjs/plugins/filesystem/FilesystemMethodResults.kt @@ -38,7 +38,14 @@ fun createWriteResultObject(uri: Uri, mode: IONFILESaveMode): JSObject? = * @return a result [JSObject] for the list of a directories contents */ fun createReadDirResultObject(list: List): JSObject = JSObject().also { - it.put(OUTPUT_FILES, JSArray(list.map { child -> child.toResultObject() })) + val sorted = list.sortedWith( + compareBy( + { it.lastModifiedTimestamp }, + { it.createdTimestamp }, + { it.name.lowercase() }, + ), + ) + it.put(OUTPUT_FILES, JSArray(sorted.map { child -> child.toResultObject() })) } /** @@ -62,4 +69,4 @@ fun IONFILEUri.Resolved.toResultObject(): JSObject = createUriResultObject(this. * @return a result [JSObject] for an Android [Uri] */ fun createUriResultObject(uri: Uri): JSObject = - JSObject().also { it.put(OUTPUT_URI, uri.toString()) } \ No newline at end of file + JSObject().also { it.put(OUTPUT_URI, uri.toString()) } From b669dc36ba17319137019699161ca46e83bb2587 Mon Sep 17 00:00:00 2001 From: antonymarion Date: Wed, 15 Apr 2026 21:21:15 +0200 Subject: [PATCH 2/2] fix(filesystem): align iOS readdir order with Android --- .../FilesystemOperationExecutor.swift | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/ios/Sources/FilesystemPlugin/FilesystemOperationExecutor.swift b/ios/Sources/FilesystemPlugin/FilesystemOperationExecutor.swift index c5eea30..e9661f8 100644 --- a/ios/Sources/FilesystemPlugin/FilesystemOperationExecutor.swift +++ b/ios/Sources/FilesystemPlugin/FilesystemOperationExecutor.swift @@ -35,7 +35,19 @@ class FilesystemOperationExecutor { try service.removeDirectory(atURL: url, includeIntermediateDirectories: recursive) case .readdir(let url): let directoryAttributes = try service.listDirectory(atURL: url) - .map { try fetchItemAttributesJSObject(using: service, atURL: $0) } + .map { childUrl in + (url: childUrl, attributes: try service.getItemAttributes(atURL: childUrl)) + } + .sorted { lhs, rhs in + if lhs.attributes.modificationDateTimestamp != rhs.attributes.modificationDateTimestamp { + return lhs.attributes.modificationDateTimestamp < rhs.attributes.modificationDateTimestamp + } + if lhs.attributes.creationDateTimestamp != rhs.attributes.creationDateTimestamp { + return lhs.attributes.creationDateTimestamp < rhs.attributes.creationDateTimestamp + } + return lhs.url.lastPathComponent.localizedCaseInsensitiveCompare(rhs.url.lastPathComponent) == .orderedAscending + } + .map { $0.attributes.toJSResult(with: $0.url) } resultData = [Constants.ResultDataKey.files: directoryAttributes] case .stat(let url): resultData = try fetchItemAttributesJSObject(using: service, atURL: url)