Skip to content

Commit 05db572

Browse files
committed
improve
1 parent 2da4da8 commit 05db572

File tree

5 files changed

+168
-10
lines changed

5 files changed

+168
-10
lines changed

packages/babel-helper-define-polyfill-provider/src/visitors/usage.ts

+56-5
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,72 @@ function isRemoved(path: NodePath) {
1616
}
1717

1818
export default (callProvider: CallProvider) => {
19+
const polyfilled = new WeakSet();
20+
1921
function property(object, key, placement, path) {
2022
return callProvider({ kind: "property", object, key, placement }, path);
2123
}
2224

2325
function handleReferencedIdentifier(path) {
24-
const {
25-
node: { name },
26-
scope,
27-
} = path;
26+
const { node, scope } = path;
27+
const { name } = node;
2828
if (scope.getBindingIdentifier(name)) return;
2929

3030
callProvider({ kind: "global", name }, path);
31+
32+
if (path.node !== node) polyfilled.add(path.node);
3133
}
3234

3335
function analyzeMemberExpression(path: NodePath<t.MemberExpression>) {
3436
const key = resolveKey(path.get("property"), path.node.computed);
3537
return { key, handleAsMemberExpression: !!key && key !== "prototype" };
3638
}
37-
3839
return {
40+
LogicalExpression: {
41+
exit(path: NodePath<t.LogicalExpression>) {
42+
const { node } = path;
43+
if (node.operator !== "||") return;
44+
if (polyfilled.has(node.left)) {
45+
path.get("right").remove();
46+
} else if (
47+
t.isUnaryExpression(node.left) &&
48+
node.left.operator === "!" &&
49+
polyfilled.has(node.left.argument)
50+
) {
51+
path.replaceWith(node.right);
52+
}
53+
},
54+
},
55+
IfStatement: {
56+
exit(path: NodePath<t.IfStatement>) {
57+
const { node } = path;
58+
if (polyfilled.has(node.test)) {
59+
path.replaceWith(node.consequent);
60+
} else if (
61+
t.isUnaryExpression(node.test) &&
62+
node.test.operator === "!"
63+
) {
64+
if (polyfilled.has(node.test.argument)) {
65+
path.replaceWith(node.alternate);
66+
}
67+
}
68+
},
69+
},
70+
ConditionalExpression: {
71+
exit(path: NodePath<t.ConditionalExpression>) {
72+
const { node } = path;
73+
if (polyfilled.has(node.test)) {
74+
path.replaceWith(node.consequent);
75+
} else if (
76+
t.isUnaryExpression(node.test) &&
77+
node.test.operator === "!"
78+
) {
79+
if (polyfilled.has(node.test.argument)) {
80+
path.replaceWith(node.alternate);
81+
}
82+
}
83+
},
84+
},
3985
// Symbol(), new Promise
4086
ReferencedIdentifier(path: NodePath<t.Identifier>) {
4187
const { parentPath } = path;
@@ -65,7 +111,12 @@ export default (callProvider: CallProvider) => {
65111
}
66112

67113
const source = resolveSource(object);
114+
const { node } = path;
68115
let skipObject = property(source.id, key, source.placement, path);
116+
if (node !== path.node && !path.isCallExpression()) {
117+
polyfilled.add(path.node);
118+
}
119+
69120
skipObject ||=
70121
!objectIsGlobalIdentifier ||
71122
path.shouldSkip ||
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
Reflect.construct || err;
2+
!Reflect.construct || ok;
3+
4+
5+
Reflect.construct ? ok : err;
6+
!Reflect.construct ? err : ok;
7+
8+
if (Reflect.construct) {
9+
ok;
10+
} else {
11+
err;
12+
}
13+
if (!Reflect.construct) {
14+
err;
15+
} else {
16+
ok;
17+
}
18+
19+
20+
Symbol.dispose || err;
21+
!Symbol.dispose || ok;
22+
23+
24+
Symbol.dispose ? ok : err;
25+
!Symbol.dispose ? err : ok;
26+
27+
if (Symbol.dispose) {
28+
ok;
29+
} else {
30+
err;
31+
}
32+
if (!Symbol.dispose) {
33+
err;
34+
} else {
35+
ok;
36+
}
37+
38+
39+
a.padStart || err;
40+
!a.padStart || ok;
41+
42+
43+
a.padStart ? ok : err;
44+
!a.padStart ? err : ok;
45+
46+
if (a.padStart) {
47+
ok;
48+
} else {
49+
err;
50+
}
51+
if (!a.padStart) {
52+
err;
53+
} else {
54+
ok;
55+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"plugins": [
3+
[
4+
"@@/polyfill-corejs3",
5+
{
6+
"method": "usage-pure",
7+
"version": "3.34"
8+
}
9+
]
10+
]
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import _Reflect$construct from "core-js-pure/stable/reflect/construct.js";
2+
import _Symbol from "core-js-pure/stable/symbol/index.js";
3+
import _padStartInstanceProperty from "core-js-pure/stable/instance/pad-start.js";
4+
_Reflect$construct;
5+
ok;
6+
ok;
7+
ok;
8+
{
9+
ok;
10+
}
11+
{
12+
ok;
13+
}
14+
_Symbol.dispose || err;
15+
!_Symbol.dispose || ok;
16+
_Symbol.dispose ? ok : err;
17+
!_Symbol.dispose ? err : ok;
18+
if (_Symbol.dispose) {
19+
ok;
20+
} else {
21+
err;
22+
}
23+
if (!_Symbol.dispose) {
24+
err;
25+
} else {
26+
ok;
27+
}
28+
_padStartInstanceProperty(a) || err;
29+
!_padStartInstanceProperty(a) || ok;
30+
_padStartInstanceProperty(a) ? ok : err;
31+
!_padStartInstanceProperty(a) ? err : ok;
32+
if (_padStartInstanceProperty(a)) {
33+
ok;
34+
} else {
35+
err;
36+
}
37+
if (!_padStartInstanceProperty(a)) {
38+
err;
39+
} else {
40+
ok;
41+
}

yarn.lock

+5-5
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ __metadata:
224224
languageName: node
225225
linkType: hard
226226

227-
"@babel/helper-define-polyfill-provider@workspace:^0.6.1, @babel/helper-define-polyfill-provider@workspace:packages/babel-helper-define-polyfill-provider":
227+
"@babel/helper-define-polyfill-provider@workspace:^0.6.2, @babel/helper-define-polyfill-provider@workspace:packages/babel-helper-define-polyfill-provider":
228228
version: 0.0.0-use.local
229229
resolution: "@babel/helper-define-polyfill-provider@workspace:packages/babel-helper-define-polyfill-provider"
230230
dependencies:
@@ -4482,7 +4482,7 @@ __metadata:
44824482
dependencies:
44834483
"@babel/compat-data": ^7.22.6
44844484
"@babel/core": ^7.22.6
4485-
"@babel/helper-define-polyfill-provider": "workspace:^0.6.1"
4485+
"@babel/helper-define-polyfill-provider": "workspace:^0.6.2"
44864486
"@babel/helper-plugin-test-runner": ^7.22.5
44874487
"@babel/plugin-transform-for-of": ^7.22.5
44884488
"@babel/plugin-transform-modules-commonjs": ^7.22.5
@@ -4509,7 +4509,7 @@ __metadata:
45094509
resolution: "babel-plugin-polyfill-corejs3@workspace:packages/babel-plugin-polyfill-corejs3"
45104510
dependencies:
45114511
"@babel/core": ^7.22.6
4512-
"@babel/helper-define-polyfill-provider": "workspace:^0.6.1"
4512+
"@babel/helper-define-polyfill-provider": "workspace:^0.6.2"
45134513
"@babel/helper-plugin-test-runner": ^7.22.5
45144514
"@babel/plugin-proposal-decorators": ^7.22.15
45154515
"@babel/plugin-transform-class-properties": ^7.22.5
@@ -4531,7 +4531,7 @@ __metadata:
45314531
resolution: "babel-plugin-polyfill-es-shims@workspace:packages/babel-plugin-polyfill-es-shims"
45324532
dependencies:
45334533
"@babel/core": ^7.22.6
4534-
"@babel/helper-define-polyfill-provider": "workspace:^0.6.1"
4534+
"@babel/helper-define-polyfill-provider": "workspace:^0.6.2"
45354535
"@babel/helper-plugin-test-runner": ^7.22.5
45364536
array.from: ^1.1.0
45374537
math.clz32: ^1.0.0
@@ -4556,7 +4556,7 @@ __metadata:
45564556
resolution: "babel-plugin-polyfill-regenerator@workspace:packages/babel-plugin-polyfill-regenerator"
45574557
dependencies:
45584558
"@babel/core": ^7.17.8
4559-
"@babel/helper-define-polyfill-provider": "workspace:^0.6.1"
4559+
"@babel/helper-define-polyfill-provider": "workspace:^0.6.2"
45604560
"@babel/helper-plugin-test-runner": ^7.16.7
45614561
"@babel/plugin-transform-regenerator": ~7.14.0
45624562
peerDependencies:

0 commit comments

Comments
 (0)