Skip to content

Commit 72bc471

Browse files
committed
Unseal this.refs
1 parent 722d8b9 commit 72bc471

File tree

5 files changed

+118
-1
lines changed

5 files changed

+118
-1
lines changed

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,12 @@ class ParentComponent extends React.Component {
175175
return (
176176
<div
177177
ref={(current) => {
178+
if (process.env.NODE_ENV !== 'production') {
179+
if (Object.isSealed(this.refs)) {
180+
this.refs = {};
181+
}
182+
}
183+
178184
this.refs["refComponent"] = current;
179185
}}
180186
/>

transforms/__testfixtures__/string-refs/literal-with-owner.output.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,49 @@ class ParentComponent extends React.Component {
44
render() {
55
return (
66
<div ref={current => {
7+
if (process.env.NODE_ENV !== 'production') {
8+
if (Object.isSealed(this.refs)) {
9+
this.refs = {};
10+
}
11+
}
12+
713
this.refs['P'] = current;
814
}} id="P">
915
<div ref={current => {
16+
if (process.env.NODE_ENV !== 'production') {
17+
if (Object.isSealed(this.refs)) {
18+
this.refs = {};
19+
}
20+
}
21+
1022
this.refs['P_P1'] = current;
1123
}} id="P_P1">
1224
<span ref={current => {
25+
if (process.env.NODE_ENV !== 'production') {
26+
if (Object.isSealed(this.refs)) {
27+
this.refs = {};
28+
}
29+
}
30+
1331
this.refs['P_P1_C1'] = current;
1432
}} id="P_P1_C1" />
1533
<span ref={current => {
34+
if (process.env.NODE_ENV !== 'production') {
35+
if (Object.isSealed(this.refs)) {
36+
this.refs = {};
37+
}
38+
}
39+
1640
this.refs['P_P1_C2'] = current;
1741
}} id="P_P1_C2" />
1842
</div>
1943
<div ref={current => {
44+
if (process.env.NODE_ENV !== 'production') {
45+
if (Object.isSealed(this.refs)) {
46+
this.refs = {};
47+
}
48+
}
49+
2050
this.refs['P_OneOff'] = current;
2151
}} id="P_OneOff" />
2252
</div>
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
import * as React from "react";
22

33
<div ref={current => {
4+
if (process.env.NODE_ENV !== 'production') {
5+
if (Object.isSealed(this.refs)) {
6+
this.refs = {};
7+
}
8+
}
9+
410
this.refs['bad'] = current;
511
}} />;

transforms/__testfixtures__/string-refs/typescript/literal-with-owner.output.tsx

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,49 @@ class ParentComponent extends React.Component {
88
render() {
99
return (
1010
<div ref={current => {
11+
if (process.env.NODE_ENV !== 'production') {
12+
if (Object.isSealed(this.refs)) {
13+
this.refs = {};
14+
}
15+
}
16+
1117
this.refs['P'] = current;
1218
}} id="P">
1319
<div ref={current => {
20+
if (process.env.NODE_ENV !== 'production') {
21+
if (Object.isSealed(this.refs)) {
22+
this.refs = {};
23+
}
24+
}
25+
1426
this.refs['P_P1'] = current;
1527
}} id="P_P1">
1628
<span ref={current => {
29+
if (process.env.NODE_ENV !== 'production') {
30+
if (Object.isSealed(this.refs)) {
31+
this.refs = {};
32+
}
33+
}
34+
1735
this.refs['P_P1_C1'] = current;
1836
}} id="P_P1_C1" />
1937
<span ref={current => {
38+
if (process.env.NODE_ENV !== 'production') {
39+
if (Object.isSealed(this.refs)) {
40+
this.refs = {};
41+
}
42+
}
43+
2044
this.refs['P_P1_C2'] = current;
2145
}} id="P_P1_C2" />
2246
</div>
2347
<div ref={current => {
48+
if (process.env.NODE_ENV !== 'production') {
49+
if (Object.isSealed(this.refs)) {
50+
this.refs = {};
51+
}
52+
}
53+
2454
this.refs['P_OneOff'] = current;
2555
}} id="P_OneOff" />
2656
</div>

transforms/string-refs.js

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,56 @@ export default (file, api, options) => {
4040
// Maybe JSCodeShift has such a helper as well?
4141
const currentIdentifierName = "current";
4242
valuePath.replace(
43-
// {(current) => { this.refs[valuePath.node.value] = current }}
43+
// {(current) => {}}
4444
j.jsxExpressionContainer(
4545
j.arrowFunctionExpression(
4646
[j.identifier(currentIdentifierName)],
4747
j.blockStatement([
48+
// if (process.env.NODE_ENV !== 'production')
49+
j.ifStatement(
50+
j.binaryExpression(
51+
"!==",
52+
j.memberExpression(
53+
j.memberExpression(
54+
j.identifier("process"),
55+
j.identifier("env")
56+
),
57+
j.identifier("NODE_ENV")
58+
),
59+
j.stringLiteral("production")
60+
),
61+
j.blockStatement([
62+
// if (Object.isSealed(this.refs))
63+
j.ifStatement(
64+
j.callExpression(
65+
j.memberExpression(
66+
j.identifier("Object"),
67+
j.identifier("isSealed")
68+
),
69+
[
70+
j.memberExpression(
71+
j.thisExpression(),
72+
j.identifier("refs")
73+
),
74+
]
75+
),
76+
j.blockStatement([
77+
// this.refs = {}
78+
j.expressionStatement(
79+
j.assignmentExpression(
80+
"=",
81+
j.memberExpression(
82+
j.thisExpression(),
83+
j.identifier("refs")
84+
),
85+
j.objectExpression([])
86+
)
87+
),
88+
])
89+
),
90+
])
91+
),
92+
// this.refs[valuePath.node.value] = current
4893
j.expressionStatement(
4994
j.assignmentExpression(
5095
"=",

0 commit comments

Comments
 (0)