Skip to content

Commit 39d4f5b

Browse files
theKasheygregberge
authored andcommitted
fix: regenerate overriden members (#837)
Fixes #836
1 parent d72a9dd commit 39d4f5b

File tree

3 files changed

+58
-2
lines changed

3 files changed

+58
-2
lines changed

Diff for: packages/react-stand-in/src/createClassProxy.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,6 @@ function createClassProxy(InitialComponent, proxyKey, wrapResult = identity) {
188188

189189
isFunctionalComponent = !isReactClass(NextComponent)
190190
proxyGeneration++
191-
injectedMembers = {}
192191

193192
// Save the next constructor so we call it
194193
const PreviousComponent = CurrentComponent
@@ -222,6 +221,7 @@ function createClassProxy(InitialComponent, proxyKey, wrapResult = identity) {
222221
NextComponent,
223222
InitialComponent,
224223
lastInstance,
224+
injectedMembers,
225225
)
226226
}
227227
}

Diff for: packages/react-stand-in/src/inject.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ function mergeComponents(
1414
NextComponent,
1515
InitialComponent,
1616
lastInstance,
17+
injectedMembers,
1718
) {
1819
const injectedCode = {}
1920
try {
@@ -79,7 +80,11 @@ function mergeComponents(
7980
}
8081

8182
const nextString = String(nextAttr)
82-
if (nextString !== String(prevAttr)) {
83+
const injectedBefore = injectedMembers[key]
84+
if (
85+
nextString !== String(prevAttr) ||
86+
(injectedBefore && nextString !== String(injectedBefore))
87+
) {
8388
if (!hasRegenerate) {
8489
if (
8590
nextString.indexOf('function') < 0 &&

Diff for: packages/react-stand-in/test/consistency.test.js

+51
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,57 @@ describe('consistency', () => {
214214

215215
expect(Proxy.prototype instanceof Bar).toBe(true)
216216
})
217+
218+
it('should revert arrow member change', () => {
219+
/* eslint-disable */
220+
class BaseClass extends React.Component {
221+
arrow = () => 42
222+
223+
render() {
224+
return this.arrow()
225+
}
226+
227+
__reactstandin__regenerateByEval(key, code) {
228+
this[key] = eval(code)
229+
}
230+
}
231+
232+
class Update1Class extends React.Component {
233+
arrow = () => 43
234+
235+
render() {
236+
return this.arrow()
237+
}
238+
239+
__reactstandin__regenerateByEval(key, code) {
240+
this[key] = eval(code)
241+
}
242+
}
243+
244+
class Update2Class extends React.Component {
245+
arrow = () => 42
246+
247+
render() {
248+
return this.arrow()
249+
}
250+
251+
__reactstandin__regenerateByEval(key, code) {
252+
this[key] = eval(code)
253+
}
254+
}
255+
/* eslint-enable */
256+
257+
const proxy = createProxy(BaseClass)
258+
const Proxy = proxy.get()
259+
const instance = new Proxy()
260+
expect(instance.render()).toBe(42)
261+
262+
proxy.update(Update1Class)
263+
expect(instance.render()).toBe(43)
264+
265+
proxy.update(Update2Class)
266+
expect(instance.render()).toBe(42)
267+
})
217268
})
218269
})
219270

0 commit comments

Comments
 (0)