@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 CHANGED
@@ -105,32 +105,35 @@ class S {
105
105
  return this.ws.close(), this;
106
106
  }
107
107
  }
108
- const w = (i, t, e) => new Proxy((...s) => {
109
- }, {
110
- get(s, o, n) {
111
- return w(i, [...t, o], e);
112
- },
113
- apply(s, o, n) {
114
- const r = n[0];
115
- if (t.length === 1) {
116
- if (t[0] in Object.prototype || t[0] in Promise.prototype)
117
- return s(n);
118
- switch (t[0]) {
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
- case "$set":
122
- return e.setConfig(r);
123
- case "$clone":
124
- return w(i, [], e.clone(r));
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
- return e.run(t, n).then((a) => {
128
- if (a instanceof Error)
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, TypedRoute, IsPathParameter, EXPOSED } from 'elysia';
2
+ import type { Elysia, SCHEMA, IsPathParameter, EXPOSED, AnyTypedSchema } from 'elysia';
3
3
  import type { EdenWS } from '.';
4
4
  import { type EdenFetchError } from './utils';
5
- declare type Promisify<T extends (...args: any[]) => any> = T extends (...args: infer Args) => infer Return ? Return extends Promise<any> ? T : (...args: Args) => Promise<Return> : never;
6
- declare type Asynctify<T> = T extends infer Fn extends (...args: any) => any ? Promisify<Fn> : T extends Record<string, any> ? {
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
- declare type EdenFn<T> = T extends {
11
+ type EdenFn<T> = T extends {
10
12
  [EXPOSED]: any;
11
13
  value: infer Value;
12
14
  } ? Asynctify<Value> : Asynctify<T>;
13
- declare type CreateEdenFn<Exposed extends Record<string, any>> = EdenFn<Exposed> & {
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 declare type Eden<App extends Elysia<any>> = App['meta'] extends {
18
- [key in typeof SCHEMA]: infer Schema extends Record<string, Record<string, TypedRoute>>;
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
- export declare type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
28
- declare type Prettify<T> = {
29
- [K in keyof T]: T[K];
30
- } & {};
31
- declare type TypedRouteToParams<Route extends TypedRoute> = (Route['body'] extends NonNullable<Route['body']> ? Route['body'] extends Record<any, any> ? Route['body'] : {
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`> : // Iterate until last string then catch method
39
- {
40
- [key in Path extends '' ? 'index' : Path extends `:${infer params}` ? string : Path | CamelCase<Path>]: Full extends keyof Server ? {
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: Prettify<TypedRouteToParams<Route> & {
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> : Query extends NonNullable<Query> ? (params: {
62
- $query: 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
- } & (Path extends `:${infer params}` ? Record<`$${params}`, `Expected path parameters ':${params}', replace this with any string`> : {});
68
- declare type CamelCase<S extends string> = S extends `${infer P1}-${infer P2}${infer P3}` ? `${Lowercase<P1>}${Uppercase<P2>}${CamelCase<P3>}` : Lowercase<S>;
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 declare type EdenWSEvent<K extends keyof WebSocketEventMap, Data = unknown> = K extends 'message' ? EdenWSOnMessage<Data> : WebSocketEventMap[K];
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
- declare type Enumerate<N extends number, Acc extends number[] = []> = Acc['length'] extends N ? Acc[number] : Enumerate<N, [...Acc, Acc['length']]>;
79
- declare type Range<F extends number, T extends number> = Exclude<Enumerate<T>, Enumerate<F>>;
80
- declare type ErrorRange = Range<300, 599>;
81
- declare type MapError<T extends Record<number, unknown>> = [
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elysiajs/eden",
3
- "version": "0.3.0-beta.1",
3
+ "version": "0.3.0-beta.2",
4
4
  "description": "Fully type-safe Elysia client",
5
5
  "author": {
6
6
  "name": "saltyAom",
package/src/index.ts CHANGED
@@ -1,12 +1,11 @@
1
- import type { Elysia, TypedSchema, HTTPMethod } from 'elysia'
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, type Signal } from './utils'
10
+ import { type EdenFetchError } from './utils'
12
11
 
13
- type IsAny<T> = unknown extends T
14
- ? [T] extends [object]
15
- ? true
16
- : false
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, TypedRoute>
51
+ Record<string, AnyTypedSchema>
51
52
  >
52
53
  }
53
- ? UnionToIntersection<CreateEden<Schema>> & {
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
- export type UnionToIntersection<U> = (
65
- U extends any ? (k: U) => void : never
66
- ) extends (k: infer I) => void
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
- // https://twitter.com/mattpocockuk/status/1622730173446557697?s=20
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, TypedRoute>>,
76
+ Server extends Record<string, Record<string, AnyTypedSchema>>,
93
77
  // pathnames are always string
94
- Path extends string = keyof Server extends string ? keyof Server : never,
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
- Server[Full][key extends string ? Uppercase<key> : key]
123
- ] extends [infer Route extends TypedRoute]
124
- ? undefined extends Route['body']
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: Prettify<
139
- TypedRouteToParams<Route> & {
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
- Server[Full][key],
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
- : Query extends NonNullable<Query>
167
- ? (params: { $query: Query }) => EdenWS<Route>
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
- } & (Path extends `:${infer params}`
176
- ? Record<
177
- `$${params}`,
178
- `Expected path parameters ':${params}', replace this with any string`
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> =