@@ -108,20 +108,27 @@ export class SyncConfigFromYaml {
108108
109109 // Validate that there are no additional properties.
110110 // Since these errors don't contain line numbers, do this last.
111- const valid = validateSyncRulesSchema ( parsed . toJSON ( ) ) ;
112- if ( ! valid ) {
113- this . #errors. push (
114- ...validateSyncRulesSchema . errors ! . map ( ( e : any ) => {
115- return new YamlError ( e ) ;
116- } )
117- ) ;
111+ if ( ! this . #hasFatalError) {
112+ const valid = validateSyncRulesSchema ( parsed . toJSON ( ) ) ;
113+ if ( ! valid ) {
114+ this . #errors. push (
115+ ...validateSyncRulesSchema . errors ! . map ( ( e : any ) => {
116+ return new YamlError ( e ) ;
117+ } )
118+ ) ;
119+ }
118120 }
121+
119122 this . #throwOnErrorIfRequested( ) ;
120123 return result ;
121124 }
122125
126+ get #hasFatalError( ) : boolean {
127+ return this . #errors. find ( ( e ) => e . type != 'warning' ) != null ;
128+ }
129+
123130 #throwOnErrorIfRequested( ) {
124- if ( this . options . throwOnError && this . #errors . find ( ( e ) => e . type != 'warning' ) != null ) {
131+ if ( this . options . throwOnError && this . #hasFatalError ) {
125132 throw new SyncRulesErrors ( this . #errors) ;
126133 }
127134 }
@@ -192,7 +199,7 @@ export class SyncConfigFromYaml {
192199 const map = new Map ( ) ;
193200 if ( from != null ) {
194201 for ( const entry of from . items ?? [ ] ) {
195- const { key : cteNameScalar , value : cteQuery } = entry as { key : Scalar < string > ; value : Scalar } ;
202+ const { key : cteNameScalar , value : cteQuery } = entry as { key : Scalar < string > ; value : Node } ;
196203 const cteName = cteNameScalar . value ;
197204
198205 if ( this . options . schema ) {
@@ -208,10 +215,12 @@ export class SyncConfigFromYaml {
208215 }
209216 }
210217
211- const [ sql , errorListener ] = this . #scalarErrorListener( cteQuery ) ;
212- const parsed = compiler . commonTableExpression ( sql , errorListener ) ;
213- if ( parsed ) {
214- map . set ( cteName , parsed ) ;
218+ if ( this . #expectScalar( cteQuery ) ) {
219+ const [ sql , errorListener ] = this . #scalarErrorListener( cteQuery ) ;
220+ const parsed = compiler . commonTableExpression ( sql , errorListener ) ;
221+ if ( parsed ) {
222+ map . set ( cteName , parsed ) ;
223+ }
215224 }
216225 }
217226 }
@@ -248,12 +257,14 @@ export class SyncConfigFromYaml {
248257 streamCompiler . registerCommonTableExpression ( name , query )
249258 ) ;
250259
251- const addQuery = ( query : Scalar < string > ) => {
252- const [ sql , errorListener ] = this . #scalarErrorListener( query ) ;
253- streamCompiler . addQuery ( sql , errorListener ) ;
260+ const addQuery = ( query : Node ) => {
261+ if ( this . #expectScalar( query ) ) {
262+ const [ sql , errorListener ] = this . #scalarErrorListener( query ) ;
263+ streamCompiler . addQuery ( sql , errorListener ) ;
264+ }
254265 } ;
255266
256- const queries = value . get ( 'queries' ) as YAMLSeq | null ;
267+ const queries = value . get ( 'queries' ) as YAMLSeq < Node > | null ;
257268 const query = value . get ( 'query' , true ) as Scalar < string > | null ;
258269
259270 if ( ( queries == null ) == ( query == null ) ) {
@@ -264,9 +275,7 @@ export class SyncConfigFromYaml {
264275 }
265276 if ( queries ) {
266277 for ( const queryEntry of queries . items ) {
267- if ( queryEntry instanceof Scalar ) {
268- addQuery ( queryEntry as Scalar < string > ) ;
269- }
278+ addQuery ( queryEntry ) ;
270279 }
271280 }
272281
@@ -518,7 +527,20 @@ export class SyncConfigFromYaml {
518527 return new YamlError ( new Error ( message ) , { start, end } ) ;
519528 }
520529
521- #withScalar( scalar : Scalar , cb : ( value : string ) => QueryParseResult ) {
530+ #expectScalar( node : Node ) : node is Scalar {
531+ if ( ! ( node instanceof Scalar ) ) {
532+ this . #errors. push ( this . #yamlError( node , 'Expected a scalar value here.' ) ) ;
533+ return false ;
534+ }
535+
536+ return true ;
537+ }
538+
539+ #withScalar( scalar : Scalar , cb : ( value : string ) => QueryParseResult ) : void {
540+ if ( ! this . #expectScalar( scalar ) ) {
541+ return ;
542+ }
543+
522544 const value = scalar . toString ( ) ;
523545
524546 const wrapped = ( value : string ) : QueryParseResult => {
@@ -536,7 +558,7 @@ export class SyncConfigFromYaml {
536558 for ( let err of result . errors ) {
537559 this . #addErrorFromScalar( scalar , value , err ) ;
538560 }
539- return result ;
561+ return ;
540562 }
541563
542564 /**
0 commit comments