Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 +0000 | [diff] [blame] | 1 | // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | var fs = require('fs'); |
| 6 | var http = require('http'); |
| 7 | var https = require('https'); |
| 8 | var path = require('path'); |
| 9 | var parseURL = require('url').parse; |
| 10 | var shell = require('child_process').execSync; |
| 11 | var Stream = require('stream').Transform; |
| 12 | |
| 13 | function fetch(url) { |
| 14 | return new Promise(fetchPromise); |
| 15 | |
| 16 | function fetchPromise(resolve, reject) { |
| 17 | var request; |
| 18 | var protocol = parseURL(url).protocol; |
| 19 | var handleResponse = getCallback.bind(null, resolve, reject); |
| 20 | if (protocol === 'https:') { |
| 21 | request = https.get(url, handleResponse); |
| 22 | } else if (protocol === 'http:') { |
| 23 | request = http.get(url, handleResponse); |
| 24 | } else { |
| 25 | reject(new Error(`Invalid protocol for url: ${url}`)); |
| 26 | return; |
| 27 | } |
| 28 | request.on('error', err => reject(err)); |
| 29 | } |
| 30 | |
| 31 | function getCallback(resolve, reject, response) { |
| 32 | if (response.statusCode !== 200) { |
| 33 | reject(new Error(`Request error: + ${response.statusCode}`)); |
| 34 | return; |
| 35 | } |
| 36 | var body = new Stream(); |
| 37 | response.on('data', chunk => body.push(chunk)); |
| 38 | response.on('end', () => resolve(body.read())); |
| 39 | } |
| 40 | } |
| 41 | |
| 42 | function atob(str) { |
| 43 | return new Buffer(str, 'base64').toString('binary'); |
| 44 | } |
| 45 | |
| 46 | function isFile(path) { |
| 47 | try { |
| 48 | return fs.statSync(path).isFile(); |
| 49 | } catch (error) { |
| 50 | return false; |
| 51 | } |
| 52 | } |
| 53 | |
| 54 | function isDir(path) { |
| 55 | try { |
| 56 | return fs.statSync(path).isDirectory(); |
| 57 | } catch (error) { |
| 58 | return false; |
| 59 | } |
| 60 | } |
| 61 | |
| 62 | function copy(src, dest) { |
| 63 | try { |
| 64 | var targetFilePath = path.resolve(dest, path.basename(src)); |
| 65 | fs.writeFileSync(targetFilePath, fs.readFileSync(src)); |
| 66 | } catch (error) { |
| 67 | throw new Error(`Received an error: [${error}] while trying to copy: ${src} -> ${dest}`); |
| 68 | } |
| 69 | } |
| 70 | |
| 71 | function copyRecursive(src, dest) { |
| 72 | try { |
| 73 | if (isFile(src)) { |
| 74 | copy(src, dest); |
| 75 | return; |
| 76 | } |
| 77 | var targetDirPath = path.resolve(dest, path.basename(src)); |
| 78 | if (!fs.existsSync(targetDirPath)) |
| 79 | fs.mkdirSync(targetDirPath); |
| 80 | if (isDir(src)) { |
| 81 | var files = fs.readdirSync(src); |
| 82 | for (var i = 0; i < files.length; i++) { |
| 83 | var childPath = path.resolve(src, files[i]); |
| 84 | if (isDir(childPath)) { |
| 85 | copyRecursive(childPath, targetDirPath); |
| 86 | } else { |
| 87 | var targetFilePath = path.resolve(targetDirPath, path.basename(childPath)); |
| 88 | fs.writeFileSync(targetFilePath, fs.readFileSync(childPath)); |
| 89 | } |
| 90 | } |
| 91 | } |
| 92 | } catch (error) { |
| 93 | throw new Error(`Received an error: [${error}] while trying to copy: ${src} -> ${dest}`); |
| 94 | } |
| 95 | } |
| 96 | |
| 97 | function removeRecursive(filePath) { |
| 98 | try { |
| 99 | if (fs.existsSync(filePath)) { |
| 100 | if (isFile(filePath)) { |
| 101 | fs.unlinkSync(filePath); |
| 102 | return; |
| 103 | } |
| 104 | var files = fs.readdirSync(filePath); |
| 105 | for (var i = 0; i < files.length; i++) { |
| 106 | var childPath = path.resolve(filePath, files[i]); |
| 107 | if (isDir(childPath)) |
| 108 | removeRecursive(childPath); |
| 109 | else |
| 110 | fs.unlinkSync(childPath); |
| 111 | } |
| 112 | fs.rmdirSync(filePath); |
| 113 | } |
| 114 | } catch (error) { |
| 115 | throw new Error(`Received an error: [${error}] while trying to remove: ${filePath}`); |
| 116 | } |
| 117 | } |
| 118 | |
| 119 | function includes(sequence, target) { |
| 120 | return sequence.indexOf(target) > -1; |
| 121 | } |
| 122 | |
| 123 | function shellOutput(command) { |
| 124 | return shell(command).toString().trim(); |
| 125 | } |
| 126 | |
| 127 | function parseArgs(args) { |
| 128 | var argObject = {}; |
| 129 | for (var i = 0; i < args.length; i++) { |
| 130 | var arg = args[i]; |
| 131 | var components = arg.split('='); |
| 132 | var key = components[0]; |
| 133 | argObject[key] = components[1] || true; |
| 134 | } |
| 135 | return argObject; |
| 136 | } |
| 137 | |
| 138 | module.exports = { |
| 139 | fetch, atob, isFile, isDir, copy, copyRecursive, removeRecursive, includes, shellOutput, parseArgs, |
| 140 | }; |