From c6e658422de080296f7acfaa1233af6a9bded61d Mon Sep 17 00:00:00 2001 From: Nathan Walker Date: Thu, 16 Apr 2026 12:31:42 -0700 Subject: [PATCH 1/5] fix(core): use enumeratorAtPath for iOS shallow entity enumeration --- .../file-system/file-system-access.ios.ts | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/packages/core/file-system/file-system-access.ios.ts b/packages/core/file-system/file-system-access.ios.ts index e879bc8513..2f978627a4 100644 --- a/packages/core/file-system/file-system-access.ios.ts +++ b/packages/core/file-system/file-system-access.ios.ts @@ -629,19 +629,22 @@ export class FileSystemAccess { private enumEntities(path: string, callback: (entity: { path: string; name: string; extension: string }) => boolean, onError?: (error) => any) { try { const fileManager = NSFileManager.defaultManager; - let files: NSArray; - try { - files = fileManager.contentsOfDirectoryAtPathError(path); - } catch (ex) { + const enumerator = fileManager.enumeratorAtPath(path); + if (!enumerator) { if (onError) { - onError(new Error("Failed to enum files for folder '" + path + "': " + ex)); + onError(new Error("Failed to enum files for folder '" + path + "'")); } return; } - for (let i = 0; i < files.count; i++) { - const file = files.objectAtIndex(i); + let file = enumerator.nextObject() as string; + while (file) { + // Only surface direct children to match the previous shallow enumeration contract. + if (enumerator.level > 1) { + file = enumerator.nextObject() as string; + continue; + } const info = { path: this.concatPath(path, file), @@ -649,7 +652,9 @@ export class FileSystemAccess { extension: '', }; - if (!this.folderExists(this.joinPath(path, file))) { + if (this.folderExists(this.joinPath(path, file))) { + enumerator.skipDescendants(); + } else { info.extension = this.getFileExtension(info.path); } @@ -658,6 +663,8 @@ export class FileSystemAccess { // the callback returned false meaning we should stop the iteration break; } + + file = enumerator.nextObject() as string; } } catch (ex) { if (onError) { From d62974f6d5a6f73da4755af2fba58cda64243a02 Mon Sep 17 00:00:00 2001 From: Nathan Walker Date: Thu, 16 Apr 2026 12:32:33 -0700 Subject: [PATCH 2/5] chore: file-system-tests with nested file checks Added test case for nested file enumeration in file system tests. --- apps/automated/src/file-system/file-system-tests.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/automated/src/file-system/file-system-tests.ts b/apps/automated/src/file-system/file-system-tests.ts index b78254ae01..adafca0f8b 100644 --- a/apps/automated/src/file-system/file-system-tests.ts +++ b/apps/automated/src/file-system/file-system-tests.ts @@ -370,9 +370,11 @@ export var testEnumEntities = function () { var file = documents.getFile('Test.txt'); var file1 = documents.getFile('Test1.txt'); var testFolder = documents.getFolder('testFolder'); + var nestedFile = testFolder.getFile('Nested.txt'); var fileFound = false; var file1Found = false; var testFolderFound = false; + var nestedFileFound = false; var console = { log: function (file) { if (file === 'Test.txt') { @@ -381,6 +383,8 @@ export var testEnumEntities = function () { file1Found = true; } else if (file === 'testFolder') { testFolderFound = true; + } else if (file === 'Nested.txt') { + nestedFileFound = true; } }, }; @@ -395,9 +399,11 @@ export var testEnumEntities = function () { TKUnit.assert(fileFound, 'Failed to enumerate Test.txt'); TKUnit.assert(file1Found, 'Failed to enumerate Test1.txt'); TKUnit.assert(testFolderFound, 'Failed to enumerate testFolder'); + TKUnit.assert(!nestedFileFound, 'eachEntity should not enumerate nested files'); file.remove(); file1.remove(); + nestedFile.remove(); testFolder.remove(); // << (hide) // << file-system-enum-content From 827cf2ad8dc3d74e099a87f4e36ff8efa31d3873 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 16 Apr 2026 21:47:59 +0000 Subject: [PATCH 3/5] fix(core): improve iOS enumEntities error context Agent-Logs-Url: https://github.com/NativeScript/NativeScript/sessions/ab3bdef9-f76e-4cf6-aaf2-2a6c19ea0f7e --- packages/core/file-system/file-system-access.ios.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/core/file-system/file-system-access.ios.ts b/packages/core/file-system/file-system-access.ios.ts index 2f978627a4..f065eb8a6f 100644 --- a/packages/core/file-system/file-system-access.ios.ts +++ b/packages/core/file-system/file-system-access.ios.ts @@ -629,10 +629,18 @@ export class FileSystemAccess { private enumEntities(path: string, callback: (entity: { path: string; name: string; extension: string }) => boolean, onError?: (error) => any) { try { const fileManager = NSFileManager.defaultManager; + if (!this.folderExists(path)) { + if (onError) { + onError(new Error("Failed to enum files for folder '" + path + "': no folder exists at path")); + } + + return; + } + const enumerator = fileManager.enumeratorAtPath(path); if (!enumerator) { if (onError) { - onError(new Error("Failed to enum files for folder '" + path + "'")); + onError(new Error("Failed to enum files for folder '" + path + "': unable to create directory enumerator")); } return; From 4dddf7a99c74c05052a7244a4ea8e4d8f24dfaff Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 16 Apr 2026 21:56:48 +0000 Subject: [PATCH 4/5] fix(core): log and continue on benign iOS enumEntities cases Agent-Logs-Url: https://github.com/NativeScript/NativeScript/sessions/19e57ff7-e568-4deb-853a-aa2b6b14c872 --- packages/core/file-system/file-system-access.ios.ts | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/packages/core/file-system/file-system-access.ios.ts b/packages/core/file-system/file-system-access.ios.ts index f065eb8a6f..59e30aae21 100644 --- a/packages/core/file-system/file-system-access.ios.ts +++ b/packages/core/file-system/file-system-access.ios.ts @@ -630,19 +630,13 @@ export class FileSystemAccess { try { const fileManager = NSFileManager.defaultManager; if (!this.folderExists(path)) { - if (onError) { - onError(new Error("Failed to enum files for folder '" + path + "': no folder exists at path")); - } - + console.error("Failed to enum files for folder '" + path + "': no folder exists at path"); return; } const enumerator = fileManager.enumeratorAtPath(path); if (!enumerator) { - if (onError) { - onError(new Error("Failed to enum files for folder '" + path + "': unable to create directory enumerator")); - } - + console.error("Failed to enum files for folder '" + path + "': unable to create directory enumerator"); return; } From 9880fa418ac1db53a63c3d04e8027c862228d09d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 16 Apr 2026 22:00:26 +0000 Subject: [PATCH 5/5] chore: align enumEntities logging with review suggestions Agent-Logs-Url: https://github.com/NativeScript/NativeScript/sessions/19e57ff7-e568-4deb-853a-aa2b6b14c872 --- packages/core/file-system/file-system-access.ios.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/file-system/file-system-access.ios.ts b/packages/core/file-system/file-system-access.ios.ts index 59e30aae21..a7968c7f44 100644 --- a/packages/core/file-system/file-system-access.ios.ts +++ b/packages/core/file-system/file-system-access.ios.ts @@ -630,13 +630,13 @@ export class FileSystemAccess { try { const fileManager = NSFileManager.defaultManager; if (!this.folderExists(path)) { - console.error("Failed to enum files for folder '" + path + "': no folder exists at path"); + console.error(`Failed to enum files for folder '${path}': no folder exists at path`); return; } const enumerator = fileManager.enumeratorAtPath(path); if (!enumerator) { - console.error("Failed to enum files for folder '" + path + "': unable to create directory enumerator"); + console.error(`Failed to enum files for folder '${path}': unable to create directory enumerator`); return; }