From 35ed6b7e40201c38919895339b12d3b96f8136ff Mon Sep 17 00:00:00 2001 From: Joy Heron Date: Thu, 20 Jul 2023 15:36:47 +0200 Subject: [PATCH] v0.1.2 --- CHANGELOG.md | 6 + dist/js/mandelbrot.js | 1536 ++-- example/package-lock.json | 70 +- package-lock.json | 6145 ++++++++++------- package.json | 36 +- src/core/adapter.js | 2 +- src/core/data.js | 2 +- src/core/entities/source.js | 2 +- src/core/mixins/collection.js | 4 +- src/core/mixins/configurable.js | 2 +- src/core/mixins/entity.js | 2 +- src/core/mixins/heritable.js | 2 +- src/core/mixins/source.js | 6 +- src/core/utils.js | 2 +- src/fractal/api/components/component.js | 8 +- src/fractal/api/components/source.js | 16 +- src/fractal/api/docs/source.js | 4 +- src/fractal/api/variants/collection.js | 12 +- src/fractal/api/variants/variant.js | 2 +- src/fractal/cli/commands/web.build.js | 2 +- src/handlebars/src/adapter.js | 4 +- src/handlebars/src/helpers/context-data.js | 2 +- src/handlebars/src/helpers/path.js | 4 +- src/handlebars/src/helpers/render.js | 2 +- .../assets/js/components/navigation.js | 2 +- .../assets/js/components/preview.js | 2 +- src/mandelbrot/assets/js/mandelbrot.js | 2 +- src/mandelbrot/filters.js | 11 +- src/mandelbrot/theme.js | 14 +- src/web/builder.js | 6 +- src/web/engine/engine.js | 2 +- 31 files changed, 4501 insertions(+), 3411 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c3962a197..1e0c6a3bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ unreleased * TBD +0.1.2 +----- + +* [patch] upgraded various dependencies + + 0.1.1 ----- diff --git a/dist/js/mandelbrot.js b/dist/js/mandelbrot.js index c068ce615..b7b86080e 100644 --- a/dist/js/mandelbrot.js +++ b/dist/js/mandelbrot.js @@ -97,17 +97,14 @@ function _toPropertyKey(arg) { } /*! - * jQuery JavaScript Library v3.6.4 + * jQuery JavaScript Library v3.7.0 * https://jquery.com/ * - * Includes Sizzle.js - * https://sizzlejs.com/ - * * Copyright OpenJS Foundation and other contributors * Released under the MIT license * https://jquery.org/license * - * Date: 2023-03-08T15:28Z + * Date: 2023-05-11T18:29Z */ (function (global, factory) { @@ -206,7 +203,8 @@ function _toPropertyKey(arg) { // Defining this global in .eslintrc.json would create a danger of using the global // unguarded in another place, it seems safer to define global only for this module - var version = "3.6.4", + var version = "3.7.0", + rhtmlSuffix = /HTML$/i, // Define a local copy of jQuery jQuery = function jQuery(selector, context) { // The jQuery object is actually just the init constructor 'enhanced' @@ -420,6 +418,28 @@ function _toPropertyKey(arg) { } return obj; }, + // Retrieve the text value of an array of DOM nodes + text: function text(elem) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + if (!nodeType) { + // If no nodeType, this is expected to be an array + while (node = elem[i++]) { + // Do not traverse comment nodes + ret += jQuery.text(node); + } + } else if (nodeType === 1 || nodeType === 9 || nodeType === 11) { + return elem.textContent; + } else if (nodeType === 3 || nodeType === 4) { + return elem.nodeValue; + } + + // Do not include comment or processing instruction nodes + + return ret; + }, // results is for internal usage only makeArray: function makeArray(arr, results) { var ret = results || []; @@ -435,6 +455,14 @@ function _toPropertyKey(arg) { inArray: function inArray(elem, arr, i) { return arr == null ? -1 : indexOf.call(arr, elem, i); }, + isXMLDoc: function isXMLDoc(elem) { + var namespace = elem && elem.namespaceURI, + docElem = elem && (elem.ownerDocument || elem).documentElement; + + // Assume HTML when documentElement doesn't yet exist, such as inside + // document fragments. + return !rhtmlSuffix.test(namespace || docElem && docElem.nodeName || "HTML"); + }, // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit merge: function merge(first, second) { @@ -520,41 +548,61 @@ function _toPropertyKey(arg) { } return type === "array" || length === 0 || typeof length === "number" && length > 0 && length - 1 in obj; } - var Sizzle = - /*! - * Sizzle CSS Selector Engine v2.3.10 - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://js.foundation/ - * - * Date: 2023-02-14 - */ - function (window) { + function nodeName(elem, name) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + } + var pop = arr.pop; + var sort = arr.sort; + var splice = arr.splice; + var whitespace = "[\\x20\\t\\r\\n\\f]"; + var rtrimCSS = new RegExp("^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g"); + + // Note: an element does not contain itself + jQuery.contains = function (a, b) { + var bup = b && b.parentNode; + return a === bup || !!(bup && bup.nodeType === 1 && ( + // Support: IE 9 - 11+ + // IE doesn't have `contains` on SVG. + a.contains ? a.contains(bup) : a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16)); + }; + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; + function fcssescape(ch, asCodePoint) { + if (asCodePoint) { + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if (ch === "\0") { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice(0, -1) + "\\" + ch.charCodeAt(ch.length - 1).toString(16) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + } + jQuery.escapeSelector = function (sel) { + return (sel + "").replace(rcssescape, fcssescape); + }; + var preferredDoc = document, + pushNative = push; + (function () { var i, - support, Expr, - getText, - isXML, - tokenize, - compile, - select, outermostContext, sortInput, hasDuplicate, + push = pushNative, // Local document vars - setDocument, document, - docElem, + documentElement, documentIsHTML, rbuggyQSA, - rbuggyMatches, matches, - contains, // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, + expando = jQuery.expando, dirruns = 0, done = 0, classCache = createCache(), @@ -567,38 +615,16 @@ function _toPropertyKey(arg) { } return 0; }, - // Instance methods - hasOwn = {}.hasOwnProperty, - arr = [], - pop = arr.pop, - pushNative = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function indexOf(list, elem) { - var i = 0, - len = list.length; - for (; i < len; i++) { - if (list[i] === elem) { - return i; - } - } - return -1; - }, - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + "ismap|loop|multiple|open|readonly|required|scoped", + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|" + "loop|multiple|open|readonly|required|scoped", // Regular expressions - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + // Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + // Operator (capture 2) "*([*^$|!~]?=)" + whitespace + - // "Attribute values must be CSS identifiers [capture 5] - // or strings [capture 3 or capture 4]" + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]", pseudos = ":(" + identifier + ")(?:\\((" + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: @@ -610,104 +636,86 @@ function _toPropertyKey(arg) { ".*" + ")\\)|)", // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter rwhitespace = new RegExp(whitespace + "+", "g"), - rtrim = new RegExp("^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g"), rcomma = new RegExp("^" + whitespace + "*," + whitespace + "*"), rleadingCombinator = new RegExp("^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*"), rdescend = new RegExp(whitespace + "|>"), rpseudo = new RegExp(pseudos), ridentifier = new RegExp("^" + identifier + "$"), matchExpr = { - "ID": new RegExp("^#(" + identifier + ")"), - "CLASS": new RegExp("^\\.(" + identifier + ")"), - "TAG": new RegExp("^(" + identifier + "|[*])"), - "ATTR": new RegExp("^" + attributes), - "PSEUDO": new RegExp("^" + pseudos), - "CHILD": new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i"), - "bool": new RegExp("^(?:" + booleans + ")$", "i"), + ID: new RegExp("^#(" + identifier + ")"), + CLASS: new RegExp("^\\.(" + identifier + ")"), + TAG: new RegExp("^(" + identifier + "|[*])"), + ATTR: new RegExp("^" + attributes), + PSEUDO: new RegExp("^" + pseudos), + CHILD: new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i"), + bool: new RegExp("^(?:" + booleans + ")$", "i"), // For use in libraries implementing .is() // We use this for POS matching in `select` - "needsContext": new RegExp("^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i") + needsContext: new RegExp("^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i") }, - rhtml = /HTML$/i, rinputs = /^(?:input|select|textarea|button)$/i, rheader = /^h\d$/i, - rnative = /^[^{]+\{\s*\[native \w/, // Easily-parseable/retrievable ID or TAG or CLASS selectors rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, rsibling = /[+~]/, // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + // https://www.w3.org/TR/CSS21/syndata.html#escaped-characters runescape = new RegExp("\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g"), funescape = function funescape(escape, nonHex) { var high = "0x" + escape.slice(1) - 0x10000; - return nonHex ? - // Strip the backslash prefix from a non-hex escape sequence - nonHex : + if (nonHex) { + // Strip the backslash prefix from a non-hex escape sequence + return nonHex; + } + // Replace a hexadecimal escape sequence with the encoded Unicode code point // Support: IE <=11+ // For values outside the Basic Multilingual Plane (BMP), manually construct a // surrogate pair - high < 0 ? String.fromCharCode(high + 0x10000) : String.fromCharCode(high >> 10 | 0xD800, high & 0x3FF | 0xDC00); - }, - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function fcssescape(ch, asCodePoint) { - if (asCodePoint) { - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if (ch === "\0") { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice(0, -1) + "\\" + ch.charCodeAt(ch.length - 1).toString(16) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; + return high < 0 ? String.fromCharCode(high + 0x10000) : String.fromCharCode(high >> 10 | 0xD800, high & 0x3FF | 0xDC00); }, - // Used for iframes - // See setDocument() + // Used for iframes; see `setDocument`. + // Support: IE 9 - 11+, Edge 12 - 18+ // Removing the function wrapper causes a "Permission Denied" - // error in IE + // error in IE/Edge. unloadHandler = function unloadHandler() { setDocument(); }, inDisabledFieldset = addCombinator(function (elem) { - return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; + return elem.disabled === true && nodeName(elem, "fieldset"); }, { dir: "parentNode", next: "legend" }); + // Support: IE <=9 only + // Accessing document.activeElement can throw unexpectedly + // https://bugs.jquery.com/ticket/13393 + function safeActiveElement() { + try { + return document.activeElement; + } catch (err) {} + } + // Optimize for push.apply( _, NodeList ) try { - push.apply(arr = slice.call(preferredDoc.childNodes), preferredDoc.childNodes); + push.apply(arr = _slice.call(preferredDoc.childNodes), preferredDoc.childNodes); - // Support: Android<4.0 + // Support: Android <=4.0 // Detect silently failing push.apply // eslint-disable-next-line no-unused-expressions arr[preferredDoc.childNodes.length].nodeType; } catch (e) { push = { - apply: arr.length ? - // Leverage slice if possible - function (target, els) { - pushNative.apply(target, slice.call(els)); - } : - // Support: IE<9 - // Otherwise append directly - function (target, els) { - var j = target.length, - i = 0; - - // Can't trust NodeList.length - while (target[j++] = els[i++]) {} - target.length = j - 1; + apply: function apply(target, els) { + pushNative.apply(target, _slice.call(els)); + }, + call: function call(target) { + pushNative.apply(target, _slice.call(arguments, 1)); } }; } - function Sizzle(selector, context, results, seed) { + function find(selector, context, results, seed) { var m, i, elem, @@ -738,11 +746,10 @@ function _toPropertyKey(arg) { // Document context if (nodeType === 9) { if (elem = context.getElementById(m)) { - // Support: IE, Opera, Webkit - // TODO: identify versions + // Support: IE 9 only // getElementById can match elements by name instead of ID if (elem.id === m) { - results.push(elem); + push.call(results, elem); return results; } } else { @@ -751,11 +758,10 @@ function _toPropertyKey(arg) { // Element context } else { - // Support: IE, Opera, Webkit - // TODO: identify versions + // Support: IE 9 only // getElementById can match elements by name instead of ID - if (newContext && (elem = newContext.getElementById(m)) && contains(context, elem) && elem.id === m) { - results.push(elem); + if (newContext && (elem = newContext.getElementById(m)) && find.contains(context, elem) && elem.id === m) { + push.call(results, elem); return results; } } @@ -766,17 +772,14 @@ function _toPropertyKey(arg) { return results; // Class selector - } else if ((m = match[3]) && support.getElementsByClassName && context.getElementsByClassName) { + } else if ((m = match[3]) && context.getElementsByClassName) { push.apply(results, context.getElementsByClassName(m)); return results; } } // Take advantage of querySelectorAll - if (support.qsa && !nonnativeSelectorCache[selector + " "] && (!rbuggyQSA || !rbuggyQSA.test(selector)) && ( - // Support: IE 8 only - // Exclude object elements - nodeType !== 1 || context.nodeName.toLowerCase() !== "object")) { + if (!nonnativeSelectorCache[selector + " "] && (!rbuggyQSA || !rbuggyQSA.test(selector))) { newSelector = selector; newContext = context; @@ -793,10 +796,14 @@ function _toPropertyKey(arg) { // We can use :scope instead of the ID hack if the browser // supports it & if we're not changing the context. - if (newContext !== context || !support.scope) { + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when + // strict-comparing two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if (newContext != context || !support.scope) { // Capture the context ID, setting it first if necessary if (nid = context.getAttribute("id")) { - nid = nid.replace(rcssescape, fcssescape); + nid = jQuery.escapeSelector(nid); } else { context.setAttribute("id", nid = expando); } @@ -825,7 +832,7 @@ function _toPropertyKey(arg) { } // All others - return select(selector.replace(rtrim, "$1"), context, results, seed); + return select(selector.replace(rtrimCSS, "$1"), context, results, seed); } /** @@ -837,7 +844,8 @@ function _toPropertyKey(arg) { function createCache() { var keys = []; function cache(key, value) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + // Use (key + " ") to avoid collision with native prototype properties + // (see https://github.com/jquery/sizzle/issues/157) if (keys.push(key + " ") > Expr.cacheLength) { // Only keep the most recent entries delete cache[keys.shift()]; @@ -848,7 +856,7 @@ function _toPropertyKey(arg) { } /** - * Mark a function for special use by Sizzle + * Mark a function for special use by jQuery selector module * @param {Function} fn The function to mark */ function markFunction(fn) { @@ -877,53 +885,13 @@ function _toPropertyKey(arg) { } } - /** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ - function addHandle(attrs, handler) { - var arr = attrs.split("|"), - i = arr.length; - while (i--) { - Expr.attrHandle[arr[i]] = handler; - } - } - - /** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ - function siblingCheck(a, b) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if (diff) { - return diff; - } - - // Check if b follows a - if (cur) { - while (cur = cur.nextSibling) { - if (cur === b) { - return -1; - } - } - } - return a ? 1 : -1; - } - /** * Returns a function to use in pseudos for input types * @param {String} type */ function createInputPseudo(type) { return function (elem) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; + return nodeName(elem, "input") && elem.type === type; }; } @@ -933,8 +901,7 @@ function _toPropertyKey(arg) { */ function createButtonPseudo(type) { return function (elem) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; + return (nodeName(elem, "input") || nodeName(elem, "button")) && elem.type === type; }; } @@ -966,11 +933,10 @@ function _toPropertyKey(arg) { } } - // Support: IE 6 - 11 + // Support: IE 6 - 11+ // Use the isDisabled shortcut property to check for disabled fieldset ancestors return elem.isDisabled === disabled || // Where there is no isDisabled, check manually - /* jshint -W018 */ elem.isDisabled !== !disabled && inDisabledFieldset(elem) === disabled; } return elem.disabled === disabled; @@ -1010,7 +976,7 @@ function _toPropertyKey(arg) { } /** - * Checks a node for validity as a Sizzle context + * Checks a node for validity as a jQuery selector context * @param {Element|Object=} context * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value */ @@ -1018,32 +984,13 @@ function _toPropertyKey(arg) { return context && typeof context.getElementsByTagName !== "undefined" && context; } - // Expose support vars for convenience - support = Sizzle.support = {}; - - /** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ - isXML = Sizzle.isXML = function (elem) { - var namespace = elem && elem.namespaceURI, - docElem = elem && (elem.ownerDocument || elem).documentElement; - - // Support: IE <=8 - // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes - // https://bugs.jquery.com/ticket/4833 - return !rhtml.test(namespace || docElem && docElem.nodeName || "HTML"); - }; - /** * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document + * @param {Element|Object} [node] An element or document object to use to set the document * @returns {Object} Returns the current document */ - setDocument = Sizzle.setDocument = function (node) { - var hasCompare, - subWindow, + function setDocument(node) { + var subWindow, doc = node ? node.ownerDocument || node : preferredDoc; // Return early if doc is invalid or already selected @@ -1057,38 +1004,48 @@ function _toPropertyKey(arg) { // Update global variables document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML(document); + documentElement = document.documentElement; + documentIsHTML = !jQuery.isXMLDoc(document); + + // Support: iOS 7 only, IE 9 - 11+ + // Older browsers didn't support unprefixed `matches`. + matches = documentElement.matches || documentElement.webkitMatchesSelector || documentElement.msMatchesSelector; // Support: IE 9 - 11+, Edge 12 - 18+ - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + // Accessing iframe documents after unload throws "permission denied" errors (see trac-13936) // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq if (preferredDoc != document && (subWindow = document.defaultView) && subWindow.top !== subWindow) { - // Support: IE 11, Edge - if (subWindow.addEventListener) { - subWindow.addEventListener("unload", unloadHandler, false); - - // Support: IE 9 - 10 only - } else if (subWindow.attachEvent) { - subWindow.attachEvent("onunload", unloadHandler); - } + // Support: IE 9 - 11+, Edge 12 - 18+ + subWindow.addEventListener("unload", unloadHandler); } - // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, - // Safari 4 - 5 only, Opera <=11.6 - 12.x only - // IE/Edge & older browsers don't support the :scope pseudo-class. - // Support: Safari 6.0 only - // Safari 6.0 supports :scope but it's an alias of :root there. - support.scope = assert(function (el) { - docElem.appendChild(el).appendChild(document.createElement("div")); - return typeof el.querySelectorAll !== "undefined" && !el.querySelectorAll(":scope fieldset div").length; + // Support: IE <10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function (el) { + documentElement.appendChild(el).id = jQuery.expando; + return !document.getElementsByName || !document.getElementsByName(jQuery.expando).length; + }); + + // Support: IE 9 only + // Check to see if it's possible to do matchesSelector + // on a disconnected node. + support.disconnectedMatch = assert(function (el) { + return matches.call(el, "*"); }); - // Support: Chrome 105 - 110+, Safari 15.4 - 16.3+ - // Make sure the the `:has()` argument is parsed unforgivingly. + // Support: IE 9 - 11+, Edge 12 - 18+ + // IE/Edge don't support the :scope pseudo-class. + support.scope = assert(function () { + return document.querySelectorAll(":scope"); + }); + + // Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only + // Make sure the `:has()` argument is parsed unforgivingly. // We include `*` in the test to detect buggy implementations that are // _selectively_ forgiving (specifically when the list includes at least // one valid selector). @@ -1105,54 +1062,22 @@ function _toPropertyKey(arg) { } }); - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert(function (el) { - el.className = "i"; - return !el.getAttribute("className"); - }); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert(function (el) { - el.appendChild(document.createComment("")); - return !el.getElementsByTagName("*").length; - }); - - // Support: IE<9 - support.getElementsByClassName = rnative.test(document.getElementsByClassName); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert(function (el) { - docElem.appendChild(el).id = expando; - return !document.getElementsByName || !document.getElementsByName(expando).length; - }); - // ID filter and find if (support.getById) { - Expr.filter["ID"] = function (id) { + Expr.filter.ID = function (id) { var attrId = id.replace(runescape, funescape); return function (elem) { return elem.getAttribute("id") === attrId; }; }; - Expr.find["ID"] = function (id, context) { + Expr.find.ID = function (id, context) { if (typeof context.getElementById !== "undefined" && documentIsHTML) { var elem = context.getElementById(id); return elem ? [elem] : []; } }; } else { - Expr.filter["ID"] = function (id) { + Expr.filter.ID = function (id) { var attrId = id.replace(runescape, funescape); return function (elem) { var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); @@ -1162,7 +1087,7 @@ function _toPropertyKey(arg) { // Support: IE 6 - 7 only // getElementById is not reliable as a find shortcut - Expr.find["ID"] = function (id, context) { + Expr.find.ID = function (id, context) { if (typeof context.getElementById !== "undefined" && documentIsHTML) { var node, i, @@ -1191,35 +1116,18 @@ function _toPropertyKey(arg) { } // Tag - Expr.find["TAG"] = support.getElementsByTagName ? function (tag, context) { + Expr.find.TAG = function (tag, context) { if (typeof context.getElementsByTagName !== "undefined") { return context.getElementsByTagName(tag); // DocumentFragment nodes don't have gEBTN - } else if (support.qsa) { + } else { return context.querySelectorAll(tag); } - } : function (tag, context) { - var elem, - tmp = [], - i = 0, - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName(tag); - - // Filter out possible comments - if (tag === "*") { - while (elem = results[i++]) { - if (elem.nodeType === 1) { - tmp.push(elem); - } - } - return tmp; - } - return results; }; // Class - Expr.find["CLASS"] = support.getElementsByClassName && function (className, context) { + Expr.find.CLASS = function (className, context) { if (typeof context.getElementsByClassName !== "undefined" && documentIsHTML) { return context.getElementsByClassName(className); } @@ -1230,124 +1138,69 @@ function _toPropertyKey(arg) { // QSA and matchesSelector support - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 rbuggyQSA = []; - if (support.qsa = rnative.test(document.querySelectorAll)) { - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert(function (el) { - var input; - - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild(el).innerHTML = "" + ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if (el.querySelectorAll("[msallowcapture^='']").length) { - rbuggyQSA.push("[*^$]=" + whitespace + "*(?:''|\"\")"); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if (!el.querySelectorAll("[selected]").length) { - rbuggyQSA.push("\\[" + whitespace + "*(?:value|" + booleans + ")"); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if (!el.querySelectorAll("[id~=" + expando + "-]").length) { - rbuggyQSA.push("~="); - } - - // Support: IE 11+, Edge 15 - 18+ - // IE 11/Edge don't find elements on a `[name='']` query in some cases. - // Adding a temporary attribute to the document before the selection works - // around the issue. - // Interestingly, IE 10 & older don't seem to have the issue. - input = document.createElement("input"); - input.setAttribute("name", ""); - el.appendChild(input); - if (!el.querySelectorAll("[name='']").length) { - rbuggyQSA.push("\\[" + whitespace + "*name" + whitespace + "*=" + whitespace + "*(?:''|\"\")"); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if (!el.querySelectorAll(":checked").length) { - rbuggyQSA.push(":checked"); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if (!el.querySelectorAll("a#" + expando + "+*").length) { - rbuggyQSA.push(".#.+[+~]"); - } - - // Support: Firefox <=3.6 - 5 only - // Old Firefox doesn't throw on a badly-escaped identifier. - el.querySelectorAll("\\\f"); - rbuggyQSA.push("[\\r\\n\\f]"); - }); - assert(function (el) { - el.innerHTML = "" + ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement("input"); - input.setAttribute("type", "hidden"); - el.appendChild(input).setAttribute("name", "D"); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if (el.querySelectorAll("[name=d]").length) { - rbuggyQSA.push("name" + whitespace + "*[*^$|!~]?="); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if (el.querySelectorAll(":enabled").length !== 2) { - rbuggyQSA.push(":enabled", ":disabled"); - } - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild(el).disabled = true; - if (el.querySelectorAll(":disabled").length !== 2) { - rbuggyQSA.push(":enabled", ":disabled"); - } - - // Support: Opera 10 - 11 only - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll("*,:x"); - rbuggyQSA.push(",.*:"); - }); - } - if (support.matchesSelector = rnative.test(matches = docElem.matches || docElem.webkitMatchesSelector || docElem.mozMatchesSelector || docElem.oMatchesSelector || docElem.msMatchesSelector)) { - assert(function (el) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call(el, "*"); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call(el, "[s!='']:x"); - rbuggyMatches.push("!=", pseudos); - }); - } + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function (el) { + var input; + documentElement.appendChild(el).innerHTML = "" + ""; + + // Support: iOS <=7 - 8 only + // Boolean attributes and "value" are not treated correctly in some XML documents + if (!el.querySelectorAll("[selected]").length) { + rbuggyQSA.push("\\[" + whitespace + "*(?:value|" + booleans + ")"); + } + + // Support: iOS <=7 - 8 only + if (!el.querySelectorAll("[id~=" + expando + "-]").length) { + rbuggyQSA.push("~="); + } + + // Support: iOS 8 only + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if (!el.querySelectorAll("a#" + expando + "+*").length) { + rbuggyQSA.push(".#.+[+~]"); + } + + // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ + // In some of the document kinds, these selectors wouldn't work natively. + // This is probably OK but for backwards compatibility we want to maintain + // handling them through jQuery traversal in jQuery 3.x. + if (!el.querySelectorAll(":checked").length) { + rbuggyQSA.push(":checked"); + } + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + input = document.createElement("input"); + input.setAttribute("type", "hidden"); + el.appendChild(input).setAttribute("name", "D"); + + // Support: IE 9 - 11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ + // In some of the document kinds, these selectors wouldn't work natively. + // This is probably OK but for backwards compatibility we want to maintain + // handling them through jQuery traversal in jQuery 3.x. + documentElement.appendChild(el).disabled = true; + if (el.querySelectorAll(":disabled").length !== 2) { + rbuggyQSA.push(":enabled", ":disabled"); + } + + // Support: IE 11+, Edge 15 - 18+ + // IE 11/Edge don't find elements on a `[name='']` query in some cases. + // Adding a temporary attribute to the document before the selection works + // around the issue. + // Interestingly, IE 10 & older don't seem to have the issue. + input = document.createElement("input"); + input.setAttribute("name", ""); + el.appendChild(input); + if (!el.querySelectorAll("[name='']").length) { + rbuggyQSA.push("\\[" + whitespace + "*name" + whitespace + "*=" + whitespace + "*(?:''|\"\")"); + } + }); if (!support.cssHas) { // Support: Chrome 105 - 110+, Safari 15.4 - 16.3+ // Our regular `try-catch` mechanism fails to detect natively-unsupported @@ -1358,41 +1211,12 @@ function _toPropertyKey(arg) { rbuggyQSA.push(":has"); } rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join("|")); - rbuggyMatches = rbuggyMatches.length && new RegExp(rbuggyMatches.join("|")); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test(docElem.compareDocumentPosition); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test(docElem.contains) ? function (a, b) { - // Support: IE <9 only - // IE doesn't have `contains` on `document` so we need to check for - // `documentElement` presence. - // We need to fall back to `a` when `documentElement` is missing - // as `ownerDocument` of elements within `