1+ /*--------------------------------------------------------------------------
2+
3+ TypeBox
4+
5+ The MIT License (MIT)
6+
7+ Copyright (c) 2017-2025 Haydn Paterson
8+
9+ Permission is hereby granted, free of charge, to any person obtaining a copy
10+ of this software and associated documentation files (the "Software"), to deal
11+ in the Software without restriction, including without limitation the rights
12+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13+ copies of the Software, and to permit persons to whom the Software is
14+ furnished to do so, subject to the following conditions:
15+
16+ The above copyright notice and this permission notice shall be included in
17+ all copies or substantial portions of the Software.
18+
19+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25+ THE SOFTWARE.
26+
27+ ---------------------------------------------------------------------------*/
28+
29+ // deno-fmt-ignore-file
30+
31+ import * as F from './_functions.ts'
32+ import * as S from '../types/index.ts'
33+ import { BaseContext , BuildContext , CheckContext , ErrorContext } from './_context.ts'
34+ import { CheckSchema , ErrorSchema } from './schema.ts'
35+ import { Resolver } from '../resolver/index.ts'
36+
37+ // ------------------------------------------------------------------
38+ // Resolve
39+ // ------------------------------------------------------------------
40+ function Resolve ( context : BaseContext , schema : S . XRecursiveRef ) : S . XSchema {
41+ // note: it is safe to coerce to XSchema here as it wouldn't be possible
42+ // to enter a ref resolution if the root schema was boolean.
43+ const schemaRoot = context . GetSchema ( ) as S . XSchemaObject
44+ const dereferenced = Resolver . RecursiveRef ( schemaRoot , schema )
45+ return S . IsSchema ( dereferenced ) ? dereferenced : false
46+ }
47+ // ------------------------------------------------------------------
48+ // Build
49+ // ------------------------------------------------------------------
50+ export function BuildRecursiveRef ( context : BuildContext , schema : S . XRecursiveRef , value : string ) : string {
51+ const target = Resolve ( context , schema )
52+ return F . CreateFunction ( context , target , value )
53+ }
54+ // ------------------------------------------------------------------
55+ // Check
56+ // ------------------------------------------------------------------
57+ export function CheckRecursiveRef ( context : CheckContext , schema : S . XRecursiveRef , value : unknown ) : boolean {
58+ const target = Resolve ( context , schema )
59+ return ( S . IsSchema ( target ) && CheckSchema ( context , target , value ) )
60+ }
61+ // ------------------------------------------------------------------
62+ // Error
63+ // ------------------------------------------------------------------
64+ export function ErrorRecursiveRef ( context : ErrorContext , schemaPath : string , instancePath : string , schema : S . XRecursiveRef , value : unknown ) : boolean {
65+ const target = Resolve ( context , schema )
66+ return ( S . IsSchema ( target ) && ErrorSchema ( context , '#' , instancePath , target , value ) )
67+ }
0 commit comments