
- better checking of stylesheets to be compiled - added support for sass and scss stylesheet languages - the stylesheets files are now copied to ".web/styles/" at compile time - relock poetry file for libsass deps - stylesheet compiler unit tests also check the contents of the file
254 lines
7.0 KiB
Python
254 lines
7.0 KiB
Python
"""Base file for constants that don't fit any other categories."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import platform
|
|
from enum import Enum
|
|
from importlib import metadata
|
|
from pathlib import Path
|
|
from types import SimpleNamespace
|
|
|
|
from platformdirs import PlatformDirs
|
|
|
|
from .utils import classproperty
|
|
|
|
IS_WINDOWS = platform.system() == "Windows"
|
|
IS_MACOS = platform.system() == "Darwin"
|
|
IS_LINUX = platform.system() == "Linux"
|
|
|
|
|
|
class Dirs(SimpleNamespace):
|
|
"""Various directories/paths used by Reflex."""
|
|
|
|
# The frontend directories in a project.
|
|
# The web folder where the NextJS app is compiled to.
|
|
WEB = ".web"
|
|
# The directory where uploaded files are stored.
|
|
UPLOADED_FILES = "uploaded_files"
|
|
# The name of the assets directory.
|
|
APP_ASSETS = "assets"
|
|
# The name of the assets directory for external ressource (a subfolder of APP_ASSETS).
|
|
EXTERNAL_APP_ASSETS = "external"
|
|
# The name of the utils file.
|
|
UTILS = "utils"
|
|
# The name of the state file.
|
|
STATE_PATH = "/".join([UTILS, "state"])
|
|
# The name of the components file.
|
|
COMPONENTS_PATH = "/".join([UTILS, "components"])
|
|
# The name of the contexts file.
|
|
CONTEXTS_PATH = "/".join([UTILS, "context"])
|
|
# The name of the output static directory.
|
|
STATIC = "_static"
|
|
# The name of the public html directory served at "/"
|
|
PUBLIC = "public"
|
|
# The directory where styles are located.
|
|
STYLES = "styles"
|
|
# The name of the pages directory.
|
|
PAGES = "pages"
|
|
# The name of the env json file.
|
|
ENV_JSON = "env.json"
|
|
# The name of the reflex json file.
|
|
REFLEX_JSON = "reflex.json"
|
|
# The name of the postcss config file.
|
|
POSTCSS_JS = "postcss.config.js"
|
|
# The name of the states directory.
|
|
STATES = "states"
|
|
|
|
|
|
class Reflex(SimpleNamespace):
|
|
"""Base constants concerning Reflex."""
|
|
|
|
# App names and versions.
|
|
# The name of the Reflex package.
|
|
MODULE_NAME = "reflex"
|
|
# The current version of Reflex.
|
|
VERSION = metadata.version(MODULE_NAME)
|
|
|
|
# The reflex json file.
|
|
JSON = "reflex.json"
|
|
|
|
# Files and directories used to init a new project.
|
|
# The directory to store reflex dependencies.
|
|
# on windows, we use C:/Users/<username>/AppData/Local/reflex.
|
|
# on macOS, we use ~/Library/Application Support/reflex.
|
|
# on linux, we use ~/.local/share/reflex.
|
|
# If user sets REFLEX_DIR envroment variable use that instead.
|
|
DIR = PlatformDirs(MODULE_NAME, False).user_data_path
|
|
|
|
# The root directory of the reflex library.
|
|
ROOT_DIR = Path(__file__).parents[2]
|
|
|
|
RELEASES_URL = "https://api.github.com/repos/reflex-dev/templates/releases"
|
|
|
|
# The reflex stylesheet language supported
|
|
STYLESHEETS_SUPPORTED = ["css", "sass", "scss"]
|
|
|
|
|
|
class ReflexHostingCLI(SimpleNamespace):
|
|
"""Base constants concerning Reflex Hosting CLI."""
|
|
|
|
# The name of the Reflex Hosting CLI package.
|
|
MODULE_NAME = "reflex-hosting-cli"
|
|
|
|
|
|
class Templates(SimpleNamespace):
|
|
"""Constants related to Templates."""
|
|
|
|
# The route on Reflex backend to query which templates are available and their URLs.
|
|
APP_TEMPLATES_ROUTE = "/app-templates"
|
|
|
|
# The default template
|
|
DEFAULT = "blank"
|
|
|
|
# The reflex.build frontend host
|
|
REFLEX_BUILD_FRONTEND = "https://flexgen.reflex.run"
|
|
|
|
# The reflex.build backend host
|
|
REFLEX_BUILD_BACKEND = "https://flexgen-prod-flexgen.fly.dev"
|
|
|
|
@classproperty
|
|
@classmethod
|
|
def REFLEX_BUILD_URL(cls):
|
|
"""The URL to redirect to reflex.build.
|
|
|
|
Returns:
|
|
The URL to redirect to reflex.build.
|
|
"""
|
|
from reflex.config import environment
|
|
|
|
return (
|
|
environment.REFLEX_BUILD_FRONTEND.get()
|
|
+ "/gen?reflex_init_token={reflex_init_token}"
|
|
)
|
|
|
|
@classproperty
|
|
@classmethod
|
|
def REFLEX_BUILD_POLL_URL(cls):
|
|
"""The URL to poll waiting for the user to select a generation.
|
|
|
|
Returns:
|
|
The URL to poll waiting for the user to select a generation.
|
|
"""
|
|
from reflex.config import environment
|
|
|
|
return environment.REFLEX_BUILD_BACKEND.get() + "/api/init/{reflex_init_token}"
|
|
|
|
@classproperty
|
|
@classmethod
|
|
def REFLEX_BUILD_CODE_URL(cls):
|
|
"""The URL to fetch the generation's reflex code.
|
|
|
|
Returns:
|
|
The URL to fetch the generation's reflex code.
|
|
"""
|
|
from reflex.config import environment
|
|
|
|
return (
|
|
environment.REFLEX_BUILD_BACKEND.get()
|
|
+ "/api/gen/{generation_hash}/refactored"
|
|
)
|
|
|
|
class Dirs(SimpleNamespace):
|
|
"""Folders used by the template system of Reflex."""
|
|
|
|
# The template directory used during reflex init.
|
|
BASE = Reflex.ROOT_DIR / Reflex.MODULE_NAME / ".templates"
|
|
# The web subdirectory of the template directory.
|
|
WEB_TEMPLATE = BASE / "web"
|
|
# The jinja template directory.
|
|
JINJA_TEMPLATE = BASE / "jinja"
|
|
# Where the code for the templates is stored.
|
|
CODE = "code"
|
|
|
|
|
|
class Next(SimpleNamespace):
|
|
"""Constants related to NextJS."""
|
|
|
|
# The NextJS config file
|
|
CONFIG_FILE = "next.config.js"
|
|
# The sitemap config file.
|
|
SITEMAP_CONFIG_FILE = "next-sitemap.config.js"
|
|
# The node modules directory.
|
|
NODE_MODULES = "node_modules"
|
|
# The package lock file.
|
|
PACKAGE_LOCK = "package-lock.json"
|
|
# Regex to check for message displayed when frontend comes up
|
|
FRONTEND_LISTENING_REGEX = "Local:[\\s]+(.*)"
|
|
|
|
|
|
# Color mode variables
|
|
class ColorMode(SimpleNamespace):
|
|
"""Constants related to ColorMode."""
|
|
|
|
NAME = "rawColorMode"
|
|
RESOLVED_NAME = "resolvedColorMode"
|
|
USE = "useColorMode"
|
|
TOGGLE = "toggleColorMode"
|
|
SET = "setColorMode"
|
|
|
|
|
|
# Env modes
|
|
class Env(str, Enum):
|
|
"""The environment modes."""
|
|
|
|
DEV = "dev"
|
|
PROD = "prod"
|
|
|
|
|
|
# Log levels
|
|
class LogLevel(str, Enum):
|
|
"""The log levels."""
|
|
|
|
DEBUG = "debug"
|
|
DEFAULT = "default"
|
|
INFO = "info"
|
|
WARNING = "warning"
|
|
ERROR = "error"
|
|
CRITICAL = "critical"
|
|
|
|
def __le__(self, other: LogLevel) -> bool:
|
|
"""Compare log levels.
|
|
|
|
Args:
|
|
other: The other log level.
|
|
|
|
Returns:
|
|
True if the log level is less than or equal to the other log level.
|
|
"""
|
|
levels = list(LogLevel)
|
|
return levels.index(self) <= levels.index(other)
|
|
|
|
def subprocess_level(self):
|
|
"""Return the log level for the subprocess.
|
|
|
|
Returns:
|
|
The log level for the subprocess
|
|
"""
|
|
return self if self != LogLevel.DEFAULT else LogLevel.WARNING
|
|
|
|
|
|
# Server socket configuration variables
|
|
POLLING_MAX_HTTP_BUFFER_SIZE = 1000 * 1000
|
|
|
|
|
|
class Ping(SimpleNamespace):
|
|
"""PING constants."""
|
|
|
|
# The 'ping' interval
|
|
INTERVAL = 25
|
|
# The 'ping' timeout
|
|
TIMEOUT = 120
|
|
|
|
|
|
# Keys in the client_side_storage dict
|
|
COOKIES = "cookies"
|
|
LOCAL_STORAGE = "local_storage"
|
|
SESSION_STORAGE = "session_storage"
|
|
|
|
# Testing variables.
|
|
# Testing os env set by pytest when running a test case.
|
|
PYTEST_CURRENT_TEST = "PYTEST_CURRENT_TEST"
|
|
|
|
REFLEX_VAR_OPENING_TAG = "<reflex.Var>"
|
|
REFLEX_VAR_CLOSING_TAG = "</reflex.Var>"
|