|
|
@ -3,6 +3,7 @@ |
|
|
|
// Native
|
|
|
|
import fs from 'fs' |
|
|
|
import path from 'path' |
|
|
|
import { spawnSync } from 'child_process' |
|
|
|
import zlib from 'zlib' |
|
|
|
|
|
|
|
// Packages
|
|
|
@ -22,21 +23,33 @@ import { |
|
|
|
|
|
|
|
fetch.Promise = Promise |
|
|
|
global.Promise = Promise |
|
|
|
const now = path.join(__dirname, 'now') |
|
|
|
const targetWin32 = path.join(__dirname, 'now.exe') |
|
|
|
const target = process.platform === 'win32' ? targetWin32 : now |
|
|
|
const partial = target + '.partial' |
|
|
|
let { platform } = process |
|
|
|
if (detectAlpine()) platform = 'alpine' |
|
|
|
|
|
|
|
const packagePath = path.join(__dirname, '../../package.json') |
|
|
|
const packageJSON = JSON.parse(fs.readFileSync(packagePath, 'utf8')) |
|
|
|
|
|
|
|
const now = path.join(__dirname, 'now') |
|
|
|
const targetWin32 = path.join(__dirname, 'now.exe') |
|
|
|
const target = platform === 'win32' ? targetWin32 : now |
|
|
|
const partial = target + '.partial' |
|
|
|
const backup = target + '.' + packageJSON.version + '.backup' |
|
|
|
|
|
|
|
const platformToName = { |
|
|
|
alpine: 'now-alpine', |
|
|
|
darwin: 'now-macos', |
|
|
|
linux: 'now-linux', |
|
|
|
win32: 'now-win.exe' |
|
|
|
} |
|
|
|
|
|
|
|
async function main() { |
|
|
|
function detectAlpine () { |
|
|
|
if (platform !== 'linux') return false |
|
|
|
// https://github.com/sass/node-sass/issues/1589#issuecomment-265292579
|
|
|
|
const ldd = spawnSync('ldd', [ process.execPath ]).stdout.toString() |
|
|
|
return /\bmusl\b/.test(ldd) |
|
|
|
} |
|
|
|
|
|
|
|
async function download() { |
|
|
|
try { |
|
|
|
fs.writeFileSync( |
|
|
|
now, |
|
|
@ -76,7 +89,7 @@ async function main() { |
|
|
|
showProgress(0) |
|
|
|
|
|
|
|
try { |
|
|
|
const name = platformToName[process.platform] |
|
|
|
const name = platformToName[platform] |
|
|
|
const url = `https://cdn.zeit.co/releases/now/${packageJSON.version}/${name}` |
|
|
|
const resp = await fetch(url, { compress: false }) |
|
|
|
|
|
|
@ -85,6 +98,11 @@ async function main() { |
|
|
|
} |
|
|
|
|
|
|
|
const size = resp.headers.get('content-length') |
|
|
|
|
|
|
|
if (!size) { |
|
|
|
throw new Error('Not found (content-length is absent)') |
|
|
|
} |
|
|
|
|
|
|
|
const ws = fs.createWriteStream(partial) |
|
|
|
|
|
|
|
await new Promise((resolve, reject) => { |
|
|
@ -120,8 +138,17 @@ async function main() { |
|
|
|
}) |
|
|
|
|
|
|
|
fs.renameSync(partial, target) |
|
|
|
fs.writeFileSync(backup, fs.readFileSync(target)) |
|
|
|
} |
|
|
|
|
|
|
|
async function main() { |
|
|
|
if (fs.existsSync(backup)) { |
|
|
|
fs.writeFileSync(target, fs.readFileSync(backup)) |
|
|
|
} else { |
|
|
|
await download() |
|
|
|
} |
|
|
|
|
|
|
|
if (process.platform === 'win32') { |
|
|
|
if (platform === 'win32') { |
|
|
|
// Now.exe is executed only
|
|
|
|
fs.unlinkSync(now) |
|
|
|
// Workaround for https://github.com/npm/cmd-shim/pull/25
|
|
|
|