elysia 2.0.0-beta.20 → 2.0.0-beta.21

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 (50) hide show
  1. package/dist/compile/aot.d.ts +8 -8
  2. package/dist/compile/aot.js +16 -14
  3. package/dist/compile/aot.mjs +14 -14
  4. package/dist/compile/handler/descriptor.js +2 -3
  5. package/dist/compile/handler/descriptor.mjs +2 -3
  6. package/dist/compile/handler/index.d.ts +2 -1
  7. package/dist/compile/handler/index.js +144 -24
  8. package/dist/compile/handler/index.mjs +146 -27
  9. package/dist/compile/handler/jit.d.ts +2 -0
  10. package/dist/compile/handler/jit.js +3 -2
  11. package/dist/compile/handler/jit.mjs +3 -2
  12. package/dist/compile/handler/reconstruct.js +3 -2
  13. package/dist/compile/handler/reconstruct.mjs +3 -2
  14. package/dist/cookie/config.d.ts +6 -2
  15. package/dist/cookie/config.js +68 -8
  16. package/dist/cookie/config.mjs +69 -10
  17. package/dist/cookie/utils.js +3 -3
  18. package/dist/cookie/utils.mjs +4 -4
  19. package/dist/package.js +1 -1
  20. package/dist/package.mjs +1 -1
  21. package/dist/plugin/aot/core.d.ts +5 -0
  22. package/dist/plugin/aot/core.js +37 -1
  23. package/dist/plugin/aot/core.mjs +37 -1
  24. package/dist/plugin/aot/source.js +24 -9
  25. package/dist/plugin/aot/source.mjs +24 -9
  26. package/dist/schema-snapshot.js +4 -3
  27. package/dist/schema-snapshot.mjs +4 -3
  28. package/dist/type/coerce.d.ts +1 -1
  29. package/dist/type/constants.d.ts +1 -1
  30. package/dist/type/elysia/keep-config.d.ts +14 -0
  31. package/dist/type/elysia/keep-config.js +62 -0
  32. package/dist/type/elysia/keep-config.mjs +53 -0
  33. package/dist/type/exports.d.ts +3 -2
  34. package/dist/type/exports.js +10 -0
  35. package/dist/type/exports.mjs +2 -1
  36. package/dist/type/index.js +10 -0
  37. package/dist/type/index.mjs +10 -0
  38. package/dist/type/typebox-type-live.d.ts +2 -2
  39. package/dist/type/typebox-type-live.js +8 -0
  40. package/dist/type/typebox-type-live.mjs +2 -2
  41. package/dist/type/typebox-type.d.ts +10 -2
  42. package/dist/type/typebox-type.js +64 -0
  43. package/dist/type/typebox-type.mjs +17 -1
  44. package/dist/types.d.ts +3 -2
  45. package/dist/utils.d.ts +3 -1
  46. package/dist/utils.js +23 -0
  47. package/dist/utils.mjs +22 -1
  48. package/dist/ws/route.js +33 -5
  49. package/dist/ws/route.mjs +35 -7
  50. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  import { TypeboxTypeNamespaces } from "./typebox-type.js";
2
- import { Codec, Decode, Evaluate, Intersect, Module, Null, Ref, Refine, Undefined, Unsafe } from "typebox/type";
2
+ import { Codec, Composite, Decode, Evaluate, Interface, Intersect, Mapped, Module, Null, Omit, Partial, Pick, ReadonlyObject, Ref, Refine, Required, Undefined, Unsafe } from "typebox/type";
3
3
 
4
4
  //#region src/type/typebox-type-live.d.ts
5
5
  declare function injectTypeboxType(typebox?: TypeboxTypeNamespaces): void;
@@ -8,4 +8,4 @@ declare function markTypeUsed(): void;
8
8
  declare const isTypeUsed: () => boolean;
9
9
  declare const isTypeNamespaceLoaded: () => boolean;
10
10
  //#endregion
11
- export { Codec, Decode, Evaluate, Intersect, Module, Null, Ref, Refine, type TypeboxTypeNamespaces, Undefined, Unsafe, injectTypeboxType, isTypeNamespaceLoaded, isTypeUsed, loadTypeNamespace, markTypeUsed };
11
+ export { Codec, Composite, Decode, Evaluate, Interface, Intersect, Mapped, Module, Null, Omit, Partial, Pick, ReadonlyObject, Ref, Refine, Required, type TypeboxTypeNamespaces, Undefined, Unsafe, injectTypeboxType, isTypeNamespaceLoaded, isTypeUsed, loadTypeNamespace, markTypeUsed };
@@ -21,13 +21,21 @@ const isTypeNamespaceLoaded = () => true;
21
21
 
22
22
  //#endregion
23
23
  exports.Codec = typebox_type.Codec;
24
+ exports.Composite = typebox_type.Composite;
24
25
  exports.Decode = typebox_type.Decode;
25
26
  exports.Evaluate = typebox_type.Evaluate;
27
+ exports.Interface = typebox_type.Interface;
26
28
  exports.Intersect = typebox_type.Intersect;
29
+ exports.Mapped = typebox_type.Mapped;
27
30
  exports.Module = typebox_type.Module;
28
31
  exports.Null = typebox_type.Null;
32
+ exports.Omit = typebox_type.Omit;
33
+ exports.Partial = typebox_type.Partial;
34
+ exports.Pick = typebox_type.Pick;
35
+ exports.ReadonlyObject = typebox_type.ReadonlyObject;
29
36
  exports.Ref = typebox_type.Ref;
30
37
  exports.Refine = typebox_type.Refine;
38
+ exports.Required = typebox_type.Required;
31
39
  exports.Undefined = typebox_type.Undefined;
32
40
  exports.Unsafe = typebox_type.Unsafe;
33
41
  exports.injectTypeboxType = injectTypeboxType;
@@ -1,5 +1,5 @@
1
1
  import * as type from "typebox/type";
2
- import { Codec, Decode, Evaluate, Intersect, Module, Null, Ref, Refine, Undefined, Unsafe } from "typebox/type";
2
+ import { Codec, Composite, Decode, Evaluate, Interface, Intersect, Mapped, Module, Null, Omit, Partial, Pick, ReadonlyObject, Ref, Refine, Required, Undefined, Unsafe } from "typebox/type";
3
3
  import * as system from "./typebox-system-lite.mjs";
4
4
 
5
5
  //#region src/type/typebox-type-live.ts
@@ -17,4 +17,4 @@ const isTypeUsed = () => true;
17
17
  const isTypeNamespaceLoaded = () => true;
18
18
 
19
19
  //#endregion
20
- export { Codec, Decode, Evaluate, Intersect, Module, Null, Ref, Refine, Undefined, Unsafe, injectTypeboxType, isTypeNamespaceLoaded, isTypeUsed, loadTypeNamespace, markTypeUsed };
20
+ export { Codec, Composite, Decode, Evaluate, Interface, Intersect, Mapped, Module, Null, Omit, Partial, Pick, ReadonlyObject, Ref, Refine, Required, Undefined, Unsafe, injectTypeboxType, isTypeNamespaceLoaded, isTypeUsed, loadTypeNamespace, markTypeUsed };
@@ -1,5 +1,5 @@
1
1
  import * as _$typebox_type0 from "typebox/type";
2
- import { Codec as Codec$1, Decode as Decode$1, Evaluate as Evaluate$1, Intersect as Intersect$1, Module as Module$1, Null as Null$1, Ref as Ref$1, Refine as Refine$1, Undefined as Undefined$1, Unsafe as Unsafe$1 } from "typebox/type";
2
+ import { Codec as Codec$1, Composite as Composite$1, Decode as Decode$1, Evaluate as Evaluate$1, Interface as Interface$1, Intersect as Intersect$1, Mapped as Mapped$1, Module as Module$1, Null as Null$1, Omit as Omit$1, Partial as Partial$1, Pick as Pick$1, ReadonlyObject as ReadonlyObject$1, Ref as Ref$1, Refine as Refine$1, Required as Required$1, Undefined as Undefined$1, Unsafe as Unsafe$1 } from "typebox/type";
3
3
  import * as _$typebox_system0 from "typebox/system";
4
4
 
5
5
  //#region src/type/typebox-type.d.ts
@@ -12,15 +12,23 @@ declare const markTypeUsed: () => void;
12
12
  declare const isTypeUsed: () => boolean;
13
13
  declare const isTypeNamespaceLoaded: () => boolean;
14
14
  declare let Codec: typeof Codec$1;
15
+ declare let Composite: typeof Composite$1;
15
16
  declare let Decode: typeof Decode$1;
16
17
  declare let Evaluate: typeof Evaluate$1;
18
+ declare let Interface: typeof Interface$1;
17
19
  declare let Intersect: typeof Intersect$1;
20
+ declare let Mapped: typeof Mapped$1;
18
21
  declare let Module: typeof Module$1;
19
22
  declare let Null: typeof Null$1;
23
+ declare let Omit: typeof Omit$1;
24
+ declare let Partial: typeof Partial$1;
25
+ declare let Pick: typeof Pick$1;
26
+ declare let ReadonlyObject: typeof ReadonlyObject$1;
20
27
  declare let Ref: typeof Ref$1;
21
28
  declare let Refine: typeof Refine$1;
29
+ declare let Required: typeof Required$1;
22
30
  declare let Undefined: typeof Undefined$1;
23
31
  declare let Unsafe: typeof Unsafe$1;
24
32
  declare function injectTypeboxType(typebox: TypeboxTypeNamespaces): void;
25
33
  //#endregion
26
- export { Codec, Decode, Evaluate, Intersect, Module, Null, Ref, Refine, TypeboxTypeNamespaces, Undefined, Unsafe, injectTypeboxType, isTypeNamespaceLoaded, isTypeUsed, loadTypeNamespace, markTypeUsed };
34
+ export { Codec, Composite, Decode, Evaluate, Interface, Intersect, Mapped, Module, Null, Omit, Partial, Pick, ReadonlyObject, Ref, Refine, Required, TypeboxTypeNamespaces, Undefined, Unsafe, injectTypeboxType, isTypeNamespaceLoaded, isTypeUsed, loadTypeNamespace, markTypeUsed };
@@ -42,26 +42,42 @@ function stub(get) {
42
42
  };
43
43
  }
44
44
  let Codec = stub(() => Codec);
45
+ let Composite = stub(() => Composite);
45
46
  let Decode = stub(() => Decode);
46
47
  let Evaluate = stub(() => Evaluate);
48
+ let Interface = stub(() => Interface);
47
49
  let Intersect = stub(() => Intersect);
50
+ let Mapped = stub(() => Mapped);
48
51
  let Module = stub(() => Module);
49
52
  let Null = stub(() => Null);
53
+ let Omit = stub(() => Omit);
54
+ let Partial = stub(() => Partial);
55
+ let Pick = stub(() => Pick);
56
+ let ReadonlyObject = stub(() => ReadonlyObject);
50
57
  let Ref = stub(() => Ref);
51
58
  let Refine = stub(() => Refine);
59
+ let Required = stub(() => Required);
52
60
  let Undefined = stub(() => Undefined);
53
61
  let Unsafe = stub(() => Unsafe);
54
62
  function injectTypeboxType(typebox) {
55
63
  const first = namespaces === void 0;
56
64
  namespaces = typebox;
57
65
  Codec = typebox.type.Codec;
66
+ Composite = typebox.type.Composite;
58
67
  Decode = typebox.type.Decode;
59
68
  Evaluate = typebox.type.Evaluate;
69
+ Interface = typebox.type.Interface;
60
70
  Intersect = typebox.type.Intersect;
71
+ Mapped = typebox.type.Mapped;
61
72
  Module = typebox.type.Module;
62
73
  Null = typebox.type.Null;
74
+ Omit = typebox.type.Omit;
75
+ Partial = typebox.type.Partial;
76
+ Pick = typebox.type.Pick;
77
+ ReadonlyObject = typebox.type.ReadonlyObject;
63
78
  Ref = typebox.type.Ref;
64
79
  Refine = typebox.type.Refine;
80
+ Required = typebox.type.Required;
65
81
  Undefined = typebox.type.Undefined;
66
82
  Unsafe = typebox.type.Unsafe;
67
83
  if (first) typebox.system.Settings.Set({ unionPrioritySort: false });
@@ -74,6 +90,12 @@ Object.defineProperty(exports, 'Codec', {
74
90
  return Codec;
75
91
  }
76
92
  });
93
+ Object.defineProperty(exports, 'Composite', {
94
+ enumerable: true,
95
+ get: function () {
96
+ return Composite;
97
+ }
98
+ });
77
99
  Object.defineProperty(exports, 'Decode', {
78
100
  enumerable: true,
79
101
  get: function () {
@@ -86,12 +108,24 @@ Object.defineProperty(exports, 'Evaluate', {
86
108
  return Evaluate;
87
109
  }
88
110
  });
111
+ Object.defineProperty(exports, 'Interface', {
112
+ enumerable: true,
113
+ get: function () {
114
+ return Interface;
115
+ }
116
+ });
89
117
  Object.defineProperty(exports, 'Intersect', {
90
118
  enumerable: true,
91
119
  get: function () {
92
120
  return Intersect;
93
121
  }
94
122
  });
123
+ Object.defineProperty(exports, 'Mapped', {
124
+ enumerable: true,
125
+ get: function () {
126
+ return Mapped;
127
+ }
128
+ });
95
129
  Object.defineProperty(exports, 'Module', {
96
130
  enumerable: true,
97
131
  get: function () {
@@ -104,6 +138,30 @@ Object.defineProperty(exports, 'Null', {
104
138
  return Null;
105
139
  }
106
140
  });
141
+ Object.defineProperty(exports, 'Omit', {
142
+ enumerable: true,
143
+ get: function () {
144
+ return Omit;
145
+ }
146
+ });
147
+ Object.defineProperty(exports, 'Partial', {
148
+ enumerable: true,
149
+ get: function () {
150
+ return Partial;
151
+ }
152
+ });
153
+ Object.defineProperty(exports, 'Pick', {
154
+ enumerable: true,
155
+ get: function () {
156
+ return Pick;
157
+ }
158
+ });
159
+ Object.defineProperty(exports, 'ReadonlyObject', {
160
+ enumerable: true,
161
+ get: function () {
162
+ return ReadonlyObject;
163
+ }
164
+ });
107
165
  Object.defineProperty(exports, 'Ref', {
108
166
  enumerable: true,
109
167
  get: function () {
@@ -116,6 +174,12 @@ Object.defineProperty(exports, 'Refine', {
116
174
  return Refine;
117
175
  }
118
176
  });
177
+ Object.defineProperty(exports, 'Required', {
178
+ enumerable: true,
179
+ get: function () {
180
+ return Required;
181
+ }
182
+ });
119
183
  Object.defineProperty(exports, 'Undefined', {
120
184
  enumerable: true,
121
185
  get: function () {
@@ -41,30 +41,46 @@ function stub(get) {
41
41
  };
42
42
  }
43
43
  let Codec = stub(() => Codec);
44
+ let Composite = stub(() => Composite);
44
45
  let Decode = stub(() => Decode);
45
46
  let Evaluate = stub(() => Evaluate);
47
+ let Interface = stub(() => Interface);
46
48
  let Intersect = stub(() => Intersect);
49
+ let Mapped = stub(() => Mapped);
47
50
  let Module = stub(() => Module);
48
51
  let Null = stub(() => Null);
52
+ let Omit = stub(() => Omit);
53
+ let Partial = stub(() => Partial);
54
+ let Pick = stub(() => Pick);
55
+ let ReadonlyObject = stub(() => ReadonlyObject);
49
56
  let Ref = stub(() => Ref);
50
57
  let Refine = stub(() => Refine);
58
+ let Required = stub(() => Required);
51
59
  let Undefined = stub(() => Undefined);
52
60
  let Unsafe = stub(() => Unsafe);
53
61
  function injectTypeboxType(typebox) {
54
62
  const first = namespaces === void 0;
55
63
  namespaces = typebox;
56
64
  Codec = typebox.type.Codec;
65
+ Composite = typebox.type.Composite;
57
66
  Decode = typebox.type.Decode;
58
67
  Evaluate = typebox.type.Evaluate;
68
+ Interface = typebox.type.Interface;
59
69
  Intersect = typebox.type.Intersect;
70
+ Mapped = typebox.type.Mapped;
60
71
  Module = typebox.type.Module;
61
72
  Null = typebox.type.Null;
73
+ Omit = typebox.type.Omit;
74
+ Partial = typebox.type.Partial;
75
+ Pick = typebox.type.Pick;
76
+ ReadonlyObject = typebox.type.ReadonlyObject;
62
77
  Ref = typebox.type.Ref;
63
78
  Refine = typebox.type.Refine;
79
+ Required = typebox.type.Required;
64
80
  Undefined = typebox.type.Undefined;
65
81
  Unsafe = typebox.type.Unsafe;
66
82
  if (first) typebox.system.Settings.Set({ unionPrioritySort: false });
67
83
  }
68
84
 
69
85
  //#endregion
70
- export { Codec, Decode, Evaluate, Intersect, Module, Null, Ref, Refine, Undefined, Unsafe, injectTypeboxType, isTypeNamespaceLoaded, isTypeUsed, loadTypeNamespace, markTypeUsed };
86
+ export { Codec, Composite, Decode, Evaluate, Interface, Intersect, Mapped, Module, Null, Omit, Partial, Pick, ReadonlyObject, Ref, Refine, Required, Undefined, Unsafe, injectTypeboxType, isTypeNamespaceLoaded, isTypeUsed, loadTypeNamespace, markTypeUsed };
package/dist/types.d.ts CHANGED
@@ -836,6 +836,7 @@ type ObjectMacroDefs<N, AmbientSchema extends RouteSchema, ScopedSchemas extends
836
836
  derive: Singleton['derive'] & MacroRefResolve<MacroFn, K extends keyof Refs ? Refs[K] : {}, Definitions['typebox']>;
837
837
  }, Definitions['error']>> } & { [K in keyof N]: N[K] extends ((...a: any[]) => any) ? unknown : string extends keyof N[K] ? unknown : { [P in Exclude<keyof N[K], MacroPropertyKey | InputSchemaKey | keyof MacroFn | keyof N>]: `Unknown macro property '${P & string}'` } } & N;
838
838
  type CreateEden<Path extends string, Property extends Record<string, unknown> = {}> = Path extends `/${infer Rest}` ? _CreateEden<Rest, Property> : Path extends '' | '/' ? Property : _CreateEden<Path, Property>;
839
+ type CreateRouteEden<BasePath extends string, Path extends string, Property extends Record<string, unknown>> = string extends Path ? {} : CreateEden<JoinPath<BasePath, Path>, Property>;
839
840
  type _CreateEden<Path extends string, Property extends Record<string, unknown> = {}> = Path extends `${infer Start}/${infer Rest}` ? { [x in Start]: _CreateEden<Rest, Property> } : Path extends '' ? Property : { [x in Path]: Property };
840
841
  /**
841
842
  * Value an annotation knob resolves to, `never` when it annotates nothing.
@@ -1112,7 +1113,7 @@ type MergeElysiaInstances<Instances extends AnyElysia[] = [], Prefix extends str
1112
1113
  derive: Singleton['derive'];
1113
1114
  }, Definitions, Metadata, Routes, Ephemeral, Volatile>;
1114
1115
  type WrapFn<Callback extends (...params: any) => MaybePromise<Response> = (request: Request, ...rest: any[]) => MaybePromise<Response>> = (fetch: (request: Request, ...rest: any[]) => MaybePromise<Response>) => Callback;
1115
- type AddRoute<BasePath extends string, Scope extends EventScope, Singleton extends SingletonBase, Definitions extends DefinitionBase, Metadata extends MetadataBase, Routes extends RouteBase, Ephemeral extends EphemeralType, Volatile extends EphemeralType, Method extends string, Path extends string, Schema extends RouteSchema, MacroContext extends RouteSchema, Handle> = Elysia<BasePath, Scope, Singleton, Definitions, Metadata, Routes & CreateEden<JoinPath<BasePath, Path>, { [method in Method]: WithHandledErrors<CreateEdenResponse<Path, Schema, MacroContext, ComposeElysiaResponse<Schema & MacroContext & Metadata['schemas'] & Ephemeral['schemas'] & Volatile['schemas'], Handle, UnionResponseStatus<Metadata['response'], UnionResponseStatus<Ephemeral['response'], UnionResponseStatus<Volatile['response'], MacroContext['return'] & {}>>>, [...Definitions['error'], ...Ephemeral['error'], ...Volatile['error']], Path>, UnhandledReturnedErrorOf<Handle, [...Definitions['error'], ...Ephemeral['error'], ...Volatile['error']]>>, Handle, [...Definitions['error'], ...Ephemeral['error'], ...Volatile['error']]> }>, Ephemeral, Volatile>;
1116
+ type AddRoute<BasePath extends string, Scope extends EventScope, Singleton extends SingletonBase, Definitions extends DefinitionBase, Metadata extends MetadataBase, Routes extends RouteBase, Ephemeral extends EphemeralType, Volatile extends EphemeralType, Method extends string, Path extends string, Schema extends RouteSchema, MacroContext extends RouteSchema, Handle> = Elysia<BasePath, Scope, Singleton, Definitions, Metadata, Routes & CreateRouteEden<BasePath, Path, { [method in Method]: WithHandledErrors<CreateEdenResponse<Path, Schema, MacroContext, ComposeElysiaResponse<Schema & MacroContext & Metadata['schemas'] & Ephemeral['schemas'] & Volatile['schemas'], Handle, UnionResponseStatus<Metadata['response'], UnionResponseStatus<Ephemeral['response'], UnionResponseStatus<Volatile['response'], MacroContext['return'] & {}>>>, [...Definitions['error'], ...Ephemeral['error'], ...Volatile['error']], Path>, UnhandledReturnedErrorOf<Handle, [...Definitions['error'], ...Ephemeral['error'], ...Volatile['error']]>>, Handle, [...Definitions['error'], ...Ephemeral['error'], ...Volatile['error']]> }>, Ephemeral, Volatile>;
1116
1117
  type HookContextSchema<Metadata extends MetadataBase, Ephemeral extends EphemeralType, Volatile extends EphemeralType, BasePath extends string> = MergeSchema<Volatile['schema'], MergeSchema<Ephemeral['schema'], Metadata['schema']>, BasePath> & Metadata['schemas'] & Ephemeral['schemas'] & Volatile['schemas'];
1117
1118
  type HookContextSingleton<Singleton extends SingletonBase, Ephemeral extends EphemeralType, Volatile extends EphemeralType> = Singleton & {
1118
1119
  derive: Ephemeral['derive'] & Volatile['derive'];
@@ -1213,7 +1214,7 @@ type ScopedMapDeriveReturn<HookScope extends EventScope, BasePath extends string
1213
1214
  response: UnionResponseStatus<Volatile['response'], ResponseAddition>;
1214
1215
  error: Volatile['error'];
1215
1216
  }>;
1216
- type AddWSRoute<BasePath extends string, Scope extends EventScope, Singleton extends SingletonBase, Definitions extends DefinitionBase, Metadata extends MetadataBase, Routes extends RouteBase, Ephemeral extends EphemeralType, Volatile extends EphemeralType, Path extends string, Schema extends RouteSchema, MacroContext extends RouteSchema, Response> = Elysia<BasePath, Scope, Singleton, Definitions, Metadata, Routes & CreateEden<JoinPath<BasePath, Path>, {
1217
+ type AddWSRoute<BasePath extends string, Scope extends EventScope, Singleton extends SingletonBase, Definitions extends DefinitionBase, Metadata extends MetadataBase, Routes extends RouteBase, Ephemeral extends EphemeralType, Volatile extends EphemeralType, Path extends string, Schema extends RouteSchema, MacroContext extends RouteSchema, Response> = Elysia<BasePath, Scope, Singleton, Definitions, Metadata, Routes & CreateRouteEden<BasePath, Path, {
1217
1218
  subscribe: CreateWSEdenResponse<Path, Schema, MacroContext, ComposeElysiaResponse<Schema & MacroContext & Metadata['schemas'] & Ephemeral['schemas'] & Volatile['schemas'], Response, UnionResponseStatus<Metadata['response'], UnionResponseStatus<Ephemeral['response'], UnionResponseStatus<Volatile['response'], MacroContext['return'] & {}>>>, [...Definitions['error'], ...Ephemeral['error'], ...Volatile['error']], Path>>;
1218
1219
  }>, Ephemeral, Volatile>;
1219
1220
  type GuardHookSingleton<Singleton extends SingletonBase, Ephemeral extends EphemeralType, Volatile extends EphemeralType, MacroContext> = Singleton & {
package/dist/utils.d.ts CHANGED
@@ -20,6 +20,8 @@ declare const isNotEmpty: <T extends Object>(obj?: T) => boolean | undefined;
20
20
  */
21
21
  declare function evictOldestHalf(cache: Map<any, any>): void;
22
22
  declare function fnv1a(str: string): number;
23
+ declare const compositionKeys: readonly string[];
24
+ declare function refTargets(roots: unknown[], models?: Record<string, unknown>): (name: string) => Iterable<unknown>;
23
25
  /**
24
26
  * Maps each lifecycle/derive function to the hash of the named plugin it was
25
27
  * first registered on. Used by `.use()` to dedup absorbed hooks: if a fn's
@@ -209,4 +211,4 @@ declare const isSocketQuiet: (socket: {
209
211
  }) => boolean;
210
212
  declare const isHTMLBundle: (value: unknown) => value is BunHTMLBundlelike;
211
213
  //#endregion
212
- export { ChainNode, CompactBeforeHandleChunk, CompactBeforeHandlePrefix, DeriveEntry, ELYSIA_FORM_PROTOTYPE, assignOwn, authorityEnd, bytes, clearFlattenChainMemo, cloneHook, clonePlainDecorators, clonePlainDeep, coalesceSchemas, compactBeforeHandleConflicts, compactBeforeHandlePrefix, constantTimeEqual, createErrorEventHandler, deriveEntryFn, eventProperties, evictOldestHalf, flattenChain, flattenChainMemo, flattenChainMemoReadonly, fnOrigin, fnv1a, form, formToFormData, getLoosePath, guardNonPlainLeaves, hookToGuard, invalidateMacroEpoch, isBlob, isByteStream, isCompactBeforeHandleOnly, isDisposable, isElysiaForm, isEmpty, isHTMLBundle, isLocalScope, isMapDeriveEntry, isNotEmpty, isPlainObject, isRecordNumber, isSingleton, isSocketQuiet, joinPath, macroEpoch, macroOrigin, mapDeriveEntry, markSingletons, mergeArray, mergeDeep, mergeHook, mergeResponse, nullObject, prefix, pushField, redirect, replaceUrlPath, requestId, rootSnapshot, schemaProperties, serializeMacroSeed, sse, sseData, throwLifecycleErrors };
214
+ export { ChainNode, CompactBeforeHandleChunk, CompactBeforeHandlePrefix, DeriveEntry, ELYSIA_FORM_PROTOTYPE, assignOwn, authorityEnd, bytes, clearFlattenChainMemo, cloneHook, clonePlainDecorators, clonePlainDeep, coalesceSchemas, compactBeforeHandleConflicts, compactBeforeHandlePrefix, compositionKeys, constantTimeEqual, createErrorEventHandler, deriveEntryFn, eventProperties, evictOldestHalf, flattenChain, flattenChainMemo, flattenChainMemoReadonly, fnOrigin, fnv1a, form, formToFormData, getLoosePath, guardNonPlainLeaves, hookToGuard, invalidateMacroEpoch, isBlob, isByteStream, isCompactBeforeHandleOnly, isDisposable, isElysiaForm, isEmpty, isHTMLBundle, isLocalScope, isMapDeriveEntry, isNotEmpty, isPlainObject, isRecordNumber, isSingleton, isSocketQuiet, joinPath, macroEpoch, macroOrigin, mapDeriveEntry, markSingletons, mergeArray, mergeDeep, mergeHook, mergeResponse, nullObject, prefix, pushField, redirect, refTargets, replaceUrlPath, requestId, rootSnapshot, schemaProperties, serializeMacroSeed, sse, sseData, throwLifecycleErrors };
package/dist/utils.js CHANGED
@@ -37,6 +37,27 @@ function fnv1a(str) {
37
37
  }
38
38
  return hash >>> 0;
39
39
  }
40
+ const compositionKeys = Object.freeze([
41
+ "allOf",
42
+ "anyOf",
43
+ "oneOf",
44
+ "~cookieFrom"
45
+ ]);
46
+ function refTargets(roots, models = {}) {
47
+ const targets = nullObject();
48
+ const add = (name, schema) => (targets[name] ??= /* @__PURE__ */ new Set()).add(schema);
49
+ const seen = /* @__PURE__ */ new Set();
50
+ const index = (node) => {
51
+ if (!node || typeof node !== "object" || seen.has(node)) return;
52
+ seen.add(node);
53
+ if (typeof node.$id === "string") add(node.$id.slice(node.$id.lastIndexOf("/") + 1), node);
54
+ for (const key in node) index(node[key]);
55
+ index(node["~cookieFrom"]);
56
+ };
57
+ for (const name in models) add(name, models[name]);
58
+ roots.concat(Object.values(models)).forEach(index);
59
+ return (name) => targets[name] ?? [];
60
+ }
40
61
  /**
41
62
  * Maps each lifecycle/derive function to the hash of the named plugin it was
42
63
  * first registered on. Used by `.use()` to dedup absorbed hooks: if a fn's
@@ -713,6 +734,7 @@ exports.clonePlainDeep = clonePlainDeep;
713
734
  exports.coalesceSchemas = coalesceSchemas;
714
735
  exports.compactBeforeHandleConflicts = compactBeforeHandleConflicts;
715
736
  exports.compactBeforeHandlePrefix = compactBeforeHandlePrefix;
737
+ exports.compositionKeys = compositionKeys;
716
738
  exports.constantTimeEqual = constantTimeEqual;
717
739
  exports.createErrorEventHandler = createErrorEventHandler;
718
740
  exports.deriveEntryFn = deriveEntryFn;
@@ -756,6 +778,7 @@ exports.nullObject = nullObject;
756
778
  exports.prefix = prefix;
757
779
  exports.pushField = pushField;
758
780
  exports.redirect = redirect;
781
+ exports.refTargets = refTargets;
759
782
  exports.replaceUrlPath = replaceUrlPath;
760
783
  exports.requestId = requestId;
761
784
  exports.rootSnapshot = rootSnapshot;
package/dist/utils.mjs CHANGED
@@ -36,6 +36,27 @@ function fnv1a(str) {
36
36
  }
37
37
  return hash >>> 0;
38
38
  }
39
+ const compositionKeys = Object.freeze([
40
+ "allOf",
41
+ "anyOf",
42
+ "oneOf",
43
+ "~cookieFrom"
44
+ ]);
45
+ function refTargets(roots, models = {}) {
46
+ const targets = nullObject();
47
+ const add = (name, schema) => (targets[name] ??= /* @__PURE__ */ new Set()).add(schema);
48
+ const seen = /* @__PURE__ */ new Set();
49
+ const index = (node) => {
50
+ if (!node || typeof node !== "object" || seen.has(node)) return;
51
+ seen.add(node);
52
+ if (typeof node.$id === "string") add(node.$id.slice(node.$id.lastIndexOf("/") + 1), node);
53
+ for (const key in node) index(node[key]);
54
+ index(node["~cookieFrom"]);
55
+ };
56
+ for (const name in models) add(name, models[name]);
57
+ roots.concat(Object.values(models)).forEach(index);
58
+ return (name) => targets[name] ?? [];
59
+ }
39
60
  /**
40
61
  * Maps each lifecycle/derive function to the hash of the named plugin it was
41
62
  * first registered on. Used by `.use()` to dedup absorbed hooks: if a fn's
@@ -701,4 +722,4 @@ const isSocketQuiet = (socket) => socket.readyState === 3 && !socket.data.inflig
701
722
  const isHTMLBundle = (value) => Object.prototype.toString.call(value) === "[object HTMLBundle]" || typeof value?.index === "string" && Array.isArray(value.files);
702
723
 
703
724
  //#endregion
704
- export { ELYSIA_FORM_PROTOTYPE, assignOwn, authorityEnd, bytes, clearFlattenChainMemo, cloneHook, clonePlainDecorators, clonePlainDeep, coalesceSchemas, compactBeforeHandleConflicts, compactBeforeHandlePrefix, constantTimeEqual, createErrorEventHandler, deriveEntryFn, eventProperties, evictOldestHalf, flattenChain, flattenChainMemo, flattenChainMemoReadonly, fnOrigin, fnv1a, form, formToFormData, getLoosePath, guardNonPlainLeaves, hookToGuard, invalidateMacroEpoch, isBlob, isByteStream, isCompactBeforeHandleOnly, isDisposable, isElysiaForm, isEmpty, isHTMLBundle, isLocalScope, isMapDeriveEntry, isNotEmpty, isPlainObject, isRecordNumber, isSingleton, isSocketQuiet, joinPath, macroEpoch, macroOrigin, mapDeriveEntry, markSingletons, mergeArray, mergeDeep, mergeHook, mergeResponse, nullObject, prefix, pushField, redirect, replaceUrlPath, requestId, rootSnapshot, schemaProperties, serializeMacroSeed, sse, sseData, throwLifecycleErrors };
725
+ export { ELYSIA_FORM_PROTOTYPE, assignOwn, authorityEnd, bytes, clearFlattenChainMemo, cloneHook, clonePlainDecorators, clonePlainDeep, coalesceSchemas, compactBeforeHandleConflicts, compactBeforeHandlePrefix, compositionKeys, constantTimeEqual, createErrorEventHandler, deriveEntryFn, eventProperties, evictOldestHalf, flattenChain, flattenChainMemo, flattenChainMemoReadonly, fnOrigin, fnv1a, form, formToFormData, getLoosePath, guardNonPlainLeaves, hookToGuard, invalidateMacroEpoch, isBlob, isByteStream, isCompactBeforeHandleOnly, isDisposable, isElysiaForm, isEmpty, isHTMLBundle, isLocalScope, isMapDeriveEntry, isNotEmpty, isPlainObject, isRecordNumber, isSingleton, isSocketQuiet, joinPath, macroEpoch, macroOrigin, mapDeriveEntry, markSingletons, mergeArray, mergeDeep, mergeHook, mergeResponse, nullObject, prefix, pushField, redirect, refTargets, replaceUrlPath, requestId, rootSnapshot, schemaProperties, serializeMacroSeed, sse, sseData, throwLifecycleErrors };
package/dist/ws/route.js CHANGED
@@ -6,9 +6,11 @@ const require_error = require('../error.js');
6
6
  const require_cookie_crypto = require('../cookie/crypto.js');
7
7
  const require_adapter_web_standard_handler = require('../adapter/web-standard/handler.js');
8
8
  const require_parse_query = require('../parse-query.js');
9
+ const require_compile_aot = require('../compile/aot.js');
9
10
  const require_generation = require('../generation.js');
10
11
  const require_cookie_config = require('../cookie/config.js');
11
12
  const require_cookie_utils = require('../cookie/utils.js');
13
+ const require_handler_utils = require('../handler/utils.js');
12
14
  const require_handler_error = require('../handler/error.js');
13
15
  const require_compile_handler_utils = require('../compile/handler/utils.js');
14
16
  const require_sucrose = require('../sucrose.js');
@@ -177,7 +179,21 @@ function buildWSRoute(route, app) {
177
179
  const inheritedChain = route[6];
178
180
  const composed = require_compile_handler_index.composeRouteHook(instance, route[4], appHookChain, inheritedChain, app, route[7]) ?? hook;
179
181
  let validators;
180
- const frozenEager = require_type_bridge.isBridgeLive() ? void 0 : require_compile_handler_frozen_validator.buildFrozenRouteValidator(composed, app, "WS", route[1]);
182
+ const programId = require_generation.frozenRootOf(app)["~programId"];
183
+ const captured = require_compile_aot.Compiled.getHandler(programId, "WS", route[1]);
184
+ let live = false;
185
+ if (require_compile_aot.Capture.isCapturing()) require_compile_aot.Capture.handler({
186
+ method: "WS",
187
+ path: route[1],
188
+ alias: "",
189
+ code: "",
190
+ k: require_compile_handler_index.routeShape(composed, void 0, app)
191
+ });
192
+ else if (require_compile_aot.Compiled.hasProgram(programId)) {
193
+ const shape = require_compile_handler_index.routeShape(composed, void 0, app);
194
+ live = shape === void 0 || captured?.k !== shape;
195
+ }
196
+ const frozenEager = require_type_bridge.isBridgeLive() || live ? void 0 : require_compile_handler_frozen_validator.buildFrozenRouteValidator(composed, app, "WS", route[1]);
181
197
  if (frozenEager) validators = frozenEager;
182
198
  else try {
183
199
  validators = new require_validator_route.RouteValidator(composed, {
@@ -186,7 +202,7 @@ function buildWSRoute(route, app) {
186
202
  normalize: require_generation.frozenRootOf(app)["~config"]?.normalize,
187
203
  sanitize: require_generation.frozenRootOf(app)["~config"]?.sanitize,
188
204
  schemas: composed.schemas,
189
- aot: {
205
+ aot: live ? void 0 : {
190
206
  method: "WS",
191
207
  path: route[1]
192
208
  },
@@ -194,10 +210,12 @@ function buildWSRoute(route, app) {
194
210
  });
195
211
  } catch (error) {
196
212
  if (!require_compile_handler_frozen_validator.isBridgeNotInitialized(error)) throw error;
213
+ if (live) throw new Error(require_compile_aot.aotDrift("WS", route[1]), { cause: error });
197
214
  const frozen = require_compile_handler_frozen_validator.buildFrozenRouteValidator(composed, app, "WS", route[1]);
198
215
  if (!frozen) throw error;
199
216
  validators = frozen;
200
217
  }
218
+ if (live && captured) require_compile_aot.warnAotDrift("WS", route[1]);
201
219
  const responseValidator = validators.response;
202
220
  const defaultResponseValidator = responseValidator ? responseValidator[200] ?? responseValidator[Object.keys(responseValidator)[0]] : void 0;
203
221
  const cookieIsOptional = !!composed.cookie?.["~optional"];
@@ -233,9 +251,14 @@ function buildWSRoute(route, app) {
233
251
  mapResponse: mapResponses,
234
252
  afterResponse: afterResponses
235
253
  });
236
- const cookieConfig = validators.cookie || inference.cookie ? require_cookie_config.compileCookieConfig(composed.cookie, require_generation.frozenRootOf(app)["~config"]?.cookie) : void 0;
254
+ const cookieConfig = validators.cookie || inference.cookie ? require_cookie_config.compileCookieConfig(composed.cookie, require_generation.frozenRootOf(app)["~config"]?.cookie, require_generation.frozenRootOf(app)["~ext"]?.models, composed.schemas) : void 0;
255
+ const signCookies = cookieConfig?.hasSign ? (set) => require_cookie_utils.signCookieValues(set.cookie, cookieConfig) : void 0;
237
256
  const parseMessage = require_ws_parser.createMessageParser(parseHooks);
238
- const handleUpgradeError = require_handler_error.createErrorHandler(errorHandlers.length ? errorHandlers : void 0, ((response, set, context) => require_adapter_web_standard_handler.mapResponse(response, set, context?.request)), require_generation.frozenRootOf(app)["~config"]?.allowUnsafeValidationDetails);
257
+ const handleUpgradeError = require_handler_error.createErrorHandler(errorHandlers.length ? errorHandlers : void 0, ((response, set, context) => {
258
+ const map = () => require_adapter_web_standard_handler.mapResponse(response, set, context?.request);
259
+ const pending = signCookies?.(set);
260
+ return pending ? pending.then(map) : map();
261
+ }), require_generation.frozenRootOf(app)["~config"]?.allowUnsafeValidationDetails);
239
262
  async function handleError(ws, error) {
240
263
  const errCtx = Object.create(ws);
241
264
  errCtx.error = error;
@@ -422,6 +445,7 @@ function buildWSRoute(route, app) {
422
445
  else require_utils.assignOwn(context, r);
423
446
  } else if (r !== void 0) {
424
447
  if (r instanceof Response) return r;
448
+ if (signCookies) await signCookies(context.set);
425
449
  return require_adapter_web_standard_handler.mapResponse(r, context.set, context.request);
426
450
  }
427
451
  }
@@ -454,7 +478,11 @@ function buildWSRoute(route, app) {
454
478
  }
455
479
  })) return new Response("Expected a websocket connection", { status: 400 });
456
480
  } catch (error) {
457
- return handleUpgradeError(context, error);
481
+ try {
482
+ return await handleUpgradeError(context, error);
483
+ } catch (thrown) {
484
+ return require_handler_utils.finalizeRouteError(app, context, thrown, signCookies);
485
+ }
458
486
  }
459
487
  };
460
488
  const options = require_utils.nullObject();
package/dist/ws/route.mjs CHANGED
@@ -5,16 +5,18 @@ import { ElysiaError, ElysiaStatus, ValidationError, elysiaErrorProblem, interna
5
5
  import { hasSyncHmac } from "../cookie/crypto.mjs";
6
6
  import { mapResponse } from "../adapter/web-standard/handler.mjs";
7
7
  import { parseQueryFromURL } from "../parse-query.mjs";
8
+ import { Capture, Compiled, aotDrift, warnAotDrift } from "../compile/aot.mjs";
8
9
  import { frozenRootOf } from "../generation.mjs";
9
10
  import { compileCookieConfig } from "../cookie/config.mjs";
10
- import { buildCookieJar, parseCookieRaw, parseCookieRawDeferred, parseCookieRawLazy } from "../cookie/utils.mjs";
11
+ import { buildCookieJar, parseCookieRaw, parseCookieRawDeferred, parseCookieRawLazy, signCookieValues } from "../cookie/utils.mjs";
12
+ import { finalizeRouteError } from "../handler/utils.mjs";
11
13
  import { adoptErrorType, claimsProblemType, createErrorHandler, readAnnotation, resolveStatus, statusFallbackBody } from "../handler/error.mjs";
12
14
  import { deriveModes, getQueryParseChannels, replaceDeriveContext } from "../compile/handler/utils.mjs";
13
15
  import { sucrose } from "../sucrose.mjs";
14
16
  import { StandardValidator } from "../validator/index.mjs";
15
17
  import { RouteValidator } from "../validator/route.mjs";
16
18
  import { buildFrozenRouteValidator, isBridgeNotInitialized } from "../compile/handler/frozen-validator.mjs";
17
- import { composeRouteHook, localMacroRoot, resolveWSLocalHook } from "../compile/handler/index.mjs";
19
+ import { composeRouteHook, localMacroRoot, resolveWSLocalHook, routeShape } from "../compile/handler/index.mjs";
18
20
  import { ElysiaWS, isGeneratorObject, trackWSSettling } from "./context.mjs";
19
21
  import { createMessageParser } from "./parser.mjs";
20
22
 
@@ -176,7 +178,21 @@ function buildWSRoute(route, app) {
176
178
  const inheritedChain = route[6];
177
179
  const composed = composeRouteHook(instance, route[4], appHookChain, inheritedChain, app, route[7]) ?? hook;
178
180
  let validators;
179
- const frozenEager = isBridgeLive() ? void 0 : buildFrozenRouteValidator(composed, app, "WS", route[1]);
181
+ const programId = frozenRootOf(app)["~programId"];
182
+ const captured = Compiled.getHandler(programId, "WS", route[1]);
183
+ let live = false;
184
+ if (Capture.isCapturing()) Capture.handler({
185
+ method: "WS",
186
+ path: route[1],
187
+ alias: "",
188
+ code: "",
189
+ k: routeShape(composed, void 0, app)
190
+ });
191
+ else if (Compiled.hasProgram(programId)) {
192
+ const shape = routeShape(composed, void 0, app);
193
+ live = shape === void 0 || captured?.k !== shape;
194
+ }
195
+ const frozenEager = isBridgeLive() || live ? void 0 : buildFrozenRouteValidator(composed, app, "WS", route[1]);
180
196
  if (frozenEager) validators = frozenEager;
181
197
  else try {
182
198
  validators = new RouteValidator(composed, {
@@ -185,7 +201,7 @@ function buildWSRoute(route, app) {
185
201
  normalize: frozenRootOf(app)["~config"]?.normalize,
186
202
  sanitize: frozenRootOf(app)["~config"]?.sanitize,
187
203
  schemas: composed.schemas,
188
- aot: {
204
+ aot: live ? void 0 : {
189
205
  method: "WS",
190
206
  path: route[1]
191
207
  },
@@ -193,10 +209,12 @@ function buildWSRoute(route, app) {
193
209
  });
194
210
  } catch (error) {
195
211
  if (!isBridgeNotInitialized(error)) throw error;
212
+ if (live) throw new Error(aotDrift("WS", route[1]), { cause: error });
196
213
  const frozen = buildFrozenRouteValidator(composed, app, "WS", route[1]);
197
214
  if (!frozen) throw error;
198
215
  validators = frozen;
199
216
  }
217
+ if (live && captured) warnAotDrift("WS", route[1]);
200
218
  const responseValidator = validators.response;
201
219
  const defaultResponseValidator = responseValidator ? responseValidator[200] ?? responseValidator[Object.keys(responseValidator)[0]] : void 0;
202
220
  const cookieIsOptional = !!composed.cookie?.["~optional"];
@@ -232,9 +250,14 @@ function buildWSRoute(route, app) {
232
250
  mapResponse: mapResponses,
233
251
  afterResponse: afterResponses
234
252
  });
235
- const cookieConfig = validators.cookie || inference.cookie ? compileCookieConfig(composed.cookie, frozenRootOf(app)["~config"]?.cookie) : void 0;
253
+ const cookieConfig = validators.cookie || inference.cookie ? compileCookieConfig(composed.cookie, frozenRootOf(app)["~config"]?.cookie, frozenRootOf(app)["~ext"]?.models, composed.schemas) : void 0;
254
+ const signCookies = cookieConfig?.hasSign ? (set) => signCookieValues(set.cookie, cookieConfig) : void 0;
236
255
  const parseMessage = createMessageParser(parseHooks);
237
- const handleUpgradeError = createErrorHandler(errorHandlers.length ? errorHandlers : void 0, ((response, set, context) => mapResponse(response, set, context?.request)), frozenRootOf(app)["~config"]?.allowUnsafeValidationDetails);
256
+ const handleUpgradeError = createErrorHandler(errorHandlers.length ? errorHandlers : void 0, ((response, set, context) => {
257
+ const map = () => mapResponse(response, set, context?.request);
258
+ const pending = signCookies?.(set);
259
+ return pending ? pending.then(map) : map();
260
+ }), frozenRootOf(app)["~config"]?.allowUnsafeValidationDetails);
238
261
  async function handleError(ws, error) {
239
262
  const errCtx = Object.create(ws);
240
263
  errCtx.error = error;
@@ -421,6 +444,7 @@ function buildWSRoute(route, app) {
421
444
  else assignOwn(context, r);
422
445
  } else if (r !== void 0) {
423
446
  if (r instanceof Response) return r;
447
+ if (signCookies) await signCookies(context.set);
424
448
  return mapResponse(r, context.set, context.request);
425
449
  }
426
450
  }
@@ -453,7 +477,11 @@ function buildWSRoute(route, app) {
453
477
  }
454
478
  })) return new Response("Expected a websocket connection", { status: 400 });
455
479
  } catch (error) {
456
- return handleUpgradeError(context, error);
480
+ try {
481
+ return await handleUpgradeError(context, error);
482
+ } catch (thrown) {
483
+ return finalizeRouteError(app, context, thrown, signCookies);
484
+ }
457
485
  }
458
486
  };
459
487
  const options = nullObject();
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "elysia",
3
3
  "description": "Ergonomic Framework for Human",
4
- "version": "2.0.0-beta.20",
4
+ "version": "2.0.0-beta.21",
5
5
  "author": {
6
6
  "name": "saltyAom",
7
7
  "url": "https://github.com/SaltyAom",