diff --git a/scripts/build-distributable.js b/scripts/build-distributable.js index 240f18e..196a0ed 100644 --- a/scripts/build-distributable.js +++ b/scripts/build-distributable.js @@ -333,6 +333,17 @@ module.exports = EventEmitter; if (v !== key) bundle.write(v, content) } } + // Real Windows (unlike Wine) may use case-insensitive or normalized path keys. + // Write lowercase variant so lookup finds content regardless of case. + const keyLower = key.toLowerCase() + if (keyLower !== key) bundle.write(keyLower, content) + const winKeyLower = winKey.toLowerCase() + if (winKeyLower !== winKey && winKeyLower !== key) bundle.write(winKeyLower, content) + // Relative-style keys (./package.json, .\node_modules\...) + const relForward = key.startsWith('/') ? '.' + key : './' + key.replace(/^\/+/, '') + if (relForward !== key) bundle.write(relForward, content) + const relBack = relForward.replace(/\//g, '\\') + if (relBack !== key && relBack !== winKey) bundle.write(relBack, content) } } // Verification pass: ensure every .json key in the bundle has valid JSON content @@ -343,7 +354,9 @@ module.exports = EventEmitter; let content = bundle.read(key) const valid = content && content.length > 0 && (() => { try { JSON.parse(content.toString()); return true } catch (_) { return false } })() if (!valid) { - const diskPath = path.join(NATIVE_HOST_DIR, key.replace(/^[/\\]+/, '').replace(/[/\\]/g, path.sep)) + // Normalize key to disk path: strip leading . and slashes, then use path.sep + const keyNorm = key.replace(/^\.?[/\\]+/, '').replace(/^[/\\]+/, '').replace(/[/\\]/g, path.sep) + const diskPath = path.join(NATIVE_HOST_DIR, keyNorm) if (fs.existsSync(diskPath)) { content = fs.readFileSync(diskPath) bundle.write(key, content)