8000 Selector: Patch & warn against legacy selector pseudos · jquery/jquery-migrate@9ebcb61 · GitHub
[go: up one dir, main page]

Skip to content

Commit 9ebcb61

Browse files
authored
Selector: Patch & warn against legacy selector pseudos
Also: 1. Create the selector module in Migrate. 2. Migrate some selector patches from `core` to `selector`. Fixes gh-544 Closes gh-546
1 parent a4889b6 commit 9ebcb61

File tree

7 files changed

+321
-39
lines changed

7 files changed

+321
-39
lines changed

src/jquery/core.js

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -102,12 +102,6 @@ migratePatchAndWarnFunc( jQuery, "holdReady", jQuery.holdReady,
102102
migratePatchAndWarnFunc( jQuery, "unique", jQuery.uniqueSort,
103103
"unique", "jQuery.unique is deprecated; use jQuery.uniqueSort" );
104104

105-
// Now jQuery.expr.pseudos is the standard incantation
106-
migrateWarnProp( jQuery.expr, "filters", jQuery.expr.pseudos, "expr-pre-pseudos",
107-
"jQuery.expr.filters is deprecated; use jQuery.expr.pseudos" );
108-
migrateWarnProp( jQuery.expr, ":", jQuery.expr.pseudos, "expr-pre-pseudos",
109-
"jQuery.expr[':'] is deprecated; use jQuery.expr.pseudos" );
110-
111105
// Prior to jQuery 3.1.1 there were internal refs so we don't warn there
112106
if ( jQueryVersionSince( "3.1.1" ) ) {
113107
migratePatchAndWarnFunc( jQuery, "trim", function( text ) {

src/jquery/selector.js

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import { migratePatchFunc, migrateWarnProp, migrateWarn } from "../main.js";
2+
3+
// Now jQuery.expr.pseudos is the standard incantation
4+
migrateWarnProp( jQuery.expr, "filters", jQuery.expr.pseudos, "expr-pre-pseudos",
5+
"jQuery.expr.filters is deprecated; use jQuery.expr.pseudos" );
6+
migrateWarnProp( jQuery.expr, ":", jQuery.expr.pseudos, "expr-pre-pseudos",
7+
"jQuery.expr[':'] is deprecated; use jQuery.expr.pseudos" );
8+
9+
function markFunction( fn ) {
10+
fn[ jQuery.expando ] = true;
11+
return fn;
12+
}
13+
14+
migratePatchFunc( jQuery.expr.filter, "PSEUDO", function( pseudo, argument ) {
15+
16+
// pseudo-class names are case-insensitive
17+
// https://www.w3.org/TR/selectors/#pseudo-classes
18+
// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
19+
// Remember that setFilters inherits from pseudos
20+
var args,
21+
fn = jQuery.expr.pseudos[ pseudo ] ||
22+
jQuery.expr.setFilters[ pseudo.toLowerCase() ] ||
23+
jQuery.error( "Syntax error, unrecognized expression: unsupported pseudo: " + pseudo );
24+
25+
// The user may use createPseudo to indicate that
26+
// arguments are needed to create the filter function
27+
// just as jQuery does
28+
if ( fn[ jQuery.expando ] ) {
29+
return fn( argument );
30+
}
31+
32+
// But maintain support for old signatures
33+
if ( fn.length > 1 ) {
34+
migrateWarn( "legacy-custom-pseudos",
35+
"Pseudos with multiple arguments are deprecated; " +
36+
"use jQuery.expr.createPseudo()" );
37+
args = [ pseudo, pseudo, "", argument ];
38+
return jQuery.expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
39+
markFunction( function( seed, matches ) {
40+
var idx,
41+
matched = fn( seed, argument ),
42+
i = matched.length;
43+
while ( i-- ) {
44+
idx = Array.prototype.indexOf.call( seed, matched[ i ] );
45+
seed[ idx ] = !( matches[ idx ] = matched[ i ] );
46+
}
47+
} ) :
48+
function( elem ) {
49+
return fn( elem, 0, args );
50+
};
51+
}
52+
53+
return fn;
54+
}, "legacy-custom-pseudos" );
55+
56+
if ( typeof Proxy !== "undefined" ) {
57+
jQuery.each( [ "pseudos", "setFilters" ], function( _, api ) {
58+
jQuery.expr[ api ] = new Proxy( jQuery.expr[ api ], {
59+
set: function( _target, _prop, fn ) {
60+
if ( typeof fn === "function" && !fn[ jQuery.expando ] && fn.length > 1 ) {
61+
migrateWarn( "legacy-custom-pseudos",
62+
"Pseudos with multiple arguments are deprecated; " +
63+
"use jQuery.expr.createPseudo()" );
64+
}
65+
return Reflect.set.apply( this, arguments );
66+
}
67+
} );
68+
} );
69+
}

src/migrate.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import "./version.js";
22
import "./compareVersions.js";
33
import "./main.js";
44
import "./jquery/core.js";
5+
import "./jquery/selector.js";
56
import "./jquery/ajax.js";
67
import "./jquery/attributes.js";
78
import "./jquery/css.js";

test/data/testinit.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,14 @@
6464
"unit/jquery/attributes.js",
6565
"unit/jquery/css.js",
6666
"unit/jquery/data.js",
67+
"unit/jquery/deferred.js",
6768
"unit/jquery/effects.js",
6869
"unit/jquery/event.js",
6970
"unit/jquery/manipulation.js",
7071
"unit/jquery/offset.js",
72+
"unit/jquery/selector.js",
7173
"unit/jquery/serialize.js",
72-
"unit/jquery/traversing.js",
73-
"unit/jquery/deferred.js"
74+
"unit/jquery/traversing.js"
7475
];
7576

7677
testFiles.forEach( function( testFile ) {

test/runner/flags/modules.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@ export const modules = [
55
"attributes",
66
"css",
77
"data",
8+
"deferred",
89
"effects",
910
"event",
1011
"manipulation",
1112
"offset",
13+
"selector",
1214
"serialize",
13-
"traversing",
14-
"deferred"
15+
"traversing"
1516
];

test/unit/jquery/core.js

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -315,35 +315,6 @@ QUnit.test( "jQuery.unique", function( assert ) {
315315
} );
316316
} );
317317

318-
QUnit.test( "jQuery.expr.pseudos aliases", function( assert ) {
319-
assert.expect( 7 );
320-
321-
expectWarning( assert, "jQuery.expr.filters", function() {
322-
jQuery.expr.filters.mazda = function( elem ) {
323-
return elem.style.zoom === "3";
324-
};
325-
} );
326-
327-
expectWarning( assert, "jQuery.expr[':']", function() {
328-
jQuery.expr[ ":" ].marginal = function( elem ) {
329-
return parseInt( elem.style.marginLeftWidth ) > 20;
330-
};
331-
} );
332-
333-
expectNoWarning( assert, "jQuery.expr.pseudos", function() {
334-
var fixture = jQuery( "#qunit-fixture" ).prepend( "<p>hello</p>" );
335-
336-
assert.ok( jQuery.expr.pseudos.mazda, "filters assigned" );
337-
assert.ok( jQuery.expr.pseudos.marginal, "[':'] assigned" );
338-
fixture.find( "p" ).first().css( "marginLeftWidth", "40px" );
339-
assert.equal( fixture.find( "p:marginal" ).length, 1, "One marginal element" );
340-
assert.equal( fixture.find( "div:mazda" ).length, 0, "No mazda elements" );
341-
delete jQuery.expr.pseudos.mazda;
342-
delete jQuery.expr.pseudos.marginal;
343-
} );
344-
345-
} );
346-
347318
QUnit.test( "jQuery.holdReady (warn only)", function( assert ) {
348319
assert.expect( 1 );
349320

0 commit comments

Comments
 (0)
0