diff --git a/packages/ios-node-api/index.js b/packages/ios-node-api/index.js index c8eb06111..9ae341c4b 100644 --- a/packages/ios-node-api/index.js +++ b/packages/ios-node-api/index.js @@ -15,8 +15,12 @@ if (typeof interop === "undefined") { const module = { exports: {} }; + // `URL.pathname` is percent-encoded, but `process.dlopen` takes a filesystem path. Without + // decoding, a space in the path arrives as "%20" and the load fails with "no such file" — + // which happens for any app bundle whose path contains a space, e.g. + // /Applications/My App.app/… → /Applications/My%20App.app/… // deno-lint-ignore no-process-globals - process.dlopen(module, new URL(path, metaURL).pathname); + process.dlopen(module, decodeURIComponent(new URL(path, metaURL).pathname)); module.exports.init( // deno-lint-ignore no-process-globals diff --git a/packages/macos-node-api/index.cjs b/packages/macos-node-api/index.cjs index fcbc583b2..3104fe8fc 100644 --- a/packages/macos-node-api/index.cjs +++ b/packages/macos-node-api/index.cjs @@ -16,12 +16,18 @@ if (!isNativeScriptRuntime) { // === const module = { exports: {} }; + // `URL.pathname` is percent-encoded, but `process.dlopen` takes a filesystem path. Without + // decoding, a space in the path arrives as "%20" and the load fails with "no such file" — + // which happens for any app bundle whose path contains a space, e.g. + // /Applications/My App.app/… → /Applications/My%20App.app/… process.dlopen( module, - new URL( - "./build/RelWithDebInfo/NativeScript.apple.node/macos-arm64/NativeScript.framework/Versions/A/NativeScript", - `file://${__filename}`, - ).pathname, + decodeURIComponent( + new URL( + "./build/RelWithDebInfo/NativeScript.apple.node/macos-arm64/NativeScript.framework/Versions/A/NativeScript", + `file://${__filename}`, + ).pathname, + ), ); module.exports.init(process.env.METADATA_PATH); } else if (typeof require !== "undefined") { diff --git a/packages/macos-node-api/index.mjs b/packages/macos-node-api/index.mjs index d5a649b32..db0c197b7 100644 --- a/packages/macos-node-api/index.mjs +++ b/packages/macos-node-api/index.mjs @@ -24,8 +24,12 @@ if (!isNativeScriptRuntime) { const module = { exports: {} }; + // `URL.pathname` is percent-encoded, but `process.dlopen` takes a filesystem path. Without + // decoding, a space in the path arrives as "%20" and the load fails with "no such file" — + // which happens for any app bundle whose path contains a space, e.g. + // /Applications/My App.app/… → /Applications/My%20App.app/… // deno-lint-ignore no-process-globals - process.dlopen(module, new URL(path, metaURL).pathname); + process.dlopen(module, decodeURIComponent(new URL(path, metaURL).pathname)); module.exports.init( // deno-lint-ignore no-process-globals