Skip to content

Commit 59bb9f5

Browse files
committed
Ensure consistent capitalization for JavaScript
1 parent 7c7f851 commit 59bb9f5

File tree

7 files changed

+37
-29
lines changed

7 files changed

+37
-29
lines changed

Diff for: src/js/packages/@reactpy/client/src/types.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ export type ReactPyVdom = {
5353
children?: (ReactPyVdom | string)[];
5454
error?: string;
5555
eventHandlers?: { [key: string]: ReactPyVdomEventHandler };
56-
inlineJavascript?: { [key: string]: string };
56+
inlineJavaScript?: { [key: string]: string };
5757
importSource?: ReactPyVdomImportSource;
5858
};
5959

Diff for: src/js/packages/@reactpy/client/src/vdom.tsx

+11-3
Original file line numberDiff line numberDiff line change
@@ -190,9 +190,9 @@ export function createAttributes(
190190
),
191191
),
192192
...Object.fromEntries(
193-
Object.entries(model.inlineJavascript || {}).map(
193+
Object.entries(model.inlineJavaScript || {}).map(
194194
([name, inlineJavaScript]) =>
195-
createInlineJavascript(name, inlineJavaScript),
195+
createInlineJavaScript(name, inlineJavaScript),
196196
),
197197
),
198198
}),
@@ -224,10 +224,12 @@ function createEventHandler(
224224
return [name, eventHandler];
225225
}
226226

227-
function createInlineJavascript(
227+
function createInlineJavaScript(
228228
name: string,
229229
inlineJavaScript: string,
230230
): [string, () => void] {
231+
/* Function that will execute the string-like InlineJavaScript
232+
via eval in the most appropriate way */
231233
const wrappedExecutable = function (...args: any[]) {
232234
function handleExecution(...args: any[]) {
233235
const evalResult = eval(inlineJavaScript);
@@ -236,8 +238,14 @@ function createInlineJavascript(
236238
}
237239
}
238240
if (args.length > 0 && args[0] instanceof Event) {
241+
/* If being triggered by an event, set the event's current
242+
target to "this". This ensures that inline
243+
javascript statements such as the following work:
244+
html.button({"onclick": 'this.value = "Clicked!"'}, "Click Me")*/
239245
return handleExecution.call(args[0].currentTarget, ...args);
240246
} else {
247+
/* If not being triggered by an event, do not set "this" and
248+
just call normally */
241249
return handleExecution(...args);
242250
}
243251
};

Diff for: src/reactpy/core/layout.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -262,9 +262,9 @@ def _render_model_attributes(
262262
attrs = raw_model["attributes"].copy()
263263
new_state.model.current["attributes"] = attrs
264264

265-
if "inlineJavascript" in raw_model:
266-
inline_javascript = raw_model["inlineJavascript"].copy()
267-
new_state.model.current["inlineJavascript"] = inline_javascript
265+
if "inlineJavaScript" in raw_model:
266+
inline_javascript = raw_model["inlineJavaScript"].copy()
267+
new_state.model.current["inlineJavaScript"] = inline_javascript
268268

269269
if old_state is None:
270270
self._render_model_event_handlers_without_old_state(

Diff for: src/reactpy/core/vdom.py

+9-9
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424
EventHandlerDict,
2525
EventHandlerType,
2626
ImportSourceDict,
27-
InlineJavascriptDict,
28-
JavaScript,
27+
InlineJavaScript,
28+
InlineJavaScriptDict,
2929
VdomAttributes,
3030
VdomChildren,
3131
VdomDict,
@@ -47,7 +47,7 @@
4747
"children": {"$ref": "#/definitions/elementChildren"},
4848
"attributes": {"type": "object"},
4949
"eventHandlers": {"$ref": "#/definitions/elementEventHandlers"},
50-
"inlineJavascript": {"$ref": "#/definitions/elementInlineJavascripts"},
50+
"inlineJavaScript": {"$ref": "#/definitions/elementInlineJavaScripts"},
5151
"importSource": {"$ref": "#/definitions/importSource"},
5252
},
5353
# The 'tagName' is required because its presence is a useful indicator of
@@ -77,7 +77,7 @@
7777
},
7878
"required": ["target"],
7979
},
80-
"elementInlineJavascripts": {
80+
"elementInlineJavaScripts": {
8181
"type": "object",
8282
"patternProperties": {
8383
".*": "str",
@@ -195,7 +195,7 @@ def __call__(
195195
**({"attributes": attributes} if attributes else {}),
196196
**({"eventHandlers": event_handlers} if event_handlers else {}),
197197
**(
198-
{"inlineJavascript": inline_javascript} if inline_javascript else {}
198+
{"inlineJavaScript": inline_javascript} if inline_javascript else {}
199199
),
200200
**({"importSource": self.import_source} if self.import_source else {}),
201201
}
@@ -231,19 +231,19 @@ def separate_attributes_and_children(
231231

232232
def separate_attributes_handlers_and_inline_javascript(
233233
attributes: Mapping[str, Any],
234-
) -> tuple[VdomAttributes, EventHandlerDict, InlineJavascriptDict]:
234+
) -> tuple[VdomAttributes, EventHandlerDict, InlineJavaScriptDict]:
235235
_attributes: VdomAttributes = {}
236236
_event_handlers: dict[str, EventHandlerType] = {}
237-
_inline_javascript: dict[str, JavaScript] = {}
237+
_inline_javascript: dict[str, InlineJavaScript] = {}
238238

239239
for k, v in attributes.items():
240240
if callable(v):
241241
_event_handlers[k] = EventHandler(to_event_handler_function(v))
242242
elif isinstance(v, EventHandler):
243243
_event_handlers[k] = v
244244
elif EVENT_ATTRIBUTE_PATTERN.match(k) and isinstance(v, str):
245-
_inline_javascript[k] = JavaScript(v)
246-
elif isinstance(v, JavaScript):
245+
_inline_javascript[k] = InlineJavaScript(v)
246+
elif isinstance(v, InlineJavaScript):
247247
_inline_javascript[k] = v
248248
else:
249249
_attributes[k] = v

Diff for: src/reactpy/types.py

+9-9
Original file line numberDiff line numberDiff line change
@@ -768,7 +768,7 @@ class DangerouslySetInnerHTML(TypedDict):
768768
"children",
769769
"attributes",
770770
"eventHandlers",
771-
"inlineJavascript",
771+
"inlineJavaScript",
772772
"importSource",
773773
]
774774
ALLOWED_VDOM_KEYS = {
@@ -777,7 +777,7 @@ class DangerouslySetInnerHTML(TypedDict):
777777
"children",
778778
"attributes",
779779
"eventHandlers",
780-
"inlineJavascript",
780+
"inlineJavaScript",
781781
"importSource",
782782
}
783783

@@ -790,7 +790,7 @@ class VdomTypeDict(TypedDict):
790790
children: NotRequired[Sequence[ComponentType | VdomChild]]
791791
attributes: NotRequired[VdomAttributes]
792792
eventHandlers: NotRequired[EventHandlerDict]
793-
inlineJavascript: NotRequired[InlineJavascriptDict]
793+
inlineJavaScript: NotRequired[InlineJavaScriptDict]
794794
importSource: NotRequired[ImportSourceDict]
795795

796796

@@ -821,7 +821,7 @@ def __getitem__(self, key: Literal["attributes"]) -> VdomAttributes: ...
821821
@overload
822822
def __getitem__(self, key: Literal["eventHandlers"]) -> EventHandlerDict: ...
823823
@overload
824-
def __getitem__(self, key: Literal["inlineJavascript"]) -> InlineJavascriptDict: ...
824+
def __getitem__(self, key: Literal["inlineJavaScript"]) -> InlineJavaScriptDict: ...
825825
@overload
826826
def __getitem__(self, key: Literal["importSource"]) -> ImportSourceDict: ...
827827
def __getitem__(self, key: VdomDictKeys) -> Any:
@@ -845,7 +845,7 @@ def __setitem__(
845845
) -> None: ...
846846
@overload
847847
def __setitem__(
848-
self, key: Literal["inlineJavascript"], value: InlineJavascriptDict
848+
self, key: Literal["inlineJavaScript"], value: InlineJavaScriptDict
849849
) -> None: ...
850850
@overload
851851
def __setitem__(
@@ -880,7 +880,7 @@ class VdomJson(TypedDict):
880880
children: NotRequired[list[Any]]
881881
attributes: NotRequired[VdomAttributes]
882882
eventHandlers: NotRequired[dict[str, JsonEventTarget]]
883-
inlineJavascript: NotRequired[dict[str, JavaScript]]
883+
inlineJavaScript: NotRequired[dict[str, InlineJavaScript]]
884884
importSource: NotRequired[JsonImportSource]
885885

886886

@@ -895,7 +895,7 @@ class JsonImportSource(TypedDict):
895895
fallback: Any
896896

897897

898-
class JavaScript(str):
898+
class InlineJavaScript(str):
899899
"""Simple subclass that flags a user's string in ReactPy VDOM attributes as executable JavaScript."""
900900

901901
pass
@@ -938,10 +938,10 @@ class EventHandlerType(Protocol):
938938
EventHandlerDict: TypeAlias = dict[str, EventHandlerType]
939939
"""A dict mapping between event names to their handlers"""
940940

941-
InlineJavascriptMapping = Mapping[str, JavaScript]
941+
InlineJavaScriptMapping = Mapping[str, InlineJavaScript]
942942
"""A generic mapping between attribute names to their inline javascript"""
943943

944-
InlineJavascriptDict: TypeAlias = dict[str, JavaScript]
944+
InlineJavaScriptDict: TypeAlias = dict[str, InlineJavaScript]
945945
"""A dict mapping between attribute names to their inline javascript"""
946946

947947

Diff for: tests/test_utils.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -194,12 +194,12 @@ def test_string_to_reactpy(case):
194194
"key": "my-key",
195195
},
196196
},
197-
# 9: Includes `inlineJavascript` attribue
197+
# 9: Includes `inlineJavaScript` attribue
198198
{
199199
"source": """<button onclick="this.innerText = 'CLICKED'">Click Me</button>""",
200200
"model": {
201201
"tagName": "button",
202-
"inlineJavascript": {"onClick": "this.innerText = 'CLICKED'"},
202+
"inlineJavaScript": {"onClick": "this.innerText = 'CLICKED'"},
203203
"children": ["Click Me"],
204204
},
205205
},

Diff for: tests/test_web/test_module.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
assert_reactpy_did_not_log,
1313
poll,
1414
)
15-
from reactpy.types import JavaScript
15+
from reactpy.types import InlineJavaScript
1616
from reactpy.web.module import NAME_SOURCE, WebModule
1717

1818
JS_FIXTURES_DIR = Path(__file__).parent / "js_fixtures"
@@ -401,7 +401,7 @@ def App():
401401
return Component(
402402
{
403403
"id": "my-div",
404-
"setText": JavaScript('(prefixText) => prefixText + "TEST 123"'),
404+
"setText": InlineJavaScript('(prefixText) => prefixText + "TEST 123"'),
405405
}
406406
)
407407

0 commit comments

Comments
 (0)