From e1edc051c1660ef474643b903ac4e9a0f2968a05 Mon Sep 17 00:00:00 2001 From: sysrage Date: Sat, 24 Aug 2024 15:51:42 -0400 Subject: [PATCH] chore(bld): remove repetitive code for updating MacOS Helper apps (#1214) --- src/bld/osx.js | 385 ++++++++++--------------------------------------- 1 file changed, 74 insertions(+), 311 deletions(-) diff --git a/src/bld/osx.js b/src/bld/osx.js index dd128811..1601adb6 100644 --- a/src/bld/osx.js +++ b/src/bld/osx.js @@ -5,6 +5,23 @@ import process from 'node:process'; import plist from 'plist'; +/** + * Function to update Helper App Plist Files + * @param {string} plistPath - Path to Helper App Plist File + * @param {string} helperName - Helper App Name + * @param {string} helperId - Helper App ID + * @param {string} appCFBundleIdentifier - options.app.CFBundleIdentifier + */ +async function updateHelperPlist (plistPath, helperName, helperId, appCFBundleIdentifier) { + const plistFullPath = path.resolve(plistPath, 'Contents/Info.plist'); + const plistJson = plist.parse(await fs.promises.readFile(plistFullPath, 'utf-8')); + plistJson.CFBundleDisplayName = helperName; + plistJson.CFBundleName = helperName; + plistJson.CFBundleExecutable = helperName; + plistJson.CFBundleIdentifier = `${appCFBundleIdentifier}.${helperId}`; + await fs.promises.writeFile(plistFullPath, plist.build(plistJson)); +} + /** * * @param {object} options - Options. @@ -40,111 +57,6 @@ export default async function setOsxConfig({ app, outDir, releaseInfo }) { */ const outApp = path.resolve(outDir, `${app.name}.app`); - const nwjsHelperAlertsAppPath = path.resolve( - outApp, - 'Contents', - 'Frameworks', - 'nwjs Framework.framework', - 'Versions', - chromiumVersion, - 'Helpers', - 'nwjs Helper (Alerts).app', - ); - const HelperAlertsAppPath = path.resolve( - outApp, - 'Contents', - 'Frameworks', - 'nwjs Framework.framework', - 'Versions', - chromiumVersion, - 'Helpers', - `${app.name} Helper (Alerts).app`, - ); - - const nwjsHelperGpuAppPath = path.resolve( - outApp, - 'Contents', - 'Frameworks', - 'nwjs Framework.framework', - 'Versions', - chromiumVersion, - 'Helpers', - 'nwjs Helper (GPU).app', - ); - const HelperGpuAppPath = path.resolve( - outApp, - 'Contents', - 'Frameworks', - 'nwjs Framework.framework', - 'Versions', - chromiumVersion, - 'Helpers', - `${app.name} Helper (GPU).app`, - ); - - const nwjsHelperPluginAppPath = path.resolve( - outApp, - 'Contents', - 'Frameworks', - 'nwjs Framework.framework', - 'Versions', - chromiumVersion, - 'Helpers', - 'nwjs Helper (Plugin).app', - ); - const HelperPluginAppPath = path.resolve( - outApp, - 'Contents', - 'Frameworks', - 'nwjs Framework.framework', - 'Versions', - chromiumVersion, - 'Helpers', - `${app.name} Helper (Plugin).app`, - ); - - const nwjsHelperRendererAppPath = path.resolve( - outApp, - 'Contents', - 'Frameworks', - 'nwjs Framework.framework', - 'Versions', - chromiumVersion, - 'Helpers', - 'nwjs Helper (Renderer).app', - ); - const HelperRendererAppPath = path.resolve( - outApp, - 'Contents', - 'Frameworks', - 'nwjs Framework.framework', - 'Versions', - chromiumVersion, - 'Helpers', - `${app.name} Helper (Renderer).app`, - ); - - const nwjsHelperAppPath = path.resolve( - outApp, - 'Contents', - 'Frameworks', - 'nwjs Framework.framework', - 'Versions', - chromiumVersion, - 'Helpers', - 'nwjs Helper.app', - ); - const HelperAppPath = path.resolve( - outApp, - 'Contents', - 'Frameworks', - 'nwjs Framework.framework', - 'Versions', - chromiumVersion, - 'Helpers', - `${app.name} Helper.app`, - ); - /* Rename `nwjs.app` to `${app.name}.app` */ await fs.promises.rename(nwjsApp, outApp); @@ -154,65 +66,40 @@ export default async function setOsxConfig({ app, outDir, releaseInfo }) { path.resolve(outApp, 'Contents', 'MacOS', app.name), ); - /* Rename Helper (Alert) */ - await fs.promises.rename( - nwjsHelperAlertsAppPath, - HelperAlertsAppPath, - ); - - /* Rename Helper (GPU) */ - await fs.promises.rename( - nwjsHelperGpuAppPath, - HelperGpuAppPath, - ); - - /* Rename Helper (Plugin) */ - await fs.promises.rename( - nwjsHelperPluginAppPath, - HelperPluginAppPath, - ); - - /* Rename Helper (Renderer) */ - await fs.promises.rename( - nwjsHelperRendererAppPath, - HelperRendererAppPath, - ); - - /* Rename Helper */ - await fs.promises.rename( - nwjsHelperAppPath, - HelperAppPath, - ); - - /* Rename `nwjs Helper (Alerts)/Contents/MacOS/nwjs Helper (Alerts)` to `${app.name} Helper (Alerts)/Contents/MacOS/${app.name} Helper (Alerts)` */ - await fs.promises.rename( - path.resolve(HelperAlertsAppPath, 'Contents', 'MacOS', 'nwjs Helper (Alerts)'), - path.resolve(HelperAlertsAppPath, 'Contents', 'MacOS', `${app.name} Helper (Alerts)`), - ); - - /* Rename `${app.name} Helper (GPU)/Contents/MacOS/nwjs Helper (GPU)` to `${app.name} Helper (GPU)/Contents/MacOS/${app.name} Helper (GPU)` */ - await fs.promises.rename( - path.resolve(HelperGpuAppPath, 'Contents', 'MacOS', 'nwjs Helper (GPU)'), - path.resolve(HelperGpuAppPath, 'Contents', 'MacOS', `${app.name} Helper (GPU)`), - ); - - /* Rename `${app.name} Helper (Plugin)/Contents/MacOS/nwjs Helper (Plugin)` to `${app.name} Helper (Plugin)/Contents/MacOS/${app.name} Helper (Plugin)` */ - await fs.promises.rename( - path.resolve(HelperPluginAppPath, 'Contents', 'MacOS', 'nwjs Helper (Plugin)'), - path.resolve(HelperPluginAppPath, 'Contents', 'MacOS', `${app.name} Helper (Plugin)`), - ); - - /* Rename `${app.name} Helper (Renderer)/Contents/MacOS/nwjs Helper (Renderer)` to `${app.name} Helper (Renderer)/Contents/MacOS/${app.name} Helper (Renderer)` */ - await fs.promises.rename( - path.resolve(HelperRendererAppPath, 'Contents', 'MacOS', 'nwjs Helper (Renderer)'), - path.resolve(HelperRendererAppPath, 'Contents', 'MacOS', `${app.name} Helper (Renderer)`), - ); - - /* Rename `${app.name} Helper/Contents/MacOS/nwjs Helper` to `${app.name} Helper/Contents/MacOS/${app.name} Helper` */ - await fs.promises.rename( - path.resolve(HelperAppPath, 'Contents', 'MacOS', 'nwjs Helper'), - path.resolve(HelperAppPath, 'Contents', 'MacOS', `${app.name} Helper`), - ); + /* Rename all Helper apps */ + const helperBaseDir = path.resolve( + outApp, + 'Contents/Frameworks/nwjs Framework.framework/Versions', + chromiumVersion, + 'Helpers/' + ); + + const helperApps = [ + { name: 'nwjs Helper (Alerts).app', id: 'helper.alert' }, + { name: 'nwjs Helper (GPU).app', id: 'helper.gpu' }, + { name: 'nwjs Helper (Plugin).app', id: 'helper.plugin' }, + { name: 'nwjs Helper (Renderer).app', id: 'helper.renderer' }, + { name: 'nwjs Helper.app', id: 'helper' }, + ]; + + for (const helperApp of helperApps) { + const newHelperAppName = helperApp.name.replace(/^nwjs/, app.name); + const oldPath = path.resolve(helperBaseDir, helperApp.name); + const newPath = path.resolve(helperBaseDir, newHelperAppName); + + // Rename Helper base directory + await fs.promises.rename(oldPath, newPath); + + // Rename Helper sub-directory + const helperBaseName = helperApp.name.replace(/.app$/, ''); + const subPathBase = path.resolve(newPath, 'Contents/MacOS/'); + const oldSubPath = path.resolve(subPathBase, helperBaseName); + const newSubPath = path.resolve(subPathBase, helperBaseName.replace(/^nwjs/, app.name)); + await fs.promises.rename(oldSubPath, newSubPath); + + // Update Helper Plist file + await updateHelperPlist(newPath, newHelperAppName.replace(/.app$/, ''), helperApp.id, app.CFBundleIdentifier); + } /* Replace default icon with user defined icon if specified. */ if (app.icon !== undefined) { @@ -226,7 +113,7 @@ export default async function setOsxConfig({ app, outDir, releaseInfo }) { * Path to `nwjs.app/Contents/Info.plist` * @type {string} */ - const ContentsInfoPlistPath = path.resolve( + const contentsInfoPlistPath = path.resolve( outApp, 'Contents', 'Info.plist' @@ -236,7 +123,7 @@ export default async function setOsxConfig({ app, outDir, releaseInfo }) { * Path to `nwjs.app/Contents/Resources/en.lproj/InfoPlist.settings` * @type {string} */ - const ContentsResourcesEnLprojInfoPlistStringsPath = path.resolve( + const contentsResourcesEnLprojInfoPlistStringsPath = path.resolve( outApp, 'Contents', 'Resources', @@ -248,144 +135,39 @@ export default async function setOsxConfig({ app, outDir, releaseInfo }) { * JSON from `nwjs.app/Contents/Info.plist` * @type {object} */ - const ContentsInfoPlistJson = plist.parse( - await fs.promises.readFile( - ContentsInfoPlistPath, - 'utf-8' - ) - ); - - /** - * JSON from `${app.name} Helper.app (Alerts)/Contents/Info.plist` - * @type {object} - */ - const HelperAlertsAppJson = plist.parse( - await fs.promises.readFile( - path.resolve( - HelperAlertsAppPath, - 'Contents', - 'Info.plist' - ), - 'utf-8' - ) - ); - - /** - * JSON from `${app.name} Helper (GPU).app/Contents/Info.plist` - * @type {object} - */ - const HelperGpuAppJson = plist.parse( - await fs.promises.readFile( - path.resolve( - HelperGpuAppPath, - 'Contents', - 'Info.plist' - ), - 'utf-8' - ) - ); - - /** - * JSON from `${app.name} Helper (Plugin).app/Contents/Info.plist` - * @type {object} - */ - const HelperPluginAppJson = plist.parse( - await fs.promises.readFile( - path.resolve( - HelperPluginAppPath, - 'Contents', - 'Info.plist' - ), - 'utf-8' - ) - ); - - /** - * JSON from `${app.name} Helper (Renderer).app/Contents/Info.plist` - * @type {object} - */ - const HelperRendererAppJson = plist.parse( - await fs.promises.readFile( - path.resolve( - HelperRendererAppPath, - 'Contents', - 'Info.plist' - ), - 'utf-8' - ) - ); - - /** - * JSON from `${app.name} Helper.app/Contents/Info.plist` - * @type {object} - */ - const HelperAppJson = plist.parse( + const contentsInfoPlistJson = plist.parse( await fs.promises.readFile( - path.resolve( - HelperAppPath, - 'Contents', - 'Info.plist' - ), + contentsInfoPlistPath, 'utf-8' ) ); /* Update Plist with user defined values. */ - ContentsInfoPlistJson.LSApplicationCategoryType = app.LSApplicationCategoryType; - ContentsInfoPlistJson.CFBundleIdentifier = app.CFBundleIdentifier; - ContentsInfoPlistJson.CFBundleName = app.CFBundleName; - ContentsInfoPlistJson.CFBundleDisplayName = app.CFBundleDisplayName; - ContentsInfoPlistJson.CFBundleSpokenName = app.CFBundleSpokenName; - ContentsInfoPlistJson.CFBundleVersion = app.CFBundleVersion; - ContentsInfoPlistJson.CFBundleShortVersionString = app.CFBundleShortVersionString; - ContentsInfoPlistJson.CFBundleExecutable = app.name; + contentsInfoPlistJson.LSApplicationCategoryType = app.LSApplicationCategoryType; + contentsInfoPlistJson.CFBundleIdentifier = app.CFBundleIdentifier; + contentsInfoPlistJson.CFBundleName = app.CFBundleName; + contentsInfoPlistJson.CFBundleDisplayName = app.CFBundleDisplayName; + contentsInfoPlistJson.CFBundleSpokenName = app.CFBundleSpokenName; + contentsInfoPlistJson.CFBundleVersion = app.CFBundleVersion; + contentsInfoPlistJson.CFBundleShortVersionString = app.CFBundleShortVersionString; + contentsInfoPlistJson.CFBundleExecutable = app.name; /* Remove properties that were not updated by the user. */ - Object.keys(ContentsInfoPlistJson).forEach((option) => { - if (ContentsInfoPlistJson[option] === undefined) { - delete ContentsInfoPlistJson[option]; + Object.keys(contentsInfoPlistJson).forEach((option) => { + if (contentsInfoPlistJson[option] === undefined) { + delete contentsInfoPlistJson[option]; } }); - /* Update Helper (Alerts) app's Plist values. */ - HelperAlertsAppJson.CFBundleDisplayName = `${app.name} Helper (Alerts)`; - HelperAlertsAppJson.CFBundleName = `${app.name} Helper (Alerts)`; - HelperAlertsAppJson.CFBundleExecutable = `${app.name} Helper (Alerts)`; - HelperAlertsAppJson.CFBundleIdentifier = `${app.CFBundleIdentifier}.helper.alert`; - - /* Update Helper (GPU) app's Plist values. */ - HelperGpuAppJson.CFBundleDisplayName = `${app.name} Helper (GPU)`; - HelperGpuAppJson.CFBundleName = `${app.name} Helper (GPU)`; - HelperGpuAppJson.CFBundleExecutable = `${app.name} Helper (GPU)`; - HelperGpuAppJson.CFBundleIdentifier = `${app.CFBundleIdentifier}.helper.gpu`; - - /* Update Helper (Plugin) app's Plist values. */ - HelperPluginAppJson.CFBundleDisplayName = `${app.name} Helper (Plugin)`; - HelperPluginAppJson.CFBundleName = `${app.name} Helper (Plugin)`; - HelperPluginAppJson.CFBundleExecutable = `${app.name} Helper (Plugin)`; - HelperPluginAppJson.CFBundleIdentifier = `${app.CFBundleIdentifier}.helper.plugin`; - - /* Update Helper (Renderer) app's Plist values. */ - HelperRendererAppJson.CFBundleDisplayName = `${app.name} Helper (Renderer)`; - HelperRendererAppJson.CFBundleName = `${app.name} Helper (Renderer)`; - HelperRendererAppJson.CFBundleExecutable = `${app.name} Helper (Renderer)`; - HelperRendererAppJson.CFBundleIdentifier = `${app.CFBundleIdentifier}.helper.renderer`; - - /* Update Helper app's Plist values. */ - HelperAppJson.CFBundleDisplayName = `${app.name} Helper`; - HelperAppJson.CFBundleName = `${app.name} Helper`; - HelperAppJson.CFBundleExecutable = `${app.name} Helper`; - HelperAppJson.CFBundleIdentifier = `${app.CFBundleIdentifier}.helper`; - /** * Data from `nwjs.app/Contents/Resources/en.lproj/InfoPlist.settings` * @type {string[]} */ - const ContentsResourcesEnLprojInfoPlistStringsArray = (await fs.promises.readFile( - ContentsResourcesEnLprojInfoPlistStringsPath, + const contentsResourcesEnLprojInfoPlistStringsArray = (await fs.promises.readFile( + contentsResourcesEnLprojInfoPlistStringsPath, 'utf-8', )).split('\n'); - ContentsResourcesEnLprojInfoPlistStringsArray.forEach((line, idx, arr) => { + contentsResourcesEnLprojInfoPlistStringsArray.forEach((line, idx, arr) => { if (line.includes('NSHumanReadableCopyright')) { arr[idx] = `NSHumanReadableCopyright = "${app.NSHumanReadableCopyright}";`; @@ -394,32 +176,13 @@ export default async function setOsxConfig({ app, outDir, releaseInfo }) { /* Write the updated values to their config files. */ await fs.promises.writeFile( - ContentsInfoPlistPath, - plist.build(ContentsInfoPlistJson)); - await fs.promises.writeFile( - ContentsResourcesEnLprojInfoPlistStringsPath, - ContentsResourcesEnLprojInfoPlistStringsArray.toString().replace(/,/g, '\n'), - ); + contentsInfoPlistPath, + plist.build(contentsInfoPlistJson)); await fs.promises.writeFile( - path.resolve(HelperAlertsAppPath, 'Contents', 'Info.plist'), - plist.build(HelperAlertsAppJson) - ); - await fs.promises.writeFile( - path.resolve(HelperGpuAppPath, 'Contents', 'Info.plist'), - plist.build(HelperGpuAppJson) - ); - await fs.promises.writeFile( - path.resolve(HelperPluginAppPath, 'Contents', 'Info.plist'), - plist.build(HelperPluginAppJson) - ); - await fs.promises.writeFile( - path.resolve(HelperRendererAppPath, 'Contents', 'Info.plist'), - plist.build(HelperRendererAppJson) - ); - await fs.promises.writeFile( - path.resolve(HelperAppPath, 'Contents', 'Info.plist'), - plist.build(HelperAppJson) + contentsResourcesEnLprojInfoPlistStringsPath, + contentsResourcesEnLprojInfoPlistStringsArray.toString().replace(/,/g, '\n'), ); + } catch (error) { console.error(error); }