@ereo/server 0.1.6
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.
- package/README.md +76 -0
- package/dist/bun-server.d.ts +177 -0
- package/dist/bun-server.d.ts.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1080 -0
- package/dist/middleware.d.ts +98 -0
- package/dist/middleware.d.ts.map +1 -0
- package/dist/static.d.ts +39 -0
- package/dist/static.d.ts.map +1 -0
- package/dist/streaming.d.ts +88 -0
- package/dist/streaming.d.ts.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @ereo/server - Middleware Chain
|
|
3
|
+
*
|
|
4
|
+
* Hono-inspired middleware system for request processing.
|
|
5
|
+
* Uses Web Standards throughout.
|
|
6
|
+
*
|
|
7
|
+
* NOTE: This module uses `MiddlewareHandler` from `@ereo/core` as the base type.
|
|
8
|
+
* The handler signature is: (request: Request, context: AppContext, next: NextFunction) => Response | Promise<Response>
|
|
9
|
+
*
|
|
10
|
+
* For typed middleware with context type safety, use `TypedMiddlewareHandler` from `@ereo/router`.
|
|
11
|
+
* TypedMiddlewareHandler is fully compatible with MiddlewareHandler.
|
|
12
|
+
*/
|
|
13
|
+
import type { MiddlewareHandler, AppContext } from '@ereo/core';
|
|
14
|
+
/**
|
|
15
|
+
* Middleware definition with optional path matching.
|
|
16
|
+
*
|
|
17
|
+
* This interface uses `MiddlewareHandler` from `@ereo/core`, ensuring
|
|
18
|
+
* compatibility across all EreoJS packages. The handler signature is:
|
|
19
|
+
* `(request: Request, context: AppContext, next: NextFunction) => Response | Promise<Response>`
|
|
20
|
+
*
|
|
21
|
+
* Note: The `path` property here supports both single strings and arrays,
|
|
22
|
+
* similar to the `paths` property in `@ereo/core`'s `Middleware` interface.
|
|
23
|
+
*/
|
|
24
|
+
export interface MiddlewareDefinition {
|
|
25
|
+
/** Optional path patterns to match. Supports wildcards like '/api/*'. */
|
|
26
|
+
path?: string | string[];
|
|
27
|
+
/** The middleware handler function. Uses the core MiddlewareHandler type. */
|
|
28
|
+
handler: MiddlewareHandler;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Middleware chain executor.
|
|
32
|
+
*/
|
|
33
|
+
export declare class MiddlewareChain {
|
|
34
|
+
private middlewares;
|
|
35
|
+
/**
|
|
36
|
+
* Add middleware to the chain.
|
|
37
|
+
*/
|
|
38
|
+
use(handler: MiddlewareHandler): this;
|
|
39
|
+
use(path: string, handler: MiddlewareHandler): this;
|
|
40
|
+
/**
|
|
41
|
+
* Execute middleware chain.
|
|
42
|
+
*
|
|
43
|
+
* @param request - The incoming Request object
|
|
44
|
+
* @param context - The application context (AppContext). Note: RequestContext implements AppContext.
|
|
45
|
+
* @param final - The final handler to call when the chain completes
|
|
46
|
+
* @returns The response from the middleware chain
|
|
47
|
+
*/
|
|
48
|
+
execute(request: Request, context: AppContext, final: () => Promise<Response>): Promise<Response>;
|
|
49
|
+
/**
|
|
50
|
+
* Simple path matching (supports * wildcard).
|
|
51
|
+
*/
|
|
52
|
+
private matchPath;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Create a middleware chain.
|
|
56
|
+
*/
|
|
57
|
+
export declare function createMiddlewareChain(): MiddlewareChain;
|
|
58
|
+
/**
|
|
59
|
+
* Logging middleware.
|
|
60
|
+
*/
|
|
61
|
+
export declare function logger(): MiddlewareHandler;
|
|
62
|
+
/**
|
|
63
|
+
* CORS middleware.
|
|
64
|
+
*/
|
|
65
|
+
export interface CorsOptions {
|
|
66
|
+
origin?: string | string[] | ((origin: string) => boolean);
|
|
67
|
+
methods?: string[];
|
|
68
|
+
allowedHeaders?: string[];
|
|
69
|
+
exposedHeaders?: string[];
|
|
70
|
+
credentials?: boolean;
|
|
71
|
+
maxAge?: number;
|
|
72
|
+
}
|
|
73
|
+
export declare function cors(options?: CorsOptions): MiddlewareHandler;
|
|
74
|
+
/**
|
|
75
|
+
* Security headers middleware.
|
|
76
|
+
*/
|
|
77
|
+
export interface SecurityHeadersOptions {
|
|
78
|
+
contentSecurityPolicy?: string | false;
|
|
79
|
+
xFrameOptions?: 'DENY' | 'SAMEORIGIN' | false;
|
|
80
|
+
xContentTypeOptions?: boolean;
|
|
81
|
+
referrerPolicy?: string | false;
|
|
82
|
+
permissionsPolicy?: string | false;
|
|
83
|
+
}
|
|
84
|
+
export declare function securityHeaders(options?: SecurityHeadersOptions): MiddlewareHandler;
|
|
85
|
+
/**
|
|
86
|
+
* Compression middleware (uses Bun's built-in compression).
|
|
87
|
+
*/
|
|
88
|
+
export declare function compress(): MiddlewareHandler;
|
|
89
|
+
/**
|
|
90
|
+
* Rate limiting middleware.
|
|
91
|
+
*/
|
|
92
|
+
export interface RateLimitOptions {
|
|
93
|
+
windowMs?: number;
|
|
94
|
+
max?: number;
|
|
95
|
+
keyGenerator?: (request: Request) => string;
|
|
96
|
+
}
|
|
97
|
+
export declare function rateLimit(options?: RateLimitOptions): MiddlewareHandler;
|
|
98
|
+
//# sourceMappingURL=middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAgB,UAAU,EAAE,MAAM,YAAY,CAAC;AAG9E;;;;;;;;;GASG;AACH,MAAM,WAAW,oBAAoB;IACnC,yEAAyE;IACzE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACzB,6EAA6E;IAC7E,OAAO,EAAE,iBAAiB,CAAC;CAC5B;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAA8B;IAEjD;;OAEG;IACH,GAAG,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IACrC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAUnD;;;;;;;OAOG;IACG,OAAO,CACX,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,GAC7B,OAAO,CAAC,QAAQ,CAAC;IAwBpB;;OAEG;IACH,OAAO,CAAC,SAAS;CAQlB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,eAAe,CAEvD;AAMD;;GAEG;AACH,wBAAgB,MAAM,IAAI,iBAAiB,CAc1C;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;IAC3D,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,IAAI,CAAC,OAAO,GAAE,WAAgB,GAAG,iBAAiB,CAyDjE;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,qBAAqB,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACvC,aAAa,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,KAAK,CAAC;IAC9C,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAChC,iBAAiB,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CACpC;AAED,wBAAgB,eAAe,CAAC,OAAO,GAAE,sBAA2B,GAAG,iBAAiB,CAmCvF;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,iBAAiB,CA6B5C;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC;CAC7C;AAED,wBAAgB,SAAS,CAAC,OAAO,GAAE,gBAAqB,GAAG,iBAAiB,CAuD3E"}
|
package/dist/static.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @ereo/server - Static File Serving
|
|
3
|
+
*
|
|
4
|
+
* Efficient static file serving with caching support.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Get MIME type for a file extension.
|
|
8
|
+
*/
|
|
9
|
+
export declare function getMimeType(filepath: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* Static file serving options.
|
|
12
|
+
*/
|
|
13
|
+
export interface StaticOptions {
|
|
14
|
+
/** Root directory for static files */
|
|
15
|
+
root: string;
|
|
16
|
+
/** URL prefix (default: '/') */
|
|
17
|
+
prefix?: string;
|
|
18
|
+
/** Max age for cache-control (seconds, default: 0 in dev, 31536000 in prod) */
|
|
19
|
+
maxAge?: number;
|
|
20
|
+
/** Enable immutable caching for fingerprinted files */
|
|
21
|
+
immutable?: boolean;
|
|
22
|
+
/** Index file (default: 'index.html') */
|
|
23
|
+
index?: string;
|
|
24
|
+
/** Enable directory listing (default: false) */
|
|
25
|
+
listing?: boolean;
|
|
26
|
+
/** Fallback file for SPA routing */
|
|
27
|
+
fallback?: string;
|
|
28
|
+
/** Enable format negotiation for images based on Accept header */
|
|
29
|
+
negotiateImageFormat?: boolean;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Create a static file handler.
|
|
33
|
+
*/
|
|
34
|
+
export declare function serveStatic(options: StaticOptions): (request: Request) => Promise<Response | null>;
|
|
35
|
+
/**
|
|
36
|
+
* Middleware version of static file serving.
|
|
37
|
+
*/
|
|
38
|
+
export declare function staticMiddleware(options: StaticOptions): (request: Request, context: any, next: () => Promise<Response>) => Promise<Response>;
|
|
39
|
+
//# sourceMappingURL=static.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static.d.ts","sourceRoot":"","sources":["../src/static.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAuCH;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAwDD;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CA6IlG;AA6CD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,IAGvC,SAAS,OAAO,EAAE,SAAS,GAAG,EAAE,MAAM,MAAM,OAAO,CAAC,QAAQ,CAAC,uBAK5E"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @ereo/server - React Streaming Support
|
|
3
|
+
*
|
|
4
|
+
* Server-side rendering with streaming support for React 18+.
|
|
5
|
+
*/
|
|
6
|
+
import type { ReactElement } from 'react';
|
|
7
|
+
import type { RouteMatch, AppContext } from '@ereo/core';
|
|
8
|
+
/**
|
|
9
|
+
* Render options.
|
|
10
|
+
*/
|
|
11
|
+
export interface RenderOptions {
|
|
12
|
+
/** Route match */
|
|
13
|
+
match: RouteMatch;
|
|
14
|
+
/** Request context */
|
|
15
|
+
context: AppContext;
|
|
16
|
+
/** Shell template */
|
|
17
|
+
shell?: ShellTemplate;
|
|
18
|
+
/** Enable streaming */
|
|
19
|
+
streaming?: boolean;
|
|
20
|
+
/** Bootstrap scripts */
|
|
21
|
+
scripts?: string[];
|
|
22
|
+
/** Stylesheets */
|
|
23
|
+
styles?: string[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Shell template for HTML document.
|
|
27
|
+
*/
|
|
28
|
+
export interface ShellTemplate {
|
|
29
|
+
/** Document title */
|
|
30
|
+
title?: string;
|
|
31
|
+
/** Meta tags */
|
|
32
|
+
meta?: Array<{
|
|
33
|
+
name?: string;
|
|
34
|
+
property?: string;
|
|
35
|
+
content: string;
|
|
36
|
+
}>;
|
|
37
|
+
/** Head content */
|
|
38
|
+
head?: string;
|
|
39
|
+
/** Body attributes */
|
|
40
|
+
bodyAttrs?: Record<string, string>;
|
|
41
|
+
/** HTML attributes */
|
|
42
|
+
htmlAttrs?: Record<string, string>;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Render result.
|
|
46
|
+
*/
|
|
47
|
+
export interface RenderResult {
|
|
48
|
+
/** HTML content or stream */
|
|
49
|
+
body: string | ReadableStream<Uint8Array>;
|
|
50
|
+
/** Response headers */
|
|
51
|
+
headers: Headers;
|
|
52
|
+
/** Status code */
|
|
53
|
+
status: number;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Create the HTML shell wrapper.
|
|
57
|
+
*/
|
|
58
|
+
export declare function createShell(options: {
|
|
59
|
+
shell?: ShellTemplate;
|
|
60
|
+
scripts?: string[];
|
|
61
|
+
styles?: string[];
|
|
62
|
+
loaderData?: unknown;
|
|
63
|
+
}): {
|
|
64
|
+
head: string;
|
|
65
|
+
tail: string;
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Render a route to a streaming response.
|
|
69
|
+
* Uses renderToPipeableStream for Node.js/Bun environments.
|
|
70
|
+
*/
|
|
71
|
+
export declare function renderToStream(element: ReactElement, options: RenderOptions): Promise<RenderResult>;
|
|
72
|
+
/**
|
|
73
|
+
* Render a route to a string (non-streaming).
|
|
74
|
+
*/
|
|
75
|
+
export declare function renderToString(element: ReactElement, options: RenderOptions): Promise<RenderResult>;
|
|
76
|
+
/**
|
|
77
|
+
* Create a Response from render result.
|
|
78
|
+
*/
|
|
79
|
+
export declare function createResponse(result: RenderResult): Response;
|
|
80
|
+
/**
|
|
81
|
+
* Stream helper for sending chunks with delays (Suspense boundaries).
|
|
82
|
+
*/
|
|
83
|
+
export declare function createSuspenseStream(): {
|
|
84
|
+
stream: ReadableStream<Uint8Array>;
|
|
85
|
+
push: (chunk: string) => void;
|
|
86
|
+
close: () => void;
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=streaming.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../src/streaming.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,KAAK,EAAS,UAAU,EAAE,UAAU,EAAkB,MAAM,YAAY,CAAC;AAGhF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,kBAAkB;IAClB,KAAK,EAAE,UAAU,CAAC;IAClB,sBAAsB;IACtB,OAAO,EAAE,UAAU,CAAC;IACpB,qBAAqB;IACrB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,uBAAuB;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wBAAwB;IACxB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,kBAAkB;IAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,qBAAqB;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB;IAChB,IAAI,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpE,mBAAmB;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,sBAAsB;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,6BAA6B;IAC7B,IAAI,EAAE,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAC1C,uBAAuB;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,kBAAkB;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE;IACnC,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAkDjC;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,CAAC,CAmEvB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,CAAC,CA2BvB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,QAAQ,CAK7D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI;IACtC,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IACnC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB,CAmBA"}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ereo/server",
|
|
3
|
+
"version": "0.1.6",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"author": "Ereo Team",
|
|
6
|
+
"homepage": "https://ereo.dev",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/ereojs/ereo.git",
|
|
10
|
+
"directory": "packages/server"
|
|
11
|
+
},
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/ereojs/ereo/issues"
|
|
14
|
+
},
|
|
15
|
+
"type": "module",
|
|
16
|
+
"main": "./dist/index.js",
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"exports": {
|
|
19
|
+
".": {
|
|
20
|
+
"types": "./dist/index.d.ts",
|
|
21
|
+
"import": "./dist/index.js"
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"files": [
|
|
25
|
+
"dist"
|
|
26
|
+
],
|
|
27
|
+
"scripts": {
|
|
28
|
+
"build": "bun build ./src/index.ts --outdir ./dist --target bun --external @ereo/core --external @ereo/router --external @ereo/data --external react --external react-dom && bun run build:types",
|
|
29
|
+
"build:types": "tsc --emitDeclarationOnly --outDir dist",
|
|
30
|
+
"dev": "bun build ./src/index.ts --outdir ./dist --target bun --watch",
|
|
31
|
+
"test": "bun test",
|
|
32
|
+
"typecheck": "tsc --noEmit"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@ereo/core": "workspace:*",
|
|
36
|
+
"@ereo/router": "workspace:*",
|
|
37
|
+
"@ereo/data": "workspace:*"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@types/bun": "^1.1.0",
|
|
41
|
+
"@types/react": "^18.2.0",
|
|
42
|
+
"@types/react-dom": "^18.2.0",
|
|
43
|
+
"typescript": "^5.4.0"
|
|
44
|
+
},
|
|
45
|
+
"peerDependencies": {
|
|
46
|
+
"react": "^18.0.0",
|
|
47
|
+
"react-dom": "^18.0.0"
|
|
48
|
+
}
|
|
49
|
+
}
|