Pārlūkot izejas kodu

Lazy import modules in reflex (#2144)

Nikhil Rao 1 gadu atpakaļ
vecāks
revīzija
33e4816950

+ 310 - 40
reflex/__init__.py

@@ -4,44 +4,314 @@ Anything imported here will be available in the default Reflex import as `rx.*`.
 To signal to typecheckers that something should be reexported,
 To signal to typecheckers that something should be reexported,
 we use the Flask "import name as name" syntax.
 we use the Flask "import name as name" syntax.
 """
 """
+import importlib
+from typing import Type
 
 
-from . import el as el
-from .admin import AdminDash as AdminDash
-from .app import App as App
-from .app import UploadFile as UploadFile
-from .base import Base as Base
-from .compiler.utils import get_asset_path
-from .components import *
-from .components.component import custom_component as memo
-from .components.graphing import recharts as recharts
-from .config import Config as Config
-from .config import DBConfig as DBConfig
-from .constants import Env as Env
-from .event import EventChain as EventChain
-from .event import FileUpload as upload_files
-from .event import background as background
-from .event import call_script as call_script
-from .event import clear_local_storage as clear_local_storage
-from .event import console_log as console_log
-from .event import download as download
-from .event import prevent_default as prevent_default
-from .event import redirect as redirect
-from .event import remove_cookie as remove_cookie
-from .event import remove_local_storage as remove_local_storage
-from .event import set_clipboard as set_clipboard
-from .event import set_focus as set_focus
-from .event import set_value as set_value
-from .event import stop_propagation as stop_propagation
-from .event import window_alert as window_alert
-from .middleware import Middleware as Middleware
-from .model import Model as Model
-from .model import session as session
-from .page import page as page
-from .state import ComputedVar as var
-from .state import Cookie as Cookie
-from .state import LocalStorage as LocalStorage
-from .state import State as State
-from .style import color_mode as color_mode
-from .style import toggle_color_mode as toggle_color_mode
-from .vars import Var as Var
-from .vars import cached_var as cached_var
+from reflex.page import page as page
+from reflex.utils.format import to_snake_case
+
+_ALL_COMPONENTS = [
+    "Accordion",
+    "AccordionButton",
+    "AccordionIcon",
+    "AccordionItem",
+    "AccordionPanel",
+    "Alert",
+    "AlertDescription",
+    "AlertDialog",
+    "AlertDialogBody",
+    "AlertDialogContent",
+    "AlertDialogFooter",
+    "AlertDialogHeader",
+    "AlertDialogOverlay",
+    "AlertIcon",
+    "AlertTitle",
+    "AspectRatio",
+    "Audio",
+    "Avatar",
+    "AvatarBadge",
+    "AvatarGroup",
+    "Badge",
+    "Box",
+    "Breadcrumb",
+    "BreadcrumbItem",
+    "BreadcrumbLink",
+    "BreadcrumbSeparator",
+    "Button",
+    "ButtonGroup",
+    "Card",
+    "CardBody",
+    "CardFooter",
+    "CardHeader",
+    "Center",
+    "Checkbox",
+    "CheckboxGroup",
+    "CircularProgress",
+    "CircularProgressLabel",
+    "Circle",
+    "Code",
+    "CodeBlock",
+    "Collapse",
+    "ColorModeButton",
+    "ColorModeIcon",
+    "ColorModeSwitch",
+    "Component",
+    "Cond",
+    "Container",
+    "DataTable",
+    "DataEditor",
+    "DebounceInput",
+    "Divider",
+    "Drawer",
+    "DrawerBody",
+    "DrawerCloseButton",
+    "DrawerContent",
+    "DrawerFooter",
+    "DrawerHeader",
+    "DrawerOverlay",
+    "Editable",
+    "EditableInput",
+    "EditablePreview",
+    "EditableTextarea",
+    "Editor",
+    "Email",
+    "Fade",
+    "Flex",
+    "Foreach",
+    "Form",
+    "FormControl",
+    "FormErrorMessage",
+    "FormHelperText",
+    "FormLabel",
+    "Fragment",
+    "Grid",
+    "GridItem",
+    "Heading",
+    "Highlight",
+    "Hstack",
+    "Html",
+    "Icon",
+    "IconButton",
+    "Image",
+    "Input",
+    "InputGroup",
+    "InputLeftAddon",
+    "InputLeftElement",
+    "InputRightAddon",
+    "InputRightElement",
+    "Kbd",
+    "Link",
+    "LinkBox",
+    "LinkOverlay",
+    "List",
+    "ListItem",
+    "Markdown",
+    "Menu",
+    "MenuButton",
+    "MenuDivider",
+    "MenuGroup",
+    "MenuItem",
+    "MenuItemOption",
+    "MenuList",
+    "MenuOptionGroup",
+    "Modal",
+    "ModalBody",
+    "ModalCloseButton",
+    "ModalContent",
+    "ModalFooter",
+    "ModalHeader",
+    "ModalOverlay",
+    "Moment",
+    "MultiSelect",
+    "MultiSelectOption",
+    "NextLink",
+    "NumberDecrementStepper",
+    "NumberIncrementStepper",
+    "NumberInput",
+    "NumberInputField",
+    "NumberInputStepper",
+    "Option",
+    "OrderedList",
+    "Password",
+    "PinInput",
+    "PinInputField",
+    "Plotly",
+    "Popover",
+    "PopoverAnchor",
+    "PopoverArrow",
+    "PopoverBody",
+    "PopoverCloseButton",
+    "PopoverContent",
+    "PopoverFooter",
+    "PopoverHeader",
+    "PopoverTrigger",
+    "Progress",
+    "Radio",
+    "RadioGroup",
+    "RangeSlider",
+    "RangeSliderFilledTrack",
+    "RangeSliderThumb",
+    "RangeSliderTrack",
+    "ResponsiveGrid",
+    "ScaleFade",
+    "Script",
+    "Select",
+    "Skeleton",
+    "SkeletonCircle",
+    "SkeletonText",
+    "Slide",
+    "SlideFade",
+    "Slider",
+    "SliderFilledTrack",
+    "SliderMark",
+    "SliderThumb",
+    "SliderTrack",
+    "Spacer",
+    "Span",
+    "Spinner",
+    "Square",
+    "Stack",
+    "Stat",
+    "StatArrow",
+    "StatGroup",
+    "StatHelpText",
+    "StatLabel",
+    "StatArrow",
+    "StatGroup",
+    "StatHelpText",
+    "StatLabel",
+    "StatNumber",
+    "Step",
+    "StepDescription",
+    "StepIcon",
+    "StepIndicator",
+    "StepNumber",
+    "StepSeparator",
+    "StepStatus",
+    "StepTitle",
+    "Stepper",
+    "Switch",
+    "Tab",
+    "TabList",
+    "TabPanel",
+    "TabPanels",
+    "Table",
+    "TableCaption",
+    "TableContainer",
+    "Tabs",
+    "Tag",
+    "TagCloseButton",
+    "TagLabel",
+    "TagLeftIcon",
+    "TagRightIcon",
+    "Tbody",
+    "Td",
+    "Text",
+    "TextArea",
+    "Tfoot",
+    "Th",
+    "Thead",
+    "Tooltip",
+    "Tr",
+    "UnorderedList",
+    "Upload",
+    "Video",
+    "VisuallyHidden",
+    "Vstack",
+    "Wrap",
+    "WrapItem",
+]
+
+_ALL_COMPONENTS += [to_snake_case(component) for component in _ALL_COMPONENTS]
+_ALL_COMPONENTS += [
+    "components",
+    "desktop_only",
+    "mobile_only",
+    "tablet_only",
+    "mobile_and_tablet",
+    "tablet_and_desktop",
+    "selected_files",
+    "clear_selected_files",
+    "EditorOptions",
+]
+
+_MAPPING = {
+    "reflex.admin": ["admin", "AdminDash"],
+    "reflex.app": ["app", "App", "UploadFile"],
+    "reflex.base": ["base", "Base"],
+    "reflex.compiler": ["compiler"],
+    "reflex.compiler.utils": ["get_asset_path"],
+    "reflex.components": _ALL_COMPONENTS,
+    "reflex.components.component": ["memo"],
+    "reflex.components.graphing": ["recharts"],
+    "reflex.config": ["config", "Config", "DBConfig"],
+    "reflex.constants": ["constants", "Env"],
+    "reflex.el": ["el"],
+    "reflex.event": [
+        "event",
+        "EventChain",
+        "background",
+        "call_script",
+        "clear_local_storage",
+        "console_log",
+        "download",
+        "prevent_default",
+        "redirect",
+        "remove_cookie",
+        "remove_local_storage",
+        "set_clipboard",
+        "set_focus",
+        "set_value",
+        "stop_propagation",
+        "upload_files",
+        "window_alert",
+    ],
+    "reflex.middleware": ["middleware", "Middleware"],
+    "reflex.model": ["model", "session", "Model"],
+    "reflex.page": ["page"],
+    "reflex.route": ["route"],
+    "reflex.state": ["state", "var", "Cookie", "LocalStorage", "State"],
+    "reflex.style": ["style", "color_mode", "toggle_color_mode"],
+    "reflex.testing": ["testing"],
+    "reflex.utils": ["utils"],
+    "reflex.vars": ["vars", "cached_var", "Var"],
+}
+_MAPPING = {value: key for key, values in _MAPPING.items() for value in values}
+
+
+def _removeprefix(text, prefix):
+    return text[text.startswith(prefix) and len(prefix) :]
+
+
+__all__ = [_removeprefix(mod, "reflex.") for mod in _MAPPING]
+
+
+def __getattr__(name: str) -> Type:
+    """Lazy load all modules.
+
+    Args:
+        name: name of the module to load.
+
+    Returns:
+        The module or the attribute of the module.
+
+    Raises:
+        AttributeError: If the module or the attribute does not exist.
+    """
+    try:
+        # Check for import of a module that is not in the mapping.
+        if name not in _MAPPING:
+            # If the name does not start with reflex, add it.
+            if not name.startswith("reflex") and name != "__all__":
+                name = f"reflex.{name}"
+            return importlib.import_module(name)
+
+        # Import the module.
+        module = importlib.import_module(_MAPPING[name])
+
+        # Get the attribute from the module if the name is not the module itself.
+        return (
+            getattr(module, name) if name != _MAPPING[name].rsplit(".")[-1] else module
+        )
+    except ModuleNotFoundError:
+        raise AttributeError(f"module 'reflex' has no attribute {name}") from None

+ 473 - 0
reflex/__init__.pyi

@@ -0,0 +1,473 @@
+from reflex import admin as admin
+from reflex.admin import AdminDash as AdminDash
+from reflex import app as app
+from reflex.app import App as App
+from reflex.app import UploadFile as UploadFile
+from reflex import base as base
+from reflex.base import Base as Base
+from reflex import compiler as compiler
+from reflex.compiler.utils import get_asset_path as get_asset_path
+from reflex.components import Accordion as Accordion
+from reflex.components import AccordionButton as AccordionButton
+from reflex.components import AccordionIcon as AccordionIcon
+from reflex.components import AccordionItem as AccordionItem
+from reflex.components import AccordionPanel as AccordionPanel
+from reflex.components import Alert as Alert
+from reflex.components import AlertDescription as AlertDescription
+from reflex.components import AlertDialog as AlertDialog
+from reflex.components import AlertDialogBody as AlertDialogBody
+from reflex.components import AlertDialogContent as AlertDialogContent
+from reflex.components import AlertDialogFooter as AlertDialogFooter
+from reflex.components import AlertDialogHeader as AlertDialogHeader
+from reflex.components import AlertDialogOverlay as AlertDialogOverlay
+from reflex.components import AlertIcon as AlertIcon
+from reflex.components import AlertTitle as AlertTitle
+from reflex.components import AspectRatio as AspectRatio
+from reflex.components import Audio as Audio
+from reflex.components import Avatar as Avatar
+from reflex.components import AvatarBadge as AvatarBadge
+from reflex.components import AvatarGroup as AvatarGroup
+from reflex.components import Badge as Badge
+from reflex.components import Box as Box
+from reflex.components import Breadcrumb as Breadcrumb
+from reflex.components import BreadcrumbItem as BreadcrumbItem
+from reflex.components import BreadcrumbLink as BreadcrumbLink
+from reflex.components import BreadcrumbSeparator as BreadcrumbSeparator
+from reflex.components import Button as Button
+from reflex.components import ButtonGroup as ButtonGroup
+from reflex.components import Card as Card
+from reflex.components import CardBody as CardBody
+from reflex.components import CardFooter as CardFooter
+from reflex.components import CardHeader as CardHeader
+from reflex.components import Center as Center
+from reflex.components import Checkbox as Checkbox
+from reflex.components import CheckboxGroup as CheckboxGroup
+from reflex.components import CircularProgress as CircularProgress
+from reflex.components import CircularProgressLabel as CircularProgressLabel
+from reflex.components import Circle as Circle
+from reflex.components import Code as Code
+from reflex.components import CodeBlock as CodeBlock
+from reflex.components import Collapse as Collapse
+from reflex.components import ColorModeButton as ColorModeButton
+from reflex.components import ColorModeIcon as ColorModeIcon
+from reflex.components import ColorModeSwitch as ColorModeSwitch
+from reflex.components import Component as Component
+from reflex.components import Cond as Cond
+from reflex.components import Container as Container
+from reflex.components import DataTable as DataTable
+from reflex.components import DataEditor as DataEditor
+from reflex.components import DebounceInput as DebounceInput
+from reflex.components import Divider as Divider
+from reflex.components import Drawer as Drawer
+from reflex.components import DrawerBody as DrawerBody
+from reflex.components import DrawerCloseButton as DrawerCloseButton
+from reflex.components import DrawerContent as DrawerContent
+from reflex.components import DrawerFooter as DrawerFooter
+from reflex.components import DrawerHeader as DrawerHeader
+from reflex.components import DrawerOverlay as DrawerOverlay
+from reflex.components import Editable as Editable
+from reflex.components import EditableInput as EditableInput
+from reflex.components import EditablePreview as EditablePreview
+from reflex.components import EditableTextarea as EditableTextarea
+from reflex.components import Editor as Editor
+from reflex.components import Email as Email
+from reflex.components import Fade as Fade
+from reflex.components import Flex as Flex
+from reflex.components import Foreach as Foreach
+from reflex.components import Form as Form
+from reflex.components import FormControl as FormControl
+from reflex.components import FormErrorMessage as FormErrorMessage
+from reflex.components import FormHelperText as FormHelperText
+from reflex.components import FormLabel as FormLabel
+from reflex.components import Fragment as Fragment
+from reflex.components import Grid as Grid
+from reflex.components import GridItem as GridItem
+from reflex.components import Heading as Heading
+from reflex.components import Highlight as Highlight
+from reflex.components import Hstack as Hstack
+from reflex.components import Html as Html
+from reflex.components import Icon as Icon
+from reflex.components import IconButton as IconButton
+from reflex.components import Image as Image
+from reflex.components import Input as Input
+from reflex.components import InputGroup as InputGroup
+from reflex.components import InputLeftAddon as InputLeftAddon
+from reflex.components import InputLeftElement as InputLeftElement
+from reflex.components import InputRightAddon as InputRightAddon
+from reflex.components import InputRightElement as InputRightElement
+from reflex.components import Kbd as Kbd
+from reflex.components import Link as Link
+from reflex.components import LinkBox as LinkBox
+from reflex.components import LinkOverlay as LinkOverlay
+from reflex.components import List as List
+from reflex.components import ListItem as ListItem
+from reflex.components import Markdown as Markdown
+from reflex.components import Menu as Menu
+from reflex.components import MenuButton as MenuButton
+from reflex.components import MenuDivider as MenuDivider
+from reflex.components import MenuGroup as MenuGroup
+from reflex.components import MenuItem as MenuItem
+from reflex.components import MenuItemOption as MenuItemOption
+from reflex.components import MenuList as MenuList
+from reflex.components import MenuOptionGroup as MenuOptionGroup
+from reflex.components import Modal as Modal
+from reflex.components import ModalBody as ModalBody
+from reflex.components import ModalCloseButton as ModalCloseButton
+from reflex.components import ModalContent as ModalContent
+from reflex.components import ModalFooter as ModalFooter
+from reflex.components import ModalHeader as ModalHeader
+from reflex.components import ModalOverlay as ModalOverlay
+from reflex.components import Moment as Moment
+from reflex.components import MultiSelect as MultiSelect
+from reflex.components import MultiSelectOption as MultiSelectOption
+from reflex.components import NextLink as NextLink
+from reflex.components import NumberDecrementStepper as NumberDecrementStepper
+from reflex.components import NumberIncrementStepper as NumberIncrementStepper
+from reflex.components import NumberInput as NumberInput
+from reflex.components import NumberInputField as NumberInputField
+from reflex.components import NumberInputStepper as NumberInputStepper
+from reflex.components import Option as Option
+from reflex.components import OrderedList as OrderedList
+from reflex.components import Password as Password
+from reflex.components import PinInput as PinInput
+from reflex.components import PinInputField as PinInputField
+from reflex.components import Plotly as Plotly
+from reflex.components import Popover as Popover
+from reflex.components import PopoverAnchor as PopoverAnchor
+from reflex.components import PopoverArrow as PopoverArrow
+from reflex.components import PopoverBody as PopoverBody
+from reflex.components import PopoverCloseButton as PopoverCloseButton
+from reflex.components import PopoverContent as PopoverContent
+from reflex.components import PopoverFooter as PopoverFooter
+from reflex.components import PopoverHeader as PopoverHeader
+from reflex.components import PopoverTrigger as PopoverTrigger
+from reflex.components import Progress as Progress
+from reflex.components import Radio as Radio
+from reflex.components import RadioGroup as RadioGroup
+from reflex.components import RangeSlider as RangeSlider
+from reflex.components import RangeSliderFilledTrack as RangeSliderFilledTrack
+from reflex.components import RangeSliderThumb as RangeSliderThumb
+from reflex.components import RangeSliderTrack as RangeSliderTrack
+from reflex.components import ResponsiveGrid as ResponsiveGrid
+from reflex.components import ScaleFade as ScaleFade
+from reflex.components import Script as Script
+from reflex.components import Select as Select
+from reflex.components import Skeleton as Skeleton
+from reflex.components import SkeletonCircle as SkeletonCircle
+from reflex.components import SkeletonText as SkeletonText
+from reflex.components import Slide as Slide
+from reflex.components import SlideFade as SlideFade
+from reflex.components import Slider as Slider
+from reflex.components import SliderFilledTrack as SliderFilledTrack
+from reflex.components import SliderMark as SliderMark
+from reflex.components import SliderThumb as SliderThumb
+from reflex.components import SliderTrack as SliderTrack
+from reflex.components import Spacer as Spacer
+from reflex.components import Span as Span
+from reflex.components import Spinner as Spinner
+from reflex.components import Square as Square
+from reflex.components import Stack as Stack
+from reflex.components import Stat as Stat
+from reflex.components import StatArrow as StatArrow
+from reflex.components import StatGroup as StatGroup
+from reflex.components import StatHelpText as StatHelpText
+from reflex.components import StatLabel as StatLabel
+from reflex.components import StatNumber as StatNumber
+from reflex.components import Step as Step
+from reflex.components import StepDescription as StepDescription
+from reflex.components import StepIcon as StepIcon
+from reflex.components import StepIndicator as StepIndicator
+from reflex.components import StepNumber as StepNumber
+from reflex.components import StepSeparator as StepSeparator
+from reflex.components import StepStatus as StepStatus
+from reflex.components import StepTitle as StepTitle
+from reflex.components import Stepper as Stepper
+from reflex.components import Switch as Switch
+from reflex.components import Tab as Tab
+from reflex.components import TabList as TabList
+from reflex.components import TabPanel as TabPanel
+from reflex.components import TabPanels as TabPanels
+from reflex.components import Table as Table
+from reflex.components import TableCaption as TableCaption
+from reflex.components import TableContainer as TableContainer
+from reflex.components import Tabs as Tabs
+from reflex.components import Tag as Tag
+from reflex.components import TagCloseButton as TagCloseButton
+from reflex.components import TagLabel as TagLabel
+from reflex.components import TagLeftIcon as TagLeftIcon
+from reflex.components import TagRightIcon as TagRightIcon
+from reflex.components import Tbody as Tbody
+from reflex.components import Td as Td
+from reflex.components import Text as Text
+from reflex.components import TextArea as TextArea
+from reflex.components import Tfoot as Tfoot
+from reflex.components import Th as Th
+from reflex.components import Thead as Thead
+from reflex.components import Tooltip as Tooltip
+from reflex.components import Tr as Tr
+from reflex.components import UnorderedList as UnorderedList
+from reflex.components import Upload as Upload
+from reflex.components import Video as Video
+from reflex.components import VisuallyHidden as VisuallyHidden
+from reflex.components import Vstack as Vstack
+from reflex.components import Wrap as Wrap
+from reflex.components import WrapItem as WrapItem
+from reflex.components import accordion as accordion
+from reflex.components import accordion_button as accordion_button
+from reflex.components import accordion_icon as accordion_icon
+from reflex.components import accordion_item as accordion_item
+from reflex.components import accordion_panel as accordion_panel
+from reflex.components import alert as alert
+from reflex.components import alert_description as alert_description
+from reflex.components import alert_dialog as alert_dialog
+from reflex.components import alert_dialog_body as alert_dialog_body
+from reflex.components import alert_dialog_content as alert_dialog_content
+from reflex.components import alert_dialog_footer as alert_dialog_footer
+from reflex.components import alert_dialog_header as alert_dialog_header
+from reflex.components import alert_dialog_overlay as alert_dialog_overlay
+from reflex.components import alert_icon as alert_icon
+from reflex.components import alert_title as alert_title
+from reflex.components import aspect_ratio as aspect_ratio
+from reflex.components import audio as audio
+from reflex.components import avatar as avatar
+from reflex.components import avatar_badge as avatar_badge
+from reflex.components import avatar_group as avatar_group
+from reflex.components import badge as badge
+from reflex.components import box as box
+from reflex.components import breadcrumb as breadcrumb
+from reflex.components import breadcrumb_item as breadcrumb_item
+from reflex.components import breadcrumb_link as breadcrumb_link
+from reflex.components import breadcrumb_separator as breadcrumb_separator
+from reflex.components import button as button
+from reflex.components import button_group as button_group
+from reflex.components import card as card
+from reflex.components import card_body as card_body
+from reflex.components import card_footer as card_footer
+from reflex.components import card_header as card_header
+from reflex.components import center as center
+from reflex.components import checkbox as checkbox
+from reflex.components import checkbox_group as checkbox_group
+from reflex.components import circular_progress as circular_progress
+from reflex.components import circular_progress_label as circular_progress_label
+from reflex.components import circle as circle
+from reflex.components import code as code
+from reflex.components import code_block as code_block
+from reflex.components import collapse as collapse
+from reflex.components import color_mode_button as color_mode_button
+from reflex.components import color_mode_icon as color_mode_icon
+from reflex.components import color_mode_switch as color_mode_switch
+from reflex.components import component as component
+from reflex.components import cond as cond
+from reflex.components import container as container
+from reflex.components import data_table as data_table
+from reflex.components import data_editor as data_editor
+from reflex.components import debounce_input as debounce_input
+from reflex.components import divider as divider
+from reflex.components import drawer as drawer
+from reflex.components import drawer_body as drawer_body
+from reflex.components import drawer_close_button as drawer_close_button
+from reflex.components import drawer_content as drawer_content
+from reflex.components import drawer_footer as drawer_footer
+from reflex.components import drawer_header as drawer_header
+from reflex.components import drawer_overlay as drawer_overlay
+from reflex.components import editable as editable
+from reflex.components import editable_input as editable_input
+from reflex.components import editable_preview as editable_preview
+from reflex.components import editable_textarea as editable_textarea
+from reflex.components import editor as editor
+from reflex.components import email as email
+from reflex.components import fade as fade
+from reflex.components import flex as flex
+from reflex.components import foreach as foreach
+from reflex.components import form as form
+from reflex.components import form_control as form_control
+from reflex.components import form_error_message as form_error_message
+from reflex.components import form_helper_text as form_helper_text
+from reflex.components import form_label as form_label
+from reflex.components import fragment as fragment
+from reflex.components import grid as grid
+from reflex.components import grid_item as grid_item
+from reflex.components import heading as heading
+from reflex.components import highlight as highlight
+from reflex.components import hstack as hstack
+from reflex.components import html as html
+from reflex.components import icon as icon
+from reflex.components import icon_button as icon_button
+from reflex.components import image as image
+from reflex.components import input as input
+from reflex.components import input_group as input_group
+from reflex.components import input_left_addon as input_left_addon
+from reflex.components import input_left_element as input_left_element
+from reflex.components import input_right_addon as input_right_addon
+from reflex.components import input_right_element as input_right_element
+from reflex.components import kbd as kbd
+from reflex.components import link as link
+from reflex.components import link_box as link_box
+from reflex.components import link_overlay as link_overlay
+from reflex.components import list as list
+from reflex.components import list_item as list_item
+from reflex.components import markdown as markdown
+from reflex.components import menu as menu
+from reflex.components import menu_button as menu_button
+from reflex.components import menu_divider as menu_divider
+from reflex.components import menu_group as menu_group
+from reflex.components import menu_item as menu_item
+from reflex.components import menu_item_option as menu_item_option
+from reflex.components import menu_list as menu_list
+from reflex.components import menu_option_group as menu_option_group
+from reflex.components import modal as modal
+from reflex.components import modal_body as modal_body
+from reflex.components import modal_close_button as modal_close_button
+from reflex.components import modal_content as modal_content
+from reflex.components import modal_footer as modal_footer
+from reflex.components import modal_header as modal_header
+from reflex.components import modal_overlay as modal_overlay
+from reflex.components import moment as moment
+from reflex.components import multi_select as multi_select
+from reflex.components import multi_select_option as multi_select_option
+from reflex.components import next_link as next_link
+from reflex.components import number_decrement_stepper as number_decrement_stepper
+from reflex.components import number_increment_stepper as number_increment_stepper
+from reflex.components import number_input as number_input
+from reflex.components import number_input_field as number_input_field
+from reflex.components import number_input_stepper as number_input_stepper
+from reflex.components import option as option
+from reflex.components import ordered_list as ordered_list
+from reflex.components import password as password
+from reflex.components import pin_input as pin_input
+from reflex.components import pin_input_field as pin_input_field
+from reflex.components import plotly as plotly
+from reflex.components import popover as popover
+from reflex.components import popover_anchor as popover_anchor
+from reflex.components import popover_arrow as popover_arrow
+from reflex.components import popover_body as popover_body
+from reflex.components import popover_close_button as popover_close_button
+from reflex.components import popover_content as popover_content
+from reflex.components import popover_footer as popover_footer
+from reflex.components import popover_header as popover_header
+from reflex.components import popover_trigger as popover_trigger
+from reflex.components import progress as progress
+from reflex.components import radio as radio
+from reflex.components import radio_group as radio_group
+from reflex.components import range_slider as range_slider
+from reflex.components import range_slider_filled_track as range_slider_filled_track
+from reflex.components import range_slider_thumb as range_slider_thumb
+from reflex.components import range_slider_track as range_slider_track
+from reflex.components import responsive_grid as responsive_grid
+from reflex.components import scale_fade as scale_fade
+from reflex.components import script as script
+from reflex.components import select as select
+from reflex.components import skeleton as skeleton
+from reflex.components import skeleton_circle as skeleton_circle
+from reflex.components import skeleton_text as skeleton_text
+from reflex.components import slide as slide
+from reflex.components import slide_fade as slide_fade
+from reflex.components import slider as slider
+from reflex.components import slider_filled_track as slider_filled_track
+from reflex.components import slider_mark as slider_mark
+from reflex.components import slider_thumb as slider_thumb
+from reflex.components import slider_track as slider_track
+from reflex.components import spacer as spacer
+from reflex.components import span as span
+from reflex.components import spinner as spinner
+from reflex.components import square as square
+from reflex.components import stack as stack
+from reflex.components import stat as stat
+from reflex.components import stat_arrow as stat_arrow
+from reflex.components import stat_group as stat_group
+from reflex.components import stat_help_text as stat_help_text
+from reflex.components import stat_label as stat_label
+from reflex.components import stat_number as stat_number
+from reflex.components import step as step
+from reflex.components import step_description as step_description
+from reflex.components import step_icon as step_icon
+from reflex.components import step_indicator as step_indicator
+from reflex.components import step_number as step_number
+from reflex.components import step_separator as step_separator
+from reflex.components import step_status as step_status
+from reflex.components import step_title as step_title
+from reflex.components import stepper as stepper
+from reflex.components import switch as switch
+from reflex.components import tab as tab
+from reflex.components import tab_list as tab_list
+from reflex.components import tab_panel as tab_panel
+from reflex.components import tab_panels as tab_panels
+from reflex.components import table as table
+from reflex.components import table_caption as table_caption
+from reflex.components import table_container as table_container
+from reflex.components import tabs as tabs
+from reflex.components import tag as tag
+from reflex.components import tag_close_button as tag_close_button
+from reflex.components import tag_label as tag_label
+from reflex.components import tag_left_icon as tag_left_icon
+from reflex.components import tag_right_icon as tag_right_icon
+from reflex.components import tbody as tbody
+from reflex.components import td as td
+from reflex.components import text as text
+from reflex.components import text_area as text_area
+from reflex.components import tfoot as tfoot
+from reflex.components import th as th
+from reflex.components import thead as thead
+from reflex.components import tooltip as tooltip
+from reflex.components import tr as tr
+from reflex.components import unordered_list as unordered_list
+from reflex.components import upload as upload
+from reflex.components import video as video
+from reflex.components import visually_hidden as visually_hidden
+from reflex.components import vstack as vstack
+from reflex.components import wrap as wrap
+from reflex.components import wrap_item as wrap_item
+from reflex import components as components
+from reflex.components import desktop_only as desktop_only
+from reflex.components import mobile_only as mobile_only
+from reflex.components import tablet_only as tablet_only
+from reflex.components import mobile_and_tablet as mobile_and_tablet
+from reflex.components import tablet_and_desktop as tablet_and_desktop
+from reflex.components import selected_files as selected_files
+from reflex.components import clear_selected_files as clear_selected_files
+from reflex.components import EditorOptions as EditorOptions
+from reflex.components.component import memo as memo
+from reflex.components.graphing import recharts as recharts
+from reflex import config as config
+from reflex.config import Config as Config
+from reflex.config import DBConfig as DBConfig
+from reflex import constants as constants
+from reflex.constants import Env as Env
+from reflex import el as el
+from reflex import event as event
+from reflex.event import EventChain as EventChain
+from reflex.event import background as background
+from reflex.event import call_script as call_script
+from reflex.event import clear_local_storage as clear_local_storage
+from reflex.event import console_log as console_log
+from reflex.event import download as download
+from reflex.event import prevent_default as prevent_default
+from reflex.event import redirect as redirect
+from reflex.event import remove_cookie as remove_cookie
+from reflex.event import remove_local_storage as remove_local_storage
+from reflex.event import set_clipboard as set_clipboard
+from reflex.event import set_focus as set_focus
+from reflex.event import set_value as set_value
+from reflex.event import stop_propagation as stop_propagation
+from reflex.event import upload_files as upload_files
+from reflex.event import window_alert as window_alert
+from reflex import middleware as middleware
+from reflex.middleware import Middleware as Middleware
+from reflex import model as model
+from reflex.model import session as session
+from reflex.model import Model as Model
+from reflex.page import page as page
+from reflex import route as route
+from reflex import state as state
+from reflex.state import var as var
+from reflex.state import Cookie as Cookie
+from reflex.state import LocalStorage as LocalStorage
+from reflex.state import State as State
+from reflex import style as style
+from reflex.style import color_mode as color_mode
+from reflex.style import toggle_color_mode as toggle_color_mode
+from reflex import testing as testing
+from reflex import utils as utils
+from reflex import vars as vars
+from reflex.vars import cached_var as cached_var
+from reflex.vars import Var as Var

+ 138 - 138
reflex/components/__init__.py

@@ -26,157 +26,176 @@ from .typography import *
 
 
 # Add the convenience methods for all the components manually.
 # Add the convenience methods for all the components manually.
 # This is necessary for static type checking to work.
 # This is necessary for static type checking to work.
-component = Component.create
-badge = Badge.create
-code = Code.create
-code_block = CodeBlock.create
-connection_banner = ConnectionBanner.create
-connection_modal = ConnectionModal.create
-data_editor = DataEditor.create
-data_editor_theme = DataEditorTheme
-data_table = DataTable.create
-divider = Divider.create
-list = List.create
-list_item = ListItem.create
-ordered_list = OrderedList.create
-unordered_list = UnorderedList.create
-stat = Stat.create
-stat_arrow = StatArrow.create
-stat_group = StatGroup.create
-stat_help_text = StatHelpText.create
-stat_label = StatLabel.create
-stat_number = StatNumber.create
-tag = Tag.create
-tag_label = TagLabel.create
-tag_left_icon = TagLeftIcon.create
-tag_right_icon = TagRightIcon.create
-tag_close_button = TagCloseButton.create
-table = Table.create
-table_caption = TableCaption.create
-table_container = TableContainer.create
-tbody = Tbody.create
-td = Td.create
-tfoot = Tfoot.create
-th = Th.create
-thead = Thead.create
-tr = Tr.create
 accordion = Accordion.create
 accordion = Accordion.create
 accordion_button = AccordionButton.create
 accordion_button = AccordionButton.create
 accordion_icon = AccordionIcon.create
 accordion_icon = AccordionIcon.create
 accordion_item = AccordionItem.create
 accordion_item = AccordionItem.create
 accordion_panel = AccordionPanel.create
 accordion_panel = AccordionPanel.create
-tab = Tab.create
-tab_list = TabList.create
-tab_panel = TabPanel.create
-tab_panels = TabPanels.create
-tabs = Tabs.create
-visually_hidden = VisuallyHidden.create
-fade = Fade.create
-scale_fade = ScaleFade.create
-slide = Slide.create
-slide_fade = SlideFade.create
-collapse = Collapse.create
 alert = Alert.create
 alert = Alert.create
 alert_description = AlertDescription.create
 alert_description = AlertDescription.create
+alert_dialog = AlertDialog.create
+alert_dialog_body = AlertDialogBody.create
+alert_dialog_content = AlertDialogContent.create
+alert_dialog_footer = AlertDialogFooter.create
+alert_dialog_header = AlertDialogHeader.create
+alert_dialog_overlay = AlertDialogOverlay.create
 alert_icon = AlertIcon.create
 alert_icon = AlertIcon.create
 alert_title = AlertTitle.create
 alert_title = AlertTitle.create
+aspect_ratio = AspectRatio.create
+audio = Audio.create
+avatar = Avatar.create
+avatar_badge = AvatarBadge.create
+avatar_group = AvatarGroup.create
+badge = Badge.create
+box = Box.create
+breadcrumb = Breadcrumb.create
+breadcrumb_item = BreadcrumbItem.create
+breadcrumb_link = BreadcrumbLink.create
+breadcrumb_separator = BreadcrumbSeparator.create
+button = Button.create
+button_group = ButtonGroup.create
 card = Card.create
 card = Card.create
 card_body = CardBody.create
 card_body = CardBody.create
 card_footer = CardFooter.create
 card_footer = CardFooter.create
 card_header = CardHeader.create
 card_header = CardHeader.create
-circular_progress = CircularProgress.create
-circular_progress_label = CircularProgressLabel.create
-progress = Progress.create
-skeleton = Skeleton.create
-skeleton_circle = SkeletonCircle.create
-skeleton_text = SkeletonText.create
-spinner = Spinner.create
-button = Button.create
-button_group = ButtonGroup.create
+center = Center.create
 checkbox = Checkbox.create
 checkbox = Checkbox.create
 checkbox_group = CheckboxGroup.create
 checkbox_group = CheckboxGroup.create
+circle = Circle.create
+circular_progress = CircularProgress.create
+circular_progress_label = CircularProgressLabel.create
+code = Code.create
+code_block = CodeBlock.create
+collapse = Collapse.create
+color_mode_button = ColorModeButton.create
+color_mode_icon = ColorModeIcon.create
+color_mode_switch = ColorModeSwitch.create
+component = Component.create
+connection_banner = ConnectionBanner.create
+connection_modal = ConnectionModal.create
+container = Container.create
+data_editor = DataEditor.create
+data_editor_theme = DataEditorTheme
+data_table = DataTable.create
 date_picker = DatePicker.create
 date_picker = DatePicker.create
 date_time_picker = DateTimePicker.create
 date_time_picker = DateTimePicker.create
 debounce_input = DebounceInput.create
 debounce_input = DebounceInput.create
+divider = Divider.create
+drawer = Drawer.create
+drawer_body = DrawerBody.create
+drawer_close_button = DrawerCloseButton.create
+drawer_content = DrawerContent.create
+drawer_footer = DrawerFooter.create
+drawer_header = DrawerHeader.create
+drawer_overlay = DrawerOverlay.create
 editable = Editable.create
 editable = Editable.create
 editable_input = EditableInput.create
 editable_input = EditableInput.create
 editable_preview = EditablePreview.create
 editable_preview = EditablePreview.create
 editable_textarea = EditableTextarea.create
 editable_textarea = EditableTextarea.create
 editor = Editor.create
 editor = Editor.create
+email = Email.create
+fade = Fade.create
+flex = Flex.create
+foreach = Foreach.create
 form = Form.create
 form = Form.create
 form_control = FormControl.create
 form_control = FormControl.create
 form_error_message = FormErrorMessage.create
 form_error_message = FormErrorMessage.create
 form_helper_text = FormHelperText.create
 form_helper_text = FormHelperText.create
 form_label = FormLabel.create
 form_label = FormLabel.create
+fragment = Fragment.create
+grid = Grid.create
+grid_item = GridItem.create
+heading = Heading.create
+highlight = Highlight.create
+hstack = Hstack.create
+html = Html.create
+icon = Icon.create
 icon_button = IconButton.create
 icon_button = IconButton.create
+image = Image.create
 input = Input.create
 input = Input.create
 input_group = InputGroup.create
 input_group = InputGroup.create
 input_left_addon = InputLeftAddon.create
 input_left_addon = InputLeftAddon.create
-input_right_addon = InputRightAddon.create
 input_left_element = InputLeftElement.create
 input_left_element = InputLeftElement.create
+input_right_addon = InputRightAddon.create
 input_right_element = InputRightElement.create
 input_right_element = InputRightElement.create
+kbd = Kbd.create
+link = Link.create
+link_box = LinkBox.create
+link_overlay = LinkOverlay.create
+list = List.create
+list_item = ListItem.create
+markdown = Markdown.create
+menu = Menu.create
+menu_button = MenuButton.create
+menu_divider = MenuDivider.create
+menu_group = MenuGroup.create
+menu_item = MenuItem.create
+menu_item_option = MenuItemOption.create
+menu_list = MenuList.create
+menu_option_group = MenuOptionGroup.create
+modal = Modal.create
+modal_body = ModalBody.create
+modal_close_button = ModalCloseButton.create
+modal_content = ModalContent.create
+modal_footer = ModalFooter.create
+modal_header = ModalHeader.create
+modal_overlay = ModalOverlay.create
 moment = Moment.create
 moment = Moment.create
 multi_select = MultiSelect.create
 multi_select = MultiSelect.create
 multi_select_option = MultiSelectOption
 multi_select_option = MultiSelectOption
+next_link = NextLink.create
 number_decrement_stepper = NumberDecrementStepper.create
 number_decrement_stepper = NumberDecrementStepper.create
 number_increment_stepper = NumberIncrementStepper.create
 number_increment_stepper = NumberIncrementStepper.create
 number_input = NumberInput.create
 number_input = NumberInput.create
 number_input_field = NumberInputField.create
 number_input_field = NumberInputField.create
 number_input_stepper = NumberInputStepper.create
 number_input_stepper = NumberInputStepper.create
 option = Option.create
 option = Option.create
+ordered_list = OrderedList.create
 password = Password.create
 password = Password.create
-email = Email.create
 pin_input = PinInput.create
 pin_input = PinInput.create
 pin_input_field = PinInputField.create
 pin_input_field = PinInputField.create
+plotly = Plotly.create
+popover = Popover.create
+popover_anchor = PopoverAnchor.create
+popover_arrow = PopoverArrow.create
+popover_body = PopoverBody.create
+popover_close_button = PopoverCloseButton.create
+popover_content = PopoverContent.create
+popover_footer = PopoverFooter.create
+popover_header = PopoverHeader.create
+popover_trigger = PopoverTrigger.create
+progress = Progress.create
 radio = Radio.create
 radio = Radio.create
 radio_group = RadioGroup.create
 radio_group = RadioGroup.create
 range_slider = RangeSlider.create
 range_slider = RangeSlider.create
 range_slider_filled_track = RangeSliderFilledTrack.create
 range_slider_filled_track = RangeSliderFilledTrack.create
 range_slider_thumb = RangeSliderThumb.create
 range_slider_thumb = RangeSliderThumb.create
 range_slider_track = RangeSliderTrack.create
 range_slider_track = RangeSliderTrack.create
+responsive_grid = ResponsiveGrid.create
+scale_fade = ScaleFade.create
+script = Script.create
 select = Select.create
 select = Select.create
+skeleton = Skeleton.create
+skeleton_circle = SkeletonCircle.create
+skeleton_text = SkeletonText.create
+slide = Slide.create
+slide_fade = SlideFade.create
 slider = Slider.create
 slider = Slider.create
 slider_filled_track = SliderFilledTrack.create
 slider_filled_track = SliderFilledTrack.create
 slider_mark = SliderMark.create
 slider_mark = SliderMark.create
 slider_thumb = SliderThumb.create
 slider_thumb = SliderThumb.create
 slider_track = SliderTrack.create
 slider_track = SliderTrack.create
-switch = Switch.create
-text_area = TextArea.create
-upload = Upload.create
-plotly = Plotly.create
-box = Box.create
-center = Center.create
-circle = Circle.create
-container = Container.create
-flex = Flex.create
-foreach = Foreach.create
-fragment = Fragment.create
-grid = Grid.create
-grid_item = GridItem.create
-hstack = Hstack.create
-html = Html.create
-responsive_grid = ResponsiveGrid.create
 spacer = Spacer.create
 spacer = Spacer.create
+span = Span.create
+spinner = Spinner.create
 square = Square.create
 square = Square.create
 stack = Stack.create
 stack = Stack.create
-vstack = Vstack.create
-wrap = Wrap.create
-wrap_item = WrapItem.create
-avatar = Avatar.create
-avatar_badge = AvatarBadge.create
-avatar_group = AvatarGroup.create
-icon = Icon.create
-image = Image.create
-video = Video.create
-audio = Audio.create
-breadcrumb = Breadcrumb.create
-breadcrumb_item = BreadcrumbItem.create
-breadcrumb_link = BreadcrumbLink.create
-breadcrumb_separator = BreadcrumbSeparator.create
-link = Link.create
-link_box = LinkBox.create
-link_overlay = LinkOverlay.create
-next_link = NextLink.create
+stat = Stat.create
+stat_arrow = StatArrow.create
+stat_group = StatGroup.create
+stat_help_text = StatHelpText.create
+stat_label = StatLabel.create
+stat_number = StatNumber.create
 step = Step.create
 step = Step.create
 step_description = StepDescription.create
 step_description = StepDescription.create
 step_icon = StepIcon.create
 step_icon = StepIcon.create
@@ -186,52 +205,33 @@ step_separator = StepSeparator.create
 step_status = StepStatus.create
 step_status = StepStatus.create
 step_title = StepTitle.create
 step_title = StepTitle.create
 stepper = Stepper.create
 stepper = Stepper.create
-alert_dialog = AlertDialog.create
-alert_dialog_body = AlertDialogBody.create
-alert_dialog_content = AlertDialogContent.create
-alert_dialog_footer = AlertDialogFooter.create
-alert_dialog_header = AlertDialogHeader.create
-alert_dialog_overlay = AlertDialogOverlay.create
-drawer = Drawer.create
-drawer_body = DrawerBody.create
-drawer_close_button = DrawerCloseButton.create
-drawer_content = DrawerContent.create
-drawer_footer = DrawerFooter.create
-drawer_header = DrawerHeader.create
-drawer_overlay = DrawerOverlay.create
-menu = Menu.create
-menu_button = MenuButton.create
-menu_divider = MenuDivider.create
-menu_group = MenuGroup.create
-menu_item = MenuItem.create
-menu_item_option = MenuItemOption.create
-menu_list = MenuList.create
-menu_option_group = MenuOptionGroup.create
-modal = Modal.create
-modal_body = ModalBody.create
-modal_close_button = ModalCloseButton.create
-modal_content = ModalContent.create
-modal_footer = ModalFooter.create
-modal_header = ModalHeader.create
-modal_overlay = ModalOverlay.create
-popover = Popover.create
-popover_anchor = PopoverAnchor.create
-popover_arrow = PopoverArrow.create
-popover_body = PopoverBody.create
-popover_close_button = PopoverCloseButton.create
-popover_content = PopoverContent.create
-popover_footer = PopoverFooter.create
-popover_header = PopoverHeader.create
-popover_trigger = PopoverTrigger.create
-tooltip = Tooltip.create
-heading = Heading.create
-highlight = Highlight.create
-markdown = Markdown.create
-span = Span.create
+switch = Switch.create
+tab = Tab.create
+tab_list = TabList.create
+tab_panel = TabPanel.create
+tab_panels = TabPanels.create
+table = Table.create
+table_caption = TableCaption.create
+table_container = TableContainer.create
+tabs = Tabs.create
+tag = Tag.create
+tag_close_button = TagCloseButton.create
+tag_label = TagLabel.create
+tag_left_icon = TagLeftIcon.create
+tag_right_icon = TagRightIcon.create
+tbody = Tbody.create
+td = Td.create
 text = Text.create
 text = Text.create
-script = Script.create
-aspect_ratio = AspectRatio.create
-kbd = KeyboardKey.create
-color_mode_button = ColorModeButton.create
-color_mode_icon = ColorModeIcon.create
-color_mode_switch = ColorModeSwitch.create
+text_area = TextArea.create
+tfoot = Tfoot.create
+th = Th.create
+thead = Thead.create
+tooltip = Tooltip.create
+tr = Tr.create
+unordered_list = UnorderedList.create
+upload = Upload.create
+video = Video.create
+visually_hidden = VisuallyHidden.create
+vstack = Vstack.create
+wrap = Wrap.create
+wrap_item = WrapItem.create

+ 4 - 0
reflex/components/component.py

@@ -1000,6 +1000,10 @@ def custom_component(
     return wrapper
     return wrapper
 
 
 
 
+# Alias memo to custom_component.
+memo = custom_component
+
+
 class NoSSRComponent(Component):
 class NoSSRComponent(Component):
     """A dynamic component that is not rendered on the server."""
     """A dynamic component that is not rendered on the server."""
 
 

+ 1 - 1
reflex/components/datadisplay/__init__.py

@@ -7,7 +7,7 @@ from .code import LiteralCodeLanguage as LiteralCodeLanguage
 from .dataeditor import DataEditor, DataEditorTheme
 from .dataeditor import DataEditor, DataEditorTheme
 from .datatable import DataTable
 from .datatable import DataTable
 from .divider import Divider
 from .divider import Divider
-from .keyboard_key import KeyboardKey
+from .keyboard_key import KeyboardKey as Kbd
 from .list import List, ListItem, OrderedList, UnorderedList
 from .list import List, ListItem, OrderedList, UnorderedList
 from .moment import Moment
 from .moment import Moment
 from .stat import Stat, StatArrow, StatGroup, StatHelpText, StatLabel, StatNumber
 from .stat import Stat, StatArrow, StatGroup, StatHelpText, StatLabel, StatNumber

+ 4 - 0
reflex/event.py

@@ -270,6 +270,10 @@ class FileUpload(Base):
     pass
     pass
 
 
 
 
+# Alias for rx.upload_files
+upload_files = FileUpload
+
+
 # Special server-side events.
 # Special server-side events.
 def server_side(name: str, sig: inspect.Signature, **kwargs) -> EventSpec:
 def server_side(name: str, sig: inspect.Signature, **kwargs) -> EventSpec:
     """A server-side event.
     """A server-side event.

+ 3 - 4
reflex/page.py

@@ -2,8 +2,7 @@
 
 
 from __future__ import annotations
 from __future__ import annotations
 
 
-from reflex.components.component import Component
-from reflex.event import EventHandler
+from typing import Any
 
 
 DECORATED_PAGES = []
 DECORATED_PAGES = []
 
 
@@ -14,8 +13,8 @@ def page(
     image: str | None = None,
     image: str | None = None,
     description: str | None = None,
     description: str | None = None,
     meta: str | None = None,
     meta: str | None = None,
-    script_tags: list[Component] | None = None,
-    on_load: EventHandler | list[EventHandler] | None = None,
+    script_tags: list[Any] | None = None,
+    on_load: Any | list[Any] | None = None,
 ):
 ):
     """Decorate a function as a page.
     """Decorate a function as a page.
 
 

+ 17 - 0
reflex/page.pyi

@@ -0,0 +1,17 @@
+"""The page decorator and associated variables and functions."""
+
+from reflex.components.component import Component
+from reflex.event import EventHandler
+
+DECORATED_PAGES: list
+
+def page(
+    route: str | None = None,
+    title: str | None = None,
+    image: str | None = None,
+    description: str | None = None,
+    meta: str | None = None,
+    script_tags: list[Component] | None = None,
+    on_load: EventHandler | list[EventHandler] | None = None,
+): ...
+def get_decorated_pages() -> list[dict]: ...

+ 1 - 0
reflex/state.py

@@ -47,6 +47,7 @@ from reflex.utils.serializers import SerializedType, serialize, serializer
 from reflex.vars import BaseVar, ComputedVar, Var
 from reflex.vars import BaseVar, ComputedVar, Var
 
 
 Delta = Dict[str, Any]
 Delta = Dict[str, Any]
+var = ComputedVar
 
 
 
 
 class HeaderData(Base):
 class HeaderData(Base):

+ 14 - 0
scripts/pyi_generator.py

@@ -609,6 +609,19 @@ class PyiGenerator:
                 self._scan_folder(target)
                 self._scan_folder(target)
 
 
 
 
+def generate_init():
+    """Generate a pyi file for the main __init__.py."""
+    from reflex import _MAPPING  # type: ignore
+
+    imports = [
+        f"from {path if mod != path.rsplit('.')[-1] or mod == 'page' else '.'.join(path.rsplit('.')[:-1])} import {mod} as {mod}"
+        for mod, path in _MAPPING.items()
+    ]
+
+    with open("reflex/__init__.pyi", "w") as pyi_file:
+        pyi_file.writelines("\n".join(imports))
+
+
 if __name__ == "__main__":
 if __name__ == "__main__":
     logging.basicConfig(level=logging.DEBUG)
     logging.basicConfig(level=logging.DEBUG)
     logging.getLogger("blib2to3.pgen2.driver").setLevel(logging.INFO)
     logging.getLogger("blib2to3.pgen2.driver").setLevel(logging.INFO)
@@ -617,3 +630,4 @@ if __name__ == "__main__":
     logger.info(f"Running .pyi generator for {targets}")
     logger.info(f"Running .pyi generator for {targets}")
     gen = PyiGenerator()
     gen = PyiGenerator()
     gen.scan_all(targets)
     gen.scan_all(targets)
+    generate_init()

+ 3 - 3
tests/test_state.py

@@ -905,7 +905,7 @@ class InterdependentState(State):
         Returns:
         Returns:
             ComputedVar v1x2 multiplied by 2
             ComputedVar v1x2 multiplied by 2
         """
         """
-        return self.v1x2 * 2
+        return self.v1x2 * 2  # type: ignore
 
 
 
 
 @pytest.fixture
 @pytest.fixture
@@ -1105,7 +1105,7 @@ def test_computed_var_cached_depends_on_non_cached():
 
 
         @rx.cached_var
         @rx.cached_var
         def dep_v(self) -> int:
         def dep_v(self) -> int:
-            return self.no_cache_v
+            return self.no_cache_v  # type: ignore
 
 
         @rx.cached_var
         @rx.cached_var
         def comp_v(self) -> int:
         def comp_v(self) -> int:
@@ -1148,7 +1148,7 @@ def test_computed_var_depends_on_parent_non_cached():
     class ChildState(ParentState):
     class ChildState(ParentState):
         @rx.cached_var
         @rx.cached_var
         def dep_v(self) -> int:
         def dep_v(self) -> int:
-            return self.no_cache_v
+            return self.no_cache_v  # type: ignore
 
 
     ps = ParentState()
     ps = ParentState()
     cs = ps.substates[ChildState.get_name()]
     cs = ps.substates[ChildState.get_name()]