Skip to main content

Build full-stack web applications with Jac - one language for frontend and backend.

Project description

Jac Client

Build full-stack web applications with Jac - one language for frontend and backend.

Jac Client enables you to write React-like components, manage state, and build interactive UIs all in Jac. No need for separate frontend frameworks, HTTP clients, or complex build configurations.


Features

  • Single Language: Write frontend and backend in Jac
  • No HTTP Client: Use jacSpawn() instead of fetch/axios
  • React Hooks: Use standard React useState and useEffect hooks (useState is auto-injected when using has variables)
  • Component-Based: Build reusable UI components with JSX
  • Graph Database: Built-in graph data model eliminates need for SQL/NoSQL
  • Type Safety: Type checking across frontend and backend
  • Vite-Powered: Optimized production bundles with Vite

Quick Start

Installation

pip install jac-client

Create a New App

jac create --use client my-app
cd my-app
jac start src/app.jac

Visit http://localhost:8000 to see your app! (The app component is served at the root by default.)

You can also access the app at http://localhost:8000/cl/app.

Note: The --use client flag creates a client-side project with an organized folder structure. Without it, jac create creates a standard Jac project.


Documentation

For detailed guides and tutorials, see the docs folder:

  • Getting Started Guide - Complete beginner's guide
  • Routing - Multi-page applications with declarative routing (<Router>, <Routes>, <Route>)
  • Lifecycle Hooks - Using React hooks (useState, useEffect)
  • Advanced State - Managing complex state with React hooks
  • Imports - Importing third-party libraries (React, Ant Design, Lodash), Jac files, and JavaScript modules

Example

Simple Counter with React Hooks

# Note: useState is auto-injected when using has variables in cl blocks
# Only useEffect needs explicit import
cl import from react { useEffect }

cl {
    def Counter() -> JsxElement {
        # useState is automatically available - no import needed!
        [count, setCount] = useState(0);

        useEffect(lambda -> None {
            console.log("Count changed:", count);
        }, [count]);

        return <div>
            <h1>Count: {count}</h1>
            <button onClick={lambda e: any -> None {
                setCount(count + 1);
            }}>
                Increment
            </button>
        </div>;
    }

    def app() -> JsxElement {
        return Counter();
    }
}

Note: When using has variables in cl {} blocks or .cl.jac files, the useState import is automatically injected. You only need to explicitly import other hooks like useEffect.

Full-Stack Todo App

# useState is auto-injected, only import useEffect
cl import from react { useEffect }
cl import from '@jac/runtime' { jacSpawn }

# Backend: Jac nodes and walkers
node Todo {
    has text: str;
    has done: bool = False;
}

walker create_todo {
    has text: str;
    can create with Root entry {
        new_todo = here ++> Todo(text=self.text);
        report new_todo;
    }
}

walker read_todos {
    can read with Root entry {
        visit [-->(?:Todo)];
    }
}

# Frontend: React component
cl {
    def app() -> JsxElement {
        # useState is automatically available - no import needed!
        [todos, setTodos] = useState([]);

        useEffect(lambda -> None {
            async def loadTodos() -> None {
                result = await jacSpawn("read_todos", "", {});
                setTodos(result.reports);
            }
            loadTodos();
        }, []);

        return <div>
            <h1>My Todos</h1>
            {todos.map(lambda todo: any -> any {
                return <div key={todo._jac_id}>{todo.text}</div>;
            })}
        </div>;
    }
}

Requirements

  • Python: 3.12+
  • Bun: For package management and Vite bundling (install)
  • Jac Language: jaclang (installed automatically)

️ How It Works

Jac Client is a plugin that:

  1. Compiles your .jac client code to JavaScript
  2. Bundles dependencies with Vite for optimal performance
  3. Provides a runtime for reactive state and components
  4. Integrates seamlessly with Jac's backend graph operations

Learn More

  • Full Documentation: See docs/ for comprehensive guides
  • Examples: Check jac_client/examples/ for working examples
  • Issues: Report bugs on GitHub Issues

License

MIT License - see LICENSE file.


Happy coding with Jac!

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

jac_client-0.2.18.tar.gz (166.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

jac_client-0.2.18-py3-none-any.whl (210.1 kB view details)

Uploaded Python 3

File details

Details for the file jac_client-0.2.18.tar.gz.

File metadata

  • Download URL: jac_client-0.2.18.tar.gz
  • Upload date:
  • Size: 166.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.12

File hashes

Hashes for jac_client-0.2.18.tar.gz
Algorithm Hash digest
SHA256 cb65e316e9c148c060304d1d3cbe5533100ee7d8e40bc0eb23eb143e1e783209
MD5 edbbcdeb24206e346a520fd43091d9c1
BLAKE2b-256 1bc1a45372157270433f9a3c95b5e7266a08fbc3f17a3772cb404745b6ed0597

See more details on using hashes here.

File details

Details for the file jac_client-0.2.18-py3-none-any.whl.

File metadata

  • Download URL: jac_client-0.2.18-py3-none-any.whl
  • Upload date:
  • Size: 210.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.12

File hashes

Hashes for jac_client-0.2.18-py3-none-any.whl
Algorithm Hash digest
SHA256 b377a3676a0600eebbfcbf91ee4514c49a1769dab9dedd0835d3b468dfd2d2b4
MD5 f925c2dfc53955102f3d8d05589cc756
BLAKE2b-256 1251b2ef173a043c0eec44e27f310a21eccd901ebd42c63234ce7ad4fcd837bd

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page