8889841c.editorconfig 0000666 00000000440 15051444050 0007221 0 ustar 00 # EditorConfig is awesome: http://EditorConfig.org # top-most EditorConfig file root = true [*] charset = utf-8 end_of_line = lf insert_final_newline = true indent_style = tab trim_trailing_whitespace = true [*.md] indent_size = 2 indent_style = space trim_trailing_whitespace = false test/index.js 0000666 00000001006 15051444050 0007167 0 ustar 00 'use strict'; module.exports = function (t, a, d) { var invoked; a(t(function () { a(arguments.length, 0, "Arguments"); invoked = true; }), undefined, "Return"); a(invoked, undefined, "Is not run immediately"); setTimeout(function () { a(invoked, true, "Run in next tick"); invoked = []; t(function () { invoked.push(0); }); t(function () { invoked.push(1); }); t(function () { invoked.push(2); }); setTimeout(function () { a.deep(invoked, [0, 1, 2], "Serial"); d(); }, 10); }, 10); }; index.js 0000666 00000003767 15051444050 0006230 0 ustar 00 'use strict'; var ensureCallable = function (fn) { if (typeof fn !== 'function') throw new TypeError(fn + " is not a function"); return fn; }; var byObserver = function (Observer) { var node = document.createTextNode(''), queue, currentQueue, i = 0; new Observer(function () { var callback; if (!queue) { if (!currentQueue) return; queue = currentQueue; } else if (currentQueue) { queue = currentQueue.concat(queue); } currentQueue = queue; queue = null; if (typeof currentQueue === 'function') { callback = currentQueue; currentQueue = null; callback(); return; } node.data = (i = ++i % 2); // Invoke other batch, to handle leftover callbacks in case of crash while (currentQueue) { callback = currentQueue.shift(); if (!currentQueue.length) currentQueue = null; callback(); } }).observe(node, { characterData: true }); return function (fn) { ensureCallable(fn); if (queue) { if (typeof queue === 'function') queue = [queue, fn]; else queue.push(fn); return; } queue = fn; node.data = (i = ++i % 2); }; }; module.exports = (function () { // Node.js if ((typeof process === 'object') && process && (typeof process.nextTick === 'function')) { return process.nextTick; } // queueMicrotask if (typeof queueMicrotask === "function") { return function (cb) { queueMicrotask(ensureCallable(cb)); }; } // MutationObserver if ((typeof document === 'object') && document) { if (typeof MutationObserver === 'function') return byObserver(MutationObserver); if (typeof WebKitMutationObserver === 'function') return byObserver(WebKitMutationObserver); } // W3C Draft // http://dvcs.w3.org/hg/webperf/raw-file/tip/specs/setImmediate/Overview.html if (typeof setImmediate === 'function') { return function (cb) { setImmediate(ensureCallable(cb)); }; } // Wide available standard if ((typeof setTimeout === 'function') || (typeof setTimeout === 'object')) { return function (cb) { setTimeout(ensureCallable(cb), 0); }; } return null; }()); CHANGES 0000666 00000001663 15051444050 0005547 0 ustar 00 For recent changelog see CHANGELOG.md ----- v1.0.0 -- 2016.06.09 * In case MutationObserver based solution ensure all callbacks are propagated even if any on the way crashes (fixes #3) * Support older engines (as IE8) which see typeof setTimeout as 'object' * Fix spelling of LICENSE * Configure lint scripts v0.2.2 -- 2014.04.18 - Do not rely on es5-ext's valid-callable. Replace it with simple internal function - In MutationObserver fallback rely on text node instead of attribute and assure mutation event is invoked by real change of data v0.2.1 -- 2014.02.24 - Fix case in import path v0.2.0 -- 2014.02.24 - Assure microtask resultion if MutationObserver is available (thanks @Raynos) #1 - Unify validation of callback. TypeError is throw for any non callable input - Move main module from `lib` to root directory - Improve documentation - Remove Makefile (it's environment agnostic pacakge) v0.1.0 -- 2012.08.29 Initial README.md 0000666 00000003025 15051444050 0006025 0 ustar 00 # next-tick ## Environment agnostic nextTick polyfill To be used in environment agnostic modules that need nextTick functionality. - When run in Node.js `process.nextTick` is used - In modern engines, microtask resolution is guaranteed by `queueMicrotask` - In older browsers, `MutationObserver` is used as a fallback - In other engines `setImmediate` or `setTimeout(fn, 0)` is used as fallback. - If none of the above is supported module resolves to `null` ## Installation ### NPM In your project path: $ npm install next-tick #### Browser To port it to Browser or any other (non CJS) environment, use your favorite CJS bundler. No favorite yet? Try: [Browserify](http://browserify.org/), [Webmake](https://github.com/medikoo/modules-webmake) or [Webpack](http://webpack.github.io/) ## Tests [](https://travis-ci.org/medikoo/next-tick) $ npm test ## Security contact information To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). Tidelift will coordinate the fix and disclosure. ---