diff --git a/.gitignore b/.gitignore index 3c3629e..dd87e2d 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ node_modules +build diff --git a/build/bin/now b/build/bin/now deleted file mode 100755 index 15e4148..0000000 --- a/build/bin/now +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env node -'use strict'; - -var _commander = require('commander'); - -var _commander2 = _interopRequireDefault(_commander); - -var _path = require('path'); - -var _copyPaste = require('copy-paste'); - -var _lib = require('../lib'); - -var _lib2 = _interopRequireDefault(_lib); - -var _ms = require('ms'); - -var _ms2 = _interopRequireDefault(_ms); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -_commander2.default.option('-d, --debug', 'Debug mode [off]', false).option('-C, --no-clipboard', 'Do not attempt to copy URL to clipboard').parse(process.argv); - -var path = _commander2.default.args[_commander2.default.args.length - 1]; - -if (path) { - if ('/' !== path[0]) { - path = (0, _path.resolve)(process.cwd(), path); - } -} else { - path = process.cwd(); -} - -var debug = !!_commander2.default.debug; -var clipboard = !_commander2.default.noClipboard; -var start = Date.now(); - -console.log('> Deploying ' + path); - -(0, _lib2.default)(path, { debug: debug }).then(function (url) { - var elapsed = (0, _ms2.default)(new Date() - start); - if (clipboard) { - (0, _copyPaste.copy)(url, function (err) { - console.log('> ' + url + ' ' + (!err ? '(copied to clipboard)' : '') + ' [' + elapsed + ']'); - }); - } else { - console.log('> ' + url + ' [' + elapsed + ']'); - } -}, function (err) { - error(err.message); - process.exit(1); -}); - -function error(err) { - console.error('> \u001b[31mError!\u001b[39m ' + err + '.'); -} \ No newline at end of file diff --git a/build/lib/get-files.js b/build/lib/get-files.js deleted file mode 100644 index d76535c..0000000 --- a/build/lib/get-files.js +++ /dev/null @@ -1,347 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _promise = require('babel-runtime/core-js/promise'); - -var _promise2 = _interopRequireDefault(_promise); - -var _regenerator = require('babel-runtime/regenerator'); - -var _regenerator2 = _interopRequireDefault(_regenerator); - -var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator'); - -var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); - -var _fsPromise = require('fs-promise'); - -var _fsPromise2 = _interopRequireDefault(_fsPromise); - -var _path = require('path'); - -var _arrFlatten = require('arr-flatten'); - -var _arrFlatten2 = _interopRequireDefault(_arrFlatten); - -var _arrayUnique = require('array-unique'); - -var _arrayUnique2 = _interopRequireDefault(_arrayUnique); - -var _minimatch = require('minimatch'); - -var _minimatch2 = _interopRequireDefault(_minimatch); - -var _ignored = require('./ignored'); - -var _ignored2 = _interopRequireDefault(_ignored); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Returns a list of files in the given - * directory that are subject to be - * synchronized. - * - * @param {String} full path to directory - * @return {Array} comprehensive list of paths to sync - */ - -exports.default = function () { - var ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee(path) { - var pkgData, pkg, search, found, npmIgnore, gitIgnore, ignored; - return _regenerator2.default.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - _context.next = 2; - return (0, _fsPromise.readFile)((0, _path.resolve)(path, 'package.json'), 'utf8'); - - case 2: - pkgData = _context.sent; - pkg = JSON.parse(pkgData); - search = (pkg.files || ['.']).concat('package.json'); - - if (pkg.main) search = search.concat(pkg.main); - search = search.map(function (file) { - return asAbsolute(file, path); - }); - - _context.next = 9; - return explode(search); - - case 9: - _context.t0 = _context.sent; - found = (0, _arrayUnique2.default)(_context.t0); - _context.next = 13; - return maybeRead((0, _path.resolve)(path, '.npmignore')); - - case 13: - npmIgnore = _context.sent; - - if (!npmIgnore) { - _context.next = 18; - break; - } - - _context.t1 = ''; - _context.next = 21; - break; - - case 18: - _context.next = 20; - return maybeRead((0, _path.resolve)(path, '.gitignore')); - - case 20: - _context.t1 = _context.sent; - - case 21: - gitIgnore = _context.t1; - ignored = (0, _arrayUnique2.default)(_ignored2.default.concat(gitIgnore.split('\n').filter(invalidFilter)).concat(npmIgnore.split('\n').filter(invalidFilter))).map(function (file) { - return (0, _path.resolve)(path, file); - }); - return _context.abrupt('return', found.filter(ignoredFilter(ignored))); - - case 24: - case 'end': - return _context.stop(); - } - } - }, _callee, this); - })); - return function getFiles(_x) { - return ref.apply(this, arguments); - }; -}(); - -/** - * Returns a filter function that - * excludes ignored files in the path. - * - * @param {String} path - * @return {Function} filter fn - */ - -var ignoredFilter = function ignoredFilter(ignored) { - return function (file) { - return !ignored.some(function (test) { - return (0, _minimatch2.default)(file, test); - }); - }; -}; - -/** - * Returns a filter function that - * excludes invalid rules for .*ignore files - * - * @param {String} path - * @return {Function} filter fn - */ - -var invalidFilter = function invalidFilter(path) { - return !( - /* commments */ - '#' === path[0] || - - /* empty lines or newlines */ - !path.trim().length); -}; - -/** - * Transform relative paths into absolutes, - * and maintains absolutes as such. - * - * @param {String} maybe relative path - * @param {String} parent full path - */ - -var asAbsolute = function asAbsolute(path, parent) { - if ('/' === path[0]) return path; - return (0, _path.resolve)(parent, path); -}; - -/** - * Explodes directories into a full list of files. - * Eg: - * in: ['/a.js', '/b'] - * out: ['/a.js', '/b/c.js', '/b/d.js'] - * - * @param {Array} of {String}s representing paths - * @return {Array} of {String}s of full paths - */ - -var explode = function () { - var ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee5(paths) { - var _this2 = this; - - var many, list; - return _regenerator2.default.wrap(function _callee5$(_context5) { - while (1) { - switch (_context5.prev = _context5.next) { - case 0: - many = function () { - var ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee3(all) { - return _regenerator2.default.wrap(function _callee3$(_context3) { - while (1) { - switch (_context3.prev = _context3.next) { - case 0: - _context3.next = 2; - return _promise2.default.all(all.map(function () { - var ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee2(file) { - return _regenerator2.default.wrap(function _callee2$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - _context2.next = 2; - return list(file); - - case 2: - return _context2.abrupt('return', _context2.sent); - - case 3: - case 'end': - return _context2.stop(); - } - } - }, _callee2, _this2); - })), - _this = _this2; - return function (_x4) { - return ref.apply(_this, arguments); - }; - }())); - - case 2: - return _context3.abrupt('return', _context3.sent); - - case 3: - case 'end': - return _context3.stop(); - } - } - }, _callee3, _this2); - })), - _this = _this2; - return function many(_x3) { - return ref.apply(_this, arguments); - }; - }(); - - list = function () { - var ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee4(file) { - var path, stat, all; - return _regenerator2.default.wrap(function _callee4$(_context4) { - while (1) { - switch (_context4.prev = _context4.next) { - case 0: - path = file; - stat = undefined; - _context4.prev = 2; - _context4.next = 5; - return _fsPromise2.default.stat(path); - - case 5: - stat = _context4.sent; - _context4.next = 14; - break; - - case 8: - _context4.prev = 8; - _context4.t0 = _context4['catch'](2); - - // in case the file comes from `files` or `main` - // and it wasn't specified with `.js` by the user - path = file + '.js'; - _context4.next = 13; - return _fsPromise2.default.stat(path); - - case 13: - stat = _context4.sent; - - case 14: - if (!stat.isDirectory()) { - _context4.next = 21; - break; - } - - _context4.next = 17; - return _fsPromise2.default.readdir(file); - - case 17: - all = _context4.sent; - return _context4.abrupt('return', many(all.map(function (subdir) { - return asAbsolute(subdir, file); - }))); - - case 21: - return _context4.abrupt('return', path); - - case 22: - case 'end': - return _context4.stop(); - } - } - }, _callee4, _this2, [[2, 8]]); - })), - _this = _this2; - return function list(_x5) { - return ref.apply(_this, arguments); - }; - }(); - - _context5.next = 4; - return many(paths); - - case 4: - _context5.t0 = _context5.sent; - return _context5.abrupt('return', (0, _arrFlatten2.default)(_context5.t0)); - - case 6: - case 'end': - return _context5.stop(); - } - } - }, _callee5, this); - })); - return function explode(_x2) { - return ref.apply(this, arguments); - }; -}(); - -/** - * Returns the contents of a file if it exists. - * - * @return {String} results or `''` - */ - -var maybeRead = function () { - var ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee6(path) { - return _regenerator2.default.wrap(function _callee6$(_context6) { - while (1) { - switch (_context6.prev = _context6.next) { - case 0: - _context6.prev = 0; - _context6.next = 3; - return _fsPromise2.default.readFile(path, 'utf8'); - - case 3: - return _context6.abrupt('return', _context6.sent); - - case 6: - _context6.prev = 6; - _context6.t0 = _context6['catch'](0); - return _context6.abrupt('return', ''); - - case 9: - case 'end': - return _context6.stop(); - } - } - }, _callee6, this, [[0, 6]]); - })); - return function maybeRead(_x6) { - return ref.apply(this, arguments); - }; -}(); \ No newline at end of file diff --git a/build/lib/hash.js b/build/lib/hash.js deleted file mode 100644 index 65d9aca..0000000 --- a/build/lib/hash.js +++ /dev/null @@ -1,100 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _map = require('babel-runtime/core-js/map'); - -var _map2 = _interopRequireDefault(_map); - -var _regenerator = require('babel-runtime/regenerator'); - -var _regenerator2 = _interopRequireDefault(_regenerator); - -var _promise = require('babel-runtime/core-js/promise'); - -var _promise2 = _interopRequireDefault(_promise); - -var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator'); - -var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); - -var _fsPromise = require('fs-promise'); - -var _fsPromise2 = _interopRequireDefault(_fsPromise); - -var _crypto = require('crypto'); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Computes hashes for the contents of each file given. - * - * @param {Array} of {String} full paths - * @return {Map} - */ - -exports.default = function () { - var ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee2(files) { - var _this2 = this; - - var entries; - return _regenerator2.default.wrap(function _callee2$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - _context2.next = 2; - return _promise2.default.all(files.map(function () { - var ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee(file) { - var data; - return _regenerator2.default.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - _context.next = 2; - return _fsPromise2.default.readFile(file); - - case 2: - data = _context.sent; - return _context.abrupt('return', [file, hash(data)]); - - case 4: - case 'end': - return _context.stop(); - } - } - }, _callee, _this2); - })), - _this = _this2; - return function (_x2) { - return ref.apply(_this, arguments); - }; - }())); - - case 2: - entries = _context2.sent; - return _context2.abrupt('return', new _map2.default(entries)); - - case 4: - case 'end': - return _context2.stop(); - } - } - }, _callee2, this); - })); - return function hashes(_x) { - return ref.apply(this, arguments); - }; -}(); - -/** - * Computes a hash for the given buf. - * - * @param {Buffer} file data - * @return {String} hex digest - */ - -function hash(buf) { - return (0, _crypto.createHash)('sha1').update(buf).digest('hex'); -} \ No newline at end of file diff --git a/build/lib/ignored.js b/build/lib/ignored.js deleted file mode 100644 index bc4e237..0000000 --- a/build/lib/ignored.js +++ /dev/null @@ -1,6 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = ['._*', '.hg', '.git', '.svn', '.npmrc', '.*.swp', '.DS_Store', '.wafpickle-*', '.lock-wscript', 'npm-debug.log', 'config.gypi', 'node_modules', 'CVS', 'README', 'README.*', 'CHANGELOG', 'History.md', 'LICENSE', 'Readme', 'Readme.*', 'test', 'tests']; \ No newline at end of file diff --git a/build/lib/index.js b/build/lib/index.js deleted file mode 100644 index ea23f28..0000000 --- a/build/lib/index.js +++ /dev/null @@ -1,88 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _regenerator = require('babel-runtime/regenerator'); - -var _regenerator2 = _interopRequireDefault(_regenerator); - -var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator'); - -var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); - -var _fsPromise = require('fs-promise'); - -var _fsPromise2 = _interopRequireDefault(_fsPromise); - -var _getFiles = require('./get-files'); - -var _getFiles2 = _interopRequireDefault(_getFiles); - -var _hash = require('./hash'); - -var _hash2 = _interopRequireDefault(_hash); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -exports.default = function () { - var ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee(path, _ref) { - var debug = _ref.debug; - var files, hashes; - return _regenerator2.default.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - _context.prev = 0; - _context.next = 3; - return _fsPromise2.default.stat(path); - - case 3: - _context.next = 8; - break; - - case 5: - _context.prev = 5; - _context.t0 = _context['catch'](0); - throw new Error('Could not read directory ' + path + '.'); - - case 8: - - if (debug) console.time('> [debug] Getting files'); - _context.next = 11; - return (0, _getFiles2.default)(path); - - case 11: - files = _context.sent; - - if (debug) console.timeEnd('> [debug] Getting files'); - - if (debug) console.time('> [debug] Computing hashes'); - _context.next = 16; - return (0, _hash2.default)(files); - - case 16: - hashes = _context.sent; - - if (debug) console.timeEnd('> [debug] Computing hashes'); - - if (debug) { - hashes.forEach(function (val, key) { - console.log('> [debug] Found "' + key + '" [' + val + ']'); - }); - } - - return _context.abrupt('return', 'https://test.now.run'); - - case 20: - case 'end': - return _context.stop(); - } - } - }, _callee, this, [[0, 5]]); - })); - return function now(_x, _x2) { - return ref.apply(this, arguments); - }; -}(); \ No newline at end of file diff --git a/build/lib/test.js b/build/lib/test.js deleted file mode 100644 index c0c6220..0000000 --- a/build/lib/test.js +++ /dev/null @@ -1,22 +0,0 @@ -'use strict'; - -var _getFiles = require('./get-files'); - -var _getFiles2 = _interopRequireDefault(_getFiles); - -var _path = require('path'); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -(0, _getFiles2.default)((0, _path.resolve)('../mng-test/files-in-package')).then(function (files) { - console.log(files); - - (0, _getFiles2.default)((0, _path.resolve)('../mng-test/files-in-package-ignore')).then(function (files2) { - console.log('ignored: '); - console.log(files2); - }).catch(function (err) { - console.log(err.stack); - }); -}).catch(function (err) { - console.log(err.stack); -}); \ No newline at end of file diff --git a/lib/agent.js b/lib/agent.js new file mode 100644 index 0000000..bd1ce4b --- /dev/null +++ b/lib/agent.js @@ -0,0 +1,50 @@ +import http2 from 'spdy'; +import fetch from 'node-fetch'; + +/** + * Returns a `fetch` version with a similar + * API to the browser's configured with a + * HTTP2 agent. + * + * It encodes `body` automatically as JSON. + * + * @param {String} host + * @return {Function} fetch + */ + +export default class Agent { + constructor (host) { + this._host = host; + this._agent = http2.createAgent({ + host, + port: 443 + }).once('error', (err) => this._onError(err)); + } + + _onError (err) { + // XXX: should we `this.emit()`? + this._error = err; + } + + fetch (path, opts = {}) { + if (this._error) throw new Error('HTTP2 connection error'); + + const { body } = opts; + opts.agent = this._agent; + + if (body && 'object' === typeof body) { + opts.headers['Content-Type'] = 'application/json'; + opts.body = JSON.stringify(body); + } + + if (null != body) { + opts.headers['Content-Length'] = Buffer.byteLength(body); + } + + return fetch(`https://${this._host}${path}`, opts); + } + + close () { + return this._agent.close(); + } +} diff --git a/lib/index.js b/lib/index.js index 5b81c28..1b79f4d 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,6 +1,7 @@ import fs from 'fs-promise'; import getFiles from './get-files'; import hash from './hash'; +import Agent from './Agent'; export default async function now (path, { debug }) { try { @@ -23,5 +24,12 @@ export default async function now (path, { debug }) { }); } + const agent = new Agent('www.google.com'); + if (debug) console.time('> [debug] http'); + const res = await agent.fetch('/now/create'); + if (debug) console.timeEnd('> [debug] http'); + console.log(res.status); + agent.close(); + return 'https://test.now.run'; } diff --git a/package.json b/package.json index 2ad6ac9..d2a9596 100644 --- a/package.json +++ b/package.json @@ -19,9 +19,9 @@ "commander": "2.9.0", "copy-paste": "1.1.4", "fs-promise": "0.4.1", - "http2": "3.3.2", - "isomorphic-fetch": "2.2.1", - "ms": "0.7.1" + "ms": "0.7.1", + "node-fetch": "1.3.3", + "spdy": "3.2.0" }, "devDependencies": { "alpha-sort": "1.0.2",