@@ -67,11 +67,17 @@ function hasRuntimeUseDeclaration(value: unknown): boolean {
6767 const categories = [
6868 stringArray ( use [ 'required' ] ) ,
6969 stringArray ( use [ 'preferred' ] ) ,
70- stringArray ( use [ 'conditional' ] ) ,
70+ stringArray ( use [ 'conditional' ] ?? [ ] ) ,
7171 ] ;
7272 if ( ! hasValidRuntimeUseCategories ( categories ) ) return false ;
73- if ( ! arePairwiseDisjoint ( categories ) ) return false ;
74- return sameKeys ( Object . keys ( use ) . sort ( ) , [ 'conditional' , 'preferred' , 'required' ] ) ;
73+ const operations = categories . flat ( ) ;
74+ if ( new Set ( operations ) . size !== operations . length ) return false ;
75+ return sameKeys (
76+ Object . keys ( use ) . sort ( ) ,
77+ use [ 'conditional' ] === undefined
78+ ? [ 'preferred' , 'required' ]
79+ : [ 'conditional' , 'preferred' , 'required' ] ,
80+ ) ;
7581}
7682
7783function hasValidRuntimeUseCategories (
@@ -82,17 +88,6 @@ function hasValidRuntimeUseCategories(
8288 ) ;
8389}
8490
85- function arePairwiseDisjoint ( categories : readonly string [ ] [ ] ) : boolean {
86- for ( let leftIndex = 0 ; leftIndex < categories . length ; leftIndex += 1 ) {
87- const left = categories [ leftIndex ] ;
88- if ( ! left ) return false ;
89- for ( const right of categories . slice ( leftIndex + 1 ) ) {
90- if ( ! areDisjoint ( left , right ) ) return false ;
91- }
92- }
93- return true ;
94- }
95-
9691function stringArray ( value : unknown ) : string [ ] | null {
9792 if ( ! Array . isArray ( value ) ) return null ;
9893 return value . every ( ( key ) : key is string => typeof key === 'string' ) ? value : null ;
@@ -102,11 +97,6 @@ function hasUniqueValues(values: readonly string[]): boolean {
10297 return new Set ( values ) . size === values . length ;
10398}
10499
105- function areDisjoint ( left : readonly string [ ] , right : readonly string [ ] ) : boolean {
106- const leftValues = new Set ( left ) ;
107- return right . every ( ( value ) => ! leftValues . has ( value ) ) ;
108- }
109-
110100function sameKeys ( actual : readonly string [ ] , expected : readonly string [ ] ) : boolean {
111101 return actual . length === expected . length && actual . every ( ( key , index ) => key === expected [ index ] ) ;
112102}
0 commit comments