elysia 2.0.0-beta.2 → 2.0.0-beta.3

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 (145) hide show
  1. package/dist/adapter/utils.js +3 -3
  2. package/dist/adapter/utils.mjs +4 -4
  3. package/dist/adapter/web-standard/handler.js +5 -2
  4. package/dist/adapter/web-standard/handler.mjs +5 -2
  5. package/dist/base.d.ts +2 -2
  6. package/dist/base.js +42 -27
  7. package/dist/base.mjs +43 -28
  8. package/dist/compile/aot.d.ts +4 -4
  9. package/dist/compile/aot.js +14 -9
  10. package/dist/compile/aot.mjs +15 -9
  11. package/dist/compile/handler/descriptor.js +1 -1
  12. package/dist/compile/handler/descriptor.mjs +1 -1
  13. package/dist/compile/handler/index.d.ts +2 -2
  14. package/dist/compile/handler/index.js +6 -4
  15. package/dist/compile/handler/index.mjs +6 -4
  16. package/dist/compile/handler/utils.js +2 -2
  17. package/dist/compile/handler/utils.mjs +3 -3
  18. package/dist/context.js +3 -4
  19. package/dist/context.mjs +3 -4
  20. package/dist/cookie/config.d.ts +1 -0
  21. package/dist/cookie/config.js +3 -2
  22. package/dist/cookie/config.mjs +3 -2
  23. package/dist/cookie/cookie.d.ts +1 -0
  24. package/dist/cookie/cookie.js +6 -5
  25. package/dist/cookie/cookie.mjs +6 -5
  26. package/dist/cookie/crypto.d.ts +8 -7
  27. package/dist/cookie/crypto.js +38 -31
  28. package/dist/cookie/crypto.mjs +38 -32
  29. package/dist/cookie/error.js +1 -2
  30. package/dist/cookie/error.mjs +1 -2
  31. package/dist/cookie/lib.js +5 -1
  32. package/dist/cookie/lib.mjs +5 -1
  33. package/dist/cookie/serialize.js +1 -1
  34. package/dist/cookie/serialize.mjs +1 -1
  35. package/dist/cookie/types.d.ts +10 -0
  36. package/dist/cookie/utils.js +28 -14
  37. package/dist/cookie/utils.mjs +29 -15
  38. package/dist/handler/error.d.ts +23 -12
  39. package/dist/handler/error.js +24 -21
  40. package/dist/handler/error.mjs +20 -21
  41. package/dist/handler/fetch.js +6 -7
  42. package/dist/handler/fetch.mjs +7 -8
  43. package/dist/handler/utils.js +4 -2
  44. package/dist/handler/utils.mjs +5 -3
  45. package/dist/index.js +1 -8
  46. package/dist/package.js +1 -1
  47. package/dist/package.mjs +1 -1
  48. package/dist/plugin/aot/core.d.ts +22 -1
  49. package/dist/plugin/aot/core.js +35 -3
  50. package/dist/plugin/aot/core.mjs +35 -3
  51. package/dist/route-table.js +12 -10
  52. package/dist/route-table.mjs +12 -10
  53. package/dist/type/bridge-live.d.ts +1 -1
  54. package/dist/type/bridge-live.js +1 -1
  55. package/dist/type/bridge-live.mjs +1 -1
  56. package/dist/type/bridge.d.ts +1 -1
  57. package/dist/type/coerce-plan.js +3 -4
  58. package/dist/type/coerce-plan.mjs +1 -1
  59. package/dist/type/compat.d.ts +3 -0
  60. package/dist/type/compat.js +32 -14
  61. package/dist/type/compat.mjs +27 -8
  62. package/dist/type/elysia/array-buffer.js +2 -3
  63. package/dist/type/elysia/array-buffer.mjs +1 -1
  64. package/dist/type/elysia/array-string.js +7 -4
  65. package/dist/type/elysia/array-string.mjs +9 -5
  66. package/dist/type/elysia/boolean-string.js +2 -3
  67. package/dist/type/elysia/boolean-string.mjs +1 -1
  68. package/dist/type/elysia/boolean.js +4 -3
  69. package/dist/type/elysia/boolean.mjs +4 -2
  70. package/dist/type/elysia/cookie.js +2 -1
  71. package/dist/type/elysia/cookie.mjs +2 -1
  72. package/dist/type/elysia/date.js +7 -7
  73. package/dist/type/elysia/date.mjs +3 -2
  74. package/dist/type/elysia/file-type.d.ts +9 -2
  75. package/dist/type/elysia/file-type.js +16 -1
  76. package/dist/type/elysia/file-type.mjs +16 -2
  77. package/dist/type/elysia/file.js +8 -4
  78. package/dist/type/elysia/file.mjs +8 -3
  79. package/dist/type/elysia/files.js +6 -4
  80. package/dist/type/elysia/files.mjs +5 -2
  81. package/dist/type/elysia/form.js +2 -3
  82. package/dist/type/elysia/form.mjs +3 -3
  83. package/dist/type/elysia/integer-string.js +4 -5
  84. package/dist/type/elysia/integer-string.mjs +3 -3
  85. package/dist/type/elysia/integer.js +4 -3
  86. package/dist/type/elysia/integer.mjs +4 -2
  87. package/dist/type/elysia/maybe-empty.js +3 -4
  88. package/dist/type/elysia/maybe-empty.mjs +1 -1
  89. package/dist/type/elysia/nullable.js +2 -3
  90. package/dist/type/elysia/nullable.mjs +1 -1
  91. package/dist/type/elysia/number.js +4 -3
  92. package/dist/type/elysia/number.mjs +4 -2
  93. package/dist/type/elysia/numeric-enum.js +2 -3
  94. package/dist/type/elysia/numeric-enum.mjs +1 -1
  95. package/dist/type/elysia/numeric.js +5 -5
  96. package/dist/type/elysia/numeric.mjs +3 -2
  97. package/dist/type/elysia/object-string.js +7 -4
  98. package/dist/type/elysia/object-string.mjs +9 -5
  99. package/dist/type/elysia/string.js +4 -3
  100. package/dist/type/elysia/string.mjs +4 -2
  101. package/dist/type/elysia/uint8-array.js +2 -3
  102. package/dist/type/elysia/uint8-array.mjs +1 -1
  103. package/dist/type/elysia/union-enum.js +2 -3
  104. package/dist/type/elysia/union-enum.mjs +1 -1
  105. package/dist/type/elysia/utils.js +2 -3
  106. package/dist/type/elysia/utils.mjs +1 -1
  107. package/dist/type/exports.js +10 -1
  108. package/dist/type/exports.mjs +7 -0
  109. package/dist/type/index.d.ts +9 -1
  110. package/dist/type/index.js +41 -13
  111. package/dist/type/index.mjs +44 -9
  112. package/dist/type/typebox-type-live.d.ts +9 -0
  113. package/dist/type/typebox-type-live.js +31 -0
  114. package/dist/type/typebox-type-live.mjs +16 -0
  115. package/dist/type/typebox-type.d.ts +24 -0
  116. package/dist/type/typebox-type.js +130 -0
  117. package/dist/type/typebox-type.mjs +66 -0
  118. package/dist/type/typebox-value-live.d.ts +9 -0
  119. package/dist/type/typebox-value-live.js +27 -0
  120. package/dist/type/typebox-value-live.mjs +11 -0
  121. package/dist/type/typebox-value.d.ts +30 -0
  122. package/dist/type/typebox-value.js +147 -0
  123. package/dist/type/typebox-value.mjs +62 -0
  124. package/dist/type/validator/custom-error.js +4 -5
  125. package/dist/type/validator/custom-error.mjs +3 -3
  126. package/dist/type/validator/default-precompute.js +4 -5
  127. package/dist/type/validator/default-precompute.mjs +1 -1
  128. package/dist/type/validator/index.js +41 -35
  129. package/dist/type/validator/index.mjs +23 -16
  130. package/dist/type/validator/validator-cache.js +10 -5
  131. package/dist/type/validator/validator-cache.mjs +10 -4
  132. package/dist/universal/constants.d.ts +2 -1
  133. package/dist/universal/constants.js +3 -1
  134. package/dist/universal/constants.mjs +2 -1
  135. package/dist/utils.d.ts +10 -1
  136. package/dist/utils.js +18 -3
  137. package/dist/utils.mjs +14 -3
  138. package/dist/validator/index.js +2 -1
  139. package/dist/validator/index.mjs +2 -1
  140. package/dist/ws/context.d.ts +4 -0
  141. package/dist/ws/context.js +44 -26
  142. package/dist/ws/context.mjs +44 -26
  143. package/dist/ws/route.js +126 -23
  144. package/dist/ws/route.mjs +128 -25
  145. package/package.json +4 -2
@@ -1,11 +1,11 @@
1
1
  import { nullObject } from "../../utils.mjs";
2
- import { Check, Compile, Decode as Decode$1 } from "../bridge.mjs";
2
+ import { Check, Compile, Decode } from "../bridge.mjs";
3
3
  import { ELYSIA_TYPES } from "../constants.mjs";
4
+ import { Decode as Decode$1, Refine } from "../typebox-type.mjs";
4
5
  import { ArrayType } from "./array.mjs";
5
6
  import { StringType } from "./string.mjs";
6
7
  import { Union } from "./union.mjs";
7
8
  import { elyType, getMeta } from "./utils.mjs";
8
- import { Decode, Refine } from "typebox/type";
9
9
 
10
10
  //#region src/type/elysia/array-string.ts
11
11
  const MEMO_LIMIT = 8192;
@@ -26,25 +26,29 @@ function ArrayString(property, _options) {
26
26
  };
27
27
  let raw;
28
28
  let parsed;
29
- const arrayString = Decode(Refine(StringType(), (value) => {
29
+ const arrayString = Decode$1(Refine(StringType(), (value) => {
30
30
  if (value.charCodeAt(0) !== 91) return false;
31
31
  if (value === raw) return true;
32
32
  try {
33
33
  const next = JSON.parse(value);
34
- if (!checkInner(next)) return false;
34
+ if (!checkInner(next)) {
35
+ raw = parsed = void 0;
36
+ return false;
37
+ }
35
38
  if (value.length <= MEMO_LIMIT) {
36
39
  raw = value;
37
40
  parsed = next;
38
41
  }
39
42
  return true;
40
43
  } catch {
44
+ raw = parsed = void 0;
41
45
  return false;
42
46
  }
43
47
  }, () => "must be an array"), (value) => {
44
48
  const decoded = value === raw ? parsed : JSON.parse(value);
45
49
  raw = void 0;
46
50
  parsed = void 0;
47
- return Decode$1(array, decoded);
51
+ return Decode(array, decoded);
48
52
  });
49
53
  return elyType(ELYSIA_TYPES.ArrayString, Union([array, arrayString], meta));
50
54
  }
@@ -1,19 +1,18 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_runtime = require('../../_virtual/_rolldown/runtime.js');
3
2
  const require_utils = require('../../utils.js');
4
3
  const require_type_constants = require('../constants.js');
5
4
  const require_type_shared = require('../shared.js');
5
+ const require_type_typebox_type = require('../typebox-type.js');
6
6
  const require_type_elysia_string = require('./string.js');
7
7
  const require_type_elysia_union = require('./union.js');
8
8
  const require_type_elysia_utils = require('./utils.js');
9
9
  const require_type_elysia_boolean = require('./boolean.js');
10
- let typebox_type = require("typebox/type");
11
10
 
12
11
  //#region src/type/elysia/boolean-string.ts
13
12
  let StringifiedBoolean;
14
13
  let emptyBooleanString;
15
14
  function BooleanString(property) {
16
- StringifiedBoolean ??= require_type_shared.pureRefine((0, typebox_type.Decode)((0, typebox_type.Refine)(require_type_elysia_string.StringType(), (value) => value === "true" || value === "false", () => "must be boolean"), (value) => value === "true" ? true : false));
15
+ StringifiedBoolean ??= require_type_shared.pureRefine(require_type_typebox_type.Decode(require_type_typebox_type.Refine(require_type_elysia_string.StringType(), (value) => value === "true" || value === "false", () => "must be boolean"), (value) => value === "true" ? true : false));
17
16
  if (!property || require_utils.isEmpty(property)) return emptyBooleanString ??= Object.freeze(require_type_elysia_utils.elyType(require_type_constants.ELYSIA_TYPES.BooleanString, require_type_elysia_union.Union([require_type_elysia_boolean.BooleanType(), StringifiedBoolean])));
18
17
  const [, meta] = require_type_elysia_utils.getMeta(property);
19
18
  const boolean = require_type_elysia_boolean.BooleanType(property);
@@ -1,11 +1,11 @@
1
1
  import { isEmpty } from "../../utils.mjs";
2
2
  import { ELYSIA_TYPES } from "../constants.mjs";
3
3
  import { pureRefine } from "../shared.mjs";
4
+ import { Decode, Refine } from "../typebox-type.mjs";
4
5
  import { StringType } from "./string.mjs";
5
6
  import { Union } from "./union.mjs";
6
7
  import { elyType, getMeta } from "./utils.mjs";
7
8
  import { BooleanType } from "./boolean.mjs";
8
- import { Decode, Refine } from "typebox/type";
9
9
 
10
10
  //#region src/type/elysia/boolean-string.ts
11
11
  let StringifiedBoolean;
@@ -1,11 +1,12 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_runtime = require('../../_virtual/_rolldown/runtime.js');
3
2
  const require_utils = require('../../utils.js');
4
3
  const require_type_constants = require('../constants.js');
5
- let typebox_type = require("typebox/type");
6
4
 
7
5
  //#region src/type/elysia/boolean.ts
8
- const emptyBoolean = Object.freeze((0, typebox_type.Boolean)());
6
+ const emptyBoolean = Object.freeze(Object.defineProperty({
7
+ type: "boolean",
8
+ "~kind": "Boolean"
9
+ }, "~kind", require_type_constants.noEnumerable));
9
10
  function BooleanType(options) {
10
11
  if (!options || require_utils.isEmpty(options)) return emptyBoolean;
11
12
  const schema = {
@@ -1,9 +1,11 @@
1
1
  import { isEmpty } from "../../utils.mjs";
2
2
  import { noEnumerable } from "../constants.mjs";
3
- import { Boolean } from "typebox/type";
4
3
 
5
4
  //#region src/type/elysia/boolean.ts
6
- const emptyBoolean = Object.freeze(Boolean());
5
+ const emptyBoolean = Object.freeze(Object.defineProperty({
6
+ type: "boolean",
7
+ "~kind": "Boolean"
8
+ }, "~kind", noEnumerable));
7
9
  function BooleanType(options) {
8
10
  if (!options || isEmpty(options)) return emptyBoolean;
9
11
  const schema = {
@@ -13,7 +13,8 @@ const COOKIE_OPTION_KEYS = [
13
13
  "secure",
14
14
  "partitioned",
15
15
  "secrets",
16
- "sign"
16
+ "sign",
17
+ "legacySignature"
17
18
  ];
18
19
  function extractConfig(options) {
19
20
  if (!options) return {
@@ -12,7 +12,8 @@ const COOKIE_OPTION_KEYS = [
12
12
  "secure",
13
13
  "partitioned",
14
14
  "secrets",
15
- "sign"
15
+ "sign",
16
+ "legacySignature"
16
17
  ];
17
18
  function extractConfig(options) {
18
19
  if (!options) return {
@@ -1,11 +1,11 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_runtime = require('../../_virtual/_rolldown/runtime.js');
3
2
  const require_utils = require('../../utils.js');
4
3
  const require_type_constants = require('../constants.js');
4
+ const require_type_typebox_type = require('../typebox-type.js');
5
5
  const require_type_elysia_string = require('./string.js');
6
6
  const require_type_elysia_union = require('./union.js');
7
7
  const require_type_elysia_utils = require('./utils.js');
8
- let typebox_type = require("typebox/type");
8
+ const require_type_elysia_number = require('./number.js');
9
9
 
10
10
  //#region src/type/elysia/date.ts
11
11
  const ISO8601 = /T\d\d(?::\d\d){1,2} \d\d:\d\d$/;
@@ -20,14 +20,14 @@ let StringifiedDate;
20
20
  let emptyDate;
21
21
  let sharedDate;
22
22
  function DateType(property) {
23
- StringifiedDate ??= (0, typebox_type.Codec)(require_type_elysia_union.Union([
24
- (0, typebox_type.Refine)((0, typebox_type.Unsafe)({ "~kind": "Date" }), (value) => value instanceof Date, () => "must be Date"),
25
- (0, typebox_type.Refine)(require_type_elysia_string.StringType(), (value) => {
23
+ StringifiedDate ??= require_type_typebox_type.Codec(require_type_elysia_union.Union([
24
+ require_type_typebox_type.Refine(require_type_typebox_type.Unsafe({ "~kind": "Date" }), (value) => value instanceof Date, () => "must be Date"),
25
+ require_type_typebox_type.Refine(require_type_elysia_string.StringType(), (value) => {
26
26
  if (!isNaN(new Date(value).getTime())) return true;
27
27
  if (ISO8601.test(value)) return !isNaN(new Date(value.replace(removeTime, "+$1")).getTime());
28
28
  return false;
29
29
  }, () => "must be Date"),
30
- (0, typebox_type.Number)()
30
+ require_type_elysia_number.NumberType()
31
31
  ])).Decode((value) => {
32
32
  if (value instanceof Date) return value;
33
33
  let d = new Date(value);
@@ -56,7 +56,7 @@ function DateWithProperty(options) {
56
56
  let schema = StringifiedDate;
57
57
  if (minMessage || maxMessage || xMinMessage || xMaxMessage || stepMessage) {
58
58
  let failed = "must be Date";
59
- schema = (0, typebox_type.Refine)(schema, (value) => {
59
+ schema = require_type_typebox_type.Refine(schema, (value) => {
60
60
  const t = toTimestamp(value);
61
61
  if (minMessage && t < min) {
62
62
  failed = minMessage;
@@ -1,9 +1,10 @@
1
1
  import { isEmpty } from "../../utils.mjs";
2
2
  import { ELYSIA_TYPES } from "../constants.mjs";
3
+ import { Codec, Refine, Unsafe } from "../typebox-type.mjs";
3
4
  import { StringType } from "./string.mjs";
4
5
  import { Union } from "./union.mjs";
5
6
  import { cloneSchema, createSharedReference, elyType, getMeta } from "./utils.mjs";
6
- import { Codec, Number, Refine, Unsafe } from "typebox/type";
7
+ import { NumberType } from "./number.mjs";
7
8
 
8
9
  //#region src/type/elysia/date.ts
9
10
  const ISO8601 = /T\d\d(?::\d\d){1,2} \d\d:\d\d$/;
@@ -25,7 +26,7 @@ function DateType(property) {
25
26
  if (ISO8601.test(value)) return !isNaN(new Date(value.replace(removeTime, "+$1")).getTime());
26
27
  return false;
27
28
  }, () => "must be Date"),
28
- Number()
29
+ NumberType()
29
30
  ])).Decode((value) => {
30
31
  if (value instanceof Date) return value;
31
32
  let d = new Date(value);
@@ -13,13 +13,20 @@ interface PendingFileTypeCheck {
13
13
  * (identity walk on failure only) for a path-aware error */
14
14
  file: File;
15
15
  }
16
+ declare const MAX_QUEUED_FILE_TYPE_CHECKS = 64;
17
+ /** per-slot detector budget, reset on each validation pass via `epoch` */
18
+ interface FileTypeBudget {
19
+ epoch: number;
20
+ count: number;
21
+ limit: number;
22
+ }
16
23
  declare const ASYNC_REFINE = "~elyAsyncRefine";
17
24
  declare const isAsyncPredicate: (v: unknown) => boolean;
18
25
  declare function collectFileTypeChecks(): void;
19
26
  declare function takeFileTypeChecks(): PendingFileTypeCheck[] | undefined;
20
- declare function maybeQueueFileTypeCheck(value: File, types: FileType[], message: string): void;
27
+ declare function maybeQueueFileTypeCheck(value: File, types: FileType[], message: string, budget: FileTypeBudget): void;
21
28
  declare function matchesAnyFileType(mime: string, types: FileType[]): boolean;
22
29
  declare function checkFileExtension(type: string, extension: string): boolean;
23
30
  declare function parseFileUnit(size: FileUnit): number;
24
31
  //#endregion
25
- export { ASYNC_REFINE, FileTypeDetector, PendingFileTypeCheck, checkFileExtension, collectFileTypeChecks, fileType, isAsyncPredicate, matchesAnyFileType, maybeQueueFileTypeCheck, parseFileUnit, setFileTypeDetector, takeFileTypeChecks };
32
+ export { ASYNC_REFINE, FileTypeBudget, FileTypeDetector, MAX_QUEUED_FILE_TYPE_CHECKS, PendingFileTypeCheck, checkFileExtension, collectFileTypeChecks, fileType, isAsyncPredicate, matchesAnyFileType, maybeQueueFileTypeCheck, parseFileUnit, setFileTypeDetector, takeFileTypeChecks };
@@ -33,11 +33,14 @@ async function fileType(file, type) {
33
33
  return false;
34
34
  }
35
35
  let collecting = false;
36
+ let collectEpoch = 0;
36
37
  let pendingFileTypeChecks;
38
+ const MAX_QUEUED_FILE_TYPE_CHECKS = 64;
37
39
  const ASYNC_REFINE = "~elyAsyncRefine";
38
40
  const isAsyncPredicate = (v) => Array.isArray(v) ? v.some((x) => typeof x.check === "function" ? require_compile_utils.isAsyncFunction(x.check) || x.check["~elyAsyncRefine"] === true : false) : false;
39
41
  function collectFileTypeChecks() {
40
42
  collecting = true;
43
+ collectEpoch++;
41
44
  }
42
45
  function takeFileTypeChecks() {
43
46
  collecting = false;
@@ -45,8 +48,19 @@ function takeFileTypeChecks() {
45
48
  pendingFileTypeChecks = void 0;
46
49
  return pending;
47
50
  }
48
- function maybeQueueFileTypeCheck(value, types, message) {
51
+ function maybeQueueFileTypeCheck(value, types, message, budget) {
49
52
  if (!collecting) return;
53
+ if (budget.epoch !== collectEpoch) {
54
+ budget.epoch = collectEpoch;
55
+ budget.count = 0;
56
+ }
57
+ if (budget.count++ >= budget.limit) {
58
+ if (budget.count === budget.limit + 1) (pendingFileTypeChecks ??= []).push({
59
+ file: value,
60
+ check: Promise.resolve(`Expect at most ${budget.limit} files`)
61
+ });
62
+ return;
63
+ }
50
64
  if (!fileTypeDetectors) {
51
65
  if (!require_universal_is_production.isProduction() && !warnedMissingDetector) warnMissingFileTypeDetector();
52
66
  (pendingFileTypeChecks ??= []).push({
@@ -80,6 +94,7 @@ function parseFileUnit(size) {
80
94
 
81
95
  //#endregion
82
96
  exports.ASYNC_REFINE = ASYNC_REFINE;
97
+ exports.MAX_QUEUED_FILE_TYPE_CHECKS = MAX_QUEUED_FILE_TYPE_CHECKS;
83
98
  exports.checkFileExtension = checkFileExtension;
84
99
  exports.collectFileTypeChecks = collectFileTypeChecks;
85
100
  exports.fileType = fileType;
@@ -32,11 +32,14 @@ async function fileType(file, type) {
32
32
  return false;
33
33
  }
34
34
  let collecting = false;
35
+ let collectEpoch = 0;
35
36
  let pendingFileTypeChecks;
37
+ const MAX_QUEUED_FILE_TYPE_CHECKS = 64;
36
38
  const ASYNC_REFINE = "~elyAsyncRefine";
37
39
  const isAsyncPredicate = (v) => Array.isArray(v) ? v.some((x) => typeof x.check === "function" ? isAsyncFunction(x.check) || x.check["~elyAsyncRefine"] === true : false) : false;
38
40
  function collectFileTypeChecks() {
39
41
  collecting = true;
42
+ collectEpoch++;
40
43
  }
41
44
  function takeFileTypeChecks() {
42
45
  collecting = false;
@@ -44,8 +47,19 @@ function takeFileTypeChecks() {
44
47
  pendingFileTypeChecks = void 0;
45
48
  return pending;
46
49
  }
47
- function maybeQueueFileTypeCheck(value, types, message) {
50
+ function maybeQueueFileTypeCheck(value, types, message, budget) {
48
51
  if (!collecting) return;
52
+ if (budget.epoch !== collectEpoch) {
53
+ budget.epoch = collectEpoch;
54
+ budget.count = 0;
55
+ }
56
+ if (budget.count++ >= budget.limit) {
57
+ if (budget.count === budget.limit + 1) (pendingFileTypeChecks ??= []).push({
58
+ file: value,
59
+ check: Promise.resolve(`Expect at most ${budget.limit} files`)
60
+ });
61
+ return;
62
+ }
49
63
  if (!fileTypeDetectors) {
50
64
  if (!isProduction() && !warnedMissingDetector) warnMissingFileTypeDetector();
51
65
  (pendingFileTypeChecks ??= []).push({
@@ -78,4 +92,4 @@ function parseFileUnit(size) {
78
92
  }
79
93
 
80
94
  //#endregion
81
- export { ASYNC_REFINE, checkFileExtension, collectFileTypeChecks, fileType, isAsyncPredicate, matchesAnyFileType, maybeQueueFileTypeCheck, parseFileUnit, setFileTypeDetector, takeFileTypeChecks };
95
+ export { ASYNC_REFINE, MAX_QUEUED_FILE_TYPE_CHECKS, checkFileExtension, collectFileTypeChecks, fileType, isAsyncPredicate, matchesAnyFileType, maybeQueueFileTypeCheck, parseFileUnit, setFileTypeDetector, takeFileTypeChecks };
@@ -1,17 +1,16 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_runtime = require('../../_virtual/_rolldown/runtime.js');
3
2
  const require_utils = require('../../utils.js');
4
3
  const require_type_constants = require('../constants.js');
5
4
  const require_type_elysia_file_type = require('./file-type.js');
5
+ const require_type_typebox_type = require('../typebox-type.js');
6
6
  const require_type_elysia_utils = require('./utils.js');
7
- let typebox_type = require("typebox/type");
8
7
 
9
8
  //#region src/type/elysia/file.ts
10
9
  let BaseFile;
11
10
  let emptyFile;
12
11
  let sharedFile;
13
12
  function File(options) {
14
- BaseFile ??= (0, typebox_type.Refine)((0, typebox_type.Unsafe)({ "~kind": "File" }), require_utils.isBlob, () => "must be instance of Blob");
13
+ BaseFile ??= require_type_typebox_type.Refine(require_type_typebox_type.Unsafe({ "~kind": "File" }), require_utils.isBlob, () => "must be instance of Blob");
15
14
  if (!options || require_utils.isEmpty(options)) return emptyFile ??= Object.freeze(require_type_elysia_utils.elyType(require_type_constants.ELYSIA_TYPES.File, require_type_elysia_utils.cloneSchema(BaseFile)));
16
15
  sharedFile ??= require_type_elysia_utils.createSharedReference(FileWithProperty);
17
16
  return sharedFile(options);
@@ -29,9 +28,14 @@ function FileWithProperty(options) {
29
28
  if (options.type) {
30
29
  const types = typeof options.type === "string" ? [options.type] : options.type;
31
30
  const message = types.length === 1 ? `Expect file type to be ${types[0]}` : `Expect file type to be one of ${types.join(", ")}`;
31
+ const budget = {
32
+ epoch: -1,
33
+ count: 0,
34
+ limit: options.maxItems ?? 64
35
+ };
32
36
  const checkType = (value) => {
33
37
  if (!require_type_elysia_file_type.matchesAnyFileType(value.type, types)) return false;
34
- require_type_elysia_file_type.maybeQueueFileTypeCheck(value, types, message);
38
+ require_type_elysia_file_type.maybeQueueFileTypeCheck(value, types, message, budget);
35
39
  return true;
36
40
  };
37
41
  checkType[require_type_elysia_file_type.ASYNC_REFINE] = true;
@@ -1,8 +1,8 @@
1
1
  import { isBlob, isEmpty } from "../../utils.mjs";
2
2
  import { ELYSIA_TYPES } from "../constants.mjs";
3
- import { ASYNC_REFINE, checkFileExtension, collectFileTypeChecks, fileType, matchesAnyFileType, maybeQueueFileTypeCheck, parseFileUnit, setFileTypeDetector, takeFileTypeChecks } from "./file-type.mjs";
3
+ import { ASYNC_REFINE, MAX_QUEUED_FILE_TYPE_CHECKS, checkFileExtension, collectFileTypeChecks, fileType, matchesAnyFileType, maybeQueueFileTypeCheck, parseFileUnit, setFileTypeDetector, takeFileTypeChecks } from "./file-type.mjs";
4
+ import { Refine, Unsafe } from "../typebox-type.mjs";
4
5
  import { Refines, cloneSchema, createSharedReference, elyType, getMeta } from "./utils.mjs";
5
- import { Refine, Unsafe } from "typebox/type";
6
6
 
7
7
  //#region src/type/elysia/file.ts
8
8
  let BaseFile;
@@ -27,9 +27,14 @@ function FileWithProperty(options) {
27
27
  if (options.type) {
28
28
  const types = typeof options.type === "string" ? [options.type] : options.type;
29
29
  const message = types.length === 1 ? `Expect file type to be ${types[0]}` : `Expect file type to be one of ${types.join(", ")}`;
30
+ const budget = {
31
+ epoch: -1,
32
+ count: 0,
33
+ limit: options.maxItems ?? 64
34
+ };
30
35
  const checkType = (value) => {
31
36
  if (!matchesAnyFileType(value.type, types)) return false;
32
- maybeQueueFileTypeCheck(value, types, message);
37
+ maybeQueueFileTypeCheck(value, types, message, budget);
33
38
  return true;
34
39
  };
35
40
  checkType[ASYNC_REFINE] = true;
@@ -1,18 +1,17 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_runtime = require('../../_virtual/_rolldown/runtime.js');
3
2
  const require_utils = require('../../utils.js');
4
3
  const require_type_constants = require('../constants.js');
4
+ const require_type_typebox_type = require('../typebox-type.js');
5
5
  const require_type_elysia_array = require('./array.js');
6
6
  const require_type_elysia_union = require('./union.js');
7
7
  const require_type_elysia_utils = require('./utils.js');
8
8
  const require_type_elysia_file = require('./file.js');
9
- let typebox_type = require("typebox/type");
10
9
 
11
10
  //#region src/type/elysia/files.ts
12
11
  let BaseFiles;
13
12
  let emptyFiles;
14
13
  let sharedFiles;
15
- const filesUnion = (options) => require_type_elysia_union.Union([require_type_elysia_array.ArrayType(require_type_elysia_file.File(options)), (0, typebox_type.Decode)(require_type_elysia_file.File(options), (value) => [value])]);
14
+ const filesUnion = (options) => require_type_elysia_union.Union([require_type_elysia_array.ArrayType(require_type_elysia_file.File(options)), require_type_typebox_type.Decode(require_type_elysia_file.File(options), (value) => [value])]);
16
15
  function Files(options) {
17
16
  BaseFiles ??= filesUnion();
18
17
  if (!options || require_utils.isEmpty(options)) return emptyFiles ??= Object.freeze(require_type_elysia_utils.elyType(require_type_constants.ELYSIA_TYPES.Files, require_type_elysia_utils.cloneSchema(BaseFiles)));
@@ -21,7 +20,10 @@ function Files(options) {
21
20
  }
22
21
  function FilesWithProperty(options) {
23
22
  const fileOptions = {};
24
- if (options.type !== void 0) fileOptions.type = options.type;
23
+ if (options.type !== void 0) {
24
+ fileOptions.type = options.type;
25
+ if (options.maxItems !== void 0) fileOptions.maxItems = options.maxItems;
26
+ }
25
27
  if (options.minSize !== void 0) fileOptions.minSize = options.minSize;
26
28
  if (options.maxSize !== void 0) fileOptions.maxSize = options.maxSize;
27
29
  const base = require_utils.isEmpty(fileOptions) ? BaseFiles : filesUnion(fileOptions);
@@ -1,10 +1,10 @@
1
1
  import { isBlob, isEmpty } from "../../utils.mjs";
2
2
  import { ELYSIA_TYPES } from "../constants.mjs";
3
+ import { Decode } from "../typebox-type.mjs";
3
4
  import { ArrayType } from "./array.mjs";
4
5
  import { Union } from "./union.mjs";
5
6
  import { Refines, cloneSchema, createSharedReference, elyType, getMeta } from "./utils.mjs";
6
7
  import { File } from "./file.mjs";
7
- import { Decode } from "typebox/type";
8
8
 
9
9
  //#region src/type/elysia/files.ts
10
10
  let BaseFiles;
@@ -19,7 +19,10 @@ function Files(options) {
19
19
  }
20
20
  function FilesWithProperty(options) {
21
21
  const fileOptions = {};
22
- if (options.type !== void 0) fileOptions.type = options.type;
22
+ if (options.type !== void 0) {
23
+ fileOptions.type = options.type;
24
+ if (options.maxItems !== void 0) fileOptions.maxItems = options.maxItems;
25
+ }
23
26
  if (options.minSize !== void 0) fileOptions.minSize = options.minSize;
24
27
  if (options.maxSize !== void 0) fileOptions.maxSize = options.maxSize;
25
28
  const base = isEmpty(fileOptions) ? BaseFiles : filesUnion(fileOptions);
@@ -1,16 +1,15 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_runtime = require('../../_virtual/_rolldown/runtime.js');
3
2
  const require_utils = require('../../utils.js');
4
3
  const require_type_constants = require('../constants.js');
4
+ const require_type_typebox_type = require('../typebox-type.js');
5
5
  const require_type_elysia_utils = require('./utils.js');
6
6
  const require_type_elysia_object = require('./object.js');
7
7
  const require_type_elysia_intersect = require('./intersect.js');
8
- let typebox_type = require("typebox/type");
9
8
 
10
9
  //#region src/type/elysia/form.ts
11
10
  let BaseForm;
12
11
  const Form = (property, options) => {
13
- BaseForm ??= Object.freeze((0, typebox_type.Decode)((0, typebox_type.Refine)((0, typebox_type.Unsafe)({ "~kind": "FormData" }), (value) => require_utils.isElysiaForm(value), () => "must be instance of Elysia.form"), (value) => value));
12
+ BaseForm ??= Object.freeze(require_type_typebox_type.Decode(require_type_typebox_type.Refine(require_type_typebox_type.Unsafe({ "~kind": "FormData" }), (value) => require_utils.isElysiaForm(value), () => "must be instance of Elysia.form"), (value) => value));
14
13
  return require_type_elysia_utils.elyType(require_type_constants.ELYSIA_TYPES.Form, require_type_elysia_intersect.Intersect([BaseForm, require_type_elysia_object.ObjectType(property, options)]));
15
14
  };
16
15
 
@@ -1,15 +1,15 @@
1
1
  import { isElysiaForm } from "../../utils.mjs";
2
2
  import { ELYSIA_TYPES } from "../constants.mjs";
3
+ import { Decode, Refine, Unsafe } from "../typebox-type.mjs";
3
4
  import { elyType } from "./utils.mjs";
4
5
  import { ObjectType } from "./object.mjs";
5
- import { Intersect as Intersect$1 } from "./intersect.mjs";
6
- import { Decode, Refine, Unsafe } from "typebox/type";
6
+ import { Intersect } from "./intersect.mjs";
7
7
 
8
8
  //#region src/type/elysia/form.ts
9
9
  let BaseForm;
10
10
  const Form = (property, options) => {
11
11
  BaseForm ??= Object.freeze(Decode(Refine(Unsafe({ "~kind": "FormData" }), (value) => isElysiaForm(value), () => "must be instance of Elysia.form"), (value) => value));
12
- return elyType(ELYSIA_TYPES.Form, Intersect$1([BaseForm, ObjectType(property, options)]));
12
+ return elyType(ELYSIA_TYPES.Form, Intersect([BaseForm, ObjectType(property, options)]));
13
13
  };
14
14
 
15
15
  //#endregion
@@ -1,27 +1,26 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_runtime = require('../../_virtual/_rolldown/runtime.js');
3
2
  const require_utils = require('../../utils.js');
4
3
  const require_type_constants = require('../constants.js');
5
4
  const require_type_shared = require('../shared.js');
5
+ const require_type_typebox_type = require('../typebox-type.js');
6
6
  const require_type_elysia_string = require('./string.js');
7
7
  const require_type_elysia_union = require('./union.js');
8
8
  const require_type_elysia_utils = require('./utils.js');
9
9
  const require_type_elysia_number = require('./number.js');
10
10
  const require_type_elysia_integer = require('./integer.js');
11
- let typebox_type = require("typebox/type");
12
11
 
13
12
  //#region src/type/elysia/integer-string.ts
14
13
  let StringifiedInteger;
15
14
  let StrictInteger;
16
15
  let emptyIntegerString;
17
16
  function IntegerString(property) {
18
- StringifiedInteger ??= require_type_shared.pureRefine((0, typebox_type.Decode)((0, typebox_type.Refine)(require_type_elysia_string.StringType(), (value) => /^[+-]?\d+$/.test(value) && Number.isInteger(+value), () => "must be integer"), (value) => +value));
19
- StrictInteger ??= require_type_shared.pureRefine((0, typebox_type.Refine)(require_type_elysia_number.NumberType(), (value) => Number.isInteger(value), () => "must be integer"));
17
+ StringifiedInteger ??= require_type_shared.pureRefine(require_type_typebox_type.Decode(require_type_typebox_type.Refine(require_type_elysia_string.StringType(), (value) => /^[+-]?\d+$/.test(value) && Number.isInteger(+value), () => "must be integer"), (value) => +value));
18
+ StrictInteger ??= require_type_shared.pureRefine(require_type_typebox_type.Refine(require_type_elysia_number.NumberType(), (value) => Number.isInteger(value), () => "must be integer"));
20
19
  if (!property || require_utils.isEmpty(property)) return emptyIntegerString ??= Object.freeze(require_type_elysia_utils.elyType(require_type_constants.ELYSIA_TYPES.Integer, require_type_elysia_union.Union([StrictInteger, StringifiedInteger])));
21
20
  const [constraints, meta] = require_type_elysia_utils.getMeta(property);
22
21
  const integer = require_type_elysia_integer.Integer(constraints);
23
22
  const c = constraints;
24
- const stringified = (0, typebox_type.Decode)((0, typebox_type.Refine)(require_type_elysia_string.StringType(), (value) => {
23
+ const stringified = require_type_typebox_type.Decode(require_type_typebox_type.Refine(require_type_elysia_string.StringType(), (value) => {
25
24
  if (!/^[+-]?\d+$/.test(value)) return false;
26
25
  const n = +value;
27
26
  if (!Number.isInteger(n)) return false;
@@ -1,12 +1,12 @@
1
1
  import { isEmpty } from "../../utils.mjs";
2
2
  import { ELYSIA_TYPES } from "../constants.mjs";
3
3
  import { pureRefine } from "../shared.mjs";
4
+ import { Decode, Refine } from "../typebox-type.mjs";
4
5
  import { StringType } from "./string.mjs";
5
6
  import { Union } from "./union.mjs";
6
7
  import { elyType, getMeta } from "./utils.mjs";
7
8
  import { NumberType } from "./number.mjs";
8
- import { Integer as Integer$1 } from "./integer.mjs";
9
- import { Decode, Refine } from "typebox/type";
9
+ import { Integer } from "./integer.mjs";
10
10
 
11
11
  //#region src/type/elysia/integer-string.ts
12
12
  let StringifiedInteger;
@@ -17,7 +17,7 @@ function IntegerString(property) {
17
17
  StrictInteger ??= pureRefine(Refine(NumberType(), (value) => Number.isInteger(value), () => "must be integer"));
18
18
  if (!property || isEmpty(property)) return emptyIntegerString ??= Object.freeze(elyType(ELYSIA_TYPES.Integer, Union([StrictInteger, StringifiedInteger])));
19
19
  const [constraints, meta] = getMeta(property);
20
- const integer = Integer$1(constraints);
20
+ const integer = Integer(constraints);
21
21
  const c = constraints;
22
22
  const stringified = Decode(Refine(StringType(), (value) => {
23
23
  if (!/^[+-]?\d+$/.test(value)) return false;
@@ -1,11 +1,12 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_runtime = require('../../_virtual/_rolldown/runtime.js');
3
2
  const require_utils = require('../../utils.js');
4
3
  const require_type_constants = require('../constants.js');
5
- let typebox_type = require("typebox/type");
6
4
 
7
5
  //#region src/type/elysia/integer.ts
8
- const emptyInteger = Object.freeze((0, typebox_type.Integer)());
6
+ const emptyInteger = Object.freeze(Object.defineProperty({
7
+ type: "integer",
8
+ "~kind": "Integer"
9
+ }, "~kind", require_type_constants.noEnumerable));
9
10
  function Integer(options) {
10
11
  if (!options || require_utils.isEmpty(options)) return emptyInteger;
11
12
  const schema = {
@@ -1,9 +1,11 @@
1
1
  import { isEmpty } from "../../utils.mjs";
2
2
  import { noEnumerable } from "../constants.mjs";
3
- import { Integer as Integer$1 } from "typebox/type";
4
3
 
5
4
  //#region src/type/elysia/integer.ts
6
- const emptyInteger = Object.freeze(Integer$1());
5
+ const emptyInteger = Object.freeze(Object.defineProperty({
6
+ type: "integer",
7
+ "~kind": "Integer"
8
+ }, "~kind", noEnumerable));
7
9
  function Integer(options) {
8
10
  if (!options || isEmpty(options)) return emptyInteger;
9
11
  const schema = {
@@ -1,16 +1,15 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_runtime = require('../../_virtual/_rolldown/runtime.js');
3
2
  const require_type_constants = require('../constants.js');
3
+ const require_type_typebox_type = require('../typebox-type.js');
4
4
  const require_type_elysia_union = require('./union.js');
5
5
  const require_type_elysia_utils = require('./utils.js');
6
- let typebox_type = require("typebox/type");
7
6
 
8
7
  //#region src/type/elysia/maybe-empty.ts
9
8
  function MaybeEmpty(schema, options) {
10
9
  return require_type_elysia_utils.elyType(require_type_constants.ELYSIA_TYPES.MaybeEmpty, require_type_elysia_union.Union([
11
10
  schema,
12
- (0, typebox_type.Null)(),
13
- (0, typebox_type.Undefined)()
11
+ require_type_typebox_type.Null(),
12
+ require_type_typebox_type.Undefined()
14
13
  ], {
15
14
  ...options,
16
15
  nullable: true
@@ -1,7 +1,7 @@
1
1
  import { ELYSIA_TYPES } from "../constants.mjs";
2
+ import { Null, Undefined } from "../typebox-type.mjs";
2
3
  import { Union } from "./union.mjs";
3
4
  import { elyType } from "./utils.mjs";
4
- import { Null, Undefined } from "typebox/type";
5
5
 
6
6
  //#region src/type/elysia/maybe-empty.ts
7
7
  function MaybeEmpty(schema, options) {
@@ -1,12 +1,11 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_runtime = require('../../_virtual/_rolldown/runtime.js');
3
2
  const require_type_constants = require('../constants.js');
3
+ const require_type_typebox_type = require('../typebox-type.js');
4
4
  const require_type_elysia_union = require('./union.js');
5
5
  const require_type_elysia_utils = require('./utils.js');
6
- let typebox_type = require("typebox/type");
7
6
 
8
7
  //#region src/type/elysia/nullable.ts
9
- const Nullable = (schema, options) => require_type_elysia_utils.elyType(require_type_constants.ELYSIA_TYPES.Nullable, require_type_elysia_union.Union([schema, (0, typebox_type.Null)()], {
8
+ const Nullable = (schema, options) => require_type_elysia_utils.elyType(require_type_constants.ELYSIA_TYPES.Nullable, require_type_elysia_union.Union([schema, require_type_typebox_type.Null()], {
10
9
  ...options,
11
10
  nullable: true
12
11
  }));
@@ -1,7 +1,7 @@
1
1
  import { ELYSIA_TYPES } from "../constants.mjs";
2
+ import { Null } from "../typebox-type.mjs";
2
3
  import { Union } from "./union.mjs";
3
4
  import { elyType } from "./utils.mjs";
4
- import { Null } from "typebox/type";
5
5
 
6
6
  //#region src/type/elysia/nullable.ts
7
7
  const Nullable = (schema, options) => elyType(ELYSIA_TYPES.Nullable, Union([schema, Null()], {
@@ -1,11 +1,12 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_runtime = require('../../_virtual/_rolldown/runtime.js');
3
2
  const require_utils = require('../../utils.js');
4
3
  const require_type_constants = require('../constants.js');
5
- let typebox_type = require("typebox/type");
6
4
 
7
5
  //#region src/type/elysia/number.ts
8
- const emptyNumber = Object.freeze((0, typebox_type.Number)());
6
+ const emptyNumber = Object.freeze(Object.defineProperty({
7
+ type: "number",
8
+ "~kind": "Number"
9
+ }, "~kind", require_type_constants.noEnumerable));
9
10
  function NumberType(options) {
10
11
  if (!options || require_utils.isEmpty(options)) return emptyNumber;
11
12
  const schema = {