11import type { ValidationAcceptor } from 'langium' ;
22import { SUPPORTED_PROVIDERS } from '../constants' ;
3- import { DataSource , isInvocationExpr } from '../generated/ast' ;
3+ import { DataSource , isConfigArrayExpr , isInvocationExpr , isLiteralExpr } from '../generated/ast' ;
44import { getStringLiteral } from '../utils' ;
55import { validateDuplicatedDeclarations , type AstValidator } from './common' ;
66
@@ -12,7 +12,6 @@ export default class DataSourceValidator implements AstValidator<DataSource> {
1212 validateDuplicatedDeclarations ( ds , ds . fields , accept ) ;
1313 this . validateProvider ( ds , accept ) ;
1414 this . validateUrl ( ds , accept ) ;
15- this . validateRelationMode ( ds , accept ) ;
1615 }
1716
1817 private validateProvider ( ds : DataSource , accept : ValidationAcceptor ) {
@@ -24,20 +23,45 @@ export default class DataSourceValidator implements AstValidator<DataSource> {
2423 return ;
2524 }
2625
27- const value = getStringLiteral ( provider . value ) ;
28- if ( ! value ) {
26+ const providerValue = getStringLiteral ( provider . value ) ;
27+ if ( ! providerValue ) {
2928 accept ( 'error' , '"provider" must be set to a string literal' , {
3029 node : provider . value ,
3130 } ) ;
32- } else if ( ! SUPPORTED_PROVIDERS . includes ( value ) ) {
31+ } else if ( ! SUPPORTED_PROVIDERS . includes ( providerValue ) ) {
3332 accept (
3433 'error' ,
35- `Provider "${ value } " is not supported. Choose from ${ SUPPORTED_PROVIDERS . map ( ( p ) => '"' + p + '"' ) . join (
36- ' | ',
37- ) } .`,
34+ `Provider "${ providerValue } " is not supported. Choose from ${ SUPPORTED_PROVIDERS . map (
35+ ( p ) => '"' + p + '" ',
36+ ) . join ( ' | ' ) } .`,
3837 { node : provider . value } ,
3938 ) ;
4039 }
40+
41+ const defaultSchemaField = ds . fields . find ( ( f ) => f . name === 'defaultSchema' ) ;
42+ if ( defaultSchemaField && providerValue !== 'postgresql' ) {
43+ accept ( 'error' , '"defaultSchema" is only supported for "postgresql" provider' , {
44+ node : defaultSchemaField ,
45+ } ) ;
46+ }
47+
48+ const schemasField = ds . fields . find ( ( f ) => f . name === 'schemas' ) ;
49+ if ( schemasField ) {
50+ if ( providerValue !== 'postgresql' ) {
51+ accept ( 'error' , '"schemas" is only supported for "postgresql" provider' , {
52+ node : schemasField ,
53+ } ) ;
54+ }
55+ const schemasValue = schemasField . value ;
56+ if (
57+ ! isConfigArrayExpr ( schemasValue ) ||
58+ ! schemasValue . items . every ( ( e ) => isLiteralExpr ( e ) && typeof getStringLiteral ( e ) === 'string' )
59+ ) {
60+ accept ( 'error' , '"schemas" must be an array of string literals' , {
61+ node : schemasField ,
62+ } ) ;
63+ }
64+ }
4165 }
4266
4367 private validateUrl ( ds : DataSource , accept : ValidationAcceptor ) {
@@ -53,14 +77,4 @@ export default class DataSourceValidator implements AstValidator<DataSource> {
5377 } ) ;
5478 }
5579 }
56-
57- private validateRelationMode ( ds : DataSource , accept : ValidationAcceptor ) {
58- const field = ds . fields . find ( ( f ) => f . name === 'relationMode' ) ;
59- if ( field ) {
60- const val = getStringLiteral ( field . value ) ;
61- if ( ! val || ! [ 'foreignKeys' , 'prisma' ] . includes ( val ) ) {
62- accept ( 'error' , '"relationMode" must be set to "foreignKeys" or "prisma"' , { node : field . value } ) ;
63- }
64- }
65- }
6680}
0 commit comments