UNPKG

rifraf

Version:

A simple requestAnimationFrame wrapper with added iteratee creator.

1,793 lines (1,564 loc) 163 kB
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ var request, cancel, root; var syncDelay = 8; var isNative = true; function ctxDelayWrapper(func) { return function (fn, _ctx, _delay) { if (typeof _ctx === 'number' && typeof _delay === 'undefined') { var delay = _ctx; var ctx = void 0; } return func(fn, ctx, delay); } } function fakeRAF (fn, _delay) { var delay = _delay !== void 0 ? _delay : syncDelay; return root.setTimeout(fn, delay); } if (!(request && cancel)) { root = (function () { return this; })(); request = (root.requestAnimationFrame || root.mozRequestAnimationFrame || root.webkitRequestAnimationFrame || fakeRAF); cancel = root.cancelAnimationFrame || root.mozCancelAnimationFrame || root.webkitCancelAnimationFrame || root.webkitCancelRequestAnimationFrame || root.clearTimeout; if (cancel === root.clearTimeout || request === fakeRAF) { isNative = false; request = fakeRAF; } } function iteratee(fn, ctx) { return function _iteratee() { request(fn.apply.bind(fn, ctx || this, arguments)); }; } var delay = ctxDelayWrapper(function _delay(fn, ctx, _delay) { if (typeof ctx === 'object') fn = fn.bind(ctx); return fakeRAF(fn, _delay); }); var iterateeFake = ctxDelayWrapper(function _iterateeFake(fn, ctx, _delay) { return function _iterateeFake() { fakeRAF(fn.apply.bind(fn, ctx || this, arguments), _delay); } }); function sync(_delay) { return typeof _delay === 'number' && (syncDelay = _delay); return syncDelay; } var later = ctxDelayWrapper(function _later(fn, ctx, _delay) { return delay(iteratee(fn, ctx), _delay); }); var latered = ctxDelayWrapper(function _latered(fn, ctx, _delay) { return iterateeFake(iteratee(fn, ctx), _delay); }); module.exports = { isNative: isNative, request: function (fn, ctx) { return request.call(root, (arguments.length > 1) ? fn.bind(ctx) : fn); }, iteratee: iteratee, deferred: iteratee, delay: isNative ? later : delay, delayed: isNative ? latered : iterateeFake, cancel: cancel.bind(root), sync120Hz: sync.bind(root, 8), sync60Hz: sync.bind(root, 16), sync30Hz: sync.bind(root, 33), sync: sync }; },{}],2:[function(require,module,exports){ (function (process){ // Generated by CoffeeScript 1.7.1 (function() { var getNanoSeconds, hrtime, loadTime; if ((typeof performance !== "undefined" && performance !== null) && performance.now) { module.exports = function() { return performance.now(); }; } else if ((typeof process !== "undefined" && process !== null) && process.hrtime) { module.exports = function() { return (getNanoSeconds() - loadTime) / 1e6; }; hrtime = process.hrtime; getNanoSeconds = function() { var hr; hr = hrtime(); return hr[0] * 1e9 + hr[1]; }; loadTime = getNanoSeconds(); } else if (Date.now) { module.exports = function() { return Date.now() - loadTime; }; loadTime = Date.now(); } else { module.exports = function() { return new Date().getTime() - loadTime; }; loadTime = new Date().getTime(); } }).call(this); }).call(this,require('_process')) },{"_process":25}],3:[function(require,module,exports){ (function (process){ var defined = require('defined'); var createDefaultStream = require('./lib/default_stream'); var Test = require('./lib/test'); var createResult = require('./lib/results'); var through = require('through'); var canEmitExit = typeof process !== 'undefined' && process && typeof process.on === 'function' && process.browser !== true ; var canExit = typeof process !== 'undefined' && process && typeof process.exit === 'function' ; var nextTick = typeof setImmediate !== 'undefined' ? setImmediate : process.nextTick ; exports = module.exports = (function () { var harness; var lazyLoad = function () { return getHarness().apply(this, arguments); }; lazyLoad.only = function () { return getHarness().only.apply(this, arguments); }; lazyLoad.createStream = function (opts) { if (!opts) opts = {}; if (!harness) { var output = through(); getHarness({ stream: output, objectMode: opts.objectMode }); return output; } return harness.createStream(opts); }; return lazyLoad function getHarness (opts) { if (!opts) opts = {}; opts.autoclose = !canEmitExit; if (!harness) harness = createExitHarness(opts); return harness; } })(); function createExitHarness (conf) { if (!conf) conf = {}; var harness = createHarness({ autoclose: defined(conf.autoclose, false) }); var stream = harness.createStream({ objectMode: conf.objectMode }); var es = stream.pipe(conf.stream || createDefaultStream()); if (canEmitExit) { es.on('error', function (err) { harness._exitCode = 1 }); } var ended = false; stream.on('end', function () { ended = true }); if (conf.exit === false) return harness; if (!canEmitExit || !canExit) return harness; var inErrorState = false; process.on('exit', function (code) { // let the process exit cleanly. if (code !== 0) { return } if (!ended) { var only = harness._results._only; for (var i = 0; i < harness._tests.length; i++) { var t = harness._tests[i]; if (only && t.name !== only) continue; t._exit(); } } harness.close(); process.exit(code || harness._exitCode); }); return harness; } exports.createHarness = createHarness; exports.Test = Test; exports.test = exports; // tap compat exports.test.skip = Test.skip; var exitInterval; function createHarness (conf_) { if (!conf_) conf_ = {}; var results = createResult(); if (conf_.autoclose !== false) { results.once('done', function () { results.close() }); } var test = function (name, conf, cb) { var t = new Test(name, conf, cb); test._tests.push(t); (function inspectCode (st) { st.on('test', function sub (st_) { inspectCode(st_); }); st.on('result', function (r) { if (!r.ok) test._exitCode = 1 }); })(t); results.push(t); return t; }; test._results = results; test._tests = []; test.createStream = function (opts) { return results.createStream(opts); }; var only = false; test.only = function (name) { if (only) throw new Error('there can only be one only test'); results.only(name); only = true; return test.apply(null, arguments); }; test._exitCode = 0; test.close = function () { results.close() }; return test; } }).call(this,require('_process')) },{"./lib/default_stream":4,"./lib/results":5,"./lib/test":6,"_process":25,"defined":10,"through":14}],4:[function(require,module,exports){ (function (process){ var through = require('through'); var fs = require('fs'); module.exports = function () { var line = ''; var stream = through(write, flush); return stream; function write (buf) { for (var i = 0; i < buf.length; i++) { var c = typeof buf === 'string' ? buf.charAt(i) : String.fromCharCode(buf[i]) ; if (c === '\n') flush(); else line += c; } } function flush () { if (fs.writeSync && /^win/.test(process.platform)) { try { fs.writeSync(1, line + '\n'); } catch (e) { stream.emit('error', e) } } else { try { console.log(line) } catch (e) { stream.emit('error', e) } } line = ''; } }; }).call(this,require('_process')) },{"_process":25,"fs":16,"through":14}],5:[function(require,module,exports){ (function (process){ var EventEmitter = require('events').EventEmitter; var inherits = require('inherits'); var through = require('through'); var resumer = require('resumer'); var inspect = require('object-inspect'); var nextTick = typeof setImmediate !== 'undefined' ? setImmediate : process.nextTick ; module.exports = Results; inherits(Results, EventEmitter); function Results () { if (!(this instanceof Results)) return new Results; this.count = 0; this.fail = 0; this.pass = 0; this._stream = through(); this.tests = []; } Results.prototype.createStream = function (opts) { if (!opts) opts = {}; var self = this; var output, testId = 0; if (opts.objectMode) { output = through(); self.on('_push', function ontest (t, extra) { if (!extra) extra = {}; var id = testId++; t.once('prerun', function () { var row = { type: 'test', name: t.name, id: id }; if (has(extra, 'parent')) { row.parent = extra.parent; } output.queue(row); }); t.on('test', function (st) { ontest(st, { parent: id }); }); t.on('result', function (res) { res.test = id; res.type = 'assert'; output.queue(res); }); t.on('end', function () { output.queue({ type: 'end', test: id }); }); }); self.on('done', function () { output.queue(null) }); } else { output = resumer(); output.queue('TAP version 13\n'); self._stream.pipe(output); } nextTick(function next() { var t; while (t = getNextTest(self)) { t.run(); if (!t.ended) return t.once('end', function(){ nextTick(next); }); } self.emit('done'); }); return output; }; Results.prototype.push = function (t) { var self = this; self.tests.push(t); self._watch(t); self.emit('_push', t); }; Results.prototype.only = function (name) { if (this._only) { self.count ++; self.fail ++; write('not ok ' + self.count + ' already called .only()\n'); } this._only = name; }; Results.prototype._watch = function (t) { var self = this; var write = function (s) { self._stream.queue(s) }; t.once('prerun', function () { write('# ' + t.name + '\n'); }); t.on('result', function (res) { if (typeof res === 'string') { write('# ' + res + '\n'); return; } write(encodeResult(res, self.count + 1)); self.count ++; if (res.ok) self.pass ++ else self.fail ++ }); t.on('test', function (st) { self._watch(st) }); }; Results.prototype.close = function () { var self = this; if (self.closed) self._stream.emit('error', new Error('ALREADY CLOSED')); self.closed = true; var write = function (s) { self._stream.queue(s) }; write('\n1..' + self.count + '\n'); write('# tests ' + self.count + '\n'); write('# pass ' + self.pass + '\n'); if (self.fail) write('# fail ' + self.fail + '\n') else write('\n# ok\n') self._stream.queue(null); }; function encodeResult (res, count) { var output = ''; output += (res.ok ? 'ok ' : 'not ok ') + count; output += res.name ? ' ' + res.name.toString().replace(/\s+/g, ' ') : ''; if (res.skip) output += ' # SKIP'; else if (res.todo) output += ' # TODO'; output += '\n'; if (res.ok) return output; var outer = ' '; var inner = outer + ' '; output += outer + '---\n'; output += inner + 'operator: ' + res.operator + '\n'; if (has(res, 'expected') || has(res, 'actual')) { var ex = inspect(res.expected); var ac = inspect(res.actual); if (Math.max(ex.length, ac.length) > 65) { output += inner + 'expected:\n' + inner + ' ' + ex + '\n'; output += inner + 'actual:\n' + inner + ' ' + ac + '\n'; } else { output += inner + 'expected: ' + ex + '\n'; output += inner + 'actual: ' + ac + '\n'; } } if (res.at) { output += inner + 'at: ' + res.at + '\n'; } if (res.operator === 'error' && res.actual && res.actual.stack) { var lines = String(res.actual.stack).split('\n'); output += inner + 'stack:\n'; output += inner + ' ' + lines[0] + '\n'; for (var i = 1; i < lines.length; i++) { output += inner + lines[i] + '\n'; } } output += outer + '...\n'; return output; } function getNextTest (results) { if (!results._only) { return results.tests.shift(); } do { var t = results.tests.shift(); if (!t) continue; if (results._only === t.name) { return t; } } while (results.tests.length !== 0) } function has (obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } }).call(this,require('_process')) },{"_process":25,"events":21,"inherits":11,"object-inspect":12,"resumer":13,"through":14}],6:[function(require,module,exports){ (function (process,__dirname){ var deepEqual = require('deep-equal'); var defined = require('defined'); var path = require('path'); var inherits = require('inherits'); var EventEmitter = require('events').EventEmitter; module.exports = Test; var nextTick = typeof setImmediate !== 'undefined' ? setImmediate : process.nextTick ; inherits(Test, EventEmitter); var getTestArgs = function (name_, opts_, cb_) { var name = '(anonymous)'; var opts = {}; var cb; for (var i = 0; i < arguments.length; i++) { var arg = arguments[i]; var t = typeof arg; if (t === 'string') { name = arg; } else if (t === 'object') { opts = arg || opts; } else if (t === 'function') { cb = arg; } } return { name: name, opts: opts, cb: cb }; }; function Test (name_, opts_, cb_) { if (! (this instanceof Test)) { return new Test(name_, opts_, cb_); } var args = getTestArgs(name_, opts_, cb_); this.readable = true; this.name = args.name || '(anonymous)'; this.assertCount = 0; this.pendingCount = 0; this._skip = args.opts.skip || false; this._plan = undefined; this._cb = args.cb; this._progeny = []; this._ok = true; if (args.opts.timeout !== undefined) { this.timeoutAfter(args.opts.timeout); } for (var prop in this) { this[prop] = (function bind(self, val) { if (typeof val === 'function') { return function bound() { return val.apply(self, arguments); }; } else return val; })(this, this[prop]); } } Test.prototype.run = function () { if (!this._cb || this._skip) { return this._end(); } this.emit('prerun'); this._cb(this); this.emit('run'); }; Test.prototype.test = function (name, opts, cb) { var self = this; var t = new Test(name, opts, cb); this._progeny.push(t); this.pendingCount++; this.emit('test', t); t.on('prerun', function () { self.assertCount++; }) if (!self._pendingAsserts()) { nextTick(function () { self._end(); }); } nextTick(function() { if (!self._plan && self.pendingCount == self._progeny.length) { self._end(); } }); }; Test.prototype.comment = function (msg) { this.emit('result', msg.trim().replace(/^#\s*/, '')); }; Test.prototype.plan = function (n) { this._plan = n; this.emit('plan', n); }; Test.prototype.timeoutAfter = function(ms) { if (!ms) throw new Error('timeoutAfter requires a timespan'); var self = this; var timeout = setTimeout(function() { self.fail('test timed out after ' + ms + 'ms'); self.end(); }, ms); this.once('end', function() { clearTimeout(timeout); }); } Test.prototype.end = function (err) { var self = this; if (arguments.length >= 1) { this.ifError(err); } if (this.calledEnd) { this.fail('.end() called twice'); } this.calledEnd = true; this._end(); }; Test.prototype._end = function (err) { var self = this; if (this._progeny.length) { var t = this._progeny.shift(); t.on('end', function () { self._end() }); t.run(); return; } if (!this.ended) this.emit('end'); var pendingAsserts = this._pendingAsserts(); if (!this._planError && this._plan !== undefined && pendingAsserts) { this._planError = true; this.fail('plan != count', { expected : this._plan, actual : this.assertCount }); } this.ended = true; }; Test.prototype._exit = function () { if (this._plan !== undefined && !this._planError && this.assertCount !== this._plan) { this._planError = true; this.fail('plan != count', { expected : this._plan, actual : this.assertCount, exiting : true }); } else if (!this.ended) { this.fail('test exited without ending', { exiting: true }); } }; Test.prototype._pendingAsserts = function () { if (this._plan === undefined) { return 1; } else { return this._plan - (this._progeny.length + this.assertCount); } }; Test.prototype._assert = function assert (ok, opts) { var self = this; var extra = opts.extra || {}; var res = { id : self.assertCount ++, ok : Boolean(ok), skip : defined(extra.skip, opts.skip), name : defined(extra.message, opts.message, '(unnamed assert)'), operator : defined(extra.operator, opts.operator) }; if (has(opts, 'actual') || has(extra, 'actual')) { res.actual = defined(extra.actual, opts.actual); } if (has(opts, 'expected') || has(extra, 'expected')) { res.expected = defined(extra.expected, opts.expected); } this._ok = Boolean(this._ok && ok); if (!ok) { res.error = defined(extra.error, opts.error, new Error(res.name)); } if (!ok) { var e = new Error('exception'); var err = (e.stack || '').split('\n'); var dir = path.dirname(__dirname) + '/'; for (var i = 0; i < err.length; i++) { var m = /^[^\s]*\s*\bat\s+(.+)/.exec(err[i]); if (!m) { continue; } var s = m[1].split(/\s+/); var filem = /(\/[^:\s]+:(\d+)(?::(\d+))?)/.exec(s[1]); if (!filem) { filem = /(\/[^:\s]+:(\d+)(?::(\d+))?)/.exec(s[2]); if (!filem) { filem = /(\/[^:\s]+:(\d+)(?::(\d+))?)/.exec(s[3]); if (!filem) { continue; } } } if (filem[1].slice(0, dir.length) === dir) { continue; } res.functionName = s[0]; res.file = filem[1]; res.line = Number(filem[2]); if (filem[3]) res.column = filem[3]; res.at = m[1]; break; } } self.emit('result', res); var pendingAsserts = self._pendingAsserts(); if (!pendingAsserts) { if (extra.exiting) { self._end(); } else { nextTick(function () { self._end(); }); } } if (!self._planError && pendingAsserts < 0) { self._planError = true; self.fail('plan != count', { expected : self._plan, actual : self._plan - pendingAsserts }); } }; Test.prototype.fail = function (msg, extra) { this._assert(false, { message : msg, operator : 'fail', extra : extra }); }; Test.prototype.pass = function (msg, extra) { this._assert(true, { message : msg, operator : 'pass', extra : extra }); }; Test.prototype.skip = function (msg, extra) { this._assert(true, { message : msg, operator : 'skip', skip : true, extra : extra }); }; Test.prototype.ok = Test.prototype['true'] = Test.prototype.assert = function (value, msg, extra) { this._assert(value, { message : msg, operator : 'ok', expected : true, actual : value, extra : extra }); }; Test.prototype.notOk = Test.prototype['false'] = Test.prototype.notok = function (value, msg, extra) { this._assert(!value, { message : msg, operator : 'notOk', expected : false, actual : value, extra : extra }); }; Test.prototype.error = Test.prototype.ifError = Test.prototype.ifErr = Test.prototype.iferror = function (err, msg, extra) { this._assert(!err, { message : defined(msg, String(err)), operator : 'error', actual : err, extra : extra }); }; Test.prototype.equal = Test.prototype.equals = Test.prototype.isEqual = Test.prototype.is = Test.prototype.strictEqual = Test.prototype.strictEquals = function (a, b, msg, extra) { this._assert(a === b, { message : defined(msg, 'should be equal'), operator : 'equal', actual : a, expected : b, extra : extra }); }; Test.prototype.notEqual = Test.prototype.notEquals = Test.prototype.notStrictEqual = Test.prototype.notStrictEquals = Test.prototype.isNotEqual = Test.prototype.isNot = Test.prototype.not = Test.prototype.doesNotEqual = Test.prototype.isInequal = function (a, b, msg, extra) { this._assert(a !== b, { message : defined(msg, 'should not be equal'), operator : 'notEqual', actual : a, notExpected : b, extra : extra }); }; Test.prototype.deepEqual = Test.prototype.deepEquals = Test.prototype.isEquivalent = Test.prototype.same = function (a, b, msg, extra) { this._assert(deepEqual(a, b, { strict: true }), { message : defined(msg, 'should be equivalent'), operator : 'deepEqual', actual : a, expected : b, extra : extra }); }; Test.prototype.deepLooseEqual = Test.prototype.looseEqual = Test.prototype.looseEquals = function (a, b, msg, extra) { this._assert(deepEqual(a, b), { message : defined(msg, 'should be equivalent'), operator : 'deepLooseEqual', actual : a, expected : b, extra : extra }); }; Test.prototype.notDeepEqual = Test.prototype.notEquivalent = Test.prototype.notDeeply = Test.prototype.notSame = Test.prototype.isNotDeepEqual = Test.prototype.isNotDeeply = Test.prototype.isNotEquivalent = Test.prototype.isInequivalent = function (a, b, msg, extra) { this._assert(!deepEqual(a, b, { strict: true }), { message : defined(msg, 'should not be equivalent'), operator : 'notDeepEqual', actual : a, notExpected : b, extra : extra }); }; Test.prototype.notDeepLooseEqual = Test.prototype.notLooseEqual = Test.prototype.notLooseEquals = function (a, b, msg, extra) { this._assert(!deepEqual(a, b), { message : defined(msg, 'should be equivalent'), operator : 'notDeepLooseEqual', actual : a, expected : b, extra : extra }); }; Test.prototype['throws'] = function (fn, expected, msg, extra) { if (typeof expected === 'string') { msg = expected; expected = undefined; } var caught = undefined; try { fn(); } catch (err) { caught = { error : err }; var message = err.message; delete err.message; err.message = message; } var passed = caught; if (expected instanceof RegExp) { passed = expected.test(caught && caught.error); expected = String(expected); } if (typeof expected === 'function') { passed = caught.error instanceof expected; caught.error = caught.error.constructor; } this._assert(passed, { message : defined(msg, 'should throw'), operator : 'throws', actual : caught && caught.error, expected : expected, error: !passed && caught && caught.error, extra : extra }); }; Test.prototype.doesNotThrow = function (fn, expected, msg, extra) { if (typeof expected === 'string') { msg = expected; expected = undefined; } var caught = undefined; try { fn(); } catch (err) { caught = { error : err }; } this._assert(!caught, { message : defined(msg, 'should not throw'), operator : 'throws', actual : caught && caught.error, expected : expected, error : caught && caught.error, extra : extra }); }; function has (obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } Test.skip = function (name_, _opts, _cb) { var args = getTestArgs.apply(null, arguments); args.opts.skip = true; return Test(args.name, args.opts, args.cb); }; // vim: set softtabstop=4 shiftwidth=4: }).call(this,require('_process'),"/node_modules/tape/lib") },{"_process":25,"deep-equal":7,"defined":10,"events":21,"inherits":11,"path":24}],7:[function(require,module,exports){ var pSlice = Array.prototype.slice; var objectKeys = require('./lib/keys.js'); var isArguments = require('./lib/is_arguments.js'); var deepEqual = module.exports = function (actual, expected, opts) { if (!opts) opts = {}; // 7.1. All identical values are equivalent, as determined by ===. if (actual === expected) { return true; } else if (actual instanceof Date && expected instanceof Date) { return actual.getTime() === expected.getTime(); // 7.3. Other pairs that do not both pass typeof value == 'object', // equivalence is determined by ==. } else if (typeof actual != 'object' && typeof expected != 'object') { return opts.strict ? actual === expected : actual == expected; // 7.4. For all other Object pairs, including Array objects, equivalence is // determined by having the same number of owned properties (as verified // with Object.prototype.hasOwnProperty.call), the same set of keys // (although not necessarily the same order), equivalent values for every // corresponding key, and an identical 'prototype' property. Note: this // accounts for both named and indexed properties on Arrays. } else { return objEquiv(actual, expected, opts); } } function isUndefinedOrNull(value) { return value === null || value === undefined; } function isBuffer (x) { if (!x || typeof x !== 'object' || typeof x.length !== 'number') return false; if (typeof x.copy !== 'function' || typeof x.slice !== 'function') { return false; } if (x.length > 0 && typeof x[0] !== 'number') return false; return true; } function objEquiv(a, b, opts) { var i, key; if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) return false; // an identical 'prototype' property. if (a.prototype !== b.prototype) return false; //~~~I've managed to break Object.keys through screwy arguments passing. // Converting to array solves the problem. if (isArguments(a)) { if (!isArguments(b)) { return false; } a = pSlice.call(a); b = pSlice.call(b); return deepEqual(a, b, opts); } if (isBuffer(a)) { if (!isBuffer(b)) { return false; } if (a.length !== b.length) return false; for (i = 0; i < a.length; i++) { if (a[i] !== b[i]) return false; } return true; } try { var ka = objectKeys(a), kb = objectKeys(b); } catch (e) {//happens when one is a string literal and the other isn't return false; } // having the same number of owned properties (keys incorporates // hasOwnProperty) if (ka.length != kb.length) return false; //the same set of keys (although not necessarily the same order), ka.sort(); kb.sort(); //~~~cheap key test for (i = ka.length - 1; i >= 0; i--) { if (ka[i] != kb[i]) return false; } //equivalent values for every corresponding key, and //~~~possibly expensive deep test for (i = ka.length - 1; i >= 0; i--) { key = ka[i]; if (!deepEqual(a[key], b[key], opts)) return false; } return typeof a === typeof b; } },{"./lib/is_arguments.js":8,"./lib/keys.js":9}],8:[function(require,module,exports){ var supportsArgumentsClass = (function(){ return Object.prototype.toString.call(arguments) })() == '[object Arguments]'; exports = module.exports = supportsArgumentsClass ? supported : unsupported; exports.supported = supported; function supported(object) { return Object.prototype.toString.call(object) == '[object Arguments]'; }; exports.unsupported = unsupported; function unsupported(object){ return object && typeof object == 'object' && typeof object.length == 'number' && Object.prototype.hasOwnProperty.call(object, 'callee') && !Object.prototype.propertyIsEnumerable.call(object, 'callee') || false; }; },{}],9:[function(require,module,exports){ exports = module.exports = typeof Object.keys === 'function' ? Object.keys : shim; exports.shim = shim; function shim (obj) { var keys = []; for (var key in obj) keys.push(key); return keys; } },{}],10:[function(require,module,exports){ module.exports = function () { for (var i = 0; i < arguments.length; i++) { if (arguments[i] !== undefined) return arguments[i]; } }; },{}],11:[function(require,module,exports){ if (typeof Object.create === 'function') { // implementation from standard node.js 'util' module module.exports = function inherits(ctor, superCtor) { ctor.super_ = superCtor ctor.prototype = Object.create(superCtor.prototype, { constructor: { value: ctor, enumerable: false, writable: true, configurable: true } }); }; } else { // old school shim for old browsers module.exports = function inherits(ctor, superCtor) { ctor.super_ = superCtor var TempCtor = function () {} TempCtor.prototype = superCtor.prototype ctor.prototype = new TempCtor() ctor.prototype.constructor = ctor } } },{}],12:[function(require,module,exports){ module.exports = function inspect_ (obj, opts, depth, seen) { if (!opts) opts = {}; var maxDepth = opts.depth === undefined ? 5 : opts.depth; if (depth === undefined) depth = 0; if (depth > maxDepth && maxDepth > 0) return '...'; if (seen === undefined) seen = []; else if (indexOf(seen, obj) >= 0) { return '[Circular]'; } function inspect (value, from) { if (from) { seen = seen.slice(); seen.push(from); } return inspect_(value, opts, depth + 1, seen); } if (typeof obj === 'string') { return inspectString(obj); } else if (typeof obj === 'function') { var name = nameOf(obj); return '[Function' + (name ? ': ' + name : '') + ']'; } else if (obj === null) { return 'null'; } else if (isElement(obj)) { var s = '<' + String(obj.nodeName).toLowerCase(); var attrs = obj.attributes || []; for (var i = 0; i < attrs.length; i++) { s += ' ' + attrs[i].name + '="' + quote(attrs[i].value) + '"'; } s += '>'; if (obj.childNodes && obj.childNodes.length) s += '...'; s += '</' + String(obj.tagName).toLowerCase() + '>'; return s; } else if (isArray(obj)) { if (obj.length === 0) return '[]'; var xs = Array(obj.length); for (var i = 0; i < obj.length; i++) { xs[i] = has(obj, i) ? inspect(obj[i], obj) : ''; } return '[ ' + xs.join(', ') + ' ]'; } else if (typeof obj === 'object' && typeof obj.inspect === 'function') { return obj.inspect(); } else if (typeof obj === 'object' && !isDate(obj) && !isRegExp(obj)) { var xs = [], keys = []; for (var key in obj) { if (has(obj, key)) keys.push(key); } keys.sort(); for (var i = 0; i < keys.length; i++) { var key = keys[i]; if (/[^\w$]/.test(key)) { xs.push(inspect(key) + ': ' + inspect(obj[key], obj)); } else xs.push(key + ': ' + inspect(obj[key], obj)); } if (xs.length === 0) return '{}'; return '{ ' + xs.join(', ') + ' }'; } else return String(obj); }; function quote (s) { return String(s).replace(/"/g, '&quot;'); } function isArray (obj) { return {}.toString.call(obj) === '[object Array]'; } function isDate (obj) { return {}.toString.call(obj) === '[object Date]'; } function isRegExp (obj) { return {}.toString.call(obj) === '[object RegExp]'; } function has (obj, key) { if (!{}.hasOwnProperty) return key in obj; return {}.hasOwnProperty.call(obj, key); } function nameOf (f) { if (f.name) return f.name; var m = f.toString().match(/^function\s*([\w$]+)/); if (m) return m[1]; } function indexOf (xs, x) { if (xs.indexOf) return xs.indexOf(x); for (var i = 0, l = xs.length; i < l; i++) { if (xs[i] === x) return i; } return -1; } function isElement (x) { if (!x || typeof x !== 'object') return false; if (typeof HTMLElement !== 'undefined') { return x instanceof HTMLElement; } else return typeof x.nodeName === 'string' && typeof x.getAttribute === 'function' ; } function inspectString (str) { var s = str.replace(/(['\\])/g, '\\$1').replace(/[\x00-\x1f]/g, lowbyte); return "'" + s + "'"; function lowbyte (c) { var n = c.charCodeAt(0); var x = { 8: 'b', 9: 't', 10: 'n', 12: 'f', 13: 'r' }[n]; if (x) return '\\' + x; return '\\x' + (n < 0x10 ? '0' : '') + n.toString(16); } } },{}],13:[function(require,module,exports){ (function (process){ var through = require('through'); var nextTick = typeof setImmediate !== 'undefined' ? setImmediate : process.nextTick ; module.exports = function (write, end) { var tr = through(write, end); tr.pause(); var resume = tr.resume; var pause = tr.pause; var paused = false; tr.pause = function () { paused = true; return pause.apply(this, arguments); }; tr.resume = function () { paused = false; return resume.apply(this, arguments); }; nextTick(function () { if (!paused) tr.resume(); }); return tr; }; }).call(this,require('_process')) },{"_process":25,"through":14}],14:[function(require,module,exports){ (function (process){ var Stream = require('stream') // through // // a stream that does nothing but re-emit the input. // useful for aggregating a series of changing but not ending streams into one stream) exports = module.exports = through through.through = through //create a readable writable stream. function through (write, end, opts) { write = write || function (data) { this.queue(data) } end = end || function () { this.queue(null) } var ended = false, destroyed = false, buffer = [], _ended = false var stream = new Stream() stream.readable = stream.writable = true stream.paused = false // stream.autoPause = !(opts && opts.autoPause === false) stream.autoDestroy = !(opts && opts.autoDestroy === false) stream.write = function (data) { write.call(this, data) return !stream.paused } function drain() { while(buffer.length && !stream.paused) { var data = buffer.shift() if(null === data) return stream.emit('end') else stream.emit('data', data) } } stream.queue = stream.push = function (data) { // console.error(ended) if(_ended) return stream if(data == null) _ended = true buffer.push(data) drain() return stream } //this will be registered as the first 'end' listener //must call destroy next tick, to make sure we're after any //stream piped from here. //this is only a problem if end is not emitted synchronously. //a nicer way to do this is to make sure this is the last listener for 'end' stream.on('end', function () { stream.readable = false if(!stream.writable && stream.autoDestroy) process.nextTick(function () { stream.destroy() }) }) function _end () { stream.writable = false end.call(stream) if(!stream.readable && stream.autoDestroy) stream.destroy() } stream.end = function (data) { if(ended) return ended = true if(arguments.length) stream.write(data) _end() // will emit or queue return stream } stream.destroy = function () { if(destroyed) return destroyed = true ended = true buffer.length = 0 stream.writable = stream.readable = false stream.emit('close') return stream } stream.pause = function () { if(stream.paused) return stream.paused = true return stream } stream.resume = function () { if(stream.paused) { stream.paused = false stream.emit('resume') } drain() //may have become paused again, //as drain emits 'data'. if(!stream.paused) stream.emit('drain') return stream } return stream } }).call(this,require('_process')) },{"_process":25,"stream":37}],15:[function(require,module,exports){ var test = require('tape'); var now = require('performance-now'); var rifraf = require('../index'); function get7() { var i = 0; var l = 7; var set = []; for (; i < l; i++) { set.push({index: i}); } return set; } if (rifraf.isNative) { test('#request defers approximately 16ms by default', function (t) { t.plan(7); var set = get7(); var i = 0; var start; function tick(dt) { var prev = set[i-1]; var item = set[i++]; item.time = performance.now(); if (prev && i > 2) t.ok((item.time - start) >= 0, 'time has passed: ' + (item.time - prev.time).toFixed(3)); if (item.index === 6) { start = set[1].time; t.ok((item.time - start) > 5 * 16, 'should take at least 5 (80ms) frames of clock time; actual: ' + (item.time - start).toFixed(3)); t.ok(set.every(function (item, index) { var next = set[index + 1]; if (next) { return item.time < next.time; } return true; }), 'callbacks executed in order'); t.end(); return; } rifraf.request(tick); } rifraf.request(function () { start = performance.now(); rifraf.request(tick); }); }); test('#delay allows syncing to <60fps frame rates', function (t) { t.plan(7); var set = get7(); var i = 0; var start; rifraf.sync30Hz(); function tick(dt) { var prev = set[i-1]; var item = set[i++]; item.time = performance.now(); if (prev && i > 2) t.ok((item.time - start) >= 0, 'time has passed: ' + (item.time - prev.time).toFixed(3)); if (item.index === 6) { start = set[1].time; t.ok((item.time - start) > 5 * 33, 'should take at least 5 (160ms) frames of clock time; actual: ' + (item.time - start).toFixed(3)); t.ok(set.every(function (item, index) { var next = set[index + 1]; if (next) { return item.time < next.time; } return true; }), 'callbacks executed in order'); t.end(); return; } rifraf.delay(tick); } rifraf.request(function () { start = performance.now(); rifraf.delay(tick); }); }); } else { test('request defers approximately 8ms by default', function (t) { t.plan(2); var set = get7(); var i = 0; var start = now(); function tick() { var item = set[i++]; item.time = now(); if (item.index === 6) { start = set[1].time; t.ok((item.time - start) > 5 * 8, 'total time > 5 * 8ms; actual(' + (item.time - start).toFixed(3) + ')'); t.ok(set.every(function (item, index) { var next = set[index + 1]; if (next) { return item.time < next.time; } return true; }), 'callbacks executed in order'); t.end(); return; } rifraf.request(tick); } rifraf.request(tick); }); test('request defers approximately 16ms when sync60Hz is called', function (t) { rifraf.sync60Hz(); t.plan(2); var set = get7(); var i = 0; var start = now(); function tick() { var item = set[i++]; item.time = now(); if (item.index === 6) { start = set[1].time t.ok((item.time - start) > 5 * 16, 'total time > 5 * 16ms; actual(' + (item.time - start).toFixed(3) + ')'); t.ok(set.every(function (item, index) { var next = set[index + 1]; if (next) { return item.time < next.time; } return true; }), 'callbacks executed in order'); t.end(); return; } rifraf.request(tick); } rifraf.request(tick); }); test('request defers approximately 33ms when sync30Hz is called', function (t) { rifraf.sync30Hz(); t.plan(2); var set = get7(); var i = 0; var start = now(); function tick() { var item = set[i++]; item.time = now(); if (item.index === 6) { start = set[1].time; t.ok((item.time - start) > 5 * 33, 'total time > 5 * 33ms; actual(' + (item.time - start).toFixed(3) + ')'); t.ok(set.every(function (item, index) { var next = set[index + 1]; if (next) { return item.time < next.time; } return true; }), 'callbacks executed in order'); t.end(); return; } rifraf.request(tick); } rifraf.request(tick); }); } test('callbacks can be cancelled', function (t) { function one() { one.called = true; } function two() { two.called = true; } function three() { three.called = true; } one.handle = rifraf.request(one); two.handle = rifraf.request(two); three.handle = rifraf.request(three); t.ok([one, two, three].every(function (fn) { return fn.handle; }), 'rifraf.request returns a handle'); rifraf.cancel(two.handle); rifraf.request(function () { t.ok(one.called, 'callback one was called'); t.notOk(two.called, 'callback two was not called'); t.ok(three.called, 'callback three was called'); t.end(); }); }); },{"../index":1,"performance-now":2,"tape":3}],16:[function(require,module,exports){ },{}],17:[function(require,module,exports){ /*! * The buffer module from node.js, for the browser. * * @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org> * @license MIT */ var base64 = require('base64-js') var ieee754 = require('ieee754') var isArray = require('is-array') exports.Buffer = Buffer exports.SlowBuffer = Buffer exports.INSPECT_MAX_BYTES = 50 Buffer.poolSize = 8192 // not used by this implementation var kMaxLength = 0x3fffffff /** * If `Buffer.TYPED_ARRAY_SUPPORT`: * === true Use Uint8Array implementation (fastest) * === false Use Object implementation (most compatible, even IE6) * * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, * Opera 11.6+, iOS 4.2+. * * Note: * * - Implementation must support adding new properties to `Uint8Array` instances. * Firefox 4-29 lacked support, fixed in Firefox 30+. * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. * * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. * * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of * incorrect length in some situations. * * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they will * get the Object implementation, which is slower but will work correctly. */ Buffer.TYPED_ARRAY_SUPPORT = (function () { try { var buf = new ArrayBuffer(0) var arr = new Uint8Array(buf) arr.foo = function () { return 42 } return 42 === arr.foo() && // typed array instances can be augmented typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` new Uint8Array(1).subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` } catch (e) { return false } })() /** * Class: Buffer * ============= * * The Buffer constructor returns instances of `Uint8Array` that are augmented * with function properties for all the node `Buffer` API functions. We use * `Uint8Array` so that square bracket notation works as expected -- it returns * a single octet. * * By augmenting the instances, we can avoid modifying the `Uint8Array` * prototype. */ function Buffer (subject, encoding, noZero) { if (!(this instanceof Buffer)) return new Buffer(subject, encoding, noZero) var type = typeof subject // Find the length var length if (type === 'number') length = subject > 0 ? subject >>> 0 : 0 else if (type === 'string') { if (encoding === 'base64') subject = base64clean(subject) length = Buffer.byteLength(subject, encoding) } else if (type === 'object' && subject !== null) { // assume object is array-like if (subject.type === 'Buffer' && isArray(subject.data)) subject = subject.data length = +subject.length > 0 ? Math.floor(+subject.length) : 0 } else throw new TypeError('must start with number, buffer, array or string') if (this.length > kMaxLength) throw new RangeError('Attempt to allocate Buffer larger than maximum ' + 'size: 0x' + kMaxLength.toString(16) + ' bytes') var buf if (Buffer.TYPED_ARRAY_SUPPORT) { // Preferred: Return an augmented `Uint8Array` instance for best performance buf = Buffer._augment(new Uint8Array(length)) } else { // Fallback: Return THIS instance of Buffer (created by `new`) buf = this buf.length = length buf._isBuffer = true } var i if (Buffer.TYPED_ARRAY_SUPPORT && typeof subject.byteLength === 'number') { // Speed optimization -- use set if we're copying from a typed array buf._set(subject) } else if (isArrayish(subject)) { // Treat array-ish objects as a byte array if (Buffer.isBuffer(subject)) { for (i = 0; i < length; i++) buf[i] = subject.readUInt8(i) } else { for (i = 0; i < length; i++) buf[i] = ((subject[i] % 256) + 256) % 256 } } else if (type === 'string') { buf.write(subject, 0, encoding) } else if (type === 'number' && !Buffer.TYPED_ARRAY_SUPPORT && !noZero) { for (i = 0; i < length; i++) { buf[i] = 0 } } return buf } Buffer.isBuffer = function (b) { return !!(b != null && b._isBuffer) } Buffer.compare = function (a, b) { if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) throw new TypeError('Arguments must be Buffers') var x = a.length var y = b.length for (var i = 0, len = Math.min(x, y); i < len && a[i] === b[i]; i++) {} if (i !== len) { x = a[i] y = b[i] } if (x < y) return -1 if (y < x) return 1 return 0 } Buffer.isEncoding = function (encoding) { switch (String(encoding).toLowerCase()) { case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'raw': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return true default: return false } } Buffer.concat = function (list, totalLength) { if (!isArray(list)) throw new TypeError('Usage: Buffer.concat(list[, length])') if (list.length === 0) { return new Buffer(0) } else if (list.length === 1) { return list[0] } var i if (totalLength === undefined) { totalLength = 0