Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions src/components/component.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import type { KeyEvent } from "@/terminal";
import type { KeyEvent } from "../terminal/types/key-event";
import type { Component, ComponentInitContext, ExitReason, RuntimeContext } from "./core";
import type { ViewElement } from "@/view/types/elements";
import { isBlock } from "@/view/types/elements";
import { isBlock, type ViewElement } from "../view/types/elements";
import {
createComponentInstance,
invokeHooks,
Expand Down
4 changes: 2 additions & 2 deletions src/components/core.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { KeyEvent } from "@/terminal";
import type { ViewElement } from "@/view/types/elements";
import type { KeyEvent } from "../terminal/types/key-event";
import type { ViewElement } from "../view/types/elements";

export type KeyHandler = (key: KeyEvent) => void | boolean;
export type TickHandler = () => void;
Expand Down
13 changes: 10 additions & 3 deletions src/components/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
export * from "./component";
export * from "./lifecycle";
export * from "./core";
export {
defineComponent,
handleComponentKey,
isComponent,
mountComponent,
renderComponent,
unmountComponent,
} from "./component";
export { createComponent } from "./core";
export { onBeforeUpdate, onKey, onMounted, onTick, onUnmounted, onUpdated } from "./lifecycle";
2 changes: 1 addition & 1 deletion src/components/lifecycle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* These hooks are called during different phases of a component's lifecycle.
*/

import type { KeyEvent } from "@/terminal";
import type { KeyEvent } from "../terminal/types/key-event";

export type LifecycleHook = () => void;
export type KeyEventHook = (event: KeyEvent) => void | boolean;
Expand Down
25 changes: 3 additions & 22 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,10 @@
* btuin core entry point
*/

export { createApp, App } from "./runtime/app";
export { defineComponent } from "./components/component";
export { createApp, App } from "./runtime";
export { defineComponent } from "./components";
export * from "./view";

export {
onBeforeUpdate,
onKey,
onMounted,
onTick,
onUnmounted,
onUpdated,
} from "./components/lifecycle";
export { onBeforeUpdate, onKey, onMounted, onTick, onUnmounted, onUpdated } from "./components";

export * from "./reactivity";

export type {
Component,
ComponentDefinition,
ComponentInitContext,
ExitReason,
KeyHandler,
RuntimeContext,
TickHandler,
} from "./components/core";
export type { App as AppType, CreateAppOptions, MountOptions } from "./runtime/types";
export type { KeyEvent } from "./terminal";
2 changes: 0 additions & 2 deletions src/layout-engine/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ import path from "node:path";
import type { LayoutInputNode, ComputedLayout, Dimension, LayoutStyle } from "./types";
import { existsSync } from "node:fs";

export * from "./types";

// --- Data Layout Constants (must match Rust) ---
// prettier-ignore
enum StyleProp {
Expand Down
7 changes: 3 additions & 4 deletions src/layout/focus.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import type { ViewElement } from "@/view/types/elements";
import type { ComputedLayout } from "@/layout-engine";
import type { FocusTarget } from "@/view/types/focus";
import { isBlock } from "@/view/types/elements";
import type { ComputedLayout } from "../layout-engine/types";
import { isBlock, type ViewElement } from "../view/types/elements";
import type { FocusTarget } from "../view/types/focus";

function visitFocusTargets(
element: ViewElement,
Expand Down
26 changes: 5 additions & 21 deletions src/layout/index.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,11 @@
import {
computeLayout as computeLayoutWasm,
type LayoutInputNode,
type ComputedLayout,
type Dimension,
} from "@/layout-engine";
import { isBlock, isText, type ViewElement, type BlockView } from "@/view/types/elements";
import { measureTextWidth } from "@/renderer/grapheme";
import { computeLayout as computeLayoutWasm } from "../layout-engine";
import type { ComputedLayout, Dimension, LayoutInputNode } from "../layout-engine/types";
import { measureTextWidth } from "../renderer/grapheme";
import { isBlock, isText, type BlockView, type ViewElement } from "../view/types/elements";
import type { LayoutContainerSize, LayoutEngine, LayoutOptions } from "./types";

export { renderElement } from "./renderer";

export interface LayoutEngine {
computeLayout(root: LayoutInputNode): ComputedLayout;
}

function ensureKeys(element: ViewElement, prefix: string) {
if (!element.identifier && !element.key) {
element.identifier = prefix;
Expand All @@ -33,15 +26,6 @@ function ensureKeys(element: ViewElement, prefix: string) {
}
}

export interface LayoutContainerSize {
width: number;
height: number;
}

export interface LayoutOptions {
inline?: boolean;
}

function isPercent(value: unknown): value is string {
return typeof value === "string" && /^\s*\d+(\.\d+)?%\s*$/.test(value);
}
Expand Down
7 changes: 4 additions & 3 deletions src/layout/renderer.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { type ViewElement, isBlock, isText } from "@/view/types/elements";
import type { ComputedLayout } from "@/layout-engine";
import { type Buffer2D, drawText, fillRect } from "@/renderer";
import type { ComputedLayout } from "../layout-engine/types";
import { drawText, fillRect } from "../renderer";
import type { Buffer2D } from "../renderer/types";
import { isBlock, isText, type ViewElement } from "../view/types/elements";

/**
* Draw the element tree to the buffer.
Expand Down
14 changes: 14 additions & 0 deletions src/layout/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import type { ComputedLayout, LayoutInputNode } from "../layout-engine/types";

export interface LayoutEngine {
computeLayout(root: LayoutInputNode): ComputedLayout;
}

export interface LayoutContainerSize {
width: number;
height: number;
}

export interface LayoutOptions {
inline?: boolean;
}
24 changes: 4 additions & 20 deletions src/reactivity/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,26 +24,13 @@
* ```
*/

export { reactive, isReactive, toRaw, shallowReactive, type ReactiveFlags } from "./reactive";
export { reactive, isReactive, toRaw, shallowReactive } from "./reactive";

export { ref, shallowRef, isRef, unref, toRef, toRefs, customRef, type Ref } from "./ref";
export { ref, shallowRef, isRef, unref, toRef, toRefs, customRef } from "./ref";

export {
computed,
type ComputedRef,
type ComputedGetter,
type ComputedSetter,
type ComputedUnwrap,
} from "./computed";
export { computed } from "./computed";

export {
watch,
watchEffect,
type WatchSource,
type WatchCallback,
type WatchOptions,
type WatchStopHandle,
} from "./watch";
export { watch, watchEffect } from "./watch";

export {
effect,
Expand All @@ -55,7 +42,4 @@ export {
resetTracking,
getCurrentEffect,
ReactiveEffect,
type EffectFn,
type EffectScheduler,
type ReactiveEffectOptions,
} from "./effect";
36 changes: 27 additions & 9 deletions src/renderer/index.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,27 @@
export * from "./buffer";
export * from "./colors";
export * from "./diff";
export * from "./inline-diff";
export * from "./grapheme";
export * from "./grid";
export * from "./pool";
export * from "./sanitize";
export type * from "./types";
export { FlatBuffer } from "./buffer";
export { resolveColor } from "./colors";
export { renderDiff } from "./diff";
export { createInlineDiffRenderer } from "./inline-diff";
export {
measureGraphemeWidth,
measureTextWidth,
segmentGraphemes,
truncateTextWidth,
wrapTextWidth,
} from "./grapheme";
export { cloneBuffer, createBuffer, drawText, fillRect, setCell } from "./grid";
export {
BufferPool,
getGlobalBufferPool,
resetGlobalBufferPool,
setGlobalBufferPool,
} from "./pool";
export {
createSanitizer,
escapeSpecial,
isSafeInput,
sanitizeAnsi,
sanitizeControl,
sanitizeInput,
truncateInput,
} from "./sanitize";
2 changes: 1 addition & 1 deletion src/renderer/types/buffer.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { FlatBuffer } from "@/renderer/buffer";
import { FlatBuffer } from "../buffer";
/**
* Public buffer type used throughout the renderer.
*/
Expand Down
6 changes: 3 additions & 3 deletions src/runtime/app.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { Component, ComponentInitContext } from "@/components/core";
import type { ViewElement } from "@/view/types/elements";
import { mountComponent } from "@/components";
import type { Component, ComponentInitContext } from "../components/core";
import { mountComponent } from "../components";
import type { ViewElement } from "../view/types/elements";
import { createErrorContext, createErrorHandler } from "./error-boundary";
import { createDefaultTerminalAdapter } from "./terminal-adapter";
import { createDefaultPlatformAdapter, type PlatformAdapter } from "./platform-adapter";
Expand Down
6 changes: 3 additions & 3 deletions src/runtime/context.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { ReactiveEffect } from "@/reactivity";
import type { ExitReason } from "@/components/core";
import type { MountedComponent } from "@/components";
import type { ExitReason } from "../components/core";
import type { MountedComponent } from "../components/component";
import type { ReactiveEffect } from "../reactivity/effect";
import type { TerminalAdapter } from "./terminal-adapter";
import type { PlatformAdapter } from "./platform-adapter";
import type { Profiler } from "./profiler";
Expand Down
7 changes: 3 additions & 4 deletions src/runtime/error-boundary.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
* Handles error contexts and provides error handling utilities for the runtime.
*/

import { createWriteStream } from "node:fs";
import { getOriginalStderr } from "../terminal";

/**
* Error context information for error handlers
*/
Expand All @@ -28,10 +31,6 @@ export type ErrorHandler = (context: ErrorContext) => void;
* @param errorLogPath - Optional file path to write error logs to
* @returns Error handling function
*/
import { createWriteStream } from "fs";
import { getOriginalStderr } from "@/terminal";

// ...

export function createErrorHandler(
userHandler: ErrorHandler | undefined,
Expand Down
12 changes: 6 additions & 6 deletions src/runtime/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
export * from "./app";
export * from "./error-boundary";
export * from "./platform-adapter";
export * from "./terminal-adapter";
export * from "./profiler";
export * from "./render-loop";
export { App, app, createApp } from "./app";
export { createErrorContext, createErrorHandler } from "./error-boundary";
export { createDefaultPlatformAdapter } from "./platform-adapter";
export { createDefaultTerminalAdapter } from "./terminal-adapter";
export { Profiler } from "./profiler";
export { createRenderer } from "./render-loop";
4 changes: 2 additions & 2 deletions src/runtime/lifecycle.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { ExitReason } from "@/components/core";
import { unmountComponent } from "@/components";
import type { ExitReason } from "../components/core";
import { unmountComponent } from "../components";
import type { AppContext } from "./context";

export class LifecycleManager {
Expand Down
14 changes: 7 additions & 7 deletions src/runtime/loop.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import type { KeyEvent } from "@/terminal";
import { stop } from "@/reactivity";
import { Block } from "@/view/primitives";
import { handleComponentKey, renderComponent } from "@/components";
import type { KeyEvent } from "../terminal/types/key-event";
import { stop } from "../reactivity";
import { handleComponentKey, renderComponent } from "../components";
import { createInlineDiffRenderer } from "../renderer";
import { layout } from "../layout";
import { Block } from "../view/primitives";
import type { ViewElement } from "../view/types/elements";
import { createRenderer } from "./render-loop";
import { createErrorContext, createErrorHandler } from "./error-boundary";
import type { AppContext } from "./context";
import type { ViewElement } from "@/view/types/elements";
import type { ILoopManager } from "./types";
import { createInlineDiffRenderer } from "@/renderer";
import { layout } from "@/layout";

export class LoopManager implements ILoopManager {
private ctx: AppContext;
Expand Down
2 changes: 1 addition & 1 deletion src/runtime/platform-adapter.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { getUiOutputStream } from "@/terminal/tty-streams";
import { getUiOutputStream } from "../terminal/tty-streams";

export interface PlatformAdapter {
onStdoutResize(handler: () => void): () => void;
Expand Down
2 changes: 1 addition & 1 deletion src/runtime/profiler.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { Buffer2D } from "@/renderer";
import path from "node:path";
import { mkdirSync, writeFileSync } from "node:fs";
import type { Buffer2D } from "../renderer/types";

export interface ProfileOptions {
/**
Expand Down
19 changes: 7 additions & 12 deletions src/runtime/render-loop.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,12 @@
import { effect, stop, type ReactiveEffect } from "@/reactivity";
import {
FlatBuffer,
getGlobalBufferPool,
renderDiff,
type Buffer2D,
type DiffStats,
} from "@/renderer";
import { layout, renderElement } from "@/layout";
import type { ViewElement } from "@/view/types/elements";
import { isBlock } from "@/view/types/elements";
import { effect, stop, type ReactiveEffect } from "../reactivity";
import { FlatBuffer, getGlobalBufferPool, renderDiff } from "../renderer";
import { layout, renderElement } from "../layout";
import type { DiffStats } from "../renderer/diff";
import type { Buffer2D } from "../renderer/types";
import { isBlock, type ViewElement } from "../view/types/elements";
import { createErrorContext } from "./error-boundary";
import type { Profiler } from "./profiler";
import type { ComputedLayout } from "@/layout-engine";
import type { ComputedLayout } from "../layout-engine/types";

export interface BufferPoolLike {
acquire(): Buffer2D;
Expand Down
6 changes: 3 additions & 3 deletions src/runtime/terminal-adapter.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { KeyEvent } from "@/terminal";
import * as terminal from "@/terminal";
import type { InputParser } from "@/terminal/parser/types";
import type { KeyEvent } from "../terminal/types/key-event";
import * as terminal from "../terminal";
import type { InputParser } from "../terminal/parser/types";

export interface TerminalAdapter {
setupRawMode(): void;
Expand Down
8 changes: 4 additions & 4 deletions src/runtime/types.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import type { ComponentInitContext, ExitReason } from "@/components/core";
import type { MountedComponent } from "@/components";
import type { ComponentInitContext, ExitReason } from "../components/core";
import type { MountedComponent } from "../components/component";
import type { InputParser } from "../terminal/parser/types";
import type { ViewElement } from "../view/types/elements";
import type { TerminalAdapter } from "./terminal-adapter";
import type { PlatformAdapter } from "./platform-adapter";
import type { ProfileOptions } from "./profiler";
import type { InputParser } from "@/terminal/parser/types";
import type { ViewElement } from "@/view/types/elements";

export interface ILoopManager {
start(rows: number, cols: number): void;
Expand Down
Loading