diff --git a/packages/web/package.json b/packages/web/package.json index bb75ed65b8..11bd7a1edd 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -12,7 +12,7 @@ "start:stage": "npm run write-sha && npm run publish-scripts && env-cmd --no-override ./.env/.env.stage npm start", "start:prod": "npm run write-sha && npm run publish-scripts && env-cmd --no-override ./.env/.env.prod npm start", "prebuild": "npm run publish-scripts", - "build": "craco --max-old-space-size=8076 build", + "build": "craco --max-old-space-size=8076 build && cp package.json build/package.json", "build:dev": "npm run write-sha && env-cmd ./.env/.env.dev npm run build && rm -rf build-development && mv build build-development", "build:stage": "npm run write-sha && env-cmd ./.env/.env.stage npm run build && rm -rf build-staging && mv build build-staging", "build:prod": "npm run write-sha && env-cmd ./.env/.env.prod npm run build && rm -rf build-production && mv build build-production", diff --git a/packages/web/scripts/dist.js b/packages/web/scripts/dist.js index fbcff71688..83293b790a 100644 --- a/packages/web/scripts/dist.js +++ b/packages/web/scripts/dist.js @@ -62,7 +62,7 @@ const notarizeFn = async (appId, params) => { try { await notarize({ appBundleId: appId, - appPath: appPath, + appPath, appleId: process.env.APPLE_ID, appleIdPassword: process.env.APPLE_ID_PASSWORD, ascProvider: process.env.ASC_PROVIDER @@ -79,7 +79,7 @@ const notarizeFn = async (appId, params) => { * Write a json file indicating what environment the application is running in * @param {boolean} isProduction */ -const writeEnv = isProduction => { +const writeEnv = (isProduction) => { if (isProduction) { return fse.writeFile( 'electronConfig.json', @@ -96,7 +96,7 @@ const writeEnv = isProduction => { * Generates the correct application info/build config based on the environment * @param {boolean} isProduction */ -const makeBuildParams = isProduction => { +const makeBuildParams = (isProduction) => { const appId = isProduction ? PRODUCTION_APP_ID : STAGING_APP_ID const productName = isProduction ? PRODUCTION_NAME : STAGING_NAME const packageJsonName = isProduction @@ -113,9 +113,9 @@ const makeBuildParams = isProduction => { return { config: { - appId: appId, + appId, npmRebuild: false, - productName: productName, + productName, // Inject data into package.json // https://www.electron.build/configuration/configuration extraMetadata: { @@ -123,7 +123,7 @@ const makeBuildParams = isProduction => { // the app's app-data does not collide (in addition to a different `scheme`). // `productName` controls the app-data location on most platforms. // https://github.com/electron-userland/electron-builder/issues/3429#issuecomment-434024379 - productName: productName, + productName, // `name` controls the app-data location on some linux platforms. // https://github.com/electron/electron/blob/main/docs/api/app.md#appgetname name: packageJsonName @@ -132,7 +132,12 @@ const makeBuildParams = isProduction => { directories: { buildResources: buildDir }, - files: [`${buildDir}/**/*`, 'electronConfig.json', 'src/electron.js'], + files: [ + `${buildDir}/**/*`, + 'electronConfig.json', + 'src/electron.js', + 'package.json' + ], protocols: { // Scheme controls deep links as well as local-storage prefix name: scheme, @@ -170,7 +175,7 @@ const makeBuildParams = isProduction => { }, win: { target: 'nsis', - icon: icon, + icon, publisherName: 'Audius, Inc.' }, linux: { @@ -187,7 +192,7 @@ const makeBuildParams = isProduction => { url: 'https://audius.co' } }, - afterSign: async params => notarizeFn(appId, params), + afterSign: async (params) => notarizeFn(appId, params), publish: { provider: 's3', bucket, @@ -217,7 +222,7 @@ console.log('Creating distribution with the following build params:') console.log(buildParams) writeEnv(program.env === 'production').then(() => { - builder.build(buildParams).catch(e => { + builder.build(buildParams).catch((e) => { console.error(e) process.exit(1) }) diff --git a/packages/web/src/electron.js b/packages/web/src/electron.js index 590d566b01..d152a13177 100644 --- a/packages/web/src/electron.js +++ b/packages/web/src/electron.js @@ -70,6 +70,7 @@ switch (env) { s3Bucket = '' break case 'staging': + console.log('in staging') appEnvironment = Environment.STAGING scheme = 'audius-staging' buildName = 'build-staging' @@ -144,6 +145,22 @@ const registerBuild = (directory) => { ) } +const getNewestBuildDirectory = () => { + const buildDirectory = path.resolve(app.getAppPath(), buildName) + const updateBuildDirectory = appDataPath(buildName) + try { + const updatePackageJsonPath = appDataPath(`${buildName}/package.json`) + const updatePackageJson = JSON.parse(fs.readFileSync(updatePackageJsonPath)) + const updateVersion = updatePackageJson.version + if (semver.gt(updateVersion, appVersion)) { + return updateBuildDirectory + } + } catch (e) { + // do nothing + } + return buildDirectory +} + const downloadWebUpdateAndNotify = async (newVersion) => { const newBuildPath = appDataPath(`${buildName}.tar.gz`) const webUpdateDir = appDataPath('web-update') @@ -182,13 +199,16 @@ const checkForWebUpdate = () => { const newVersion = packageJson.version let currentVersion = appVersion + const packageJsonPath = appDataPath(`${buildName}/package.json`) // Additional check for the version from the build package.json // Needed after web updates because the local package.json version is not updated if (fs.existsSync(packageJsonPath)) { const buildPackageJson = JSON.parse(fs.readFileSync(packageJsonPath)) - currentVersion = buildPackageJson.version + if (semver.gt(buildPackageJson.version, currentVersion)) { + currentVersion = buildPackageJson.version + } } // If there is a patch version update, download it and notify the user @@ -255,15 +275,8 @@ const createWindow = () => { if (appEnvironment === Environment.LOCALHOST) { mainWindow.loadURL(`http://localhost:${localhostPort}`) } else { - const buildDirectory = path.resolve(app.getAppPath(), buildName) - const updateBuildDirectory = appDataPath(buildName) - - // Register the updated build if it exists, otherwise use the default build found via `getAppPath` - registerBuild( - fs.existsSync(updateBuildDirectory) - ? updateBuildDirectory - : buildDirectory - ) + const buildDir = getNewestBuildDirectory() + registerBuild(buildDir) checkForWebUpdate() // Win protocol handler @@ -429,7 +442,6 @@ let canUpdate = false ipcMain.on('update', async (event, arg) => { // eslint-disable-next-line while (!canUpdate) { - console.log('cannot update') await new Promise((resolve) => setTimeout(resolve, 100)) } autoUpdater.quitAndInstall()