@atproto/lex-schema 0.0.9 → 0.0.11

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 (280) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/LICENSE.txt +1 -1
  3. package/dist/core/$type.d.ts +11 -0
  4. package/dist/core/$type.d.ts.map +1 -1
  5. package/dist/core/$type.js +4 -0
  6. package/dist/core/$type.js.map +1 -1
  7. package/dist/core/schema.d.ts +31 -24
  8. package/dist/core/schema.d.ts.map +1 -1
  9. package/dist/core/schema.js +38 -8
  10. package/dist/core/schema.js.map +1 -1
  11. package/dist/core/string-format.d.ts +35 -35
  12. package/dist/core/string-format.d.ts.map +1 -1
  13. package/dist/core/string-format.js +49 -91
  14. package/dist/core/string-format.js.map +1 -1
  15. package/dist/core/validation-error.d.ts +1 -1
  16. package/dist/core/validation-issue.js +1 -1
  17. package/dist/core/validation-issue.js.map +1 -1
  18. package/dist/core/validator.d.ts +53 -32
  19. package/dist/core/validator.d.ts.map +1 -1
  20. package/dist/core/validator.js +18 -22
  21. package/dist/core/validator.js.map +1 -1
  22. package/dist/external.d.ts +0 -85
  23. package/dist/external.d.ts.map +1 -1
  24. package/dist/external.js +0 -164
  25. package/dist/external.js.map +1 -1
  26. package/dist/helpers.d.ts +13 -5
  27. package/dist/helpers.d.ts.map +1 -1
  28. package/dist/helpers.js +4 -4
  29. package/dist/helpers.js.map +1 -1
  30. package/dist/schema/array.d.ts +9 -5
  31. package/dist/schema/array.d.ts.map +1 -1
  32. package/dist/schema/array.js +14 -5
  33. package/dist/schema/array.js.map +1 -1
  34. package/dist/schema/blob.d.ts +9 -7
  35. package/dist/schema/blob.d.ts.map +1 -1
  36. package/dist/schema/blob.js +9 -5
  37. package/dist/schema/blob.js.map +1 -1
  38. package/dist/schema/boolean.d.ts +3 -7
  39. package/dist/schema/boolean.d.ts.map +1 -1
  40. package/dist/schema/boolean.js +6 -7
  41. package/dist/schema/boolean.js.map +1 -1
  42. package/dist/schema/bytes.d.ts +3 -2
  43. package/dist/schema/bytes.d.ts.map +1 -1
  44. package/dist/schema/bytes.js +7 -3
  45. package/dist/schema/bytes.js.map +1 -1
  46. package/dist/schema/cid.d.ts +7 -7
  47. package/dist/schema/cid.d.ts.map +1 -1
  48. package/dist/schema/cid.js +5 -1
  49. package/dist/schema/cid.js.map +1 -1
  50. package/dist/schema/custom.d.ts +6 -5
  51. package/dist/schema/custom.d.ts.map +1 -1
  52. package/dist/schema/custom.js +10 -4
  53. package/dist/schema/custom.js.map +1 -1
  54. package/dist/schema/dict.d.ts +8 -8
  55. package/dist/schema/dict.d.ts.map +1 -1
  56. package/dist/schema/dict.js +11 -2
  57. package/dist/schema/dict.js.map +1 -1
  58. package/dist/schema/discriminated-union.d.ts +21 -14
  59. package/dist/schema/discriminated-union.d.ts.map +1 -1
  60. package/dist/schema/discriminated-union.js +7 -0
  61. package/dist/schema/discriminated-union.js.map +1 -1
  62. package/dist/schema/enum.d.ts +7 -9
  63. package/dist/schema/enum.d.ts.map +1 -1
  64. package/dist/schema/enum.js +8 -4
  65. package/dist/schema/enum.js.map +1 -1
  66. package/dist/schema/integer.d.ts +5 -5
  67. package/dist/schema/integer.d.ts.map +1 -1
  68. package/dist/schema/integer.js +9 -5
  69. package/dist/schema/integer.js.map +1 -1
  70. package/dist/schema/intersection.d.ts +4 -4
  71. package/dist/schema/intersection.d.ts.map +1 -1
  72. package/dist/schema/intersection.js +5 -0
  73. package/dist/schema/intersection.js.map +1 -1
  74. package/dist/schema/literal.d.ts +6 -9
  75. package/dist/schema/literal.d.ts.map +1 -1
  76. package/dist/schema/literal.js +7 -4
  77. package/dist/schema/literal.js.map +1 -1
  78. package/dist/schema/never.d.ts +3 -2
  79. package/dist/schema/never.d.ts.map +1 -1
  80. package/dist/schema/never.js +5 -1
  81. package/dist/schema/never.js.map +1 -1
  82. package/dist/schema/null.d.ts +4 -3
  83. package/dist/schema/null.d.ts.map +1 -1
  84. package/dist/schema/null.js +6 -4
  85. package/dist/schema/null.js.map +1 -1
  86. package/dist/schema/nullable.d.ts +6 -5
  87. package/dist/schema/nullable.d.ts.map +1 -1
  88. package/dist/schema/nullable.js +9 -5
  89. package/dist/schema/nullable.js.map +1 -1
  90. package/dist/schema/object.d.ts +10 -8
  91. package/dist/schema/object.d.ts.map +1 -1
  92. package/dist/schema/object.js +11 -3
  93. package/dist/schema/object.js.map +1 -1
  94. package/dist/schema/optional.d.ts +7 -5
  95. package/dist/schema/optional.d.ts.map +1 -1
  96. package/dist/schema/optional.js +14 -6
  97. package/dist/schema/optional.js.map +1 -1
  98. package/dist/schema/params.d.ts +26 -13
  99. package/dist/schema/params.d.ts.map +1 -1
  100. package/dist/schema/params.js +47 -25
  101. package/dist/schema/params.js.map +1 -1
  102. package/dist/schema/payload.d.ts +12 -9
  103. package/dist/schema/payload.d.ts.map +1 -1
  104. package/dist/schema/payload.js +11 -0
  105. package/dist/schema/payload.js.map +1 -1
  106. package/dist/schema/permission-set.d.ts +1 -0
  107. package/dist/schema/permission-set.d.ts.map +1 -1
  108. package/dist/schema/permission-set.js +5 -0
  109. package/dist/schema/permission-set.js.map +1 -1
  110. package/dist/schema/permission.d.ts +6 -5
  111. package/dist/schema/permission.d.ts.map +1 -1
  112. package/dist/schema/permission.js +5 -0
  113. package/dist/schema/permission.js.map +1 -1
  114. package/dist/schema/procedure.d.ts +2 -1
  115. package/dist/schema/procedure.d.ts.map +1 -1
  116. package/dist/schema/procedure.js +5 -0
  117. package/dist/schema/procedure.js.map +1 -1
  118. package/dist/schema/query.d.ts +2 -1
  119. package/dist/schema/query.d.ts.map +1 -1
  120. package/dist/schema/query.js +5 -0
  121. package/dist/schema/query.js.map +1 -1
  122. package/dist/schema/record.d.ts +48 -30
  123. package/dist/schema/record.d.ts.map +1 -1
  124. package/dist/schema/record.js +12 -9
  125. package/dist/schema/record.js.map +1 -1
  126. package/dist/schema/ref.d.ts +9 -6
  127. package/dist/schema/ref.d.ts.map +1 -1
  128. package/dist/schema/ref.js +9 -16
  129. package/dist/schema/ref.js.map +1 -1
  130. package/dist/schema/refine.d.ts +4 -4
  131. package/dist/schema/refine.d.ts.map +1 -1
  132. package/dist/schema/refine.js.map +1 -1
  133. package/dist/schema/regexp.d.ts +4 -3
  134. package/dist/schema/regexp.d.ts.map +1 -1
  135. package/dist/schema/regexp.js +5 -0
  136. package/dist/schema/regexp.js.map +1 -1
  137. package/dist/schema/string.d.ts +7 -8
  138. package/dist/schema/string.d.ts.map +1 -1
  139. package/dist/schema/string.js +13 -19
  140. package/dist/schema/string.js.map +1 -1
  141. package/dist/schema/subscription.d.ts +2 -1
  142. package/dist/schema/subscription.d.ts.map +1 -1
  143. package/dist/schema/subscription.js +5 -0
  144. package/dist/schema/subscription.js.map +1 -1
  145. package/dist/schema/token.d.ts +6 -5
  146. package/dist/schema/token.d.ts.map +1 -1
  147. package/dist/schema/token.js +5 -0
  148. package/dist/schema/token.js.map +1 -1
  149. package/dist/schema/typed-object.d.ts +43 -26
  150. package/dist/schema/typed-object.d.ts.map +1 -1
  151. package/dist/schema/typed-object.js +6 -3
  152. package/dist/schema/typed-object.js.map +1 -1
  153. package/dist/schema/typed-ref.d.ts +16 -25
  154. package/dist/schema/typed-ref.d.ts.map +1 -1
  155. package/dist/schema/typed-ref.js +7 -17
  156. package/dist/schema/typed-ref.js.map +1 -1
  157. package/dist/schema/typed-union.d.ts +9 -21
  158. package/dist/schema/typed-union.d.ts.map +1 -1
  159. package/dist/schema/typed-union.js +15 -11
  160. package/dist/schema/typed-union.js.map +1 -1
  161. package/dist/schema/union.d.ts +6 -6
  162. package/dist/schema/union.d.ts.map +1 -1
  163. package/dist/schema/union.js +7 -5
  164. package/dist/schema/union.js.map +1 -1
  165. package/dist/schema/unknown-object.d.ts +5 -4
  166. package/dist/schema/unknown-object.d.ts.map +1 -1
  167. package/dist/schema/unknown-object.js +5 -1
  168. package/dist/schema/unknown-object.js.map +1 -1
  169. package/dist/schema/unknown.d.ts +3 -2
  170. package/dist/schema/unknown.d.ts.map +1 -1
  171. package/dist/schema/unknown.js +5 -1
  172. package/dist/schema/unknown.js.map +1 -1
  173. package/dist/schema/with-default.d.ts +9 -0
  174. package/dist/schema/with-default.d.ts.map +1 -0
  175. package/dist/schema/with-default.js +27 -0
  176. package/dist/schema/with-default.js.map +1 -0
  177. package/dist/schema.d.ts +2 -2
  178. package/dist/schema.d.ts.map +1 -1
  179. package/dist/schema.js +2 -4
  180. package/dist/schema.js.map +1 -1
  181. package/dist/util/assertion-util.d.ts +0 -6
  182. package/dist/util/assertion-util.d.ts.map +1 -1
  183. package/dist/util/assertion-util.js +0 -28
  184. package/dist/util/assertion-util.js.map +1 -1
  185. package/dist/util/memoize.d.ts +2 -2
  186. package/dist/util/memoize.d.ts.map +1 -1
  187. package/dist/util/memoize.js +23 -39
  188. package/dist/util/memoize.js.map +1 -1
  189. package/package.json +3 -3
  190. package/src/core/$type.test.ts +20 -0
  191. package/src/core/$type.ts +30 -0
  192. package/src/core/schema.ts +86 -38
  193. package/src/core/string-format.ts +119 -158
  194. package/src/core/validation-issue.ts +1 -1
  195. package/src/core/validator.ts +93 -53
  196. package/src/external.ts +0 -404
  197. package/src/helpers.test.ts +22 -21
  198. package/src/helpers.ts +19 -14
  199. package/src/schema/array.test.ts +38 -40
  200. package/src/schema/array.ts +35 -13
  201. package/src/schema/blob.test.ts +21 -21
  202. package/src/schema/blob.ts +19 -17
  203. package/src/schema/boolean.test.ts +9 -8
  204. package/src/schema/boolean.ts +7 -13
  205. package/src/schema/bytes.test.ts +13 -13
  206. package/src/schema/bytes.ts +13 -8
  207. package/src/schema/cid.test.ts +3 -3
  208. package/src/schema/cid.ts +13 -12
  209. package/src/schema/custom.test.ts +26 -26
  210. package/src/schema/custom.ts +20 -13
  211. package/src/schema/dict.test.ts +21 -39
  212. package/src/schema/dict.ts +28 -19
  213. package/src/schema/discriminated-union.test.ts +128 -128
  214. package/src/schema/discriminated-union.ts +45 -26
  215. package/src/schema/enum.test.ts +17 -16
  216. package/src/schema/enum.ts +16 -16
  217. package/src/schema/integer.test.ts +22 -21
  218. package/src/schema/integer.ts +12 -9
  219. package/src/schema/intersection.test.ts +10 -10
  220. package/src/schema/intersection.ts +17 -14
  221. package/src/schema/literal.test.ts +35 -34
  222. package/src/schema/literal.ts +12 -15
  223. package/src/schema/never.test.ts +5 -5
  224. package/src/schema/never.ts +7 -2
  225. package/src/schema/null.test.ts +3 -3
  226. package/src/schema/null.ts +9 -9
  227. package/src/schema/nullable.test.ts +31 -42
  228. package/src/schema/nullable.ts +17 -9
  229. package/src/schema/object.test.ts +10 -12
  230. package/src/schema/object.ts +27 -18
  231. package/src/schema/optional.test.ts +21 -28
  232. package/src/schema/optional.ts +27 -10
  233. package/src/schema/params.test.ts +471 -47
  234. package/src/schema/params.ts +74 -38
  235. package/src/schema/payload.test.ts +150 -156
  236. package/src/schema/payload.ts +35 -19
  237. package/src/schema/permission-set.test.ts +206 -273
  238. package/src/schema/permission-set.ts +8 -0
  239. package/src/schema/permission.test.ts +177 -177
  240. package/src/schema/permission.ts +13 -5
  241. package/src/schema/procedure.test.ts +183 -242
  242. package/src/schema/procedure.ts +18 -5
  243. package/src/schema/query.test.ts +186 -200
  244. package/src/schema/query.ts +16 -4
  245. package/src/schema/record.test.ts +121 -101
  246. package/src/schema/record.ts +74 -40
  247. package/src/schema/ref.test.ts +101 -118
  248. package/src/schema/ref.ts +33 -28
  249. package/src/schema/refine.test.ts +28 -28
  250. package/src/schema/refine.ts +23 -20
  251. package/src/schema/regexp.test.ts +29 -33
  252. package/src/schema/regexp.ts +11 -7
  253. package/src/schema/string.test.ts +35 -35
  254. package/src/schema/string.ts +24 -33
  255. package/src/schema/subscription.test.ts +259 -387
  256. package/src/schema/subscription.ts +16 -4
  257. package/src/schema/token.test.ts +47 -324
  258. package/src/schema/token.ts +14 -7
  259. package/src/schema/typed-object.test.ts +98 -81
  260. package/src/schema/typed-object.ts +68 -33
  261. package/src/schema/typed-ref.test.ts +206 -234
  262. package/src/schema/typed-ref.ts +40 -42
  263. package/src/schema/typed-union.test.ts +40 -64
  264. package/src/schema/typed-union.ts +36 -58
  265. package/src/schema/union.test.ts +17 -27
  266. package/src/schema/union.ts +20 -16
  267. package/src/schema/unknown-object.test.ts +8 -8
  268. package/src/schema/unknown-object.ts +9 -7
  269. package/src/schema/unknown.test.ts +4 -4
  270. package/src/schema/unknown.ts +7 -5
  271. package/src/schema/with-default.ts +35 -0
  272. package/src/schema.ts +2 -6
  273. package/src/util/assertion-util.ts +0 -39
  274. package/src/util/memoize.ts +26 -46
  275. package/dist/schema/_parameters.d.ts +0 -17
  276. package/dist/schema/_parameters.d.ts.map +0 -1
  277. package/dist/schema/_parameters.js +0 -20
  278. package/dist/schema/_parameters.js.map +0 -1
  279. package/src/schema/_parameters.test.ts +0 -417
  280. package/src/schema/_parameters.ts +0 -26
@@ -1,9 +1,9 @@
1
1
  import { describe, expect, it } from 'vitest'
2
- import { UnknownSchema } from './unknown.js'
2
+ import { unknown } from './unknown.js'
3
3
 
4
4
  describe('UnknownSchema', () => {
5
5
  describe('basic validation', () => {
6
- const schema = new UnknownSchema()
6
+ const schema = unknown()
7
7
 
8
8
  it('accepts strings', () => {
9
9
  const result = schema.safeParse('hello')
@@ -81,7 +81,7 @@ describe('UnknownSchema', () => {
81
81
  })
82
82
 
83
83
  describe('edge cases', () => {
84
- const schema = new UnknownSchema()
84
+ const schema = unknown()
85
85
 
86
86
  it('accepts zero', () => {
87
87
  const result = schema.safeParse(0)
@@ -252,7 +252,7 @@ describe('UnknownSchema', () => {
252
252
  })
253
253
 
254
254
  describe('special JavaScript values', () => {
255
- const schema = new UnknownSchema()
255
+ const schema = unknown()
256
256
 
257
257
  it('accepts objects with null prototype', () => {
258
258
  const obj = Object.create(null)
@@ -1,10 +1,12 @@
1
- import { Schema, ValidationResult, ValidatorContext } from '../core.js'
1
+ import { Schema, ValidationContext } from '../core.js'
2
+ import { memoizedOptions } from '../util/memoize.js'
2
3
 
3
4
  export class UnknownSchema extends Schema<unknown> {
4
- validateInContext(
5
- input: unknown,
6
- ctx: ValidatorContext,
7
- ): ValidationResult<unknown> {
5
+ validateInContext(input: unknown, ctx: ValidationContext) {
8
6
  return ctx.success(input)
9
7
  }
10
8
  }
9
+
10
+ export const unknown = /*#__PURE__*/ memoizedOptions(function () {
11
+ return new UnknownSchema()
12
+ })
@@ -0,0 +1,35 @@
1
+ import {
2
+ InferInput,
3
+ InferOutput,
4
+ Schema,
5
+ ValidationContext,
6
+ Validator,
7
+ } from '../core.js'
8
+
9
+ export class WithDefaultSchema<
10
+ const TValidator extends Validator,
11
+ > extends Schema<InferInput<TValidator>, InferOutput<TValidator>> {
12
+ constructor(
13
+ readonly validator: TValidator,
14
+ readonly defaultValue: InferInput<TValidator>,
15
+ ) {
16
+ super()
17
+ }
18
+
19
+ validateInContext(input: unknown, ctx: ValidationContext) {
20
+ // When in a validation context, the output should not be altered,
21
+ // so we don't apply the default.
22
+ if (input === undefined && ctx.options.mode !== 'validate') {
23
+ return ctx.validate(this.defaultValue, this.validator)
24
+ }
25
+
26
+ return ctx.validate(input, this.validator)
27
+ }
28
+ }
29
+
30
+ export function withDefault<const TValidator extends Validator>(
31
+ validator: TValidator,
32
+ defaultValue: InferInput<TValidator>,
33
+ ) {
34
+ return new WithDefaultSchema<TValidator>(validator, defaultValue)
35
+ }
package/src/schema.ts CHANGED
@@ -1,9 +1,3 @@
1
- // Global schemas
2
- export * from './schema/_parameters.js'
3
-
4
- // Utilities
5
- export * from './schema/refine.js'
6
-
7
1
  // Concrete Types
8
2
  export * from './schema/array.js'
9
3
  export * from './schema/blob.js'
@@ -29,7 +23,9 @@ export * from './schema/intersection.js'
29
23
  export * from './schema/nullable.js'
30
24
  export * from './schema/optional.js'
31
25
  export * from './schema/ref.js'
26
+ export * from './schema/refine.js'
32
27
  export * from './schema/union.js'
28
+ export * from './schema/with-default.js'
33
29
 
34
30
  // Lexicon specific Types
35
31
  export * from './schema/params.js'
@@ -1,40 +1 @@
1
- export type AssertFn<T> = <I extends string>(input: I) => asserts input is I & T
2
- export type CastFn<T> = <I extends string>(input: I) => I & T
3
1
  export type CheckFn<T> = <I extends string>(input: I) => input is I & T
4
-
5
- export function createAssertFunction<T extends string>(
6
- checkFn: (input: string) => input is T,
7
- errorMessage?: string,
8
- ): AssertFn<T>
9
- export function createAssertFunction<T extends string>(
10
- checkFn: (input: string) => boolean,
11
- errorMessage?: string,
12
- ): AssertFn<T>
13
- export function createAssertFunction<T extends string>(
14
- checkFn: (input: string) => boolean,
15
- errorMessage = 'Invalid format',
16
- ): AssertFn<T> {
17
- return (input: string) => {
18
- if (!checkFn(input)) throw new Error(errorMessage)
19
- }
20
- }
21
-
22
- /*@__NO_SIDE_EFFECTS__*/
23
- export function createCastFunction<T>(assertFn: AssertFn<T>): CastFn<T> {
24
- return <I extends string>(input: I) => {
25
- assertFn(input)
26
- return input as I & T
27
- }
28
- }
29
-
30
- /*@__NO_SIDE_EFFECTS__ */
31
- export function createCheckFunction<T>(assertFn: AssertFn<T>): CheckFn<T> {
32
- return <I extends string>(input: I): input is I & T => {
33
- try {
34
- assertFn(input)
35
- return true
36
- } catch {
37
- return false
38
- }
39
- }
40
- }
@@ -1,57 +1,37 @@
1
1
  /*@__NO_SIDE_EFFECTS__*/
2
- export function memoizedOptions<
3
- F extends (options?: NonNullable<unknown>) => any,
4
- >(
5
- fn: F,
6
- keyFn?: (
7
- options: NonNullable<Parameters<F>[0]>,
8
- ) => string | number | boolean | null | void,
9
- ): F {
10
- let emptyOptionsValue: ReturnType<F> | undefined
2
+ export function memoizedOptions<F extends (...args: any[]) => any>(fn: F): F {
3
+ let cache: null | { value: ReturnType<F> } = null
11
4
 
12
- if (keyFn) {
13
- const cache = new Map<string | number | boolean | null, ReturnType<F>>()
14
- const fromCache = (
15
- options: NonNullable<Parameters<F>[0]>,
16
- ): ReturnType<F> => {
17
- const key = keyFn(options)
18
- if (key !== undefined) {
19
- const cached = cache.get(key)
20
- if (cached) return cached
21
- const result = fn(options) as ReturnType<F>
22
- cache.set(key, result)
23
- return result
24
- }
25
-
26
- return fn(options)
5
+ return function cached(...args: any[]): ReturnType<F> {
6
+ // Not using the cache if there are args
7
+ if (args.length > 0) {
8
+ return fn(...args)
27
9
  }
28
10
 
29
- return ((options: Parameters<F>[0]): ReturnType<F> => {
30
- // Non-empty options case
31
- if (options) for (const _ in options) return fromCache(options)
32
-
33
- // Empty or missing options case
34
- return (emptyOptionsValue ??= fn(options))
35
- }) as F
36
- }
37
-
38
- return ((options: Parameters<F>[0]): ReturnType<F> => {
39
- // Non-empty options case
40
- if (options) for (const _ in options) return fn(options)
11
+ if (cache != null) {
12
+ return cache.value
13
+ }
41
14
 
42
- // Empty or missing options case
43
- return (emptyOptionsValue ??= fn(options))
44
- }) as F
15
+ const value = fn(...args)
16
+ cache = { value }
17
+ return value
18
+ } as F
45
19
  }
46
20
 
47
21
  /*@__NO_SIDE_EFFECTS__*/
48
- export function memoizedTransformer<F extends (arg: any) => any>(fn: F): F {
49
- const cache = new WeakMap<object, ReturnType<F>>()
50
- return ((arg: Parameters<F>[0]): ReturnType<F> => {
51
- const cached = cache.get(arg)
22
+ export function memoizedTransformer<
23
+ F extends (key: any, ...args: any[]) => unknown,
24
+ >(fn: F): F {
25
+ let cache: WeakMap<object, ReturnType<F>>
26
+
27
+ return function cached(key: any, ...args: any[]): any {
28
+ if (args.length > 0) return fn(key, ...args)
29
+
30
+ cache ??= new WeakMap()
31
+ const cached = cache.get(key)
52
32
  if (cached) return cached
53
- const result = fn(arg) as ReturnType<F>
54
- cache.set(arg, result)
33
+ const result = fn(key, ...args) as ReturnType<F>
34
+ cache.set(key, result)
55
35
  return result
56
- }) as F
36
+ } as F
57
37
  }
@@ -1,17 +0,0 @@
1
- import { Infer } from '../core.js';
2
- import { ArraySchema } from './array.js';
3
- import { BooleanSchema } from './boolean.js';
4
- import { DictSchema } from './dict.js';
5
- import { IntegerSchema } from './integer.js';
6
- import { StringSchema } from './string.js';
7
- import { UnionSchema } from './union.js';
8
- export type ParamScalar = Infer<typeof paramScalarSchema>;
9
- declare const paramScalarSchema: UnionSchema<[BooleanSchema, IntegerSchema, StringSchema<{}>]>;
10
- export type Param = Infer<typeof paramSchema>;
11
- export declare const paramSchema: UnionSchema<[UnionSchema<[BooleanSchema, IntegerSchema, StringSchema<{}>]>, ArraySchema<UnionSchema<[BooleanSchema, IntegerSchema, StringSchema<{}>]>>]>;
12
- export type Params = {
13
- [_: string]: undefined | Param;
14
- };
15
- export declare const paramsSchema: DictSchema<StringSchema<{}>, UnionSchema<[UnionSchema<[BooleanSchema, IntegerSchema, StringSchema<{}>]>, ArraySchema<UnionSchema<[BooleanSchema, IntegerSchema, StringSchema<{}>]>>]>>;
16
- export {};
17
- //# sourceMappingURL=_parameters.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"_parameters.d.ts","sourceRoot":"","sources":["../../src/schema/_parameters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAa,MAAM,YAAY,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAExC,MAAM,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAA;AACzD,QAAA,MAAM,iBAAiB,+DAIrB,CAAA;AAEF,MAAM,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,WAAW,CAAC,CAAA;AAC7C,eAAO,MAAM,WAAW,0JAGtB,CAAA;AAEF,MAAM,MAAM,MAAM,GAAG;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,CAAA;CAAE,CAAA;AACvD,eAAO,MAAM,YAAY,wLAGI,CAAA"}
@@ -1,20 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.paramsSchema = exports.paramSchema = void 0;
4
- const array_js_1 = require("./array.js");
5
- const boolean_js_1 = require("./boolean.js");
6
- const dict_js_1 = require("./dict.js");
7
- const integer_js_1 = require("./integer.js");
8
- const string_js_1 = require("./string.js");
9
- const union_js_1 = require("./union.js");
10
- const paramScalarSchema = new union_js_1.UnionSchema([
11
- new boolean_js_1.BooleanSchema({}),
12
- new integer_js_1.IntegerSchema({}),
13
- new string_js_1.StringSchema({}),
14
- ]);
15
- exports.paramSchema = new union_js_1.UnionSchema([
16
- paramScalarSchema,
17
- new array_js_1.ArraySchema(paramScalarSchema, {}),
18
- ]);
19
- exports.paramsSchema = new dict_js_1.DictSchema(new string_js_1.StringSchema({}), exports.paramSchema);
20
- //# sourceMappingURL=_parameters.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"_parameters.js","sourceRoot":"","sources":["../../src/schema/_parameters.ts"],"names":[],"mappings":";;;AACA,yCAAwC;AACxC,6CAA4C;AAC5C,uCAAsC;AACtC,6CAA4C;AAC5C,2CAA0C;AAC1C,yCAAwC;AAGxC,MAAM,iBAAiB,GAAG,IAAI,sBAAW,CAAC;IACxC,IAAI,0BAAa,CAAC,EAAE,CAAC;IACrB,IAAI,0BAAa,CAAC,EAAE,CAAC;IACrB,IAAI,wBAAY,CAAC,EAAE,CAAC;CACrB,CAAC,CAAA;AAGW,QAAA,WAAW,GAAG,IAAI,sBAAW,CAAC;IACzC,iBAAiB;IACjB,IAAI,sBAAW,CAAC,iBAAiB,EAAE,EAAE,CAAC;CACvC,CAAC,CAAA;AAGW,QAAA,YAAY,GAAG,IAAI,oBAAU,CACxC,IAAI,wBAAY,CAAC,EAAE,CAAC,EACpB,mBAAW,CACgB,CAAA","sourcesContent":["import { Infer, Validator } from '../core.js'\nimport { ArraySchema } from './array.js'\nimport { BooleanSchema } from './boolean.js'\nimport { DictSchema } from './dict.js'\nimport { IntegerSchema } from './integer.js'\nimport { StringSchema } from './string.js'\nimport { UnionSchema } from './union.js'\n\nexport type ParamScalar = Infer<typeof paramScalarSchema>\nconst paramScalarSchema = new UnionSchema([\n new BooleanSchema({}),\n new IntegerSchema({}),\n new StringSchema({}),\n])\n\nexport type Param = Infer<typeof paramSchema>\nexport const paramSchema = new UnionSchema([\n paramScalarSchema,\n new ArraySchema(paramScalarSchema, {}),\n])\n\nexport type Params = { [_: string]: undefined | Param }\nexport const paramsSchema = new DictSchema(\n new StringSchema({}),\n paramSchema,\n) satisfies Validator<Params>\n"]}
@@ -1,417 +0,0 @@
1
- import { describe, expect, it } from 'vitest'
2
- import { paramSchema, paramsSchema } from './_parameters.js'
3
-
4
- describe('paramSchema', () => {
5
- describe('scalar values', () => {
6
- it('validates boolean values', () => {
7
- const result = paramSchema.safeParse(true)
8
- expect(result.success).toBe(true)
9
- })
10
-
11
- it('validates integer values', () => {
12
- const result = paramSchema.safeParse(42)
13
- expect(result.success).toBe(true)
14
- })
15
-
16
- it('validates string values', () => {
17
- const result = paramSchema.safeParse('hello')
18
- expect(result.success).toBe(true)
19
- })
20
-
21
- it('validates empty strings', () => {
22
- const result = paramSchema.safeParse('')
23
- expect(result.success).toBe(true)
24
- })
25
-
26
- it('validates zero', () => {
27
- const result = paramSchema.safeParse(0)
28
- expect(result.success).toBe(true)
29
- })
30
-
31
- it('validates negative integers', () => {
32
- const result = paramSchema.safeParse(-50)
33
- expect(result.success).toBe(true)
34
- })
35
-
36
- it('validates false boolean', () => {
37
- const result = paramSchema.safeParse(false)
38
- expect(result.success).toBe(true)
39
- })
40
- })
41
-
42
- describe('array values', () => {
43
- it('validates arrays of booleans', () => {
44
- const result = paramSchema.safeParse([true, false, true])
45
- expect(result.success).toBe(true)
46
- })
47
-
48
- it('validates arrays of integers', () => {
49
- const result = paramSchema.safeParse([1, 2, 3, 4])
50
- expect(result.success).toBe(true)
51
- })
52
-
53
- it('validates arrays of strings', () => {
54
- const result = paramSchema.safeParse(['foo', 'bar', 'baz'])
55
- expect(result.success).toBe(true)
56
- })
57
-
58
- it('validates empty arrays', () => {
59
- const result = paramSchema.safeParse([])
60
- expect(result.success).toBe(true)
61
- })
62
-
63
- it('validates arrays with single element', () => {
64
- const result = paramSchema.safeParse(['single'])
65
- expect(result.success).toBe(true)
66
- })
67
-
68
- it('validates arrays with mixed scalar types', () => {
69
- const result = paramSchema.safeParse([true, 42, 'text'])
70
- expect(result.success).toBe(true)
71
- })
72
-
73
- it('validates arrays with negative integers', () => {
74
- const result = paramSchema.safeParse([-1, -2, -3])
75
- expect(result.success).toBe(true)
76
- })
77
-
78
- it('validates arrays with empty strings', () => {
79
- const result = paramSchema.safeParse(['', 'non-empty', ''])
80
- expect(result.success).toBe(true)
81
- })
82
-
83
- it('validates arrays with zero', () => {
84
- const result = paramSchema.safeParse([0, 1, 2])
85
- expect(result.success).toBe(true)
86
- })
87
-
88
- it('rejects nested arrays', () => {
89
- const result = paramSchema.safeParse([
90
- [1, 2],
91
- [3, 4],
92
- ])
93
- expect(result.success).toBe(false)
94
- })
95
-
96
- it('rejects arrays with null values', () => {
97
- const result = paramSchema.safeParse([1, null, 3])
98
- expect(result.success).toBe(false)
99
- })
100
-
101
- it('rejects arrays with undefined values', () => {
102
- const result = paramSchema.safeParse([1, undefined, 3])
103
- expect(result.success).toBe(false)
104
- })
105
-
106
- it('rejects arrays with object values', () => {
107
- const result = paramSchema.safeParse([1, { key: 'value' }, 3])
108
- expect(result.success).toBe(false)
109
- })
110
-
111
- it('rejects arrays with floating point numbers', () => {
112
- const result = paramSchema.safeParse([1, 2.5, 3])
113
- expect(result.success).toBe(false)
114
- })
115
-
116
- it('rejects arrays with NaN', () => {
117
- const result = paramSchema.safeParse([1, NaN, 3])
118
- expect(result.success).toBe(false)
119
- })
120
-
121
- it('rejects arrays with Infinity', () => {
122
- const result = paramSchema.safeParse([1, Infinity, 3])
123
- expect(result.success).toBe(false)
124
- })
125
- })
126
-
127
- describe('invalid values', () => {
128
- it('rejects null values', () => {
129
- const result = paramSchema.safeParse(null)
130
- expect(result.success).toBe(false)
131
- })
132
-
133
- it('rejects undefined values', () => {
134
- const result = paramSchema.safeParse(undefined)
135
- expect(result.success).toBe(false)
136
- })
137
-
138
- it('rejects object values', () => {
139
- const result = paramSchema.safeParse({ key: 'value' })
140
- expect(result.success).toBe(false)
141
- })
142
-
143
- it('rejects floating point numbers', () => {
144
- const result = paramSchema.safeParse(3.14)
145
- expect(result.success).toBe(false)
146
- })
147
-
148
- it('rejects NaN', () => {
149
- const result = paramSchema.safeParse(NaN)
150
- expect(result.success).toBe(false)
151
- })
152
-
153
- it('rejects Infinity', () => {
154
- const result = paramSchema.safeParse(Infinity)
155
- expect(result.success).toBe(false)
156
- })
157
-
158
- it('rejects -Infinity', () => {
159
- const result = paramSchema.safeParse(-Infinity)
160
- expect(result.success).toBe(false)
161
- })
162
- })
163
- })
164
-
165
- describe('paramsSchema', () => {
166
- it('validates empty object', () => {
167
- const result = paramsSchema.safeParse({})
168
- expect(result.success).toBe(true)
169
- })
170
-
171
- it('validates object with boolean parameters', () => {
172
- const result = paramsSchema.safeParse({
173
- enabled: true,
174
- disabled: false,
175
- })
176
- expect(result.success).toBe(true)
177
- })
178
-
179
- it('validates object with integer parameters', () => {
180
- const result = paramsSchema.safeParse({
181
- limit: 10,
182
- offset: 0,
183
- count: 100,
184
- })
185
- expect(result.success).toBe(true)
186
- })
187
-
188
- it('validates object with string parameters', () => {
189
- const result = paramsSchema.safeParse({
190
- name: 'Alice',
191
- query: 'search term',
192
- cursor: 'abc123',
193
- })
194
- expect(result.success).toBe(true)
195
- })
196
-
197
- it('validates object with array parameters', () => {
198
- const result = paramsSchema.safeParse({
199
- tags: ['tag1', 'tag2', 'tag3'],
200
- ids: [1, 2, 3, 4],
201
- flags: [true, false, true],
202
- })
203
- expect(result.success).toBe(true)
204
- })
205
-
206
- it('validates object with mixed parameter types', () => {
207
- const result = paramsSchema.safeParse({
208
- name: 'Alice',
209
- age: 30,
210
- active: true,
211
- tags: ['user', 'admin'],
212
- limit: 50,
213
- })
214
- expect(result.success).toBe(true)
215
- })
216
-
217
- it('validates object with empty string parameters', () => {
218
- const result = paramsSchema.safeParse({
219
- query: '',
220
- cursor: '',
221
- })
222
- expect(result.success).toBe(true)
223
- })
224
-
225
- it('validates object with negative integer parameters', () => {
226
- const result = paramsSchema.safeParse({
227
- offset: -10,
228
- delta: -5,
229
- })
230
- expect(result.success).toBe(true)
231
- })
232
-
233
- it('validates object with empty array parameters', () => {
234
- const result = paramsSchema.safeParse({
235
- tags: [],
236
- ids: [],
237
- })
238
- expect(result.success).toBe(true)
239
- })
240
-
241
- it('validates object with arrays of mixed scalar types', () => {
242
- const result = paramsSchema.safeParse({
243
- values: [true, 42, 'text'],
244
- })
245
- expect(result.success).toBe(true)
246
- })
247
-
248
- it('validates object with numeric string keys', () => {
249
- const result = paramsSchema.safeParse({
250
- '0': 'value0',
251
- '1': 'value1',
252
- '2': 'value2',
253
- })
254
- expect(result.success).toBe(true)
255
- })
256
-
257
- it('rejects non-object values', () => {
258
- const result = paramsSchema.safeParse('not an object')
259
- expect(result.success).toBe(false)
260
- })
261
-
262
- it('rejects null values', () => {
263
- const result = paramsSchema.safeParse(null)
264
- expect(result.success).toBe(false)
265
- })
266
-
267
- it('rejects undefined values', () => {
268
- const result = paramsSchema.safeParse(undefined)
269
- expect(result.success).toBe(false)
270
- })
271
-
272
- it('rejects arrays', () => {
273
- const result = paramsSchema.safeParse([1, 2, 3])
274
- expect(result.success).toBe(false)
275
- })
276
-
277
- it('rejects object with null parameter values', () => {
278
- const result = paramsSchema.safeParse({
279
- name: 'Alice',
280
- invalid: null,
281
- })
282
- expect(result.success).toBe(false)
283
- })
284
-
285
- it('rejects object with floating point parameter values', () => {
286
- const result = paramsSchema.safeParse({
287
- value: 3.14,
288
- })
289
- expect(result.success).toBe(false)
290
- })
291
-
292
- it('rejects object with NaN parameter values', () => {
293
- const result = paramsSchema.safeParse({
294
- value: NaN,
295
- })
296
- expect(result.success).toBe(false)
297
- })
298
-
299
- it('rejects object with Infinity parameter values', () => {
300
- const result = paramsSchema.safeParse({
301
- value: Infinity,
302
- })
303
- expect(result.success).toBe(false)
304
- })
305
-
306
- it('rejects object with object parameter values', () => {
307
- const result = paramsSchema.safeParse({
308
- nested: { key: 'value' },
309
- })
310
- expect(result.success).toBe(false)
311
- })
312
-
313
- it('rejects object with nested array parameter values', () => {
314
- const result = paramsSchema.safeParse({
315
- nested: [
316
- [1, 2],
317
- [3, 4],
318
- ],
319
- })
320
- expect(result.success).toBe(false)
321
- })
322
-
323
- it('rejects object with arrays containing invalid values', () => {
324
- const result = paramsSchema.safeParse({
325
- tags: ['valid', null, 'also valid'],
326
- })
327
- expect(result.success).toBe(false)
328
- })
329
-
330
- it('rejects object with arrays containing objects', () => {
331
- const result = paramsSchema.safeParse({
332
- items: [1, { key: 'value' }, 3],
333
- })
334
- expect(result.success).toBe(false)
335
- })
336
-
337
- it('rejects object with arrays containing floating point numbers', () => {
338
- const result = paramsSchema.safeParse({
339
- values: [1, 2.5, 3],
340
- })
341
- expect(result.success).toBe(false)
342
- })
343
-
344
- it('rejects when one parameter is invalid', () => {
345
- const result = paramsSchema.safeParse({
346
- valid1: 'string',
347
- valid2: 42,
348
- invalid: null,
349
- valid3: true,
350
- })
351
- expect(result.success).toBe(false)
352
- })
353
-
354
- describe('edge cases', () => {
355
- it('validates single parameter', () => {
356
- const result = paramsSchema.safeParse({
357
- single: 'value',
358
- })
359
- expect(result.success).toBe(true)
360
- })
361
-
362
- it('validates many parameters', () => {
363
- const manyParams: Record<string, string> = {}
364
- for (let i = 0; i < 100; i++) {
365
- manyParams[`param${i}`] = `value${i}`
366
- }
367
- const result = paramsSchema.safeParse(manyParams)
368
- expect(result.success).toBe(true)
369
- })
370
-
371
- it('validates parameters with long string values', () => {
372
- const result = paramsSchema.safeParse({
373
- longString: 'a'.repeat(1000),
374
- })
375
- expect(result.success).toBe(true)
376
- })
377
-
378
- it('validates parameters with large integer values', () => {
379
- const result = paramsSchema.safeParse({
380
- largeInt: 2147483647,
381
- negativeInt: -2147483648,
382
- })
383
- expect(result.success).toBe(true)
384
- })
385
-
386
- it('validates parameters with long arrays', () => {
387
- const result = paramsSchema.safeParse({
388
- longArray: Array.from({ length: 100 }, (_, i) => i),
389
- })
390
- expect(result.success).toBe(true)
391
- })
392
-
393
- it('validates parameters with special characters in keys', () => {
394
- const result = paramsSchema.safeParse({
395
- 'key-with-dashes': 'value',
396
- key_with_underscores: 'value',
397
- 'key.with.dots': 'value',
398
- })
399
- expect(result.success).toBe(true)
400
- })
401
-
402
- it('preserves original object when no transformations occur', () => {
403
- const input = {
404
- name: 'Alice',
405
- age: 30,
406
- tags: ['user'],
407
- }
408
- const result = paramsSchema.safeParse(input)
409
-
410
- if (result.success) {
411
- expect(result.value).toBe(input)
412
- } else {
413
- throw new Error('Expected validation to succeed')
414
- }
415
- })
416
- })
417
- })