@@ -15,6 +15,8 @@ const args = require('minimist')(process.argv.slice(2));
1515/** @typedef {import('./types').ExtensionHeader } ExtensionHeader */
1616/** @typedef {import('./types').ExtensionWithFileInfo } ExtensionWithFileInfo */
1717/** @typedef {import('./types').ExtensionTier } ExtensionTier */
18+ /** @typedef {import('./types').Extension } Extension */
19+ /** @typedef {import('./types').EventsBasedBehavior } EventsBasedBehavior */
1820
1921const extensionsBasePath = path . join ( __dirname , '..' , 'extensions' ) ;
2022const reviewedExtensionsTier = 'reviewed' ;
@@ -78,6 +80,50 @@ const readExtensionsFromFolder = async (folderPath, tier) => {
7880 ) ;
7981} ;
8082
83+ /**
84+ * Find all required behaviors including transitive ones.
85+ * @param {Extension } extension
86+ * @param {EventsBasedBehavior } behavior
87+ * @param {Array<string> } requiredBehaviorTypes
88+ */
89+ const findAllRequiredBehaviorTypes = (
90+ extension ,
91+ behavior ,
92+ requiredBehaviorTypes = [ ]
93+ ) => {
94+ for ( const propertyDescriptor of behavior . propertyDescriptors ) {
95+ if ( propertyDescriptor . type == 'Behavior' ) {
96+ const requiredBehaviorType = propertyDescriptor . extraInformation [ 0 ] ;
97+ const extensionPrefix = extension . name + '::' ;
98+ if ( ! requiredBehaviorTypes . includes ( requiredBehaviorType ) ) {
99+ requiredBehaviorTypes . push ( requiredBehaviorType ) ;
100+
101+ if ( requiredBehaviorType . startsWith ( extensionPrefix ) ) {
102+ const behaviorName = requiredBehaviorType . substring (
103+ extensionPrefix . length
104+ ) ;
105+ const requiredBehavior = extension . eventsBasedBehaviors . find (
106+ ( behavior ) => behavior . name === behaviorName
107+ ) ;
108+ if ( ! requiredBehavior ) {
109+ throw new Error (
110+ 'Required behavior: ' +
111+ requiredBehaviorTypes +
112+ ' is missing in the extension.'
113+ ) ;
114+ }
115+ findAllRequiredBehaviorTypes (
116+ extension ,
117+ requiredBehavior ,
118+ requiredBehaviorTypes
119+ ) ;
120+ }
121+ }
122+ }
123+ }
124+ return requiredBehaviorTypes ;
125+ } ;
126+
81127( async ( ) => {
82128 try {
83129 shell . mkdir ( '-p' , distBasePath ) ;
@@ -217,6 +263,10 @@ const readExtensionsFromFolder = async (folderPath, tier) => {
217263 fullName : behavior . fullName ,
218264 description : behavior . description ,
219265 objectType : behavior . objectType ,
266+ allRequiredBehaviorTypes : findAllRequiredBehaviorTypes (
267+ extension ,
268+ behavior
269+ ) ,
220270 }
221271 )
222272 . filter ( Boolean )
0 commit comments