diff --git a/pynecone/.templates/web/package.json b/pynecone/.templates/web/package.json index f6424a9da..5cd79862d 100644 --- a/pynecone/.templates/web/package.json +++ b/pynecone/.templates/web/package.json @@ -6,7 +6,8 @@ "prod": "next start" }, "dependencies": { - "@chakra-ui/icons": "^2.0.10", + "@chakra-ui/system": "1.12.1", + "@chakra-ui/icons": "1.1.7", "@chakra-ui/react": "1.8.8", "@emotion/react": "^11.9.0", "@emotion/styled": "^11.8.1", diff --git a/pynecone/compiler/templates.py b/pynecone/compiler/templates.py index 050234e3c..a9cdce124 100644 --- a/pynecone/compiler/templates.py +++ b/pynecone/compiler/templates.py @@ -11,7 +11,6 @@ PCCONFIG = f"""import pynecone as pc config = pc.Config( app_name="{{app_name}}", - bun_path="{constants.BUN_PATH}", db_url="{constants.DB_URL}", env=pc.Env.DEV, ) diff --git a/pynecone/components/datadisplay/datatable.py b/pynecone/components/datadisplay/datatable.py index 6f35662da..95d28ff16 100644 --- a/pynecone/components/datadisplay/datatable.py +++ b/pynecone/components/datadisplay/datatable.py @@ -39,14 +39,14 @@ class DataTable(Gridjs): @classmethod def create(cls, *children, **props): - """Create a datable component. + """Create a datatable component. Args: *children: The children of the component. **props: The props to pass to the component. Returns: - The datable component. + The datatable component. Raises: ValueError: If a pandas dataframe is passed in and columns are also provided. diff --git a/pynecone/pc.py b/pynecone/pc.py index e83efb139..510727236 100644 --- a/pynecone/pc.py +++ b/pynecone/pc.py @@ -6,7 +6,6 @@ import httpx import typer from pynecone import constants, utils -from pynecone.compiler import templates # Create the app. cli = typer.Typer() @@ -35,31 +34,16 @@ def init(): raise typer.Exit() with utils.console.status(f"[bold]Initializing {app_name}"): - # Only create the app directory if it doesn't exist. + # Set up the web directory. + utils.install_bun() + utils.initialize_web_directory() + + # Set up the app directory, only if the config doesn't exist. if not os.path.exists(constants.CONFIG_FILE): - # Create a configuration file. - with open(constants.CONFIG_FILE, "w") as f: - f.write(templates.PCCONFIG.format(app_name=app_name)) - utils.console.log("Initialize the app directory.") + utils.create_config(app_name) + utils.initialize_app_directory(app_name) - # Initialize the app directory. - utils.cp(constants.APP_TEMPLATE_DIR, app_name) - utils.mv( - os.path.join(app_name, constants.APP_TEMPLATE_FILE), - os.path.join(app_name, app_name + constants.PY_EXT), - ) - utils.cp(constants.ASSETS_TEMPLATE_DIR, constants.APP_ASSETS_DIR) - - # Install bun if it isn't already installed. - if not os.path.exists(utils.get_bun_path()): - utils.console.log("Installing bun...") - os.system(constants.INSTALL_BUN) - - # Initialize the web directory. - utils.console.log("Initializing the web directory.") - utils.rm(os.path.join(constants.WEB_TEMPLATE_DIR, constants.NODE_MODULES)) - utils.rm(os.path.join(constants.WEB_TEMPLATE_DIR, constants.PACKAGE_LOCK)) - utils.cp(constants.WEB_TEMPLATE_DIR, constants.WEB_DIR) + # Finish initializing the app. utils.console.log(f"[bold green]Finished Initializing: {app_name}") diff --git a/pynecone/utils.py b/pynecone/utils.py index 36522055b..702e80283 100644 --- a/pynecone/utils.py +++ b/pynecone/utils.py @@ -5,6 +5,7 @@ from __future__ import annotations import inspect import json import os +import platform import random import re import shutil @@ -291,16 +292,19 @@ def get_config() -> Config: sys.path.append(os.getcwd()) try: return __import__(constants.CONFIG_MODULE).config - except: + except ImportError: return Config(app_name="") -def get_bun_path(): +def get_bun_path() -> str: """Get the path to the bun executable. Returns: The path to the bun executable. """ + # On windows, we use npm instead of bun. + if platform.system() == "Windows": + return str(which("npm")) return os.path.expandvars(get_config().bun_path) @@ -316,16 +320,65 @@ def get_app() -> Any: return app +def create_config(app_name: str): + """Create a new pcconfig file. + + Args: + app_name: The name of the app. + """ + # Import here to avoid circular imports. + from pynecone.compiler import templates + + with open(constants.CONFIG_FILE, "w") as f: + f.write(templates.PCCONFIG.format(app_name=app_name)) + + +def initialize_app_directory(app_name: str): + """Initialize the app directory on pc init. + + Args: + app_name: The name of the app. + """ + console.log("Initializing the app directory.") + cp(constants.APP_TEMPLATE_DIR, app_name) + mv( + os.path.join(app_name, constants.APP_TEMPLATE_FILE), + os.path.join(app_name, app_name + constants.PY_EXT), + ) + cp(constants.ASSETS_TEMPLATE_DIR, constants.APP_ASSETS_DIR) + + +def initialize_web_directory(): + """Initialize the web directory on pc init.""" + console.log("Initializing the web directory.") + rm(os.path.join(constants.WEB_TEMPLATE_DIR, constants.NODE_MODULES)) + rm(os.path.join(constants.WEB_TEMPLATE_DIR, constants.PACKAGE_LOCK)) + cp(constants.WEB_TEMPLATE_DIR, constants.WEB_DIR) + + +def install_bun(): + """Install bun onto the user's system.""" + # Bun is not supported on Windows. + if platform.system() == "Windows": + console.log("Skipping bun installation on Windows.") + return + + # Only install if bun is not already installed. + if not os.path.exists(get_bun_path()): + console.log("Installing bun...") + os.system(constants.INSTALL_BUN) + + def install_frontend_packages(): """Install the frontend packages.""" # Install the base packages. subprocess.call([get_bun_path(), "install"], cwd=constants.WEB_DIR, stdout=PIPE) # Install the app packages. - for package in get_config().frontend_packages: - subprocess.call( - [get_bun_path(), "add", package], cwd=constants.WEB_DIR, stdout=PIPE - ) + packages = get_config().frontend_packages + subprocess.call( + [get_bun_path(), "add", *packages], cwd=constants.WEB_DIR, stdout=PIPE + ) def is_initialized() -> bool: