8889841c.editorconfig000066600000000440150514440500007221 0ustar00# 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.js000066600000001006150514440500007167 0ustar00'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.js000066600000003767150514440500006230 0ustar00'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; }()); CHANGES000066600000001663150514440500005547 0ustar00For 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.md000066600000003025150514440500006025 0ustar00# 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 [![Build Status](https://api.travis-ci.org/medikoo/next-tick.png?branch=master)](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. ---
Get professional support for d with a Tidelift subscription
Tidelift helps make open source sustainable for maintainers while giving companies
assurances about security, maintenance, and licensing for their dependencies.
.lint000066600000000312150514440500005511 0ustar00@root module es5 indent 2 maxlen 100 tabs ass bitwise nomen plusplus vars predef+ queueMicrotask, process, setImmediate, setTimeout, clearTimeout, document, MutationObserver, WebKitMutationObserver CHANGELOG.md000066600000001034150514440500006355 0ustar00# Changelog All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. ## [1.1.0](https://github.com/medikoo/next-tick/compare/v1.0.0...v1.1.0) (2020-02-11) ### Features * Add support for queueMicrotask (Closes [#13](https://github.com/medikoo/next-tick/issues/13)) ([471986e](https://github.com/medikoo/next-tick/commit/471986ee5f7179a498850cc03138a5ed5b9a248c)) ## Changelog for previous versions See `CHANGES` file .github/FUNDING.yml000066600000000032150514440500007716 0ustar00tidelift: "npm/next-tick" LICENSE000066600000001405150514440500005553 0ustar00ISC License Copyright (c) 2012-2020, Mariusz Nowak, @medikoo, medikoo.com Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. package.json000066600000001370150514440500007035 0ustar00{ "name": "next-tick", "version": "1.1.0", "description": "Environment agnostic nextTick polyfill", "author": "Mariusz Nowak (http://www.medikoo.com/)", "keywords": [ "nexttick", "setImmediate", "setTimeout", "async" ], "repository": { "type": "git", "url": "git://github.com/medikoo/next-tick.git" }, "devDependencies": { "tad": "^3.0.1", "xlint": "^0.2.2", "xlint-jslint-medikoo": "^0.1.4" }, "scripts": { "lint": "node node_modules/xlint/bin/xlint --linter=node_modules/xlint-jslint-medikoo/index.js --no-cache --no-stream", "lint-console": "node node_modules/xlint/bin/xlint --linter=node_modules/xlint-jslint-medikoo/index.js --watch", "test": "node node_modules/tad/bin/tad" }, "license": "ISC" }