@teyik0/furin 0.1.0-alpha.3

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 (71) hide show
  1. package/dist/adapter/bun.d.ts +3 -0
  2. package/dist/build/client.d.ts +14 -0
  3. package/dist/build/compile-entry.d.ts +22 -0
  4. package/dist/build/entry-template.d.ts +13 -0
  5. package/dist/build/hydrate.d.ts +20 -0
  6. package/dist/build/index.d.ts +7 -0
  7. package/dist/build/index.js +2212 -0
  8. package/dist/build/route-types.d.ts +20 -0
  9. package/dist/build/scan-server.d.ts +8 -0
  10. package/dist/build/server-routes-entry.d.ts +22 -0
  11. package/dist/build/shared.d.ts +12 -0
  12. package/dist/build/types.d.ts +53 -0
  13. package/dist/cli/config.d.ts +9 -0
  14. package/dist/cli/index.d.ts +1 -0
  15. package/dist/cli/index.js +2240 -0
  16. package/dist/client.d.ts +158 -0
  17. package/dist/client.js +20 -0
  18. package/dist/config.d.ts +16 -0
  19. package/dist/config.js +23 -0
  20. package/dist/furin.d.ts +45 -0
  21. package/dist/furin.js +937 -0
  22. package/dist/internal.d.ts +18 -0
  23. package/dist/link.d.ts +119 -0
  24. package/dist/link.js +281 -0
  25. package/dist/plugin/index.d.ts +20 -0
  26. package/dist/plugin/index.js +1408 -0
  27. package/dist/plugin/transform-client.d.ts +9 -0
  28. package/dist/render/assemble.d.ts +13 -0
  29. package/dist/render/cache.d.ts +7 -0
  30. package/dist/render/element.d.ts +4 -0
  31. package/dist/render/index.d.ts +26 -0
  32. package/dist/render/loaders.d.ts +12 -0
  33. package/dist/render/shell.d.ts +17 -0
  34. package/dist/render/template.d.ts +4 -0
  35. package/dist/router.d.ts +32 -0
  36. package/dist/router.js +575 -0
  37. package/dist/runtime-env.d.ts +3 -0
  38. package/dist/tsconfig.dts.tsbuildinfo +1 -0
  39. package/dist/utils.d.ts +6 -0
  40. package/package.json +74 -0
  41. package/src/adapter/README.md +13 -0
  42. package/src/adapter/bun.ts +119 -0
  43. package/src/build/client.ts +110 -0
  44. package/src/build/compile-entry.ts +99 -0
  45. package/src/build/entry-template.ts +62 -0
  46. package/src/build/hydrate.ts +106 -0
  47. package/src/build/index.ts +120 -0
  48. package/src/build/route-types.ts +88 -0
  49. package/src/build/scan-server.ts +88 -0
  50. package/src/build/server-routes-entry.ts +38 -0
  51. package/src/build/shared.ts +80 -0
  52. package/src/build/types.ts +60 -0
  53. package/src/cli/config.ts +68 -0
  54. package/src/cli/index.ts +106 -0
  55. package/src/client.ts +237 -0
  56. package/src/config.ts +31 -0
  57. package/src/furin.ts +251 -0
  58. package/src/internal.ts +36 -0
  59. package/src/link.tsx +480 -0
  60. package/src/plugin/index.ts +80 -0
  61. package/src/plugin/transform-client.ts +372 -0
  62. package/src/render/assemble.ts +57 -0
  63. package/src/render/cache.ts +9 -0
  64. package/src/render/element.tsx +28 -0
  65. package/src/render/index.ts +312 -0
  66. package/src/render/loaders.ts +67 -0
  67. package/src/render/shell.ts +128 -0
  68. package/src/render/template.ts +54 -0
  69. package/src/router.ts +234 -0
  70. package/src/runtime-env.ts +6 -0
  71. package/src/utils.ts +68 -0
@@ -0,0 +1,158 @@
1
+ import type { Cookie, StatusMap } from "elysia";
2
+ import type { AnySchema, HTTPHeaders, UnwrapSchema } from "elysia/types";
3
+ declare const UNSET: unique symbol;
4
+ type Unset = typeof UNSET;
5
+ type ResolvedSchema<T> = [T] extends [Unset] ? Unset : T extends AnySchema ? UnwrapSchema<T> : Unset;
6
+ type MergeSchema<TParent, TOwn> = [TParent] extends [Unset] ? TOwn : [TOwn] extends [Unset] ? TParent : TParent & TOwn;
7
+ type NormalizeUnset<T> = [T] extends [Unset] ? {} : T;
8
+ export interface RouteContext<TParams = {}, TQuery = {}> {
9
+ cookie: Record<string, Cookie<unknown>>;
10
+ headers: Record<string, string | undefined>;
11
+ params: NormalizeUnset<TParams>;
12
+ path: string;
13
+ query: NormalizeUnset<TQuery>;
14
+ redirect: (url: string, status?: 301 | 302 | 303 | 307 | 308) => Response;
15
+ request: Request;
16
+ set: {
17
+ headers: HTTPHeaders;
18
+ status?: number | keyof StatusMap;
19
+ };
20
+ }
21
+ export interface ComponentProps<TParams = {}, TQuery = {}> {
22
+ params: NormalizeUnset<TParams>;
23
+ path: string;
24
+ query: NormalizeUnset<TQuery>;
25
+ }
26
+ type ResolveParent<T> = T extends RouteRef<infer D, infer P, infer Q> ? {
27
+ data: D;
28
+ params: P;
29
+ query: Q;
30
+ } : {
31
+ data: {};
32
+ params: Unset;
33
+ query: Unset;
34
+ };
35
+ interface Resolved<TParentRef, TLoaderData, TParamsSchema = Unset, TQuerySchema = Unset> {
36
+ data: ResolveParent<TParentRef>["data"] & TLoaderData;
37
+ params: MergeSchema<ResolveParent<TParentRef>["params"], ResolvedSchema<TParamsSchema>>;
38
+ query: MergeSchema<ResolveParent<TParentRef>["query"], ResolvedSchema<TQuerySchema>>;
39
+ }
40
+ export type MetaDescriptor = {
41
+ charSet: "utf-8";
42
+ } | {
43
+ title: string;
44
+ } | {
45
+ name: string;
46
+ content: string;
47
+ } | {
48
+ property: string;
49
+ content: string;
50
+ } | {
51
+ httpEquiv: string;
52
+ content: string;
53
+ } | {
54
+ "script:ld+json": object;
55
+ } | {
56
+ tagName: "meta" | "link";
57
+ [name: string]: string | undefined;
58
+ };
59
+ export interface HeadOptions {
60
+ links?: Array<{
61
+ rel: string;
62
+ href: string;
63
+ [key: string]: string;
64
+ }>;
65
+ meta?: MetaDescriptor[];
66
+ scripts?: Array<{
67
+ src?: string;
68
+ type?: string;
69
+ children?: string;
70
+ [key: string]: string | undefined;
71
+ }>;
72
+ styles?: Array<{
73
+ type?: string;
74
+ children: string;
75
+ }>;
76
+ }
77
+ export type LoaderDeps = (route: {
78
+ __type: string;
79
+ }) => Promise<Record<string, unknown>>;
80
+ export interface PageConfig<TParentData extends Record<string, unknown>, TParams, TQuery, TPageLoaderData extends Record<string, unknown> = {}> {
81
+ component: React.FC<TParentData & TPageLoaderData & ComponentProps<TParams, TQuery>>;
82
+ head?: (ctx: ComponentProps<TParams, TQuery> & TParentData & TPageLoaderData) => HeadOptions;
83
+ loader?: (ctx: RouteContext<TParams, TQuery> & TParentData, deps: TypedDeps) => Promise<TPageLoaderData> | TPageLoaderData;
84
+ staticParams?: () => Promise<NormalizeUnset<TParams>[]> | NormalizeUnset<TParams>[];
85
+ }
86
+ export interface RuntimeRoute {
87
+ __type: "FURIN_ROUTE";
88
+ layout?: React.FC<Record<string, unknown> & {
89
+ children: React.ReactNode;
90
+ }>;
91
+ loader?(ctx: Record<string, unknown>, deps: LoaderDeps): Promise<Record<string, unknown>> | Record<string, unknown>;
92
+ mode?: "ssr" | "ssg" | "isr";
93
+ params?: unknown;
94
+ parent?: RuntimeRoute;
95
+ query?: unknown;
96
+ revalidate?: number;
97
+ }
98
+ export interface RuntimePage {
99
+ __type: "FURIN_PAGE";
100
+ _route: RuntimeRoute;
101
+ component: React.FC<Record<string, unknown>>;
102
+ head?(ctx: Record<string, unknown>): HeadOptions;
103
+ loader?(ctx: Record<string, unknown>, deps: LoaderDeps): Promise<Record<string, unknown>> | Record<string, unknown>;
104
+ staticParams?(): Promise<Record<string, string>[]> | Record<string, string>[];
105
+ }
106
+ export interface RouteRef<TData extends Record<string, unknown> = Record<string, unknown>, TParams = unknown, TQuery = unknown> {
107
+ readonly __brand: "FURIN_ROUTE_REF";
108
+ readonly __phantom: {
109
+ data: TData;
110
+ params: TParams;
111
+ query: TQuery;
112
+ };
113
+ }
114
+ interface PageResult<TData extends Record<string, unknown>, TParams, TQuery, TPageLoaderData extends Record<string, unknown>> {
115
+ __type: "FURIN_PAGE";
116
+ _route: Route<TData, TParams, TQuery>;
117
+ component: React.FC<TData & TPageLoaderData & ComponentProps<TParams, TQuery>>;
118
+ head?: (ctx: ComponentProps<TParams, TQuery> & TData & TPageLoaderData) => HeadOptions;
119
+ loader?: (ctx: RouteContext<TParams, TQuery> & TData, deps: TypedDeps) => Promise<TPageLoaderData> | TPageLoaderData;
120
+ }
121
+ export interface Route<TParentData extends Record<string, unknown>, TParams, TQuery> {
122
+ __type: "FURIN_ROUTE";
123
+ layout?: React.FC<TParentData & {
124
+ children: React.ReactNode;
125
+ } & ComponentProps<TParams, TQuery>>;
126
+ loader?(ctx: RouteContext<TParams, TQuery> & TParentData, deps: TypedDeps): Promise<TParentData> | TParentData;
127
+ mode?: "ssr" | "ssg" | "isr";
128
+ page<TPageLoaderData extends Record<string, unknown> = {}>(config: PageConfig<TParentData, TParams, TQuery, TPageLoaderData>): PageResult<TParentData, TParams, TQuery, TPageLoaderData>;
129
+ params?: unknown;
130
+ parent?: RuntimeRoute;
131
+ query?: unknown;
132
+ /** Branded ref for type inference when used as a parent. */
133
+ ref: RouteRef<TParentData, TParams, TQuery>;
134
+ revalidate?: number;
135
+ }
136
+ type TypedDeps = <TData extends Record<string, unknown>>(route: Route<TData, any, any>) => Promise<TData>;
137
+ export declare function createRoute<TParentRef extends RouteRef | undefined = undefined, TParamsSchema extends AnySchema | Unset = Unset, TQuerySchema extends AnySchema | Unset = Unset, TLoaderData extends Record<string, unknown> = {}>(config?: {
138
+ parent?: {
139
+ ref: TParentRef;
140
+ } & {
141
+ __type: "FURIN_ROUTE";
142
+ };
143
+ mode?: "ssr" | "ssg" | "isr";
144
+ revalidate?: number;
145
+ params?: TParamsSchema;
146
+ query?: TQuerySchema;
147
+ loader?: (ctx: RouteContext<Resolved<TParentRef, TLoaderData, TParamsSchema, TQuerySchema>["params"], Resolved<TParentRef, TLoaderData, TParamsSchema, TQuerySchema>["query"]> & ResolveParent<TParentRef>["data"], deps: TypedDeps) => Promise<TLoaderData> | TLoaderData;
148
+ layout?: React.FC<Resolved<TParentRef, TLoaderData, TParamsSchema, TQuerySchema>["data"] & {
149
+ children: React.ReactNode;
150
+ } & ComponentProps<Resolved<TParentRef, TLoaderData, TParamsSchema, TQuerySchema>["params"], Resolved<TParentRef, TLoaderData, TParamsSchema, TQuerySchema>["query"]>>;
151
+ }): Route<Resolved<TParentRef, TLoaderData, TParamsSchema, TQuerySchema>["data"], Resolved<TParentRef, TLoaderData, TParamsSchema, TQuerySchema>["params"], Resolved<TParentRef, TLoaderData, TParamsSchema, TQuerySchema>["query"]>;
152
+ export type InferProps<T> = T extends {
153
+ __type: "ELYRA_PAGE";
154
+ component: React.FC<infer P>;
155
+ } ? P : T extends Route<infer D, infer P, infer Q> ? D & {
156
+ children: React.ReactNode;
157
+ } & ComponentProps<P, Q> : never;
158
+ export {};
package/dist/client.js ADDED
@@ -0,0 +1,20 @@
1
+ // @bun
2
+ // src/client.ts
3
+ function createRoute(config) {
4
+ const route = {
5
+ ...config,
6
+ __type: "FURIN_ROUTE",
7
+ ref: {},
8
+ page(pageConfig) {
9
+ return {
10
+ ...pageConfig,
11
+ __type: "FURIN_PAGE",
12
+ _route: route
13
+ };
14
+ }
15
+ };
16
+ return route;
17
+ }
18
+ export {
19
+ createRoute
20
+ };
@@ -0,0 +1,16 @@
1
+ export type { BunPlugin } from "bun";
2
+ export declare const BUILD_TARGETS: readonly ["bun", "node", "vercel", "cloudflare"];
3
+ export type BuildTarget = (typeof BUILD_TARGETS)[number];
4
+ export declare const configSchema: import("@sinclair/typebox").TObject<{
5
+ rootDir: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
6
+ pagesDir: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
7
+ serverEntry: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
8
+ targets: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<"bun" | "node" | "vercel" | "cloudflare">[]>>>;
9
+ bun: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
10
+ compile: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"server">, import("@sinclair/typebox").TLiteral<"embed">]>>;
11
+ }>>;
12
+ }>;
13
+ export type FurinConfig = (typeof configSchema)["static"] & {
14
+ plugins?: Bun.BunPlugin[];
15
+ };
16
+ export declare function defineConfig(config: FurinConfig): FurinConfig;
package/dist/config.js ADDED
@@ -0,0 +1,23 @@
1
+ // @bun
2
+ // src/config.ts
3
+ import { t } from "elysia";
4
+ var BUILD_TARGETS = ["bun", "node", "vercel", "cloudflare"];
5
+ var buildTargetSchema = t.Union(BUILD_TARGETS.map((v) => t.Literal(v)));
6
+ var compileTargetSchema = t.Union([t.Literal("server"), t.Literal("embed")]);
7
+ var configSchema = t.Object({
8
+ rootDir: t.Optional(t.String()),
9
+ pagesDir: t.Optional(t.String()),
10
+ serverEntry: t.Optional(t.String()),
11
+ targets: t.Optional(t.Array(buildTargetSchema)),
12
+ bun: t.Optional(t.Object({
13
+ compile: t.Optional(compileTargetSchema)
14
+ }))
15
+ });
16
+ function defineConfig(config) {
17
+ return config;
18
+ }
19
+ export {
20
+ defineConfig,
21
+ configSchema,
22
+ BUILD_TARGETS
23
+ };
@@ -0,0 +1,45 @@
1
+ import { Elysia } from "elysia";
2
+ /**
3
+ * Main Furin plugin.
4
+ *
5
+ * Returns a standalone Elysia instance (async function) so that routes are
6
+ * properly registered in Elysia's router for SPA navigation to work.
7
+ *
8
+ * ## Usage
9
+ *
10
+ * ```ts
11
+ * new Elysia()
12
+ * .use(await furin({ ... }))
13
+ * .listen(3000)
14
+ * ```
15
+ */
16
+ export declare function furin({ pagesDir }: {
17
+ pagesDir?: string;
18
+ }): Promise<Elysia<"", {
19
+ decorator: {};
20
+ store: {};
21
+ derive: {};
22
+ resolve: {};
23
+ }, {
24
+ typebox: {};
25
+ error: {};
26
+ }, {
27
+ schema: {};
28
+ standaloneSchema: {};
29
+ macro: {};
30
+ macroFn: {};
31
+ parser: {};
32
+ response: {};
33
+ }, {}, {
34
+ derive: {};
35
+ resolve: {};
36
+ schema: {};
37
+ standaloneSchema: {};
38
+ response: {};
39
+ }, {
40
+ derive: {};
41
+ resolve: {};
42
+ schema: {};
43
+ standaloneSchema: {};
44
+ response: {};
45
+ }>>;