require('colors') const fs = require('fs') const path = require('path') const express = require('express') const app = express() const port = process.env.PORT || 3456 // Load the metadata for the local build of Atom const buildPath = path.resolve(__dirname, '..', '..', 'out') const packageJsonPath = path.join(buildPath, 'app', 'package.json') if (!fs.existsSync(buildPath) || !fs.existsSync(packageJsonPath)) { console.log(`This script requires a full Atom build with release packages for the current platform in the following path:\n ${buildPath}\n`) if (process.platform === 'darwin') { console.log(`Run this command before trying again:\n script/build --compress-artifacts --test-sign\n\n`) } else if (process.platform === 'win32') { console.log(`Run this command before trying again:\n script/build --create-windows-installer\n\n`) } process.exit(1) } const appMetadata = require(packageJsonPath) const versionMatch = appMetadata.version.match(/-(beta|nightly)\d+$/) const releaseChannel = versionMatch ? versionMatch[1] : 'stable' console.log(`Serving ${appMetadata.productName} release assets (channel = ${releaseChannel})\n`.green) function getMacZip (req, res) { console.log(`Received request for atom-mac.zip, sending it`) res.sendFile(path.join(buildPath, 'atom-mac.zip')) } function getMacUpdates (req, res) { if (req.query.version !== appMetadata.version) { const updateInfo = { name: appMetadata.version, pub_date: new Date().toISOString(), url: `http://localhost:${port}/mac/atom-mac.zip`, notes: '
No Details
' } console.log(`Received request for macOS updates (version = ${req.query.version}), sending\n`, updateInfo) res.json(updateInfo) } else { console.log(`Received request for macOS updates, sending 204 as Atom is up to date (version = ${req.query.version})`) res.sendStatus(204) } } function getReleasesFile (fileName) { return function (req, res) { console.log(`Received request for ${fileName}, version: ${req.query.version}`) if (req.query.version) { const versionMatch = (req.query.version || '').match(/-(beta|nightly)\d+$/) const versionChannel = (versionMatch && versionMatch[1]) || 'stable' if (releaseChannel !== versionChannel) { console.log(`Atom requested an update for version ${req.query.version} but the current release channel is ${releaseChannel}`) res.sendStatus(404) return } } res.sendFile(path.join(buildPath, fileName)) } } function getNupkgFile (is64bit) { return function (req, res) { let nupkgFile = req.params.nupkg if (is64bit) { const nupkgMatch = nupkgFile.match(/atom-(.+)-(delta|full)\.nupkg/) if (nupkgMatch) { nupkgFile = `atom-x64-${nupkgMatch[1]}-${nupkgMatch[2]}.nupkg` } } console.log(`Received request for ${req.params.nupkg}, sending ${nupkgFile}`) res.sendFile(path.join(buildPath, nupkgFile)) } } if (process.platform === 'darwin') { app.get('/mac/atom-mac.zip', getMacZip) app.get('/api/updates', getMacUpdates) } else if (process.platform === 'win32') { app.get('/api/updates/RELEASES', getReleasesFile('RELEASES')) app.get('/api/updates/:nupkg', getNupkgFile()) app.get('/api/updates-x64/RELEASES', getReleasesFile('RELEASES-x64')) app.get('/api/updates-x64/:nupkg', getNupkgFile(true)) } else { console.log(`The current platform '${process.platform}' doesn't support Squirrel updates, exiting.`.red) process.exit(1) } app.listen(port, () => { console.log(`Run Atom with ATOM_UPDATE_URL_PREFIX="http://localhost:${port}" set to test updates!\n`.yellow) })