#!/usr/bin/env node var concat = require('concat-stream') var cp = require('child_process') var fs = require('fs') var hyperquest = require('hyperquest') var path = require('path') var split = require('split') var through = require('through2') var url = 'https://api.github.com/repos/nodejs/node/contents' var dirs = [ '/test/parallel', '/test/pummel' ] cp.execSync('rm -rf node/*.js', { cwd: path.join(__dirname, '../test') }) var httpOpts = { headers: { 'User-Agent': null // auth if github rate-limits you... // 'Authorization': 'Basic ' + Buffer('username:password').toString('base64'), } } dirs.forEach(function (dir) { var req = hyperquest(url + dir, httpOpts) req.pipe(concat(function (data) { if (req.response.statusCode !== 200) { throw new Error(url + dir + ': ' + data.toString()) } downloadBufferTests(dir, JSON.parse(data)) })) }) function downloadBufferTests (dir, files) { files.forEach(function (file) { if (!/test-buffer.*/.test(file.name)) return if (file.name === 'test-buffer-fakes.js') { // These teses only apply to node, where they're calling into C++ and need to // ensure the prototype can't be faked, or else there will be a segfault. return } console.log(file.download_url) var out = path.join(__dirname, '../test/node', file.name) hyperquest(file.download_url, httpOpts) .pipe(split()) .pipe(testfixer(file.name)) .pipe(fs.createWriteStream(out)) .on('finish', function () { console.log('wrote ' + file.name) }) }) } function testfixer (filename) { var firstline = true return through(function (line, enc, cb) { line = line.toString() if (firstline) { // require buffer explicitly var preamble = 'var Buffer = require(\'../../\').Buffer;\n' if (/use strict/.test(line)) line += '\n' + preamble else line + preamble + '\n' + line firstline = false } // use `var` instead of `const`/`let` line = line.replace(/(const|let) /g, 'var ') // make `var common = require('common')` work line = line.replace(/(var common = require.*)/g, 'var common = { skip: function () {} };') // make `require('../common')` work line = line.replace(/require\('\.\.\/common'\);/g, '') // require browser buffer line = line.replace(/(.*)require\('buffer'\)(.*)/g, '$1require(\'../../\')$2') // comment out console logs line = line.replace(/(.*console\..*)/g, '// $1') // we can't reliably test typed array max-sizes in the browser if (filename === 'test-buffer-big.js') { line = line.replace(/(.*new Int8Array.*RangeError.*)/, '// $1') line = line.replace(/(.*new ArrayBuffer.*RangeError.*)/, '// $1') line = line.replace(/(.*new Float64Array.*RangeError.*)/, '// $1') } // https://github.com/nodejs/node/blob/v0.12/test/parallel/test-buffer.js#L1138 // unfortunately we can't run this because crypto-browserify doesn't work in old // versions of ie if (filename === 'test-buffer.js') { line = line.replace(/^(\s*)(var crypto = require.*)/, '$1// $2') line = line.replace(/(crypto.createHash.*\))/, '1 /*$1*/') } cb(null, line + '\n') }) }