treesap 0.1.13 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/README.md +31 -192
  2. package/dist/app.d.ts +28 -0
  3. package/dist/app.d.ts.map +1 -0
  4. package/dist/app.js +184 -0
  5. package/dist/app.js.map +1 -0
  6. package/dist/context.d.ts +36 -0
  7. package/dist/context.d.ts.map +1 -0
  8. package/dist/context.js +95 -0
  9. package/dist/context.js.map +1 -0
  10. package/dist/index.d.ts +5 -7
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +5 -9
  13. package/dist/index.js.map +1 -1
  14. package/dist/middleware/cors.d.ts +11 -0
  15. package/dist/middleware/cors.d.ts.map +1 -0
  16. package/dist/middleware/cors.js +34 -0
  17. package/dist/middleware/cors.js.map +1 -0
  18. package/dist/middleware/serve-static.d.ts +6 -0
  19. package/dist/middleware/serve-static.d.ts.map +1 -0
  20. package/dist/middleware/serve-static.js +68 -0
  21. package/dist/middleware/serve-static.js.map +1 -0
  22. package/dist/node.d.ts +8 -0
  23. package/dist/node.d.ts.map +1 -0
  24. package/dist/node.js +52 -0
  25. package/dist/node.js.map +1 -0
  26. package/dist/path.d.ts +10 -0
  27. package/dist/path.d.ts.map +1 -0
  28. package/dist/path.js +45 -0
  29. package/dist/path.js.map +1 -0
  30. package/dist/vite.d.ts +31 -0
  31. package/dist/vite.d.ts.map +1 -0
  32. package/dist/vite.js +278 -0
  33. package/dist/vite.js.map +1 -0
  34. package/package.json +33 -40
  35. package/dist/cli.d.ts +0 -3
  36. package/dist/cli.d.ts.map +0 -1
  37. package/dist/cli.js +0 -137
  38. package/dist/cli.js.map +0 -1
  39. package/dist/components/BaseHead.d.ts +0 -5
  40. package/dist/components/BaseHead.d.ts.map +0 -1
  41. package/dist/components/BaseHead.js +0 -161
  42. package/dist/components/BaseHead.js.map +0 -1
  43. package/dist/components/ChatInput.d.ts +0 -7
  44. package/dist/components/ChatInput.d.ts.map +0 -1
  45. package/dist/components/ChatInput.js +0 -11
  46. package/dist/components/ChatInput.js.map +0 -1
  47. package/dist/components/Sidebar.d.ts +0 -8
  48. package/dist/components/Sidebar.d.ts.map +0 -1
  49. package/dist/components/Sidebar.js +0 -7
  50. package/dist/components/Sidebar.js.map +0 -1
  51. package/dist/components/SimpleLivePreview.d.ts +0 -7
  52. package/dist/components/SimpleLivePreview.d.ts.map +0 -1
  53. package/dist/components/SimpleLivePreview.js +0 -7
  54. package/dist/components/SimpleLivePreview.js.map +0 -1
  55. package/dist/components/Terminal.d.ts +0 -7
  56. package/dist/components/Terminal.d.ts.map +0 -1
  57. package/dist/components/Terminal.js +0 -14
  58. package/dist/components/Terminal.js.map +0 -1
  59. package/dist/components/VoiceRecorder.d.ts +0 -4
  60. package/dist/components/VoiceRecorder.d.ts.map +0 -1
  61. package/dist/components/VoiceRecorder.js +0 -5
  62. package/dist/components/VoiceRecorder.js.map +0 -1
  63. package/dist/components/icons/GeminiLogo.d.ts +0 -7
  64. package/dist/components/icons/GeminiLogo.d.ts.map +0 -1
  65. package/dist/components/icons/GeminiLogo.js +0 -5
  66. package/dist/components/icons/GeminiLogo.js.map +0 -1
  67. package/dist/components/icons/OllamaLogo.d.ts +0 -2
  68. package/dist/components/icons/OllamaLogo.d.ts.map +0 -1
  69. package/dist/components/icons/OllamaLogo.js +0 -5
  70. package/dist/components/icons/OllamaLogo.js.map +0 -1
  71. package/dist/layouts/Layout.d.ts +0 -9
  72. package/dist/layouts/Layout.d.ts.map +0 -1
  73. package/dist/layouts/Layout.js +0 -9
  74. package/dist/layouts/Layout.js.map +0 -1
  75. package/dist/layouts/NotFoundLayout.d.ts +0 -2
  76. package/dist/layouts/NotFoundLayout.d.ts.map +0 -1
  77. package/dist/layouts/NotFoundLayout.js +0 -6
  78. package/dist/layouts/NotFoundLayout.js.map +0 -1
  79. package/dist/pages/Code.d.ts +0 -7
  80. package/dist/pages/Code.d.ts.map +0 -1
  81. package/dist/pages/Code.js +0 -8
  82. package/dist/pages/Code.js.map +0 -1
  83. package/dist/pages/Home.d.ts +0 -7
  84. package/dist/pages/Home.d.ts.map +0 -1
  85. package/dist/pages/Home.js +0 -8
  86. package/dist/pages/Home.js.map +0 -1
  87. package/dist/pages/Welcome.d.ts +0 -2
  88. package/dist/pages/Welcome.d.ts.map +0 -1
  89. package/dist/pages/Welcome.js +0 -6
  90. package/dist/pages/Welcome.js.map +0 -1
  91. package/dist/server.d.ts +0 -11
  92. package/dist/server.d.ts.map +0 -1
  93. package/dist/server.js +0 -434
  94. package/dist/server.js.map +0 -1
  95. package/dist/services/dev-server.d.ts +0 -29
  96. package/dist/services/dev-server.d.ts.map +0 -1
  97. package/dist/services/dev-server.js +0 -201
  98. package/dist/services/dev-server.js.map +0 -1
  99. package/dist/services/terminal.d.ts +0 -46
  100. package/dist/services/terminal.d.ts.map +0 -1
  101. package/dist/services/terminal.js +0 -264
  102. package/dist/services/terminal.js.map +0 -1
  103. package/dist/services/websocket.d.ts +0 -48
  104. package/dist/services/websocket.d.ts.map +0 -1
  105. package/dist/services/websocket.js +0 -332
  106. package/dist/services/websocket.js.map +0 -1
  107. package/dist/static/components/ChatInput.js +0 -237
  108. package/dist/static/components/Sidebar.js +0 -225
  109. package/dist/static/components/SimpleLivePreview.js +0 -305
  110. package/dist/static/components/Terminal.js +0 -461
  111. package/dist/static/components/TerminalTabs.js +0 -383
  112. package/dist/static/favicon.svg +0 -14
  113. package/dist/static/signals/LivePreviewSignal.js +0 -71
  114. package/dist/static/signals/SidebarSignal.js +0 -123
  115. package/dist/static/signals/TerminalSignal.js +0 -273
  116. package/dist/static/styles/main.css +0 -1761
  117. package/src/cli.ts +0 -155
  118. package/src/components/BaseHead.ts +0 -164
  119. package/src/components/ChatInput.tsx +0 -56
  120. package/src/components/Sidebar.tsx +0 -99
  121. package/src/components/SimpleLivePreview.tsx +0 -40
  122. package/src/components/Terminal.tsx +0 -40
  123. package/src/components/VoiceRecorder.tsx +0 -33
  124. package/src/components/icons/GeminiLogo.tsx +0 -10
  125. package/src/components/icons/OllamaLogo.tsx +0 -5
  126. package/src/index.tsx +0 -12
  127. package/src/layouts/Layout.tsx +0 -41
  128. package/src/layouts/NotFoundLayout.tsx +0 -15
  129. package/src/pages/Code.tsx +0 -34
  130. package/src/pages/Welcome.tsx +0 -56
  131. package/src/server.tsx +0 -519
  132. package/src/services/dev-server.ts +0 -234
  133. package/src/services/terminal.ts +0 -325
  134. package/src/services/websocket.ts +0 -405
  135. package/src/static/components/ChatInput.js +0 -237
  136. package/src/static/components/Sidebar.js +0 -225
  137. package/src/static/components/SimpleLivePreview.js +0 -305
  138. package/src/static/components/Terminal.js +0 -461
  139. package/src/static/components/TerminalTabs.js +0 -383
  140. package/src/static/favicon.svg +0 -14
  141. package/src/static/signals/LivePreviewSignal.js +0 -71
  142. package/src/static/signals/SidebarSignal.js +0 -123
  143. package/src/static/signals/TerminalSignal.js +0 -273
  144. package/src/static/styles/main.css +0 -1761
  145. package/src/styles/input.css +0 -3
  146. package/tailwind.config.ts +0 -22
  147. package/tsconfig.json +0 -37
package/README.md CHANGED
@@ -1,217 +1,56 @@
1
1
  # Treesap
2
2
 
3
- **AI Agent Framework for Distributed Development Teams**
3
+ Treesap is a Vite-first Node SSR framework.
4
4
 
5
- Treesap is a revolutionary development platform that enables multiple AI agents and human developers to collaborate in real-time through persistent terminal sessions and WebSocket-based coordination. Built for the future of software development where AI agents work alongside humans in coordinated teams.
5
+ This package provides:
6
6
 
7
- ## 🌟 Key Features
7
+ - a small request/response app runtime for Node
8
+ - router and middleware primitives
9
+ - static file serving with sensible cache defaults
10
+ - a `treesap/vite` entry for Vite dev and production builds
8
11
 
9
- - **Multi-Agent Terminal Orchestration** - Multiple AI agents can work simultaneously across different terminal sessions
10
- - **Real-Time Cross-Session Monitoring** - External agents can observe and control multiple terminal sessions
11
- - **Mobile-Responsive Terminal Interface** - Chat-style input for better mobile development experience
12
- - **WebSocket-Based Architecture** - Real-time bidirectional communication between terminals, web UI, and external agents
13
- - **Framework Agnostic** - Works with any development stack (Hono, Vite, React, etc.)
14
- - **Persistent Terminal Sessions** - Sessions survive across browser refreshes and disconnections
15
- - **Live Preview Integration** - Built-in development server with live reload
16
-
17
- ## 🚀 Quick Start
18
-
19
- ### Installation
12
+ ## Install
20
13
 
21
14
  ```bash
22
- npm install treesap
15
+ npm install treesap vite hono
23
16
  ```
24
17
 
25
- ### Basic Setup
26
-
27
- 1. Create a `treesap.config.ts` file in your project root:
28
-
29
- ```typescript
30
- import type { TreesapConfig } from 'treesap';
31
-
32
- const config: TreesapConfig = {
33
- port: 1235, // Treesap server port
34
- previewPort: 5173, // Your app's dev server port
35
- devCommand: "npm run dev", // Command to start your dev server
36
- devPort: 5173, // Port your dev server runs on
37
- projectRoot: process.cwd()
38
- };
39
-
40
- export default config;
41
- ```
42
-
43
- 2. Add scripts to your `package.json`:
44
-
45
- ```json
46
- {
47
- "scripts": {
48
- "dev:treesap": "treesap dev",
49
- "treesap": "treesap start"
50
- }
51
- }
52
- ```
18
+ ## Vite Config
53
19
 
54
- 3. Start Treesap:
20
+ ```ts
21
+ import react from "@vitejs/plugin-react";
22
+ import { defineTreesapConfig } from "treesap/vite";
55
23
 
56
- ```bash
57
- npm run dev:treesap
24
+ export default defineTreesapConfig({
25
+ appEntry: "src/server/app.tsx",
26
+ plugins: [react()],
27
+ });
58
28
  ```
59
29
 
60
- Visit `http://localhost:1235` to access the Treesap interface with integrated terminal and live preview.
61
-
62
- ## 🏗️ Core Concepts
63
-
64
- ### Terminal Sessions
65
- Each terminal session is persistent and can be shared across multiple clients (browsers, agents, etc.). Sessions survive disconnections and can be resumed at any time.
30
+ ## Server App
66
31
 
67
- ### WebSocket Communication
68
- All terminal I/O, resize events, and cross-session communication happens over WebSockets, enabling real-time collaboration between humans and AI agents.
32
+ ```ts
33
+ import { renderToString } from "hono/jsx/dom/server";
34
+ import { createApp } from "treesap";
69
35
 
70
- ### Agent Coordination
71
- External AI agents can:
72
- - Monitor multiple terminal sessions simultaneously
73
- - Send commands to specific terminals
74
- - Receive real-time output from all monitored sessions
75
- - Coordinate complex multi-step tasks across multiple environments
36
+ export function createServerApp() {
37
+ const app = createApp();
76
38
 
77
- ## 📱 Mobile-First Design
39
+ app.get("/", (ctx) => {
40
+ return ctx.html(renderToString(<h1>Hello</h1>));
41
+ });
78
42
 
79
- Treesap features a responsive terminal interface with:
80
- - **Chat-style input** - Familiar textarea interface for mobile users
81
- - **Two-step command execution** - Send to input field, then execute
82
- - **Automatic terminal resizing** - Adapts to mobile screen sizes and orientation changes
83
- - **Touch-optimized controls** - Better interaction on mobile devices
84
-
85
- ## ⚙️ Configuration
86
-
87
- The `TreesapConfig` interface supports these options:
88
-
89
- ```typescript
90
- interface TreesapConfig {
91
- port?: number; // Treesap server port (default: 1235)
92
- previewPort?: number; // Preview iframe port (default: 3000)
93
- devCommand?: string; // Command to auto-start dev server
94
- devPort?: number; // Dev server port to auto-start
95
- projectRoot?: string; // Project root directory
43
+ return app;
96
44
  }
97
45
  ```
98
46
 
99
- ## 🧠 Multi-Agent Development
100
-
101
- Treesap enables unprecedented AI agent collaboration:
102
-
103
- ### Agent Orchestration
104
- - **Supervisor Agents** - Monitor multiple coding agents across different terminals
105
- - **Specialized Agents** - Each agent can work in its dedicated terminal session
106
- - **Cross-Agent Communication** - Agents can coordinate through the WebSocket infrastructure
107
-
108
- ### Human-AI Collaboration
109
- - **Seamless Handoffs** - Switch between human and AI control of terminal sessions
110
- - **Real-time Monitoring** - Watch AI agents work while maintaining override capability
111
- - **Collaborative Debugging** - Multiple agents can work on the same problem simultaneously
112
-
113
- ## 🛠️ Architecture
114
-
115
- ### WebSocket Terminal Service
116
- - Persistent terminal sessions using `node-pty`
117
- - Multi-client session sharing
118
- - Cross-session monitoring and control
119
- - Real-time input/output streaming
120
-
121
- ### Sapling Islands Components
122
- - Reactive terminal interface
123
- - Live preview integration
124
- - Mobile-responsive design
125
- - Chat-style input system
126
-
127
- ### External Agent Integration
128
- ```typescript
129
- // Connect to WebSocket for monitoring
130
- const ws = new WebSocket('ws://localhost:1235/terminal/ws');
131
-
132
- // Join a terminal session
133
- ws.send(JSON.stringify({
134
- type: 'join',
135
- sessionId: 'terminal-1',
136
- terminalId: 'terminal-1'
137
- }));
138
-
139
- // Send commands
140
- ws.send(JSON.stringify({
141
- type: 'input',
142
- sessionId: 'terminal-1',
143
- data: 'npm test\r'
144
- }));
145
- ```
146
-
147
- ## 🎯 Use Cases
148
-
149
- ### AI Development Teams
150
- - Multiple AI agents working on different parts of a large codebase
151
- - Coordinated testing and deployment across multiple environments
152
- - Real-time code review and collaboration between AI agents
153
-
154
- ### Educational Platforms
155
- - Instructors monitoring multiple student coding sessions
156
- - AI tutors providing real-time assistance
157
- - Collaborative coding exercises with mixed human-AI teams
158
-
159
- ### DevOps Orchestration
160
- - Coordinated deployments across multiple servers
161
- - Real-time monitoring and intervention capabilities
162
- - Automated testing with human oversight
163
-
164
- ## 📚 API Reference
165
-
166
- ### WebSocket Message Types
167
- - `join` - Join a terminal session
168
- - `leave` - Leave a terminal session
169
- - `input` - Send input to terminal
170
- - `resize` - Resize terminal dimensions
171
- - `ping/pong` - Connection health checks
172
-
173
- ### Terminal Service Methods
174
- - `getActiveSessions()` - List all active sessions
175
- - `sendCommandToSession(sessionId, command)` - Send command to session
176
- - `getSessionClients(sessionId)` - Get connected clients
177
- - `closeSession(sessionId)` - Terminate a session
178
-
179
- ## 🔧 Development
180
-
181
- ### Prerequisites
182
- - Node.js >=18.0.0
183
- - TypeScript support
47
+ Build with `vite build`, then run the server bundle with:
184
48
 
185
- ### Building from Source
186
49
  ```bash
187
- git clone https://github.com/withtreesap/treesap.git
188
- cd treesap/packages/treesap
189
- npm install
190
- npm run build
50
+ node dist/server/main.js
191
51
  ```
192
52
 
193
- ### Development Scripts
194
- ```bash
195
- npm run dev # Start with hot reload
196
- npm run dev:css # Watch CSS changes
197
- npm run build # Build for production
198
- npm run clean # Clean build artifacts
199
- ```
200
-
201
- ## 🤝 Contributing
202
-
203
- We welcome contributions! Treesap is building the foundation for the future of AI-powered development.
204
-
205
- ## 📄 License
206
-
207
- MIT License - see LICENSE file for details.
208
-
209
- ## 🔗 Links
210
-
211
- - [GitHub Repository](https://github.com/withtreesap/treesap)
212
- - [Issues & Bug Reports](https://github.com/withtreesap/treesap/issues)
213
- - [NPM Package](https://www.npmjs.com/package/treesap)
214
-
215
- ---
53
+ ## Exports
216
54
 
217
- **Treesap** - *Growing the future of collaborative development* 🌳
55
+ - `treesap`: `createApp`, `createRouter`, `serve`, `Context`, `cors`, `serveStatic`
56
+ - `treesap/vite`: `defineTreesapConfig`, `getViteEntryAssets`, `treesap`
package/dist/app.d.ts ADDED
@@ -0,0 +1,28 @@
1
+ import { Context } from "./context.ts";
2
+ export type Next = () => Promise<Response>;
3
+ export type HandlerResult = Response | void | Promise<Response | void>;
4
+ export type Handler = (ctx: Context, next: Next) => HandlerResult;
5
+ export interface CreateAppOptions {
6
+ rootDir?: string;
7
+ publicDir?: string | false;
8
+ }
9
+ export declare class ServerApp {
10
+ private readonly frameworkMiddlewares;
11
+ private readonly middlewares;
12
+ private readonly routes;
13
+ private notFoundHandler;
14
+ constructor(options?: CreateAppOptions);
15
+ use(pathOrHandler: string | Handler, ...handlers: Handler[]): this;
16
+ on(methods: string[] | readonly string[], path: string, ...handlers: Handler[]): this;
17
+ get(path: string, ...handlers: Handler[]): this;
18
+ post(path: string, ...handlers: Handler[]): this;
19
+ patch(path: string, ...handlers: Handler[]): this;
20
+ delete(path: string, ...handlers: Handler[]): this;
21
+ route(prefix: string, child: ServerApp): this;
22
+ mount(prefix: string, child: ServerApp): this;
23
+ notFound(handler: Handler): this;
24
+ fetch(request: Request | string | URL, init?: RequestInit): Promise<Response>;
25
+ }
26
+ export declare function createApp(options?: CreateAppOptions): ServerApp;
27
+ export declare function createRouter(): ServerApp;
28
+ //# sourceMappingURL=app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAIvC,MAAM,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC3C,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,IAAI,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;AACvE,MAAM,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,KAAK,aAAa,CAAC;AAElE,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CAC5B;AAoGD,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA0B;IAC/D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA0B;IACtD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,eAAe,CACkB;gBAE7B,OAAO,GAAE,gBAAqB;IAsB1C,GAAG,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE;IAkB3D,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE;IAW9E,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE;IAIxC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE;IAIzC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE;IAI1C,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE;IAI3C,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS;IAqBtC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS;IAItC,QAAQ,CAAC,OAAO,EAAE,OAAO;IAKnB,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW;CA8ChE;AAED,wBAAgB,SAAS,CAAC,OAAO,CAAC,EAAE,gBAAgB,aAEnD;AAED,wBAAgB,YAAY,cAE3B"}
package/dist/app.js ADDED
@@ -0,0 +1,184 @@
1
+ import { existsSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { Context } from "./context.js";
4
+ import { serveStatic } from "./middleware/serve-static.js";
5
+ import { compilePath, joinPaths } from "./path.js";
6
+ function isProductionRuntime() {
7
+ const viteEnv = import.meta.env;
8
+ return viteEnv?.PROD === true;
9
+ }
10
+ function resolveDefaultPublicRoot(rootDir) {
11
+ const builtClientDir = path.resolve(rootDir, "dist/client");
12
+ const sourcePublicDir = path.resolve(rootDir, "public");
13
+ if (isProductionRuntime() && existsSync(builtClientDir)) {
14
+ return builtClientDir;
15
+ }
16
+ if (existsSync(sourcePublicDir)) {
17
+ return sourcePublicDir;
18
+ }
19
+ if (existsSync(builtClientDir)) {
20
+ return builtClientDir;
21
+ }
22
+ return null;
23
+ }
24
+ function applyResponseDefaults(response) {
25
+ const contentType = response.headers.get("Content-Type")?.toLowerCase() ?? "";
26
+ if (!contentType.startsWith("text/html") ||
27
+ response.headers.has("Cache-Control")) {
28
+ return response;
29
+ }
30
+ const headers = new Headers(response.headers);
31
+ headers.set("Cache-Control", "public, max-age=0, must-revalidate");
32
+ return new Response(response.body, {
33
+ status: response.status,
34
+ statusText: response.statusText,
35
+ headers,
36
+ });
37
+ }
38
+ async function composeHandlers(handlers, ctx, finalNext) {
39
+ let index = -1;
40
+ async function dispatch(position) {
41
+ if (position <= index) {
42
+ throw new Error("next() called multiple times");
43
+ }
44
+ index = position;
45
+ const handler = handlers[position];
46
+ if (!handler) {
47
+ return finalNext();
48
+ }
49
+ let downstream;
50
+ const response = await handler(ctx, async () => {
51
+ downstream = await dispatch(position + 1);
52
+ return downstream;
53
+ });
54
+ if (response) {
55
+ return response;
56
+ }
57
+ if (downstream) {
58
+ return downstream;
59
+ }
60
+ return new Response(null, { status: 204 });
61
+ }
62
+ return dispatch(0);
63
+ }
64
+ export class ServerApp {
65
+ frameworkMiddlewares = [];
66
+ middlewares = [];
67
+ routes = [];
68
+ notFoundHandler = (ctx) => ctx.text("Not Found", { status: 404 });
69
+ constructor(options = {}) {
70
+ if (options.publicDir === false) {
71
+ return;
72
+ }
73
+ const rootDir = path.resolve(options.rootDir ?? process.cwd());
74
+ const staticRoot = typeof options.publicDir === "string"
75
+ ? path.resolve(rootDir, options.publicDir)
76
+ : resolveDefaultPublicRoot(rootDir);
77
+ if (!staticRoot || !existsSync(staticRoot)) {
78
+ return;
79
+ }
80
+ this.frameworkMiddlewares.push({
81
+ path: "/*",
82
+ matcher: compilePath("/*"),
83
+ handler: serveStatic({ root: staticRoot }),
84
+ });
85
+ }
86
+ use(pathOrHandler, ...handlers) {
87
+ const path = typeof pathOrHandler === "string" ? pathOrHandler : "*";
88
+ const list = typeof pathOrHandler === "string"
89
+ ? handlers
90
+ : [pathOrHandler, ...handlers];
91
+ for (const handler of list) {
92
+ this.middlewares.push({
93
+ path,
94
+ matcher: compilePath(path),
95
+ handler,
96
+ });
97
+ }
98
+ return this;
99
+ }
100
+ on(methods, path, ...handlers) {
101
+ this.routes.push({
102
+ path,
103
+ methods: [...methods].map((method) => method.toUpperCase()),
104
+ matcher: compilePath(path),
105
+ handlers,
106
+ });
107
+ return this;
108
+ }
109
+ get(path, ...handlers) {
110
+ return this.on(["GET"], path, ...handlers);
111
+ }
112
+ post(path, ...handlers) {
113
+ return this.on(["POST"], path, ...handlers);
114
+ }
115
+ patch(path, ...handlers) {
116
+ return this.on(["PATCH"], path, ...handlers);
117
+ }
118
+ delete(path, ...handlers) {
119
+ return this.on(["DELETE"], path, ...handlers);
120
+ }
121
+ route(prefix, child) {
122
+ child.middlewares.forEach((record) => {
123
+ this.middlewares.push({
124
+ path: joinPaths(prefix, record.path),
125
+ matcher: compilePath(joinPaths(prefix, record.path)),
126
+ handler: record.handler,
127
+ });
128
+ });
129
+ child.routes.forEach((record) => {
130
+ this.routes.push({
131
+ path: joinPaths(prefix, record.path),
132
+ methods: [...record.methods],
133
+ matcher: compilePath(joinPaths(prefix, record.path)),
134
+ handlers: [...record.handlers],
135
+ });
136
+ });
137
+ return this;
138
+ }
139
+ mount(prefix, child) {
140
+ return this.route(prefix, child);
141
+ }
142
+ notFound(handler) {
143
+ this.notFoundHandler = handler;
144
+ return this;
145
+ }
146
+ async fetch(request, init) {
147
+ const normalizedRequest = request instanceof Request ? request : new Request(request, init);
148
+ const url = new URL(normalizedRequest.url);
149
+ const method = normalizedRequest.method.toUpperCase();
150
+ const middlewareStack = this.middlewares
151
+ .filter((record) => record.matcher.test(url.pathname))
152
+ .concat(this.frameworkMiddlewares.filter((record) => record.matcher.test(url.pathname)))
153
+ .map((record) => record.handler);
154
+ const route = this.routes.find((record) => {
155
+ if (!record.methods.includes(method) && !record.methods.includes("ALL")) {
156
+ return false;
157
+ }
158
+ return Boolean(record.matcher.test(url.pathname));
159
+ });
160
+ const params = route?.matcher.test(url.pathname)?.params ?? {};
161
+ const ctx = new Context(normalizedRequest, params);
162
+ const notFound = async () => {
163
+ const response = await this.notFoundHandler(ctx, async () => new Response(null, { status: 404 }));
164
+ if (response instanceof Response) {
165
+ return response;
166
+ }
167
+ return new Response(null, { status: 404 });
168
+ };
169
+ if (!route) {
170
+ const response = await composeHandlers(middlewareStack, ctx, notFound);
171
+ return applyResponseDefaults(response);
172
+ }
173
+ const handlers = [...middlewareStack, ...route.handlers];
174
+ const response = await composeHandlers(handlers, ctx, notFound);
175
+ return applyResponseDefaults(response);
176
+ }
177
+ }
178
+ export function createApp(options) {
179
+ return new ServerApp(options);
180
+ }
181
+ export function createRouter() {
182
+ return new ServerApp({ publicDir: false });
183
+ }
184
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { Child } from "hono/jsx";
2
+ export type Renderable = Child | string;
3
+ export type Renderer = (content: Renderable, ctx: Context, init?: ResponseInit) => Response | Promise<Response>;
4
+ export declare class Context {
5
+ readonly request: Request;
6
+ readonly url: URL;
7
+ readonly var: Map<string, unknown>;
8
+ readonly res: {
9
+ headers: Headers;
10
+ status: number | undefined;
11
+ };
12
+ private renderer?;
13
+ private readonly params;
14
+ readonly req: {
15
+ raw: Request;
16
+ url: string;
17
+ json: <T = unknown>() => Promise<T>;
18
+ text: () => Promise<string>;
19
+ formData: () => Promise<FormData>;
20
+ param: (name?: string) => string | Record<string, string> | undefined;
21
+ header: (name: string) => string | undefined;
22
+ query: (name?: string) => string | Record<string, string> | undefined;
23
+ };
24
+ constructor(request: Request, params?: Record<string, string>);
25
+ set<T>(key: string, value: T): void;
26
+ get<T>(key: string): T;
27
+ status(code: number): void;
28
+ header(name: string, value: string): void;
29
+ json(data: unknown, init?: ResponseInit): Response;
30
+ text(value: string, init?: ResponseInit): Response;
31
+ html(value: string, init?: ResponseInit): Response;
32
+ redirect(location: string, status?: number): Response;
33
+ setRenderer(renderer: Renderer): void;
34
+ render(content: Renderable, init?: ResponseInit): Response | Promise<Response>;
35
+ }
36
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,CAAC;AACxC,MAAM,MAAM,QAAQ,GAAG,CACrB,OAAO,EAAE,UAAU,EACnB,GAAG,EAAE,OAAO,EACZ,IAAI,CAAC,EAAE,YAAY,KAChB,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AAmBlC,qBAAa,OAAO;IAsBN,QAAQ,CAAC,OAAO,EAAE,OAAO;IArBrC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAClB,QAAQ,CAAC,GAAG,uBAA8B;IAC1C,QAAQ,CAAC,GAAG;;gBAEW,MAAM,GAAG,SAAS;MACvC;IAEF,OAAO,CAAC,QAAQ,CAAC,CAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAEhD,QAAQ,CAAC,GAAG,EAAE;QACZ,GAAG,EAAE,OAAO,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,CAAC,CAAC,GAAG,OAAO,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5B,QAAQ,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClC,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;QACtE,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;QAC7C,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;KACvE,CAAC;gBAEmB,OAAO,EAAE,OAAO,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM;IA2B1E,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAI5B,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GACY,CAAC;IAG/B,MAAM,CAAC,IAAI,EAAE,MAAM;IAInB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAIlC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,YAAY;IAMvC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY;IAMvC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY;IAMvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAM;IAMvC,WAAW,CAAC,QAAQ,EAAE,QAAQ;IAI9B,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,YAAY;CAWhD"}
@@ -0,0 +1,95 @@
1
+ import { renderToString } from "hono/jsx/dom/server";
2
+ function applyResponseDefaults(base, init) {
3
+ const headers = new Headers(base.headers);
4
+ if (init?.headers) {
5
+ new Headers(init.headers).forEach((value, key) => {
6
+ headers.set(key, value);
7
+ });
8
+ }
9
+ return {
10
+ status: init?.status ?? base.status,
11
+ headers,
12
+ };
13
+ }
14
+ export class Context {
15
+ request;
16
+ url;
17
+ var = new Map();
18
+ res = {
19
+ headers: new Headers(),
20
+ status: undefined,
21
+ };
22
+ renderer;
23
+ params;
24
+ req;
25
+ constructor(request, params = {}) {
26
+ this.request = request;
27
+ this.url = new URL(request.url);
28
+ this.params = params;
29
+ this.req = {
30
+ raw: request,
31
+ url: request.url,
32
+ json: () => request.json(),
33
+ text: () => request.text(),
34
+ formData: () => request.formData(),
35
+ param: (name) => {
36
+ if (!name) {
37
+ return { ...this.params };
38
+ }
39
+ return this.params[name];
40
+ },
41
+ header: (name) => request.headers.get(name) ?? undefined,
42
+ query: (name) => {
43
+ if (!name) {
44
+ return Object.fromEntries(this.url.searchParams.entries());
45
+ }
46
+ return this.url.searchParams.get(name) ?? undefined;
47
+ },
48
+ };
49
+ }
50
+ set(key, value) {
51
+ this.var.set(key, value);
52
+ }
53
+ get(key) {
54
+ return this.var.get(key);
55
+ }
56
+ status(code) {
57
+ this.res.status = code;
58
+ }
59
+ header(name, value) {
60
+ this.res.headers.set(name, value);
61
+ }
62
+ json(data, init) {
63
+ const responseInit = applyResponseDefaults(this.res, init);
64
+ responseInit.headers.set("Content-Type", "application/json; charset=UTF-8");
65
+ return new Response(JSON.stringify(data), responseInit);
66
+ }
67
+ text(value, init) {
68
+ const responseInit = applyResponseDefaults(this.res, init);
69
+ responseInit.headers.set("Content-Type", "text/plain; charset=UTF-8");
70
+ return new Response(value, responseInit);
71
+ }
72
+ html(value, init) {
73
+ const responseInit = applyResponseDefaults(this.res, init);
74
+ responseInit.headers.set("Content-Type", "text/html; charset=UTF-8");
75
+ return new Response(value, responseInit);
76
+ }
77
+ redirect(location, status = 302) {
78
+ const responseInit = applyResponseDefaults(this.res, { status });
79
+ responseInit.headers.set("Location", location);
80
+ return new Response(null, responseInit);
81
+ }
82
+ setRenderer(renderer) {
83
+ this.renderer = renderer;
84
+ }
85
+ render(content, init) {
86
+ if (this.renderer) {
87
+ return this.renderer(content, this, init);
88
+ }
89
+ if (typeof content === "string") {
90
+ return this.html(content, init);
91
+ }
92
+ return this.html(renderToString(content), init);
93
+ }
94
+ }
95
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,8 +1,6 @@
1
- import { startServer, type TreesapConfig } from './server.js';
2
- export { startServer, type TreesapConfig };
3
- export { default as Layout } from './layouts/Layout.js';
4
- export { default as NotFoundLayout } from './layouts/NotFoundLayout.js';
5
- export { Welcome } from './pages/Welcome.js';
6
- export { Code } from './pages/Code.js';
7
- export { DevServerManager } from './services/dev-server.js';
1
+ export { Context, type Renderable } from "./context.ts";
2
+ export { createApp, createRouter, type CreateAppOptions, type Handler, type Next, type HandlerResult, ServerApp, } from "./app.ts";
3
+ export { cors } from "./middleware/cors.ts";
4
+ export { serveStatic } from "./middleware/serve-static.ts";
5
+ export { serve, sendNodeResponse, toWebRequest } from "./node.ts";
8
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAG9D,OAAO,EAAE,WAAW,EAAE,KAAK,aAAa,EAAE,CAAC;AAG3C,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAEvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EACL,SAAS,EACT,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,OAAO,EACZ,KAAK,IAAI,EACT,KAAK,aAAa,EAClB,SAAS,GACV,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC"}
package/dist/index.js CHANGED
@@ -1,10 +1,6 @@
1
- import { startServer } from './server.js';
2
- // Re-export everything that might be needed by consumers
3
- export { startServer };
4
- // Export components and layouts for library usage
5
- export { default as Layout } from './layouts/Layout.js';
6
- export { default as NotFoundLayout } from './layouts/NotFoundLayout.js';
7
- export { Welcome } from './pages/Welcome.js';
8
- export { Code } from './pages/Code.js';
9
- export { DevServerManager } from './services/dev-server.js';
1
+ export { Context } from "./context.js";
2
+ export { createApp, createRouter, ServerApp, } from "./app.js";
3
+ export { cors } from "./middleware/cors.js";
4
+ export { serveStatic } from "./middleware/serve-static.js";
5
+ export { serve, sendNodeResponse, toWebRequest } from "./node.js";
10
6
  //# sourceMappingURL=index.js.map