Skip to content
View absolutejs's full-sized avatar

Block or report absolutejs

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Please don't include any personal information such as legal names or email addresses. Maximum 100 characters, markdown supported. This note will be visible to only you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
absolutejs/README.md

Absolute JS

Full‑stack, type‑safe batteries‑included platform that lets you server‑side render any modern front‑end—React, Svelte, plain HTML, HTMX (Vue & Angular coming)—with a single Bun‑powered build step.

bun-required elysia-required license


Why Absolute JS?

  • Universal SSR. Bring your favourite UI layer; Absolute JS handles bundling, hydration, and HTML streaming.
  • One build, one manifest. Call build() once—get a manifest mapping every page’s client and server assets, ready to wire into routes.
  • End‑to‑end type safety. A unified source of truth for your types—from the database, through the server, and all the way to the client—so you can be certain of the data shape at every step.
  • Zero‑config philosophy. Point the build at your folders; sane defaults light up everything else.
  • Plugin power. Extend with standard Elysia plugins—ship auth, logging, i18n, and more. First‑party: absolute-auth, networkingPlugin.

Requirements

Tool Version Purpose
Bun ≥ 1.2 Runtime, bundler, and TypeScript transpiler
Elysia latest Web server & middleware platform

Installation

bun add @absolutejs/absolute

Quick Start

// example/server.ts
import { staticPlugin } from '@elysiajs/static';
import { Elysia } from 'elysia';
import { file } from 'bun';
import { build } from 'absolutejs/core/build';
import {
	handleHTMLPageRequest,
	handleReactPageRequest,
	handleSveltePageRequest
} from 'absolutejs/core/pageHandlers';

import { ReactExample } from './react/pages/ReactExample';
import SvelteExample from './svelte/pages/SvelteExample.svelte';
import { networkingPlugin } from 'absolutejs';

const manifest = await build({
	assetsDirectory: 'example/assets',
	buildDirectory: 'example/build',
	htmlDirectory: 'example/html',
	htmxDirectory: 'example/htmx',
	reactDirectory: 'example/react',
	svelteDirectory: 'example/svelte',
	options: { preserveIntermediateFiles: true }
});

if (!manifest) throw new Error('Manifest generation failed');

let counter = 0;

export const server = new Elysia()
	.use(staticPlugin({ assets: './example/build', prefix: '' }))

	// HTML
	.get('/', () =>
		handleHTMLPageRequest('./example/build/html/pages/HtmlExample.html')
	)

	// React
	.get('/react', () =>
		handleReactPageRequest(ReactExample, manifest['ReactExampleIndex'], {
			test: 123
		})
	)

	// Svelte
	.get('/svelte', () =>
		handleSveltePageRequest(SvelteExample, manifest, { test: 456 })
	)

	// HTMX demo
	.get('/htmx', () => file('./example/build/htmx/HtmxHome.html'))
	.get('/htmx/increment', () => new Response(String(++counter)))

	.use(networkingPlugin)
	.on('error', (error) => {
		const { request } = error;
		console.error(
			`Server error on ${request.method} ${request.url}: ${error.message}`
		);
	});

How it works

  1. build() scans your project, bundles each framework, and returns a manifest that has the server, and client assets required to serve each route.
  2. Route handlers (handleReactPageRequest, handleSveltePageRequest, …) stream HTML and inject scripts/assets based on that manifest.
  3. The static plugin serves all compiled files from /build.

Plugin System

Absolute JS piggybacks on the Elysia plugin API. Any Elysia plugin works out of the box; Absolute adds helpers for:

Plugin Description
absolute-auth Full OAuth2 flow configured with 66 providers and allows full customizability with event handlers
networkingPlugin Starts your Elysia server with HOST/PORT defaults and adds a --host flag to toggle listening on localhost or your LAN interface

Configuration Philosophy

Everything funnels through a single build() call:

await build({
	reactDirectory: 'src/react',
	svelteDirectory: 'src/svelte',
	htmlDirectory: 'src/html',
	htmxDirectory: 'src/htmx',
	assetsDirectory: 'public/assets',
	options: { preserveIntermediateFiles: false }
});

No separate config files or environment variables—just explicit arguments with sensible defaults.


Roadmap

  • Vue and Angular handlers
  • Hot‑reload development server
  • First‑class Docker images & hosting recipes

Contributing

Pull requests and issues are welcome! Whether it’s a new plugin, framework handler, or docs improvement:

  1. Fork & branch.
  2. bun install && bun test.
  3. Submit a PR with a clear description.

License

Creative Commons CC BY‑NC 4.0 – see LICENSE for details.

Popular repositories Loading

  1. absolute-auth absolute-auth Public

    TypeScript 2

  2. absolutejs absolutejs Public

    TypeScript 2

  3. citra citra Public

    TypeScript 2

  4. eslint-plugin-absolute eslint-plugin-absolute Public

    JavaScript 2

  5. create-absolutejs create-absolutejs Public

    TypeScript 1

  6. scripts scripts Public

    JavaScript 1