spiceflow 0.0.7 → 1.0.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.
Files changed (151) hide show
  1. package/README.md +1 -171
  2. package/dist/client/errors.d.ts +7 -0
  3. package/dist/client/errors.d.ts.map +1 -0
  4. package/dist/client/errors.js +18 -0
  5. package/dist/client/errors.js.map +1 -0
  6. package/dist/client/index.d.ts +15 -0
  7. package/dist/client/index.d.ts.map +1 -0
  8. package/dist/client/index.js +376 -0
  9. package/dist/client/index.js.map +1 -0
  10. package/dist/client/types.d.ts +87 -0
  11. package/dist/client/types.d.ts.map +1 -0
  12. package/dist/client/types.js +2 -0
  13. package/dist/client/types.js.map +1 -0
  14. package/dist/client/utils.d.ts +2 -0
  15. package/dist/client/utils.d.ts.map +1 -0
  16. package/dist/client/utils.js +9 -0
  17. package/dist/client/utils.js.map +1 -0
  18. package/dist/client/ws.d.ts +15 -0
  19. package/dist/client/ws.d.ts.map +1 -0
  20. package/dist/client/ws.js +51 -0
  21. package/dist/client/ws.js.map +1 -0
  22. package/dist/client.test.d.ts +2 -0
  23. package/dist/client.test.d.ts.map +1 -0
  24. package/dist/client.test.js +237 -0
  25. package/dist/client.test.js.map +1 -0
  26. package/dist/elysia-fork/context.d.ts +87 -0
  27. package/dist/elysia-fork/context.d.ts.map +1 -0
  28. package/dist/elysia-fork/context.js +2 -0
  29. package/dist/elysia-fork/context.js.map +1 -0
  30. package/dist/elysia-fork/error.d.ts +246 -0
  31. package/dist/elysia-fork/error.d.ts.map +1 -0
  32. package/dist/elysia-fork/error.js +195 -0
  33. package/dist/elysia-fork/error.js.map +1 -0
  34. package/dist/elysia-fork/types.d.ts +570 -0
  35. package/dist/elysia-fork/types.d.ts.map +1 -0
  36. package/dist/elysia-fork/types.js +3 -0
  37. package/dist/elysia-fork/types.js.map +1 -0
  38. package/dist/elysia-fork/utils.d.ts +134 -0
  39. package/dist/elysia-fork/utils.d.ts.map +1 -0
  40. package/dist/elysia-fork/utils.js +70 -0
  41. package/dist/elysia-fork/utils.js.map +1 -0
  42. package/dist/index.d.ts +2 -7
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +1 -22
  45. package/dist/index.js.map +1 -1
  46. package/dist/spiceflow.d.ts +237 -0
  47. package/dist/spiceflow.d.ts.map +1 -0
  48. package/dist/spiceflow.js +484 -0
  49. package/dist/spiceflow.js.map +1 -0
  50. package/dist/spiceflow.test.d.ts +2 -0
  51. package/dist/spiceflow.test.d.ts.map +1 -0
  52. package/dist/spiceflow.test.js +225 -0
  53. package/dist/spiceflow.test.js.map +1 -0
  54. package/dist/stream.test.d.ts +2 -0
  55. package/dist/stream.test.d.ts.map +1 -0
  56. package/dist/stream.test.js +286 -0
  57. package/dist/stream.test.js.map +1 -0
  58. package/dist/types.d.ts +1 -0
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/types.js +2 -0
  61. package/dist/types.js.map +1 -0
  62. package/dist/utils.d.ts +4 -20
  63. package/dist/utils.d.ts.map +1 -1
  64. package/dist/utils.js +17 -46
  65. package/dist/utils.js.map +1 -1
  66. package/package.json +12 -37
  67. package/src/client/errors.ts +21 -0
  68. package/src/client/index.ts +541 -0
  69. package/src/client/types.ts +233 -0
  70. package/src/client/utils.ts +7 -0
  71. package/src/client/ws.ts +99 -0
  72. package/src/client.test.ts +235 -0
  73. package/src/elysia-fork/context.ts +196 -0
  74. package/src/elysia-fork/error.ts +293 -0
  75. package/src/elysia-fork/types.ts +1353 -0
  76. package/src/elysia-fork/utils.ts +85 -0
  77. package/src/index.ts +2 -34
  78. package/src/spiceflow.test.ts +290 -0
  79. package/src/spiceflow.ts +1251 -0
  80. package/src/stream.test.ts +342 -0
  81. package/src/types.ts +0 -0
  82. package/src/utils.ts +21 -70
  83. package/context.d.ts +0 -2
  84. package/context.js +0 -1
  85. package/dist/babel.test.d.ts +0 -2
  86. package/dist/babel.test.d.ts.map +0 -1
  87. package/dist/babel.test.js +0 -27
  88. package/dist/babel.test.js.map +0 -1
  89. package/dist/babelDebugOutputs.d.ts +0 -9
  90. package/dist/babelDebugOutputs.d.ts.map +0 -1
  91. package/dist/babelDebugOutputs.js +0 -34
  92. package/dist/babelDebugOutputs.js.map +0 -1
  93. package/dist/babelTransformRpc.d.ts +0 -19
  94. package/dist/babelTransformRpc.d.ts.map +0 -1
  95. package/dist/babelTransformRpc.js +0 -285
  96. package/dist/babelTransformRpc.js.map +0 -1
  97. package/dist/browser.d.ts +0 -8
  98. package/dist/browser.d.ts.map +0 -1
  99. package/dist/browser.js +0 -126
  100. package/dist/browser.js.map +0 -1
  101. package/dist/build.d.ts +0 -13
  102. package/dist/build.d.ts.map +0 -1
  103. package/dist/build.js +0 -230
  104. package/dist/build.js.map +0 -1
  105. package/dist/cli.d.ts +0 -3
  106. package/dist/cli.d.ts.map +0 -1
  107. package/dist/cli.js +0 -111
  108. package/dist/cli.js.map +0 -1
  109. package/dist/context-internal.d.ts +0 -20
  110. package/dist/context-internal.d.ts.map +0 -1
  111. package/dist/context-internal.js +0 -16
  112. package/dist/context-internal.js.map +0 -1
  113. package/dist/context.d.ts +0 -2
  114. package/dist/context.d.ts.map +0 -1
  115. package/dist/context.js +0 -2
  116. package/dist/context.js.map +0 -1
  117. package/dist/expose.d.ts +0 -6
  118. package/dist/expose.d.ts.map +0 -1
  119. package/dist/expose.js +0 -32
  120. package/dist/expose.js.map +0 -1
  121. package/dist/headers.d.ts +0 -2
  122. package/dist/headers.d.ts.map +0 -1
  123. package/dist/headers.js +0 -18
  124. package/dist/headers.js.map +0 -1
  125. package/dist/jsonRpc.d.ts +0 -32
  126. package/dist/jsonRpc.d.ts.map +0 -1
  127. package/dist/jsonRpc.js +0 -3
  128. package/dist/jsonRpc.js.map +0 -1
  129. package/dist/server.d.ts +0 -32
  130. package/dist/server.d.ts.map +0 -1
  131. package/dist/server.js +0 -292
  132. package/dist/server.js.map +0 -1
  133. package/headers.d.ts +0 -2
  134. package/headers.js +0 -1
  135. package/sdk-template/package.json +0 -22
  136. package/sdk-template/src/index.ts +0 -2
  137. package/sdk-template/src/v1/example.ts +0 -5
  138. package/sdk-template/src/v1/generator.ts +0 -12
  139. package/sdk-template/tsconfig.json +0 -16
  140. package/src/babel.test.ts +0 -35
  141. package/src/babelDebugOutputs.ts +0 -56
  142. package/src/babelTransformRpc.ts +0 -394
  143. package/src/browser.ts +0 -141
  144. package/src/build.ts +0 -298
  145. package/src/cli.ts +0 -132
  146. package/src/context-internal.ts +0 -36
  147. package/src/context.ts +0 -5
  148. package/src/expose.ts +0 -34
  149. package/src/headers.ts +0 -19
  150. package/src/jsonRpc.ts +0 -43
  151. package/src/server.ts +0 -384
@@ -0,0 +1,1353 @@
1
+ // https://github.com/remorses/elysia/blob/main/src/types.ts#L6
2
+
3
+ /* eslint-disable @typescript-eslint/no-unused-vars */
4
+
5
+ import type { BunFile, Serve, Server, WebSocketHandler } from 'bun'
6
+
7
+ import type {
8
+ TSchema,
9
+ TObject,
10
+ Static,
11
+ TAnySchema,
12
+ TNull,
13
+ TUndefined,
14
+ StaticDecode,
15
+ OptionalKind
16
+ } from '@sinclair/typebox'
17
+ import type { TypeCheck, ValueError } from '@sinclair/typebox/compiler'
18
+
19
+ import type { OpenAPIV3 } from 'openapi-types'
20
+
21
+ import type { Context, ErrorContext, PreContext } from './context'
22
+ import {
23
+ ELYSIA_RESPONSE,
24
+ InternalServerError,
25
+ InvalidCookieSignature,
26
+ NotFoundError,
27
+ ParseError,
28
+ ValidationError
29
+ } from './error'
30
+ import { Spiceflow } from '../spiceflow'
31
+
32
+
33
+ export type MaybeArray<T> = T | T[]
34
+ export type MaybePromise<T> = T | Promise<T>
35
+
36
+ export type ObjectValues<T extends object> = T[keyof T]
37
+
38
+ type IsPathParameter<Part extends string> = Part extends `:${infer Parameter}`
39
+ ? Parameter
40
+ : Part extends `*`
41
+ ? '*'
42
+ : never
43
+
44
+ export type GetPathParameter<Path extends string> =
45
+ Path extends `${infer A}/${infer B}`
46
+ ? IsPathParameter<A> | GetPathParameter<B>
47
+ : IsPathParameter<Path>
48
+
49
+ export type ResolvePath<Path extends string> = Prettify<
50
+ {
51
+ [Param in GetPathParameter<Path> as Param extends `${string}?`
52
+ ? never
53
+ : Param]: string
54
+ } & {
55
+ [Param in GetPathParameter<Path> as Param extends `${infer OptionalParam}?`
56
+ ? OptionalParam
57
+ : never]?: string
58
+ }
59
+ >
60
+
61
+ // https://twitter.com/mattpocockuk/status/1622730173446557697?s=20
62
+ export type Prettify<T> = {
63
+ [K in keyof T]: T[K]
64
+ } & {}
65
+
66
+ export type Prettify2<T> = {
67
+ [K in keyof T]: Prettify<T[K]>
68
+ } & {}
69
+
70
+ export type Partial2<T> = {
71
+ [K in keyof T]?: Partial<T[K]>
72
+ }
73
+
74
+ export type NeverKey<T> = {
75
+ [K in keyof T]?: T[K]
76
+ } & {}
77
+
78
+ type IsBothObject<A, B> = A extends Record<string | number | symbol, unknown>
79
+ ? B extends Record<string | number | symbol, unknown>
80
+ ? IsClass<A> extends false
81
+ ? IsClass<B> extends false
82
+ ? true
83
+ : false
84
+ : false
85
+ : false
86
+ : false
87
+
88
+ type IsClass<V> = V extends abstract new (...args: any) => any ? true : false
89
+ type And<A, B> = A extends true ? (B extends true ? true : false) : false
90
+
91
+ export type Reconcile<
92
+ A extends Object,
93
+ B extends Object,
94
+ Override extends boolean = false,
95
+ // Detect Stack limit, eg. circular dependency
96
+ Stack extends number[] = []
97
+ > = Stack['length'] extends 16
98
+ ? A
99
+ : Override extends true
100
+ ? {
101
+ [key in keyof A as key extends keyof B ? never : key]: A[key]
102
+ } extends infer Collision
103
+ ? {} extends Collision
104
+ ? {
105
+ [key in keyof B]: IsBothObject<
106
+ // @ts-ignore trust me bro
107
+ A[key],
108
+ B[key]
109
+ > extends true
110
+ ? Reconcile<
111
+ // @ts-ignore trust me bro
112
+ A[key],
113
+ B[key],
114
+ Override,
115
+ [0, ...Stack]
116
+ >
117
+ : B[key]
118
+ }
119
+ : Prettify<
120
+ Collision & {
121
+ [key in keyof B]: B[key]
122
+ }
123
+ >
124
+ : never
125
+ : {
126
+ [key in keyof B as key extends keyof A ? never : key]: B[key]
127
+ } extends infer Collision
128
+ ? {} extends Collision
129
+ ? {
130
+ [key in keyof A]: IsBothObject<
131
+ A[key],
132
+ // @ts-ignore trust me bro
133
+ B[key]
134
+ > extends true
135
+ ? Reconcile<
136
+ // @ts-ignore trust me bro
137
+ A[key],
138
+ // @ts-ignore trust me bro
139
+ B[key],
140
+ Override,
141
+ [0, ...Stack]
142
+ >
143
+ : A[key]
144
+ }
145
+ : Prettify<
146
+ {
147
+ [key in keyof A]: A[key]
148
+ } & Collision
149
+ >
150
+ : never
151
+
152
+ export interface SingletonBase {
153
+ decorator: Record<string, unknown>
154
+ store: Record<string, unknown>
155
+ derive: Record<string, unknown>
156
+ resolve: Record<string, unknown>
157
+ }
158
+
159
+ export interface EphemeralType {
160
+ derive: SingletonBase['derive']
161
+ resolve: SingletonBase['resolve']
162
+ schema: MetadataBase['schema']
163
+ }
164
+
165
+ export interface DefinitionBase {
166
+ type: Record<string, unknown>
167
+ error: Record<string, Error>
168
+ }
169
+
170
+ export type RouteBase = Record<string, unknown>
171
+
172
+ export interface MetadataBase {
173
+ schema: RouteSchema
174
+ macro: BaseMacro
175
+ macroFn: BaseMacroFn
176
+ }
177
+
178
+ export interface RouteSchema {
179
+ body?: unknown
180
+ headers?: unknown
181
+ query?: unknown
182
+ params?: unknown
183
+ cookie?: unknown
184
+ response?: unknown
185
+ }
186
+
187
+ type OptionalField = {
188
+ [OptionalKind]: 'Optional'
189
+ }
190
+
191
+ export type UnwrapSchema<
192
+ Schema extends TSchema | string | undefined,
193
+ Definitions extends Record<string, unknown> = {}
194
+ > = undefined extends Schema
195
+ ? unknown
196
+ : Schema extends TSchema
197
+ ? Schema extends OptionalField
198
+ ? Prettify<Partial<Static<Schema>>>
199
+ : StaticDecode<Schema>
200
+ : Schema extends string
201
+ ? Definitions extends Record<Schema, infer NamedSchema>
202
+ ? NamedSchema
203
+ : Definitions
204
+ : unknown
205
+
206
+ export type UnwrapBodySchema<
207
+ Schema extends TSchema | string | undefined,
208
+ Definitions extends Record<string, unknown> = {}
209
+ > = undefined extends Schema
210
+ ? unknown
211
+ : Schema extends TSchema
212
+ ? Schema extends OptionalField
213
+ ? Prettify<Partial<Static<Schema>>> | null
214
+ : StaticDecode<Schema>
215
+ : Schema extends string
216
+ ? Definitions extends Record<Schema, infer NamedSchema>
217
+ ? NamedSchema
218
+ : Definitions
219
+ : unknown
220
+
221
+ export interface UnwrapRoute<
222
+ in out Schema extends InputSchema<any>,
223
+ in out Definitions extends DefinitionBase['type'] = {}
224
+ > {
225
+ body: UnwrapBodySchema<Schema['body'], Definitions>
226
+ // headers: UnwrapSchema<Schema['headers'], Definitions>
227
+ // query: UnwrapSchema<Schema['query'], Definitions>
228
+ // params: UnwrapSchema<Schema['params'], Definitions>
229
+ // cookie: UnwrapSchema<Schema['cookie'], Definitions>
230
+ response: Schema['response'] extends TSchema | string
231
+ ? {
232
+ 200: CoExist<
233
+ UnwrapSchema<Schema['response'], Definitions>,
234
+ File,
235
+ BunFile
236
+ >
237
+ }
238
+ : Schema['response'] extends Record<number, TAnySchema | string>
239
+ ? {
240
+ [k in keyof Schema['response']]: CoExist<
241
+ UnwrapSchema<Schema['response'][k], Definitions>,
242
+ File,
243
+ BunFile
244
+ >
245
+ }
246
+ : unknown | void
247
+ }
248
+
249
+ // export interface UnwrapGroupGuardRoute<
250
+ // in out Schema extends InputSchema<any>,
251
+ // in out Definitions extends Record<string, unknown> = {},
252
+ // Path extends string = ''
253
+ // > {
254
+ // body: UnwrapBodySchema<Schema['body'], Definitions>
255
+ // headers: UnwrapSchema<
256
+ // Schema['headers'],
257
+ // Definitions
258
+ // > extends infer A extends Record<string, unknown>
259
+ // ? A
260
+ // : undefined
261
+ // query: UnwrapSchema<
262
+ // Schema['query'],
263
+ // Definitions
264
+ // > extends infer A extends Record<string, unknown>
265
+ // ? A
266
+ // : undefined
267
+ // params: UnwrapSchema<
268
+ // Schema['params'],
269
+ // Definitions
270
+ // > extends infer A extends Record<string, unknown>
271
+ // ? A
272
+ // : Path extends `${string}/${':' | '*'}${string}`
273
+ // ? Record<GetPathParameter<Path>, string>
274
+ // : never
275
+ // cookie: UnwrapSchema<
276
+ // Schema['cookie'],
277
+ // Definitions
278
+ // > extends infer A extends Record<string, unknown>
279
+ // ? A
280
+ // : undefined
281
+ // response: Schema['response'] extends TSchema | string
282
+ // ? UnwrapSchema<Schema['response'], Definitions>
283
+ // : Schema['response'] extends {
284
+ // [k in string]: TSchema | string
285
+ // }
286
+ // ? UnwrapSchema<
287
+ // Schema['response'][keyof Schema['response']],
288
+ // Definitions
289
+ // >
290
+ // : unknown | void
291
+ // }
292
+
293
+ export type HookContainer<T extends Function = Function> = {
294
+ checksum?: number
295
+ scope?: LifeCycleType
296
+ subType?: 'derive' | 'resolve' | 'mapDerive' | 'mapResolve' | (string & {})
297
+ fn: T
298
+ }
299
+
300
+ export interface LifeCycleStore {
301
+ type?: ContentType
302
+ start: HookContainer<GracefulHandler<any>>[]
303
+ request: HookContainer<PreHandler<any, any>>[]
304
+ parse: HookContainer<BodyHandler<any, any>>[]
305
+ transform: HookContainer<TransformHandler<any, any>>[]
306
+ beforeHandle: HookContainer<OptionalHandler<any, any>>[]
307
+ afterHandle: HookContainer<AfterHandler<any, any>>[]
308
+ mapResponse: HookContainer<MapResponse<any, any>>[]
309
+ afterResponse: HookContainer<AfterResponseHandler<any, any>>[]
310
+ // trace: HookContainer<TraceHandler<any, any>>[]
311
+ error: HookContainer<ErrorHandler<any, any, any>>[]
312
+ stop: HookContainer<GracefulHandler<any>>[]
313
+ }
314
+
315
+ export type LifeCycleEvent =
316
+ | 'start'
317
+ | 'request'
318
+ | 'parse'
319
+ | 'transform'
320
+ | 'beforeHandle'
321
+ | 'afterHandle'
322
+ | 'response'
323
+ | 'error'
324
+ | 'stop'
325
+
326
+ export type ContentType = MaybeArray<
327
+ | (string & {})
328
+ | 'none'
329
+ | 'text'
330
+ | 'json'
331
+ | 'formdata'
332
+ | 'urlencoded'
333
+ | 'arrayBuffer'
334
+ | 'text/plain'
335
+ | 'application/json'
336
+ | 'multipart/form-data'
337
+ | 'application/x-www-form-urlencoded'
338
+ >
339
+
340
+ export type HTTPMethod =
341
+ | (string & {})
342
+ | 'ACL'
343
+ | 'BIND'
344
+ | 'CHECKOUT'
345
+ | 'CONNECT'
346
+ | 'COPY'
347
+ | 'DELETE'
348
+ | 'GET'
349
+ | 'HEAD'
350
+ | 'LINK'
351
+ | 'LOCK'
352
+ | 'M-SEARCH'
353
+ | 'MERGE'
354
+ | 'MKACTIVITY'
355
+ | 'MKCALENDAR'
356
+ | 'MKCOL'
357
+ | 'MOVE'
358
+ | 'NOTIFY'
359
+ | 'OPTIONS'
360
+ | 'PATCH'
361
+ | 'POST'
362
+ | 'PROPFIND'
363
+ | 'PROPPATCH'
364
+ | 'PURGE'
365
+ | 'PUT'
366
+ | 'REBIND'
367
+ | 'REPORT'
368
+ | 'SEARCH'
369
+ | 'SOURCE'
370
+ | 'SUBSCRIBE'
371
+ | 'TRACE'
372
+ | 'UNBIND'
373
+ | 'UNLINK'
374
+ | 'UNLOCK'
375
+ | 'UNSUBSCRIBE'
376
+ | 'ALL'
377
+
378
+ export interface InputSchema<Name extends string = string> {
379
+ body?: TSchema | Name
380
+ // headers?: TObject | TNull | TUndefined | Name
381
+ // query?: TObject | TNull | TUndefined | Name
382
+ // params?: TObject | TNull | TUndefined | Name
383
+ // cookie?: TObject | TNull | TUndefined | Name
384
+ response?:
385
+ | TSchema
386
+ | Record<number, TSchema>
387
+ | Name
388
+ | Record<number, Name | TSchema>
389
+ }
390
+
391
+ export interface MergeSchema<
392
+ in out A extends RouteSchema,
393
+ in out B extends RouteSchema
394
+ > {
395
+ body: undefined extends A['body'] ? B['body'] : A['body']
396
+ headers: undefined extends A['headers'] ? B['headers'] : A['headers']
397
+ query: undefined extends A['query'] ? B['query'] : A['query']
398
+ params: undefined extends A['params'] ? B['params'] : A['params']
399
+ cookie: undefined extends A['cookie'] ? B['cookie'] : A['cookie']
400
+ response: {} extends A['response']
401
+ ? {} extends B['response']
402
+ ? {}
403
+ : B['response']
404
+ : {} extends B['response']
405
+ ? A['response']
406
+ : A['response'] & Omit<B['response'], keyof A['response']>
407
+ }
408
+
409
+ export type Handler<
410
+ in out Route extends RouteSchema = {},
411
+ in out Singleton extends SingletonBase = {
412
+ decorator: {}
413
+ store: {}
414
+ derive: {}
415
+ resolve: {}
416
+ },
417
+ Path extends string = ''
418
+ > = (
419
+ context: Context<Route, Singleton, Path>
420
+ ) => MaybePromise<
421
+ {} extends Route['response']
422
+ ? unknown
423
+ : Route['response'][keyof Route['response']]
424
+ >
425
+
426
+ export type Replace<Original, Target, With> = IsAny<Target> extends true
427
+ ? Original
428
+ : Original extends Record<string, unknown>
429
+ ? {
430
+ [K in keyof Original]: Original[K] extends Target
431
+ ? With
432
+ : Original[K]
433
+ }
434
+ : Original extends Target
435
+ ? With
436
+ : Original
437
+
438
+ type IsAny<T> = 0 extends 1 & T ? true : false
439
+
440
+ export type CoExist<Original, Target, With> = IsAny<Target> extends true
441
+ ? Original
442
+ : Original extends Record<string, unknown>
443
+ ? {
444
+ [K in keyof Original]: Original[K] extends Target
445
+ ? Original[K] | With
446
+ : Original[K]
447
+ }
448
+ : Original extends Target
449
+ ? Original | With
450
+ : Original
451
+
452
+ export type InlineHandler<
453
+ Route extends RouteSchema = {},
454
+ Singleton extends SingletonBase = {
455
+ decorator: {}
456
+ store: {}
457
+ derive: {}
458
+ resolve: {}
459
+ },
460
+ Path extends string = '',
461
+ MacroContext = {}
462
+ > =
463
+ | ((
464
+ context: MacroContext extends Record<
465
+ string | number | symbol,
466
+ unknown
467
+ >
468
+ ? Prettify<MacroContext & Context<Route, Singleton, Path>>
469
+ : Context<Route, Singleton, Path>
470
+ ) =>
471
+ | Response
472
+ | MaybePromise<
473
+ {} extends Route['response']
474
+ ? unknown
475
+ :
476
+ | (Route['response'] extends { 200: any }
477
+ ? Route['response']
478
+ : string | number | boolean | Object)
479
+ | Route['response'][keyof Route['response']]
480
+ | {
481
+ [Status in keyof Route['response']]: {
482
+ _type: Record<
483
+ Status,
484
+ Route['response'][Status]
485
+ >
486
+ [ELYSIA_RESPONSE]: Status
487
+ }
488
+ }[keyof Route['response']]
489
+ >)
490
+ | ({} extends Route['response']
491
+ ? string | number | boolean | Object
492
+ :
493
+ | (Route['response'] extends { 200: any }
494
+ ? Route['response']
495
+ : string | number | boolean | Object)
496
+ | Route['response'][keyof Route['response']]
497
+ | {
498
+ [Status in keyof Route['response']]: {
499
+ _type: Record<Status, Route['response'][Status]>
500
+ [ELYSIA_RESPONSE]: Status
501
+ }
502
+ }[keyof Route['response']])
503
+
504
+ export type OptionalHandler<
505
+ in out Route extends RouteSchema = {},
506
+ in out Singleton extends SingletonBase = {
507
+ decorator: {}
508
+ store: {}
509
+ derive: {}
510
+ resolve: {}
511
+ },
512
+ Path extends string = ''
513
+ > = Handler<Route, Singleton, Path> extends (
514
+ context: infer Context
515
+ ) => infer Returned
516
+ ? (context: Context) => Returned | MaybePromise<void>
517
+ : never
518
+
519
+ export type AfterHandler<
520
+ in out Route extends RouteSchema = {},
521
+ in out Singleton extends SingletonBase = {
522
+ decorator: {}
523
+ store: {}
524
+ derive: {}
525
+ resolve: {}
526
+ },
527
+ Path extends string = ''
528
+ > = Handler<Route, Singleton, Path> extends (
529
+ context: infer Context
530
+ ) => infer Returned
531
+ ? (
532
+ context: Prettify<
533
+ {
534
+ response: Route['response']
535
+ } & Context
536
+ >
537
+ ) => Returned | MaybePromise<void>
538
+ : never
539
+
540
+ export type MapResponse<
541
+ in out Route extends RouteSchema = {},
542
+ in out Singleton extends SingletonBase = {
543
+ decorator: {}
544
+ store: {}
545
+ derive: {}
546
+ resolve: {}
547
+ },
548
+ Path extends string = ''
549
+ > = Handler<
550
+ Omit<Route, 'response'> & {
551
+ response: MaybePromise<Response | undefined | unknown>
552
+ },
553
+ Singleton & {
554
+ derive: {
555
+ response: Route['response']
556
+ }
557
+ },
558
+ Path
559
+ >
560
+
561
+ export type VoidHandler<
562
+ in out Route extends RouteSchema = {},
563
+ in out Singleton extends SingletonBase = {
564
+ decorator: {}
565
+ store: {}
566
+ derive: {}
567
+ resolve: {}
568
+ }
569
+ > = (context: Context<Route, Singleton>) => MaybePromise<void>
570
+
571
+ export type TransformHandler<
572
+ in out Route extends RouteSchema = {},
573
+ in out Singleton extends SingletonBase = {
574
+ decorator: {}
575
+ store: {}
576
+ derive: {}
577
+ resolve: {}
578
+ },
579
+ BasePath extends string = ''
580
+ > = {
581
+ (
582
+ context: Prettify<
583
+ Context<
584
+ Route,
585
+ Omit<Singleton, 'resolve'> & {
586
+ resolve: {}
587
+ },
588
+ BasePath
589
+ >
590
+ >
591
+ ): MaybePromise<void>
592
+ }
593
+
594
+ export type BodyHandler<
595
+ in out Route extends RouteSchema = {},
596
+ in out Singleton extends SingletonBase = {
597
+ decorator: {}
598
+ store: {}
599
+ derive: {}
600
+ resolve: {}
601
+ },
602
+ Path extends string = ''
603
+ > = (
604
+ context: Prettify<
605
+ {
606
+ contentType: string
607
+ } & Context<Route, Singleton, Path>
608
+ >,
609
+ /**
610
+ * @deprecated
611
+ *
612
+ * use `context.contentType` instead
613
+ *
614
+ * @example
615
+ * ```ts
616
+ * new Spiceflow()
617
+ * .onParse(({ contentType, request }) => {
618
+ * if (contentType === 'application/json')
619
+ * return request.json()
620
+ * })
621
+ * ```
622
+ */
623
+ contentType: string
624
+ ) => MaybePromise<any>
625
+
626
+ export type PreHandler<
627
+ in out Route extends RouteSchema = {},
628
+ in out Singleton extends SingletonBase = {
629
+ decorator: {}
630
+ store: {}
631
+ derive: {}
632
+ resolve: {}
633
+ }
634
+ > = (context: PreContext<Singleton>) => MaybePromise<Route['response'] | void>
635
+
636
+ export type AfterResponseHandler<
637
+ in out Route extends RouteSchema = {},
638
+ in out Singleton extends SingletonBase = {
639
+ decorator: {}
640
+ store: {}
641
+ derive: {}
642
+ resolve: {}
643
+ }
644
+ > = (
645
+ context: Prettify<
646
+ Context<Route, Singleton> & {
647
+ response: Route['response']
648
+ }
649
+ >
650
+ ) => MaybePromise<void>
651
+
652
+ export type GracefulHandler<
653
+ in Instance extends Spiceflow<any, any, any, any, any, any, any, any>
654
+ > = (data: Instance) => any
655
+
656
+ export type ErrorHandler<
657
+ in out T extends Record<string, Error> = {},
658
+ in out Route extends RouteSchema = {},
659
+ in out Singleton extends SingletonBase = {
660
+ decorator: {}
661
+ store: {}
662
+ derive: {}
663
+ resolve: {}
664
+ },
665
+ // ? scoped
666
+ in out Ephemeral extends EphemeralType = {
667
+ derive: {}
668
+ resolve: {}
669
+ schema: {}
670
+ },
671
+ // ? local
672
+ in out Volatile extends EphemeralType = {
673
+ derive: {}
674
+ resolve: {}
675
+ schema: {}
676
+ }
677
+ > = (
678
+ context: ErrorContext<
679
+ Route,
680
+ {
681
+ store: Singleton['store']
682
+ decorator: Singleton['decorator']
683
+ derive: {}
684
+ resolve: {}
685
+ }
686
+ > &
687
+ (
688
+ | Prettify<
689
+ {
690
+ request: Request
691
+ code: 'UNKNOWN'
692
+ error: Readonly<Error>
693
+ } & Partial<
694
+ Singleton['derive'] &
695
+ Ephemeral['derive'] &
696
+ Volatile['derive']
697
+ > &
698
+ Partial<
699
+ Singleton['derive'] &
700
+ Ephemeral['resolve'] &
701
+ Volatile['resolve']
702
+ >
703
+ >
704
+ | Prettify<
705
+ {
706
+ request: Request
707
+ code: 'VALIDATION'
708
+ error: Readonly<ValidationError>
709
+ } & Singleton['derive'] &
710
+ Ephemeral['derive'] &
711
+ Volatile['derive'] &
712
+ NeverKey<
713
+ Singleton['derive'] &
714
+ Ephemeral['resolve'] &
715
+ Volatile['resolve']
716
+ >
717
+ >
718
+ | Prettify<
719
+ {
720
+ request: Request
721
+ code: 'NOT_FOUND'
722
+ error: Readonly<NotFoundError>
723
+ } & NeverKey<
724
+ Singleton['derive'] &
725
+ Ephemeral['derive'] &
726
+ Volatile['derive']
727
+ > &
728
+ NeverKey<
729
+ Singleton['derive'] &
730
+ Ephemeral['resolve'] &
731
+ Volatile['resolve']
732
+ >
733
+ >
734
+ | Prettify<
735
+ {
736
+ request: Request
737
+ code: 'PARSE'
738
+ error: Readonly<ParseError>
739
+ } & Singleton['derive'] &
740
+ Ephemeral['derive'] &
741
+ Volatile['derive'] &
742
+ NeverKey<
743
+ Singleton['derive'] &
744
+ Ephemeral['resolve'] &
745
+ Volatile['resolve']
746
+ >
747
+ >
748
+ | Prettify<
749
+ {
750
+ request: Request
751
+ code: 'INTERNAL_SERVER_ERROR'
752
+ error: Readonly<InternalServerError>
753
+ } & Partial<
754
+ Singleton['derive'] &
755
+ Ephemeral['derive'] &
756
+ Volatile['derive']
757
+ > &
758
+ Partial<
759
+ Singleton['derive'] &
760
+ Ephemeral['resolve'] &
761
+ Volatile['resolve']
762
+ >
763
+ >
764
+ | Prettify<
765
+ {
766
+ request: Request
767
+ code: 'INVALID_COOKIE_SIGNATURE'
768
+ error: Readonly<InvalidCookieSignature>
769
+ } & NeverKey<
770
+ Singleton['derive'] &
771
+ Ephemeral['derive'] &
772
+ Volatile['derive']
773
+ > &
774
+ NeverKey<
775
+ Singleton['derive'] &
776
+ Ephemeral['resolve'] &
777
+ Volatile['resolve']
778
+ >
779
+ >
780
+ | Prettify<
781
+ {
782
+ [K in keyof T]: {
783
+ request: Request
784
+ code: K
785
+ error: Readonly<T[K]>
786
+ }
787
+ }[keyof T] &
788
+ Partial<
789
+ Singleton['derive'] &
790
+ Ephemeral['derive'] &
791
+ Volatile['derive']
792
+ > &
793
+ Partial<
794
+ Singleton['derive'] &
795
+ Ephemeral['resolve'] &
796
+ Volatile['resolve']
797
+ >
798
+ >
799
+ )
800
+ ) => any | Promise<any>
801
+
802
+ export type Isolate<T> = {
803
+ [P in keyof T]: T[P]
804
+ }
805
+
806
+ export type DocumentDecoration = Partial<OpenAPIV3.OperationObject> & {
807
+ /**
808
+ * Pass `true` to hide route from OpenAPI/swagger document
809
+ * */
810
+ hide?: boolean
811
+ }
812
+
813
+ export type LocalHook<
814
+ LocalSchema extends InputSchema,
815
+ Schema extends RouteSchema,
816
+ Singleton extends SingletonBase,
817
+ Errors extends Record<string, Error>,
818
+ Extension extends BaseMacro,
819
+ Path extends string = '',
820
+ TypedRoute extends RouteSchema = Schema extends {
821
+ params: Record<string, unknown>
822
+ }
823
+ ? Schema
824
+ : Schema & {
825
+ params: undefined extends Schema['params']
826
+ ? ResolvePath<Path>
827
+ : Schema['params']
828
+ }
829
+ > = (LocalSchema extends {} ? LocalSchema : Isolate<LocalSchema>) &
830
+ Extension & {
831
+ /**
832
+ * Short for 'Content-Type'
833
+ *
834
+ * Available:
835
+ * - 'none': do not parse body
836
+ * - 'text' / 'text/plain': parse body as string
837
+ * - 'json' / 'application/json': parse body as json
838
+ * - 'formdata' / 'multipart/form-data': parse body as form-data
839
+ * - 'urlencoded' / 'application/x-www-form-urlencoded: parse body as urlencoded
840
+ * - 'arraybuffer': parse body as readable stream
841
+ */
842
+ type?: ContentType
843
+ detail?: DocumentDecoration
844
+ // /**
845
+ // * Custom body parser
846
+ // */
847
+ // parse?: MaybeArray<BodyHandler<TypedRoute, Singleton>>
848
+ // /**
849
+ // * Transform context's value
850
+ // */
851
+ // transform?: MaybeArray<TransformHandler<TypedRoute, Singleton>>
852
+ // /**
853
+ // * Execute before main handler
854
+ // */
855
+ // beforeHandle?: MaybeArray<OptionalHandler<TypedRoute, Singleton>>
856
+ // /**
857
+ // * Execute after main handler
858
+ // */
859
+ // afterHandle?: MaybeArray<AfterHandler<TypedRoute, Singleton>>
860
+ // /**
861
+ // * Execute after main handler
862
+ // */
863
+ // mapResponse?: MaybeArray<MapResponse<TypedRoute, Singleton>>
864
+ // /**
865
+ // * Execute after response is sent
866
+ // */
867
+ // afterResponse?: MaybeArray<VoidHandler<TypedRoute, Singleton>>
868
+ // /**
869
+ // * Catch error
870
+ // */
871
+ // error?: MaybeArray<ErrorHandler<Errors, TypedRoute, Singleton>>
872
+ // tags?: DocumentDecoration['tags']
873
+ }
874
+
875
+ export type ComposedHandler = (context: Context) => MaybePromise<Response>
876
+
877
+ export interface InternalRoute {
878
+ method: HTTPMethod
879
+ path: string
880
+ composed: ComposedHandler | Response | null
881
+ handler: Handler
882
+ hooks: LocalHook<any, any, any, any, any, any, any>
883
+ }
884
+
885
+ export type ListenCallback = (server: Server) => MaybePromise<void>
886
+
887
+ export type AddPrefix<Prefix extends string, T> = {
888
+ [K in keyof T as Prefix extends string ? `${Prefix}${K & string}` : K]: T[K]
889
+ }
890
+
891
+ export type AddPrefixCapitalize<Prefix extends string, T> = {
892
+ [K in keyof T as `${Prefix}${Capitalize<K & string>}`]: T[K]
893
+ }
894
+
895
+ export type AddSuffix<Suffix extends string, T> = {
896
+ [K in keyof T as `${K & string}${Suffix}`]: T[K]
897
+ }
898
+
899
+ export type AddSuffixCapitalize<Suffix extends string, T> = {
900
+ [K in keyof T as `${K & string}${Capitalize<Suffix>}`]: T[K]
901
+ }
902
+
903
+ export type Checksum = {
904
+ name?: string
905
+ seed?: unknown
906
+ checksum: number
907
+ stack?: string
908
+ routes?: InternalRoute[]
909
+ decorators?: SingletonBase['decorator']
910
+ store?: SingletonBase['store']
911
+ type?: DefinitionBase['type']
912
+ error?: DefinitionBase['error']
913
+ dependencies?: Record<string, Checksum[]>
914
+ derive?: {
915
+ fn: string
916
+ stack: string
917
+ }[]
918
+ resolve?: {
919
+ fn: string
920
+ stack: string
921
+ }[]
922
+ }
923
+
924
+ export type BaseMacro = Record<
925
+ string,
926
+ string | number | boolean | Object | undefined | null
927
+ >
928
+ export type BaseMacroFn = Record<string, (...a: any) => unknown>
929
+
930
+ export type MacroToProperty<in out T extends BaseMacroFn> = Prettify<{
931
+ [K in keyof T]: T[K] extends Function
932
+ ? T[K] extends (a: infer Params) => any
933
+ ? Params | undefined
934
+ : T[K]
935
+ : T[K]
936
+ }>
937
+
938
+ interface MacroOptions {
939
+ insert?: 'before' | 'after'
940
+ stack?: 'global' | 'local'
941
+ }
942
+
943
+ export interface MacroManager<
944
+ in out TypedRoute extends RouteSchema = {},
945
+ in out Singleton extends SingletonBase = {
946
+ decorator: {}
947
+ store: {}
948
+ derive: {}
949
+ resolve: {}
950
+ },
951
+ in out Errors extends Record<string, Error> = {}
952
+ > {
953
+ onParse(fn: MaybeArray<BodyHandler<TypedRoute, Singleton>>): unknown
954
+ onParse(
955
+ options: MacroOptions,
956
+ fn: MaybeArray<BodyHandler<TypedRoute, Singleton>>
957
+ ): unknown
958
+
959
+ onTransform(fn: MaybeArray<VoidHandler<TypedRoute, Singleton>>): unknown
960
+ onTransform(
961
+ options: MacroOptions,
962
+ fn: MaybeArray<VoidHandler<TypedRoute, Singleton>>
963
+ ): unknown
964
+
965
+ onBeforeHandle(
966
+ fn: MaybeArray<OptionalHandler<TypedRoute, Singleton>>
967
+ ): unknown
968
+ onBeforeHandle(
969
+ options: MacroOptions,
970
+ fn: MaybeArray<OptionalHandler<TypedRoute, Singleton>>
971
+ ): unknown
972
+
973
+ onAfterHandle(fn: MaybeArray<AfterHandler<TypedRoute, Singleton>>): unknown
974
+ onAfterHandle(
975
+ options: MacroOptions,
976
+ fn: MaybeArray<AfterHandler<TypedRoute, Singleton>>
977
+ ): unknown
978
+
979
+ onError(
980
+ fn: MaybeArray<ErrorHandler<Errors, TypedRoute, Singleton>>
981
+ ): unknown
982
+ onError(
983
+ options: MacroOptions,
984
+ fn: MaybeArray<ErrorHandler<Errors, TypedRoute, Singleton>>
985
+ ): unknown
986
+
987
+ mapResponse(fn: MaybeArray<MapResponse<TypedRoute, Singleton>>): unknown
988
+ mapResponse(
989
+ options: MacroOptions,
990
+ fn: MaybeArray<MapResponse<TypedRoute, Singleton>>
991
+ ): unknown
992
+
993
+ onAfterResponse(
994
+ fn: MaybeArray<AfterResponseHandler<TypedRoute, Singleton>>
995
+ ): unknown
996
+ onAfterResponse(
997
+ options: MacroOptions,
998
+ fn: MaybeArray<AfterResponseHandler<TypedRoute, Singleton>>
999
+ ): unknown
1000
+
1001
+ events: {
1002
+ global: Prettify<LifeCycleStore & RouteSchema>
1003
+ local: Prettify<LifeCycleStore & RouteSchema>
1004
+ }
1005
+ }
1006
+
1007
+ export type MacroQueue = HookContainer<
1008
+ (manager: MacroManager<any, any, any>) => unknown
1009
+ >
1010
+
1011
+ type _CreateEden<
1012
+ Path extends string,
1013
+ Property extends Record<string, unknown> = {}
1014
+ > = Path extends `${infer Start}/${infer Rest}`
1015
+ ? {
1016
+ [x in Start]: _CreateEden<Rest, Property>
1017
+ }
1018
+ : {
1019
+ [x in Path]: Property
1020
+ }
1021
+
1022
+ export type CreateEden<
1023
+ Path extends string,
1024
+ Property extends Record<string, unknown> = {}
1025
+ > = Path extends `/${infer Rest}`
1026
+ ? _CreateEden<Rest, Property>
1027
+ : Path extends ''
1028
+ ? _CreateEden<'index', Property>
1029
+ : _CreateEden<Path, Property>
1030
+
1031
+ export type ComposeSpiceflowResponse<Response, Handle> = Handle extends (
1032
+ ...a: any[]
1033
+ ) => infer A
1034
+ ? _ComposeSpiceflowResponse<Response, Replace<Awaited<A>, BunFile, File>>
1035
+ : _ComposeSpiceflowResponse<
1036
+ Response,
1037
+ Replace<Awaited<Handle>, BunFile, File>
1038
+ >
1039
+
1040
+ type _ComposeSpiceflowResponse<Response, Handle> = Prettify<
1041
+ {} extends Response
1042
+ ? {
1043
+ 200: Exclude<Handle, { [ELYSIA_RESPONSE]: any }>
1044
+ } & {
1045
+ [ErrorResponse in Extract<
1046
+ Handle,
1047
+ { response: any }
1048
+ > as ErrorResponse extends {
1049
+ [ELYSIA_RESPONSE]: infer Status extends number
1050
+ }
1051
+ ? Status
1052
+ : never]: ErrorResponse['response']
1053
+ }
1054
+ : Response
1055
+ >
1056
+
1057
+ export type MergeSpiceflowInstances<
1058
+ Instances extends Spiceflow<any, any, any, any, any, any>[] = [],
1059
+ Prefix extends string = '',
1060
+ Scoped extends boolean = false,
1061
+ Singleton extends SingletonBase = {
1062
+ decorator: {}
1063
+ store: {}
1064
+ derive: {}
1065
+ resolve: {}
1066
+ },
1067
+ Definitions extends DefinitionBase = {
1068
+ type: {}
1069
+ error: {}
1070
+ },
1071
+ Metadata extends MetadataBase = {
1072
+ schema: {}
1073
+ macro: {}
1074
+ macroFn: {}
1075
+ },
1076
+ Routes extends RouteBase = {}
1077
+ > = Instances extends [
1078
+ infer Current extends Spiceflow<any, any, any, any, any, any>,
1079
+ ...infer Rest extends Spiceflow<any, any, any, any, any, any>[]
1080
+ ]
1081
+ ? Current['_types']['Scoped'] extends true
1082
+ ? MergeSpiceflowInstances<
1083
+ Rest,
1084
+ Prefix,
1085
+ Scoped,
1086
+ Singleton,
1087
+ Definitions,
1088
+ Metadata,
1089
+ Routes
1090
+ >
1091
+ : MergeSpiceflowInstances<
1092
+ Rest,
1093
+ Prefix,
1094
+ Scoped,
1095
+ Singleton & Current['_types']['Singleton'],
1096
+ Definitions & Current['_types']['Definitions'],
1097
+ Metadata & Current['_types']['Metadata'],
1098
+ Routes &
1099
+ (Prefix extends ``
1100
+ ? Current['_routes']
1101
+ : AddPrefix<Prefix, Current['_routes']>)
1102
+ >
1103
+ : Spiceflow<
1104
+ Prefix,
1105
+ Scoped,
1106
+ {
1107
+ decorator: Prettify<Singleton['decorator']>
1108
+ store: Prettify<Singleton['store']>
1109
+ derive: Prettify<Singleton['derive']>
1110
+ resolve: Prettify<Singleton['resolve']>
1111
+ },
1112
+ {
1113
+ type: Prettify<Definitions['type']>
1114
+ error: Prettify<Definitions['error']>
1115
+ },
1116
+ {
1117
+ schema: Prettify<Metadata['schema']>
1118
+ macro: Prettify<Metadata['macro']>
1119
+ macroFn: Prettify<Metadata['macroFn']>
1120
+ },
1121
+ Routes
1122
+ >
1123
+
1124
+ export type LifeCycleType = 'global' | 'local' | 'scoped'
1125
+
1126
+ // Exclude return error()
1127
+ export type ExcludeSpiceflowResponse<T> = Exclude<
1128
+ undefined extends Awaited<T> ? Partial<Awaited<T>> : Awaited<T>,
1129
+ { [ELYSIA_RESPONSE]: any }
1130
+ >
1131
+
1132
+ export type InferContext<
1133
+ T extends Spiceflow<any, any, any, any, any, any, any, any>,
1134
+ Path extends string = T['_types']['Prefix'],
1135
+ Schema extends RouteSchema = T['_types']['Metadata']['schema']
1136
+ > = Context<
1137
+ MergeSchema<Schema, T['_types']['Metadata']['schema']>,
1138
+ T['_types']['Singleton'] & {
1139
+ derive: T['_ephemeral']['derive'] & T['_volatile']['derive']
1140
+ resolve: T['_ephemeral']['resolve'] & T['_volatile']['resolve']
1141
+ },
1142
+ Path
1143
+ >
1144
+
1145
+ export type InferHandler<
1146
+ T extends Spiceflow<any, any, any, any, any, any, any, any>,
1147
+ Path extends string = T['_types']['Prefix'],
1148
+ Schema extends RouteSchema = T['_types']['Metadata']['schema']
1149
+ > = InlineHandler<
1150
+ MergeSchema<Schema, T['_types']['Metadata']['schema']>,
1151
+ T['_types']['Singleton'] & {
1152
+ derive: T['_ephemeral']['derive'] & T['_volatile']['derive']
1153
+ resolve: T['_ephemeral']['resolve'] & T['_volatile']['resolve']
1154
+ },
1155
+ Path
1156
+ >
1157
+
1158
+ export interface ModelValidatorError extends ValueError {
1159
+ summary: string
1160
+ }
1161
+
1162
+ // @ts-ignore trust me bro
1163
+ export interface ModelValidator<T> extends TypeCheck<T> {
1164
+ parse(a: T): T
1165
+ safeParse(a: T):
1166
+ | { success: true; data: T; error: null }
1167
+ | {
1168
+ success: true
1169
+ data: null
1170
+ error: string
1171
+ errors: ModelValidatorError[]
1172
+ }
1173
+ }
1174
+
1175
+ export type UnionToIntersect<U> = (
1176
+ U extends unknown ? (arg: U) => 0 : never
1177
+ ) extends (arg: infer I) => 0
1178
+ ? I
1179
+ : never
1180
+
1181
+ export type ResolveMacroContext<
1182
+ Macro extends BaseMacro,
1183
+ MacroFn extends BaseMacroFn
1184
+ > = UnionToIntersect<
1185
+ {
1186
+ [K in keyof Macro]-?: undefined extends Macro[K]
1187
+ ? never
1188
+ : K extends keyof MacroFn
1189
+ ? ReturnType<MacroFn[K]> extends infer A extends Record<
1190
+ string | number | symbol,
1191
+ unknown
1192
+ >
1193
+ ? A
1194
+ : never
1195
+ : never
1196
+ }[keyof Macro]
1197
+ >
1198
+
1199
+ export type ContextAppendType = 'append' | 'override'
1200
+
1201
+ export type HigherOrderFunction<
1202
+ T extends (...arg: unknown[]) => Function = (...arg: unknown[]) => Function
1203
+ > = (fn: T, request: Request) => ReturnType<T>
1204
+
1205
+ // new Spiceflow()
1206
+ // .wrap((fn) => {
1207
+ // return fn()
1208
+ // })
1209
+
1210
+ export type HTTPHeaders = Record<string, string> & {
1211
+ // Authentication
1212
+ 'www-authenticate'?: string
1213
+ authorization?: string
1214
+ 'proxy-authenticate'?: string
1215
+ 'proxy-authorization'?: string
1216
+
1217
+ // Caching
1218
+ age?: string
1219
+ 'cache-control'?: string
1220
+ 'clear-site-data'?: string
1221
+ expires?: string
1222
+ 'no-vary-search'?: string
1223
+ pragma?: string
1224
+
1225
+ // Conditionals
1226
+ 'last-modified'?: string
1227
+ etag?: string
1228
+ 'if-match'?: string
1229
+ 'if-none-match'?: string
1230
+ 'if-modified-since'?: string
1231
+ 'if-unmodified-since'?: string
1232
+ vary?: string
1233
+
1234
+ // Connection management
1235
+ connection?: string
1236
+ 'keep-alive'?: string
1237
+
1238
+ // Content negotiation
1239
+ accept?: string
1240
+ 'accept-encoding'?: string
1241
+ 'accept-language'?: string
1242
+
1243
+ // Controls
1244
+ expect?: string
1245
+ 'max-forwards'?: string
1246
+
1247
+ // Cokies
1248
+ cookie?: string
1249
+ 'set-cookie'?: string | string[]
1250
+
1251
+ // CORS
1252
+ 'access-control-allow-origin'?: string
1253
+ 'access-control-allow-credentials'?: string
1254
+ 'access-control-allow-headers'?: string
1255
+ 'access-control-allow-methods'?: string
1256
+ 'access-control-expose-headers'?: string
1257
+ 'access-control-max-age'?: string
1258
+ 'access-control-request-headers'?: string
1259
+ 'access-control-request-method'?: string
1260
+ origin?: string
1261
+ 'timing-allow-origin'?: string
1262
+
1263
+ // Downloads
1264
+ 'content-disposition'?: string
1265
+
1266
+ // Message body information
1267
+ 'content-length'?: string
1268
+ 'content-type'?: string
1269
+ 'content-encoding'?: string
1270
+ 'content-language'?: string
1271
+ 'content-location'?: string
1272
+
1273
+ // Proxies
1274
+ forwarded?: string
1275
+ via?: string
1276
+
1277
+ // Redirects
1278
+ location?: string
1279
+ refresh?: string
1280
+
1281
+ // Request context
1282
+ // from?: string
1283
+ // host?: string
1284
+ // referer?: string
1285
+ // 'user-agent'?: string
1286
+
1287
+ // Response context
1288
+ allow?: string
1289
+ server?: 'spiceflow' | (string & {})
1290
+
1291
+ // Range requests
1292
+ 'accept-ranges'?: string
1293
+ range?: string
1294
+ 'if-range'?: string
1295
+ 'content-range'?: string
1296
+
1297
+ // Security
1298
+ 'content-security-policy'?: string
1299
+ 'content-security-policy-report-only'?: string
1300
+ 'cross-origin-embedder-policy'?: string
1301
+ 'cross-origin-opener-policy'?: string
1302
+ 'cross-origin-resource-policy'?: string
1303
+ 'expect-ct'?: string
1304
+ 'permission-policy'?: string
1305
+ 'strict-transport-security'?: string
1306
+ 'upgrade-insecure-requests'?: string
1307
+ 'x-content-type-options'?: string
1308
+ 'x-frame-options'?: string
1309
+ 'x-xss-protection'?: string
1310
+
1311
+ // Server-sent events
1312
+ 'last-event-id'?: string
1313
+ 'ping-from'?: string
1314
+ 'ping-to'?: string
1315
+ 'report-to'?: string
1316
+
1317
+ // Transfer coding
1318
+ te?: string
1319
+ trailer?: string
1320
+ 'transfer-encoding'?: string
1321
+
1322
+ // Other
1323
+ 'alt-svg'?: string
1324
+ 'alt-used'?: string
1325
+ date?: string
1326
+ dnt?: string
1327
+ 'early-data'?: string
1328
+ 'large-allocation'?: string
1329
+ link?: string
1330
+ 'retry-after'?: string
1331
+ 'service-worker-allowed'?: string
1332
+ 'source-map'?: string
1333
+ upgrade?: string
1334
+
1335
+ // Non-standard
1336
+ 'x-dns-prefetch-control'?: string
1337
+ 'x-forwarded-for'?: string
1338
+ 'x-forwarded-host'?: string
1339
+ 'x-forwarded-proto'?: string
1340
+ 'x-powered-by'?: 'spiceflow' | (string & {})
1341
+ 'x-request-id'?: string
1342
+ 'x-requested-with'?: string
1343
+ 'x-robots-tag'?: string
1344
+ 'x-ua-compatible'?: string
1345
+ }
1346
+
1347
+ export type JoinPath<A extends string, B extends string> = `${A}${B extends '/'
1348
+ ? '/index'
1349
+ : B extends ''
1350
+ ? B
1351
+ : B extends `/${string}`
1352
+ ? B
1353
+ : B}`