@elysiajs/eden 0.3.0-beta.1 → 0.3.0-beta.2
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/dist/index.mjs +26 -23
- package/dist/types.d.ts +29 -41
- package/package.json +1 -1
- package/src/index.ts +2 -3
- package/src/types.ts +40 -59
package/dist/index.mjs
CHANGED
|
@@ -105,32 +105,35 @@ class S {
|
|
|
105
105
|
return this.ws.close(), this;
|
|
106
106
|
}
|
|
107
107
|
}
|
|
108
|
-
const w = (i, t, e) =>
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
case "toJSON":
|
|
108
|
+
const w = (i, t, e) => (
|
|
109
|
+
// @ts-ignore
|
|
110
|
+
new Proxy((...s) => {
|
|
111
|
+
}, {
|
|
112
|
+
get(s, o, n) {
|
|
113
|
+
return w(i, [...t, o], e);
|
|
114
|
+
},
|
|
115
|
+
apply(s, o, n) {
|
|
116
|
+
const r = n[0];
|
|
117
|
+
if (t.length === 1) {
|
|
118
|
+
if (t[0] in Object.prototype || t[0] in Promise.prototype)
|
|
120
119
|
return s(n);
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
120
|
+
switch (t[0]) {
|
|
121
|
+
case "toJSON":
|
|
122
|
+
return s(n);
|
|
123
|
+
case "$set":
|
|
124
|
+
return e.setConfig(r);
|
|
125
|
+
case "$clone":
|
|
126
|
+
return w(i, [], e.clone(r));
|
|
127
|
+
}
|
|
125
128
|
}
|
|
129
|
+
return e.run(t, n).then((a) => {
|
|
130
|
+
if (a instanceof Error)
|
|
131
|
+
throw a;
|
|
132
|
+
return a;
|
|
133
|
+
});
|
|
126
134
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
throw a;
|
|
130
|
-
return a;
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
}), j = (i, t = "", e) => new Proxy(() => {
|
|
135
|
+
})
|
|
136
|
+
), j = (i, t = "", e) => new Proxy(() => {
|
|
134
137
|
}, {
|
|
135
138
|
get(s, o, n) {
|
|
136
139
|
return j(i, `${t}/${o.toString()}`, e);
|
package/dist/types.d.ts
CHANGED
|
@@ -1,22 +1,24 @@
|
|
|
1
1
|
/// <reference types="bun-types" />
|
|
2
|
-
import type { Elysia, SCHEMA,
|
|
2
|
+
import type { Elysia, SCHEMA, IsPathParameter, EXPOSED, AnyTypedSchema } from 'elysia';
|
|
3
3
|
import type { EdenWS } from '.';
|
|
4
4
|
import { type EdenFetchError } from './utils';
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
export type IsAny<T> = 0 extends 1 & T ? true : false;
|
|
6
|
+
export type IsUnknown<T> = IsAny<T> extends true ? false : unknown extends T ? true : false;
|
|
7
|
+
type Promisify<T extends (...args: any[]) => any> = T extends (...args: infer Args) => infer Return ? Return extends Promise<any> ? T : (...args: Args) => Promise<Return> : never;
|
|
8
|
+
type Asynctify<T> = T extends infer Fn extends (...args: any) => any ? Promisify<Fn> : T extends Record<string, any> ? {
|
|
7
9
|
[K in keyof T]: EdenFn<T[K]>;
|
|
8
10
|
} : never;
|
|
9
|
-
|
|
11
|
+
type EdenFn<T> = T extends {
|
|
10
12
|
[EXPOSED]: any;
|
|
11
13
|
value: infer Value;
|
|
12
14
|
} ? Asynctify<Value> : Asynctify<T>;
|
|
13
|
-
|
|
15
|
+
type CreateEdenFn<Exposed extends Record<string, any>> = EdenFn<Exposed> & {
|
|
14
16
|
$set(config: EdenConfig): void;
|
|
15
17
|
$clone(config?: EdenConfig): CreateEdenFn<Exposed>;
|
|
16
18
|
};
|
|
17
|
-
export
|
|
18
|
-
[key in typeof SCHEMA]: infer Schema extends Record<string, Record<string,
|
|
19
|
-
} ? UnionToIntersection<CreateEden<Schema
|
|
19
|
+
export type Eden<App extends Elysia<any>> = App['meta'] extends {
|
|
20
|
+
[key in typeof SCHEMA]: infer Schema extends Record<string, Record<string, AnyTypedSchema>>;
|
|
21
|
+
} ? UnionToIntersection<CreateEden<Schema, Exclude<keyof Schema, number | symbol>>> & {
|
|
20
22
|
$fn: CreateEdenFn<App['meta'][typeof EXPOSED]>;
|
|
21
23
|
} : 'Please install Elysia before using Eden';
|
|
22
24
|
export interface EdenCall {
|
|
@@ -24,61 +26,47 @@ export interface EdenCall {
|
|
|
24
26
|
$fetch?: RequestInit;
|
|
25
27
|
$query?: Record<string, string | boolean | number>;
|
|
26
28
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
[
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
$body: Route['body'];
|
|
33
|
-
} : {}) & (Route['query'] extends NonNullable<Route['query']> ? unknown extends Route['query'] ? {} : {
|
|
34
|
-
$query: Route['query'];
|
|
35
|
-
} : {});
|
|
36
|
-
export declare type CreateEden<Server extends Record<string, Record<string, TypedRoute>>, Path extends string = keyof Server extends string ? keyof Server : never, Full extends string = ''> = Path extends `/${infer Start}` ? CreateEden<Server, Start, Path> : Path extends `${infer A}/${infer B}` ? IsPathParameter<A> extends never ? {
|
|
29
|
+
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
|
|
30
|
+
export type MergeUnionObjects<T> = {} & {
|
|
31
|
+
[P in keyof T]: T[P];
|
|
32
|
+
};
|
|
33
|
+
export type CreateEden<Server extends Record<string, Record<string, AnyTypedSchema>>, Path extends string, Full extends string = ''> = Path extends `/${infer Start}` ? CreateEden<Server, Start, Path> : Path extends `${infer A}/${infer B}` ? IsPathParameter<A> extends never ? {
|
|
37
34
|
[key in A]: CreateEden<Server, B, Full>;
|
|
38
|
-
} : Record<string, CreateEden<Server, B, Full>> & Record<`$${A}`, `Expected path parameters ':${A}', replace this with any string`> :
|
|
39
|
-
{
|
|
40
|
-
|
|
41
|
-
[key in keyof Server[Full] extends string ? Lowercase<keyof Server[Full]> : keyof Server[Full]]: [
|
|
42
|
-
Server[Full][key extends string ? Uppercase<key> : key]
|
|
43
|
-
] extends [infer Route extends TypedRoute] ? undefined extends Route['body'] ? (params?: {
|
|
35
|
+
} : Record<string, CreateEden<Server, B, Full>> & Record<`$${A}`, `Expected path parameters ':${A}', replace this with any string`> : {
|
|
36
|
+
[key in Path extends '' ? 'index' : Path | CamelCase<Path>]: Full extends keyof Server ? {
|
|
37
|
+
[key in keyof Server[Full] extends string ? Lowercase<keyof Server[Full]> : keyof Server[Full]]: Server[Full][key extends string ? Uppercase<key> : key] extends infer Route extends AnyTypedSchema ? IsUnknown<Route['body']> extends true ? (params?: {
|
|
44
38
|
$query?: EdenCall['$query'];
|
|
45
39
|
$fetch?: EdenCall['$fetch'];
|
|
46
40
|
}) => Promise<Route['response'] extends {
|
|
47
41
|
200: infer ReturnedType;
|
|
48
|
-
} ? ReturnedType | MapError<Route['response']> : unknown> : (params:
|
|
42
|
+
} ? ReturnedType | MapError<Route['response']> : unknown> : (params: MergeUnionObjects<Route['body'] & {
|
|
49
43
|
$query?: EdenCall['$query'];
|
|
50
44
|
$fetch?: EdenCall['$fetch'];
|
|
51
45
|
}>) => Promise<Route['response'] extends {
|
|
52
46
|
200: infer ReturnedType;
|
|
53
|
-
} ? ReturnedType | MapError<Route['response']> : unknown> : key extends 'subscribe' ? [
|
|
54
|
-
Server[Full][key],
|
|
55
|
-
Server[Full][key]['query']
|
|
56
|
-
] extends [
|
|
57
|
-
infer Route extends TypedRoute,
|
|
58
|
-
infer Query extends TypedRoute['query']
|
|
59
|
-
] ? unknown extends NonNullable<Query> ? (params?: {
|
|
47
|
+
} ? ReturnedType | MapError<Route['response']> : unknown> : key extends 'subscribe' ? Server[Full][key] extends infer Route extends AnyTypedSchema ? IsUnknown<Route['query']> extends true ? (params?: {
|
|
60
48
|
$query?: EdenCall['$query'];
|
|
61
|
-
}) => EdenWS<Route> :
|
|
62
|
-
$query:
|
|
49
|
+
}) => EdenWS<Route> : Route['query'] extends NonNullable<Route['query']> ? (params: {
|
|
50
|
+
$query: Route['query'];
|
|
63
51
|
}) => EdenWS<Route> : (params?: {
|
|
64
52
|
$query?: EdenCall['$query'];
|
|
65
53
|
}) => EdenWS<Route> : never : never;
|
|
66
54
|
} : never;
|
|
67
|
-
}
|
|
68
|
-
|
|
55
|
+
};
|
|
56
|
+
type CamelCase<S extends string> = S extends `${infer P1}-${infer P2}${infer P3}` ? `${Lowercase<P1>}${Uppercase<P2>}${CamelCase<P3>}` : Lowercase<S>;
|
|
69
57
|
export interface EdenWSOnMessage<Data = unknown> extends MessageEvent {
|
|
70
58
|
data: Data;
|
|
71
59
|
rawData: MessageEvent['data'];
|
|
72
60
|
}
|
|
73
|
-
export
|
|
61
|
+
export type EdenWSEvent<K extends keyof WebSocketEventMap, Data = unknown> = K extends 'message' ? EdenWSOnMessage<Data> : WebSocketEventMap[K];
|
|
74
62
|
export interface EdenConfig {
|
|
75
63
|
fn?: string;
|
|
76
64
|
fetch?: Omit<RequestInit, 'body'>;
|
|
77
65
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
66
|
+
type Enumerate<N extends number, Acc extends number[] = []> = Acc['length'] extends N ? Acc[number] : Enumerate<N, [...Acc, Acc['length']]>;
|
|
67
|
+
type Range<F extends number, T extends number> = Exclude<Enumerate<T>, Enumerate<F>>;
|
|
68
|
+
type ErrorRange = Range<300, 599>;
|
|
69
|
+
type MapError<T extends Record<number, unknown>> = [
|
|
82
70
|
{
|
|
83
71
|
[K in keyof T]-?: K extends ErrorRange ? K : never;
|
|
84
72
|
}[keyof T]
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
import type { Elysia, TypedSchema
|
|
1
|
+
import type { Elysia, TypedSchema } from 'elysia'
|
|
2
2
|
|
|
3
3
|
import type {
|
|
4
4
|
CreateEden,
|
|
5
5
|
Eden,
|
|
6
6
|
EdenCall,
|
|
7
7
|
EdenConfig,
|
|
8
|
-
EdenWSEvent
|
|
9
|
-
UnionToIntersection
|
|
8
|
+
EdenWSEvent
|
|
10
9
|
} from './types'
|
|
11
10
|
import { composePath, EdenFetchError, Signal } from './utils'
|
|
12
11
|
|
package/src/types.ts
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
import type {
|
|
2
2
|
Elysia,
|
|
3
3
|
SCHEMA,
|
|
4
|
-
TypedRoute,
|
|
5
4
|
IsPathParameter,
|
|
6
|
-
EXPOSED
|
|
5
|
+
EXPOSED,
|
|
6
|
+
AnyTypedSchema
|
|
7
7
|
} from 'elysia'
|
|
8
|
-
import type { TObject } from '@sinclair/typebox'
|
|
9
8
|
|
|
10
9
|
import type { EdenWS } from '.'
|
|
11
|
-
import { type EdenFetchError
|
|
10
|
+
import { type EdenFetchError } from './utils'
|
|
12
11
|
|
|
13
|
-
type IsAny<T> =
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
12
|
+
export type IsAny<T> = 0 extends 1 & T ? true : false
|
|
13
|
+
|
|
14
|
+
export type IsUnknown<T> = IsAny<T> extends true
|
|
15
|
+
? false
|
|
16
|
+
: unknown extends T
|
|
17
|
+
? true
|
|
17
18
|
: false
|
|
18
19
|
|
|
19
20
|
type Promisify<T extends (...args: any[]) => any> = T extends (
|
|
@@ -47,10 +48,12 @@ type CreateEdenFn<Exposed extends Record<string, any>> = EdenFn<Exposed> & {
|
|
|
47
48
|
export type Eden<App extends Elysia<any>> = App['meta'] extends {
|
|
48
49
|
[key in typeof SCHEMA]: infer Schema extends Record<
|
|
49
50
|
string,
|
|
50
|
-
Record<string,
|
|
51
|
+
Record<string, AnyTypedSchema>
|
|
51
52
|
>
|
|
52
53
|
}
|
|
53
|
-
? UnionToIntersection<
|
|
54
|
+
? UnionToIntersection<
|
|
55
|
+
CreateEden<Schema, Exclude<keyof Schema, number | symbol>>
|
|
56
|
+
> & {
|
|
54
57
|
$fn: CreateEdenFn<App['meta'][typeof EXPOSED]>
|
|
55
58
|
}
|
|
56
59
|
: 'Please install Elysia before using Eden'
|
|
@@ -61,37 +64,18 @@ export interface EdenCall {
|
|
|
61
64
|
$query?: Record<string, string | boolean | number>
|
|
62
65
|
}
|
|
63
66
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
)
|
|
67
|
+
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (
|
|
68
|
+
k: infer I
|
|
69
|
+
) => void
|
|
67
70
|
? I
|
|
68
71
|
: never
|
|
69
72
|
|
|
70
|
-
|
|
71
|
-
type Prettify<T> = {
|
|
72
|
-
[K in keyof T]: T[K]
|
|
73
|
-
} & {}
|
|
74
|
-
|
|
75
|
-
type TypedRouteToParams<Route extends TypedRoute> =
|
|
76
|
-
(Route['body'] extends NonNullable<Route['body']>
|
|
77
|
-
? Route['body'] extends Record<any, any>
|
|
78
|
-
? Route['body']
|
|
79
|
-
: {
|
|
80
|
-
$body: Route['body']
|
|
81
|
-
}
|
|
82
|
-
: {}) &
|
|
83
|
-
(Route['query'] extends NonNullable<Route['query']>
|
|
84
|
-
? unknown extends Route['query']
|
|
85
|
-
? {}
|
|
86
|
-
: {
|
|
87
|
-
$query: Route['query']
|
|
88
|
-
}
|
|
89
|
-
: {})
|
|
73
|
+
export type MergeUnionObjects<T> = {} & { [P in keyof T]: T[P] }
|
|
90
74
|
|
|
91
75
|
export type CreateEden<
|
|
92
|
-
Server extends Record<string, Record<string,
|
|
76
|
+
Server extends Record<string, Record<string, AnyTypedSchema>>,
|
|
93
77
|
// pathnames are always string
|
|
94
|
-
Path extends string
|
|
78
|
+
Path extends string,
|
|
95
79
|
Full extends string = ''
|
|
96
80
|
> = Path extends `/${infer Start}`
|
|
97
81
|
? CreateEden<Server, Start, Path>
|
|
@@ -111,17 +95,15 @@ export type CreateEden<
|
|
|
111
95
|
[key in Path extends ''
|
|
112
96
|
? // If end with empty, then return as index
|
|
113
97
|
'index'
|
|
114
|
-
: Path extends `:${infer params}`
|
|
115
|
-
? string
|
|
116
98
|
: Path | CamelCase<Path>]: Full extends keyof Server
|
|
117
99
|
? {
|
|
118
100
|
// Check if is method
|
|
119
101
|
[key in keyof Server[Full] extends string
|
|
120
102
|
? Lowercase<keyof Server[Full]>
|
|
121
|
-
: keyof Server[Full]]: [
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
?
|
|
103
|
+
: keyof Server[Full]]: Server[Full][key extends string
|
|
104
|
+
? Uppercase<key>
|
|
105
|
+
: key] extends infer Route extends AnyTypedSchema
|
|
106
|
+
? IsUnknown<Route['body']> extends true
|
|
125
107
|
? (params?: {
|
|
126
108
|
$query?: EdenCall['$query']
|
|
127
109
|
$fetch?: EdenCall['$fetch']
|
|
@@ -135,8 +117,8 @@ export type CreateEden<
|
|
|
135
117
|
: unknown
|
|
136
118
|
>
|
|
137
119
|
: (
|
|
138
|
-
params:
|
|
139
|
-
|
|
120
|
+
params: MergeUnionObjects<
|
|
121
|
+
Route['body'] & {
|
|
140
122
|
$query?: EdenCall['$query']
|
|
141
123
|
$fetch?: EdenCall['$fetch']
|
|
142
124
|
}
|
|
@@ -152,19 +134,17 @@ export type CreateEden<
|
|
|
152
134
|
>
|
|
153
135
|
: key extends 'subscribe'
|
|
154
136
|
? // Since subscribe key is only a lower letter
|
|
155
|
-
[
|
|
156
|
-
|
|
157
|
-
Server[Full][key]['query']
|
|
158
|
-
] extends [
|
|
159
|
-
infer Route extends TypedRoute,
|
|
160
|
-
infer Query extends TypedRoute['query']
|
|
161
|
-
]
|
|
162
|
-
? unknown extends NonNullable<Query>
|
|
137
|
+
Server[Full][key] extends infer Route extends AnyTypedSchema
|
|
138
|
+
? IsUnknown<Route['query']> extends true
|
|
163
139
|
? (params?: {
|
|
164
140
|
$query?: EdenCall['$query']
|
|
165
141
|
}) => EdenWS<Route>
|
|
166
|
-
:
|
|
167
|
-
|
|
142
|
+
: Route['query'] extends NonNullable<
|
|
143
|
+
Route['query']
|
|
144
|
+
>
|
|
145
|
+
? (params: {
|
|
146
|
+
$query: Route['query']
|
|
147
|
+
}) => EdenWS<Route>
|
|
168
148
|
: (params?: {
|
|
169
149
|
$query?: EdenCall['$query']
|
|
170
150
|
}) => EdenWS<Route>
|
|
@@ -172,12 +152,13 @@ export type CreateEden<
|
|
|
172
152
|
: never
|
|
173
153
|
}
|
|
174
154
|
: never
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
155
|
+
}
|
|
156
|
+
// & (Path extends `:${infer params}`
|
|
157
|
+
// ? Record<
|
|
158
|
+
// `$${params}`,
|
|
159
|
+
// `Expected path parameters ':${params}', replace this with any string`
|
|
160
|
+
// >
|
|
161
|
+
// : {})
|
|
181
162
|
|
|
182
163
|
// https://stackoverflow.com/questions/59623524/typescript-how-to-map-type-keys-to-camelcase
|
|
183
164
|
type CamelCase<S extends string> =
|