@elysiajs/eden 0.2.0-rc.0 → 0.2.0-rc.1

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 CHANGED
@@ -33,13 +33,13 @@ import type { App } from './server'
33
33
  const client = eden<App>('http://localhost:8080')
34
34
 
35
35
  // return: Hi Elysia (fully type-safe)
36
- client.index.GET().then(console.log)
36
+ client.index.get().then(console.log)
37
37
 
38
38
  // return: 1895
39
- client.id.1895.GET().then(console.log)
39
+ client.id.1895.get().then(console.log)
40
40
 
41
41
  // return: { id: 1895, name: 'Skadi' }
42
- client.mirror.POST({
42
+ client.mirror.post({
43
43
  id: 1895,
44
44
  name: 'Skadi'
45
45
  }).then(console.log)
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});class d{constructor(e){this.ws=new WebSocket(e),this.url=e}send(e){return Array.isArray(e)?(e.forEach(t=>this.send(t)),this):(this.ws.send(typeof e=="object"?JSON.stringify(e):e.toString()),this)}on(e,t,s){return this.addEventListener(e,t,s)}off(e,t,s){return this.ws.removeEventListener(e,t,s),this}addEventListener(e,t,s){return this.ws.addEventListener(e,i=>{if(e==="message"){let r=i.data.toString();const o=r.charCodeAt(0);if(o===47||o===123)try{r=JSON.parse(r)}catch{}else Number.isNaN(+r)?r==="true"?r=!0:r==="fase"&&(r=!1):r=+r;t({...i,data:r})}else t(i)},s),this}removeEventListener(e,t,s){return this.off(e,t,s),this}close(){return this.ws.close(),this}}const g=n=>n.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`),y=(n,e,t)=>{if(n.endsWith("/")||(n+="/"),e=g(e.replace(/index/g,"")),!t||!Object.keys(t).length)return`${n}${e}`;let s="";for(const[i,r]of Object.entries(t))s+=`${i}=${r}&`;return`${n}${e}?${s.slice(0,-1)}`},h=(n,e="")=>new Proxy(()=>{},{get(t,s,i){return h(n,`${e}/${s.toString()}`)},apply(t,s,[{$query:i,$fetch:r,...o}={$fetch:void 0,$query:void 0}]=[{}]){const u=e.lastIndexOf("/"),l=e.slice(u+1),f=y(n,e.slice(0,u),i);return l==="subscribe"?new d(f.replace(/^([^]+):\/\//,"ws://")):fetch(f,{method:l,headers:{"content-type":"application/json",...r==null?void 0:r.headers},body:Object.keys(o).length?JSON.stringify(o):void 0,...r}).then(async c=>{if(c.status>=300)throw new Error(await c.text());if(c.headers.get("content-type")==="application/json")return c.json();const a=await c.text();return Number.isNaN(+a)?a==="true"?!0:a==="false"?!1:a:+a})}}),v=n=>new Proxy({},{get(e,t,s){return h(n,t)}});exports.EdenWS=d;exports.eden=v;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});class g{constructor(e){this.ws=new WebSocket(e),this.url=e}send(e){return Array.isArray(e)?(e.forEach(t=>this.send(t)),this):(this.ws.send(typeof e=="object"?JSON.stringify(e):e.toString()),this)}on(e,t,s){return this.addEventListener(e,t,s)}off(e,t,s){return this.ws.removeEventListener(e,t,s),this}addEventListener(e,t,s){return this.ws.addEventListener(e,i=>{if(e==="message"){let r=i.data.toString();const l=r.charCodeAt(0);if(l===47||l===123)try{r=JSON.parse(r)}catch{}else Number.isNaN(+r)?r==="true"?r=!0:r==="fase"&&(r=!1):r=+r;t({...i,data:r})}else t(i)},s),this}removeEventListener(e,t,s){return this.off(e,t,s),this}close(){return this.ws.close(),this}}const y=n=>n.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`),w=(n,e,t)=>{if(n.endsWith("/")||(n+="/"),e=y(e.replace(/index/g,"")),!t||!Object.keys(t).length)return`${n}${e}`;let s="";for(const[i,r]of Object.entries(t))s+=`${i}=${r}&`;return`${n}${e}?${s.slice(0,-1)}`},v=(n,e="")=>new Proxy(()=>{},{get(t,s,i){return v(n,`${e}/${s.toString()}`)},apply(t,s,[{$query:i,$fetch:r,$body:l,...u}={$fetch:void 0,$query:void 0,$body:void 0}]=[{}]){const f=e.lastIndexOf("/"),h=e.slice(f+1),d=w(n,e.slice(0,f),i);if(h==="subscribe")return new g(d.replace(/^([^]+):\/\//,"ws://"));const o=l??(Object.keys(u).length?u:void 0);return fetch(d,{method:h,body:JSON.stringify(o),headers:o?{"content-type":typeof u=="object"?"application/json":"text/plain","content-length":o==null?void 0:o.length,...r==null?void 0:r.headers}:void 0,...r}).then(async c=>{if(c.status>=300)throw new Error(await c.text());if(c.headers.get("content-type")==="application/json")return c.json();const a=await c.text();return Number.isNaN(+a)?a==="true"?!0:a==="false"?!1:a:+a})}}),S=n=>new Proxy({},{get(e,t,s){return v(n,t)}});exports.EdenWS=g;exports.eden=S;
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- class d {
1
+ class v {
2
2
  constructor(e) {
3
3
  this.ws = new WebSocket(e), this.url = e;
4
4
  }
@@ -19,8 +19,8 @@ class d {
19
19
  (i) => {
20
20
  if (e === "message") {
21
21
  let r = i.data.toString();
22
- const o = r.charCodeAt(0);
23
- if (o === 47 || o === 123)
22
+ const l = r.charCodeAt(0);
23
+ if (l === 47 || l === 123)
24
24
  try {
25
25
  r = JSON.parse(r);
26
26
  } catch {
@@ -44,32 +44,37 @@ class d {
44
44
  return this.ws.close(), this;
45
45
  }
46
46
  }
47
- const g = (n) => n.replace(/[A-Z]/g, (e) => `-${e.toLowerCase()}`), y = (n, e, t) => {
48
- if (n.endsWith("/") || (n += "/"), e = g(e.replace(/index/g, "")), !t || !Object.keys(t).length)
47
+ const y = (n) => n.replace(/[A-Z]/g, (e) => `-${e.toLowerCase()}`), w = (n, e, t) => {
48
+ if (n.endsWith("/") || (n += "/"), e = y(e.replace(/index/g, "")), !t || !Object.keys(t).length)
49
49
  return `${n}${e}`;
50
50
  let s = "";
51
51
  for (const [i, r] of Object.entries(t))
52
52
  s += `${i}=${r}&`;
53
53
  return `${n}${e}?${s.slice(0, -1)}`;
54
- }, h = (n, e = "") => new Proxy(() => {
54
+ }, d = (n, e = "") => new Proxy(() => {
55
55
  }, {
56
56
  get(t, s, i) {
57
- return h(n, `${e}/${s.toString()}`);
57
+ return d(n, `${e}/${s.toString()}`);
58
58
  },
59
59
  apply(t, s, [
60
- { $query: i, $fetch: r, ...o } = {
60
+ { $query: i, $fetch: r, $body: l, ...u } = {
61
61
  $fetch: void 0,
62
- $query: void 0
62
+ $query: void 0,
63
+ $body: void 0
63
64
  }
64
65
  ] = [{}]) {
65
- const u = e.lastIndexOf("/"), l = e.slice(u + 1), f = y(n, e.slice(0, u), i);
66
- return l === "subscribe" ? new d(f.replace(/^([^]+):\/\//, "ws://")) : fetch(f, {
67
- method: l,
68
- headers: {
69
- "content-type": "application/json",
66
+ const f = e.lastIndexOf("/"), h = e.slice(f + 1), g = w(n, e.slice(0, f), i);
67
+ if (h === "subscribe")
68
+ return new v(g.replace(/^([^]+):\/\//, "ws://"));
69
+ const o = l ?? (Object.keys(u).length ? u : void 0);
70
+ return fetch(g, {
71
+ method: h,
72
+ body: JSON.stringify(o),
73
+ headers: o ? {
74
+ "content-type": typeof u == "object" ? "application/json" : "text/plain",
75
+ "content-length": o == null ? void 0 : o.length,
70
76
  ...r == null ? void 0 : r.headers
71
- },
72
- body: Object.keys(o).length ? JSON.stringify(o) : void 0,
77
+ } : void 0,
73
78
  ...r
74
79
  }).then(async (c) => {
75
80
  if (c.status >= 300)
@@ -80,15 +85,15 @@ const g = (n) => n.replace(/[A-Z]/g, (e) => `-${e.toLowerCase()}`), y = (n, e, t
80
85
  return Number.isNaN(+a) ? a === "true" ? !0 : a === "false" ? !1 : a : +a;
81
86
  });
82
87
  }
83
- }), v = (n) => new Proxy(
88
+ }), p = (n) => new Proxy(
84
89
  {},
85
90
  {
86
91
  get(e, t, s) {
87
- return h(n, t);
92
+ return d(n, t);
88
93
  }
89
94
  }
90
95
  );
91
96
  export {
92
- d as EdenWS,
93
- v as eden
97
+ v as EdenWS,
98
+ p as eden
94
99
  };
package/dist/index.umd.js CHANGED
@@ -1 +1 @@
1
- (function(o,u){typeof exports=="object"&&typeof module<"u"?u(exports):typeof define=="function"&&define.amd?define(["exports"],u):(o=typeof globalThis<"u"?globalThis:o||self,u(o["@elysia/eden"]={}))})(this,function(o){"use strict";class u{constructor(e){this.ws=new WebSocket(e),this.url=e}send(e){return Array.isArray(e)?(e.forEach(t=>this.send(t)),this):(this.ws.send(typeof e=="object"?JSON.stringify(e):e.toString()),this)}on(e,t,n){return this.addEventListener(e,t,n)}off(e,t,n){return this.ws.removeEventListener(e,t,n),this}addEventListener(e,t,n){return this.ws.addEventListener(e,i=>{if(e==="message"){let r=i.data.toString();const c=r.charCodeAt(0);if(c===47||c===123)try{r=JSON.parse(r)}catch{}else Number.isNaN(+r)?r==="true"?r=!0:r==="fase"&&(r=!1):r=+r;t({...i,data:r})}else t(i)},n),this}removeEventListener(e,t,n){return this.off(e,t,n),this}close(){return this.ws.close(),this}}const g=s=>s.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`),v=(s,e,t)=>{if(s.endsWith("/")||(s+="/"),e=g(e.replace(/index/g,"")),!t||!Object.keys(t).length)return`${s}${e}`;let n="";for(const[i,r]of Object.entries(t))n+=`${i}=${r}&`;return`${s}${e}?${n.slice(0,-1)}`},l=(s,e="")=>new Proxy(()=>{},{get(t,n,i){return l(s,`${e}/${n.toString()}`)},apply(t,n,[{$query:i,$fetch:r,...c}={$fetch:void 0,$query:void 0}]=[{}]){const d=e.lastIndexOf("/"),h=e.slice(d+1),y=v(s,e.slice(0,d),i);return h==="subscribe"?new u(y.replace(/^([^]+):\/\//,"ws://")):fetch(y,{method:h,headers:{"content-type":"application/json",...r==null?void 0:r.headers},body:Object.keys(c).length?JSON.stringify(c):void 0,...r}).then(async f=>{if(f.status>=300)throw new Error(await f.text());if(f.headers.get("content-type")==="application/json")return f.json();const a=await f.text();return Number.isNaN(+a)?a==="true"?!0:a==="false"?!1:a:+a})}}),p=s=>new Proxy({},{get(e,t,n){return l(s,t)}});o.EdenWS=u,o.eden=p,Object.defineProperty(o,Symbol.toStringTag,{value:"Module"})});
1
+ (function(o,c){typeof exports=="object"&&typeof module<"u"?c(exports):typeof define=="function"&&define.amd?define(["exports"],c):(o=typeof globalThis<"u"?globalThis:o||self,c(o["@elysia/eden"]={}))})(this,function(o){"use strict";class c{constructor(e){this.ws=new WebSocket(e),this.url=e}send(e){return Array.isArray(e)?(e.forEach(t=>this.send(t)),this):(this.ws.send(typeof e=="object"?JSON.stringify(e):e.toString()),this)}on(e,t,r){return this.addEventListener(e,t,r)}off(e,t,r){return this.ws.removeEventListener(e,t,r),this}addEventListener(e,t,r){return this.ws.addEventListener(e,i=>{if(e==="message"){let n=i.data.toString();const a=n.charCodeAt(0);if(a===47||a===123)try{n=JSON.parse(n)}catch{}else Number.isNaN(+n)?n==="true"?n=!0:n==="fase"&&(n=!1):n=+n;t({...i,data:n})}else t(i)},r),this}removeEventListener(e,t,r){return this.off(e,t,r),this}close(){return this.ws.close(),this}}const p=s=>s.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`),w=(s,e,t)=>{if(s.endsWith("/")||(s+="/"),e=p(e.replace(/index/g,"")),!t||!Object.keys(t).length)return`${s}${e}`;let r="";for(const[i,n]of Object.entries(t))r+=`${i}=${n}&`;return`${s}${e}?${r.slice(0,-1)}`},h=(s,e="")=>new Proxy(()=>{},{get(t,r,i){return h(s,`${e}/${r.toString()}`)},apply(t,r,[{$query:i,$fetch:n,$body:a,...d}={$fetch:void 0,$query:void 0,$body:void 0}]=[{}]){const g=e.lastIndexOf("/"),y=e.slice(g+1),v=w(s,e.slice(0,g),i);if(y==="subscribe")return new c(v.replace(/^([^]+):\/\//,"ws://"));const u=a??(Object.keys(d).length?d:void 0);return fetch(v,{method:y,body:JSON.stringify(u),headers:u?{"content-type":typeof d=="object"?"application/json":"text/plain","content-length":u==null?void 0:u.length,...n==null?void 0:n.headers}:void 0,...n}).then(async f=>{if(f.status>=300)throw new Error(await f.text());if(f.headers.get("content-type")==="application/json")return f.json();const l=await f.text();return Number.isNaN(+l)?l==="true"?!0:l==="false"?!1:l:+l})}}),S=s=>new Proxy({},{get(e,t,r){return h(s,t)}});o.EdenWS=c,o.eden=S,Object.defineProperty(o,Symbol.toStringTag,{value:"Module"})});
package/dist/types.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  /// <reference types="bun-types" />
2
2
  import type { Elysia, SCHEMA, TypedRoute } from 'elysia';
3
- import { EdenWS } from '.';
3
+ import type { IsPathParameter } from 'elysia/dist/types';
4
+ import type { EdenWS } from '.';
4
5
  export declare type Eden<App extends Elysia<any>> = App['store'] extends {
5
6
  [key in typeof SCHEMA]: any;
6
7
  } ? UnionToIntersection<CreateEden<App['store'][typeof SCHEMA]>> : never;
@@ -12,28 +13,34 @@ export interface EdenCall {
12
13
  export declare type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
13
14
  declare type TypedRouteToParams<Route extends TypedRoute> = (Route['body'] extends NonNullable<Route['body']> ? Route['body'] extends Record<any, any> ? Route['body'] : {
14
15
  $body: Route['body'];
15
- } : {}) & (Route['query'] extends NonNullable<Route['query']> ? {
16
+ } : {}) & (Route['query'] extends NonNullable<Route['query']> ? unknown extends Route['query'] ? {} : {
16
17
  $query: Route['query'];
17
18
  } : {});
18
- export declare type CreateEden<Server extends Record<string, Record<string, TypedRoute>>, Path extends string = keyof Server, Full extends string = ''> = Path extends `/${infer Start}` ? CreateEden<Server, Start, Path> : Path extends `${infer A}/${infer B}` ? {
19
+ export declare type CreateEden<Server extends Record<string, Record<string, TypedRoute>>, Path extends string = keyof Server, Full extends string = ''> = Path extends `/${infer Start}` ? CreateEden<Server, Start, Path> : Path extends `${infer A}/${infer B}` ? IsPathParameter<A> extends never ? {
19
20
  [key in A]: CreateEden<Server, B, Full>;
21
+ } : {
22
+ [x: string]: CreateEden<Server, B, Full>;
20
23
  } : {
21
24
  [key in Path extends '' ? 'index' : Path extends `:${infer params}` ? string : Path | CamelCase<Path>]: Full extends keyof Server ? {
22
- [key in keyof Server[Full]]: keyof TypedRouteToParams<Server[Full][key]> extends never ? key extends 'subscribe' ? (params?: Server[Full][key]['query'] extends NonNullable<Server[Full][key]['query']> ? {
25
+ [key in keyof Server[Full] extends string ? Lowercase<keyof Server[Full]> : keyof Server[Full]]: keyof TypedRouteToParams<Server[Full][key extends string ? Uppercase<key> : key]> extends never ? key extends 'subscribe' ? unknown extends NonNullable<Server[Full][key]['query']> ? (params?: {
26
+ $query?: EdenCall['$query'];
27
+ }) => EdenWS<Server[Full][key]> : Server[Full][key]['query'] extends NonNullable<Server[Full][key]['query']> ? (params: {
23
28
  $query: Server[Full][key]['query'];
24
- } : {
29
+ }) => EdenWS<Server[Full][key]> : (params?: {
25
30
  $query?: EdenCall['$query'];
26
31
  }) => EdenWS<Server[Full][key]> : (params?: {
27
32
  $query?: EdenCall['$query'];
28
33
  $fetch?: EdenCall['$fetch'];
29
- }) => Promise<Server[Full][key]['response']> : key extends 'subscribe' ? (params?: Server[Full][key]['query'] extends NonNullable<Server[Full][key]['query']> ? {
34
+ }) => Promise<Server[Full][key]['response']> : key extends 'subscribe' ? unknown extends NonNullable<Server[Full][key]['query']> ? (params?: {
35
+ $query?: EdenCall['$query'];
36
+ }) => EdenWS<Server[Full][key]> : Server[Full][key]['query'] extends NonNullable<Server[Full][key]['query']> ? (params: {
30
37
  $query: Server[Full][key]['query'];
31
- } : {
38
+ }) => EdenWS<Server[Full][key]> : (params?: {
32
39
  $query?: EdenCall['$query'];
33
- }) => EdenWS<Server[Full][key]> : (params: TypedRouteToParams<Server[Full][key]> & {
40
+ }) => EdenWS<Server[Full][key]> : (params: TypedRouteToParams<Server[Full][key extends string ? Uppercase<key> : key]> & {
34
41
  $query?: EdenCall['$query'];
35
42
  $fetch?: EdenCall['$fetch'];
36
- }) => Promise<Server[Full][key]['response']>;
43
+ }) => Promise<Server[Full][key extends string ? Uppercase<key> : key]['response']>;
37
44
  } : never;
38
45
  };
39
46
  declare type CamelCase<S extends string> = S extends `${infer P1}-${infer P2}${infer P3}` ? `${Lowercase<P1>}${Uppercase<P2>}${CamelCase<P3>}` : Lowercase<S>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elysiajs/eden",
3
- "version": "0.2.0-rc.0",
3
+ "version": "0.2.0-rc.1",
4
4
  "description": "Fully type-safe Elysia client",
5
5
  "author": {
6
6
  "name": "saltyAom",
@@ -33,9 +33,8 @@
33
33
  "build": "vite build",
34
34
  "release": "npm run build && npm run test && npm publish --access public"
35
35
  },
36
- "peerDependencies": {
37
- "elysia": ">= 0.1.0-rc.5",
38
- "@elysiajs/websocket": "^0.2.1"
36
+ "dependencies": {
37
+ "elysia": "^0.1.2"
39
38
  },
40
39
  "devDependencies": {
41
40
  "@elysiajs/cors": "^0.1.0",
@@ -43,7 +42,6 @@
43
42
  "@sinclair/typebox": "^0.25.13",
44
43
  "@types/node": "^18.11.7",
45
44
  "bun-types": "^0.3.0",
46
- "elysia": "^0.1.2",
47
45
  "eslint": "^8.26.0",
48
46
  "rimraf": "^3.0.2",
49
47
  "typescript": "^4.8.4",
package/src/index.ts CHANGED
@@ -1,5 +1,4 @@
1
- import type { Elysia, TypedSchema } from 'elysia'
2
- import type { HTTPMethod } from 'elysia'
1
+ import type { Elysia, TypedSchema, HTTPMethod } from 'elysia'
3
2
 
4
3
  import type {
5
4
  CreateEden,
@@ -134,9 +133,10 @@ const createProxy = (
134
133
  target,
135
134
  _,
136
135
  [
137
- { $query, $fetch, ...body } = {
136
+ { $query, $fetch, $body, ...bodyObj } = {
138
137
  $fetch: undefined,
139
- $query: undefined
138
+ $query: undefined,
139
+ $body: undefined
140
140
  }
141
141
  ]: EdenCall[] = [{}]
142
142
  ) {
@@ -147,14 +147,21 @@ const createProxy = (
147
147
  if (method === 'subscribe')
148
148
  return new EdenWS(url.replace(/^([^]+):\/\//, 'ws://'))
149
149
 
150
+ const body =
151
+ $body ?? (Object.keys(bodyObj).length ? bodyObj : undefined)
152
+
150
153
  return fetch(url, {
151
154
  method,
152
- headers: {
153
- 'content-type': 'application/json',
154
- ...$fetch?.['headers']
155
- },
156
- body: Object.keys(body).length
157
- ? JSON.stringify(body)
155
+ body: JSON.stringify(body),
156
+ headers: body
157
+ ? {
158
+ 'content-type':
159
+ typeof bodyObj === 'object'
160
+ ? 'application/json'
161
+ : 'text/plain',
162
+ 'content-length': body?.length,
163
+ ...$fetch?.['headers']
164
+ }
158
165
  : undefined,
159
166
  ...$fetch
160
167
  }).then(async (res) => {
package/src/types.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  import type { Elysia, SCHEMA, TypedRoute } from 'elysia'
2
+ import type { IsPathParameter } from 'elysia/dist/types'
2
3
  import { TObject } from '@sinclair/typebox'
3
- import { EdenWS } from '.'
4
+
5
+ import type { EdenWS } from '.'
4
6
 
5
7
  export type Eden<App extends Elysia<any>> = App['store'] extends {
6
8
  [key in typeof SCHEMA]: any
@@ -29,9 +31,11 @@ type TypedRouteToParams<Route extends TypedRoute> =
29
31
  }
30
32
  : {}) &
31
33
  (Route['query'] extends NonNullable<Route['query']>
32
- ? {
33
- $query: Route['query']
34
- }
34
+ ? unknown extends Route['query']
35
+ ? {}
36
+ : {
37
+ $query: Route['query']
38
+ }
35
39
  : {})
36
40
 
37
41
  export type CreateEden<
@@ -42,9 +46,13 @@ export type CreateEden<
42
46
  > = Path extends `/${infer Start}`
43
47
  ? CreateEden<Server, Start, Path>
44
48
  : Path extends `${infer A}/${infer B}`
45
- ? {
46
- [key in A]: CreateEden<Server, B, Full>
47
- }
49
+ ? IsPathParameter<A> extends never
50
+ ? {
51
+ [key in A]: CreateEden<Server, B, Full>
52
+ }
53
+ : {
54
+ [x: string]: CreateEden<Server, B, Full>
55
+ }
48
56
  : {
49
57
  [key in Path extends ''
50
58
  ? 'index'
@@ -52,43 +60,61 @@ export type CreateEden<
52
60
  ? string
53
61
  : Path | CamelCase<Path>]: Full extends keyof Server
54
62
  ? {
55
- [key in keyof Server[Full]]: keyof TypedRouteToParams<
56
- Server[Full][key]
63
+ [key in keyof Server[Full] extends string
64
+ ? Lowercase<keyof Server[Full]>
65
+ : keyof Server[Full]]: keyof TypedRouteToParams<
66
+ Server[Full][key extends string ? Uppercase<key> : key]
57
67
  > extends never
58
68
  ? key extends 'subscribe'
59
- ? (
60
- params?: Server[Full][key]['query'] extends NonNullable<
69
+ ? unknown extends NonNullable<
70
+ Server[Full][key]['query']
71
+ >
72
+ ? (params?: {
73
+ $query?: EdenCall['$query']
74
+ }) => EdenWS<Server[Full][key]>
75
+ : Server[Full][key]['query'] extends NonNullable<
61
76
  Server[Full][key]['query']
62
77
  >
63
- ? {
64
- $query: Server[Full][key]['query']
65
- }
66
- : {
67
- $query?: EdenCall['$query']
68
- }
69
- ) => EdenWS<Server[Full][key]>
78
+ ? (params: {
79
+ $query: Server[Full][key]['query']
80
+ }) => EdenWS<Server[Full][key]>
81
+ : (params?: {
82
+ $query?: EdenCall['$query']
83
+ }) => EdenWS<Server[Full][key]>
70
84
  : (params?: {
71
85
  $query?: EdenCall['$query']
72
86
  $fetch?: EdenCall['$fetch']
73
87
  }) => Promise<Server[Full][key]['response']>
74
88
  : key extends 'subscribe'
75
- ? (
76
- params?: Server[Full][key]['query'] extends NonNullable<
89
+ ? unknown extends NonNullable<
90
+ Server[Full][key]['query']
91
+ >
92
+ ? (params?: {
93
+ $query?: EdenCall['$query']
94
+ }) => EdenWS<Server[Full][key]>
95
+ : Server[Full][key]['query'] extends NonNullable<
77
96
  Server[Full][key]['query']
78
97
  >
79
- ? {
80
- $query: Server[Full][key]['query']
81
- }
82
- : {
83
- $query?: EdenCall['$query']
84
- }
85
- ) => EdenWS<Server[Full][key]>
98
+ ? (params: {
99
+ $query: Server[Full][key]['query']
100
+ }) => EdenWS<Server[Full][key]>
101
+ : (params?: {
102
+ $query?: EdenCall['$query']
103
+ }) => EdenWS<Server[Full][key]>
86
104
  : (
87
- params: TypedRouteToParams<Server[Full][key]> & {
105
+ params: TypedRouteToParams<
106
+ Server[Full][key extends string
107
+ ? Uppercase<key>
108
+ : key]
109
+ > & {
88
110
  $query?: EdenCall['$query']
89
111
  $fetch?: EdenCall['$fetch']
90
112
  }
91
- ) => Promise<Server[Full][key]['response']>
113
+ ) => Promise<
114
+ Server[Full][key extends string
115
+ ? Uppercase<key>
116
+ : key]['response']
117
+ >
92
118
  }
93
119
  : never
94
120
  }